From 4db116e0106c4c42c29ea9f6c6e8192cfcd52331 Mon Sep 17 00:00:00 2001 From: Andrew Freiburger Date: Sat, 2 Jul 2022 21:23:24 -0400 Subject: [PATCH 001/298] initial commit --- modelseedpy/fbapkg/basefbapkg.py | 129 ++++++++++++++++--------------- 1 file changed, 66 insertions(+), 63 deletions(-) diff --git a/modelseedpy/fbapkg/basefbapkg.py b/modelseedpy/fbapkg/basefbapkg.py index f7e50a3e..dafbd703 100755 --- a/modelseedpy/fbapkg/basefbapkg.py +++ b/modelseedpy/fbapkg/basefbapkg.py @@ -3,97 +3,100 @@ from __future__ import absolute_import import logging -import re -from optlang.symbolics import Zero, add -import json as _json -from cobra.core import Gene, Metabolite, Model, Reaction -from modelseedpy.fbapkg.mspackagemanager import MSPackageManager +from optlang.symbolics import Zero from modelseedpy.core.msmodelutl import MSModelUtil - - -#Adding a few exception classes to handle different types of errors -class FeasibilityError(Exception): - """Error in FBA formulation""" - pass +from modelseedpy.core.exceptions import FeasibilityError # moved excpetion classes to a designated exceptions file for broader use +from modelseedpy.fbapkg.mspackagemanager import MSPackageManager class BaseFBAPkg: - """ - Base class for FBA packages - """ - def __init__(self, model, name, variable_types={}, constraint_types={},reaction_types = {}): - self.model = model + """Base class for FBA packages""" + def __init__(self, model, name, variable_types={}, constraint_types={}, reaction_types={}): + self.model = model; self.name = name self.modelutl = MSModelUtil(model) - self.name = name + self.pkgmgr = MSPackageManager.get_pkg_mgr(model) if self.pkgmgr is None: self.pkgmgr = MSPackageManager.get_pkg_mgr(model,1) self.pkgmgr.addpkgobj(self) - self.constraints = dict() - self.variables = dict() - self.parameters = dict() - self.new_reactions = dict() + + self.constraints, self.variables, self.parameters = dict(), dict(), dict() + self.variable_types = variable_types self.constraint_types = constraint_types - - for type in variable_types: - self.variables[type] = dict() - for type in constraint_types: - self.constraints[type] = dict() + for obj_type in self.variable_types: + self.variables[obj_type] = dict() + for obj_type in self.constraint_types: + self.constraints[obj_type] = dict() def validate_parameters(self, params, required, defaults): for item in required: if item not in params: raise ValueError(f'Required argument {item} is missing!') - self.parameters.update(defaults) # we assign all defaults - self.parameters.update(params) # replace defaults with params + self.parameters.update(defaults) + self.parameters.update(params) # defaults are assigned and then replaced manual params def clear(self): - objects = [] - for type in self.variables: - for object in self.variables[type]: - objects.append(self.variables[type][object]) - for type in self.constraints: - for object in self.constraints[type]: - objects.append(self.constraints[type][object]) - self.model.remove_cons_vars(objects) + cobra_objs = [] + for obj_type in self.variables: + for cobra_obj in self.variables[obj_type]: + cobra_objs.append(self.variables[obj_type][cobra_obj]) + for obj_type in self.constraints: + for cobra_obj in self.constraints[obj_type]: + cobra_objs.append(self.constraints[obj_type][cobra_obj]) + self.model.remove_cons_vars(cobra_objs) self.variables = {} self.constraints = {} - def build_variable(self,type,lower_bound,upper_bound,vartype,object = None): + def build_variable(self,obj_type,lower_bound,upper_bound,vartype,cobra_obj = None): name = None - if self.variable_types[type] == "none": - count = len(self.variables[type]) + if self.variable_types[obj_type] == "none": + count = len(self.variables[obj_type]) name = str(count+1) - elif self.variable_types[type] == "string": - name = object + elif self.variable_types[obj_type] == "string": + name = cobra_obj else: - name = object.id - if name not in self.variables[type]: - self.variables[type][name] = self.model.problem.Variable(name+"_"+type, lb=lower_bound,ub=upper_bound,type=vartype) - self.model.add_cons_vars(self.variables[type][name]) - return self.variables[type][name] + name = cobra_obj.id + if name not in self.variables[obj_type]: + self.variables[obj_type][name] = self.model.problem.Variable(name+"_"+obj_type, lb=lower_bound, ub=upper_bound, type=vartype) + self.model.add_cons_vars(self.variables[obj_type][name]) + return self.variables[obj_type][name] - def build_constraint(self,type,lower_bound,upper_bound,coef = {},object = None): + def build_constraint(self, obj_type, lower_bound, upper_bound, coef={}, cobra_obj=None): name = None - if self.constraint_types[type] == "none": - count = len(self.constraints[type]) + if self.constraint_types[obj_type] == "none": + count = len(self.constraints[obj_type]) name = str(count+1) - elif self.constraint_types[type] == "string": - name = object + elif self.constraint_types[obj_type] == "string": + name = cobra_obj else: - name = object.id - if name in self.constraints[type]: - self.model.remove_cons_vars(self.constraints[type][name]) - self.constraints[type][name] = self.model.problem.Constraint( - Zero,lb=lower_bound,ub=upper_bound,name=name+"_"+type + name = cobra_obj.id + if name in self.constraints[obj_type]: + self.model.remove_cons_vars(self.constraints[obj_type][name]) + self.constraints[obj_type][name] = self.model.problem.Constraint( + Zero,lb=lower_bound,ub=upper_bound,name=name+"_"+obj_type ) - self.model.add_cons_vars(self.constraints[type][name]) + self.model.add_cons_vars(self.constraints[obj_type][name]) self.model.solver.update() if len(coef) > 0: - self.constraints[type][name].set_linear_coefficients(coef) + self.constraints[obj_type][name].set_linear_coefficients(coef) self.model.solver.update() - return self.constraints[type][name] + return self.constraints[obj_type][name] + + #Utility functions + def print_lp(self,filename = None): + if filename is None: + filename = self.lp_filename + if filename is not None: + with open(filename+".lp", 'w') as out: + complete_line = '' + for line in str(self.model.solver).splitlines(): + if ':' in line: + if complete_line != '': + out.write(complete_line) + complete_line = '' + else: + complete_line += line def all_variables(self): return self.pkgmgr.all_variables() @@ -101,14 +104,14 @@ def all_variables(self): def all_constraints(self): return self.pkgmgr.all_constraints() - def add_variable_type(self,name,type): + def add_variable_type(self,name,obj_type): if name not in self.variables: self.variables[name] = dict() if name not in self.variable_types: - self.variable_types[name] = type + self.variable_types[name] = obj_type - def add_constraint_type(self,name,type): + def add_constraint_type(self,name,obj_type): if name not in self.constraints: self.constraints[name] = dict() if name not in self.constraint_types: - self.constraint_types[name] = type + self.constraint_types[name] = obj_type From 28874515e71a1c80142ab144f8d4a0cfb62aa09c Mon Sep 17 00:00:00 2001 From: Andrew Freiburger Date: Sun, 3 Jul 2022 15:21:59 -0400 Subject: [PATCH 002/298] polishing edits --- modelseedpy/fbapkg/basefbapkg.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/modelseedpy/fbapkg/basefbapkg.py b/modelseedpy/fbapkg/basefbapkg.py index dafbd703..b74aaee9 100755 --- a/modelseedpy/fbapkg/basefbapkg.py +++ b/modelseedpy/fbapkg/basefbapkg.py @@ -3,14 +3,18 @@ from __future__ import absolute_import import logging -from optlang.symbolics import Zero -from modelseedpy.core.msmodelutl import MSModelUtil -from modelseedpy.core.exceptions import FeasibilityError # moved excpetion classes to a designated exceptions file for broader use +logger = logging.getLogger(__name__) +import re # !!! import is never used +from optlang.symbolics import Zero, add # !!! add is never used +from cobra.core import Gene, Metabolite, Model, Reaction # !!! none of these imports are used from modelseedpy.fbapkg.mspackagemanager import MSPackageManager - +from modelseedpy.core.msmodelutl import MSModelUtil +from modelseedpy.core.exceptions import FeasibilityError class BaseFBAPkg: - """Base class for FBA packages""" + """ + Base class for FBA packages + """ def __init__(self, model, name, variable_types={}, constraint_types={}, reaction_types={}): self.model = model; self.name = name self.modelutl = MSModelUtil(model) From cba18573bd51f89b4453f37389a850e5ddaa4308 Mon Sep 17 00:00:00 2001 From: Andrew Freiburger Date: Sun, 3 Jul 2022 15:31:13 -0400 Subject: [PATCH 003/298] polishing edits --- modelseedpy/fbapkg/basefbapkg.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modelseedpy/fbapkg/basefbapkg.py b/modelseedpy/fbapkg/basefbapkg.py index b74aaee9..f05aafdd 100755 --- a/modelseedpy/fbapkg/basefbapkg.py +++ b/modelseedpy/fbapkg/basefbapkg.py @@ -6,6 +6,7 @@ logger = logging.getLogger(__name__) import re # !!! import is never used from optlang.symbolics import Zero, add # !!! add is never used +import json as _json # !!! import is never used from cobra.core import Gene, Metabolite, Model, Reaction # !!! none of these imports are used from modelseedpy.fbapkg.mspackagemanager import MSPackageManager from modelseedpy.core.msmodelutl import MSModelUtil @@ -25,9 +26,9 @@ def __init__(self, model, name, variable_types={}, constraint_types={}, reaction self.pkgmgr.addpkgobj(self) self.constraints, self.variables, self.parameters = dict(), dict(), dict() - self.variable_types = variable_types self.constraint_types = constraint_types + for obj_type in self.variable_types: self.variables[obj_type] = dict() for obj_type in self.constraint_types: @@ -52,7 +53,7 @@ def clear(self): self.variables = {} self.constraints = {} - def build_variable(self,obj_type,lower_bound,upper_bound,vartype,cobra_obj = None): + def build_variable(self, obj_type, lower_bound, upper_bound, vartype, cobra_obj=None): name = None if self.variable_types[obj_type] == "none": count = len(self.variables[obj_type]) From 6d0ac62b33d740755cf7cc30ea62910bfebade15 Mon Sep 17 00:00:00 2001 From: Andrew Freiburger Date: Sun, 3 Jul 2022 15:34:12 -0400 Subject: [PATCH 004/298] polishing edits --- modelseedpy/fbapkg/basefbapkg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/fbapkg/basefbapkg.py b/modelseedpy/fbapkg/basefbapkg.py index f05aafdd..85e1bba9 100755 --- a/modelseedpy/fbapkg/basefbapkg.py +++ b/modelseedpy/fbapkg/basefbapkg.py @@ -25,7 +25,7 @@ def __init__(self, model, name, variable_types={}, constraint_types={}, reaction self.pkgmgr = MSPackageManager.get_pkg_mgr(model,1) self.pkgmgr.addpkgobj(self) - self.constraints, self.variables, self.parameters = dict(), dict(), dict() + self.constraints, self.variables, self.parameters, self.new_reactions = {}, {}, {}, {} self.variable_types = variable_types self.constraint_types = constraint_types From 0f4c708bd5f9b16de5648fd066d84f31266bc3a6 Mon Sep 17 00:00:00 2001 From: Andrew Freiburger Date: Sun, 3 Jul 2022 15:35:58 -0400 Subject: [PATCH 005/298] polishing edits --- modelseedpy/fbapkg/basefbapkg.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modelseedpy/fbapkg/basefbapkg.py b/modelseedpy/fbapkg/basefbapkg.py index 85e1bba9..2a0d6e06 100755 --- a/modelseedpy/fbapkg/basefbapkg.py +++ b/modelseedpy/fbapkg/basefbapkg.py @@ -27,19 +27,20 @@ def __init__(self, model, name, variable_types={}, constraint_types={}, reaction self.constraints, self.variables, self.parameters, self.new_reactions = {}, {}, {}, {} self.variable_types = variable_types - self.constraint_types = constraint_types - for obj_type in self.variable_types: + self.constraint_types = constraint_types + for obj_type in variable_types: self.variables[obj_type] = dict() - for obj_type in self.constraint_types: + for obj_type in constraint_types: self.constraints[obj_type] = dict() def validate_parameters(self, params, required, defaults): for item in required: if item not in params: raise ValueError(f'Required argument {item} is missing!') + # defaults are assigned and then replaced with custom params self.parameters.update(defaults) - self.parameters.update(params) # defaults are assigned and then replaced manual params + self.parameters.update(params) def clear(self): cobra_objs = [] From fd4fd016714df1d05c9017dce20b1658580db363 Mon Sep 17 00:00:00 2001 From: Andrew Freiburger Date: Sun, 3 Jul 2022 15:36:35 -0400 Subject: [PATCH 006/298] polishing edits --- modelseedpy/fbapkg/basefbapkg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/fbapkg/basefbapkg.py b/modelseedpy/fbapkg/basefbapkg.py index 2a0d6e06..63ef7e03 100755 --- a/modelseedpy/fbapkg/basefbapkg.py +++ b/modelseedpy/fbapkg/basefbapkg.py @@ -27,8 +27,8 @@ def __init__(self, model, name, variable_types={}, constraint_types={}, reaction self.constraints, self.variables, self.parameters, self.new_reactions = {}, {}, {}, {} self.variable_types = variable_types - self.constraint_types = constraint_types + for obj_type in variable_types: self.variables[obj_type] = dict() for obj_type in constraint_types: From df41110d455f9aa92b7adf26a05022264d96756f Mon Sep 17 00:00:00 2001 From: Andrew Freiburger Date: Sun, 3 Jul 2022 15:47:43 -0400 Subject: [PATCH 007/298] initial ocmmit --- modelseedpy/fbapkg/bilevelpkg.py | 156 +++++++++++++++---------------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/modelseedpy/fbapkg/bilevelpkg.py b/modelseedpy/fbapkg/bilevelpkg.py index 82a57faa..38075671 100644 --- a/modelseedpy/fbapkg/bilevelpkg.py +++ b/modelseedpy/fbapkg/bilevelpkg.py @@ -3,54 +3,56 @@ from __future__ import absolute_import import re -from optlang.symbolics import Zero, add -from cobra.core import Gene, Metabolite, Model, Reaction +from optlang.symbolics import Zero, add # !!! Neither import is used +from cobra.core import Gene, Metabolite, Model, Reaction # !!! None of these imports are used from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg #Base class for FBA packages class BilevelPkg(BaseFBAPkg): def __init__(self,model): - BaseFBAPkg.__init__(self,model,"reaction use",{"dualconst":"string","dualub":"string","duallb":"string"},{"dualvar":"string","objective":"string","dualbin":"string"}) + BaseFBAPkg.__init__(self,model,"reaction use", + {"dualconst":"string","dualub":"string","duallb":"string"}, + {"dualvar":"string","objective":"string","dualbin":"string"}) - def build_package(self,filter = None,binary_variable_count = 0): + def build_package(self, rxn_filter=None, binary_variable_count=0): # !!! the filter parameter is never used self.validate_parameters({}, [], { "binary_variable_count":binary_variable_count }); print("binary_variable_count:",binary_variable_count) - coefficients = {} - obj_coef = {} - obj = self.model.solver.objective + varhash, coefficients, obj_coef = {}, {}, {} + objective = self.model.solver.objective + #Creating new objective coefficient and bound variables - bound_variables = {} - reactions = self.model.reactions if self.parameters["binary_variable_count"] > 0: for reaction in self.model.reactions: var = self.build_variable("flxcmp",reaction,None) - #Retreiving model data with componenent flux variables + #Retrieving model data with componenent flux variables #Using the JSON calls because get_linear_coefficients is REALLY slow mdldata = self.model.solver.to_json() consthash = {} for const in mdldata["constraints"]: consthash[const["name"]] = const - constraints = list(self.model.solver.constraints) variables = list(self.model.solver.variables) - objterms = obj.get_linear_coefficients(variables) + objterms = objective.get_linear_coefficients(variables) #!!! get_linear_coefficients is still eventually used? + #Adding binary variables and constraints which should not be included in dual formulation if self.parameters["binary_variable_count"] > 0: for reaction in self.model.reactions: - var = self.build_variable("bflxcmp",reaction,None) + self.build_variable("bflxcmp",reaction,None) + self.build_constraint("bflxcmp",reaction,None,None,None) + #Now implementing dual variables and constraints - varhash = {} for var in variables: varhash[var.name] = var - for const in constraints: + for const in list(self.model.solver.constraints): var = self.build_variable("dualconst",const,obj_coef) - if var != None and const.name in consthash and "expression" in consthash[const.name] and "args" in consthash[const.name]["expression"]: + if all([var != None, const.name in consthash, "expression" in consthash[const.name], "args" in consthash[const.name]["expression"]]): for item in consthash[const.name]["expression"]["args"]: - if "args" in item and len(item["args"]) >= 2 and item["args"][1]["name"] in varhash: - if varhash[item["args"][1]["name"]] not in coefficients: - coefficients[varhash[item["args"][1]["name"]]] = {} - coefficients[varhash[item["args"][1]["name"]]][var] = item["args"][0]["value"] + if all(["args" in item, len(item["args"]) >= 2, item["args"][1]["name"] in varhash]): + var_name = varhash[item["args"][1]["name"]] + if var_name not in coefficients: + coefficients[var_name] = {} + coefficients[var_name][var] = item["args"][0]["value"] for var in variables: if var.type == "continuous": dvar = self.build_variable("duallb",var,obj_coef) @@ -63,99 +65,97 @@ def build_package(self,filter = None,binary_variable_count = 0): if var not in coefficients: coefficients[var] = {} coefficients[var][dvar] = 1 - self.build_constraint("dualvar",var,obj,objterms,coefficients) - self.build_constraint("objective",None,obj,objterms,obj_coef) + self.build_constraint("dualvar",var,objective,objterms,coefficients) + self.build_constraint("objective",None,objective,objterms,obj_coef) - def build_variable(self,type,object,obj_coef): - if type == "dualconst": + def build_variable(self, obj_type, cobra_obj, obj_coef): + if obj_type == "dualconst": lb = -1000000 - ub = 1000000 + ub = -lb coef = 0 - if object.lb == None: + if cobra_obj.lb == None: lb = 0 - coef = object.ub - if object.ub == None: + coef = cobra_obj.ub + if cobra_obj.ub == None: ub = 0 - coef = object.lb - var = BaseFBAPkg.build_variable(self,type,lb,ub,"continuous",object.name) + coef = cobra_obj.lb + var = BaseFBAPkg.build_variable(self,obj_type,lb,ub,"continuous",cobra_obj.name) obj_coef[var] = coef return var - if type == "dualub":#Add a constraint that makes this variable zero when binary variable is zero - var = BaseFBAPkg.build_variable(self,type,0,1000000,"continuous",object.name) - if re.search('(.+)_(fflxcmp\d+)$', object.name) is not None: - m = re.search('(.+)_(fflxcmp\d+)$', object.name) - bvar = self.variables[m[2]][m[1]] - BaseFBAPkg.build_constraint(self,"dualbin",None,0,{var:1,bvar:-1000000},object.name) - obj_coef[var] = object.ub + if obj_type == "dualub":#constrain this variable to zero when the binary variable is zero + var = BaseFBAPkg.build_variable(self,obj_type,0,1000000,"continuous",cobra_obj.name) + if re.search('(.+)_(fflxcmp\d+)$', cobra_obj.name) is not None: + match = re.search('(.+)_(fflxcmp\d+)$', cobra_obj.name) + bvar = self.variables[match[2]][match[1]] + BaseFBAPkg.build_constraint(self,"dualbin",None,0,{var:1,bvar:-1000000},cobra_obj.name) + obj_coef[var] = cobra_obj.ub return var - if type == "duallb": - var = BaseFBAPkg.build_variable(self,type,-1000000,0,"continuous",object.name) - #if re.search('(.+)_(fflxcmp\d+)$', object.name) is not None: + if obj_type == "duallb": + var = BaseFBAPkg.build_variable(self,obj_type,-1000000,0,"continuous",cobra_obj.name) + #if re.search('(.+)_(fflxcmp\d+)$', cobra_obj.name) is not None: #m = re.search('(.+)_(fflxcmp\d+)$', metabolite.id) #bvar = self.variables[m[2]][m[1]] - #BaseFBAPkg.build_constraint(self,object.name+"_lbdualbin",None,0,{var:-1,bvar:-1000000},object) - obj_coef[var] = object.lb + #BaseFBAPkg.build_constraint(self,cobra_obj.name+"_lbdualbin",None,0,{var:-1,bvar:-1000000},cobra_obj) + obj_coef[var] = cobra_obj.lb return var - if type == "flxcmp" and self.parameters["binary_variable_count"] > 0: + if obj_type == "flxcmp" and self.parameters["binary_variable_count"] > 0: denominator = 2**self.parameters["binary_variable_count"]-1 coefs = [{},{}] - for i in range(0,self.parameters["binary_variable_count"]): + for i in range(self.parameters["binary_variable_count"]): value = 2**i - if object.lower_bound < 0: + if cobra_obj.lower_bound < 0: self.add_variable_type("rflxcmp"+str(i),"reaction") - var = BaseFBAPkg.build_variable(self,"rflxcmp"+str(i),0,-1*value*object.lower_bound/denominator,"continuous",object) + var = BaseFBAPkg.build_variable(self,"rflxcmp"+str(i),0,-1*value*cobra_obj.lower_bound/denominator,"continuous",cobra_obj) coefs[0][var] = -1 - if object.upper_bound > 0: + if cobra_obj.upper_bound > 0: self.add_variable_type("fflxcmp"+str(i),"reaction") - var = BaseFBAPkg.build_variable(self,"fflxcmp"+str(i),0,value*object.upper_bound/denominator,"continuous",object) + var = BaseFBAPkg.build_variable(self,"fflxcmp"+str(i),0,value*cobra_obj.upper_bound/denominator,"continuous",cobra_obj) coefs[1][var] = -1 - if object.lower_bound < 0: + if cobra_obj.lower_bound < 0: #flux - flux_comp_0 - flux_comp_n = 0 - restriction of reverse fluxes by component fluxes self.add_constraint_type("rflxcmpc","reaction") - coefs[0][object.reverse_variable] = 1 - BaseFBAPkg.build_constraint(self,"rflxcmpc",0,0,coefs[0],object) - if object.upper_bound > 0: + coefs[0][cobra_obj.reverse_variable] = 1 + BaseFBAPkg.build_constraint(self,"rflxcmpc",0,0,coefs[0],cobra_obj) + if cobra_obj.upper_bound > 0: #flux - flux_comp_0 - flux_comp_n = 0 - restriction of forward fluxes by component fluxes self.add_constraint_type("fflxcmpc","reaction") - coefs[1][object.forward_variable] = 1 - BaseFBAPkg.build_constraint(self,"fflxcmpc",0,0,coefs[1],object) + coefs[1][cobra_obj.forward_variable] = 1 + BaseFBAPkg.build_constraint(self,"fflxcmpc",0,0,coefs[1],cobra_obj) return None - if type == "bflxcmp" and self.parameters["binary_variable_count"] > 0: + if obj_type == "bflxcmp" and self.parameters["binary_variable_count"] > 0: for i in range(0,self.parameters["binary_variable_count"]): - if object.lower_bound < 0: + if cobra_obj.lower_bound < 0: self.add_variable_type("brflxcmp"+str(i),"reaction") - var = BaseFBAPkg.build_variable(self,"brflxcmp"+str(i),0,1,"binary",object) - othervar = self.variables["rflxcmp"+str(i)][object.id] + var = BaseFBAPkg.build_variable(self,"brflxcmp"+str(i),0,1,"binary",cobra_obj) + othervar = self.variables["rflxcmp"+str(i)][cobra_obj.id] self.add_constraint_type("brflxcmpc"+str(i),"reaction") - BaseFBAPkg.build_constraint(self,"brflxcmpc"+str(i),None,0,{othervar:1,var:-1000},object) - if object.upper_bound > 0: + BaseFBAPkg.build_constraint(self,"brflxcmpc"+str(i),None,0,{othervar:1,var:-1000},cobra_obj) + if cobra_obj.upper_bound > 0: self.add_variable_type("bfflxcmp"+str(i),"reaction") - var = BaseFBAPkg.build_variable(self,"bfflxcmp"+str(i),0,1,"binary",object) - othervar = self.variables["fflxcmp"+str(i)][object.id] + var = BaseFBAPkg.build_variable(self,"bfflxcmp"+str(i),0,1,"binary",cobra_obj) + othervar = self.variables["fflxcmp"+str(i)][cobra_obj.id] self.add_constraint_type("bfflxcmpc"+str(i),"reaction") - BaseFBAPkg.build_constraint(self,"bfflxcmpc"+str(i),None,0,{othervar:1,var:-1000},object) + BaseFBAPkg.build_constraint(self,"bfflxcmpc"+str(i),None,0,{othervar:1,var:-1000},cobra_obj) return None - def build_constraint(self,type,object,objective,objterms,coefficients): - if type == "dualvar": + def build_constraint(self, obj_type, cobra_obj, objective, objterms, coefficients): + if obj_type == "dualvar": coef = {} - lb = 0 - ub = 0 + lb = ub = 0 objsign = 1 if objective.direction == "min": objsign = -1 - if object in objterms: - lb = objterms[object] - ub = objterms[object] - if object in coefficients: - for var in coefficients[object]: - coef[var] = coefficients[object][var] - if object.lb == 0: + if cobra_obj in objterms: + lb = ub = objterms[cobra_obj] + if cobra_obj in coefficients: + for var in coefficients[cobra_obj]: + coef[var] = coefficients[cobra_obj][var] + if cobra_obj.lb == 0: ub = None - elif object.ub == 0: + elif cobra_obj.ub == 0: lb = None - return BaseFBAPkg.build_constraint(self,type,lb,ub,coef,object.name) - elif type == "objective": + return BaseFBAPkg.build_constraint(self,obj_type,lb,ub,coef,cobra_obj.name) + elif obj_type == "objective": coef = {} objsign = 1 if objective.direction == "min": @@ -164,4 +164,4 @@ def build_constraint(self,type,object,objective,objterms,coefficients): coef[var] = objsign*objterms[var] for dvar in coefficients: coef[dvar] = -1*coefficients[dvar] - return BaseFBAPkg.build_constraint(self,type,0,0,coef,"dualobjconst") \ No newline at end of file + return BaseFBAPkg.build_constraint(self,obj_type,0,0,coef,"dualobjconst") \ No newline at end of file From f5dbca098849feaecd7ed4f444c332f7c3657b0d Mon Sep 17 00:00:00 2001 From: Andrew Freiburger Date: Sun, 3 Jul 2022 16:14:21 -0400 Subject: [PATCH 008/298] initial ocmmit --- modelseedpy/fbapkg/bilevelpkg.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modelseedpy/fbapkg/bilevelpkg.py b/modelseedpy/fbapkg/bilevelpkg.py index 38075671..9595f709 100644 --- a/modelseedpy/fbapkg/bilevelpkg.py +++ b/modelseedpy/fbapkg/bilevelpkg.py @@ -27,26 +27,25 @@ def build_package(self, rxn_filter=None, binary_variable_count=0): # !!! the fi for reaction in self.model.reactions: var = self.build_variable("flxcmp",reaction,None) #Retrieving model data with componenent flux variables - #Using the JSON calls because get_linear_coefficients is REALLY slow + #Using the JSON calls because get_linear_coefficients is REALLY slow #!!! get_linear_coefficients is still used? mdldata = self.model.solver.to_json() consthash = {} for const in mdldata["constraints"]: consthash[const["name"]] = const variables = list(self.model.solver.variables) - objterms = objective.get_linear_coefficients(variables) #!!! get_linear_coefficients is still eventually used? + objterms = objective.get_linear_coefficients(variables) #Adding binary variables and constraints which should not be included in dual formulation if self.parameters["binary_variable_count"] > 0: for reaction in self.model.reactions: self.build_variable("bflxcmp",reaction,None) - self.build_constraint("bflxcmp",reaction,None,None,None) #Now implementing dual variables and constraints for var in variables: varhash[var.name] = var for const in list(self.model.solver.constraints): var = self.build_variable("dualconst",const,obj_coef) - if all([var != None, const.name in consthash, "expression" in consthash[const.name], "args" in consthash[const.name]["expression"]]): + if all([var, const.name in consthash, "expression" in consthash[const.name], "args" in consthash[const.name]["expression"]]): for item in consthash[const.name]["expression"]["args"]: if all(["args" in item, len(item["args"]) >= 2, item["args"][1]["name"] in varhash]): var_name = varhash[item["args"][1]["name"]] From 83e2dd33f1c01d352c930660f48ab6df3ca5f6eb Mon Sep 17 00:00:00 2001 From: Andrew Freiburger Date: Sun, 3 Jul 2022 16:25:13 -0400 Subject: [PATCH 009/298] initial ocmmit --- modelseedpy/fbapkg/bilevelpkg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/fbapkg/bilevelpkg.py b/modelseedpy/fbapkg/bilevelpkg.py index 9595f709..e1b03e4b 100644 --- a/modelseedpy/fbapkg/bilevelpkg.py +++ b/modelseedpy/fbapkg/bilevelpkg.py @@ -100,7 +100,7 @@ def build_variable(self, obj_type, cobra_obj, obj_coef): if obj_type == "flxcmp" and self.parameters["binary_variable_count"] > 0: denominator = 2**self.parameters["binary_variable_count"]-1 coefs = [{},{}] - for i in range(self.parameters["binary_variable_count"]): + for i in range(0,self.parameters["binary_variable_count"]): value = 2**i if cobra_obj.lower_bound < 0: self.add_variable_type("rflxcmp"+str(i),"reaction") From 164e74d091929e6e9311ca434478a79935fe06ba Mon Sep 17 00:00:00 2001 From: Andrew Freiburger Date: Sun, 3 Jul 2022 16:59:01 -0400 Subject: [PATCH 010/298] initial ocmmit --- modelseedpy/fbapkg/flexiblebiomasspkg.py | 215 ++++++++++++----------- 1 file changed, 108 insertions(+), 107 deletions(-) diff --git a/modelseedpy/fbapkg/flexiblebiomasspkg.py b/modelseedpy/fbapkg/flexiblebiomasspkg.py index 79885bb4..7a5149c4 100644 --- a/modelseedpy/fbapkg/flexiblebiomasspkg.py +++ b/modelseedpy/fbapkg/flexiblebiomasspkg.py @@ -3,22 +3,25 @@ from __future__ import absolute_import import logging -from optlang.symbolics import Zero, add -from cobra import Model, Reaction, Metabolite +from cobra import Reaction from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg from modelseedpy.core.fbahelper import FBAHelper classes = { "rna":{"cpd00052":-1,"cpd00038":-1,"cpd00002":-1,"cpd00062":-1}, "dna":{"cpd00115":-1,"cpd00356":-1,"cpd00241":-1,"cpd00357":-1}, - "protein":{"cpd00132":-1,"cpd00023":-1,"cpd00053":-1,"cpd00054":-1,"cpd00033":-1,"cpd00039":-1,"cpd00119":-1,"cpd00051":-1,"cpd00041":-1,"cpd00107":-1,"cpd00129":-1,"cpd00322":-1,"cpd00069":-1,"cpd00065":-1,"cpd00060":-1,"cpd00084":-1,"cpd00035":-1,"cpd00161":-1,"cpd00156":-1,"cpd00066":-1}, + "protein":{ + "cpd00132":-1,"cpd00023":-1,"cpd00053":-1,"cpd00054":-1,"cpd00033":-1,"cpd00039":-1,"cpd00119":-1,"cpd00051":-1,"cpd00041":-1,"cpd00107":-1, + "cpd00129":-1,"cpd00322":-1,"cpd00069":-1,"cpd00065":-1,"cpd00060":-1,"cpd00084":-1,"cpd00035":-1,"cpd00161":-1,"cpd00156":-1,"cpd00066":-1 + }, "energy":{"cpd00008":1} } #Base class for FBA packages class FlexibleBiomassPkg(BaseFBAPkg): def __init__(self,model): - BaseFBAPkg.__init__(self,model,"flexible biomass",{},{"flxbio":"reaction","fflxcpd":"metabolite","rflxcpd":"metabolite","fflxcls":"reaction","rflxcls":"reaction"}) + BaseFBAPkg.__init__(self,model,"flexible biomass",{},{ + "flxbio":"reaction","fflxcpd":"metabolite","rflxcpd":"metabolite","fflxcls":"reaction","rflxcls":"reaction"}) def build_package(self,parameters): self.validate_parameters(parameters,["bio_rxn_id"],{ @@ -31,162 +34,160 @@ def build_package(self,parameters): if self.parameters["bio_rxn_id"] not in self.model.reactions: raise ValueError(self.parameters["bio_rxn_id"]+" not found in model!") self.parameters["bio_rxn"] = self.model.reactions.get_by_id(self.parameters["bio_rxn_id"]) - newrxns = [] class_coef = {"rna":{},"dna":{},"protein":{},"energy":{}} refcpd = {"cpd00001":None,"cpd00009":None,"cpd00012":None,"cpd00067":None,"cpd00002":None} - for metabolite in self.model.metabolites: + for met in self.model.metabolites: for msid in refcpd: - if FBAHelper.modelseed_id_from_cobra_metabolite(metabolite) == msid: - refcpd[msid] = metabolite - for metabolite in self.parameters["bio_rxn"].metabolites: - msid = FBAHelper.modelseed_id_from_cobra_metabolite(metabolite) + if FBAHelper.modelseed_id_from_cobra_metabolite(met) == msid: + refcpd[msid] = met + for met in self.parameters["bio_rxn"].metabolites: + msid = FBAHelper.modelseed_id_from_cobra_metabolite(met) if msid != "cpd11416": met_class = "none" if msid != None: - for curr_class in classes: - if msid in classes[curr_class]: - met_class = curr_class - class_coef[curr_class][msid] = metabolite - if (met_class == "none" or self.class_complete(class_coef,met_class) == 0 or self.parameters["use_"+met_class+"_class"] == None) and msid not in refcpd: - drain_reaction = FBAHelper.add_drain_from_metabolite_id(self.model,metabolite.id,1000,1000,"FLEX_") + for curr_class, contents in classes.items(): + if msid in contents: + met_class = dict(curr_class) + contents[msid] = met + if any([met_class == "none", self.class_complete(class_coef,met_class), self.parameters["use_"+met_class+"_class"] == None]) and msid not in refcpd: + drain_reaction = FBAHelper.add_drain_from_metabolite_id(self.model,met.id,1000,1000,"FLEX_") if drain_reaction.id not in self.new_reactions: self.new_reactions[drain_reaction.id] = drain_reaction self.model.add_reactions([drain_reaction]) - self.build_constraint(metabolite,"flxcpd") - for met_class in class_coef: - add = 0 + self.build_constraint(met,"flxcpd") + for met_class, content in class_coef.items(): + add = False total_coef = 0 object_stoichiometry = {} - for msid in class_coef[met_class]: - if met_class == "rna" and msid == "cpd00002" and "cpd00008" in class_coef["energy"]: - object_stoichiometry[class_coef[met_class][msid]] = self.parameters["bio_rxn"].metabolites[class_coef[met_class][msid]] + self.parameters["bio_rxn"].metabolites[class_coef["energy"]["cpd00008"]] + for msid in content: + if all([met_class == "rna", msid == "cpd00002", "cpd00008" in class_coef["energy"]]): + object_stoichiometry[content[msid]] = self.parameters["bio_rxn"].metabolites[content[msid]] + self.parameters["bio_rxn"].metabolites[class_coef["energy"]["cpd00008"]] else: - object_stoichiometry[class_coef[met_class][msid]] = self.parameters["bio_rxn"].metabolites[class_coef[met_class][msid]] - total_coef += abs(object_stoichiometry[class_coef[met_class][msid]]) - if (met_class == "rna" or met_class == "dna") and refcpd["cpd00012"] != None and refcpd["cpd00001"] != None: - add = 1 + object_stoichiometry[content[msid]] = self.parameters["bio_rxn"].metabolites[content[msid]] + total_coef += abs(object_stoichiometry[content[msid]]) + if any([met_class == "rna", met_class == "dna"]) and refcpd["cpd00012"] and refcpd["cpd00001"]: + add = True object_stoichiometry[refcpd["cpd00012"]] = total_coef object_stoichiometry[refcpd["cpd00001"]] = total_coef - if met_class == "protein" and refcpd["cpd00001"] != None: - add = 1 + if met_class == "protein" and refcpd["cpd00001"]: + add = True object_stoichiometry[refcpd["cpd00001"]] = total_coef - if met_class == "energy" and refcpd["cpd00001"] != None and refcpd["cpd00002"] != None and refcpd["cpd00067"] != None and refcpd["cpd00009"] != None: - add = 1 + if met_class == "energy" and all([refcpd["cpd00001"], refcpd["cpd00002"], refcpd["cpd00067"], refcpd["cpd00009"]]): + add = True object_stoichiometry[refcpd["cpd00001"]] = -1*total_coef object_stoichiometry[refcpd["cpd00002"]] = -1*total_coef object_stoichiometry[refcpd["cpd00009"]] = total_coef object_stoichiometry[refcpd["cpd00067"]] = total_coef - if add == 1: + if add: if met_class+"_flex" not in self.new_reactions: - self.new_reactions[met_class+"_flex"] = Reaction(id=met_class+"_flex", - name= met_class+"_flex", - lower_bound=-1000, - upper_bound=1000) + self.new_reactions[met_class+"_flex"] = Reaction(id=met_class+"_flex", name= met_class+"_flex", + lower_bound=-1000, upper_bound=1000) self.new_reactions[met_class+"_flex"].add_metabolites(object_stoichiometry) self.new_reactions[met_class+"_flex"].annotation["sbo"] = 'SBO:0000627' self.model.add_reactions([self.new_reactions[met_class+"_flex"]]) self.build_constraint(self.new_reactions[met_class+"_flex"],"flxcls") self.build_constraint(self.parameters["bio_rxn"],"flxbio") - - def build_variable(self,object,type): - pass - def build_constraint(self,object,type): - element_mass = FBAHelper.elemental_mass() - if type == "flxbio": + # def build_variable(self,object,type): + # pass + + def build_constraint(self,cobra_obj,obj_type): + if obj_type == "flxbio": #Sum(MW*(vdrn,for-vdrn,ref)) + Sum(massdiff*(vrxn,for-vrxn,ref)) = 0 coef = {} - for metabolite in self.parameters["bio_rxn"].metabolites: - if "FLEX_"+metabolite.id in self.model.reactions: - mw = FBAHelper.metabolite_mw(metabolite) + for met in self.parameters["bio_rxn"].metabolites: + if "FLEX_"+met.id in self.model.reactions: + mw = FBAHelper.metabolite_mw(met) sign = -1 - if self.parameters["bio_rxn"].metabolites[metabolite] > 0: + if self.parameters["bio_rxn"].metabolites[met] > 0: sign = 1 - coef[self.model.reactions.get_by_id("FLEX_"+metabolite.id).forward_variable] = sign*mw - coef[self.model.reactions.get_by_id("FLEX_"+metabolite.id).reverse_variable] = -1*sign*mw + coef[self.model.reactions.get_by_id("FLEX_"+met.id).forward_variable] = sign*mw + coef[self.model.reactions.get_by_id("FLEX_"+met.id).reverse_variable] = -sign*mw for met_class in classes: if met_class+"_flex" in self.model.reactions: massdiff = 0 rxn = self.model.reactions.get_by_id(met_class+"_flex") - for metabolite in rxn.metabolites: - mw = FBAHelper.metabolite_mw(metabolite) - massdiff += rxn.metabolites[metabolite]*mw + for met in rxn.metabolites: + mw = FBAHelper.metabolite_mw(met) + massdiff += rxn.metabolites[met]*mw if abs(massdiff) > 0.00001: coef[rxn.forward_variable] = massdiff - coef[rxn.reverse_variable] = -1*massdiff - return BaseFBAPkg.build_constraint(self,type,0,0,coef,object) - elif type == "flxcpd": + coef[rxn.reverse_variable] = -massdiff + return BaseFBAPkg.build_constraint(self,obj_type,0,0,coef,cobra_obj) + elif obj_type == "flxcpd": #0.75 * abs(bio_coef) * vbio - vdrn,for >= 0 #0.75 * abs(bio_coef) * vbio - vdrn,rev >= 0 - coef = self.parameters["flex_coefficient"]*abs(self.parameters["bio_rxn"].metabolites[object]) + coef = self.parameters["flex_coefficient"]*abs(self.parameters["bio_rxn"].metabolites[cobra_obj]) if coef > 0.75: coef = 0.75 - BaseFBAPkg.build_constraint(self,"f"+type,0,None,{ + BaseFBAPkg.build_constraint(self,"f"+obj_type,0,None,{ self.parameters["bio_rxn"].forward_variable:coef, - self.model.reactions.get_by_id("FLEX_"+object.id).forward_variable:-1 - },object) - return BaseFBAPkg.build_constraint(self,"r"+type,0,None,{ + self.model.reactions.get_by_id("FLEX_"+cobra_obj.id).forward_variable:-1 + },cobra_obj) + return BaseFBAPkg.build_constraint(self,"r"+obj_type,0,None,{ self.parameters["bio_rxn"].forward_variable:coef, - self.model.reactions.get_by_id("FLEX_"+object.id).reverse_variable:-1 - },object) - elif type == "flxcls" and object.id[0:-5] != None: + self.model.reactions.get_by_id("FLEX_"+cobra_obj.id).reverse_variable:-1 + },cobra_obj) + elif obj_type == "flxcls" and cobra_obj.id[0:-5] != None: #0.75 * vbio - vrxn,for >= 0 #0.75 * vbio - vrxn,rev >= 0 #First deal with the situation where the flux is locked into a particular value relative to biomass const = None - if self.parameters["use_"+object.id[0:-5]+"_class"][0] == self.parameters["use_"+object.id[0:-5]+"_class"][1]: + first_entry = self.parameters["use_"+cobra_obj.id[0:-5]+"_class"][0] + second_entry = self.parameters["use_"+cobra_obj.id[0:-5]+"_class"][1] + if first_entry == second_entry: #If the value is positive, lock in the forward variable and set the reverse to zero - if self.parameters["use_"+object.id[0:-5]+"_class"][0] > 0: - const = BaseFBAPkg.build_constraint(self,"f"+type,0,0,{ - self.parameters["bio_rxn"].forward_variable:self.parameters["use_"+object.id[0:-5]+"_class"][1], - object.forward_variable:-1 - },object) - object.lower_bound = 0 + if first_entry > 0: + const = BaseFBAPkg.build_constraint(self,"f"+obj_type,0,0,{ + self.parameters["bio_rxn"].forward_variable:second_entry, + cobra_obj.forward_variable:-1 + },cobra_obj) + cobra_obj.lower_bound = 0 #If the value is negative, lock in the reverse variable and set the forward to zero - elif self.parameters["use_"+object.id[0:-5]+"_class"][0] < 0: - const = BaseFBAPkg.build_constraint(self,"r"+type,0,0,{ - self.parameters["bio_rxn"].forward_variable:-1*self.parameters["use_"+object.id[0:-5]+"_class"][0], - object.reverse_variable:-1 - },object) - object.upper_bound = 0 + elif first_entry < 0: + const = BaseFBAPkg.build_constraint(self,"r"+obj_type,0,0,{ + self.parameters["bio_rxn"].forward_variable:-first_entry, + cobra_obj.reverse_variable:-1 + },cobra_obj) + cobra_obj.upper_bound = 0 #If the value is zero, lock both variables to zero - if self.parameters["use_"+object.id[0:-5]+"_class"][0] == 0: - object.lower_bound = 0 - object.upper_bound = 0 - elif self.parameters["use_"+object.id[0:-5]+"_class"][1] >= 0: - if self.parameters["use_"+object.id[0:-5]+"_class"][0] >= 0: - const = BaseFBAPkg.build_constraint(self,"f"+type,0,None,{ - self.parameters["bio_rxn"].forward_variable:self.parameters["use_"+object.id[0:-5]+"_class"][1], - object.forward_variable:-1 - },object) - BaseFBAPkg.build_constraint(self,"r"+type,0,None,{ - self.parameters["bio_rxn"].forward_variable:-1*self.parameters["use_"+object.id[0:-5]+"_class"][0], - object.forward_variable:1 - },object) - object.lower_bound = 0 + if first_entry == 0: + cobra_obj.lower_bound = 0 + cobra_obj.upper_bound = 0 + elif second_entry >= 0: + if self.parameters["use_"+cobra_obj.id[0:-5]+"_class"][0] >= 0: + const = BaseFBAPkg.build_constraint(self,"f"+obj_type,0,None,{ + self.parameters["bio_rxn"].forward_variable:second_entry, + cobra_obj.forward_variable:-1 + },cobra_obj) + BaseFBAPkg.build_constraint(self,"r"+obj_type,0,None,{ + self.parameters["bio_rxn"].forward_variable:-first_entry, + cobra_obj.forward_variable:1 + },cobra_obj) + cobra_obj.lower_bound = 0 else: - const = BaseFBAPkg.build_constraint(self,"f"+type,0,None,{ - self.parameters["bio_rxn"].forward_variable:self.parameters["use_"+object.id[0:-5]+"_class"][1], - object.forward_variable:-1 - },object) - BaseFBAPkg.build_constraint(self,"r"+type,0,None,{ - self.parameters["bio_rxn"].forward_variable:-1*self.parameters["use_"+object.id[0:-5]+"_class"][0], - object.reverse_variable:-1 - },object) + const = BaseFBAPkg.build_constraint(self,"f"+obj_type,0,None,{ + self.parameters["bio_rxn"].forward_variable:second_entry, + cobra_obj.forward_variable:-1 + },cobra_obj) + BaseFBAPkg.build_constraint(self,"r"+obj_type,0,None,{ + self.parameters["bio_rxn"].forward_variable:-first_entry, + cobra_obj.reverse_variable:-1 + },cobra_obj) else: - const = BaseFBAPkg.build_constraint(self,"f"+type,0,None,{ - self.parameters["bio_rxn"].forward_variable:self.parameters["use_"+object.id[0:-5]+"_class"][1], - object.reverse_variable:1 - },object) - BaseFBAPkg.build_constraint(self,"r"+type,0,None,{ - self.parameters["bio_rxn"].forward_variable:-1*self.parameters["use_"+object.id[0:-5]+"_class"][0], - object.reverse_variable:-1 - },object) - object.upper_bound = 0 + const = BaseFBAPkg.build_constraint(self,"f"+obj_type,0,None,{ + self.parameters["bio_rxn"].forward_variable:second_entry, + cobra_obj.reverse_variable:1 + },cobra_obj) + BaseFBAPkg.build_constraint(self,"r"+obj_type,0,None,{ + self.parameters["bio_rxn"].forward_variable:-first_entry, + cobra_obj.reverse_variable:-1 + },cobra_obj) + cobra_obj.upper_bound = 0 return const def class_complete(self,class_coef,met_class): for msid in classes[met_class]: if msid not in class_coef[met_class]: - return 0 - return 1 + return True + return False From 86886ab7ac4473f4828bd65805d261aebbbc6f6a Mon Sep 17 00:00:00 2001 From: Andrew Freiburger Date: Sun, 3 Jul 2022 17:29:22 -0400 Subject: [PATCH 011/298] polishing edits --- modelseedpy/fbapkg/flexiblebiomasspkg.py | 41 ++++++++++++------------ 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/modelseedpy/fbapkg/flexiblebiomasspkg.py b/modelseedpy/fbapkg/flexiblebiomasspkg.py index 7a5149c4..3da5c919 100644 --- a/modelseedpy/fbapkg/flexiblebiomasspkg.py +++ b/modelseedpy/fbapkg/flexiblebiomasspkg.py @@ -3,17 +3,16 @@ from __future__ import absolute_import import logging -from cobra import Reaction +logger = logging.getLogger(__name__) +from optlang.symbolics import Zero, add # !!! Neither import is ever used +from cobra import Model, Reaction, Metabolite # !!! Model and Metabolite are never used from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg from modelseedpy.core.fbahelper import FBAHelper classes = { "rna":{"cpd00052":-1,"cpd00038":-1,"cpd00002":-1,"cpd00062":-1}, "dna":{"cpd00115":-1,"cpd00356":-1,"cpd00241":-1,"cpd00357":-1}, - "protein":{ - "cpd00132":-1,"cpd00023":-1,"cpd00053":-1,"cpd00054":-1,"cpd00033":-1,"cpd00039":-1,"cpd00119":-1,"cpd00051":-1,"cpd00041":-1,"cpd00107":-1, - "cpd00129":-1,"cpd00322":-1,"cpd00069":-1,"cpd00065":-1,"cpd00060":-1,"cpd00084":-1,"cpd00035":-1,"cpd00161":-1,"cpd00156":-1,"cpd00066":-1 - }, + "protein":{"cpd00132":-1, "cpd00023":-1, "cpd00053":-1, "cpd00054":-1, "cpd00033":-1, "cpd00039":-1, "cpd00119":-1, "cpd00051":-1, "cpd00041":-1, "cpd00107":-1, "cpd00129":-1, "cpd00322":-1, "cpd00069":-1, "cpd00065":-1, "cpd00060":-1, "cpd00084":-1, "cpd00035":-1, "cpd00161":-1, "cpd00156":-1, "cpd00066":-1}, "energy":{"cpd00008":1} } @@ -21,7 +20,7 @@ class FlexibleBiomassPkg(BaseFBAPkg): def __init__(self,model): BaseFBAPkg.__init__(self,model,"flexible biomass",{},{ - "flxbio":"reaction","fflxcpd":"metabolite","rflxcpd":"metabolite","fflxcls":"reaction","rflxcls":"reaction"}) + "flxbio":"reaction", "fflxcpd":"metabolite", "rflxcpd":"metabolite", "fflxcls":"reaction", "rflxcls":"reaction"}) def build_package(self,parameters): self.validate_parameters(parameters,["bio_rxn_id"],{ @@ -34,27 +33,28 @@ def build_package(self,parameters): if self.parameters["bio_rxn_id"] not in self.model.reactions: raise ValueError(self.parameters["bio_rxn_id"]+" not found in model!") self.parameters["bio_rxn"] = self.model.reactions.get_by_id(self.parameters["bio_rxn_id"]) + newrxns = [] # !!! newrxns is never used class_coef = {"rna":{},"dna":{},"protein":{},"energy":{}} refcpd = {"cpd00001":None,"cpd00009":None,"cpd00012":None,"cpd00067":None,"cpd00002":None} for met in self.model.metabolites: for msid in refcpd: if FBAHelper.modelseed_id_from_cobra_metabolite(met) == msid: refcpd[msid] = met - for met in self.parameters["bio_rxn"].metabolites: - msid = FBAHelper.modelseed_id_from_cobra_metabolite(met) + for metabolite in self.parameters["bio_rxn"].metabolites: + msid = FBAHelper.modelseed_id_from_cobra_metabolite(metabolite) if msid != "cpd11416": met_class = "none" if msid != None: for curr_class, contents in classes.items(): if msid in contents: met_class = dict(curr_class) - contents[msid] = met - if any([met_class == "none", self.class_complete(class_coef,met_class), self.parameters["use_"+met_class+"_class"] == None]) and msid not in refcpd: - drain_reaction = FBAHelper.add_drain_from_metabolite_id(self.model,met.id,1000,1000,"FLEX_") + contents[msid] = metabolite + if any([met_class == "none", self.class_complete(class_coef,met_class), not self.parameters["use_"+met_class+"_class"]]) and msid not in refcpd: + drain_reaction = FBAHelper.add_drain_from_metabolite_id(self.model, metabolite.id, 1000, 1000, "FLEX_") if drain_reaction.id not in self.new_reactions: self.new_reactions[drain_reaction.id] = drain_reaction self.model.add_reactions([drain_reaction]) - self.build_constraint(met,"flxcpd") + self.build_constraint(metabolite,"flxcpd") for met_class, content in class_coef.items(): add = False total_coef = 0 @@ -88,21 +88,22 @@ def build_package(self,parameters): self.build_constraint(self.new_reactions[met_class+"_flex"],"flxcls") self.build_constraint(self.parameters["bio_rxn"],"flxbio") - # def build_variable(self,object,type): - # pass + def build_variable(self,object,type): # !!! can the function be removed? + pass def build_constraint(self,cobra_obj,obj_type): + element_mass = FBAHelper.elemental_mass() # !!! element_mass is never used if obj_type == "flxbio": #Sum(MW*(vdrn,for-vdrn,ref)) + Sum(massdiff*(vrxn,for-vrxn,ref)) = 0 coef = {} - for met in self.parameters["bio_rxn"].metabolites: - if "FLEX_"+met.id in self.model.reactions: - mw = FBAHelper.metabolite_mw(met) + for metabolite in self.parameters["bio_rxn"].metabolites: + if "FLEX_"+metabolite.id in self.model.reactions: + mw = FBAHelper.metabolite_mw(metabolite) sign = -1 - if self.parameters["bio_rxn"].metabolites[met] > 0: + if self.parameters["bio_rxn"].metabolites[metabolite] > 0: sign = 1 - coef[self.model.reactions.get_by_id("FLEX_"+met.id).forward_variable] = sign*mw - coef[self.model.reactions.get_by_id("FLEX_"+met.id).reverse_variable] = -sign*mw + coef[self.model.reactions.get_by_id("FLEX_"+metabolite.id).forward_variable] = sign*mw + coef[self.model.reactions.get_by_id("FLEX_"+metabolite.id).reverse_variable] = -sign*mw for met_class in classes: if met_class+"_flex" in self.model.reactions: massdiff = 0 From 9eeba6431fcbd2a75a7e28604b100a7c7bba6fb0 Mon Sep 17 00:00:00 2001 From: Andrew Freiburger Date: Sun, 3 Jul 2022 17:47:50 -0400 Subject: [PATCH 012/298] initial commit --- modelseedpy/fbapkg/fluxfittingpkg.py | 27 +++++------- modelseedpy/fbapkg/reactionusepkg.py | 66 +++++++++++++++------------- 2 files changed, 48 insertions(+), 45 deletions(-) diff --git a/modelseedpy/fbapkg/fluxfittingpkg.py b/modelseedpy/fbapkg/fluxfittingpkg.py index 65d68571..e9aac69f 100644 --- a/modelseedpy/fbapkg/fluxfittingpkg.py +++ b/modelseedpy/fbapkg/fluxfittingpkg.py @@ -3,7 +3,7 @@ from __future__ import absolute_import import logging -from optlang.symbolics import Zero, add +from optlang.symbolics import add from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg #Base class for FBA packages @@ -27,30 +27,27 @@ def build_package(self,parameters): for rxnid in self.parameters["target_flux"]: if rxnid in self.model.reactions: rxnobj = self.model.reactions.get_by_id(rxnid) - var = self.build_variable(rxnobj) - objvars.append(var ** 2) - const = self.build_constraint(rxnobj) + var = BaseFBAPkg.build_variable(self,"vfit",-1000,1000,"continuous",rxnobj) + objvars.append(var**2) + self.build_constraint(rxnobj) if self.parameters["set_objective"] == 1: self.model.objective = self.model.problem.Objective(add(objvars), direction="min", sloppy=True) - def build_variable(self,object): - return BaseFBAPkg.build_variable(self,"vfit",-1000,1000,"continuous",object) - - def build_constraint(self,object): + def build_constraint(self,cobra_obj): #vfit(i) = flux(i) - v(i) - if object.id in self.parameters["target_flux"]: - flux = self.parameters["target_flux"][object.id] + if cobra_obj.id in self.parameters["target_flux"]: + flux = self.parameters["target_flux"][cobra_obj.id] vfitcoef = 1 #if self.parameters["rescale_vfit_by_flux"] == True: # if flux != None and abs(flux) > 0: # vfitcoef = vfitcoef*flux#Multiply coef by fit flux which rescales by flux # else: # vfitcoef = vfitcoef*self.parameters["default_rescaling"]#Multiply coef by fit flux which rescales by flux - coef = {self.variables["vfit"][object.id] : vfitcoef} + coef = {self.variables["vfit"][cobra_obj.id] : vfitcoef} if self.parameters["totalflux"] == 0: - coef[object.forward_variable] = 1 - coef[object.reverse_variable] = -1 + coef[cobra_obj.forward_variable] = 1 + coef[cobra_obj.reverse_variable] = -1 else: - coef[self.pkgmgr.getpkg("TotalFluxPkg").variables["tf"][object.id]] = 1 + coef[self.pkgmgr.getpkg("TotalFluxPkg").variables["tf"][cobra_obj.id]] = 1 # !!! the total flux package does not return anything flux = abs(flux) - return BaseFBAPkg.build_constraint(self,"vfitc",flux,flux,coef,object) \ No newline at end of file + return BaseFBAPkg.build_constraint(self,"vfitc",flux,flux,coef,cobra_obj) diff --git a/modelseedpy/fbapkg/reactionusepkg.py b/modelseedpy/fbapkg/reactionusepkg.py index 8f929fee..de7b497a 100644 --- a/modelseedpy/fbapkg/reactionusepkg.py +++ b/modelseedpy/fbapkg/reactionusepkg.py @@ -1,55 +1,61 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import - import logging -from optlang.symbolics import Zero, add + from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg +from modelseedpy.core.fbahelper import FBAHelper +from optlang.symbolics import Zero #Base class for FBA packages class ReactionUsePkg(BaseFBAPkg): def __init__(self,model): BaseFBAPkg.__init__(self,model,"reaction use",{"fu":"reaction","ru":"reaction"},{"fu":"reaction","ru":"reaction","exclusion":"none","urev":"reaction"}) - def build_package(self,filter = None,reversibility = 0): - for reaction in self.model.reactions: + def build_package(self, rxn_filter = None, reversibility = False): + for rxn in self.model.reactions: #Checking that reaction passes input filter if one is provided - if filter == None: - self.build_variable(reaction,"=") - self.build_constraint(reaction,reversibility) - elif reaction.id in filter: - self.build_variable(reaction,filter[reaction.id]) - self.build_constraint(reaction,reversibility) + if rxn_filter == None: + self.build_variable(rxn,"=") + self.build_constraint(rxn,reversibility) + elif rxn.id in rxn_filter: + self.build_variable(rxn,rxn_filter[rxn.id]) + self.build_constraint(rxn,reversibility) - def build_variable(self,object,direction): + def build_variable(self,cobra_obj,direction): variable = None - if (direction == ">" or direction == "=") and object.upper_bound > 0 and object.id not in self.variables["fu"]: - variable = BaseFBAPkg.build_variable(self,"fu",0,1,"binary",object) - if (direction == "<" or direction == "=") and object.lower_bound < 0 and object.id not in self.variables["ru"]: - variable = BaseFBAPkg.build_variable(self,"ru",0,1,"binary",object) + if (direction == ">" or direction == "=") and cobra_obj.upper_bound > 0 and cobra_obj.id not in self.variables["fu"]: + variable = BaseFBAPkg.build_variable(self,"fu",0,1,"binary",cobra_obj) + if (direction == "<" or direction == "=") and cobra_obj.lower_bound < 0 and cobra_obj.id not in self.variables["ru"]: + variable = BaseFBAPkg.build_variable(self,"ru",0,1,"binary",cobra_obj) return variable - def build_constraint(self,object,reversibility): + def build_constraint(self,cobra_obj,reversibility): constraint = None - if object.id not in self.constraints["fu"] and object.id in self.variables["fu"]: - constraint = BaseFBAPkg.build_constraint(self,"fu",0,None,{self.variables["fu"][object.id]:1000,object.forward_variable:-1},object) - if object.id not in self.constraints["ru"] and object.id in self.variables["ru"]: - constraint = BaseFBAPkg.build_constraint(self,"ru",0,None,{self.variables["ru"][object.id]:1000,object.reverse_variable:-1},object) - if reversibility == 1 and object.id in self.variables["ru"] and object.id in self.variables["fu"]: - constraint = BaseFBAPkg.build_constraint(self,"urev",None,1,{self.variables["ru"][object.id]:1,self.variables["fu"][object.id]:1},object) + if cobra_obj.id not in self.constraints["fu"] and cobra_obj.id in self.variables["fu"]: + constraint = BaseFBAPkg.build_constraint(self,"fu",0,None,{ + self.variables["fu"][cobra_obj.id]:1000, cobra_obj.forward_variable:-1 + },cobra_obj) + if cobra_obj.id not in self.constraints["ru"] and cobra_obj.id in self.variables["ru"]: + constraint = BaseFBAPkg.build_constraint(self,"ru",0,None,{ + self.variables["ru"][cobra_obj.id]:1000, cobra_obj.reverse_variable:-1 + },cobra_obj) + if all([reversibility, cobra_obj.id in self.variables["ru"], cobra_obj.id in self.variables["fu"]]): + constraint = BaseFBAPkg.build_constraint(self,"urev",None,1,{ + self.variables["ru"][cobra_obj.id]:1, self.variables["fu"][cobra_obj.id]:1 + },cobra_obj) return constraint - def build_exclusion_constraint(self,flux_values = None): - if flux_values == None: - flux_values = FBAHelper.compute_flux_values_from_variables(self.model) + def build_exclusion_constraint(self, flux_values=None): + flux_values = flux_values or FBAHelper.compute_flux_values_from_variables(self.model) count = len(self.constraints["exclusion"]) solution_coef = {} - solution_size = 0 - for rxnid in flux_values: - if flux_values[rxnid] > Zero: + solution_size = 0 + for rxnid, flux in flux_values.items(): + if flux > Zero: solution_size += 1 solution_coef[self.variables["fu"][rxnid]] = 1 - elif flux_values[rxnid] < -1*Zero: + elif flux < -1*Zero: solution_size += 1 solution_coef[self.variables["ru"][rxnid]] = 1 if len(solution_coef) > 0: @@ -61,4 +67,4 @@ def build_exclusion_constraint(self,flux_values = None): self.model.solver.update() self.constraints["exclusion"][const_name].set_linear_coefficients(solution_coef) return self.constraints["exclusion"][const_name] - return None \ No newline at end of file + return None From fbf93abdfa4e674de0361d4e7cff0d2b0a5f9843 Mon Sep 17 00:00:00 2001 From: Andrew Freiburger Date: Sun, 3 Jul 2022 18:06:31 -0400 Subject: [PATCH 013/298] polishing edits --- modelseedpy/fbapkg/fluxfittingpkg.py | 8 ++++++-- modelseedpy/fbapkg/reactionusepkg.py | 19 ++++++++----------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/modelseedpy/fbapkg/fluxfittingpkg.py b/modelseedpy/fbapkg/fluxfittingpkg.py index e9aac69f..0a43d3ed 100644 --- a/modelseedpy/fbapkg/fluxfittingpkg.py +++ b/modelseedpy/fbapkg/fluxfittingpkg.py @@ -3,7 +3,8 @@ from __future__ import absolute_import import logging -from optlang.symbolics import add +logger = logging.getLogger(__name__) +from optlang.symbolics import Zero, add # !!! Zero is never used from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg #Base class for FBA packages @@ -27,11 +28,14 @@ def build_package(self,parameters): for rxnid in self.parameters["target_flux"]: if rxnid in self.model.reactions: rxnobj = self.model.reactions.get_by_id(rxnid) - var = BaseFBAPkg.build_variable(self,"vfit",-1000,1000,"continuous",rxnobj) + var = self.build_variable(self,"vfit",-1000,1000,"continuous",rxnobj) objvars.append(var**2) self.build_constraint(rxnobj) if self.parameters["set_objective"] == 1: self.model.objective = self.model.problem.Objective(add(objvars), direction="min", sloppy=True) + + def build_variable(self,object): + return BaseFBAPkg.build_variable(self,"vfit",-1000,1000,"continuous",object) def build_constraint(self,cobra_obj): #vfit(i) = flux(i) - v(i) diff --git a/modelseedpy/fbapkg/reactionusepkg.py b/modelseedpy/fbapkg/reactionusepkg.py index de7b497a..5af5f23f 100644 --- a/modelseedpy/fbapkg/reactionusepkg.py +++ b/modelseedpy/fbapkg/reactionusepkg.py @@ -2,17 +2,17 @@ from __future__ import absolute_import import logging - +logger = logging.getLogger(__name__) +from optlang.symbolics import Zero, add # !!! add is never used from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg from modelseedpy.core.fbahelper import FBAHelper -from optlang.symbolics import Zero #Base class for FBA packages class ReactionUsePkg(BaseFBAPkg): def __init__(self,model): BaseFBAPkg.__init__(self,model,"reaction use",{"fu":"reaction","ru":"reaction"},{"fu":"reaction","ru":"reaction","exclusion":"none","urev":"reaction"}) - def build_package(self, rxn_filter = None, reversibility = False): + def build_package(self, rxn_filter=None, reversibility=False): for rxn in self.model.reactions: #Checking that reaction passes input filter if one is provided if rxn_filter == None: @@ -33,17 +33,14 @@ def build_variable(self,cobra_obj,direction): def build_constraint(self,cobra_obj,reversibility): constraint = None if cobra_obj.id not in self.constraints["fu"] and cobra_obj.id in self.variables["fu"]: - constraint = BaseFBAPkg.build_constraint(self,"fu",0,None,{ - self.variables["fu"][cobra_obj.id]:1000, cobra_obj.forward_variable:-1 - },cobra_obj) + constraint = BaseFBAPkg.build_constraint(self, "fu" ,0 ,None ,{ + self.variables["fu"][cobra_obj.id]:1000, cobra_obj.forward_variable:-1}, cobra_obj) if cobra_obj.id not in self.constraints["ru"] and cobra_obj.id in self.variables["ru"]: - constraint = BaseFBAPkg.build_constraint(self,"ru",0,None,{ - self.variables["ru"][cobra_obj.id]:1000, cobra_obj.reverse_variable:-1 - },cobra_obj) + constraint = BaseFBAPkg.build_constraint(self, "ru", 0, None,{ + self.variables["ru"][cobra_obj.id]:1000, cobra_obj.reverse_variable:-1}, cobra_obj) if all([reversibility, cobra_obj.id in self.variables["ru"], cobra_obj.id in self.variables["fu"]]): constraint = BaseFBAPkg.build_constraint(self,"urev",None,1,{ - self.variables["ru"][cobra_obj.id]:1, self.variables["fu"][cobra_obj.id]:1 - },cobra_obj) + self.variables["ru"][cobra_obj.id]:1, self.variables["fu"][cobra_obj.id]:1}, cobra_obj) return constraint def build_exclusion_constraint(self, flux_values=None): From be38dfb3409e38b4ed8ef608e5e8c5d8ac0bb686 Mon Sep 17 00:00:00 2001 From: Andrew Freiburger Date: Sun, 3 Jul 2022 18:09:15 -0400 Subject: [PATCH 014/298] polishing edits --- modelseedpy/fbapkg/fluxfittingpkg.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modelseedpy/fbapkg/fluxfittingpkg.py b/modelseedpy/fbapkg/fluxfittingpkg.py index 0a43d3ed..8250e8b1 100644 --- a/modelseedpy/fbapkg/fluxfittingpkg.py +++ b/modelseedpy/fbapkg/fluxfittingpkg.py @@ -29,14 +29,14 @@ def build_package(self,parameters): if rxnid in self.model.reactions: rxnobj = self.model.reactions.get_by_id(rxnid) var = self.build_variable(self,"vfit",-1000,1000,"continuous",rxnobj) - objvars.append(var**2) + objvars.append(var**2) self.build_constraint(rxnobj) if self.parameters["set_objective"] == 1: self.model.objective = self.model.problem.Objective(add(objvars), direction="min", sloppy=True) def build_variable(self,object): return BaseFBAPkg.build_variable(self,"vfit",-1000,1000,"continuous",object) - + def build_constraint(self,cobra_obj): #vfit(i) = flux(i) - v(i) if cobra_obj.id in self.parameters["target_flux"]: From 019a4f7c959eadd562ea0085067378361fa64463 Mon Sep 17 00:00:00 2001 From: freiburgermsu Date: Fri, 22 Jul 2022 23:00:13 -0400 Subject: [PATCH 015/298] revert multi-statement line and logger location --- modelseedpy/fbapkg/basefbapkg.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modelseedpy/fbapkg/basefbapkg.py b/modelseedpy/fbapkg/basefbapkg.py index 63ef7e03..24c9059b 100755 --- a/modelseedpy/fbapkg/basefbapkg.py +++ b/modelseedpy/fbapkg/basefbapkg.py @@ -3,7 +3,6 @@ from __future__ import absolute_import import logging -logger = logging.getLogger(__name__) import re # !!! import is never used from optlang.symbolics import Zero, add # !!! add is never used import json as _json # !!! import is never used @@ -12,13 +11,16 @@ from modelseedpy.core.msmodelutl import MSModelUtil from modelseedpy.core.exceptions import FeasibilityError +logger = logging.getLogger(__name__) + class BaseFBAPkg: """ Base class for FBA packages """ def __init__(self, model, name, variable_types={}, constraint_types={}, reaction_types={}): - self.model = model; self.name = name + self.model = model self.modelutl = MSModelUtil(model) + self.name = name self.pkgmgr = MSPackageManager.get_pkg_mgr(model) if self.pkgmgr is None: From 72b1bb73dcf34f6f25046e0919c33e3552e50db4 Mon Sep 17 00:00:00 2001 From: Andrew Freiburger Date: Wed, 3 Aug 2022 18:17:42 -0400 Subject: [PATCH 016/298] build_from_species_models edits --- modelseedpy/community/mscommunity.py | 153 +++++++++++++++++---------- 1 file changed, 99 insertions(+), 54 deletions(-) diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index 518289aa..8b1ee3a6 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -11,6 +11,7 @@ from optlang.symbolics import Zero from matplotlib import pyplot from pandas import DataFrame +from pprint import pprint import logging #import itertools import cobra @@ -24,14 +25,19 @@ class CommunityModelSpecies: def __init__(self, community, # MSCommunity environment biomass_cpd, # metabolite in the biomass reaction - names=[] # names of the community species + names=[], # names of the community species + name=None, # the name of a species + index=None # the index of the species ): self.community, self.biomass_cpd = community, biomass_cpd - self.index = int(self.biomass_cpd.compartment[1:]) + print(self.biomass_cpd.compartment) + self.index = int(self.biomass_cpd.compartment[1:]) # if index is None else index self.abundance = 0 if self.biomass_cpd in self.community.primary_biomass.metabolites: self.abundance = abs(self.community.primary_biomass.metabolites[self.biomass_cpd]) - if self.index <= len(names) and names[self.index-1]: + if name: + self.id = name + elif self.index < len(names): self.id = names[self.index-1] else: if "species_name" in self.biomass_cpd.annotation: @@ -44,13 +50,15 @@ def __init__(self, # FBAHelper.add_autodrain_reactions_to_self.community_model(self.community.model) # !!! FIXME This FBAHelper function is not defined. self.atp_hydrolysis = atp_rxn["reaction"] self.biomass_drain = None - self.biomasses = [] - for reaction in self.community.model.reactions: - if self.biomass_cpd in reaction.metabolites: - if reaction.metabolites[self.biomass_cpd] == 1 and len(reaction.metabolites) > 1: - self.biomasses.append(reaction) - elif len(reaction.metabolites) == 1 and reaction.metabolites[self.biomass_cpd] < 0: - self.biomass_drain = reaction + self.biomasses, self.reactions = [], [] + for rxn in self.community.model.reactions: + if int(FBAHelper.rxn_compartment(rxn)[1:]) == self.index and 'bio' not in rxn.name: + self.reactions.append(rxn) + if self.biomass_cpd in rxn.metabolites: + if rxn.metabolites[self.biomass_cpd] == 1 and len(rxn.metabolites) > 1: + self.biomasses.append(rxn) + elif len(rxn.metabolites) == 1 and rxn.metabolites[self.biomass_cpd] < 0: + self.biomass_drain = rxn if len(self.biomasses) == 0: logger.critical("No biomass reaction found for species "+self.id) @@ -87,42 +95,52 @@ def compute_max_atp(self): return self.community.model.optimize() class MSCommunity: - def __init__(self, model, + def __init__(self, model=None, # the model that will be defined + models:list=None, # the list of models that will be assembled into a community names=[], abundances=None, # names and abundances of the community species pfba = True, # specify whether parsimonious FBA will be simulated lp_filename = None # specify a filename to create an lp file ): - #Setting model and package manager - self.model, self.lp_filename, self.pfba = model, lp_filename, pfba - self.pkgmgr = MSPackageManager.get_pkg_mgr(model) + self.lp_filename, self.pfba = lp_filename, pfba self.gapfillings = {} + #Define Data attributes as None - self.solution = self.biomass_cpd = self.primary_biomass = self.biomass_drain = self.msgapfill = self.element_uptake_limit = self.kinetic_coeff = self.modelseed_db_path = None + self.solution = self.biomass_cpd = self.primary_biomass = self.biomass_drain = None + self.msgapfill = self.element_uptake_limit = self.kinetic_coeff = self.modelseed_db_path = None self.species = DictList() - #Computing data from model - msid_cobraid_hash = FBAHelper.msid_hash(model) + + # defining the models + self.model = model if not models else MSCommunity.build_from_species_models( + models, names=names, abundances=abundances, cobra_model=True) + self.pkgmgr = MSPackageManager.get_pkg_mgr(self.model) + msid_cobraid_hash = FBAHelper.msid_hash(self.model) if "cpd11416" not in msid_cobraid_hash: logger.critical("Could not find biomass compound") + raise KeyError("Could not find biomass compound for the model.") other_biomass_cpds = [] - for biomass_cpd in msid_cobraid_hash["cpd11416"]: - if biomass_cpd.compartment == "c0": - self.biomass_cpd = biomass_cpd - for reaction in model.reactions: + for self.biomass_cpd in msid_cobraid_hash["cpd11416"]: + print(self.biomass_cpd) + if self.biomass_cpd.compartment == "c0": + for reaction in self.model.reactions: if self.biomass_cpd in reaction.metabolites: + print(reaction) if reaction.metabolites[self.biomass_cpd] == 1 and len(reaction.metabolites) > 1: + print('primary biomass defined', reaction) self.primary_biomass = reaction elif reaction.metabolites[self.biomass_cpd] < 0 and len(reaction.metabolites) == 1: self.biomass_drain = reaction - else: - other_biomass_cpds.append(biomass_cpd) - for biomass_cpd in other_biomass_cpds: - species_obj = CommunityModelSpecies(self,biomass_cpd,names) + elif 'c' in self.biomass_cpd.compartment: + other_biomass_cpds.append(self.biomass_cpd) + for biomass_cpd in other_biomass_cpds: + print(biomass_cpd) + species_obj = CommunityModelSpecies(self, biomass_cpd, names) self.species.append(species_obj) if abundances: self.set_abundance(abundances) + @staticmethod - def build_from_species_models(models,mdlid=None,name=None,names=[],abundances=None): + def build_from_species_models(models,mdlid=None,name=None,names=[],abundances=None, cobra_model=False): """Merges the input list of single species metabolic models into a community metabolic model Parameters @@ -137,6 +155,8 @@ def build_from_species_models(models,mdlid=None,name=None,names=[],abundances=No List of human readable names for models being merged abundances : dict Hash of relative abundances for input models in community model + cobra_model : bool + Specifies whether the raw COBRA model is returned Returns ------- @@ -149,11 +169,15 @@ def build_from_species_models(models,mdlid=None,name=None,names=[],abundances=No newmodel = Model(mdlid,name) newutl = MSModelUtil(newmodel) biomass_compounds = [] - index = 1 biomass_index = 2 - for model in models: - new_metabolites = [] - new_reactions = [] + biomass_indices = [1] + biomass_indices_dict = {} + for model_index, model in enumerate(models): + model_reaction_ids = [rxn.id for rxn in model.reactions] + # model_index+=1 + print([rxn.id for rxn in model.reactions if "bio" in rxn.id]) + print(model_index, model.id) + new_metabolites, new_reactions = set(), set() #Rename metabolites for met in model.metabolites: #Renaming compartments @@ -163,58 +187,79 @@ def build_from_species_models(models,mdlid=None,name=None,names=[],abundances=No if m[1] == "e": met.compartment += "0" else: - met.compartment += str(index) + met.compartment += str(model_index) elif m[1] == "e": met.compartment = m[1]+"0" else: - met.compartment = m[1]+str(index) + met.compartment = m[1]+str(model_index) #Processing metabolite ID output = MSModelUtil.parse_id(met) - if output == None: + if output is None: if met.compartment[0] != "e": - met.id += str(index) + met.id += str(model_index) elif output[1] != "e": if len(output[2]) == 0: - met.id = met.id+str(index) + met.id = met.id+str(model_index) else: - met.id = output[0]+"_"+output[1]+str(index) - if met.id not in newmodel.metabolites: - new_metabolites.append(met) - if met.id == "cpd11416": + met.id = output[0]+"_"+output[1]+str(model_index) + if met.id not in newmodel.metabolites: # !!! this seems to not be operational + new_metabolites.add(met) + if "cpd11416_c" in met.id: + print(met.id, model.id) biomass_compounds.append(met) #Rename reactions for rxn in model.reactions: if rxn.id[0:3] != "EX_": - if re.search('^(bio)(\d+)$', rxn.id) != None: - rxn.id = "bio"+str(biomass_index) + if re.search('^(bio)(\d+)$', rxn.id): + print(biomass_indices) + index = int(rxn.id.removeprefix('bio')) + if index not in biomass_indices: + biomass_indices.append(index) + biomass_indices_dict[model.id] = index + print(rxn.id, '2') + else: + rxn_id = "bio"+str(biomass_index) + if rxn_id not in model_reaction_ids: + print(rxn_id, '1') + rxn.id = rxn_id + biomass_indices.append(biomass_index) + biomass_indices_dict[model.id] = index + else: + print(rxn_id, '3') + for i in range(len(models)*2): + rxn_id = "bio"+str(i) + if rxn_id not in model_reaction_ids and i not in biomass_indices: + rxn.id = rxn_id + biomass_indices.append(i) + biomass_indices_dict[model.id] = i + break biomass_index += 1 else: output = MSModelUtil.parse_id(rxn) - if output == None: + if output is None: if rxn.compartment.id[0] != "e": - rxn.id += str(index) + rxn.id += str(model_index) elif output[1] != "e": if len(output[2]) == 0: - rxn.id = rxn.id+str(index) + rxn.id = rxn.id+str(model_index) else: - rxn.id = output[0]+"_"+output[1]+str(index) + rxn.id = output[0]+"_"+output[1]+str(model_index) if rxn.id not in newmodel.reactions: - new_reactions.append(rxn) + new_reactions.add(rxn) #Adding new reactions and compounds to base model newmodel.add_reactions(new_reactions) newmodel.add_metabolites(new_metabolites) - index += 1 #Create community biomass comm_biomass = Metabolite("cpd11416_c0", None, "Community biomass", 0, "c0") - metabolites = {comm_biomass : 1} + metabolites = {comm_biomass: 1} + metabolites.update({cpd:-1/len(biomass_compounds) for cpd in biomass_compounds}) comm_biorxn = Reaction(id="bio1", name= "bio1", lower_bound=0, upper_bound=100) - count = len(biomass_compounds) - for cpd in biomass_compounds: - metabolites[cpd] = -1/count comm_biorxn.add_metabolites(metabolites) newmodel.add_reactions([comm_biorxn]) newutl.add_exchanges_for_metabolites([comm_biomass],0,100,'SK_') - return MSCommunity(newmodel,names,abundances) + if cobra_model: + return newmodel, biomass_indices_dict + return MSCommunity(model=newmodel,names=names,abundances=abundances), biomass_indices_dict #Manipulation functions def set_abundance(self,abundances): @@ -226,7 +271,7 @@ def set_abundance(self,abundances): if species in self.species: self.species.get_by_id(species).abundance = abundances[species] #remake the primary biomass reaction based on abundances - if self.primary_biomass == None: + if self.primary_biomass is None: logger.critical("Primary biomass reaction not found in community model") all_metabolites = {self.biomass_cpd:1} for species in self.species: @@ -234,7 +279,7 @@ def set_abundance(self,abundances): self.primary_biomass.add_metabolites(all_metabolites,combine=False) def set_objective(self,target = None,minimize = False): #!!! Mustn't a multilevel objective be set for community models? - if target == None: + if target is None: target = self.primary_biomass.id sense = "max" if minimize: From eadd736b195801606abe2a5179c1d27f10c24c6e Mon Sep 17 00:00:00 2001 From: Andrew Freiburger Date: Wed, 3 Aug 2022 22:02:22 -0400 Subject: [PATCH 017/298] MSCommunity and FBAHelper edits --- modelseedpy/community/mscommunity.py | 20 +-- modelseedpy/core/fbahelper.py | 248 ++++++++++++++++++--------- 2 files changed, 174 insertions(+), 94 deletions(-) diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index 8b1ee3a6..2ea363cc 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -172,12 +172,12 @@ def build_from_species_models(models,mdlid=None,name=None,names=[],abundances=No biomass_index = 2 biomass_indices = [1] biomass_indices_dict = {} + new_metabolites, new_reactions = set(), set() for model_index, model in enumerate(models): model_reaction_ids = [rxn.id for rxn in model.reactions] # model_index+=1 print([rxn.id for rxn in model.reactions if "bio" in rxn.id]) print(model_index, model.id) - new_metabolites, new_reactions = set(), set() #Rename metabolites for met in model.metabolites: #Renaming compartments @@ -202,11 +202,10 @@ def build_from_species_models(models,mdlid=None,name=None,names=[],abundances=No met.id = met.id+str(model_index) else: met.id = output[0]+"_"+output[1]+str(model_index) - if met.id not in newmodel.metabolites: # !!! this seems to not be operational - new_metabolites.add(met) - if "cpd11416_c" in met.id: - print(met.id, model.id) - biomass_compounds.append(met) + new_metabolites.add(met) + if "cpd11416_c" in met.id: + print(met.id, model.id) + biomass_compounds.append(met) #Rename reactions for rxn in model.reactions: if rxn.id[0:3] != "EX_": @@ -244,11 +243,10 @@ def build_from_species_models(models,mdlid=None,name=None,names=[],abundances=No rxn.id = rxn.id+str(model_index) else: rxn.id = output[0]+"_"+output[1]+str(model_index) - if rxn.id not in newmodel.reactions: - new_reactions.add(rxn) - #Adding new reactions and compounds to base model - newmodel.add_reactions(new_reactions) - newmodel.add_metabolites(new_metabolites) + new_reactions.add(rxn) + #Adding new reactions and compounds to base model + newmodel.add_reactions(FBAHelper.filter_cobra_set(new_reactions)) + newmodel.add_metabolites(FBAHelper.filter_cobra_set(new_metabolites)) #Create community biomass comm_biomass = Metabolite("cpd11416_c0", None, "Community biomass", 0, "c0") metabolites = {comm_biomass: 1} diff --git a/modelseedpy/core/fbahelper.py b/modelseedpy/core/fbahelper.py index dc43d4c7..3cd8b630 100755 --- a/modelseedpy/core/fbahelper.py +++ b/modelseedpy/core/fbahelper.py @@ -3,34 +3,31 @@ import logging from chemicals import periodic_table import re +from cobra.core import Gene, Metabolite, Model, Reaction # !!! Gene and Model are never used +from cobra.util import solver as sutil # !!! sutil is never used import time -from cobra.core import Gene, Metabolite, Model, Reaction -from cobra.util import solver as sutil from modelseedpy.biochem import from_local -from scipy.odr.odrpack import Output +from scipy.odr.odrpack import Output # !!! Output is never used +from chemw import ChemMW +from warnings import warn #from Carbon.Aliases import false logger = logging.getLogger(__name__) -elementmass = {} -for element in periodic_table: - elementmass[element.symbol] = element.MW - - class FBAHelper: @staticmethod - def add_autodrain_reactions_to_community_model(model,auto_sink = ["cpd02701", "cpd11416", "cpd15302"]): + def add_autodrain_reactions_to_community_model(model,auto_sink = ["cpd02701", "cpd15302"]): #Adding missing drains in the base model drain_reactions = [] for metabolite in model.metabolites: msid = FBAHelper.modelseed_id_from_cobra_metabolite(metabolite) if msid in auto_sink: - if msid != "cpd11416" or metabolite.compartment == "c0": + if metabolite.compartment == "c0": met_id = metabolite.id - if all(rxn not in model.reactions for rxn in [f"EX_{met_id}", f"DM_{met_id}", f"SK_{met_id}"]): + if all([rxn not in model.reactions for rxn in [f"EX_{met_id}", f"DM_{met_id}", f"SK_{met_id}"]]): drain_reaction = FBAHelper.add_drain_from_metabolite_id(model,metabolite.id,0,100,"DM_") - if drain_reaction != None: + if not drain_reaction: logger.info("Adding "+met_id+" DM") drain_reactions.append(drain_reaction) model.add_reactions(drain_reactions) @@ -48,10 +45,11 @@ def add_drain_from_metabolite_id(model, cpd_id, uptake, excretion, prefix='EX_', """ if cpd_id in model.metabolites: cobra_metabolite = model.metabolites.get_by_id(cpd_id) - drain_reaction = Reaction(id=f'{prefix}{cpd_id}', - name=prefix_name + cobra_metabolite.name, - lower_bound=-1*uptake, - upper_bound=excretion) + drain_reaction = Reaction( + id=f'{prefix}{cpd_id}', + name=prefix_name + cobra_metabolite.name, + lower_bound = -uptake, + upper_bound = excretion) drain_reaction.add_metabolites({cobra_metabolite : -1}) drain_reaction.annotation["sbo"] = 'SBO:0000627' #model.add_reactions([drain_reaction]) @@ -59,14 +57,65 @@ def add_drain_from_metabolite_id(model, cpd_id, uptake, excretion, prefix='EX_', return None @staticmethod - def set_reaction_bounds_from_direction(reaction, direction, add=0): + def test_condition_list(model, condition_list, pkgmgr): + for condition in condition_list: + pkgmgr.getpkg("KBaseMediaPkg").build_package(condition["media"]) + model.objective = condition["objective"] + if condition["is_max_threshold"]: + model.objective.direction = "max" + else: + model.objective.direction = "min" + objective = model.slim_optimize() + if model.solver.status != 'optimal': + with open("debug.lp", 'w') as out: + out.write(str(model.solver)) + out.close() + logger.critical("Infeasible problem - LP file printed to debug!") + return False + if objective >= condition["threshold"] and condition["is_max_threshold"]: + logger.info("FAILED") + return False + elif objective <= condition["threshold"] and not condition["is_max_threshold"]: + logger.info("FAILED") + return False + return True + + @staticmethod + def reaction_expansion_test(model, reaction_list, condition_list, pkgmgr): + # First knockout all reactions in the input list and save original bounds + original_bound = [] + for item in reaction_list: + if item[1] == ">": + original_bound.append(item[0].upper_bound) + item[0].upper_bound = 0 + else: + original_bound.append(item[0].lower_bound) + item[0].lower_bound = 0 + # Now restore reactions one at a time + filtered_list = [] + for index, item in enumerate(reaction_list): + logger.info("Testing "+item[0].id) + if item[1] == ">": + item[0].upper_bound = original_bound[index] + if not FBAHelper.test_condition_list(model, condition_list, pkgmgr): + item[0].upper_bound = 0 + filtered_list.append(item) + else: + item[0].lower_bound = original_bound[index] + if not FBAHelper.test_condition_list(model, condition_list, pkgmgr): + item[0].lower_bound = 0 + filtered_list.append(item) + return filtered_list + + @staticmethod + def set_reaction_bounds_from_direction(reaction, direction, add=False): if direction == "<": reaction.lower_bound = -100 - if add == 0: + if not add: reaction.upper_bound = 0 if direction == ">": reaction.upper_bound = 100 - if add == 0: + if not add: reaction.lower_bound = 0 reaction.update_variable_bounds() @@ -76,9 +125,7 @@ def set_objective_from_target_reaction(model,target_reaction,minimize = False): sense = "max" if minimize: sense = "min" - model.objective = model.problem.Objective( - 1 * target_reaction.flux_expression, - direction=sense) + model.objective = model.problem.Objective(target_reaction.flux_expression, direction=sense) return target_reaction @staticmethod @@ -87,8 +134,7 @@ def modelseed_id_from_cobra_metabolite(metabolite): m = re.search('^(cpd\d+)', metabolite.id) return m[1] #TODO: should check to see if ModelSEED ID is in the annotations for the compound - else: - return None + return None @staticmethod def modelseed_id_from_cobra_reaction(reaction): @@ -101,18 +147,16 @@ def modelseed_id_from_cobra_reaction(reaction): @staticmethod def metabolite_mw(metabolite): - mw = 0 - elements = metabolite.elements - for element in elements: - if element not in elementmass: - print("Missing mass for element "+element+" in compound "+metabolite.id+". Element will be ignored when computing MW") - else: - mw += elements[element]*elementmass[element] - return mw + try: + chem_mw = ChemMW() + chem_mw.mass(metabolite.formula) + return chem_mw.raw_mw + except: + warn("The compound "+metabolite.id+" possesses an unconventional formula {metabolite.formula}; hence, the MW cannot be computed.") @staticmethod def elemental_mass(): - return elementmass + return {element.symbol:element.MW for element in periodic_table} @staticmethod def get_modelseed_db_api(modelseed_path): @@ -131,8 +175,8 @@ def is_biomass(reaction): return reaction.id[0:3] == "bio" @staticmethod - def exchange_hash(model): - exchange_hash = {} + def exchange_hash(model): #!!! This function is pointless? + exchange_hash = {} # !!! this variable is never used for reaction in model.reactions: if len(reaction.metabolites) == 1: for metabolite in reaction.metabolites: @@ -141,31 +185,31 @@ def exchange_hash(model): @staticmethod def find_reaction(model,stoichiometry): - output = FBAHelper.stoichiometry_to_string(stoichiometry) - atpstring = output[0] + reaction_strings = FBAHelper.stoichiometry_to_string(stoichiometry) + atpstring = reaction_strings[0] rxn_hash = FBAHelper.rxn_hash(model) if atpstring in rxn_hash: return rxn_hash[atpstring] return None @staticmethod - def msid_hash(model): + def msid_hash(model): output = {} - for cpd in model.metabolites: - msid = FBAHelper.modelseed_id_from_cobra_metabolite(cpd) - if msid != None: + for met in model.metabolites: + msid = FBAHelper.modelseed_id_from_cobra_metabolite(met) + if msid is not None: if msid not in output: output[msid] = [] - output[msid].append(cpd) + output[msid].append(met) return output @staticmethod def rxn_hash(model): output = {} for rxn in model.reactions: - strings = FBAHelper.stoichiometry_to_string(rxn.metabolites) - output[strings[0]] = [rxn,1] - output[strings[1]] = [rxn,-1] + reaction_strings = FBAHelper.stoichiometry_to_string(rxn.metabolites) + output[reaction_strings[0]] = [rxn,1] + output[reaction_strings[1]] = [rxn,-1] return output @staticmethod @@ -174,69 +218,55 @@ def rxn_compartment(reaction): if len(compartments) == 1: return compartments[0] cytosol = None - othercomp = None for comp in compartments: - if comp[0:1] != "e": - if comp[0:1] == "c": - cytosol = comp - else: - othercomp = comp - if othercomp is not None: - return othercomp + if comp[0:1] == "c": + cytosol = comp + elif comp[0:1] != "e": + return comp return cytosol @staticmethod def stoichiometry_to_string(stoichiometry): - reactants = [] - products = [] + reactants, products = [], [] for met in stoichiometry: - coef = stoichiometry[met] + stoich = stoichiometry[met] if not isinstance(met, str): - if FBAHelper.modelseed_id_from_cobra_metabolite(met) == "cpd00067": - met = None - else: - met = met.id - if met != None: - if coef < 0: + met = None if FBAHelper.modelseed_id_from_cobra_metabolite(met) == "cpd00067" else met.id + if met: + if stoich < 0: reactants.append(met) else: products.append(met) - reactants.sort() - products.sort() - return ["+".join(reactants)+"="+"+".join(products),"+".join(products)+"="+"+".join(reactants)] + return ["+".join(sorted(reactants))+"="+"+".join(sorted(products)),"+".join(sorted(products))+"="+"+".join(sorted(reactants))] @staticmethod def add_atp_hydrolysis(model,compartment): - #Searching for ATP hydrolysis compounds - coefs = {"cpd00002":[-1,compartment],"cpd00001":[-1,compartment],"cpd00008":[1,compartment],"cpd00009":[1,compartment],"cpd00067":[1,compartment]} - msids = ["cpd00002","cpd00001","cpd00008","cpd00009","cpd00067"] + # Searching for ATP hydrolysis compounds + coefs = {"cpd00002": [-1,compartment], "cpd00001": [-1,compartment], "cpd00008": [1,compartment], + "cpd00009": [1,compartment], "cpd00067": [1,compartment]} stoichiometry = {} id_hash = FBAHelper.msid_hash(model) - for msid in msids: + for msid, content in coefs.items(): if msid not in id_hash: logger.warning("Compound "+msid+" not found in model!") return None else: for cpd in id_hash[msid]: - if cpd.compartment == coefs[msid][1]: - stoichiometry[cpd] = coefs[msid][0] + if cpd.compartment == content[1]: + stoichiometry[cpd] = content[0] output = FBAHelper.find_reaction(model,stoichiometry) - if output != None and output[1] == ">": + if output and output[1] == 1: # !!! the second element of the output is 1/0 and not a direction string return {"reaction":output[0],"direction":">","new":False} - cobra_reaction = Reaction("rxn00062_"+compartment, - name="ATP hydrolysis", - lower_bound=0, - upper_bound=1000) - cobra_reaction.annotation["sbo"] = "SBO:0000176" #biochemical reaction - cobra_reaction.annotation["seed.reaction"] = "rxn00062" + cobra_reaction = Reaction("rxn00062_"+compartment, name="ATP hydrolysis", lower_bound=0, upper_bound=1000) + cobra_reaction.annotation.update({"sbo":"SBO:0000176", "seed.reaction":"rxn00062"}) #biochemical reaction cobra_reaction.add_metabolites(stoichiometry) model.add_reactions([cobra_reaction]) return {"reaction":cobra_reaction,"direction":">","new":True} @staticmethod - def parse_id(object): - if re.search('(.+)_([a-z])(\d+)$', object.id) != None: - m = re.search('(.+)_([a-z])(\d+)$', object.id) + def parse_id(cobra_obj): + if re.search('(.+)_([a-z])(\d+)$', cobra_obj.id): + m = re.search('(.+)_([a-z])(\d+)$', cobra_obj.id) return (m[1],m[2],int(m[3])) return None @@ -247,11 +277,63 @@ def medianame(media): return media.id @staticmethod - def validate_dictionary(dictionary,required_keys,optional_keys): + def validate_dictionary(dictionary,required_keys, optional_keys={}): for item in required_keys: if item not in dictionary: raise ValueError('Required key '+item+' is missing!') for key in optional_keys: if key not in dictionary: - dictionary[key] = defaults[key] + dictionary[key] = optional_keys[key] return dictionary + + @staticmethod + def get_reframed_model(kbase_model,): + from reframed import from_cobrapy + + reframed_model = from_cobrapy(kbase_model) + if hasattr(kbase_model, 'id'): + reframed_model.id = kbase_model.id + for comp in reframed_model.compartments: + if 'e' in comp: + reframed_model.compartments[comp].external = True + + return reframed_model + + @staticmethod + def parse_media(media): + return [cpd.id for cpd in media.data['mediacompounds']] + + @staticmethod + def parse_df(df): + from numpy import array + return array(dtype=object, object=[array(df.index), array(df.columns), df.to_numpy()]) + + @staticmethod + def add_vars_cons(model, vars_cons): + model.add_cons_vars(vars_cons) + model.solver.update() + return model + + @staticmethod + def update_model_media(model, media): + medium = {} + model_reactions = [rxn.id for rxn in model.reactions] + for cpd in media.data["mediacompounds"]: + ex_rxn = f"EX_{cpd.id}" + if ex_rxn not in model_reactions: + model.add_boundary(metabolite=Metabolite(id=cpd.id, name=cpd.name, compartment="e0"), + type="exchange", lb=cpd.minFlux, ub=cpd.maxFlux) + medium[ex_rxn] = cpd.maxFlux + model.medium = medium + return model + + @staticmethod + def filter_cobra_set(cobra_set): + unique_ids = set(obj.id for obj in cobra_set) + unique_objs = set() + for obj in cobra_set: + if obj.id in unique_ids: + unique_objs.add(obj) + unique_ids.remove(obj.id) + return unique_objs + \ No newline at end of file From 99035812c05fed7f50deaf8ff848181f4712b25c Mon Sep 17 00:00:00 2001 From: Andrew Freiburger Date: Thu, 4 Aug 2022 01:03:09 -0400 Subject: [PATCH 018/298] MSCommunity edits and FBAHelper functions --- modelseedpy/community/mscommunity.py | 38 +++++++++++++--------------- modelseedpy/core/fbahelper.py | 3 +-- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index 2ea363cc..b0a90b56 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -167,7 +167,6 @@ def build_from_species_models(models,mdlid=None,name=None,names=[],abundances=No ------ """ newmodel = Model(mdlid,name) - newutl = MSModelUtil(newmodel) biomass_compounds = [] biomass_index = 2 biomass_indices = [1] @@ -181,26 +180,22 @@ def build_from_species_models(models,mdlid=None,name=None,names=[],abundances=No #Rename metabolites for met in model.metabolites: #Renaming compartments - if re.search('[a-z+](\d*)$', met.compartment): - m = re.search('([a-z]+)(\d*)$', met.compartment) - if len(m[2]) == 0: - if m[1] == "e": - met.compartment += "0" - else: - met.compartment += str(model_index) - elif m[1] == "e": - met.compartment = m[1]+"0" - else: - met.compartment = m[1]+str(model_index) - #Processing metabolite ID output = MSModelUtil.parse_id(met) if output is None: if met.compartment[0] != "e": met.id += str(model_index) - elif output[1] != "e": - if len(output[2]) == 0: - met.id = met.id+str(model_index) + met.compartment = met.compartment[0]+str(model_index) + else: + met.compartment = "e0" + else: + if output[2] == "": + if output[1] != "e": + met.id += str(model_index) + met.compartment += str(model_index) + elif output[1] == "e": + met.compartment = "e0" else: + met.compartment = output[1]+str(model_index) met.id = output[0]+"_"+output[1]+str(model_index) new_metabolites.add(met) if "cpd11416_c" in met.id: @@ -236,17 +231,17 @@ def build_from_species_models(models,mdlid=None,name=None,names=[],abundances=No else: output = MSModelUtil.parse_id(rxn) if output is None: - if rxn.compartment.id[0] != "e": + if "e" not in rxn.compartment.id: rxn.id += str(model_index) elif output[1] != "e": - if len(output[2]) == 0: + rxn.id = output[0]+"_"+output[1]+str(model_index) + if output[2] == "": rxn.id = rxn.id+str(model_index) - else: - rxn.id = output[0]+"_"+output[1]+str(model_index) new_reactions.add(rxn) #Adding new reactions and compounds to base model newmodel.add_reactions(FBAHelper.filter_cobra_set(new_reactions)) newmodel.add_metabolites(FBAHelper.filter_cobra_set(new_metabolites)) + #Create community biomass comm_biomass = Metabolite("cpd11416_c0", None, "Community biomass", 0, "c0") metabolites = {comm_biomass: 1} @@ -254,6 +249,9 @@ def build_from_species_models(models,mdlid=None,name=None,names=[],abundances=No comm_biorxn = Reaction(id="bio1", name= "bio1", lower_bound=0, upper_bound=100) comm_biorxn.add_metabolites(metabolites) newmodel.add_reactions([comm_biorxn]) + + # create a biomass sink reaction + newutl = MSModelUtil(newmodel) newutl.add_exchanges_for_metabolites([comm_biomass],0,100,'SK_') if cobra_model: return newmodel, biomass_indices_dict diff --git a/modelseedpy/core/fbahelper.py b/modelseedpy/core/fbahelper.py index 3cd8b630..41bf379f 100755 --- a/modelseedpy/core/fbahelper.py +++ b/modelseedpy/core/fbahelper.py @@ -335,5 +335,4 @@ def filter_cobra_set(cobra_set): if obj.id in unique_ids: unique_objs.add(obj) unique_ids.remove(obj.id) - return unique_objs - \ No newline at end of file + return unique_objs \ No newline at end of file From 4235108e0f8c2d63b265b5c8566712b772e4ecba Mon Sep 17 00:00:00 2001 From: Andrew Freiburger Date: Thu, 4 Aug 2022 17:47:55 -0400 Subject: [PATCH 019/298] MSCommunity edits and FBAHelper functions --- .../FullThermodynamicsExample.ipynb | 2 +- modelseedpy/community/mscommunity.py | 15 ++++- modelseedpy/community/mscompatibility.py | 60 +++++++++++-------- 3 files changed, 48 insertions(+), 29 deletions(-) diff --git a/examples/Flux Analysis/FullThermodynamicsExample.ipynb b/examples/Flux Analysis/FullThermodynamicsExample.ipynb index b5ffac67..776c4933 100644 --- a/examples/Flux Analysis/FullThermodynamicsExample.ipynb +++ b/examples/Flux Analysis/FullThermodynamicsExample.ipynb @@ -1373,7 +1373,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.9.12" } }, "nbformat": 4, diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index b0a90b56..66567bd7 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -1,4 +1,5 @@ from modelseedpy.fbapkg.mspackagemanager import MSPackageManager +from modelseedpy.community.mscompatibility import MSCompatibility from modelseedpy.core.msmodelutl import MSModelUtil from modelseedpy.core.msgapfill import MSGapfill from modelseedpy.core.fbahelper import FBAHelper @@ -140,14 +141,16 @@ def __init__(self, model=None, # the model that will be defined @staticmethod - def build_from_species_models(models,mdlid=None,name=None,names=[],abundances=None, cobra_model=False): + def build_from_species_models(models, msdb_path, model_id=None, name=None, names=[], abundances=None, cobra_model=False): """Merges the input list of single species metabolic models into a community metabolic model Parameters ---------- models : list List of models to be merged into a community model - mdlid : string + msdb_path : string + The path to the local version of the ModelSEED Database + model_id : string String specifying community model ID name : string String specifying community model name @@ -166,7 +169,13 @@ def build_from_species_models(models,mdlid=None,name=None,names=[],abundances=No Raises ------ """ - newmodel = Model(mdlid,name) + # compatabilize the models + mscompat = MSCompatibility(modelseed_db_path = msdb_path) + models = mscompat.align_exchanges(models, conflicts_file_name='exchanges_conflicts.json', model_names = names) + models = mscompat.standardize(models, conflicts_file_name = 'standardized_exchange_metabolites.json', model_names = names) + + # construct the new model + newmodel = Model(model_id,name) biomass_compounds = [] biomass_index = 2 biomass_indices = [1] diff --git a/modelseedpy/community/mscompatibility.py b/modelseedpy/community/mscompatibility.py index 02fdbe8c..b284d155 100644 --- a/modelseedpy/community/mscompatibility.py +++ b/modelseedpy/community/mscompatibility.py @@ -14,32 +14,42 @@ def __init__(self, self.printing = printing # import and parse ModelSEED Database reactions and compounds - with open(os.path.join(modelseed_db_path, 'Biochemistry', 'reactions.json'), 'r') as rxns: - self.reactions = json.load(rxns) - self.reaction_ids = OrderedDict() - for rxn in self.reactions: - self.reaction_ids[rxn['id']] = rxn['name'] + self.reaction_ids = OrderedDict() + self.reactions = {} + for num in range(0,49): + with open(os.path.join(modelseed_db_path, 'Biochemistry', f'reaction_{num:0>2}.json'), 'r') as rxns: + reactions = json.load(rxns) + for rxn in reactions: + self.reactions.update(rxn) + self.reaction_ids[rxn['id']] = rxn['name'] - with open(os.path.join(modelseed_db_path, 'Biochemistry', 'compounds.json'), 'r') as rxns: - self.compounds = json.load(rxns) - self.compounds_cross_references, self.compound_names = OrderedDict(), OrderedDict() - for cpd in self.compounds: - self.compounds_cross_references[cpd['id']] = {} - if cpd['aliases'] is not None: - for category in cpd['aliases']: - content = category.split(';') - if 'Name' in category: - content[0] = content[0].split(':')[0].strip() - names = [name.strip() for name in content] - names.append(cpd['name']) - for name in names: - if name not in self.compound_names: - self.compound_names[name] = cpd['id'] - else: - first = content[0].split(':') - db = first[0].strip() - content[0] = first[1] - self.compounds_cross_references[cpd['id']][db] = [x.strip() for x in content] + self.compounds_cross_references, self.compound_names = OrderedDict(), OrderedDict() + self.compounds = {} + for num in range(0,38): + with open(os.path.join(modelseed_db_path, 'Biochemistry', f'compound_{num:0>2}.json'), 'r') as cpds: + try: + compounds = json.load(cpds) + except: + print(f'compound_{num:0>2}.json is probably empty.') + continue + for cpd in compounds: + self.compounds.update(cpd) + self.compounds_cross_references[cpd['id']] = {} + if cpd['aliases'] is not None: + for category in cpd['aliases']: + content = category.split(';') + if 'Name' in category: + content[0] = content[0].split(':')[0].strip() + names = [name.strip() for name in content] + names.append(cpd['name']) + for name in names: + if name not in self.compound_names: + self.compound_names[name] = cpd['id'] + else: + first = content[0].split(':') + db = first[0].strip() + content[0] = first[1] + self.compounds_cross_references[cpd['id']][db] = [x.strip() for x in content] # def _parse_modelReactionReagents(self, modelReactionReagents, model_metabolites): From 4930f7550f99e53614591f6ee0b6f895adb79821 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 15 Sep 2022 15:08:42 -0500 Subject: [PATCH 020/298] Fixes to ATP correction --- modelseedpy/core/__init__.py | 1 + modelseedpy/core/gapfillinghelper.py | 5 - modelseedpy/core/msatpcorrection.py | 69 +++++++++-- modelseedpy/core/msmodelutl.py | 178 ++++++++++++++++++++++----- 4 files changed, 207 insertions(+), 46 deletions(-) diff --git a/modelseedpy/core/__init__.py b/modelseedpy/core/__init__.py index 4031b13f..c811a8c2 100755 --- a/modelseedpy/core/__init__.py +++ b/modelseedpy/core/__init__.py @@ -10,4 +10,5 @@ from modelseedpy.core.msatpcorrection import MSATPCorrection from modelseedpy.core.msgrowthphenotypes import MSGrowthPhenotypes from modelseedpy.core.msmodelutl import MSModelUtil +from modelseedpy.core.mstemplate import MSTemplateBuilder from modelseedpy.core.exceptions import * \ No newline at end of file diff --git a/modelseedpy/core/gapfillinghelper.py b/modelseedpy/core/gapfillinghelper.py index 50c9cd29..a7d5422b 100644 --- a/modelseedpy/core/gapfillinghelper.py +++ b/modelseedpy/core/gapfillinghelper.py @@ -13,11 +13,6 @@ logger = logging.getLogger(__name__) - - - - - def build_cpd_id(str): if str.startswith("M_"): str = str[2:] diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 4a4b22d0..98e791b7 100755 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -3,33 +3,39 @@ import cobra import json import time +from os.path import abspath as _abspath +from os.path import dirname as _dirname from optlang.symbolics import Zero, add from modelseedpy.core.rast_client import RastClient from modelseedpy.core.msgenome import normalize_role from modelseedpy.core.msmodel import get_gpr_string, get_reaction_constraints_from_direction from cobra.core import Gene, Metabolite, Model, Reaction from modelseedpy.core.msmodelutl import MSModelUtil +from modelseedpy.core.mstemplate import MSTemplateBuilder from modelseedpy.core import FBAHelper, MSGapfill, MSMedia from modelseedpy.fbapkg.mspackagemanager import MSPackageManager +from modelseedpy.helpers import get_template logger = logging.getLogger(__name__) +_path = _dirname(_abspath(__file__)) class MSATPCorrection: DEBUG = False - def __init__(self, model, core_template, atp_medias: list, compartment="c0", - max_gapfilling=None, gapfilling_delta=0, atp_hydrolysis_id=None): + def __init__(self,model,core_template=None,atp_medias=[],compartment="c0",max_gapfilling=None, + gapfilling_delta=0,atp_hydrolysis_id=None,load_default_medias=True,forced_media=[]): """ - :param model: - :param core_template: - :param atp_medias: - :param atp_objective: - :param max_gapfilling: - :param gapfilling_delta: - :param atp_hydrolysis_id: ATP Hydrolysis reaction ID, if None it will perform a SEED reaction search + :param core_template: + :param atp_medias: list : list of additional medias to test + :param load_default_medias: Bool : load default media set + :param forced_media: list : name of medias in which ATP production should be forced + :param compartment: string : ID of compartment to test ATP in + :param max_gapfilling: string : maximum gapfilling allowed in accepted media + :param gapfilling_delta: string : difference between lowest gapfilling and current gapfilling where media will be accepted + :param atp_hydrolysis_id: string : ATP Hydrolysis reaction ID, if None it will perform a SEED reaction search """ if isinstance(model, MSModelUtil): self.model = model.model @@ -37,21 +43,39 @@ def __init__(self, model, core_template, atp_medias: list, compartment="c0", else: self.model = model self.modelutl = MSModelUtil(model) + self.compartment = compartment + if atp_hydrolysis_id and atp_hydrolysis_id in self.model.reactions: self.atp_hydrolysis = self.model.reactions.get_by_id(atp_hydrolysis_id) else: output = self.modelutl.add_atp_hydrolysis(compartment) self.atp_hydrolysis = output["reaction"] + self.atp_medias = [] + if load_default_medias: + self.load_default_medias() for media in atp_medias: if isinstance(media, MSMedia): self.atp_medias.append([media, 0.01]) else: - self.atp_medias.append(media) + self.atp_medias.append(media) + + self.forced_media = [] + for media_id in forced_media: + for media in self.atp_medias: + if media.id == media_id: + self.forced_media.append(media) + break + self.max_gapfilling = max_gapfilling self.gapfilling_delta = gapfilling_delta - self.coretemplate = core_template + + if not core_template: + self.load_default_template() + else: + self.coretemplate = core_template + self.msgapfill = MSGapfill(self.modelutl, default_gapfill_templates=core_template) self.original_bounds = {} self.noncore_reactions = [] @@ -62,6 +86,25 @@ def __init__(self, model, core_template, atp_medias: list, compartment="c0", self.lp_filename = None self.multiplier = 1.2 + def load_default_template(self): + self.coretemplate = MSTemplateBuilder.from_dict(get_template('template_core'), None).build() + + def load_default_medias(self): + filename = _path+"/../data/media.csv" + medias = pd.read_csv(filename, sep='\t', index_col=0).to_dict() + for media_id in medias: + media_d = {} + for exchange, v in media_data[media_id].items(): + if v > 0: + k = exchange.split('_')[1] + media_d[k] = v + media_d['cpd00001'] = 1000 + media_d['cpd00067'] = 1000 + media = MSMedia.from_dict(media_d) + media.id = media_id + media.name = media_id + self.atp_medias.append(media) + @staticmethod def find_reaction_in_template(model_reaction, template, compartment): template_reaction = None # we save lookup result here @@ -217,6 +260,10 @@ def determine_growth_media(self): if gfscore <= self.max_gapfilling and gfscore <= (best_score+self.gapfilling_delta): self.selected_media.append(media) + for media in self.forced_media: + if media not in self.selected_media: + self.selected_media.append(media) + def determine_growth_media2(self, max_gapfilling=None): """ Decides which of the test media to use as growth conditions for this model diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index ff08200d..ef9a22af 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -72,8 +72,50 @@ def __init__(self,model): self.metabolite_hash = None self.search_metabolite_hash = None self.test_objective = None + self.reaction_scores = None self.score = None + def compute_automated_reaction_scores(self): + """ + Computes reaction scores automatically from model data + :return: + """ + self.reaction_scores = {} + + def create_atputl(self,core_template=None,atp_medias=[],compartment="c0",max_gapfilling=None, + gapfilling_delta=0,atp_hydrolysis_id=None,load_default_medias=True,forced_media=[]): + """ + Automatically creating ATP correction utility from model data + :return: + """ + self.atputl = MSATPCorrection(self,core_template,atp_medias,compartment,max_gapfilling, + gapfilling_delta,atp_hydrolysis_id,load_default_medias,forced_media) + + def create_gfutl(self,atp_safe = True,default_gapfill_templates=[], default_gapfill_models=[], + additional_tests=[],blacklist=[]): + """ + Automatically creating gapfilling utility from model data + :return: + """ + tests = [] + if atp_safe: + if not self.atputl: + self.create_atputl() + mdlutl.atputl.evaluate_growth_media() + mdlutl.atputl.determine_growth_media() + mdlutl.atputl.apply_growth_media_gapfilling() + mdlutl.atputl.evaluate_growth_media() + mdlutl.atputl.expand_model_to_genome_scale() + tests = mdlutl.atputl.build_tests() + for test in additional_tests: + tests.append(test) + + if not self.reaction_scores: + self.compute_automated_reaction_scores() + + self.gfutl = MSGapfill(self,default_gapfill_templates, default_gapfill_models, + tests,self.reaction_scores, blacklist) + def printlp(self,lpfilename="debug.lp"): with open(lpfilename, 'w') as out: out.write(str(self.model.solver)) @@ -443,7 +485,99 @@ def test_condition_list(self,condition_list,model=None): return False return True - def reaction_expansion_test(self,reaction_list,condition_list): + def linear_expansion_test(self,reaction_list,condition,currmodel): + """Tests addition of reactions one at a time + + Parameters + ---------- + reaction_list : list<[obj reaction,{>|>}]> + List of reactions and directions to test for addition in the model (should already be in model) + + Returns + ------- + list<[obj reaction,{>|>}]> + List of reactions and directions filtered because they fail tests when in the model + + Raises + ------ + """ + #First run the full test + if self.test_single_condition(condition,False,currmodel): + return [] + # First knockout all reactions in the input list and save original bounds + filtered_list = [] + original_bound = [] + for item in reaction_list: + if item[1] == ">": + original_bound.append(item[0].upper_bound) + item[0].upper_bound = 0 + else: + original_bound.append(item[0].lower_bound) + item[0].lower_bound = 0 + # Now restore reactions one at a time + count = 0 + for item in reaction_list: + if item[1] == ">": + item[0].upper_bound = original_bound[count] + if not self.test_single_condition(condition,False,currmodel): + item[0].upper_bound = 0 + if item not in filtered_list: + item.append(original_bound[count]) + item.append(self.score) + filtered_list.append(item) + else: + item[0].lower_bound = original_bound[count] + if not self.test_single_condition(condition,False,currmodel): + item[0].lower_bound = 0 + if item not in filtered_list: + item.append(original_bound[count]) + item.append(self.score) + filtered_list.append(item) + count += 1 + return filtered_list + + def binary_expansion_test(self,reaction_list,condition,currmodel,depth=0): + """Conducts a binary search for bad reaction combinations + + Parameters + ---------- + reaction_list : list<[obj reaction,{>|>}]> + List of reactions and directions to test for addition in the model (should already be in model) + condition_list : list + Specifies set of conditions to be tested with media, objective, is_max_threshold, threshold. + + Returns + ------- + list<[obj reaction,{>|>}]> + List of reactions and directions filtered because they fail tests when in the model + + Raises + ------ + """ + newdepth = depth + 1 + filtered_list = [] + #First run the full test + if self.test_single_condition(condition,False,currmodel): + return [] + #Break reaction list into two + sub_list = [] + midway_point = int(len(reaction_list)/2) + #Testing first half + for i in range(midway_point): + sub_list.append(reaction_list[i]) + new_filter = self.binary_expansion_test(reaction_list,condition,currmodel,newdepth) + for item in new_filter: + filtered_list.append(item) + #Testing second half + sub_list = [] + for i in range(midway_point+1,len(reaction_list)): + sub_list.append(reaction_list[i]) + new_filter = self.binary_expansion_test(reaction_list,condition,currmodel,newdepth) + for item in new_filter: + filtered_list.append(item) + return new_filter + + def reaction_expansion_test(self,reaction_list,condition_list,binary_search=False): """Adds reactions in reaction list one by one and appplies tests, filtering reactions that fail Parameters @@ -468,35 +602,14 @@ def reaction_expansion_test(self,reaction_list,condition_list): currmodel = self.model with currmodel: self.apply_test_condition(condition) - # First knockout all reactions in the input list and save original bounds - original_bound = [] - for item in reaction_list: - if item[1] == ">": - original_bound.append(item[0].upper_bound) - item[0].upper_bound = 0 - else: - original_bound.append(item[0].lower_bound) - item[0].lower_bound = 0 - # Now restore reactions one at a time - count = 0 - for item in reaction_list: - if item[1] == ">": - item[0].upper_bound = original_bound[count] - if not self.test_single_condition(condition,False,currmodel): - item[0].upper_bound = 0 - if item not in filtered_list: - item.append(original_bound[count]) - item.append(self.score) - filtered_list.append(item) - else: - item[0].lower_bound = original_bound[count] - if not self.test_single_condition(condition,False,currmodel): - item[0].lower_bound = 0 - if item not in filtered_list: - item.append(original_bound[count]) - item.append(self.score) - filtered_list.append(item) - count += 1 + if binary_search: + new_filtered = self.binary_expansion_test(reaction_list,condition,currmodel) + for item in new_filtered: + filtered_list.append(item) + else: + new_filtered = self.linear_expansion_test(reaction_list,condition,currmodel) + for item in new_filtered: + filtered_list.append(item) toc = time.perf_counter() print("Expansion time:",(toc-tic)) print("Filtered count:",len(filtered_list)," out of ",len(reaction_list)) @@ -529,6 +642,11 @@ def add_atp_hydrolysis(self,compartment): self.model.add_reactions([cobra_reaction]) return {"reaction":cobra_reaction,"direction":">","new":True} + def gapfilled_reaction_count(self): + count = 0 + #TODO + return count + @staticmethod def parse_id(object): if re.search('(.+)_([a-z]+)(\d*)$', object.id) != None: From 7f15e9f25b8a4b0b1fa2c73b80eecc3f2cfcdd7f Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Fri, 23 Sep 2022 22:33:13 -0500 Subject: [PATCH 021/298] Numerous fixes to get modeling pipeline to work and stripping out pyeda which does not play nice with sdk --- modelseedpy/core/msatpcorrection.py | 62 +++++++++++++---------------- modelseedpy/core/msbuilder.py | 4 +- modelseedpy/core/msgapfill.py | 6 +-- modelseedpy/core/msmodel.py | 14 +++---- modelseedpy/core/msmodelutl.py | 8 ++-- modelseedpy/fbapkg/gapfillingpkg.py | 20 +++++----- 6 files changed, 53 insertions(+), 61 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index d40a3631..8a91574d 100755 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -21,6 +21,25 @@ _path = _dirname(_abspath(__file__)) +min_gap = { + 'Glc/O2': 5, + 'Etho/O2': 0.01, + 'Ac/O2': 1, + 'Pyr/O2': 3, + 'Glyc/O2': 2, + 'Fum/O2': 3, + 'Succ/O2': 2, + 'Akg/O2': 2, + 'LLac/O2': 2, + 'Dlac/O2': 2, + 'For/O2': 2, + 'For/NO3': 1.5, + 'Pyr/NO': 2.5, + 'Pyr/NO2': 2.5, + 'Pyr/NO3': 2.5, + 'Pyr/SO4': 2.5, +} + class MSATPCorrection: DEBUG = False @@ -104,7 +123,10 @@ def load_default_medias(self): media = MSMedia.from_dict(media_d) media.id = media_id media.name = media_id - self.atp_medias.append([media,0.01]) + min_obj = 0.01 + if media_id in min_gap: + min_obj = min_gap[media_id] + self.atp_medias.append([media,min_obj]) @staticmethod def find_reaction_in_template(model_reaction, template, compartment): @@ -219,7 +241,10 @@ def evaluate_growth_media(self): logger.debug('evaluate media %s - %f (%s)', media.id, solution.objective_value, solution.status) self.media_gapfill_stats[media] = None output[media.id] = solution.objective_value + with open("Core-"+media.id.replace("/","-")+".lp", 'w') as out: + out.write(str(self.model.solver)) if solution.objective_value < minimum_obj or solution.status != 'optimal': + self.msgapfill.lp_filename = "CoreGF-"+media.id.replace("/","-")+".lp" self.media_gapfill_stats[media] = self.msgapfill.run_gapfilling(media, self.atp_hydrolysis.id, minimum_obj) @@ -234,38 +259,7 @@ def evaluate_growth_media(self): return output - def determine_growth_media(self): - """ - Decides which of the test media to use as growth conditions for this model - :return: - """ - self.selected_media = [] - best_score = None - for media in self.media_gapfill_stats: - gfscore = 0 - if self.media_gapfill_stats[media]: - gfscore = len(self.media_gapfill_stats[media]["new"].keys()) + 0.5*len(self.media_gapfill_stats[media]["reversed"].keys()) - if best_score is None or gfscore < best_score: - best_score = gfscore - if self.max_gapfilling is None: - self.max_gapfilling = best_score - - logger.debug(f'max_gapfilling: {self.max_gapfilling}, best_score: {best_score}') - - for media in self.media_gapfill_stats: - gfscore = 0 - if self.media_gapfill_stats[media]: - gfscore = len(self.media_gapfill_stats[media]["new"].keys()) + 0.5*len(self.media_gapfill_stats[media]["reversed"].keys()) - - logger.debug(f'media gapfilling score: {media.id}: {gfscore}') - if gfscore <= self.max_gapfilling and gfscore <= (best_score+self.gapfilling_delta): - self.selected_media.append(media) - - for media in self.forced_media: - if media not in self.selected_media: - self.selected_media.append(media) - - def determine_growth_media2(self, max_gapfilling=None): + def determine_growth_media(self, max_gapfilling=None): """ Decides which of the test media to use as growth conditions for this model :return: @@ -283,7 +277,7 @@ def scoring_function(media): for media in media_scores: score = media_scores[media] logger.debug(score, best_score, max_gapfilling) - if score <= max_gapfilling and score <= (best_score + self.gapfilling_delta): + if score <= max_gapfilling and score <= (max_gapfilling + self.gapfilling_delta): self.selected_media.append(media) def apply_growth_media_gapfilling(self): diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 54b854b1..8aa6f8b2 100755 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -554,7 +554,7 @@ def build(self, model_id, index='0', allow_all_non_grp_reactions=False, annotate cobra_model.objective = 'bio1' reactions_sinks = [] - for cpd_id in ['cpd02701_c0', 'cpd11416_c0', 'cpd15302_c0']: + for cpd_id in ['cpd02701_c0', 'cpd11416_c0', 'cpd15302_c0', 'cpd03091_c0']: if cpd_id in cobra_model.metabolites: m = cobra_model.metabolites.get_by_id(cpd_id) rxn_exchange = Reaction('SK_' + m.id, 'Sink for ' + m.name, 'exchanges', 0, 1000) @@ -598,7 +598,7 @@ def build_full_template_model(template, model_id=None, index='0'): model.objective = 'bio1' reactions_sinks = [] - for cpd_id in ['cpd02701_c0', 'cpd11416_c0', 'cpd15302_c0']: + for cpd_id in ['cpd02701_c0', 'cpd11416_c0', 'cpd15302_c0',"cpd03091_c0"]: if cpd_id in model.metabolites: m = model.metabolites.get_by_id(cpd_id) rxn_exchange = Reaction('SK_' + m.id, 'Sink for ' + m.name, 'exchanges', 0, 1000) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 32d8a64f..4f27ec7e 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -20,7 +20,7 @@ def __init__(self, model, default_gapfill_templates=[], default_gapfill_models=[ else: self.model = model self.modelutl = MSModelUtil(model) - self.auto_sink = ["cpd02701", "cpd11416", "cpd15302"] # the cpd11416 compound is filtered during model extension with templates + self.auto_sink = ["cpd02701", "cpd11416", "cpd15302","cpd03091"] # the cpd11416 compound is filtered during model extension with templates self.gfmodel = self.lp_filename = self.last_solution = None self.model_penalty = 1 self.default_gapfill_models = default_gapfill_models @@ -133,8 +133,8 @@ def build_default(mdlutl,atp_safe = True,default_gapfill_templates=[], default_g for test in additional_tests: tests.append(test) - if not self.reaction_scores: - self.compute_automated_reaction_scores() + if not mdlutl.reaction_scores: + mdlutl.compute_automated_reaction_scores() return MSGapfill(mdlutl,default_gapfill_templates, default_gapfill_models, tests,mdlutl.reaction_scores, blacklist) diff --git a/modelseedpy/core/msmodel.py b/modelseedpy/core/msmodel.py index 53fe9d33..5b63ea2c 100755 --- a/modelseedpy/core/msmodel.py +++ b/modelseedpy/core/msmodel.py @@ -1,7 +1,7 @@ import logging import re from cobra.core import Model -from pyeda.inter import expr # wheels must be specially downloaded and installed for Windows https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyeda +#from pyeda.inter import expr # wheels must be specially downloaded and installed for Windows https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyeda logger = logging.getLogger(__name__) @@ -96,12 +96,12 @@ def get_set_set(expr_str): # !!! this currently returns dictionaries, not sets return {} expr_str = expr_str.replace(' or ', ' | ') expr_str = expr_str.replace(' and ', ' & ') - dnf = expr(expr_str).to_dnf() - if len(dnf.inputs) == 1 or dnf.NAME == 'And': - return {frozenset({str(x) for x in dnf.inputs})} - else: - return {frozenset({str(x) for x in o.inputs}) for o in dnf.xs} - + #dnf = expr(expr_str).to_dnf() + #if len(dnf.inputs) == 1 or dnf.NAME == 'And': + #return {frozenset({str(x) for x in dnf.inputs})} + #else: + # return {frozenset({str(x) for x in o.inputs}) for o in dnf.xs} + return {} class MSModel(Model): diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 5cd849a9..3b7fa6f9 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -576,10 +576,10 @@ def reaction_expansion_test(self,reaction_list,condition_list,binary_search=Fals ------ """ print("Expansion started!") - tic = time.perf_counter() filtered_list = [] for condition in condition_list: currmodel = self.model + tic = time.perf_counter() with currmodel: self.apply_test_condition(condition) if binary_search: @@ -590,9 +590,9 @@ def reaction_expansion_test(self,reaction_list,condition_list,binary_search=Fals new_filtered = self.linear_expansion_test(reaction_list,condition,currmodel) for item in new_filtered: filtered_list.append(item) - toc = time.perf_counter() - print("Expansion time:",(toc-tic)) - print("Filtered count:",len(filtered_list)," out of ",len(reaction_list)) + toc = time.perf_counter() + print("Expansion time:",condition["media"].id,(toc-tic)) + print("Filtered count:",len(filtered_list)," out of ",len(reaction_list)) return filtered_list def add_atp_hydrolysis(self,compartment): diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index 67885823..c23a39c0 100755 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -101,7 +101,7 @@ def get_model_index_hash(self): def build_package(self, parameters): self.validate_parameters(parameters, [], { - "auto_sink": ["cpd02701", "cpd11416", "cpd15302"], + "auto_sink": ["cpd02701", "cpd11416", "cpd15302","cpd03091"], "extend_with_template":1, "model_penalty":1, "default_gapfill_models":[], @@ -112,9 +112,10 @@ def build_package(self, parameters): "gapfill_all_indecies_with_default_templates":1, "gapfill_all_indecies_with_default_models":1, "default_excretion":100, - "default_uptake":-100, + "default_uptake":100, "minimum_obj":0.01, "set_objective":1, + "minimize_exchanges":False, "blacklist":default_blacklist }) # Adding model reactions to original reaction list @@ -184,15 +185,12 @@ def build_package(self, parameters): obj_coef = dict() for reaction in self.model.reactions: if reaction.id in self.gapfilling_penalties: - # Minimizing gapfilled reactions - if "reverse" in self.gapfilling_penalties[reaction.id]: - obj_coef[reaction.reverse_variable] = abs(self.gapfilling_penalties[reaction.id]["reverse"]) - # elif default_penalty != 0: - # obj_coef[reaction.reverse_variable] = 0 - if "forward" in self.gapfilling_penalties[reaction.id]: - obj_coef[reaction.forward_variable] = abs(self.gapfilling_penalties[reaction.id]["forward"]) - # elif default_penalty != 0: - # obj_coef[reaction.forward_variable] = 0 + if self.parameters["minimize_exchanges"] or reaction.id[0:3] != "EX_": + # Minimizing gapfilled reactions + if "reverse" in self.gapfilling_penalties[reaction.id]: + obj_coef[reaction.reverse_variable] = abs(self.gapfilling_penalties[reaction.id]["reverse"]) + if "forward" in self.gapfilling_penalties[reaction.id]: + obj_coef[reaction.forward_variable] = abs(self.gapfilling_penalties[reaction.id]["forward"]) else: obj_coef[reaction.forward_variable] = 0 obj_coef[reaction.reverse_variable] = 0 From 69b4f0d14352d41b294005d3f64c327e6ecf5978 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Fri, 23 Sep 2022 23:38:38 -0500 Subject: [PATCH 022/298] Restoring pyeda since we fixed the docker issues preventing it from installing --- modelseedpy/core/msmodel.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modelseedpy/core/msmodel.py b/modelseedpy/core/msmodel.py index 5b63ea2c..21cfd6a4 100755 --- a/modelseedpy/core/msmodel.py +++ b/modelseedpy/core/msmodel.py @@ -1,7 +1,7 @@ import logging import re from cobra.core import Model -#from pyeda.inter import expr # wheels must be specially downloaded and installed for Windows https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyeda +from pyeda.inter import expr # wheels must be specially downloaded and installed for Windows https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyeda logger = logging.getLogger(__name__) @@ -96,11 +96,11 @@ def get_set_set(expr_str): # !!! this currently returns dictionaries, not sets return {} expr_str = expr_str.replace(' or ', ' | ') expr_str = expr_str.replace(' and ', ' & ') - #dnf = expr(expr_str).to_dnf() - #if len(dnf.inputs) == 1 or dnf.NAME == 'And': - #return {frozenset({str(x) for x in dnf.inputs})} - #else: - # return {frozenset({str(x) for x in o.inputs}) for o in dnf.xs} + dnf = expr(expr_str).to_dnf() + if len(dnf.inputs) == 1 or dnf.NAME == 'And': + return {frozenset({str(x) for x in dnf.inputs})} + else: + return {frozenset({str(x) for x in o.inputs}) for o in dnf.xs} return {} class MSModel(Model): From f126d86c5a370f4c29c8b937ed9cf70c77c98e46 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 24 Sep 2022 00:55:21 -0500 Subject: [PATCH 023/298] Adding flexible atp media file --- modelseedpy/core/msatpcorrection.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 8a91574d..33340baf 100755 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -45,7 +45,7 @@ class MSATPCorrection: DEBUG = False def __init__(self,model,core_template=None,atp_medias=[],compartment="c0",max_gapfilling=None, - gapfilling_delta=0,atp_hydrolysis_id=None,load_default_medias=True,forced_media=[]): + gapfilling_delta=0,atp_hydrolysis_id=None,load_default_medias=True,forced_media=[],default_media_path=None): """ :param model: :param core_template: @@ -57,6 +57,11 @@ def __init__(self,model,core_template=None,atp_medias=[],compartment="c0",max_ga :param gapfilling_delta: string : difference between lowest gapfilling and current gapfilling where media will be accepted :param atp_hydrolysis_id: string : ATP Hydrolysis reaction ID, if None it will perform a SEED reaction search """ + if default_media_path: + self.default_media_path = default_media_path + else: + self.default_media_path = _path+"/../data/atp_medias.tsv" + if isinstance(model, MSModelUtil): self.model = model.model self.modelutl = model @@ -110,7 +115,7 @@ def load_default_template(self): self.coretemplate = MSTemplateBuilder.from_dict(get_template('template_core'), None).build() def load_default_medias(self): - filename = _path+"/../data/atp_medias.tsv" + filename = self.default_media_path medias = pd.read_csv(filename, sep='\t', index_col=0).to_dict() for media_id in medias: media_d = {} @@ -391,10 +396,10 @@ def atp_correction(model, core_template, atp_medias=None, atp_objective="bio2", @staticmethod def build_default(model,core_template=None,atp_medias=[],compartment="c0",max_gapfilling=None, - gapfilling_delta=0,atp_hydrolysis_id=None,load_default_medias=True,forced_media=[]): + gapfilling_delta=0,atp_hydrolysis_id=None,load_default_medias=True,forced_media=[],default_media_path=None): """ Automatically creating ATP correction utility from model data :return: """ return MSATPCorrection(model,core_template,atp_medias,compartment,max_gapfilling, - gapfilling_delta,atp_hydrolysis_id,load_default_medias,forced_media) \ No newline at end of file + gapfilling_delta,atp_hydrolysis_id,load_default_medias,forced_media,default_media_path) \ No newline at end of file From 8164a3bbea7a967a1063c54e728afbdba18d114c Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sun, 25 Sep 2022 23:13:19 -0500 Subject: [PATCH 024/298] More gapfilling utilities for KBase app --- modelseedpy/core/msgapfill.py | 5 ++++ modelseedpy/core/msmodelutl.py | 50 ++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 4f27ec7e..3d8af595 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -32,8 +32,12 @@ def __init__(self, model, default_gapfill_templates=[], default_gapfill_models=[ self.test_condition_iteration_limit = 10 self.test_conditions = test_conditions self.reaction_scores = reaction_scores + self.target = None + self.media = None def run_gapfilling(self, media=None, target=None, minimum_obj=0.01, binary_check=False, prefilter=True): + self.target = target + self.media = media if target: self.model.objective = self.model.problem.Objective( self.model.reactions.get_by_id(target).flux_expression, direction='max') @@ -82,6 +86,7 @@ def run_gapfilling(self, media=None, target=None, minimum_obj=0.01, binary_check return self.last_solution def integrate_gapfill_solution(self, solution): + self.modelutl.add_gapfilling(solution,self.target,self.media) for rxn_id in solution["reversed"]: rxn = self.model.reactions.get_by_id(rxn_id) if solution["reversed"][rxn_id] == ">": diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 3b7fa6f9..0b191d83 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -74,6 +74,7 @@ def __init__(self,model): self.test_objective = None self.reaction_scores = None self.score = None + self.integrated_gapfillings = [] def compute_automated_reaction_scores(self): """ @@ -308,6 +309,48 @@ def convert_cobra_reaction_to_kbreaction(self,rxn,kbmodel,cpd_hash,direction = " kbmodel["modelreactions"].append(rxn_data) return rxn_data + def create_kb_gapfilling_data(self,kbmodel): + largest_index = 0 + if "gapfillings" not in kbmodel: + kbmodel["gapfillings"] = [] + for gapfilling in kbmodel["gapfillings"]: + current_index = int(gapfilling["id"].split(".").pop()) + if largest_index == 0 or largest_index < current_index: + largest_index = current_index + rxn_hash = {} + for rxn in kbmodel["modelreactions"]: + rxn_hash[rxn["id"]] = rxn + for gf in self.integrated_gapfillings: + largest_index += 1 + gfid = "gf."+str(largest_index) + gapfilling_obj = { + "gapfill_id": self.model.id+"."+gfid, + "id": gfid, + "integrated": 1, + "integrated_solution": "0", + "objective":gf["objective"], + "media_ref": gf["media"].info.workspace_id+"/"+gf["media"].info.id + } + kbmodel["gapfillings"].append(gapfilling_obj) + for rxn in gf["solution"]["new"]: + if rxn in rxn_hash: + rxnobj = rxn_hash[rxn] + if "gapfill_data" not in rxnobj: + rxnobj["gapfill_data"] = {} + if gfid not in rxnobj["gapfill_data"]: + rxnobj["gapfill_data"][gfid] = { + "0" : [gapfilled_reactions["new"][rxn],1,[]] + } + for rxn in gapfilled_reactions["reversed"]: + if rxn in rxn_hash: + rxnobj = rxn_hash[rxn] + if "gapfill_data" not in rxnobj: + rxnobj["gapfill_data"] = {} + if gfid not in rxnobj["gapfill_data"]: + rxnobj["gapfill_data"][gfid] = { + "0" : [gapfilled_reactions["reversed"][rxn],1,[]] + } + def add_gapfilling_solution_to_kbase_model(self,newmodel,gapfilled_reactions,gfid=None,media_ref = None,reaction_genes = None): """ NOTE: to be moved to cobrakbase @@ -595,6 +638,13 @@ def reaction_expansion_test(self,reaction_list,condition_list,binary_search=Fals print("Filtered count:",len(filtered_list)," out of ",len(reaction_list)) return filtered_list + def add_gapfilling(self,solution,objective,media): + self.integrated_gapfillings.append({ + "solution":solution, + "objective":objective, + "media":media + }) + def add_atp_hydrolysis(self,compartment): #Searching for ATP hydrolysis compounds coefs = {"cpd00002":[-1,compartment],"cpd00001":[-1,compartment],"cpd00008":[1,compartment],"cpd00009":[1,compartment],"cpd00067":[1,compartment]} From d10d789ea9b9a31e669ff0826199a8d492faabdc Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 26 Sep 2022 00:39:32 -0500 Subject: [PATCH 025/298] Correcting media refs --- modelseedpy/core/msmodelutl.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 0b191d83..95b58d91 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -323,13 +323,16 @@ def create_kb_gapfilling_data(self,kbmodel): for gf in self.integrated_gapfillings: largest_index += 1 gfid = "gf."+str(largest_index) + media_ref = "KBaseMedia/Empty" + if hasattr(gf["media"], 'info'): + media_ref = gf["media"].info.workspace_id+"/"+gf["media"].info.id gapfilling_obj = { "gapfill_id": self.model.id+"."+gfid, "id": gfid, "integrated": 1, "integrated_solution": "0", "objective":gf["objective"], - "media_ref": gf["media"].info.workspace_id+"/"+gf["media"].info.id + "media_ref": media_ref } kbmodel["gapfillings"].append(gapfilling_obj) for rxn in gf["solution"]["new"]: From cd70a2812ddf68380cfac1485d20e55fd6cbeef4 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 26 Sep 2022 00:57:48 -0500 Subject: [PATCH 026/298] Fixing gapfilling function --- modelseedpy/core/msmodelutl.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 95b58d91..4b677c8e 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -342,16 +342,16 @@ def create_kb_gapfilling_data(self,kbmodel): rxnobj["gapfill_data"] = {} if gfid not in rxnobj["gapfill_data"]: rxnobj["gapfill_data"][gfid] = { - "0" : [gapfilled_reactions["new"][rxn],1,[]] + "0" : [gf["solution"]["new"][rxn],1,[]] } - for rxn in gapfilled_reactions["reversed"]: + for rxn in gf["solution"]["reversed"]: if rxn in rxn_hash: rxnobj = rxn_hash[rxn] if "gapfill_data" not in rxnobj: rxnobj["gapfill_data"] = {} if gfid not in rxnobj["gapfill_data"]: rxnobj["gapfill_data"][gfid] = { - "0" : [gapfilled_reactions["reversed"][rxn],1,[]] + "0" : [gf["solution"]["reversed"][rxn],1,[]] } def add_gapfilling_solution_to_kbase_model(self,newmodel,gapfilled_reactions,gfid=None,media_ref = None,reaction_genes = None): From ecb9d254c6eb84deb9e70219be2a3e475c25860a Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 26 Sep 2022 11:11:25 -0500 Subject: [PATCH 027/298] Switching lipid A compound in biomass --- modelseedpy/core/msbuilder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 8aa6f8b2..41aa5f40 100755 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -98,7 +98,7 @@ 'cpd00058_c0': -0.00280615915959131, 'cpd00041_c0': -0.200830806928348, 'cpd00129_c0': -0.184354665339991, - 'cpd15432_c0': -0.0250105977108944, + 'cpd03736_c0': -0.0250105977108944, 'cpd00052_c0': -0.0841036156544863, 'cpd00012_c0': 0.484600235732628, 'cpd15352_c0': -0.00280615915959131, From f719ae83bb1fd1fd58373c5e6155e01707b8a7a1 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 5 Oct 2022 23:40:58 -0500 Subject: [PATCH 028/298] Finalizing new modeling pipeilne for KBase app --- modelseedpy/core/msatpcorrection.py | 62 ++-- modelseedpy/core/msgapfill.py | 176 +++++++---- modelseedpy/core/msmodelutl.py | 357 ++++++++++++----------- modelseedpy/fbapkg/basefbapkg.py | 2 +- modelseedpy/fbapkg/flexiblebiomasspkg.py | 269 ++++++++++------- 5 files changed, 488 insertions(+), 378 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 33340baf..26e4f0a3 100755 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -44,11 +44,11 @@ class MSATPCorrection: DEBUG = False - def __init__(self,model,core_template=None,atp_medias=[],compartment="c0",max_gapfilling=None, + def __init__(self,model_or_mdlutl,core_template=None,atp_medias=[],compartment="c0",max_gapfilling=10, gapfilling_delta=0,atp_hydrolysis_id=None,load_default_medias=True,forced_media=[],default_media_path=None): """ :param model: - :param core_template: + :param core_template: :param atp_medias: list : list of additional medias to test :param load_default_medias: Bool : load default media set :param forced_media: list : name of medias in which ATP production should be forced @@ -57,18 +57,21 @@ def __init__(self,model,core_template=None,atp_medias=[],compartment="c0",max_ga :param gapfilling_delta: string : difference between lowest gapfilling and current gapfilling where media will be accepted :param atp_hydrolysis_id: string : ATP Hydrolysis reaction ID, if None it will perform a SEED reaction search """ + #Discerning input is model or mdlutl and setting internal links + if isinstance(model_or_mdlutl, MSModelUtil): + self.model = model_or_mdlutl.model + self.modelutl = model_or_mdlutl + else: + self.model = model_or_mdlutl + self.modelutl = MSModelUtil.get(model_or_mdlutl) + #Setting atpcorrection attribute in model utl so link is bidirectional + self.modelutl.atputl = self + if default_media_path: self.default_media_path = default_media_path else: self.default_media_path = _path+"/../data/atp_medias.tsv" - if isinstance(model, MSModelUtil): - self.model = model.model - self.modelutl = model - else: - self.model = model - self.modelutl = MSModelUtil(model) - self.compartment = compartment if atp_hydrolysis_id and atp_hydrolysis_id in self.model.reactions: @@ -102,11 +105,14 @@ def __init__(self,model,core_template=None,atp_medias=[],compartment="c0",max_ga self.coretemplate = core_template self.msgapfill = MSGapfill(self.modelutl, default_gapfill_templates=core_template) + #These should stay as None until atp correction is actually run + self.cumulative_core_gapfilling = None + self.selected_media = None + self.original_bounds = {} self.noncore_reactions = [] self.other_compartments = [] self.media_gapfill_stats = {} - self.selected_media = [] self.filtered_noncore = [] self.lp_filename = None self.multiplier = 1.2 @@ -246,17 +252,17 @@ def evaluate_growth_media(self): logger.debug('evaluate media %s - %f (%s)', media.id, solution.objective_value, solution.status) self.media_gapfill_stats[media] = None output[media.id] = solution.objective_value - with open("Core-"+media.id.replace("/","-")+".lp", 'w') as out: - out.write(str(self.model.solver)) + #with open("Core-"+media.id.replace("/","-")+".lp", 'w') as out: + # out.write(str(self.model.solver)) if solution.objective_value < minimum_obj or solution.status != 'optimal': - self.msgapfill.lp_filename = "CoreGF-"+media.id.replace("/","-")+".lp" + #self.msgapfill.lp_filename = "CoreGF-"+media.id.replace("/","-")+".lp" self.media_gapfill_stats[media] = self.msgapfill.run_gapfilling(media, self.atp_hydrolysis.id, minimum_obj) #IF gapfilling fails - need to activate and penalize the noncore and try again elif solution.objective_value >= minimum_obj: self.media_gapfill_stats[media] = {'reversed': {}, 'new': {}} - logger.debug('gapfilling stats: %s', json.dumps(self.media_gapfill_stats[media], indent=2)) + logger.debug('gapfilling stats: %s', json.dumps(self.media_gapfill_stats[media], indent=2,default=vars)) if MSATPCorrection.DEBUG: with open('debug.json', 'w') as outfile: @@ -272,17 +278,18 @@ def determine_growth_media(self, max_gapfilling=None): def scoring_function(media): return len(self.media_gapfill_stats[media]["new"].keys()) + 0.5 * \ len(self.media_gapfill_stats[media]["reversed"].keys()) - + if not max_gapfilling: + max_gapfilling = self.max_gapfilling self.selected_media = [] media_scores = dict( (media, scoring_function(media)) for media in self.media_gapfill_stats if self.media_gapfill_stats[media]) best_score = min(media_scores.values()) - if max_gapfilling is None: - max_gapfilling = best_score + if max_gapfilling is None or max_gapfilling > (best_score+self.gapfilling_delta): + max_gapfilling = best_score+self.gapfilling_delta for media in media_scores: score = media_scores[media] logger.debug(score, best_score, max_gapfilling) - if score <= max_gapfilling and score <= (max_gapfilling + self.gapfilling_delta): + if score <= max_gapfilling: self.selected_media.append(media) def apply_growth_media_gapfilling(self): @@ -290,10 +297,11 @@ def apply_growth_media_gapfilling(self): Applies the gapfilling to all selected growth media :return: """ + self.cumulative_core_gapfilling = []#TODO: In case someone runs ATP correction twice with different parameters, before resetting this, maybe check if any of these reactions are already in the model and remove them so we're starting fresh??? for media in self.selected_media: - if media in self.media_gapfill_stats and self.media_gapfill_stats[media]: - self.model = self.msgapfill.integrate_gapfill_solution(self.media_gapfill_stats[media]) - + if media in self.media_gapfill_stats and self.media_gapfill_stats[media] and MSGapfill.gapfill_count(self.media_gapfill_stats[media]) > 0: + self.msgapfill.integrate_gapfill_solution(self.media_gapfill_stats[media],self.cumulative_core_gapfilling) + def expand_model_to_genome_scale(self): """Restores noncore reactions to model while filtering out reactions that break ATP Parameters @@ -392,14 +400,4 @@ def atp_correction(model, core_template, atp_medias=None, atp_objective="bio2", max_gapfilling=None, gapfilling_delta=0): atp_correction = MSATPCorrection(model, core_template, atp_medias, atp_hydrolysis_id=atp_objective, max_gapfilling=max_gapfilling, gapfilling_delta=gapfilling_delta) - return atp_correction.run_atp_correction() - - @staticmethod - def build_default(model,core_template=None,atp_medias=[],compartment="c0",max_gapfilling=None, - gapfilling_delta=0,atp_hydrolysis_id=None,load_default_medias=True,forced_media=[],default_media_path=None): - """ - Automatically creating ATP correction utility from model data - :return: - """ - return MSATPCorrection(model,core_template,atp_medias,compartment,max_gapfilling, - gapfilling_delta,atp_hydrolysis_id,load_default_medias,forced_media,default_media_path) \ No newline at end of file + return atp_correction.run_atp_correction() \ No newline at end of file diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 3d8af595..969d619a 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -4,6 +4,7 @@ import cobra import re +from optlang.symbolics import Zero, add from modelseedpy.core import FBAHelper # !!! the import is never used from modelseedpy.fbapkg.mspackagemanager import MSPackageManager from modelseedpy.core.msmodelutl import MSModelUtil @@ -11,15 +12,27 @@ from modelseedpy.core.exceptions import GapfillingError class MSGapfill: + @staticmethod + def gapfill_count(solution): + total = 0 + if "new" in solution: + total += len(solution["new"]) + if "reversed" in solution: + total += len(solution["reversed"]) + return total - def __init__(self, model, default_gapfill_templates=[], default_gapfill_models=[], - test_conditions=[], reaction_scores={}, blacklist=[]): - if isinstance(model, MSModelUtil): - self.model = model.model - self.modelutl = model + def __init__(self, model_or_mdlutl, default_gapfill_templates=[], default_gapfill_models=[], + test_conditions=[], reaction_scores={}, blacklist=[], atp_gapfilling=False): + #Discerning input is model or mdlutl and setting internal links + if isinstance(model_or_mdlutl, MSModelUtil): + self.model = model_or_mdlutl.model + self.mdlutl = model_or_mdlutl else: - self.model = model - self.modelutl = MSModelUtil(model) + self.model = model_or_mdlutl + self.mdlutl = MSModelUtil.get(model_or_mdlutl) + #Setting gapfilling attribute in model utl so link is bidirectional + if not atp_gapfilling: + self.mdlutl.gfutl = self self.auto_sink = ["cpd02701", "cpd11416", "cpd15302","cpd03091"] # the cpd11416 compound is filtered during model extension with templates self.gfmodel = self.lp_filename = self.last_solution = None self.model_penalty = 1 @@ -32,12 +45,10 @@ def __init__(self, model, default_gapfill_templates=[], default_gapfill_models=[ self.test_condition_iteration_limit = 10 self.test_conditions = test_conditions self.reaction_scores = reaction_scores - self.target = None - self.media = None + self.cumulative_gapfilling = [] + def run_gapfilling(self, media=None, target=None, minimum_obj=0.01, binary_check=False, prefilter=True): - self.target = target - self.media = media if target: self.model.objective = self.model.problem.Objective( self.model.reactions.get_by_id(target).flux_expression, direction='max') @@ -82,64 +93,113 @@ def run_gapfilling(self, media=None, target=None, minimum_obj=0.01, binary_check logger.warning("no solution could be found that satisfied all specified test conditions in specified iterations!") return None if binary_check: - return pkgmgr.getpkg("GapfillingPkg").binary_check_gapfilling_solution() + self.last_solution = pkgmgr.getpkg("GapfillingPkg").binary_check_gapfilling_solution() + self.last_solution["media"] = media + self.last_solution["target"] = target + self.last_solution["minobjective"] = minimum_obj + self.last_solution["binary_check"] = binary_check return self.last_solution - def integrate_gapfill_solution(self, solution): - self.modelutl.add_gapfilling(solution,self.target,self.media) + def integrate_gapfill_solution(self, solution,cumulative_solution=[]): + """Integrating gapfilling solution into model + Parameters + ---------- + solution : dict + Specifies the reactions to be added to the model to implement the gapfilling solution + cumulation_solution : list + Optional array to cumulatively track all reactions added to the model when integrating multiple solutions + """ + self.mdlutl.add_gapfilling(solution) for rxn_id in solution["reversed"]: rxn = self.model.reactions.get_by_id(rxn_id) - if solution["reversed"][rxn_id] == ">": + if solution["reversed"][rxn_id] == ">" and rxn.upper_bound <= 0: + cumulative_solution.append([rxn_id,">"]) rxn.upper_bound = 100 - else: + elif solution["reversed"][rxn_id] == "<" and rxn.lower_bound >= 0: + cumulative_solution.append([rxn_id,"<"]) rxn.lower_bound = -100 for rxn_id in solution["new"]: - rxn = self.gfmodel.reactions.get_by_id(rxn_id) - rxn = rxn.copy() - self.model.add_reactions([rxn]) - coreid = re.sub(r'_[a-z]\d+$', '', rxn_id) - if coreid in self.reaction_scores: - bestgene = None - for gene in self.reaction_scores[coreid]: - if not bestgene or self.reaction_scores[coreid][gene] > self.reaction_scores[coreid][bestgene]: - bestgene = gene - rxn = self.model.reactions.get_by_id(rxn_id) - rxn.gene_reaction_rule = bestgene - if solution["new"][rxn_id] == ">": - rxn.upper_bound = 100 - rxn.lower_bound = 0 + if rxn_id not in self.model.reactions: + rxn = self.gfmodel.reactions.get_by_id(rxn_id) + rxn = rxn.copy() + self.model.add_reactions([rxn]) + coreid = re.sub(r'_[a-z]\d+$', '', rxn_id) + if coreid in self.reaction_scores: + bestgene = None + for gene in self.reaction_scores[coreid]: + if not bestgene or self.reaction_scores[coreid][gene] > self.reaction_scores[coreid][bestgene]: + bestgene = gene + rxn = self.model.reactions.get_by_id(rxn_id) + rxn.gene_reaction_rule = bestgene + if solution["new"][rxn_id] == ">": + cumulative_solution.append([rxn_id,">"]) + rxn.upper_bound = 100 + rxn.lower_bound = 0 + else: + cumulative_solution.append([rxn_id,"<"]) + rxn.upper_bound = 0 + rxn.lower_bound = -100 + self.cumulative_gapfilling.extend(cumulative_solution) + + def link_gapfilling_to_biomass(self,target="bio1"): + def find_dependency(item,target_rxn,tempmodel): + objective = tempmodel.slim_optimize() + if objective > 0: + target_rxn.lower_bound = 0.1 + tempmodel.objective = min_flex_obj + solution = tempmodel.optimize() + biocpds = [] + for reaction in self.model.reactions: + if reaction.id[0:5] == "FLEX_" and reaction.forward_variable.primal > Zero: + biocpds.append(reaction.id[5:]) + item.append(biocpds) + print(item[0],",".join(biocpds)) + tempmodel.objective = target_rxn.id + target_rxn.lower_bound = 0 + + #Copying model before manipulating it + tempmodel = cobra.io.json.from_json(cobra.io.json.to_json(self.mdlutl.model)) + #Getting target reaction and making sure it exists + target_rxn = tempmodel.reactions.get_by_id(target) + #Constraining objective to be greater than 0.1 + pkgmgr = MSPackageManager.get_pkg_mgr(tempmodel) + #Adding biomass flexibility + pkgmgr.getpkg("FlexibleBiomassPkg").build_package({ + "bio_rxn_id":target, + "flex_coefficient":[0,1], + "use_rna_class":None, + "use_dna_class":None, + "use_protein_class":None, + "use_energy_class":[0,1], + "add_total_biomass_constraint":False + }) + #Creating min flex objective + min_flex_obj = tempmodel.problem.Objective(Zero,direction="min") + obj_coef = dict() + for reaction in tempmodel.reactions: + if reaction.id[0:5] == "FLEX_" or reaction.id[0:6] == "energy": + obj_coef[reaction.forward_variable] = 1 + #Temporarily setting flex objective so I can set coefficients + tempmodel.objective = min_flex_obj + min_flex_obj.set_linear_coefficients(obj_coef) + #Restoring biomass object + tempmodel.objective = target + #Knocking out gapfilled reactions one at a time + for item in self.cumulative_gapfilling: + rxnobj = tempmodel.reactions.get_by_id(item[0]) + if item[1] == ">": + original_bound = rxnobj.upper_bound + rxnobj.upper_bound = 0 + find_dependency(item,target_rxn,tempmodel) + rxnobj.upper_bound = original_bound else: - rxn.upper_bound = 0 - rxn.lower_bound = -100 - return self.model + original_bound = rxnobj.lower_bound + rxnobj.lower_bound = 0 + find_dependency(item,target_rxn,tempmodel) + rxnobj.lower_bound = original_bound @staticmethod def gapfill(model, media=None, target_reaction="bio1", default_gapfill_templates=[], default_gapfill_models=[], test_conditions=[], reaction_scores={}, blacklist=[]): gapfiller = MSGapfill(model,default_gapfill_templates,default_gapfill_models,test_conditions,reaction_scores,blacklist) gfresults = gapfiller.run_gapfilling(media,target_reaction) return gapfiller.integrate_gapfill_solution(gfresults) - - @staticmethod - def build_default(mdlutl,atp_safe = True,default_gapfill_templates=[], default_gapfill_models=[], - additional_tests=[],blacklist=[]): - """ - Setting gapfilling utility object for model - :return: - """ - tests = [] - if atp_safe: - if mdlutl.atputl: - mdlutl.atputl.evaluate_growth_media() - mdlutl.atputl.determine_growth_media() - mdlutl.atputl.apply_growth_media_gapfilling() - mdlutl.atputl.evaluate_growth_media() - mdlutl.atputl.expand_model_to_genome_scale() - tests = mdlutl.atputl.build_tests() - for test in additional_tests: - tests.append(test) - - if not mdlutl.reaction_scores: - mdlutl.compute_automated_reaction_scores() - - return MSGapfill(mdlutl,default_gapfill_templates, default_gapfill_models, - tests,mdlutl.reaction_scores, blacklist) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 4b677c8e..eaae1dbc 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -1,69 +1,91 @@ import logging import re import time +import json +import sys from cobra import Model, Reaction, Metabolite from modelseedpy.fbapkg.mspackagemanager import MSPackageManager logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) +#handler = logging.StreamHandler(sys.stdout) +#handler.setLevel(logging.DEBUG) +#formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +#handler.setFormatter(formatter) +#logger.addHandler(handler) -def metabolite_msid(metabolite): - if re.search('^(cpd\d+)', metabolite.id): - m = re.search('^(cpd\d+)', metabolite.id) - return m[1] - for anno in metabolite.annotation: - if isinstance(metabolite.annotation[anno], list): - for item in metabolite.annotation[anno]: - if re.search('^(cpd\d+)', item): - m = re.search('^(cpd\d+)', item) - return m[1] - elif re.search('^(cpd\d+)', metabolite.annotation[anno]): - m = re.search('^(cpd\d+)', metabolite.annotation[anno]) +class MSModelUtil: + mdlutls = {} + + @staticmethod + def metabolite_msid(metabolite): + if re.search('^(cpd\d+)', metabolite.id): + m = re.search('^(cpd\d+)', metabolite.id) return m[1] - return None + for anno in metabolite.annotation: + if isinstance(metabolite.annotation[anno], list): + for item in metabolite.annotation[anno]: + if re.search('^(cpd\d+)', item): + m = re.search('^(cpd\d+)', item) + return m[1] + elif re.search('^(cpd\d+)', metabolite.annotation[anno]): + m = re.search('^(cpd\d+)', metabolite.annotation[anno]) + return m[1] + return None -def reaction_msid(reaction): - if re.search('^(rxn\d+)', reaction.id): - m = re.search('^(rxn\d+)', reaction.id) - return m[1] - for anno in reaction.annotation: - if isinstance(reaction.annotation[anno], list): - for item in reaction.annotation[anno]: - if re.search('^(rxn\d+)', item): - m = re.search('^(rxn\d+)', item) - return m[1] - elif re.search('^(rxn\d+)', reaction.annotation[anno]): - m = re.search('^(rxn\d+)', reaction.annotation[anno]) + @staticmethod + def reaction_msid(reaction): + if re.search('^(rxn\d+)', reaction.id): + m = re.search('^(rxn\d+)', reaction.id) return m[1] - return None - -def stoichiometry_to_string(stoichiometry): - reactants = [] - products = [] - for met in stoichiometry: - coef = stoichiometry[met] - if not isinstance(met, str): - if metabolite_msid(met) == "cpd00067": - met = None - else: - met = met.id - if met != None: - if coef < 0: - reactants.append(met) - else: - products.append(met) - reactants.sort() - products.sort() - return ["+".join(reactants)+"="+"+".join(products),"+".join(products)+"="+"+".join(reactants)] - -def search_name(name): - name = name.lower() - name = re.sub(r'_[a-z]\d*$', '', name) - name = re.sub(r'\W+', '', name) - return name - - -class MSModelUtil: - + for anno in reaction.annotation: + if isinstance(reaction.annotation[anno], list): + for item in reaction.annotation[anno]: + if re.search('^(rxn\d+)', item): + m = re.search('^(rxn\d+)', item) + return m[1] + elif re.search('^(rxn\d+)', reaction.annotation[anno]): + m = re.search('^(rxn\d+)', reaction.annotation[anno]) + return m[1] + return None + + @staticmethod + def stoichiometry_to_string(stoichiometry): + reactants = [] + products = [] + for met in stoichiometry: + coef = stoichiometry[met] + if not isinstance(met, str): + if MSModelUtil.metabolite_msid(met) == "cpd00067": + met = None + else: + met = met.id + if met != None: + if coef < 0: + reactants.append(met) + else: + products.append(met) + reactants.sort() + products.sort() + return ["+".join(reactants)+"="+"+".join(products),"+".join(products)+"="+"+".join(reactants)] + + @staticmethod + def search_name(name): + name = name.lower() + name = re.sub(r'_[a-z]\d*$', '', name) + name = re.sub(r'\W+', '', name) + return name + + @staticmethod + def get(model,create_if_missing = True): + if model in MSModelUtil.mdlutls: + return MSModelUtil.mdlutls[model] + elif create_if_missing: + MSModelUtil.mdlutls[model] = MSModelUtil(model) + return MSModelUtil.mdlutls[model] + else: + return None + def __init__(self,model): self.model = model self.pkgmgr = MSPackageManager.get_pkg_mgr(model) @@ -83,20 +105,6 @@ def compute_automated_reaction_scores(self): """ self.reaction_scores = {} - def set_atputl(self,atputl): - """ - Setting ATP correction utility object for model - :return: - """ - self.atputl = atputl - - def set_gfutl(self,gfutl): - """ - Setting gapfilling utility object for model - :return: - """ - self.gfutl = gfutl - def printlp(self,lpfilename="debug.lp"): with open(lpfilename, 'w') as out: out.write(str(self.model.solver)) @@ -118,7 +126,7 @@ def add_name_to_metabolite_hash(self,name,met): if name not in self.metabolite_hash: self.metabolite_hash[name] = [] self.metabolite_hash[name].append(met) - sname = search_name(name) + sname = MSModelUtil.search_name(name) if sname not in self.search_metabolite_hash: self.search_metabolite_hash[sname] = [] self.search_metabolite_hash[sname].append(met) @@ -128,22 +136,22 @@ def find_met(self,name): self.build_metabolite_hash() if name in self.metabolite_hash: return self.metabolite_hash[name] - sname = search_name(name) + sname = MSModelUtil.search_name(name) if sname in self.search_metabolite_hash: return self.search_metabolite_hash[sname] - logger.info(name," not found in model!") + logger.info(name+" not found in model!") return [] def rxn_hash(self): output = {} for rxn in self.model.reactions: - strings = stoichiometry_to_string(rxn.metabolites) + strings = MSModelUtil.stoichiometry_to_string(rxn.metabolites) output[strings[0]] = [rxn,1] output[strings[1]] = [rxn,-1] return output def find_reaction(self,stoichiometry): - output = stoichiometry_to_string(stoichiometry) + output = MSModelUtil.stoichiometry_to_string(stoichiometry) atpstring = output[0] rxn_hash = self.rxn_hash() if atpstring in rxn_hash: @@ -153,7 +161,7 @@ def find_reaction(self,stoichiometry): def msid_hash(self): output = {} for cpd in self.model.metabolites: - msid = metabolite_msid(cpd) + msid = MSModelUtil.metabolite_msid(cpd) if msid != None: if msid not in output: output[msid] = [] @@ -167,6 +175,14 @@ def exchange_list(self): exchange_reactions.append(reaction) return exchange_reactions + def nonexchange_reaction_count(self): + count = 0 + for reaction in self.model.reactions: + if reaction.id[:3] != 'EX_' and reaction.id[:3] != 'SK_' and reaction.id[:3] != 'DM_' and reaction.id[:3] != 'bio': + #print(reaction.id) + count += 1 + return count + def exchange_hash(self): exchange_reactions = {} exlist = self.exchange_list() @@ -309,110 +325,69 @@ def convert_cobra_reaction_to_kbreaction(self,rxn,kbmodel,cpd_hash,direction = " kbmodel["modelreactions"].append(rxn_data) return rxn_data - def create_kb_gapfilling_data(self,kbmodel): - largest_index = 0 + ################################################################################# + #Functions related to gapfilling of models + ################################################################################# + def add_gapfilling(self,solution): + self.integrated_gapfillings.append(solution) + + def create_kb_gapfilling_data(self,kbmodel,atpmedia_ws = "94026"): + gapfilling_hash = {} if "gapfillings" not in kbmodel: kbmodel["gapfillings"] = [] for gapfilling in kbmodel["gapfillings"]: - current_index = int(gapfilling["id"].split(".").pop()) - if largest_index == 0 or largest_index < current_index: - largest_index = current_index + gapfilling_hash[gapfilling["id"]] = gapfilling rxn_hash = {} for rxn in kbmodel["modelreactions"]: rxn_hash[rxn["id"]] = rxn for gf in self.integrated_gapfillings: - largest_index += 1 - gfid = "gf."+str(largest_index) + print(gf["media"].id,gf["target"]) media_ref = "KBaseMedia/Empty" + gf["media"].id.replace("/",".") + gfid = gf["media"].id + if self.atputl: + for item in self.atputl.atp_medias: + if item[0] == gf["media"]: + gfid = "ATP-"+gfid + media_ref = atpmedia_ws+"/"+gf["media"].id+".atp" + break if hasattr(gf["media"], 'info'): media_ref = gf["media"].info.workspace_id+"/"+gf["media"].info.id + suffix = 0 + while gfid in gapfilling_hash: + suffix += 1 + gfid += "."+str(suffix) + gapfilling_hash[gfid] = 1 gapfilling_obj = { - "gapfill_id": self.model.id+"."+gfid, + "gapfill_id": gfid, "id": gfid, "integrated": 1, "integrated_solution": "0", - "objective":gf["objective"], + "target":gf["target"], + "minobjective":gf["minobjective"], + "binary_check":gf["binary_check"], "media_ref": media_ref } kbmodel["gapfillings"].append(gapfilling_obj) - for rxn in gf["solution"]["new"]: + for rxn in gf["new"]: if rxn in rxn_hash: rxnobj = rxn_hash[rxn] if "gapfill_data" not in rxnobj: rxnobj["gapfill_data"] = {} if gfid not in rxnobj["gapfill_data"]: rxnobj["gapfill_data"][gfid] = { - "0" : [gf["solution"]["new"][rxn],1,[]] + "0" : [gf["new"][rxn],1,[]] } - for rxn in gf["solution"]["reversed"]: + for rxn in gf["reversed"]: if rxn in rxn_hash: rxnobj = rxn_hash[rxn] if "gapfill_data" not in rxnobj: rxnobj["gapfill_data"] = {} if gfid not in rxnobj["gapfill_data"]: rxnobj["gapfill_data"][gfid] = { - "0" : [gf["solution"]["reversed"][rxn],1,[]] + "0" : [gf["reversed"][rxn],1,[]] } - def add_gapfilling_solution_to_kbase_model(self,newmodel,gapfilled_reactions,gfid=None,media_ref = None,reaction_genes = None): - """ - NOTE: to be moved to cobrakbase - """ - rxn_table = [] - gapfilling_obj = None - if gfid == None: - largest_index = 0 - for gapfilling in newmodel["gapfillings"]: - current_index = int(gapfilling["id"].split(".").pop()) - if largest_index == 0 or largest_index < current_index: - largest_index = current_index - largest_index += 1 - gfid = "gf."+str(largest_index) - else: - for gapfilling in newmodel["gapfillings"]: - if gapfilling["id"] == gfid: - gapfilling_obj = gapfilling - if gapfilling_obj == None: - gapfilling_obj = { - "gapfill_id": newmodel["id"]+"."+gfid, - "id": gfid, - "integrated": 1, - "integrated_solution": "0", - "media_ref": media_ref - } - newmodel["gapfillings"].append(gapfilling_obj) - cpd_hash = {} - for cpd in newmodel["modelcompounds"]: - cpd_hash[cpd["id"]] = cpd - for rxn in gapfilled_reactions["new"]: - reaction = self.model.reactions.get_by_id(rxn) - kbrxn = self.convert_cobra_reaction_to_kbreaction(reaction,newmodel,cpd_hash,gapfilled_reactions["new"][rxn],1,reaction_genes) - kbrxn["gapfill_data"][gfid] = dict() - kbrxn["gapfill_data"][gfid]["0"] = [gapfilled_reactions["new"][rxn],1,[]] - #rxn_table.append({ - # 'id':kbrxn["id"], - # 'name':kbrxn["name"], - # 'direction':format_direction(kbrxn["direction"]), - # 'gene':format_gpr(kbrxn), - # 'equation':format_equation(kbrxn,cpd_hash), - # 'newrxn':1 - #}) - for rxn in gapfilled_reactions["reversed"]: - for kbrxn in newmodel["modelreactions"]: - if kbrxn["id"] == rxn: - kbrxn["direction"] = "=" - #rxn_table.append({ - # 'id':kbrxn["id"], - # 'name':kbrxn["name"], - # 'direction':format_direction(kbrxn["direction"]), - # 'gene':format_gpr(kbrxn), - # 'equation':format_equation(kbrxn,cpd_hash), - # 'newrxn':0 - #}) - kbrxn["gapfill_data"][gfid] = dict() - kbrxn["gapfill_data"][gfid]["0"] = [gapfilled_reactions["reversed"][rxn],1,[]] - return rxn_table - def apply_test_condition(self,condition,model = None): """Applies constraints and objective of specified condition to model @@ -470,18 +445,19 @@ def test_single_condition(self,condition,apply_condition=True,model=None): new_objective = model.slim_optimize() value = new_objective if "change" in condition and condition["change"]: - if self.test_objective != None: + if self.test_objective: value = new_objective - self.test_objective + logger.debug(condition["media"].id+" testing for change:"+str(value)+"="+str(new_objective)+"-"+str(self.test_objective)) self.score = value if model.solver.status != 'optimal': - self.printlp("Infeasible.lp") - logger.critical("Infeasible problem - LP file printed to debug!") + self.printlp(condition["media"].id+"-Testing-Infeasible.lp") + logger.critical(ondition["media"].id+"testing leads to infeasible problem. LP file printed to debug!") return False if value >= condition["threshold"] and condition["is_max_threshold"]: - logger.debug("Failed high:"+str(self.test_objective)+";"+str(condition["threshold"])) + #logger.debug("Failed high:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) return False elif value <= condition["threshold"] and not condition["is_max_threshold"]: - logger.debug("Failed low:"+str(self.test_objective)+";"+str(condition["threshold"])) + #logger.debug("Failed low:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) return False self.test_objective = new_objective return True @@ -546,6 +522,7 @@ def linear_expansion_test(self,reaction_list,condition,currmodel): if item[1] == ">": item[0].upper_bound = original_bound[count] if not self.test_single_condition(condition,False,currmodel): + logger.debug(item[0].id+":"+item[1]) item[0].upper_bound = 0 if item not in filtered_list: item.append(original_bound[count]) @@ -554,6 +531,7 @@ def linear_expansion_test(self,reaction_list,condition,currmodel): else: item[0].lower_bound = original_bound[count] if not self.test_single_condition(condition,False,currmodel): + logger.debug(item[0].id+":"+item[1]) item[0].lower_bound = 0 if item not in filtered_list: item.append(original_bound[count]) @@ -581,27 +559,55 @@ def binary_expansion_test(self,reaction_list,condition,currmodel,depth=0): ------ """ newdepth = depth + 1 + #print("Call:",str(depth),len(reaction_list)) filtered_list = [] #First run the full test if self.test_single_condition(condition,False,currmodel): return [] + #Check if input list contains only one reaction: + if len(reaction_list) == 1: + #logger.debug(reaction_list[0][0].id+":"+reaction_list[0][1]) + if reaction_list[0][1] == ">": + reaction_list[0].append(reaction_list[0][0].upper_bound) + reaction_list[0][0].upper_bound = 0 + else: + reaction_list[0].append(reaction_list[0][0].lower_bound) + reaction_list[0][0].lower_bound = 0 + reaction_list[0].append(self.score) + filtered_list.append(reaction_list[0]) + return filtered_list #Break reaction list into two - sub_list = [] + original_bound = [] + sub_lists = [[],[]] midway_point = int(len(reaction_list)/2) - #Testing first half - for i in range(midway_point): - sub_list.append(reaction_list[i]) - new_filter = self.binary_expansion_test(reaction_list,condition,currmodel,newdepth) + for i, item in enumerate(reaction_list): + if item[1] == ">": + original_bound.append(item[0].upper_bound) + else: + original_bound.append(item[0].lower_bound) + if i < midway_point: + sub_lists[0].append(item) + else: + sub_lists[1].append(item) + if item[1] == ">": + item[0].upper_bound = 0 + else: + item[0].lower_bound = 0 + #Submitting first half of reactions for testing + new_filter = self.binary_expansion_test(sub_lists[0],condition,currmodel,newdepth) for item in new_filter: filtered_list.append(item) - #Testing second half - sub_list = [] - for i in range(midway_point+1,len(reaction_list)): - sub_list.append(reaction_list[i]) - new_filter = self.binary_expansion_test(reaction_list,condition,currmodel,newdepth) + #Submitting second half of reactions for testing - now only breaking reactions are removed from the first list + for i, item in enumerate(reaction_list): + if i >= midway_point: + if item[1] == ">": + item[0].upper_bound = original_bound[i] + else: + item[0].lower_bound = original_bound[i] + new_filter = self.binary_expansion_test(sub_lists[1],condition,currmodel,newdepth) for item in new_filter: filtered_list.append(item) - return new_filter + return filtered_list def reaction_expansion_test(self,reaction_list,condition_list,binary_search=False): """Adds reactions in reaction list one by one and appplies tests, filtering reactions that fail @@ -621,11 +627,12 @@ def reaction_expansion_test(self,reaction_list,condition_list,binary_search=Fals Raises ------ """ - print("Expansion started!") + logger.debug("Expansion started!") filtered_list = [] for condition in condition_list: currmodel = self.model tic = time.perf_counter() + new_filtered = [] with currmodel: self.apply_test_condition(condition) if binary_search: @@ -636,18 +643,17 @@ def reaction_expansion_test(self,reaction_list,condition_list,binary_search=Fals new_filtered = self.linear_expansion_test(reaction_list,condition,currmodel) for item in new_filtered: filtered_list.append(item) + #Restoring knockout of newly filtered reactions, which expire after exiting the "with" block above + for item in new_filtered: + if item[1] == ">": + item[0].upper_bound = 0 + else: + item[0].lower_bound = 0 toc = time.perf_counter() - print("Expansion time:",condition["media"].id,(toc-tic)) - print("Filtered count:",len(filtered_list)," out of ",len(reaction_list)) + logger.debug("Expansion time:"+condition["media"].id+":"+str((toc-tic))) + logger.debug("Filtered count:"+str(len(filtered_list))+" out of "+str(len(reaction_list))) return filtered_list - def add_gapfilling(self,solution,objective,media): - self.integrated_gapfillings.append({ - "solution":solution, - "objective":objective, - "media":media - }) - def add_atp_hydrolysis(self,compartment): #Searching for ATP hydrolysis compounds coefs = {"cpd00002":[-1,compartment],"cpd00001":[-1,compartment],"cpd00008":[1,compartment],"cpd00009":[1,compartment],"cpd00067":[1,compartment]} @@ -675,11 +681,6 @@ def add_atp_hydrolysis(self,compartment): self.model.add_reactions([cobra_reaction]) return {"reaction":cobra_reaction,"direction":">","new":True} - def gapfilled_reaction_count(self): - count = 0 - #TODO - return count - @staticmethod def parse_id(object): if re.search('(.+)_([a-z]+)(\d*)$', object.id) != None: diff --git a/modelseedpy/fbapkg/basefbapkg.py b/modelseedpy/fbapkg/basefbapkg.py index 24c9059b..ed3123e1 100755 --- a/modelseedpy/fbapkg/basefbapkg.py +++ b/modelseedpy/fbapkg/basefbapkg.py @@ -19,7 +19,7 @@ class BaseFBAPkg: """ def __init__(self, model, name, variable_types={}, constraint_types={}, reaction_types={}): self.model = model - self.modelutl = MSModelUtil(model) + self.modelutl = MSModelUtil.get(model) self.name = name self.pkgmgr = MSPackageManager.get_pkg_mgr(model) diff --git a/modelseedpy/fbapkg/flexiblebiomasspkg.py b/modelseedpy/fbapkg/flexiblebiomasspkg.py index 3da5c919..06c731cd 100644 --- a/modelseedpy/fbapkg/flexiblebiomasspkg.py +++ b/modelseedpy/fbapkg/flexiblebiomasspkg.py @@ -7,6 +7,7 @@ from optlang.symbolics import Zero, add # !!! Neither import is ever used from cobra import Model, Reaction, Metabolite # !!! Model and Metabolite are never used from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg +from modelseedpy.core.msmodelutl import MSModelUtil from modelseedpy.core.fbahelper import FBAHelper classes = { @@ -24,69 +25,127 @@ def __init__(self,model): def build_package(self,parameters): self.validate_parameters(parameters,["bio_rxn_id"],{ - "flex_coefficient":0.75, + "flex_coefficient":[-0.75,0.75], "use_rna_class":[-0.75,0.75], "use_dna_class":[-0.75,0.75], "use_protein_class":[-0.75,0.75], "use_energy_class":[-0.1,0.1], + "add_total_biomass_constraint":True }) if self.parameters["bio_rxn_id"] not in self.model.reactions: - raise ValueError(self.parameters["bio_rxn_id"]+" not found in model!") - self.parameters["bio_rxn"] = self.model.reactions.get_by_id(self.parameters["bio_rxn_id"]) - newrxns = [] # !!! newrxns is never used - class_coef = {"rna":{},"dna":{},"protein":{},"energy":{}} - refcpd = {"cpd00001":None,"cpd00009":None,"cpd00012":None,"cpd00067":None,"cpd00002":None} - for met in self.model.metabolites: - for msid in refcpd: - if FBAHelper.modelseed_id_from_cobra_metabolite(met) == msid: - refcpd[msid] = met + raise ValueError(self.parameters["bio_rxn_id"] + " not found in model!") + self.parameters["bio_rxn"] = self.model.reactions.get_by_id( + self.parameters["bio_rxn_id"] + ) + newrxns = [] + class_coef = {"rna": {}, "dna": {}, "protein": {}, "energy": {}} + refcpd = { + "cpd00001": None, + "cpd00009": None, + "cpd00012": None, + "cpd00067": None, + "cpd00002": None, + } + #Finding all reference compounds in the model + msid_hash = self.modelutl.msid_hash() + for msid in refcpd: + if msid in msid_hash: + refcpd[msid] = msid_hash[msid][0] + met_class = {} + #Determining class for each metabolite in biomass reaction for metabolite in self.parameters["bio_rxn"].metabolites: - msid = FBAHelper.modelseed_id_from_cobra_metabolite(metabolite) - if msid != "cpd11416": - met_class = "none" - if msid != None: - for curr_class, contents in classes.items(): - if msid in contents: - met_class = dict(curr_class) - contents[msid] = metabolite - if any([met_class == "none", self.class_complete(class_coef,met_class), not self.parameters["use_"+met_class+"_class"]]) and msid not in refcpd: - drain_reaction = FBAHelper.add_drain_from_metabolite_id(self.model, metabolite.id, 1000, 1000, "FLEX_") - if drain_reaction.id not in self.new_reactions: - self.new_reactions[drain_reaction.id] = drain_reaction - self.model.add_reactions([drain_reaction]) - self.build_constraint(metabolite,"flxcpd") - for met_class, content in class_coef.items(): - add = False - total_coef = 0 - object_stoichiometry = {} - for msid in content: - if all([met_class == "rna", msid == "cpd00002", "cpd00008" in class_coef["energy"]]): - object_stoichiometry[content[msid]] = self.parameters["bio_rxn"].metabolites[content[msid]] + self.parameters["bio_rxn"].metabolites[class_coef["energy"]["cpd00008"]] + met_class[metabolite] = None + msid = MSModelUtil.metabolite_msid(metabolite) + if msid != "cpd11416" and msid != None: + if msid in refcpd: + met_class[metabolite] = "refcpd" else: - object_stoichiometry[content[msid]] = self.parameters["bio_rxn"].metabolites[content[msid]] - total_coef += abs(object_stoichiometry[content[msid]]) - if any([met_class == "rna", met_class == "dna"]) and refcpd["cpd00012"] and refcpd["cpd00001"]: - add = True - object_stoichiometry[refcpd["cpd00012"]] = total_coef - object_stoichiometry[refcpd["cpd00001"]] = total_coef - if met_class == "protein" and refcpd["cpd00001"]: - add = True - object_stoichiometry[refcpd["cpd00001"]] = total_coef - if met_class == "energy" and all([refcpd["cpd00001"], refcpd["cpd00002"], refcpd["cpd00067"], refcpd["cpd00009"]]): - add = True - object_stoichiometry[refcpd["cpd00001"]] = -1*total_coef - object_stoichiometry[refcpd["cpd00002"]] = -1*total_coef - object_stoichiometry[refcpd["cpd00009"]] = total_coef - object_stoichiometry[refcpd["cpd00067"]] = total_coef - if add: - if met_class+"_flex" not in self.new_reactions: - self.new_reactions[met_class+"_flex"] = Reaction(id=met_class+"_flex", name= met_class+"_flex", - lower_bound=-1000, upper_bound=1000) - self.new_reactions[met_class+"_flex"].add_metabolites(object_stoichiometry) - self.new_reactions[met_class+"_flex"].annotation["sbo"] = 'SBO:0000627' - self.model.add_reactions([self.new_reactions[met_class+"_flex"]]) - self.build_constraint(self.new_reactions[met_class+"_flex"],"flxcls") - self.build_constraint(self.parameters["bio_rxn"],"flxbio") + for curr_class in classes: + if self.parameters["use_"+curr_class+"_class"] and msid in classes[curr_class]: + met_class[metabolite] = curr_class + class_coef[curr_class][msid] = metabolite + #Eliminating any classes that are incomplete + for curr_class in classes: + for msid in classes[curr_class]: + if msid not in class_coef[curr_class]: + self.parameters["use_"+curr_class+"_class"] = None + break + #Creating FLEX reactions and constraints for unclassified compounds + flexcpds = [] + for metabolite in self.parameters["bio_rxn"].metabolites: + if not met_class[metabolite]: + flexcpds.append(metabolite) + elif met_class[metabolite] != "refcpd" and not self.parameters["use_"+met_class[metabolite]+"_class"]: + flexcpds.append(metabolite) + self.modelutl.add_exchanges_for_metabolites(flexcpds,uptake=1000,excretion=1000,prefix='FLEX_', prefix_name='Biomass flex for ') + for metabolite in flexcpds: + self.build_constraint(metabolite, "flxcpd") + #Creating metabolite class constraints + for met_class in classes: + if self.parameters["use_"+met_class+"_class"]: + add = 0 + total_coef = 0 + object_stoichiometry = {} + for msid in class_coef[met_class]: + if ( + met_class == "rna" + and msid == "cpd00002" + and "cpd00008" in class_coef["energy"] + ): + object_stoichiometry[class_coef[met_class][msid]] = ( + self.parameters["bio_rxn"].metabolites[ + class_coef[met_class][msid] + ] + + self.parameters["bio_rxn"].metabolites[ + class_coef["energy"]["cpd00008"] + ] + ) + else: + object_stoichiometry[class_coef[met_class][msid]] = self.parameters[ + "bio_rxn" + ].metabolites[class_coef[met_class][msid]] + total_coef += abs(object_stoichiometry[class_coef[met_class][msid]]) + if ( + (met_class == "rna" or met_class == "dna") + and refcpd["cpd00012"] != None + and refcpd["cpd00001"] != None + ): + add = 1 + object_stoichiometry[refcpd["cpd00012"]] = total_coef + object_stoichiometry[refcpd["cpd00001"]] = total_coef + if met_class == "protein" and refcpd["cpd00001"] != None: + add = 1 + object_stoichiometry[refcpd["cpd00001"]] = total_coef + if ( + met_class == "energy" + and refcpd["cpd00001"] != None + and refcpd["cpd00002"] != None + and refcpd["cpd00067"] != None + and refcpd["cpd00009"] != None + ): + add = 1 + object_stoichiometry[refcpd["cpd00001"]] = -1 * total_coef + object_stoichiometry[refcpd["cpd00002"]] = -1 * total_coef + object_stoichiometry[refcpd["cpd00009"]] = total_coef + object_stoichiometry[refcpd["cpd00067"]] = total_coef + if add == 1: + if met_class + "_flex" not in self.new_reactions: + self.new_reactions[met_class + "_flex"] = Reaction( + id=met_class + "_flex", + name=met_class + "_flex", + lower_bound=-1000, + upper_bound=1000, + ) + self.new_reactions[met_class + "_flex"].add_metabolites( + object_stoichiometry + ) + self.new_reactions[met_class + "_flex"].annotation[ + "sbo" + ] = "SBO:0000627" + self.model.add_reactions([self.new_reactions[met_class + "_flex"]]) + self.build_constraint(self.new_reactions[met_class + "_flex"], "flxcls") + if parameters["add_total_biomass_constraint"]: + self.build_constraint(self.parameters["bio_rxn"],"flxbio") def build_variable(self,object,type): # !!! can the function be removed? pass @@ -115,80 +174,72 @@ def build_constraint(self,cobra_obj,obj_type): coef[rxn.forward_variable] = massdiff coef[rxn.reverse_variable] = -massdiff return BaseFBAPkg.build_constraint(self,obj_type,0,0,coef,cobra_obj) - elif obj_type == "flxcpd": - #0.75 * abs(bio_coef) * vbio - vdrn,for >= 0 - #0.75 * abs(bio_coef) * vbio - vdrn,rev >= 0 - coef = self.parameters["flex_coefficient"]*abs(self.parameters["bio_rxn"].metabolites[cobra_obj]) - if coef > 0.75: - coef = 0.75 - BaseFBAPkg.build_constraint(self,"f"+obj_type,0,None,{ - self.parameters["bio_rxn"].forward_variable:coef, - self.model.reactions.get_by_id("FLEX_"+cobra_obj.id).forward_variable:-1 - },cobra_obj) - return BaseFBAPkg.build_constraint(self,"r"+obj_type,0,None,{ - self.parameters["bio_rxn"].forward_variable:coef, - self.model.reactions.get_by_id("FLEX_"+cobra_obj.id).reverse_variable:-1 - },cobra_obj) - elif obj_type == "flxcls" and cobra_obj.id[0:-5] != None: - #0.75 * vbio - vrxn,for >= 0 - #0.75 * vbio - vrxn,rev >= 0 - #First deal with the situation where the flux is locked into a particular value relative to biomass + elif obj_type == "flxcpd" or obj_type == "flxcls": + biovar = self.parameters["bio_rxn"].forward_variable + object = cobra_obj const = None - first_entry = self.parameters["use_"+cobra_obj.id[0:-5]+"_class"][0] - second_entry = self.parameters["use_"+cobra_obj.id[0:-5]+"_class"][1] + if obj_type == "flxcpd": + #0.75 * abs(bio_coef) * vbio - vdrn,for >= 0 + #0.75 * abs(bio_coef) * vbio - vdrn,rev >= 0 + first_entry = self.parameters["flex_coefficient"][0]*abs(self.parameters["bio_rxn"].metabolites[cobra_obj]) + second_entry = self.parameters["flex_coefficient"][1]*abs(self.parameters["bio_rxn"].metabolites[cobra_obj]) + object = self.model.reactions.get_by_id("FLEX_"+cobra_obj.id) + elif cobra_obj.id[0:-5] == None or not self.parameters["use_"+cobra_obj.id[0:-5]+"_class"]: + return None + else: + #0.75 * vbio - vrxn,for >= 0 + #0.75 * vbio - vrxn,rev >= 0 + first_entry = self.parameters["use_"+cobra_obj.id[0:-5]+"_class"][0] + second_entry = self.parameters["use_"+cobra_obj.id[0:-5]+"_class"][1] if first_entry == second_entry: #If the value is positive, lock in the forward variable and set the reverse to zero if first_entry > 0: const = BaseFBAPkg.build_constraint(self,"f"+obj_type,0,0,{ - self.parameters["bio_rxn"].forward_variable:second_entry, - cobra_obj.forward_variable:-1 + biovar:second_entry, + object.forward_variable:-1 },cobra_obj) - cobra_obj.lower_bound = 0 + object.lower_bound = 0 #If the value is negative, lock in the reverse variable and set the forward to zero elif first_entry < 0: const = BaseFBAPkg.build_constraint(self,"r"+obj_type,0,0,{ - self.parameters["bio_rxn"].forward_variable:-first_entry, - cobra_obj.reverse_variable:-1 + biovar:-first_entry, + object.reverse_variable:-1 },cobra_obj) - cobra_obj.upper_bound = 0 + object.upper_bound = 0 #If the value is zero, lock both variables to zero if first_entry == 0: - cobra_obj.lower_bound = 0 - cobra_obj.upper_bound = 0 + object.lower_bound = 0 + object.upper_bound = 0 elif second_entry >= 0: - if self.parameters["use_"+cobra_obj.id[0:-5]+"_class"][0] >= 0: + if first_entry >= 0: const = BaseFBAPkg.build_constraint(self,"f"+obj_type,0,None,{ - self.parameters["bio_rxn"].forward_variable:second_entry, - cobra_obj.forward_variable:-1 - },cobra_obj) - BaseFBAPkg.build_constraint(self,"r"+obj_type,0,None,{ - self.parameters["bio_rxn"].forward_variable:-first_entry, - cobra_obj.forward_variable:1 + biovar:second_entry, + object.forward_variable:-1 },cobra_obj) - cobra_obj.lower_bound = 0 + object.lower_bound = 0 + if first_entry > 0: + BaseFBAPkg.build_constraint(self,"r"+obj_type,0,None,{ + biovar:-first_entry, + object.forward_variable:1 + },cobra_obj) else: const = BaseFBAPkg.build_constraint(self,"f"+obj_type,0,None,{ - self.parameters["bio_rxn"].forward_variable:second_entry, - cobra_obj.forward_variable:-1 + biovar:second_entry, + object.forward_variable:-1 },cobra_obj) BaseFBAPkg.build_constraint(self,"r"+obj_type,0,None,{ - self.parameters["bio_rxn"].forward_variable:-first_entry, - cobra_obj.reverse_variable:-1 - },cobra_obj) + biovar:-first_entry, + object.reverse_variable:-1 + },cobra_obj) else: - const = BaseFBAPkg.build_constraint(self,"f"+obj_type,0,None,{ - self.parameters["bio_rxn"].forward_variable:second_entry, - cobra_obj.reverse_variable:1 - },cobra_obj) + if second_entry < 0: + const = BaseFBAPkg.build_constraint(self,"f"+obj_type,0,None,{ + biovar:second_entry, + object.reverse_variable:1 + },cobra_obj) BaseFBAPkg.build_constraint(self,"r"+obj_type,0,None,{ - self.parameters["bio_rxn"].forward_variable:-first_entry, - cobra_obj.reverse_variable:-1 + biovar:-first_entry, + object.reverse_variable:-1 },cobra_obj) - cobra_obj.upper_bound = 0 + object.upper_bound = 0 return const - - def class_complete(self,class_coef,met_class): - for msid in classes[met_class]: - if msid not in class_coef[met_class]: - return True - return False From f5235b8e4837b6074381a5812bcdcbdc581f88b1 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 10 Oct 2022 00:14:14 -0500 Subject: [PATCH 029/298] Fixing issues in gapfilling --- modelseedpy/core/msgapfill.py | 31 +++++++++++---- modelseedpy/core/msmodelutl.py | 73 ++++++++++++++++++++++++++++++---- 2 files changed, 88 insertions(+), 16 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 969d619a..53ff5d89 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -94,6 +94,7 @@ def run_gapfilling(self, media=None, target=None, minimum_obj=0.01, binary_check return None if binary_check: self.last_solution = pkgmgr.getpkg("GapfillingPkg").binary_check_gapfilling_solution() + self.last_solution["media"] = media self.last_solution["target"] = target self.last_solution["minobjective"] = minimum_obj @@ -109,7 +110,6 @@ def integrate_gapfill_solution(self, solution,cumulative_solution=[]): cumulation_solution : list Optional array to cumulatively track all reactions added to the model when integrating multiple solutions """ - self.mdlutl.add_gapfilling(solution) for rxn_id in solution["reversed"]: rxn = self.model.reactions.get_by_id(rxn_id) if solution["reversed"][rxn_id] == ">" and rxn.upper_bound <= 0: @@ -139,22 +139,34 @@ def integrate_gapfill_solution(self, solution,cumulative_solution=[]): cumulative_solution.append([rxn_id,"<"]) rxn.upper_bound = 0 rxn.lower_bound = -100 + unneeded = self.mdlutl.test_solution(solution,keep_changes=True)#Strips out unneeded reactions - which undoes some of what is done above + for item in unneeded: + for oitem in cumulative_solution: + if item[0] == oitem[0] and item[1] == oitem[1]: + cumulative_solution.remove(oitem) + break + self.mdlutl.add_gapfilling(solution) self.cumulative_gapfilling.extend(cumulative_solution) def link_gapfilling_to_biomass(self,target="bio1"): - def find_dependency(item,target_rxn,tempmodel): + def find_dependency(item,target_rxn,tempmodel,original_objective,min_flex_obj): objective = tempmodel.slim_optimize() + logger.debug("Obj:"+str(objective)) + with open("FlexBiomass2.lp", 'w') as out: + out.write(str(tempmodel.solver)) if objective > 0: target_rxn.lower_bound = 0.1 tempmodel.objective = min_flex_obj solution = tempmodel.optimize() + with open("FlexBiomass3.lp", 'w') as out: + out.write(str(tempmodel.solver)) biocpds = [] - for reaction in self.model.reactions: + for reaction in tempmodel.reactions: if reaction.id[0:5] == "FLEX_" and reaction.forward_variable.primal > Zero: biocpds.append(reaction.id[5:]) item.append(biocpds) - print(item[0],",".join(biocpds)) - tempmodel.objective = target_rxn.id + logger.debug(item[0]+":"+",".join(biocpds)) + tempmodel.objective = original_objective target_rxn.lower_bound = 0 #Copying model before manipulating it @@ -174,6 +186,8 @@ def find_dependency(item,target_rxn,tempmodel): "add_total_biomass_constraint":False }) #Creating min flex objective + tempmodel.objective = target_rxn + original_objective = tempmodel.objective min_flex_obj = tempmodel.problem.Objective(Zero,direction="min") obj_coef = dict() for reaction in tempmodel.reactions: @@ -183,19 +197,20 @@ def find_dependency(item,target_rxn,tempmodel): tempmodel.objective = min_flex_obj min_flex_obj.set_linear_coefficients(obj_coef) #Restoring biomass object - tempmodel.objective = target + tempmodel.objective = original_objective #Knocking out gapfilled reactions one at a time for item in self.cumulative_gapfilling: + logger.debug("KO:"+item[0]+item[1]) rxnobj = tempmodel.reactions.get_by_id(item[0]) if item[1] == ">": original_bound = rxnobj.upper_bound rxnobj.upper_bound = 0 - find_dependency(item,target_rxn,tempmodel) + find_dependency(item,target_rxn,tempmodel,original_objective,min_flex_obj) rxnobj.upper_bound = original_bound else: original_bound = rxnobj.lower_bound rxnobj.lower_bound = 0 - find_dependency(item,target_rxn,tempmodel) + find_dependency(item,target_rxn,tempmodel,original_objective,min_flex_obj) rxnobj.lower_bound = original_bound @staticmethod diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index eaae1dbc..ccca9cee 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -179,8 +179,8 @@ def nonexchange_reaction_count(self): count = 0 for reaction in self.model.reactions: if reaction.id[:3] != 'EX_' and reaction.id[:3] != 'SK_' and reaction.id[:3] != 'DM_' and reaction.id[:3] != 'bio': - #print(reaction.id) - count += 1 + if reaction.upper_bound > 0 or reaction.lower_bound > 0: + count += 1 return count def exchange_hash(self): @@ -328,6 +328,66 @@ def convert_cobra_reaction_to_kbreaction(self,rxn,kbmodel,cpd_hash,direction = " ################################################################################# #Functions related to gapfilling of models ################################################################################# + """Tests if every reaction in a given gapfilling solution is actually needed for growth + Optionally can remove unneeded reactions from the model AND the solution object. + Note, this code assumes the gapfilling solution is already integrated. + + Parameters + ---------- + {"new":{string reaction_id: string direction},"reversed":{string reaction_id: string direction}} - solution + Data for gapfilling solution to be tested + bool - keep_changes + Set this bool to True to remove the unneeded reactions from the solution and model + Returns + ------- + list> + List of unneeded reactions + + Raises + ------ + """ + def test_solution(self,solution,keep_changes=False): + unneeded = [] + tempmodel = self.model + if not keep_changes: + tempmodel = cobra.io.json.from_json(cobra.io.json.to_json(self.model)) + tempmodel.objective = solution["target"] + pkgmgr = MSPackageManager.get_pkg_mgr(tempmodel) + pkgmgr.getpkg("KBaseMediaPkg").build_package(solution["media"]) + objective = tempmodel.slim_optimize() + logger.debug("Starting objective:"+str(objective)) + with open("SolutionTest.lp", 'w') as out: + out.write(str(tempmodel.solver)) + types = ["new","reversed"] + for key in types: + for rxn_id in solution[key]: + rxnobj = tempmodel.reactions.get_by_id(rxn_id) + if solution[key][rxn_id] == ">": + original_bound = rxnobj.upper_bound + rxnobj.upper_bound = 0 + objective = tempmodel.slim_optimize() + if objective < solution["minobjective"]: + logger.debug(rxn_id+solution[key][rxn_id]+" needed:"+str(objective)+" with min obj:"+str(solution["minobjective"])) + rxnobj.upper_bound = original_bound + else: + unneeded.append([rxn_id,solution[key][rxn_id]]) + logger.debug(rxn_id+solution[key][rxn_id]+" not needed:"+str(objective)) + if keep_changes: + del solution[key][rxn_id] + else: + original_bound = rxnobj.lower_bound + rxnobj.lower_bound = 0 + objective = tempmodel.slim_optimize() + if objective < solution["minobjective"]: + logger.debug(rxn_id+solution[key][rxn_id]+" needed:"+str(objective)+" with min obj:"+str(solution["minobjective"])) + rxnobj.lower_bound = original_bound + else: + unneeded.append([rxn_id,solution[key][rxn_id]]) + logger.debug(rxn_id+solution[key][rxn_id]+" not needed:"+str(objective)) + if keep_changes: + del solution[key][rxn_id] + return unneeded + def add_gapfilling(self,solution): self.integrated_gapfillings.append(solution) @@ -341,7 +401,6 @@ def create_kb_gapfilling_data(self,kbmodel,atpmedia_ws = "94026"): for rxn in kbmodel["modelreactions"]: rxn_hash[rxn["id"]] = rxn for gf in self.integrated_gapfillings: - print(gf["media"].id,gf["target"]) media_ref = "KBaseMedia/Empty" gf["media"].id.replace("/",".") gfid = gf["media"].id @@ -522,7 +581,7 @@ def linear_expansion_test(self,reaction_list,condition,currmodel): if item[1] == ">": item[0].upper_bound = original_bound[count] if not self.test_single_condition(condition,False,currmodel): - logger.debug(item[0].id+":"+item[1]) + #logger.debug(item[0].id+":"+item[1]) item[0].upper_bound = 0 if item not in filtered_list: item.append(original_bound[count]) @@ -531,7 +590,7 @@ def linear_expansion_test(self,reaction_list,condition,currmodel): else: item[0].lower_bound = original_bound[count] if not self.test_single_condition(condition,False,currmodel): - logger.debug(item[0].id+":"+item[1]) + #logger.debug(item[0].id+":"+item[1]) item[0].lower_bound = 0 if item not in filtered_list: item.append(original_bound[count]) @@ -559,14 +618,12 @@ def binary_expansion_test(self,reaction_list,condition,currmodel,depth=0): ------ """ newdepth = depth + 1 - #print("Call:",str(depth),len(reaction_list)) filtered_list = [] #First run the full test if self.test_single_condition(condition,False,currmodel): return [] #Check if input list contains only one reaction: if len(reaction_list) == 1: - #logger.debug(reaction_list[0][0].id+":"+reaction_list[0][1]) if reaction_list[0][1] == ">": reaction_list[0].append(reaction_list[0][0].upper_bound) reaction_list[0][0].upper_bound = 0 @@ -609,7 +666,7 @@ def binary_expansion_test(self,reaction_list,condition,currmodel,depth=0): filtered_list.append(item) return filtered_list - def reaction_expansion_test(self,reaction_list,condition_list,binary_search=False): + def reaction_expansion_test(self,reaction_list,condition_list,binary_search=True): """Adds reactions in reaction list one by one and appplies tests, filtering reactions that fail Parameters From e0cd9aaaec065dccbaa4a768d73b210ee4c280c2 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 10 Oct 2022 00:22:03 -0500 Subject: [PATCH 030/298] Fixing bug in solution testing --- modelseedpy/core/msmodelutl.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index ccca9cee..af928dff 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -370,10 +370,8 @@ def test_solution(self,solution,keep_changes=False): logger.debug(rxn_id+solution[key][rxn_id]+" needed:"+str(objective)+" with min obj:"+str(solution["minobjective"])) rxnobj.upper_bound = original_bound else: - unneeded.append([rxn_id,solution[key][rxn_id]]) + unneeded.append([rxn_id,solution[key][rxn_id],key]) logger.debug(rxn_id+solution[key][rxn_id]+" not needed:"+str(objective)) - if keep_changes: - del solution[key][rxn_id] else: original_bound = rxnobj.lower_bound rxnobj.lower_bound = 0 @@ -382,10 +380,11 @@ def test_solution(self,solution,keep_changes=False): logger.debug(rxn_id+solution[key][rxn_id]+" needed:"+str(objective)+" with min obj:"+str(solution["minobjective"])) rxnobj.lower_bound = original_bound else: - unneeded.append([rxn_id,solution[key][rxn_id]]) + unneeded.append([rxn_id,solution[key][rxn_id],key]) logger.debug(rxn_id+solution[key][rxn_id]+" not needed:"+str(objective)) - if keep_changes: - del solution[key][rxn_id] + if keep_changes: + for items in unneeded: + del solution[items[2]][items[0]] return unneeded def add_gapfilling(self,solution): From 188f98ab95012b0bd61f58a3ef38ae8c7ad644d1 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 10 Oct 2022 22:27:18 -0500 Subject: [PATCH 031/298] Fixing bug in reaction counts and pulling out unneeded LP file printing --- modelseedpy/core/msmodelutl.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index af928dff..f1e0bd09 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -179,7 +179,7 @@ def nonexchange_reaction_count(self): count = 0 for reaction in self.model.reactions: if reaction.id[:3] != 'EX_' and reaction.id[:3] != 'SK_' and reaction.id[:3] != 'DM_' and reaction.id[:3] != 'bio': - if reaction.upper_bound > 0 or reaction.lower_bound > 0: + if reaction.upper_bound > 0 or reaction.lower_bound < 0: count += 1 return count @@ -356,8 +356,6 @@ def test_solution(self,solution,keep_changes=False): pkgmgr.getpkg("KBaseMediaPkg").build_package(solution["media"]) objective = tempmodel.slim_optimize() logger.debug("Starting objective:"+str(objective)) - with open("SolutionTest.lp", 'w') as out: - out.write(str(tempmodel.solver)) types = ["new","reversed"] for key in types: for rxn_id in solution[key]: From 14e458cb2388704476c69a39dd8b674c84ede080 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Thu, 20 Oct 2022 18:34:25 -0500 Subject: [PATCH 032/298] biochem fixes part 1 --- examples/Others/Biochem.ipynb | 123 ++++++++++++++++++++++- modelseedpy/biochem/modelseed_biochem.py | 70 ++++++++++++- modelseedpy/core/msbuilder.py | 7 +- modelseedpy/core/msgenome.py | 14 +++ modelseedpy/core/msmodel.py | 13 +-- modelseedpy/fbapkg/gapfillingpkg.py | 8 +- 6 files changed, 217 insertions(+), 18 deletions(-) diff --git a/examples/Others/Biochem.ipynb b/examples/Others/Biochem.ipynb index 2433f4dd..8396bcec 100644 --- a/examples/Others/Biochem.ipynb +++ b/examples/Others/Biochem.ipynb @@ -27,6 +27,127 @@ "modelseed = modelseedpy.biochem.from_local('../../../ModelSEEDDatabase')" ] }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Reaction identifierrxn22000_a
Namefarnesylcysteine lyase
Memory address0x7f303f0a3730
Stoichiometry\n", + "

cpd00001_a + cpd00007_a + cpd20939_a --> cpd00025_a + cpd00084_a + cpd02188_a

\n", + "

H2O + O2 + Farnesylcysteine --> H2O2 + L-Cysteine + 2-trans,6-trans-Farnesal

\n", + "
GPR
Lower bound0
Upper bound1000
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "modelseed.reactions.rxn22000.to_template_reaction({0: 'a'})" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import json\n", + "from modelseedpy.biochem.modelseed_compound import ModelSEEDCompound2\n", + "database_path = '/home/fliu/workspace/python3/ModelSEEDDatabase'\n", + "_BIOCHEM_FOLDER = 'Biochemistry'\n", + "def load_metabolites(database_path):\n", + " metabolites = {}\n", + " contents = os.listdir(f'{database_path}/{_BIOCHEM_FOLDER}')\n", + " for f in contents:\n", + " if f.startswith('compound_') and f.endswith('.json'):\n", + " with open(f'{database_path}/{_BIOCHEM_FOLDER}/{f}', 'r') as fh:\n", + " _compounds_data = json.load(fh)\n", + " for o in _compounds_data:\n", + " if 'id' in o and o['id']:\n", + " cpd = ModelSEEDCompound2(o['id'], o.get('formula'), \n", + " o.get('name'), o.get('charge'), '',\n", + " o.get('abbreviation'), None,\n", + " o.get('mass'), o.get('deltag'), o.get('deltagerr'))\n", + " metabolites[cpd.id] = cpd\n", + " else:\n", + " print('error', o)\n", + " #print(_compounds_data[0].keys())\n", + " return metabolites\n", + "metabolites = load_metabolites(database_path)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [], + "source": [ + "from modelseedpy.biochem.modelseed_reaction import ModelSEEDReaction2\n", + "from modelseedpy.core.msmodel import get_reaction_constraints_from_direction\n", + "def load_reactions(database_path, metabolites):\n", + " reactions = {}\n", + " contents = os.listdir(f'{database_path}/{_BIOCHEM_FOLDER}')\n", + " metabolites_indexed = {}\n", + " for f in contents:\n", + " if f.startswith('reaction_') and f.endswith('.json'):\n", + " with open(f'{database_path}/{_BIOCHEM_FOLDER}/{f}', 'r') as fh:\n", + " _reactions_data = json.load(fh)\n", + " for o in _reactions_data:\n", + " if 'id' in o and o['id']:\n", + " lower_bound, upper_bound = get_reaction_constraints_from_direction(o.get('reversibility'))\n", + " stoichiometry = o.get('stoichiometry')\n", + " reaction_metabolites = {}\n", + " for s in stoichiometry:\n", + " cmp_token = s['compartment']\n", + " value = s['coefficient']\n", + " cpd = metabolites[s['compound']]\n", + " cpd_index_id = f\"{cpd.id}_{cmp_token}\"\n", + " if cpd_index_id not in metabolites_indexed:\n", + " cpd_token = cpd.copy()\n", + " cpd_token.id = f\"{cpd.id}_{cmp_token}\"\n", + " cpd_token.base_id = cpd.id\n", + " cpd_token.compartment = cmp_token\n", + " metabolites_indexed[cpd_index_id] = cpd_token\n", + " reaction_metabolites[metabolites_indexed[cpd_index_id]] = value\n", + " rxn = ModelSEEDReaction2(o['id'], o.get('name'), '', lower_bound, upper_bound)\n", + " rxn.add_metabolites(reaction_metabolites)\n", + " reactions[rxn.id] = rxn\n", + " else:\n", + " print('error', o)\n", + " #print(_reactions_data[0])\n", + " return reactions\n", + "reactions = load_reactions(database_path, metabolites)" + ] + }, { "cell_type": "code", "execution_count": 3, @@ -627,7 +748,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.13" + "version": "3.8.10" } }, "nbformat": 4, diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index 43cc865e..b498d199 100644 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -1,12 +1,17 @@ # -*- coding: utf-8 -*- import logging +import os +import json import pandas as pd from cobra.core.dictlist import DictList +from modelseedpy.core.msmodel import get_reaction_constraints_from_direction from modelseedpy.biochem.modelseed_compound import ModelSEEDCompound, ModelSEEDCompound2 from modelseedpy.biochem.modelseed_reaction import ModelSEEDReaction, ModelSEEDReaction2 logger = logging.getLogger(__name__) +_BIOCHEM_FOLDER = 'Biochemistry' + ALIAS_CPD_IDENTIFIERS_ORG = { "BiGG": "bigg.metabolite", "KEGG": "kegg.compound", @@ -174,6 +179,60 @@ def load_metabolites_from_df( return compounds +def _load_metabolites(database_path: str) -> dict: + metabolites = {} + contents = os.listdir(f'{database_path}/{_BIOCHEM_FOLDER}') + for f in contents: + if f.startswith('compound_') and f.endswith('.json'): + with open(f'{database_path}/{_BIOCHEM_FOLDER}/{f}', 'r') as fh: + _compounds_data = json.load(fh) + for o in _compounds_data: + if 'id' in o and o['id']: + cpd = ModelSEEDCompound2(o['id'], o.get('formula'), + o.get('name'), o.get('charge'), '', + o.get('abbreviation'), None, + o.get('mass'), o.get('deltag'), o.get('deltagerr')) + metabolites[cpd.id] = cpd + else: + print('error', o) + #print(_compounds_data[0].keys()) + return metabolites + + +def _load_reactions(database_path: str, metabolites: dict) -> (dict, dict): + reactions = {} + contents = os.listdir(f'{database_path}/{_BIOCHEM_FOLDER}') + metabolites_indexed = {} + for f in contents: + if f.startswith('reaction_') and f.endswith('.json'): + with open(f'{database_path}/{_BIOCHEM_FOLDER}/{f}', 'r') as fh: + _reactions_data = json.load(fh) + for o in _reactions_data: + if 'id' in o and o['id']: + lower_bound, upper_bound = get_reaction_constraints_from_direction(o.get('reversibility')) + stoichiometry = o.get('stoichiometry') + reaction_metabolites = {} + for s in stoichiometry: + cmp_token = s['compartment'] + value = s['coefficient'] + cpd = metabolites[s['compound']] + cpd_index_id = f"{cpd.id}_{cmp_token}" + if cpd_index_id not in metabolites_indexed: + cpd_token = cpd.copy() + cpd_token.id = f"{cpd.id}_{cmp_token}" + cpd_token.base_id = cpd.id + cpd_token.compartment = cmp_token + metabolites_indexed[cpd_index_id] = cpd_token + reaction_metabolites[metabolites_indexed[cpd_index_id]] = value + rxn = ModelSEEDReaction2(o['id'], o.get('name'), '', lower_bound, upper_bound) + rxn.add_metabolites(reaction_metabolites) + reactions[rxn.id] = rxn + else: + print('error', o) + #print(_reactions_data[0]) + return reactions, metabolites_indexed + + def load_reactions_from_df( df: pd.DataFrame, database_metabolites: dict, @@ -271,7 +330,7 @@ class ModelSEEDDatabase: ModelSEED database instance. """ - def __init__(self, compounds, reactions, compound_tokens): + def __init__(self, compounds: list, reactions: list, compound_tokens: list): self.compounds = DictList() self.compound_tokens = DictList() self.reactions = DictList() @@ -549,7 +608,7 @@ def load_database( return database -def from_local(path): +def from_local_old(path): database_repo = path reactions_url = database_repo + "/Biochemistry/reactions.tsv" compounds_url = database_repo + "/Biochemistry/compounds.tsv" @@ -617,6 +676,13 @@ def from_local(path): return modelseed +def from_local(database_path: str): + metabolites = _load_metabolites(database_path) + reactions, metabolite_tokens = _load_reactions(database_path, metabolites) + database = ModelSEEDDatabase(metabolites.values(), reactions.values(), metabolite_tokens.values()) + + return database + def get_names_from_df(df): names = {} for t in df.itertuples(): diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 8a65ff70..ad752f17 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -8,7 +8,8 @@ get_gpr_string, get_reaction_constraints_from_direction, ) -from cobra.core import Gene, Metabolite, Model, Reaction +from cobra.core import Gene, Metabolite, Reaction +from modelseedpy.core.msmodel import MSModel from modelseedpy.core import FBAHelper from modelseedpy.fbapkg.mspackagemanager import MSPackageManager @@ -604,7 +605,7 @@ def build( if self.template is None: self.auto_select_template() - cobra_model = Model(model_id) + cobra_model = MSModel(model_id, genome=self.genome, template=self.template) cobra_model.add_reactions(self.build_metabolic_reactions(index=index)) cobra_model.add_reactions( self.build_non_metabolite_reactions( @@ -646,7 +647,7 @@ def build_full_template_model(template, model_id=None, index="0"): :param index: index for the metabolites :return: """ - model = Model(model_id if model_id else template.id) + model = MSModel(model_id if model_id else template.id, template=template) all_reactions = [] for rxn in template.reactions: reaction = MSBuilder._build_reaction( diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index f052130d..7404e486 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -48,6 +48,7 @@ def parse_fasta_str(faa_str, split=DEFAULT_SPLIT, h_func=None): class MSFeature: + def __init__(self, feature_id, sequence, description=None): """ @@ -76,6 +77,7 @@ def add_ontology_term(self, ontology_term, value): class MSGenome: + def __init__(self): self.features = DictList() @@ -104,6 +106,18 @@ def from_fasta( genome.features += read_fasta(filename, split, h_func) return genome + def to_fasta(self, filename, l=80, fn_header=None): + with open(filename, 'w') as fh: + for feature in self.features: + h = f'>{feature.id}\n' + if fn_header: + h = fn_header(feature) + fh.write(h) + lines = [feature.seq[i:i + l] + '\n' for i in range(0, len(feature.seq), l)] + for line in lines: + fh.write(line) + return filename + @staticmethod def from_dna_fasta(filename): pass diff --git a/modelseedpy/core/msmodel.py b/modelseedpy/core/msmodel.py index baaa0315..9cebbfac 100644 --- a/modelseedpy/core/msmodel.py +++ b/modelseedpy/core/msmodel.py @@ -116,31 +116,32 @@ def get_set_set(expr_str): # !!! this currently returns dictionaries, not sets? class MSModel(Model): + def __init__(self, id_or_model=None, genome=None, template=None): """ Class representation for a ModelSEED model. """ super().__init__(self, id_or_model) if genome: - self.genome_object = genome + self._genome = genome if template: - self.template_object = template + self._template = template @property def template(self): - return self.template_object + return self._template @template.setter def template(self, template): - self.template_object = template + self._template = template @property def genome(self): - return self.genome_object + return self._genome @genome.setter def genome(self, genome): - self.genome_object = genome + self._genome = genome def _set_genome_to_model(self, genome): # TODO: implement genome assignment checks if features matches genes diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index 1ccc98f3..27960276 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -437,9 +437,7 @@ def build_package(self, parameters): if indexhash[index] > 10: if index == "none": for template in self.parameters["default_gapfill_templates"]: - new_penalties = self.extend_model_with_template_for_gapfilling( - template, index - ) + new_penalties = self.extend_model_with_template_for_gapfilling(template, index) self.gapfilling_penalties.update(new_penalties) for gfmdl in self.parameters["default_gapfill_models"]: new_penalties = self.extend_model_with_model_for_gapfilling( @@ -468,9 +466,7 @@ def build_package(self, parameters): self.gapfilling_penalties.update(new_penalties) if self.parameters["gapfill_all_indecies_with_default_models"]: for gfmdl in self.parameters["default_gapfill_models"]: - new_penalties = self.extend_model_with_model_for_gapfilling( - gfmdl, index - ) + new_penalties = self.extend_model_with_model_for_gapfilling(gfmdl, index) self.gapfilling_penalties.update(new_penalties) # Rescaling penalties by reaction scores and saving genes for reaction in self.gapfilling_penalties: From 80ed774580560ca1265accb51d7b6b628430a9fb Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Thu, 20 Oct 2022 19:22:48 -0500 Subject: [PATCH 033/298] biochem dg --- examples/Others/Biochem.ipynb | 44729 +++++++++++++++++++- modelseedpy/biochem/modelseed_biochem.py | 8 +- modelseedpy/biochem/modelseed_reaction.py | 12 +- 3 files changed, 44701 insertions(+), 48 deletions(-) diff --git a/examples/Others/Biochem.ipynb b/examples/Others/Biochem.ipynb index 8396bcec..43a6fdb2 100644 --- a/examples/Others/Biochem.ipynb +++ b/examples/Others/Biochem.ipynb @@ -29,53 +29,44688 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, + "execution_count": 4, + "metadata": { + "tags": [] + }, "outputs": [ { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Reaction identifierrxn22000_a
Namefarnesylcysteine lyase
Memory address0x7f303f0a3730
Stoichiometry\n", - "

cpd00001_a + cpd00007_a + cpd20939_a --> cpd00025_a + cpd00084_a + cpd02188_a

\n", - "

H2O + O2 + Farnesylcysteine --> H2O2 + L-Cysteine + 2-trans,6-trans-Farnesal

\n", - "
GPR
Lower bound0
Upper bound1000
\n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "-16.82 1.56 \n", + "-114.63 2.23 \n", + "10000000.0 10000000.0 \n", + "0.53 0.54 \n", + "-2.6 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.68 6.88 \n", + "-105.97 0.91 \n", + "6.11 4.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.74 0.51 \n", + "-11.84 0.42 \n", + "-48.9 5.79 \n", + "-13.17 0.99 \n", + "-0.74 0.51 \n", + "-0.74 0.51 \n", + "-53.3 0.85 \n", + "-6.09 7.63 \n", + "75.94 7.57 \n", + "-76.86 7.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.81 0.35 \n", + "-4.17 0.75 \n", + "-14.92 2.92 \n", + "-94.47 8.12 \n", + "-3.78 0.35 \n", + "-15.65 0.87 \n", + "-15.65 0.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "38.28 3.21 \n", + "-10.24 0.5 \n", + "-52.04 4.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-49.25 0.53 \n", + "-13.17 0.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.07 0.58 \n", + "-1.52 0.4 \n", + "-3.94 0.48 \n", + "-4.73 0.54 \n", + "2.12 0.83 \n", + "-5.18 0.42 \n", + "-8.17 1.11 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "11.12 0.81 \n", + "10000000.0 10000000.0 \n", + "-13.52 1.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-29.32 10.65 \n", + "4.44 0.24 \n", + "-4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.42 6.68 \n", + "-105.97 0.91 \n", + "-5.79 0.35 \n", + "2.12 0.83 \n", + "-2.27 0.32 \n", + "2.05 0.32 \n", + "-63.56 1.16 \n", + "10000000.0 10000000.0 \n", + "2.16 5.87 \n", + "-0.18 0.36 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "2.16 5.87 \n", + "-0.18 0.36 \n", + "-0.18 0.36 \n", + "-4.39 0.43 \n", + "8.72 7.58 \n", + "10000000.0 10000000.0 \n", + "-20.64 6.86 \n", + "-20.64 7.33 \n", + "-20.64 8.94 \n", + "-20.64 8.38 \n", + "-3.61 0.51 \n", + "10000000.0 10000000.0 \n", + "-4.36 7.75 \n", + "-4.36 8.86 \n", + "-4.36 8.3 \n", + "-4.36 7.24 \n", + "10000000.0 10000000.0 \n", + "-4.36 7.6 \n", + "-4.36 9.18 \n", + "7.77 1.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-99.41 1.12 \n", + "43.0 4.13 \n", + "-4.25 0.74 \n", + "-37.02 7.55 \n", + "-37.02 7.55 \n", + "-6.42 0.31 \n", + "-3.29 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 10.69 \n", + "-1.7 13.32 \n", + "-1.7 11.54 \n", + "0.95 0.84 \n", + "-3.83 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.64 1.59 \n", + "-118.21 0.69 \n", + "10000000.0 10000000.0 \n", + "-3.79 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.9 0.51 \n", + "-0.9 0.51 \n", + "-18.59 13.94 \n", + "10000000.0 10000000.0 \n", + "-1.7 13.02 \n", + "-5.97 0.42 \n", + "-6.05 0.57 \n", + "-0.9 0.51 \n", + "-0.9 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-98.2 8.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-67.75 2.3 \n", + "3.73 0.29 \n", + "4.68 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-65.15 0.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-20.64 7.68 \n", + "10000000.0 10000000.0 \n", + "-105.96 0.91 \n", + "-17.31 1.63 \n", + "-0.85 0.22 \n", + "-0.74 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-39.9 20.73 \n", + "-4.73 0.33 \n", + "-294.47 21.92 \n", + "1.63 1.66 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.8 6.31 \n", + "-108.43 1.54 \n", + "-88.27 0.79 \n", + "10000000.0 10000000.0 \n", + "-27.76 3.44 \n", + "10000000.0 10000000.0 \n", + "-93.57 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.55 6.66 \n", + "10000000.0 10000000.0 \n", + "-4.77 0.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.01 11.51 \n", + "-2.3 11.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.01 11.52 \n", + "-2.3 11.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.01 11.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.89 0.24 \n", + "0.69 0.57 \n", + "0.69 0.57 \n", + "-18.13 0.71 \n", + "10000000.0 10000000.0 \n", + "-54.34 7.44 \n", + "-34.54 1.84 \n", + "-74.84 4.75 \n", + "-87.69 5.97 \n", + "10000000.0 10000000.0 \n", + "-16.73 2.48 \n", + "-78.34 3.1 \n", + "0.87 4.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-151.12 0.78 \n", + "10000000.0 10000000.0 \n", + "-34.54 1.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.95 0.3 \n", + "-107.82 1.13 \n", + "-5.77 6.15 \n", + "-2.46 0.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-25.66 5.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-151.81 4.4 \n", + "10000000.0 10000000.0 \n", + "9.59 6.0 \n", + "10000000.0 10000000.0 \n", + "-48.2 6.71 \n", + "10000000.0 10000000.0 \n", + "-2.08 0.98 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.82 0.93 \n", + "-2.6 0.3 \n", + "-2.08 0.98 \n", + "-5.13 0.49 \n", + "-4.71 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.26 5.9 \n", + "-17.26 5.9 \n", + "10000000.0 10000000.0 \n", + "-90.63 6.54 \n", + "-83.95 6.64 \n", + "-15.4 4.09 \n", + "None None \n", + "21.6 3.42 \n", + "-37.0 1.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.01 0.4 \n", + "3.51 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.33 1.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.19 1.48 \n", + "4.42 0.24 \n", + "-10.62 0.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-121.63 13.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.4 0.64 \n", + "3.45 0.41 \n", + "-61.86 0.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-46.06 1.64 \n", + "10000000.0 10000000.0 \n", + "-3.83 0.39 \n", + "4.92 1.91 \n", + "-3.83 0.39 \n", + "-3.83 0.39 \n", + "-1.7 10.62 \n", + "-1.7 10.62 \n", + "-3.83 0.39 \n", + "-3.83 0.39 \n", + "-3.83 0.39 \n", + "-3.83 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-23.21 1.55 \n", + "-23.21 1.55 \n", + "-0.02 None \n", + "-110.33 0.77 \n", + "-116.63 1.11 \n", + "-116.63 1.11 \n", + "-116.63 1.11 \n", + "-116.63 1.11 \n", + "-116.63 1.11 \n", + "-116.63 1.11 \n", + "-116.63 1.11 \n", + "-116.63 1.11 \n", + "6.48 0.85 \n", + "6.48 0.85 \n", + "6.48 0.85 \n", + "-116.63 1.11 \n", + "-116.63 1.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.03 0.43 \n", + "12.54 7.94 \n", + "10.46 9.97 \n", + "-2.59 8.87 \n", + "7.34 8.06 \n", + "7.22 8.06 \n", + "-109.38 0.78 \n", + "-109.38 0.78 \n", + "-109.38 0.78 \n", + "4.89 0.25 \n", + "-9.06 0.27 \n", + "-3.62 0.46 \n", + "-24.62 13.76 \n", + "10000000.0 10000000.0 \n", + "-4.36 7.15 \n", + "-4.36 8.79 \n", + "-4.36 8.22 \n", + "-0.34 0.34 \n", + "352.22 6.59 \n", + "10000000.0 10000000.0 \n", + "-0.86 0.86 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.61 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.0 0.82 \n", + "0.6 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.06 8.98 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "61.55 0.38 \n", + "-5.89 0.56 \n", + "-11.47 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-61.47 0.2 \n", + "-21.16 0.09 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "-4.36 5.28 \n", + "-89.39 6.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-429.94 0.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.79 4.51 \n", + "-7.67 0.77 \n", + "-7.67 0.77 \n", + "0.37 0.94 \n", + "-5.63 0.43 \n", + "-0.41 0.49 \n", + "7.63 0.58 \n", + "-5.66 0.43 \n", + "-6.58 0.56 \n", + "-14.5 0.44 \n", + "-12.96 4.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-34.59 6.01 \n", + "10000000.0 10000000.0 \n", + "11.87 1.4 \n", + "11.87 1.4 \n", + "-4.1 0.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-1.7 6.79 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "10000000.0 10000000.0 \n", + "-6.29 1.0 \n", + "10000000.0 10000000.0 \n", + "3.58 0.52 \n", + "3.57 0.5 \n", + "10000000.0 10000000.0 \n", + "-70.26 1.92 \n", + "-49.25 0.56 \n", + "-89.43 2.06 \n", + "-192.35 2.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-49.28 0.57 \n", + "-13.04 1.56 \n", + "-27.33 4.38 \n", + "10000000.0 10000000.0 \n", + "-1.55 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.61 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.87 0.43 \n", + "-14.87 0.43 \n", + "371.33 5.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.2 0.73 \n", + "-15.2 0.73 \n", + "-14.87 0.43 \n", + "-14.87 0.43 \n", + "10000000.0 10000000.0 \n", + "-14.87 0.43 \n", + "-14.87 0.43 \n", + "-14.27 0.34 \n", + "-14.27 0.34 \n", + "-4.89 0.25 \n", + "-4.89 0.25 \n", + "-5.22 6.14 \n", + "-4.89 0.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.87 0.3 \n", + "-5.43 7.73 \n", + "-2.87 0.3 \n", + "-54.69 1.16 \n", + "-54.69 1.16 \n", + "-11.65 0.71 \n", + "4.68 7.75 \n", + "-118.19 0.76 \n", + "10000000.0 10000000.0 \n", + "-3.88 0.56 \n", + "10000000.0 10000000.0 \n", + "1.01 0.41 \n", + "-18.59 13.93 \n", + "-2.87 0.3 \n", + "-95.39 10.03 \n", + "-9.54 1.46 \n", + "0.98 0.39 \n", + "-0.9 0.62 \n", + "126.69 13.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.92 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.37 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-118.59 1.24 \n", + "-8.35 5.5 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-23.06 3.95 \n", + "-23.06 3.95 \n", + "-3.33 0.64 \n", + "-3.76 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.8 0.82 \n", + "-4.38 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 11.37 \n", + "2.81 None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.97 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-125.73 0.57 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-2.66 0.8 \n", + "124.14 1.02 \n", + "124.14 1.02 \n", + "-59.72 0.33 \n", + "-88.54 0.82 \n", + "-177.08 1.65 \n", + "-176.16 1.58 \n", + "-177.08 1.65 \n", + "10000000.0 10000000.0 \n", + "-2.63 0.42 \n", + "-2.63 0.42 \n", + "-5.26 0.84 \n", + "-0.49 0.41 \n", + "10000000.0 10000000.0 \n", + "-13.11 6.39 \n", + "-10.46 6.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "57.71 0.34 \n", + "-94.12 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 13.49 \n", + "-3.11 13.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-106.05 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.73 0.73 \n", + "-0.94 7.39 \n", + "7.54 1.78 \n", + "-16.97 8.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.42 0.51 \n", + "-10.46 5.41 \n", + "-13.42 1.51 \n", + "-37.17 1.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 6.06 \n", + "-3.11 6.06 \n", + "-13.86 0.8 \n", + "-13.86 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-334.33 6.05 \n", + "-21.5 2.54 \n", + "-103.28 2.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "41.46 2.0 \n", + "-2.45 0.44 \n", + "-2.45 0.44 \n", + "-2.89 0.56 \n", + "-1.61 0.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.28 3.9 \n", + "-189.98 12.91 \n", + "10000000.0 10000000.0 \n", + "-5.96 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "-32.46 1.65 \n", + "-6.24 0.59 \n", + "10000000.0 10000000.0 \n", + "-18.13 0.71 \n", + "-18.13 0.71 \n", + "-111.38 8.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.28 0.38 \n", + "-106.02 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "18.97 13.97 \n", + "10000000.0 10000000.0 \n", + "-14.03 6.87 \n", + "-14.03 10.71 \n", + "10000000.0 10000000.0 \n", + "82.17 18.33 \n", + "10000000.0 10000000.0 \n", + "-3.91 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "14.45 4.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.49 0.8 \n", + "-1.84 0.85 \n", + "-18.13 0.71 \n", + "0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.22 0.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "-90.66 1.46 \n", + "5.37 9.07 \n", + "10000000.0 10000000.0 \n", + "-105.84 0.91 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-300.12 3.68 \n", + "1.56 0.16 \n", + "10000000.0 10000000.0 \n", + "-18.13 0.71 \n", + "-282.1 0.94 \n", + "7.22 0.5 \n", + "10000000.0 10000000.0 \n", + "5.37 9.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.08 5.56 \n", + "-12.04 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.13 0.75 \n", + "10000000.0 10000000.0 \n", + "-14.4 6.86 \n", + "-1.7 5.9 \n", + "10000000.0 10000000.0 \n", + "0.75 0.49 \n", + "-3.17 1.18 \n", + "-0.78 0.68 \n", + "-6.24 0.59 \n", + "-118.59 1.24 \n", + "-90.63 6.54 \n", + "-106.12 1.04 \n", + "-106.7 6.51 \n", + "-22.91 1.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.89 0.24 \n", + "-25.66 3.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.64 0.33 \n", + "-13.27 0.43 \n", + "10000000.0 10000000.0 \n", + "-59.6 4.25 \n", + "-0.33 14.73 \n", + "10000000.0 10000000.0 \n", + "4.92 1.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.96 0.32 \n", + "-13.21 1.07 \n", + "-0.94 0.5 \n", + "3.13 6.84 \n", + "-1.81 5.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.91 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.5 0.94 \n", + "0.35 0.61 \n", + "-15.12 0.75 \n", + "0.46 7.04 \n", + "0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "-18.13 0.71 \n", + "-189.98 12.77 \n", + "10000000.0 10000000.0 \n", + "-110.53 6.99 \n", + "2.08 5.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 7.0 \n", + "-105.96 0.91 \n", + "10000000.0 10000000.0 \n", + "-10.55 1.0 \n", + "10000000.0 10000000.0 \n", + "5.66 0.74 \n", + "-87.15 0.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.27 0.43 \n", + "-62.32 5.99 \n", + "-6.19 0.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.05 0.44 \n", + "-118.19 0.76 \n", + "4.34 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.56 0.16 \n", + "-1.75 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-189.98 12.81 \n", + "10000000.0 10000000.0 \n", + "-45.31 3.93 \n", + "-97.2 0.8 \n", + "-189.98 12.73 \n", + "10000000.0 10000000.0 \n", + "-7.32 1.0 \n", + "10000000.0 10000000.0 \n", + "-3.19 0.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.12 0.75 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "0.28 0.38 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "16.31 9.81 \n", + "10000000.0 10000000.0 \n", + "-15.12 0.75 \n", + "-5.96 0.32 \n", + "-40.49 2.14 \n", + "10000000.0 10000000.0 \n", + "-105.97 0.91 \n", + "10000000.0 10000000.0 \n", + "19.52 0.97 \n", + "10000000.0 10000000.0 \n", + "-15.34 1.27 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.72 \n", + "10000000.0 10000000.0 \n", + "-14.4 6.8 \n", + "10000000.0 10000000.0 \n", + "-46.0 7.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.06 \n", + "10000000.0 10000000.0 \n", + "-5.96 0.32 \n", + "-3.77 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-189.98 12.77 \n", + "10000000.0 10000000.0 \n", + "-2.55 0.35 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "-14.03 10.68 \n", + "-6.17 0.87 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.78 0.5 \n", + "-82.35 3.41 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.64 0.45 \n", + "-8.8 1.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-37.17 1.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-222.82 1.53 \n", + "-189.98 12.8 \n", + "16.31 9.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.76 0.89 \n", + "3.17 0.82 \n", + "-15.12 0.75 \n", + "-5.49 0.44 \n", + "6.18 1.16 \n", + "10000000.0 10000000.0 \n", + "1.56 0.16 \n", + "-13.2 1.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.91 0.53 \n", + "10000000.0 10000000.0 \n", + "-62.08 6.61 \n", + "10000000.0 10000000.0 \n", + "-16.31 1.05 \n", + "-4.36 6.01 \n", + "-104.63 1.45 \n", + "-4.59 0.57 \n", + "-13.27 0.43 \n", + "0.28 0.37 \n", + "-3.7 0.77 \n", + "-18.52 0.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.79 1.4 \n", + "10000000.0 10000000.0 \n", + "-104.62 1.45 \n", + "None 11.44 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "1.56 0.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-95.84 1.17 \n", + "10000000.0 10000000.0 \n", + "5.37 9.14 \n", + "-189.98 12.78 \n", + "-35.79 1.96 \n", + "1.24 0.54 \n", + "2.61 1.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.12 1.92 \n", + "-69.88 9.77 \n", + "10000000.0 10000000.0 \n", + "-6.77 0.68 \n", + "None None \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.78 2.81 \n", + "10000000.0 10000000.0 \n", + "8.39 1.92 \n", + "-4.44 0.24 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "-189.98 12.79 \n", + "-18.98 2.28 \n", + "-8.85 0.79 \n", + "-5.96 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-112.92 1.45 \n", + "10000000.0 10000000.0 \n", + "10.17 0.27 \n", + "-0.28 0.37 \n", + "-3.68 2.32 \n", + "-4.89 0.25 \n", + "-4.52 1.9 \n", + "-117.23 1.16 \n", + "-3.92 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "100.09 0.25 \n", + "-92.42 1.81 \n", + "-104.63 1.45 \n", + "1.24 0.54 \n", + "-18.13 0.71 \n", + "-18.13 0.71 \n", + "-0.41 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.08 5.66 \n", + "10000000.0 10000000.0 \n", + "4.95 4.36 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "5.81 0.35 \n", + "-1.51 0.4 \n", + "0.36 0.56 \n", + "-5.96 0.32 \n", + "10000000.0 10000000.0 \n", + "-700.89 3.56 \n", + "-33.6 8.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-104.62 1.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.2 1.06 \n", + "10000000.0 10000000.0 \n", + "5.09 0.69 \n", + "-0.25 0.79 \n", + "10000000.0 10000000.0 \n", + "-14.03 7.01 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "-3.68 2.32 \n", + "70.98 0.52 \n", + "10000000.0 10000000.0 \n", + "-5.36 0.58 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "-222.82 1.53 \n", + "-0.91 1.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.28 0.38 \n", + "-189.98 12.73 \n", + "-4.87 0.57 \n", + "0.28 0.38 \n", + "4.52 1.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.33 \n", + "10000000.0 10000000.0 \n", + "0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "44.43 1.91 \n", + "82.17 18.29 \n", + "10000000.0 10000000.0 \n", + "-10.55 1.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.37 9.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "15.26 0.13 \n", + "15.26 0.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.82 1.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "280.35 2.24 \n", + "-14.37 0.55 \n", + "14.27 0.33 \n", + "14.27 0.33 \n", + "14.27 0.33 \n", + "14.27 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-129.68 6.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.23 1.04 \n", + "-5.08 1.01 \n", + "-2.27 0.58 \n", + "-2.54 0.78 \n", + "-3.88 0.8 \n", + "-3.75 0.92 \n", + "-4.16 0.92 \n", + "-3.73 0.95 \n", + "-3.42 1.09 \n", + "0.54 0.76 \n", + "10000000.0 10000000.0 \n", + "-71.92 4.39 \n", + "10000000.0 10000000.0 \n", + "12.79 0.85 \n", + "-45.58 0.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.3 2.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.6 2.32 \n", + "-25.11 1.73 \n", + "-19.42 7.95 \n", + "-58.0 1.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "53.16 5.6 \n", + "44.61 4.89 \n", + "60.8 6.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-22.88 1.52 \n", + "-22.88 1.52 \n", + "-35.4 1.67 \n", + "-9.51 1.39 \n", + "-39.69 1.66 \n", + "-19.98 1.62 \n", + "-40.3 1.63 \n", + "-14.41 1.35 \n", + "-2.64 1.79 \n", + "-28.53 1.54 \n", + "-31.87 1.48 \n", + "-5.98 1.16 \n", + "-11.55 1.46 \n", + "None 0.08 \n", + "-28.27 1.63 \n", + "-52.81 1.37 \n", + "-47.24 1.63 \n", + "-54.2 1.37 \n", + "-48.62 1.63 \n", + "None 2.32 \n", + "None 7.09 \n", + "None 1.13 \n", + "None 1.24 \n", + "None 1.56 \n", + "None 0.73 \n", + "None 0.75 \n", + "-6.16 0.07 \n", + "-0.85 0.3 \n", + "None 0.47 \n", + "-5.54 1.2 \n", + "None 3.55 \n", + "None 3.56 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "None 1.15 \n", + "None 3.96 \n", + "None 0.81 \n", + "None 0.48 \n", + "None 1.02 \n", + "None 0.44 \n", + "None 0.4 \n", + "None 0.48 \n", + "None 0.44 \n", + "None 0.4 \n", + "None 1.02 \n", + "None 1.09 \n", + "None 1.26 \n", + "None 1.99 \n", + "None 1.75 \n", + "None 1.51 \n", + "None 0.49 \n", + "None 0.89 \n", + "None 1.26 \n", + "10000000.0 10000000.0 \n", + "None 4.27 \n", + "-6.16 0.07 \n", + "None 0.35 \n", + "-6.16 0.07 \n", + "-6.81 9.58 \n", + "-6.16 0.07 \n", + "-9.34 0.31 \n", + "None 2.25 \n", + "None 1.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.84 \n", + "None 1.04 \n", + "-9.05 0.5 \n", + "-10.79 0.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.56 \n", + "None 2.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.22 0.59 \n", + "-0.22 0.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "None 1.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.12 1.14 \n", + "-4.37 0.72 \n", + "None 0.49 \n", + "-0.67 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.61 0.78 \n", + "10000000.0 10000000.0 \n", + "-6.55 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.62 \n", + "-0.63 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.18 0.45 \n", + "1.18 0.45 \n", + "None 0.92 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.08 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.84 1.67 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.57 1.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.32 \n", + "10000000.0 10000000.0 \n", + "-20.03 2.76 \n", + "None 1.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.74 0.4 \n", + "-6.74 0.4 \n", + "-8.88 2.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 0.71 \n", + "-6.96 0.72 \n", + "-6.36 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.23 \n", + "None 2.21 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.33 0.91 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.9 0.35 \n", + "-7.18 0.58 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "None 1.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.1 0.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.28 0.32 \n", + "0.38 0.45 \n", + "0.38 0.45 \n", + "10000000.0 10000000.0 \n", + "-4.66 6.33 \n", + "0.38 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.24 1.7 \n", + "None 0.71 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.38 0.45 \n", + "1.25 0.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.89 1.14 \n", + "None 1.71 \n", + "-23.85 1.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.9 1.25 \n", + "-1.53 0.44 \n", + "10000000.0 10000000.0 \n", + "-1.46 0.43 \n", + "10000000.0 10000000.0 \n", + "-120.33 0.78 \n", + "-1.86 0.56 \n", + "-18.96 0.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.65 0.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.91 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.19 0.45 \n", + "-3.4 0.64 \n", + "4.14 0.29 \n", + "10000000.0 10000000.0 \n", + "-18.97 0.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-126.88 4.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.08 0.46 \n", + "10000000.0 10000000.0 \n", + "-3.18 1.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.64 1.38 \n", + "10000000.0 10000000.0 \n", + "-48.78 1.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-35.85 2.2 \n", + "10000000.0 10000000.0 \n", + "None 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "None 0.71 \n", + "None 0.72 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 1.34 \n", + "10000000.0 10000000.0 \n", + "None 2.18 \n", + "10000000.0 10000000.0 \n", + "None 2.21 \n", + "None 4.88 \n", + "10000000.0 10000000.0 \n", + "None 0.79 \n", + "10000000.0 10000000.0 \n", + "None 0.25 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "-6.16 0.07 \n", + "None 2.21 \n", + "None 0.41 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-0.05 1.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.05 1.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.15 8.06 \n", + "-2.78 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.16 0.68 \n", + "10000000.0 10000000.0 \n", + "None 2.14 \n", + "10000000.0 10000000.0 \n", + "7.53 0.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.9 1.96 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-7.98 8.77 \n", + "-12.04 1.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 3.89 \n", + "None 0.58 \n", + "10000000.0 10000000.0 \n", + "-0.3 1.26 \n", + "None 1.02 \n", + "-0.96 0.33 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "None 0.48 \n", + "10000000.0 10000000.0 \n", + "None 2.19 \n", + "10000000.0 10000000.0 \n", + "-5.98 1.16 \n", + "None 2.18 \n", + "10000000.0 10000000.0 \n", + "None 2.5 \n", + "None 0.54 \n", + "None 3.86 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.41 \n", + "None 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.86 \n", + "None 0.42 \n", + "None 1.6 \n", + "None 0.64 \n", + "None 0.71 \n", + "None 0.74 \n", + "10000000.0 10000000.0 \n", + "None 4.23 \n", + "None 0.98 \n", + "6.24 0.52 \n", + "None 1.33 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.48 1.05 \n", + "None 0.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.35 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "None 0.44 \n", + "10000000.0 10000000.0 \n", + "None 0.44 \n", + "-14.41 1.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.27 \n", + "None 1.16 \n", + "None 0.71 \n", + "None 2.19 \n", + "None 0.69 \n", + "10000000.0 10000000.0 \n", + "-2.37 1.35 \n", + "None 2.55 \n", + "1.11 1.16 \n", + "10000000.0 10000000.0 \n", + "None 2.69 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.41 \n", + "10000000.0 10000000.0 \n", + "None 2.18 \n", + "10000000.0 10000000.0 \n", + "-5.98 1.16 \n", + "0.62 0.87 \n", + "None 2.73 \n", + "None 0.99 \n", + "None 0.44 \n", + "-3.09 5.09 \n", + "-3.09 5.1 \n", + "-3.09 5.1 \n", + "-3.09 5.21 \n", + "-14.03 5.33 \n", + "-14.03 4.93 \n", + "-14.03 5.33 \n", + "-14.03 4.93 \n", + "-3.35 0.3 \n", + "-3.35 0.3 \n", + "-14.34 4.97 \n", + "-14.34 4.97 \n", + "5.61 0.36 \n", + "5.6 0.37 \n", + "-5.13 0.52 \n", + "-5.12 0.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.81 0.3 \n", + "4.27 0.49 \n", + "0.13 0.25 \n", + "0.13 0.25 \n", + "-8.73 0.93 \n", + "-8.73 0.93 \n", + "-1.7 9.5 \n", + "-1.7 9.5 \n", + "-1.7 10.08 \n", + "-1.7 10.08 \n", + "-6.02 0.56 \n", + "10000000.0 10000000.0 \n", + "-13.16 1.07 \n", + "-9.06 0.27 \n", + "-9.06 0.26 \n", + "-2.83 1.42 \n", + "-26.84 1.48 \n", + "-26.84 1.48 \n", + "-26.84 1.48 \n", + "-0.28 0.38 \n", + "-0.28 0.37 \n", + "0.28 0.38 \n", + "0.28 0.37 \n", + "-19.08 2.46 \n", + "-19.08 2.46 \n", + "-19.08 2.46 \n", + "-28.53 1.54 \n", + "-22.96 1.78 \n", + "-2.64 1.79 \n", + "-2.64 1.79 \n", + "-9.51 1.39 \n", + "-15.08 1.66 \n", + "-35.4 1.67 \n", + "-35.4 1.67 \n", + "-35.4 1.67 \n", + "8.29 1.18 \n", + "2.71 1.42 \n", + "-17.61 1.49 \n", + "-17.61 1.49 \n", + "-17.61 1.49 \n", + "8.29 1.18 \n", + "2.71 1.42 \n", + "-17.61 1.49 \n", + "-17.61 1.49 \n", + "-17.61 1.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.23 1.07 \n", + "-47.65 1.66 \n", + "-47.65 1.66 \n", + "-47.65 1.66 \n", + "-47.65 1.66 \n", + "-47.65 1.66 \n", + "3.33 0.45 \n", + "-28.32 1.58 \n", + "-28.32 1.58 \n", + "-28.32 1.58 \n", + "-0.78 0.68 \n", + "-13.21 1.07 \n", + "-0.79 0.68 \n", + "-0.78 0.68 \n", + "14.27 0.34 \n", + "14.27 0.33 \n", + "-13.21 1.07 \n", + "-6.15 0.49 \n", + "0.91 1.09 \n", + "-3.88 0.56 \n", + "-1.7 13.02 \n", + "-6.02 0.56 \n", + "-0.78 0.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-124.03 3.5 \n", + "-124.03 3.5 \n", + "-5.18 0.6 \n", + "-7.22 0.51 \n", + "-3.88 0.56 \n", + "-3.88 0.56 \n", + "-3.88 0.56 \n", + "-1.7 10.62 \n", + "-1.7 10.62 \n", + "-3.88 0.56 \n", + "-3.88 0.56 \n", + "-3.88 0.56 \n", + "-3.88 0.56 \n", + "-84.41 1.7 \n", + "-69.41 3.09 \n", + "-78.84 1.92 \n", + "-78.84 1.92 \n", + "-58.52 1.93 \n", + "-58.52 1.93 \n", + "-58.52 1.93 \n", + "-84.41 1.7 \n", + "-69.41 3.09 \n", + "-78.84 1.92 \n", + "-78.84 1.92 \n", + "-58.52 1.93 \n", + "-58.52 1.93 \n", + "-58.52 1.93 \n", + "-7.75 1.12 \n", + "16.58 2.36 \n", + "5.43 2.84 \n", + "-35.21 2.99 \n", + "-35.21 2.99 \n", + "-35.21 2.99 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-1.7 6.79 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.69 0.98 \n", + "-13.21 2.26 \n", + "-0.28 0.38 \n", + "-0.28 0.37 \n", + "-45.76 3.05 \n", + "-45.76 3.05 \n", + "-45.76 3.05 \n", + "-45.76 3.05 \n", + "-45.76 3.05 \n", + "-45.76 3.05 \n", + "None None \n", + "-0.89 0.37 \n", + "-2.86 0.34 \n", + "-2.86 0.33 \n", + "4.05 7.87 \n", + "4.05 7.88 \n", + "-5.22 6.11 \n", + "-5.22 6.13 \n", + "-13.21 1.07 \n", + "-13.21 1.07 \n", + "-0.88 0.38 \n", + "-0.89 0.37 \n", + "-0.28 0.38 \n", + "-0.28 0.37 \n", + "-3.15 0.9 \n", + "-3.15 0.9 \n", + "17.69 1.3 \n", + "17.68 1.29 \n", + "4.89 0.25 \n", + "-4.44 0.24 \n", + "-4.44 0.24 \n", + "-0.28 0.38 \n", + "-38.87 1.13 \n", + "-3.86 0.56 \n", + "-316.94 2.26 \n", + "-316.93 2.26 \n", + "-209.82 19.37 \n", + "-209.82 19.39 \n", + "-26.41 2.13 \n", + "0.26 0.6 \n", + "0.26 0.6 \n", + "-0.22 0.59 \n", + "2.18 0.75 \n", + "2.18 0.75 \n", + "2.18 0.75 \n", + "2.18 0.75 \n", + "2.18 0.75 \n", + "2.18 0.75 \n", + "None 4.26 \n", + "None 4.45 \n", + "2.18 0.75 \n", + "2.18 0.75 \n", + "None 4.46 \n", + "2.18 0.75 \n", + "2.18 0.75 \n", + "None 4.64 \n", + "None 4.67 \n", + "None 4.67 \n", + "None 4.82 \n", + "None 4.82 \n", + "None 5.07 \n", + "2.18 0.75 \n", + "None 4.88 \n", + "None 5.09 \n", + "None 5.09 \n", + "None 5.09 \n", + "None 5.21 \n", + "-0.27 0.52 \n", + "-0.74 0.53 \n", + "-0.27 0.52 \n", + "-0.74 0.53 \n", + "-0.27 0.52 \n", + "-0.74 0.53 \n", + "-0.27 0.52 \n", + "-0.74 0.53 \n", + "-0.27 0.52 \n", + "-0.74 0.53 \n", + "-4.36 1.12 \n", + "-4.36 1.12 \n", + "-3.11 6.88 \n", + "-3.11 6.88 \n", + "1.95 7.84 \n", + "-13.39 1.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-14.03 5.65 \n", + "-14.03 5.65 \n", + "-134.27 6.56 \n", + "-134.27 6.57 \n", + "-134.27 6.56 \n", + "-134.27 6.57 \n", + "-10.02 0.37 \n", + "-10.02 0.37 \n", + "0.94 0.5 \n", + "1.57 0.59 \n", + "-1.7 4.8 \n", + "-1.19 0.46 \n", + "-0.84 0.89 \n", + "-3.26 4.81 \n", + "-0.56 0.56 \n", + "-0.21 0.94 \n", + "-115.68 1.75 \n", + "-97.19 0.8 \n", + "-102.48 1.26 \n", + "-81.93 6.65 \n", + "10000000.0 10000000.0 \n", + "-3.87 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-13.21 1.07 \n", + "-6.02 0.56 \n", + "1.6 0.47 \n", + "2.96 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "-0.18 0.36 \n", + "-0.18 0.36 \n", + "-0.18 0.36 \n", + "2.16 5.87 \n", + "-0.18 0.36 \n", + "-0.18 0.36 \n", + "-13.09 1.07 \n", + "0.26 0.31 \n", + "0.53 0.54 \n", + "-0.48 0.18 \n", + "-0.76 0.39 \n", + "-0.35 0.39 \n", + "-0.02 0.09 \n", + "0.86 0.44 \n", + "-0.61 0.47 \n", + "-0.32 0.57 \n", + "0.94 0.43 \n", + "0.26 0.31 \n", + "0.53 0.54 \n", + "-0.48 0.18 \n", + "-0.76 0.39 \n", + "-0.35 0.39 \n", + "-0.02 0.09 \n", + "0.86 0.44 \n", + "-0.61 0.47 \n", + "-0.32 0.57 \n", + "0.94 0.43 \n", + "0.26 0.31 \n", + "0.53 0.54 \n", + "-0.48 0.18 \n", + "-0.76 0.39 \n", + "-0.35 0.39 \n", + "-0.02 0.09 \n", + "0.86 0.44 \n", + "-0.61 0.47 \n", + "-0.32 0.57 \n", + "0.94 0.43 \n", + "-2.62 0.35 \n", + "-2.62 0.35 \n", + "-2.62 0.35 \n", + "-2.62 0.35 \n", + "-2.62 0.35 \n", + "-2.62 0.35 \n", + "-2.62 0.35 \n", + "-2.62 0.35 \n", + "-2.62 0.35 \n", + "-2.63 1.54 \n", + "-2.62 0.35 \n", + "-2.62 0.35 \n", + "-2.62 0.35 \n", + "-2.62 0.35 \n", + "-2.63 1.54 \n", + "-2.62 0.35 \n", + "-2.62 0.35 \n", + "-2.62 0.35 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "-20.02 2.27 \n", + "-1.7 4.94 \n", + "-13.24 1.07 \n", + "-1.7 6.1 \n", + "3.25 0.27 \n", + "3.25 0.26 \n", + "-12.83 1.07 \n", + "-13.08 1.07 \n", + "-3.88 0.56 \n", + "-3.88 0.56 \n", + "-13.2 1.07 \n", + "3.83 2.4 \n", + "-1.7 5.27 \n", + "-13.18 1.07 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-3.88 0.56 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "10000000.0 10000000.0 \n", + "-2.99 0.53 \n", + "-2.99 0.53 \n", + "-2.99 0.53 \n", + "-2.99 0.53 \n", + "-3.62 0.46 \n", + "-3.62 0.46 \n", + "-8.48 0.49 \n", + "-19.39 6.27 \n", + "-19.39 6.28 \n", + "-3.88 0.56 \n", + "-13.46 13.83 \n", + "-6.02 0.56 \n", + "-94.01 0.75 \n", + "-94.01 0.75 \n", + "4.84 0.25 \n", + "4.84 0.24 \n", + "-8.67 0.51 \n", + "-8.67 0.51 \n", + "0.28 0.38 \n", + "0.28 0.37 \n", + "-90.63 3.53 \n", + "-0.4 0.68 \n", + "-2.67 19.14 \n", + "-2.67 19.87 \n", + "-1.7 19.85 \n", + "-1.7 19.16 \n", + "-0.78 0.68 \n", + "-2.67 18.37 \n", + "-2.67 18.33 \n", + "-2.67 18.33 \n", + "-1.7 18.33 \n", + "-1.7 18.37 \n", + "-0.78 0.68 \n", + "-1.7 18.34 \n", + "-1.7 18.34 \n", + "-1.7 18.34 \n", + "-1.7 18.32 \n", + "-1.7 18.32 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "-3.73 0.56 \n", + "-6.02 0.56 \n", + "0.28 0.37 \n", + "2.45 1.22 \n", + "2.46 1.22 \n", + "-3.87 0.56 \n", + "-103.68 7.3 \n", + "-103.68 7.31 \n", + "-103.68 7.3 \n", + "-103.68 7.31 \n", + "-103.68 7.3 \n", + "-103.68 7.31 \n", + "-103.68 7.3 \n", + "-103.68 7.31 \n", + "3.95 2.4 \n", + "-4.77 0.24 \n", + "-4.77 0.24 \n", + "-95.81 9.29 \n", + "-1.7 8.03 \n", + "-1.7 8.03 \n", + "-102.63 1.15 \n", + "-102.63 1.15 \n", + "-102.63 1.15 \n", + "3.77 2.4 \n", + "-10.81 0.83 \n", + "-1.7 14.41 \n", + "-1.7 14.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 16.66 \n", + "-1.7 16.66 \n", + "-1.7 22.15 \n", + "-1.7 24.08 \n", + "-2.36 0.45 \n", + "-25.73 1.49 \n", + "-25.73 1.49 \n", + "-25.73 1.49 \n", + "-25.73 1.49 \n", + "-25.73 1.49 \n", + "0.16 1.17 \n", + "0.16 1.17 \n", + "-5.41 1.47 \n", + "-25.73 1.49 \n", + "-25.73 1.49 \n", + "0.16 1.17 \n", + "-5.41 1.47 \n", + "-45.76 3.05 \n", + "-45.76 3.05 \n", + "-2.64 1.79 \n", + "-2.64 1.79 \n", + "-2.64 1.79 \n", + "-98.04 0.79 \n", + "-98.04 0.79 \n", + "-98.04 0.79 \n", + "-98.04 0.79 \n", + "-94.13 0.75 \n", + "-94.12 0.75 \n", + "-94.13 0.75 \n", + "-94.12 0.75 \n", + "-94.13 0.75 \n", + "-94.12 0.75 \n", + "-104.63 0.81 \n", + "-104.62 0.81 \n", + "-104.63 0.81 \n", + "-104.62 0.81 \n", + "-104.63 0.81 \n", + "-104.62 0.81 \n", + "-118.19 0.76 \n", + "-118.19 0.76 \n", + "-118.19 0.76 \n", + "-118.19 0.76 \n", + "-118.19 0.76 \n", + "-118.19 0.76 \n", + "-5.93 0.97 \n", + "-5.94 0.97 \n", + "-94.13 0.75 \n", + "-94.12 0.75 \n", + "-94.13 0.75 \n", + "-94.12 0.75 \n", + "-94.13 0.75 \n", + "-94.12 0.75 \n", + "-104.63 0.81 \n", + "-104.62 0.81 \n", + "-104.63 0.81 \n", + "-104.62 0.81 \n", + "-104.63 0.81 \n", + "-104.62 0.81 \n", + "-118.19 0.76 \n", + "-118.19 0.76 \n", + "-118.19 0.76 \n", + "-118.19 0.76 \n", + "-118.19 0.76 \n", + "-118.19 0.76 \n", + "-3.51 0.88 \n", + "-3.51 0.87 \n", + "-104.99 1.51 \n", + "-104.99 1.51 \n", + "-104.99 1.51 \n", + "-104.99 1.51 \n", + "-94.12 0.75 \n", + "-94.13 0.75 \n", + "-94.12 0.75 \n", + "-94.13 0.75 \n", + "-94.12 0.75 \n", + "-104.62 0.81 \n", + "-104.63 0.81 \n", + "-104.62 0.81 \n", + "-104.63 0.81 \n", + "-104.62 0.81 \n", + "-118.19 0.76 \n", + "-118.19 0.76 \n", + "-118.19 0.76 \n", + "-118.19 0.76 \n", + "-118.19 0.76 \n", + "-5.93 0.97 \n", + "-5.94 0.97 \n", + "-92.58 11.51 \n", + "-92.58 11.5 \n", + "-92.58 11.51 \n", + "-92.58 11.5 \n", + "-92.58 11.51 \n", + "-103.56 11.53 \n", + "-103.56 11.53 \n", + "-103.56 11.53 \n", + "-103.56 11.53 \n", + "-103.56 11.53 \n", + "-118.58 11.5 \n", + "-118.58 11.49 \n", + "-118.58 11.5 \n", + "-118.58 11.49 \n", + "-118.58 11.5 \n", + "1.01 11.51 \n", + "1.01 11.52 \n", + "-14.4 6.87 \n", + "-14.4 6.88 \n", + "-14.4 6.89 \n", + "-14.4 6.91 \n", + "-14.4 6.93 \n", + "-1.7 10.99 \n", + "-4.54 0.57 \n", + "-15.5 1.25 \n", + "-3.68 1.2 \n", + "-18.68 2.85 \n", + "-9.26 1.5 \n", + "-9.26 1.5 \n", + "-29.58 1.51 \n", + "-29.58 1.51 \n", + "-29.58 1.51 \n", + "-3.68 1.2 \n", + "-18.68 2.85 \n", + "-9.26 1.5 \n", + "-9.26 1.5 \n", + "-29.58 1.51 \n", + "-29.58 1.51 \n", + "-29.58 1.51 \n", + "-3.88 0.56 \n", + "-17.0 1.55 \n", + "-17.0 1.55 \n", + "-17.0 1.55 \n", + "-17.0 1.55 \n", + "-17.0 1.55 \n", + "-17.0 1.55 \n", + "-17.0 1.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.04 1.58 \n", + "-2.14 1.9 \n", + "-4.04 1.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.33 0.46 \n", + "-9.34 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.76 0.5 \n", + "-4.76 0.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.18 1.19 \n", + "-29.08 1.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.3 1.26 \n", + "-26.19 1.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.57 0.51 \n", + "-4.57 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-31.87 1.48 \n", + "10000000.0 10000000.0 \n", + "-18.13 0.71 \n", + "-18.13 0.71 \n", + "-18.13 0.71 \n", + "-18.13 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.44 0.24 \n", + "-4.44 0.24 \n", + "-4.44 0.24 \n", + "-4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.86 0.31 \n", + "-5.41 1.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.16 1.17 \n", + "-5.41 1.47 \n", + "-25.73 1.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.26 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.0 1.55 \n", + "10000000.0 10000000.0 \n", + "-1.19 0.46 \n", + "-2.14 1.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.64 0.81 \n", + "-6.06 0.67 \n", + "-6.06 0.67 \n", + "10000000.0 10000000.0 \n", + "4.57 0.34 \n", + "4.57 0.34 \n", + "1.8 0.52 \n", + "1.8 0.52 \n", + "10000000.0 10000000.0 \n", + "4.57 0.34 \n", + "4.57 0.34 \n", + "1.8 0.52 \n", + "1.8 0.52 \n", + "9.31 0.49 \n", + "9.31 0.49 \n", + "10000000.0 10000000.0 \n", + "6.3 0.96 \n", + "4.65 0.23 \n", + "-29.08 1.5 \n", + "-26.19 1.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.48 0.41 \n", + "-4.56 0.5 \n", + "-1.52 0.35 \n", + "10000000.0 10000000.0 \n", + "-31.87 1.48 \n", + "10000000.0 10000000.0 \n", + "-31.87 1.48 \n", + "-11.55 1.46 \n", + "10000000.0 10000000.0 \n", + "-2.95 0.47 \n", + "-2.58 0.51 \n", + "-93.67 1.62 \n", + "2.16 5.6 \n", + "2.16 5.53 \n", + "2.16 5.48 \n", + "-5.17 0.34 \n", + "-75.83 1.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.59 5.93 \n", + "9.59 5.93 \n", + "1.01 0.76 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "-3.83 0.39 \n", + "-3.83 0.39 \n", + "-3.88 0.56 \n", + "-1.7 10.62 \n", + "-3.88 0.56 \n", + "-3.88 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-7.91 1.04 \n", + "-24.32 4.05 \n", + "10000000.0 10000000.0 \n", + "-7.16 0.32 \n", + "-7.16 0.32 \n", + "10000000.0 10000000.0 \n", + "-4.44 0.24 \n", + "-4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "-5.82 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "54.09 3.58 \n", + "-178.78 13.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 7.94 \n", + "-3.11 7.95 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "-88.54 0.82 \n", + "-186.65 1.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.84 2.49 \n", + "-0.46 2.33 \n", + "-0.46 1.77 \n", + "-294.47 21.92 \n", + "10000000.0 10000000.0 \n", + "-314.72 20.84 \n", + "-314.72 20.88 \n", + "10000000.0 10000000.0 \n", + "-316.94 2.26 \n", + "-316.93 2.26 \n", + "10000000.0 10000000.0 \n", + "-316.94 2.26 \n", + "-316.93 2.26 \n", + "10000000.0 10000000.0 \n", + "-316.93 2.26 \n", + "-191.66 12.73 \n", + "1.4 0.34 \n", + "0.26 0.6 \n", + "-0.22 0.59 \n", + "10000000.0 10000000.0 \n", + "0.26 0.6 \n", + "-0.22 0.59 \n", + "10000000.0 10000000.0 \n", + "-0.64 0.3 \n", + "1.94 0.47 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-6.02 0.56 \n", + "-1.7 5.59 \n", + "-6.02 0.56 \n", + "-1.7 6.37 \n", + "-1.7 6.37 \n", + "0.94 0.5 \n", + "-0.84 0.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 8.11 \n", + "-105.97 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.89 0.25 \n", + "4.57 0.34 \n", + "-15.74 0.78 \n", + "0.42 0.27 \n", + "-2.23 0.53 \n", + "-5.82 0.35 \n", + "-102.63 1.15 \n", + "-102.63 1.15 \n", + "-25.73 1.49 \n", + "-12.08 0.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.96 1.28 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "-6.06 4.24 \n", + "10000000.0 10000000.0 \n", + "-31.87 1.48 \n", + "-24.11 1.28 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-37.41 0.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-37.41 0.17 \n", + "-37.41 0.17 \n", + "-26.84 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.68 1.76 \n", + "-37.41 0.17 \n", + "9.68 2.64 \n", + "9.68 2.41 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-1.7 6.96 \n", + "-6.02 0.56 \n", + "None 4.9 \n", + "None 4.86 \n", + "13.23 0.36 \n", + "-8.63 0.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.22 0.59 \n", + "10000000.0 10000000.0 \n", + "-3.88 0.56 \n", + "-1.18 0.45 \n", + "10000000.0 10000000.0 \n", + "None 4.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.48 0.43 \n", + "0.48 0.43 \n", + "0.48 0.43 \n", + "3.13 0.76 \n", + "6.14 0.18 \n", + "-32.01 1.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.13 0.75 \n", + "-94.12 0.75 \n", + "-52.15 6.69 \n", + "-52.15 6.69 \n", + "-52.15 6.69 \n", + "-52.15 6.69 \n", + "-94.13 0.75 \n", + "1.25 0.13 \n", + "10000000.0 10000000.0 \n", + "-4.52 1.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.74 0.72 \n", + "10000000.0 10000000.0 \n", + "15.26 0.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "15.26 0.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "57.71 0.34 \n", + "4.56 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.2 9.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.23 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 6.57 \n", + "-1.7 6.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.87 5.63 \n", + "-0.83 0.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-27.33 4.38 \n", + "-18.75 0.66 \n", + "-34.08 14.54 \n", + "10000000.0 10000000.0 \n", + "0.09 0.5 \n", + "-3.58 1.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 11.68 \n", + "10000000.0 10000000.0 \n", + "-0.98 0.07 \n", + "-0.98 0.07 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.06 0.67 \n", + "-64.18 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-101.93 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.18 4.84 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-5.56 0.33 \n", + "-5.56 0.33 \n", + "-131.16 1.7 \n", + "10000000.0 10000000.0 \n", + "-36.19 1.56 \n", + "-3.05 5.12 \n", + "-3.05 5.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-122.57 1.2 \n", + "10000000.0 10000000.0 \n", + "-116.99 2.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-189.98 12.73 \n", + "-189.98 12.73 \n", + "-189.98 12.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-105.97 0.91 \n", + "-94.39 9.36 \n", + "10000000.0 10000000.0 \n", + "-97.25 9.7 \n", + "-97.19 0.8 \n", + "-105.97 0.91 \n", + "-105.96 0.91 \n", + "-90.63 6.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-128.98 8.61 \n", + "-294.47 21.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-116.64 0.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "-102.45 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-114.32 1.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.34 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.25 0.13 \n", + "-8.15 0.78 \n", + "-8.09 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-119.46 1.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "14.27 0.34 \n", + "10000000.0 10000000.0 \n", + "13.87 0.31 \n", + "10000000.0 10000000.0 \n", + "-142.25 4.98 \n", + "-85.38 7.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.25 0.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.92 1.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.74 0.72 \n", + "8.68 0.76 \n", + "-20.81 1.48 \n", + "10.18 0.69 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.18 2.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.47 4.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.04 0.55 \n", + "57.71 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.17 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.62 0.69 \n", + "-9.57 0.81 \n", + "10000000.0 10000000.0 \n", + "-95.83 8.6 \n", + "-14.49 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.18 0.36 \n", + "3.41 0.86 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.76 \n", + "-4.36 7.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.74 5.72 \n", + "-16.73 10.87 \n", + "-8.72 10.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.2 9.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 8.62 \n", + "-4.36 8.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.12 1.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "19.12 5.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.43 3.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.66 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.61 5.41 \n", + "-3.61 5.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.45 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "26.76 1.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.07 0.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.4 1.01 \n", + "10000000.0 10000000.0 \n", + "-13.16 0.99 \n", + "10000000.0 10000000.0 \n", + "-13.02 0.99 \n", + "9.53 11.63 \n", + "9.53 11.63 \n", + "10000000.0 10000000.0 \n", + "-0.74 0.51 \n", + "10000000.0 10000000.0 \n", + "59.57 0.45 \n", + "-13.16 0.99 \n", + "-3.83 0.39 \n", + "-17.09 3.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.08 0.85 \n", + "10000000.0 10000000.0 \n", + "-1.7 12.2 \n", + "-1.7 12.2 \n", + "-1.7 13.27 \n", + "-1.7 13.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.87 0.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 8.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.83 0.39 \n", + "10000000.0 10000000.0 \n", + "-3.83 0.39 \n", + "-3.83 0.39 \n", + "-13.16 0.99 \n", + "-14.4 6.78 \n", + "-4.09 0.85 \n", + "10000000.0 10000000.0 \n", + "156.78 7.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.16 0.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.17 0.99 \n", + "10000000.0 10000000.0 \n", + "-16.85 1.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-62.41 0.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "130.27 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.53 11.96 \n", + "9.53 11.96 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.53 11.55 \n", + "10000000.0 10000000.0 \n", + "-3.82 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-122.46 0.81 \n", + "10000000.0 10000000.0 \n", + "-18.75 0.66 \n", + "-7.89 0.66 \n", + "-6.4 0.66 \n", + "-6.4 0.66 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.82 1.27 \n", + "-18.52 0.78 \n", + "-25.66 3.88 \n", + "10000000.0 10000000.0 \n", + "0.96 0.71 \n", + "4.16 0.78 \n", + "10000000.0 10000000.0 \n", + "-7.82 0.58 \n", + "10000000.0 10000000.0 \n", + "-3.9 0.57 \n", + "-1.86 0.46 \n", + "-1.36 0.5 \n", + "-6.3 2.64 \n", + "10000000.0 10000000.0 \n", + "-5.28 0.33 \n", + "-6.83 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.94 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.84 1.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.88 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "208.0 10.9 \n", + "-1.49 1.31 \n", + "0.21 0.71 \n", + "0.21 0.71 \n", + "10000000.0 10000000.0 \n", + "-1.09 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.05 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 11.68 \n", + "None 11.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-35.04 10.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.48 1.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.64 0.81 \n", + "-6.94 0.95 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.98 0.07 \n", + "2.48 1.24 \n", + "10000000.0 10000000.0 \n", + "-1.26 0.5 \n", + "-1.26 0.5 \n", + "4.29 0.24 \n", + "4.29 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.89 0.24 \n", + "-5.81 0.35 \n", + "-5.2 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.12 0.71 \n", + "-3.13 0.83 \n", + "-5.09 0.53 \n", + "-3.32 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.02 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.53 0.85 \n", + "-7.53 0.85 \n", + "-7.53 0.85 \n", + "-7.53 0.85 \n", + "-9.32 1.49 \n", + "-7.51 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-5.8 1.53 \n", + "-5.82 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.43 0.33 \n", + "-0.88 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.34 0.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.68 0.72 \n", + "-7.67 0.72 \n", + "-7.84 0.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.34 11.16 \n", + "-12.02 11.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.79 28.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.69 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-187.37 1.02 \n", + "-7.9 1.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-63.23 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.63 0.42 \n", + "-2.63 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-101.22 0.27 \n", + "-63.68 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.46 2.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-100.77 0.29 \n", + "10000000.0 10000000.0 \n", + "-47.28 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.06 0.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "155.37 23.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.82 0.43 \n", + "10000000.0 10000000.0 \n", + "-64.18 0.33 \n", + "10000000.0 10000000.0 \n", + "-637.03 6.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-125.73 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-101.72 0.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-101.93 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-269.79 0.65 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "-3.34 0.3 \n", + "-3.63 0.8 \n", + "-6.68 4.98 \n", + "7.29 4.95 \n", + "1769.48 5.39 \n", + "13.27 1.0 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "-1.7 5.31 \n", + "-3.83 0.39 \n", + "-12.61 0.96 \n", + "-1.86 0.46 \n", + "5.81 1.92 \n", + "5.81 1.92 \n", + "-105.97 0.91 \n", + "-0.28 0.38 \n", + "3.2 1.15 \n", + "10000000.0 10000000.0 \n", + "-11.12 1.44 \n", + "0.26 6.58 \n", + "10000000.0 10000000.0 \n", + "-3.57 0.3 \n", + "-3.38 0.51 \n", + "-12.71 1.03 \n", + "-12.71 1.03 \n", + "-3.61 6.53 \n", + "983.91 1.03 \n", + "-3.88 0.56 \n", + "6.93 1.03 \n", + "7.3 1.24 \n", + "-8.3 0.8 \n", + "4.44 0.24 \n", + "-1.18 0.45 \n", + "-3.99 0.33 \n", + "10000000.0 10000000.0 \n", + "0.48 1.95 \n", + "-62.49 1.36 \n", + "7.17 2.81 \n", + "None None \n", + "-2.92 0.8 \n", + "-14.55 0.79 \n", + "2.8 0.75 \n", + "10000000.0 10000000.0 \n", + "0.84 1.02 \n", + "3.53 0.32 \n", + "-3.6 0.3 \n", + "-10.83 1.01 \n", + "-4.36 6.35 \n", + "0.38 0.45 \n", + "114.39 1.15 \n", + "-10.7 1.43 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "-9.8 6.34 \n", + "-9.8 6.33 \n", + "-2.56 0.59 \n", + "-4.36 5.53 \n", + "10000000.0 10000000.0 \n", + "-0.62 0.69 \n", + "-0.62 0.69 \n", + "4.44 0.24 \n", + "-19.86 10.94 \n", + "14.67 0.4 \n", + "23.24 5.58 \n", + "-4.11 0.46 \n", + "4.44 0.24 \n", + "10.16 1.22 \n", + "1.49 1.28 \n", + "1.49 1.28 \n", + "14.39 0.83 \n", + "-7.38 0.85 \n", + "-3.78 0.52 \n", + "-1.7 8.05 \n", + "10000000.0 10000000.0 \n", + "-9.45 0.27 \n", + "-6.02 6.8 \n", + "-23.88 2.0 \n", + "-54.67 4.16 \n", + "-83.95 6.39 \n", + "-83.89 2.02 \n", + "-13.45 5.25 \n", + "-2.12 1.51 \n", + "-2.23 0.46 \n", + "0.09 0.71 \n", + "-14.03 6.47 \n", + "0.38 0.45 \n", + "7.22 2.55 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "-5.94 0.97 \n", + "-0.34 0.55 \n", + "0.83 0.41 \n", + "10000000.0 10000000.0 \n", + "13.71 1.53 \n", + "-3.68 7.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.09 2.11 \n", + "10000000.0 10000000.0 \n", + "27.59 2.72 \n", + "-94.12 0.75 \n", + "-4.36 6.36 \n", + "-8.68 0.26 \n", + "-2.62 0.35 \n", + "1.2 1.06 \n", + "-8.8 1.03 \n", + "-1.94 0.56 \n", + "-15.89 0.83 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "-6.4 0.66 \n", + "1.57 3.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "66.56 1.93 \n", + "-3.68 7.49 \n", + "-1.7 6.08 \n", + "10000000.0 10000000.0 \n", + "-7.85 0.58 \n", + "-1.7 6.57 \n", + "-11.23 6.48 \n", + "None None \n", + "-6.87 0.48 \n", + "-6.14 1.01 \n", + "54.83 0.74 \n", + "9.66 0.82 \n", + "-6.0 0.82 \n", + "0.13 0.42 \n", + "10000000.0 10000000.0 \n", + "14.27 0.33 \n", + "14.27 0.34 \n", + "25.53 4.45 \n", + "3.52 0.71 \n", + "2.56 0.91 \n", + "-1.69 1.85 \n", + "-90.71 1.22 \n", + "10000000.0 10000000.0 \n", + "-6.94 0.41 \n", + "None None \n", + "-3.88 0.56 \n", + "-3.88 0.56 \n", + "-2.62 0.35 \n", + "-1.54 0.44 \n", + "-15.5 1.25 \n", + "9.66 0.82 \n", + "6.25 1.74 \n", + "-3.39 0.3 \n", + "10000000.0 10000000.0 \n", + "-61.07 1.42 \n", + "-20.04 6.38 \n", + "20.04 6.36 \n", + "-20.04 6.38 \n", + "20.04 6.36 \n", + "-73.74 2.89 \n", + "10000000.0 10000000.0 \n", + "-5.98 0.42 \n", + "-1.14 0.86 \n", + "-3.63 3.1 \n", + "10000000.0 10000000.0 \n", + "-72.23 0.2 \n", + "10000000.0 10000000.0 \n", + "-3.61 7.51 \n", + "-4.08 0.85 \n", + "-15.7 1.65 \n", + "1.82 0.63 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "74.21 5.32 \n", + "-10.41 1.41 \n", + "7.22 3.18 \n", + "-2.27 0.32 \n", + "-4.97 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.17 0.33 \n", + "-11.23 8.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.92 1.11 \n", + "-20.66 0.7 \n", + "-4316.25 26.67 \n", + "6.19 13.26 \n", + "1.63 1.66 \n", + "1.4 0.94 \n", + "-22.56 1.11 \n", + "-94.13 0.75 \n", + "-103.41 0.78 \n", + "0.28 0.37 \n", + "0.28 0.38 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "-3.38 0.51 \n", + "None None \n", + "7.22 0.46 \n", + "7.22 0.46 \n", + "114.39 1.15 \n", + "10000000.0 10000000.0 \n", + "-6.74 5.72 \n", + "-90.74 0.91 \n", + "104.86 1.27 \n", + "-21.35 1.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-97.19 0.8 \n", + "10000000.0 10000000.0 \n", + "-30.31 1.92 \n", + "-105.97 0.91 \n", + "-34.18 1.58 \n", + "-4.36 10.38 \n", + "-34.18 1.58 \n", + "-4.36 10.33 \n", + "-105.96 0.91 \n", + "-42.89 3.91 \n", + "-4.36 6.76 \n", + "46.59 0.99 \n", + "-6.74 5.58 \n", + "-4.36 5.88 \n", + "-4.36 5.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.38 0.45 \n", + "-16.25 1.45 \n", + "2.79 0.8 \n", + "0.37 4.55 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "4.44 0.24 \n", + "-0.18 0.36 \n", + "-0.18 0.36 \n", + "4.44 0.24 \n", + "7.19 0.32 \n", + "4.44 0.24 \n", + "-0.18 0.36 \n", + "4.44 0.24 \n", + "-0.18 0.36 \n", + "7.19 0.32 \n", + "4.96 0.36 \n", + "0.25 0.71 \n", + "10.77 0.89 \n", + "14.27 0.34 \n", + "10.66 0.78 \n", + "None None \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "-25.63 0.25 \n", + "-4.36 7.84 \n", + "-25.88 10.89 \n", + "-4.36 7.84 \n", + "-34.18 1.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.29 0.69 \n", + "-5.41 0.61 \n", + "-0.28 0.38 \n", + "0.38 0.45 \n", + "-3.11 3.56 \n", + "-15.89 0.83 \n", + "-2.8 1.41 \n", + "-0.99 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.63 0.71 \n", + "4.89 0.24 \n", + "-94.13 0.75 \n", + "-94.13 0.75 \n", + "-150.73 10.1 \n", + "1.18 0.45 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "-1.18 0.45 \n", + "4.52 1.9 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "4.52 1.9 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "0.28 0.38 \n", + "4.44 0.24 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "4.44 0.24 \n", + "2.3 11.79 \n", + "2.3 11.78 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "4.44 0.24 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "4.44 0.24 \n", + "0.28 0.37 \n", + "-97.2 0.8 \n", + "0.28 0.38 \n", + "-98.05 0.82 \n", + "-95.07 0.74 \n", + "-96.63 0.76 \n", + "-1.23 1.41 \n", + "4.44 0.24 \n", + "-6.75 0.75 \n", + "-25.91 1.72 \n", + "-98.75 2.72 \n", + "-2.88 0.75 \n", + "-0.22 0.74 \n", + "-4.45 0.24 \n", + "10000000.0 10000000.0 \n", + "18.89 3.42 \n", + "4.89 0.24 \n", + "-4.36 5.12 \n", + "-8.68 0.26 \n", + "-8.68 0.27 \n", + "-62.32 6.07 \n", + "13.71 1.25 \n", + "-4.36 5.1 \n", + "-8.68 0.26 \n", + "-8.67 0.27 \n", + "-22.58 1.11 \n", + "-8.68 0.26 \n", + "-8.67 0.27 \n", + "-22.57 1.11 \n", + "-20.0 1.66 \n", + "0.18 0.36 \n", + "-74.42 6.19 \n", + "-50.41 6.19 \n", + "49.25 0.53 \n", + "-6.6 0.5 \n", + "-0.41 0.38 \n", + "-95.83 7.08 \n", + "-8.68 0.26 \n", + "-23.93 0.27 \n", + "-4.36 5.33 \n", + "-4.02 0.42 \n", + "-49.36 1.65 \n", + "-49.36 1.65 \n", + "5.07 0.75 \n", + "-14.27 0.34 \n", + "-0.5 1.88 \n", + "-26.9 1.23 \n", + "-102.15 2.15 \n", + "-9.07 0.26 \n", + "-9.06 0.27 \n", + "2.39 0.75 \n", + "-4.84 0.25 \n", + "10000000.0 10000000.0 \n", + "5.9 1.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.15 3.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.58 9.84 \n", + "-105.96 0.91 \n", + "-4.36 6.66 \n", + "-80.46 1.66 \n", + "-19.42 6.89 \n", + "-95.44 7.99 \n", + "-2.66 0.8 \n", + "-95.83 8.5 \n", + "-4.36 7.67 \n", + "-95.63 8.62 \n", + "-19.42 7.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.66 0.26 \n", + "10000000.0 10000000.0 \n", + "6.29 1.0 \n", + "-2.6 2.11 \n", + "-49.25 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.54 0.55 \n", + "-4.07 0.85 \n", + "10000000.0 10000000.0 \n", + "-3.14 6.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.45 0.38 \n", + "-110.08 3.81 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.5 3.21 \n", + "120.14 3.17 \n", + "0.62 2.74 \n", + "-9.45 0.26 \n", + "-8.55 0.26 \n", + "8.67 0.26 \n", + "1.88 0.49 \n", + "-0.37 0.55 \n", + "-6.14 0.96 \n", + "6.14 0.96 \n", + "None None \n", + "38.5 9.08 \n", + "-8.92 5.0 \n", + "-5.88 0.41 \n", + "4.44 0.24 \n", + "None None \n", + "-8.44 0.34 \n", + "-11.23 10.05 \n", + "0.05 5.09 \n", + "8.79 0.45 \n", + "0.38 0.45 \n", + "10.79 0.66 \n", + "0.9 0.42 \n", + "-2.56 0.46 \n", + "-3.3 0.3 \n", + "-5.06 0.75 \n", + "10000000.0 10000000.0 \n", + "-15.98 1.38 \n", + "-221.21 3.19 \n", + "-125.07 0.95 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.06 0.27 \n", + "-7.31 1.71 \n", + "-1.24 0.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.8 9.66 \n", + "-53.52 9.09 \n", + "38.5 9.08 \n", + "-48.84 10.19 \n", + "-4.36 5.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.17 1.43 \n", + "-15.44 1.35 \n", + "-8.34 1.05 \n", + "20.81 3.0 \n", + "6.55 1.05 \n", + "6.54 1.05 \n", + "-7.69 0.72 \n", + "-3.11 0.49 \n", + "-15.57 1.32 \n", + "14.49 0.33 \n", + "-0.79 13.23 \n", + "-3.11 10.14 \n", + "3.75 0.29 \n", + "-88.58 1.97 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-103.72 1.71 \n", + "-105.96 0.91 \n", + "-103.39 2.28 \n", + "-110.94 1.04 \n", + "-82.17 2.13 \n", + "-105.97 0.91 \n", + "-97.2 0.8 \n", + "-4.36 5.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.75 0.44 \n", + "-8.05 1.15 \n", + "-7.77 1.33 \n", + "-4.6 1.24 \n", + "4.32 0.41 \n", + "10000000.0 10000000.0 \n", + "-6.26 9.67 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.55 1.5 \n", + "-23.91 1.3 \n", + "8.38 0.33 \n", + "-11.24 0.43 \n", + "-43.22 0.65 \n", + "10000000.0 10000000.0 \n", + "0.49 0.57 \n", + "10000000.0 10000000.0 \n", + "-104.87 1.27 \n", + "-6.74 5.93 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.88 \n", + "-4.36 5.83 \n", + "-104.86 1.27 \n", + "-6.74 5.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "227.13 2.37 \n", + "106.73 1.14 \n", + "2.23 2.95 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "-10.37 0.2 \n", + "-10.37 0.2 \n", + "-8.68 0.26 \n", + "-6.45 0.99 \n", + "-23.93 0.27 \n", + "-23.93 0.27 \n", + "-23.28 2.05 \n", + "-8.53 1.22 \n", + "-23.28 2.05 \n", + "-16.6 6.44 \n", + "-12.56 6.36 \n", + "-62.1 1.36 \n", + "-64.83 1.45 \n", + "-93.87 1.66 \n", + "-60.46 1.41 \n", + "-105.96 0.91 \n", + "105.97 0.91 \n", + "-34.3 0.27 \n", + "26.0 0.87 \n", + "-11.78 6.84 \n", + "-11.78 6.83 \n", + "-68.76 3.69 \n", + "-61.0 1.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-79.14 2.26 \n", + "-79.14 2.26 \n", + "-79.14 2.26 \n", + "-79.14 2.26 \n", + "10000000.0 10000000.0 \n", + "-94.12 0.75 \n", + "2.73 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-45.25 0.8 \n", + "4.89 0.24 \n", + "-9.06 0.26 \n", + "-118.03 0.76 \n", + "-90.21 1.25 \n", + "-8.55 1.22 \n", + "10000000.0 10000000.0 \n", + "-10.0 6.76 \n", + "-75.61 1.39 \n", + "-95.71 1.04 \n", + "95.68 1.04 \n", + "-94.12 0.75 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "-10.7 1.47 \n", + "-8.68 0.26 \n", + "10000000.0 10000000.0 \n", + "-94.12 0.75 \n", + "-8.67 0.27 \n", + "-70.46 6.3 \n", + "-70.46 6.29 \n", + "-12.52 6.33 \n", + "-12.52 6.31 \n", + "-83.04 6.34 \n", + "-61.19 1.37 \n", + "-8.84 0.52 \n", + "0.18 0.36 \n", + "-2.95 0.3 \n", + "-74.87 1.39 \n", + "-3.4 0.86 \n", + "-128.24 1.94 \n", + "-110.65 1.18 \n", + "-4.36 5.71 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "-10.29 1.04 \n", + "-15.57 1.74 \n", + "-12.52 6.33 \n", + "-20.33 1.89 \n", + "14.27 0.33 \n", + "-20.31 1.89 \n", + "-14.11 1.64 \n", + "-16.49 1.89 \n", + "-0.28 0.37 \n", + "-20.54 2.43 \n", + "10000000.0 10000000.0 \n", + "-88.54 0.82 \n", + "-104.66 1.29 \n", + "-95.24 0.84 \n", + "-95.24 0.84 \n", + "-3.53 6.16 \n", + "1.54 0.63 \n", + "-0.37 0.64 \n", + "5.66 0.74 \n", + "-25.79 2.94 \n", + "-4.17 0.94 \n", + "-22.19 1.11 \n", + "-6.55 1.89 \n", + "-5.31 0.46 \n", + "-0.52 0.47 \n", + "-6.32 0.41 \n", + "-2.58 0.52 \n", + "-264.62 0.76 \n", + "-34.54 1.84 \n", + "-112.02 0.74 \n", + "-56.02 0.43 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "-8.19 1.12 \n", + "-8.06 0.42 \n", + "-10.56 6.38 \n", + "-0.79 6.2 \n", + "2.96 1.11 \n", + "-13.43 1.51 \n", + "0.26 5.09 \n", + "-13.74 0.93 \n", + "-10.96 0.39 \n", + "-14.31 0.8 \n", + "-11.67 0.39 \n", + "10000000.0 10000000.0 \n", + "-11.68 0.39 \n", + "-11.92 2.04 \n", + "-14.98 0.63 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.1 1.16 \n", + "2.1 1.16 \n", + "-6.21 0.86 \n", + "-4.31 0.75 \n", + "-2.27 0.8 \n", + "4.7 0.75 \n", + "-4.31 0.75 \n", + "-4.98 5.01 \n", + "101.79 9.55 \n", + "2.97 1.22 \n", + "-4.69 1.75 \n", + "6.44 1.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.44 2.54 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "27.2 2.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.79 0.86 \n", + "-11.78 6.46 \n", + "-8.41 2.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-62.11 1.36 \n", + "-60.9 1.49 \n", + "-72.01 1.74 \n", + "-94.76 2.17 \n", + "10000000.0 10000000.0 \n", + "-94.76 2.17 \n", + "-61.79 3.91 \n", + "-62.77 1.36 \n", + "-75.17 1.93 \n", + "-62.0 1.72 \n", + "-101.85 2.55 \n", + "-74.46 2.47 \n", + "-62.11 1.36 \n", + "-76.0 6.42 \n", + "-114.65 4.8 \n", + "-107.87 1.44 \n", + "4.22 1.68 \n", + "10000000.0 10000000.0 \n", + "-115.4 0.99 \n", + "-84.04 12.79 \n", + "-0.39 0.41 \n", + "-80.62 0.75 \n", + "-105.07 0.81 \n", + "-78.74 0.79 \n", + "-88.58 1.97 \n", + "-71.1 6.4 \n", + "-87.11 3.42 \n", + "-115.4 0.99 \n", + "-87.11 3.42 \n", + "-115.41 0.99 \n", + "-82.87 7.01 \n", + "-80.36 12.78 \n", + "-80.36 12.75 \n", + "-87.11 3.42 \n", + "-87.11 3.42 \n", + "-94.91 1.75 \n", + "-88.3 1.92 \n", + "-105.97 0.91 \n", + "-94.12 0.75 \n", + "-94.12 0.75 \n", + "-105.72 1.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-106.11 0.91 \n", + "10000000.0 10000000.0 \n", + "-105.95 0.91 \n", + "3.78 0.86 \n", + "-2.62 0.35 \n", + "4.17 0.75 \n", + "15.39 3.88 \n", + "9.64 6.29 \n", + "10000000.0 10000000.0 \n", + "-20.89 0.81 \n", + "-7.99 8.79 \n", + "4.6 6.38 \n", + "38.9 9.75 \n", + "-49.12 0.53 \n", + "-27.05 1.52 \n", + "-107.67 1.13 \n", + "-7.05 1.76 \n", + "-127.64 2.84 \n", + "-118.06 1.34 \n", + "-63.08 0.4 \n", + "10.37 0.2 \n", + "-4.14 1.43 \n", + "-148.9 0.5 \n", + "-9.05 1.87 \n", + "-102.55 1.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.52 0.35 \n", + "38.39 0.21 \n", + "38.83 1.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-107.89 6.27 \n", + "128.71 2.6 \n", + "-56.3 2.88 \n", + "-80.42 2.13 \n", + "-0.81 0.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.19 0.32 \n", + "0.05 0.47 \n", + "1.01 0.38 \n", + "-1.49 0.35 \n", + "-1.1 0.96 \n", + "5.71 1.49 \n", + "3.56 0.69 \n", + "-61.25 1.89 \n", + "-4.89 0.24 \n", + "-0.89 4.0 \n", + "-3.7 0.46 \n", + "-16.29 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "41.33 0.36 \n", + "41.33 0.36 \n", + "40.48 0.31 \n", + "70.98 0.52 \n", + "-23.57 10.53 \n", + "15.54 0.35 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.91 0.53 \n", + "-4.88 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.33 0.82 \n", + "-19.17 3.21 \n", + "11.03 1.98 \n", + "130.96 4.28 \n", + "-102.41 1.28 \n", + "-102.41 1.28 \n", + "-30.27 3.76 \n", + "13.32 1.59 \n", + "243.55 2.78 \n", + "2.12 1.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 5.68 \n", + "2.84 0.54 \n", + "-0.97 0.71 \n", + "-20.97 1.86 \n", + "-8.23 1.28 \n", + "-18.13 0.71 \n", + "22.57 3.37 \n", + "7.97 3.23 \n", + "7.97 3.06 \n", + "-18.95 1.96 \n", + "-20.8 1.85 \n", + "-7.77 1.33 \n", + "-100.94 1.93 \n", + "-87.05 1.67 \n", + "-3.84 0.39 \n", + "-83.58 6.31 \n", + "-93.44 6.34 \n", + "3.71 3.14 \n", + "3.75 0.29 \n", + "22.57 3.12 \n", + "7.97 3.04 \n", + "3.71 3.12 \n", + "4.44 0.24 \n", + "4.3 0.88 \n", + "10000000.0 10000000.0 \n", + "2.8 0.64 \n", + "-9.17 0.71 \n", + "6.74 0.68 \n", + "-7.19 0.32 \n", + "-5.94 0.69 \n", + "None 5.17 \n", + "-2.5 0.54 \n", + "0.26 5.17 \n", + "7.35 1.99 \n", + "9.45 1.95 \n", + "12.89 1.43 \n", + "-1.02 0.71 \n", + "4.98 5.1 \n", + "None 0.71 \n", + "-14.21 1.61 \n", + "1.18 0.45 \n", + "12.31 0.75 \n", + "0.18 0.36 \n", + "15.39 1.0 \n", + "7.32 1.47 \n", + "2.81 0.89 \n", + "3.9 0.5 \n", + "-8.27 0.89 \n", + "4.41 0.52 \n", + "-10.01 0.3 \n", + "3.06 1.31 \n", + "-3.08 0.54 \n", + "-40.14 1.7 \n", + "-18.13 0.71 \n", + "-18.13 0.71 \n", + "-18.75 0.66 \n", + "-18.75 0.66 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "-83.0 2.53 \n", + "-83.01 2.53 \n", + "-50.72 1.02 \n", + "-61.44 0.32 \n", + "-6.42 0.31 \n", + "10000000.0 10000000.0 \n", + "0.34 0.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-108.63 1.19 \n", + "-1.49 0.4 \n", + "-1.09 1.02 \n", + "-7.67 0.82 \n", + "26.77 3.57 \n", + "4.52 1.9 \n", + "-294.47 21.93 \n", + "13.87 0.31 \n", + "10.98 3.51 \n", + "-9.07 0.26 \n", + "-2.95 0.8 \n", + "0.31 0.55 \n", + "-2.16 0.33 \n", + "-1.84 0.3 \n", + "1.86 3.18 \n", + "-8.57 0.26 \n", + "-86.23 1.62 \n", + "-13.3 1.07 \n", + "-0.02 0.49 \n", + "-59.71 8.19 \n", + "-71.06 8.13 \n", + "-105.96 0.91 \n", + "-28.45 5.23 \n", + "0.37 4.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.07 0.85 \n", + "-8.67 0.27 \n", + "-8.67 0.27 \n", + "-70.46 6.3 \n", + "-49.24 0.53 \n", + "-0.45 0.97 \n", + "-27.3 4.29 \n", + "28.69 4.26 \n", + "0.46 4.55 \n", + "-5.29 6.81 \n", + "-14.2 6.92 \n", + "-8.76 7.02 \n", + "212.5 5.09 \n", + "-4.36 7.04 \n", + "-2.38 0.44 \n", + "4.44 0.24 \n", + "3.57 0.24 \n", + "-0.28 0.38 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "4.89 0.24 \n", + "4.89 0.25 \n", + "3.42 0.46 \n", + "4.53 0.29 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "-0.28 0.38 \n", + "-0.28 0.38 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "-106.16 2.15 \n", + "-28.22 1.26 \n", + "-77.94 1.03 \n", + "-28.71 1.08 \n", + "-8.52 0.26 \n", + "-7.44 0.33 \n", + "-7.44 0.34 \n", + "17.54 7.26 \n", + "13.27 1.0 \n", + "4.01 0.73 \n", + "4.01 0.73 \n", + "9.58 7.18 \n", + "4.17 9.16 \n", + "10000000.0 10000000.0 \n", + "8.64 1.05 \n", + "3.57 0.74 \n", + "3.8 0.5 \n", + "3.81 0.5 \n", + "6.67 0.93 \n", + "-65.16 2.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.71 0.71 \n", + "-108.28 5.59 \n", + "-122.57 1.2 \n", + "-116.78 2.48 \n", + "-116.79 2.48 \n", + "-98.06 0.82 \n", + "-128.98 8.61 \n", + "-101.03 1.21 \n", + "-101.03 1.21 \n", + "-294.47 21.93 \n", + "-106.0 0.91 \n", + "-104.62 0.81 \n", + "-87.68 0.79 \n", + "10000000.0 10000000.0 \n", + "15.57 1.32 \n", + "15.57 1.32 \n", + "-5.56 0.33 \n", + "-5.56 0.33 \n", + "10000000.0 10000000.0 \n", + "-5.56 0.33 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "None 1.87 \n", + "None 1.87 \n", + "10000000.0 10000000.0 \n", + "None 1.54 \n", + "-2.53 0.68 \n", + "None 4.3 \n", + "None 4.3 \n", + "-5.89 0.73 \n", + "-0.13 0.6 \n", + "None 0.68 \n", + "-23.88 2.0 \n", + "15.54 0.35 \n", + "15.54 0.35 \n", + "-0.99 0.31 \n", + "-19.86 10.94 \n", + "-106.02 0.91 \n", + "-0.63 0.42 \n", + "-0.63 0.42 \n", + "None 8.53 \n", + "None 8.53 \n", + "10000000.0 10000000.0 \n", + "-2.3 9.28 \n", + "None 2.22 \n", + "None 1.87 \n", + "10000000.0 10000000.0 \n", + "None 2.22 \n", + "None 2.35 \n", + "None 9.8 \n", + "None 2.22 \n", + "-1.98 0.61 \n", + "None 9.8 \n", + "None 0.83 \n", + "None 0.83 \n", + "-0.63 0.42 \n", + "-3.02 0.72 \n", + "None 2.46 \n", + "None 2.46 \n", + "1.11 1.62 \n", + "4.38 0.71 \n", + "4.38 0.71 \n", + "-3.11 5.68 \n", + "-1.81 1.19 \n", + "-22.32 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 3.39 \n", + "-0.13 0.6 \n", + "None 10.18 \n", + "-1.04 0.46 \n", + "None 4.61 \n", + "-2.78 0.74 \n", + "None 4.61 \n", + "-0.52 0.47 \n", + "-2.78 0.74 \n", + "-13.3 1.07 \n", + "None 1.26 \n", + "-3.35 0.3 \n", + "1.0 0.47 \n", + "-13.3 1.07 \n", + "1.0 0.47 \n", + "1.0 0.47 \n", + "-13.3 1.07 \n", + "2.58 0.41 \n", + "None 10.27 \n", + "-3.37 0.44 \n", + "None 1.4 \n", + "1.0 0.47 \n", + "-14.34 2.93 \n", + "None 2.64 \n", + "None 5.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.22 0.33 \n", + "None 5.06 \n", + "-14.27 0.34 \n", + "None 3.03 \n", + "-5.17 0.34 \n", + "None 10.27 \n", + "-106.51 13.35 \n", + "-0.8 1.14 \n", + "None 10.27 \n", + "-14.27 0.34 \n", + "None 10.27 \n", + "-1.13 0.78 \n", + "None 1.41 \n", + "None 0.81 \n", + "None 0.81 \n", + "5.01 0.41 \n", + "5.01 0.41 \n", + "None 1.41 \n", + "-7.79 0.66 \n", + "15.54 0.35 \n", + "11.86 1.31 \n", + "-17.48 0.57 \n", + "10000000.0 10000000.0 \n", + "-5.67 0.33 \n", + "2.82 1.78 \n", + "10000000.0 10000000.0 \n", + "2.82 1.78 \n", + "2.82 1.78 \n", + "-3.87 1.24 \n", + "-13.8 0.7 \n", + "-5.42 0.49 \n", + "None 2.08 \n", + "-3.87 1.24 \n", + "-13.8 0.7 \n", + "-3.87 1.24 \n", + "-3.44 0.61 \n", + "None 2.08 \n", + "0.67 0.33 \n", + "-5.42 0.49 \n", + "-105.98 0.91 \n", + "-6.02 0.56 \n", + "-105.98 0.91 \n", + "-6.02 0.56 \n", + "3.02 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.2 1.07 \n", + "-13.2 1.07 \n", + "-5.47 0.75 \n", + "-3.7 0.19 \n", + "None 0.64 \n", + "None 2.16 \n", + "-8.2 3.63 \n", + "10000000.0 10000000.0 \n", + "-8.2 3.63 \n", + "-12.08 0.38 \n", + "0.33 0.13 \n", + "10000000.0 10000000.0 \n", + "-8.2 3.63 \n", + "-2.25 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.3 9.21 \n", + "10000000.0 10000000.0 \n", + "-2.25 0.71 \n", + "None 2.25 \n", + "0.26 5.09 \n", + "None 3.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.67 0.33 \n", + "-10.53 1.07 \n", + "None 3.78 \n", + "1.52 0.35 \n", + "10000000.0 10000000.0 \n", + "-1.2 0.77 \n", + "2.1 0.72 \n", + "2.1 0.72 \n", + "None 2.16 \n", + "None 2.16 \n", + "-5.77 1.2 \n", + "-0.64 0.29 \n", + "-34.51 1.02 \n", + "4.75 0.65 \n", + "-0.64 0.29 \n", + "10000000.0 10000000.0 \n", + "-2.28 3.9 \n", + "4.75 0.65 \n", + "10000000.0 10000000.0 \n", + "-2.28 3.9 \n", + "-13.45 5.25 \n", + "-0.64 0.29 \n", + "-0.64 0.29 \n", + "-1.2 0.77 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 9.74 \n", + "None 10.24 \n", + "-0.89 0.13 \n", + "-105.98 0.91 \n", + "-0.89 0.13 \n", + "-11.7 0.56 \n", + "-0.89 0.13 \n", + "-105.98 0.91 \n", + "-4.27 0.66 \n", + "None 10.24 \n", + "-0.89 0.13 \n", + "-4.27 0.66 \n", + "-8.47 0.58 \n", + "2.2 0.59 \n", + "10000000.0 10000000.0 \n", + "-2.59 0.43 \n", + "None 9.74 \n", + "3.02 0.36 \n", + "-11.7 0.56 \n", + "None 2.73 \n", + "-5.09 0.81 \n", + "-5.09 0.81 \n", + "-9.4 0.52 \n", + "None 4.88 \n", + "None 4.88 \n", + "10000000.0 10000000.0 \n", + "-14.38 0.55 \n", + "-14.38 0.55 \n", + "None 4.88 \n", + "10000000.0 10000000.0 \n", + "-0.83 1.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.69 0.67 \n", + "10000000.0 10000000.0 \n", + "-79.81 0.75 \n", + "-79.81 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.59 0.43 \n", + "None 0.99 \n", + "None 2.25 \n", + "None 1.44 \n", + "-1.16 0.59 \n", + "-7.24 0.89 \n", + "-17.94 1.79 \n", + "0.96 0.71 \n", + "None 2.67 \n", + "None 4.37 \n", + "-10.01 0.3 \n", + "-5.81 0.35 \n", + "0.96 0.71 \n", + "-10.01 0.3 \n", + "None 2.67 \n", + "None 4.37 \n", + "-2.25 0.46 \n", + "10000000.0 10000000.0 \n", + "None 4.67 \n", + "None 4.67 \n", + "-21.94 1.79 \n", + "6.53 4.99 \n", + "-10.01 0.3 \n", + "None 2.02 \n", + "-0.54 0.83 \n", + "-7.56 0.47 \n", + "-9.1 0.61 \n", + "2.51 0.5 \n", + "None 1.71 \n", + "-7.56 0.47 \n", + "-2.25 0.46 \n", + "-2.25 0.46 \n", + "10000000.0 10000000.0 \n", + "-21.19 1.04 \n", + "10000000.0 10000000.0 \n", + "-9.1 0.61 \n", + "-14.18 1.8 \n", + "0.28 0.38 \n", + "None 0.62 \n", + "None 2.14 \n", + "-14.18 1.8 \n", + "None 1.26 \n", + "None 1.26 \n", + "-3.35 0.3 \n", + "1.49 1.28 \n", + "10000000.0 10000000.0 \n", + "-10.17 0.38 \n", + "None 0.88 \n", + "1.49 1.28 \n", + "-4.44 0.24 \n", + "None 0.88 \n", + "10000000.0 10000000.0 \n", + "None 6.05 \n", + "None 6.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 3.75 \n", + "None 5.01 \n", + "10000000.0 10000000.0 \n", + "None 1.02 \n", + "None 5.01 \n", + "None 5.01 \n", + "-16.79 1.43 \n", + "None 5.01 \n", + "-37.03 1.52 \n", + "-37.03 1.52 \n", + "-14.18 1.8 \n", + "-1.98 0.61 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 7.33 \n", + "5.26 0.76 \n", + "-8.36 0.58 \n", + "5.26 0.76 \n", + "None 5.46 \n", + "-1.98 0.65 \n", + "None 2.18 \n", + "5.26 0.76 \n", + "None 2.18 \n", + "-130.79 1.14 \n", + "None 2.28 \n", + "2.03 0.39 \n", + "1.02 0.58 \n", + "-13.27 0.43 \n", + "10000000.0 10000000.0 \n", + "-1.26 0.5 \n", + "-7.33 1.11 \n", + "None 0.62 \n", + "-14.03 6.74 \n", + "10000000.0 10000000.0 \n", + "None 2.16 \n", + "None 5.2 \n", + "10000000.0 10000000.0 \n", + "-0.13 0.73 \n", + "10000000.0 10000000.0 \n", + "10.32 1.49 \n", + "None 2.06 \n", + "None 2.06 \n", + "10.32 1.49 \n", + "-3.35 0.56 \n", + "-48.81 2.02 \n", + "-10.46 4.94 \n", + "-48.81 2.02 \n", + "-2.66 0.8 \n", + "-2.66 0.8 \n", + "-38.53 0.36 \n", + "-38.53 0.36 \n", + "10.66 0.78 \n", + "10000000.0 10000000.0 \n", + "-11.7 0.56 \n", + "None 5.52 \n", + "-96.0 7.26 \n", + "-1.62 0.3 \n", + "None 2.38 \n", + "None 1.7 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-11.8 1.28 \n", + "-6.96 0.87 \n", + "-13.64 0.72 \n", + "None 0.93 \n", + "-6.96 0.87 \n", + "176.21 7.46 \n", + "-0.4 0.77 \n", + "-5.77 1.2 \n", + "-0.4 0.77 \n", + "-0.4 0.77 \n", + "None 4.04 \n", + "None 5.05 \n", + "-0.4 0.77 \n", + "None 0.41 \n", + "-1.72 8.08 \n", + "-5.41 0.78 \n", + "None 3.52 \n", + "None 1.19 \n", + "-5.25 7.68 \n", + "None 1.19 \n", + "None 0.41 \n", + "4.19 0.3 \n", + "-15.72 0.65 \n", + "None 3.18 \n", + "-3.99 0.64 \n", + "10000000.0 10000000.0 \n", + "-3.99 0.64 \n", + "10000000.0 10000000.0 \n", + "-3.99 0.64 \n", + "10000000.0 10000000.0 \n", + "None 4.85 \n", + "None 4.85 \n", + "10000000.0 10000000.0 \n", + "-126.88 4.94 \n", + "10000000.0 10000000.0 \n", + "-3.35 0.56 \n", + "None 5.23 \n", + "-6.58 0.54 \n", + "-34.51 1.03 \n", + "-6.58 0.54 \n", + "-6.58 0.54 \n", + "-0.21 0.17 \n", + "-6.58 0.54 \n", + "-6.58 0.54 \n", + "-0.21 0.17 \n", + "-8.6 0.11 \n", + "7.34 1.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.1 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 8.27 \n", + "0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.72 \n", + "None 3.04 \n", + "-22.87 1.22 \n", + "None 3.04 \n", + "-1.7 0.41 \n", + "None 3.04 \n", + "None 3.04 \n", + "-1.7 0.41 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "-9.59 4.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.51 0.44 \n", + "2.51 0.44 \n", + "-38.87 1.13 \n", + "2.51 0.44 \n", + "None 2.18 \n", + "-8.73 0.76 \n", + "9.12 1.25 \n", + "10000000.0 10000000.0 \n", + "-2.12 0.7 \n", + "10000000.0 10000000.0 \n", + "None 1.94 \n", + "10000000.0 10000000.0 \n", + "None 1.94 \n", + "None 2.26 \n", + "-7.55 4.94 \n", + "-8.44 0.86 \n", + "-8.44 0.86 \n", + "10000000.0 10000000.0 \n", + "-5.18 0.58 \n", + "None 0.47 \n", + "-2.62 0.35 \n", + "None 0.68 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.28 0.33 \n", + "-226.68 0.57 \n", + "-1.81 0.19 \n", + "-2.62 0.35 \n", + "None 0.41 \n", + "0.68 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 5.23 \n", + "0.68 0.41 \n", + "9.12 1.25 \n", + "None 2.14 \n", + "10000000.0 10000000.0 \n", + "None 5.23 \n", + "None 5.53 \n", + "None 2.14 \n", + "10000000.0 10000000.0 \n", + "None 5.53 \n", + "-2.62 0.35 \n", + "-10.37 0.91 \n", + "10000000.0 10000000.0 \n", + "-121.17 0.81 \n", + "10000000.0 10000000.0 \n", + "None 0.41 \n", + "None 1.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.01 0.19 \n", + "0.07 0.35 \n", + "0.38 0.45 \n", + "10000000.0 10000000.0 \n", + "0.07 0.35 \n", + "None 1.26 \n", + "None 1.26 \n", + "10000000.0 10000000.0 \n", + "-6.06 0.47 \n", + "-6.06 0.47 \n", + "-2.34 0.39 \n", + "None 0.92 \n", + "-6.06 0.47 \n", + "None 0.91 \n", + "-131.16 1.7 \n", + "-3.05 0.39 \n", + "None 4.44 \n", + "-131.16 1.7 \n", + "-3.46 0.05 \n", + "-3.05 0.39 \n", + "None 9.83 \n", + "-13.11 5.07 \n", + "10000000.0 10000000.0 \n", + "-3.64 0.43 \n", + "None 9.83 \n", + "10000000.0 10000000.0 \n", + "None 2.21 \n", + "10000000.0 10000000.0 \n", + "-0.32 0.47 \n", + "None 2.29 \n", + "None 7.09 \n", + "None None \n", + "2.32 0.59 \n", + "None 1.43 \n", + "None 0.31 \n", + "2.32 0.59 \n", + "None 1.87 \n", + "-5.89 8.15 \n", + "None 0.31 \n", + "-28.45 3.54 \n", + "-83.95 6.39 \n", + "None 0.62 \n", + "4.21 0.8 \n", + "4.21 0.8 \n", + "4.21 0.8 \n", + "None 0.4 \n", + "-8.6 0.26 \n", + "-8.6 0.26 \n", + "-3.45 0.69 \n", + "None 2.98 \n", + "7.29 1.13 \n", + "7.29 1.13 \n", + "10000000.0 10000000.0 \n", + "None 5.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 5.57 \n", + "None 5.57 \n", + "-1.14 0.86 \n", + "-4.52 1.9 \n", + "None 1.32 \n", + "7.46 0.13 \n", + "10000000.0 10000000.0 \n", + "-1.09 0.51 \n", + "-6.35 0.31 \n", + "None 1.97 \n", + "-1.09 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.16 1.22 \n", + "-7.56 0.81 \n", + "-117.23 1.16 \n", + "10000000.0 10000000.0 \n", + "-62.5 1.36 \n", + "None 2.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.8 0.55 \n", + "-15.82 1.75 \n", + "10000000.0 10000000.0 \n", + "None 0.41 \n", + "-8.44 0.34 \n", + "-14.03 6.29 \n", + "-8.15 0.78 \n", + "-10.56 0.71 \n", + "-1.96 0.4 \n", + "1.07 0.36 \n", + "-35.92 1.49 \n", + "3.77 0.45 \n", + "None 3.63 \n", + "1.07 0.36 \n", + "None 4.85 \n", + "None 5.02 \n", + "None 4.85 \n", + "None 3.63 \n", + "-6.06 0.47 \n", + "None 5.02 \n", + "-0.02 0.21 \n", + "10000000.0 10000000.0 \n", + "-5.19 0.46 \n", + "-62.5 1.36 \n", + "-117.23 1.16 \n", + "None 6.04 \n", + "None 6.04 \n", + "None 6.04 \n", + "None 6.04 \n", + "None 5.2 \n", + "None 9.74 \n", + "None 0.08 \n", + "-4.04 0.7 \n", + "None 6.04 \n", + "None 5.2 \n", + "None 6.04 \n", + "-10.46 4.93 \n", + "3.8 0.92 \n", + "-0.17 0.28 \n", + "-0.17 0.28 \n", + "-0.17 0.28 \n", + "-17.73 2.41 \n", + "-22.96 1.98 \n", + "None 1.99 \n", + "-10.01 0.3 \n", + "-2.67 0.69 \n", + "-2.67 0.69 \n", + "None 4.17 \n", + "-38.53 0.36 \n", + "-10.01 0.3 \n", + "-10.01 0.3 \n", + "10000000.0 10000000.0 \n", + "-38.53 0.36 \n", + "None 4.43 \n", + "None 4.43 \n", + "-34.59 6.27 \n", + "None 4.17 \n", + "None 1.13 \n", + "-11.96 0.72 \n", + "-34.59 6.27 \n", + "-4.36 5.7 \n", + "None 2.25 \n", + "3.8 0.92 \n", + "-7.21 0.31 \n", + "None 2.25 \n", + "-2.43 0.33 \n", + "-10.46 4.93 \n", + "-7.21 0.31 \n", + "-10.46 4.93 \n", + "None 5.11 \n", + "10000000.0 10000000.0 \n", + "-4.87 0.46 \n", + "-2.43 0.33 \n", + "-4.87 0.46 \n", + "-18.13 0.71 \n", + "-25.88 10.89 \n", + "-25.88 10.89 \n", + "None 5.11 \n", + "10000000.0 10000000.0 \n", + "None 4.19 \n", + "None 4.19 \n", + "-112.92 1.45 \n", + "-94.12 0.75 \n", + "None 0.71 \n", + "-4.87 0.46 \n", + "10000000.0 10000000.0 \n", + "-9.57 0.15 \n", + "1.02 0.71 \n", + "10000000.0 10000000.0 \n", + "None 5.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.13 0.18 \n", + "None 7.23 \n", + "-4.22 1.25 \n", + "-2.13 0.18 \n", + "4.3 0.87 \n", + "None 7.23 \n", + "-97.2 0.8 \n", + "None 7.23 \n", + "10000000.0 10000000.0 \n", + "None 1.8 \n", + "None 1.8 \n", + "10000000.0 10000000.0 \n", + "-0.5 1.4 \n", + "-0.5 1.4 \n", + "None 1.34 \n", + "1.07 0.37 \n", + "-2.81 0.3 \n", + "-2.81 0.3 \n", + "1.07 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.4 \n", + "None 1.16 \n", + "None 1.7 \n", + "6.38 0.36 \n", + "None 4.4 \n", + "-4.36 5.47 \n", + "-3.59 0.5 \n", + "None 5.6 \n", + "None 5.6 \n", + "-104.68 1.14 \n", + "-104.68 1.14 \n", + "-8.52 5.62 \n", + "-0.21 0.17 \n", + "-4.36 5.47 \n", + "-0.28 0.38 \n", + "None 5.6 \n", + "-4.36 5.47 \n", + "-0.28 0.38 \n", + "-3.73 0.33 \n", + "10000000.0 10000000.0 \n", + "-14.39 6.27 \n", + "0.08 0.43 \n", + "-0.21 0.17 \n", + "None 4.27 \n", + "2.9 0.34 \n", + "2.9 0.34 \n", + "2.9 0.34 \n", + "None 5.06 \n", + "-8.82 1.37 \n", + "None 5.56 \n", + "-5.54 1.2 \n", + "None 5.56 \n", + "10000000.0 10000000.0 \n", + "None 5.06 \n", + "0.13 0.25 \n", + "None 4.41 \n", + "-5.54 1.2 \n", + "None 4.41 \n", + "5.79 0.37 \n", + "None 9.81 \n", + "-6.74 4.71 \n", + "-48.81 2.02 \n", + "-5.81 0.93 \n", + "None 4.41 \n", + "-5.81 0.93 \n", + "None 5.2 \n", + "-0.67 0.87 \n", + "10000000.0 10000000.0 \n", + "-4.18 0.29 \n", + "-4.18 0.29 \n", + "None 1.75 \n", + "-9.15 0.34 \n", + "-9.67 0.61 \n", + "None 0.71 \n", + "None 9.12 \n", + "-9.15 0.34 \n", + "-7.19 0.32 \n", + "None 2.87 \n", + "-9.15 0.34 \n", + "None 2.87 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "-6.8 0.72 \n", + "None 0.99 \n", + "None 3.97 \n", + "-6.8 1.41 \n", + "-6.8 1.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-118.19 0.76 \n", + "-9.57 0.81 \n", + "0.37 3.29 \n", + "-9.57 0.81 \n", + "-9.57 0.81 \n", + "-3.95 0.77 \n", + "None 5.49 \n", + "None 0.47 \n", + "-15.4 3.68 \n", + "None 0.47 \n", + "-4.36 5.35 \n", + "None 4.3 \n", + "1.3 1.08 \n", + "1.3 1.08 \n", + "10000000.0 10000000.0 \n", + "-6.68 4.98 \n", + "None 5.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.14 0.18 \n", + "None 9.8 \n", + "None 2.5 \n", + "-6.8 1.41 \n", + "10000000.0 10000000.0 \n", + "None 2.5 \n", + "None None \n", + "None 5.11 \n", + "None 5.11 \n", + "None 4.65 \n", + "None 3.86 \n", + "None 4.65 \n", + "-8.63 0.26 \n", + "-8.63 0.26 \n", + "None 3.86 \n", + "-2.21 8.07 \n", + "None 0.62 \n", + "10000000.0 10000000.0 \n", + "None 1.16 \n", + "None 1.16 \n", + "None 1.16 \n", + "-5.92 0.59 \n", + "-0.99 0.34 \n", + "-2.04 0.28 \n", + "-0.02 0.55 \n", + "-19.97 1.38 \n", + "-0.02 0.55 \n", + "-0.02 0.55 \n", + "0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "None 6.01 \n", + "0.18 0.36 \n", + "None 6.01 \n", + "-62.8 4.2 \n", + "-2.51 1.09 \n", + "-62.8 4.2 \n", + "-62.8 4.2 \n", + "-62.8 4.2 \n", + "10000000.0 10000000.0 \n", + "-2.51 1.09 \n", + "-5.63 0.68 \n", + "-62.8 4.2 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.15 0.78 \n", + "-4.05 0.56 \n", + "-8.15 0.78 \n", + "5.95 0.29 \n", + "10000000.0 10000000.0 \n", + "4.17 0.75 \n", + "-18.13 0.71 \n", + "-2.59 0.75 \n", + "None 5.43 \n", + "None 5.43 \n", + "-18.13 0.71 \n", + "-20.06 0.5 \n", + "-6.02 0.56 \n", + "-18.13 0.71 \n", + "-4.23 0.8 \n", + "-6.02 0.56 \n", + "-1.7 0.83 \n", + "-0.64 1.05 \n", + "-3.38 0.48 \n", + "-4.23 0.8 \n", + "15.54 0.35 \n", + "-1.7 0.83 \n", + "-1.7 0.83 \n", + "None 1.23 \n", + "0.15 0.59 \n", + "None None \n", + "-0.99 0.31 \n", + "-2.43 0.33 \n", + "9.66 0.82 \n", + "None 3.97 \n", + "None 3.97 \n", + "None 0.82 \n", + "None 3.97 \n", + "4.17 0.75 \n", + "4.17 0.75 \n", + "4.17 0.75 \n", + "-0.4 0.71 \n", + "None None \n", + "0.38 1.18 \n", + "-8.23 1.28 \n", + "3.22 5.93 \n", + "-9.45 0.26 \n", + "None 2.79 \n", + "10000000.0 10000000.0 \n", + "-14.27 0.34 \n", + "10000000.0 10000000.0 \n", + "-14.27 0.34 \n", + "20.66 5.23 \n", + "None 0.71 \n", + "0.15 0.59 \n", + "-7.11 0.85 \n", + "10000000.0 10000000.0 \n", + "-7.11 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.17 \n", + "10000000.0 10000000.0 \n", + "None 1.17 \n", + "10000000.0 10000000.0 \n", + "None 1.17 \n", + "10000000.0 10000000.0 \n", + "None 1.17 \n", + "10000000.0 10000000.0 \n", + "-8.12 0.28 \n", + "None 1.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.54 0.22 \n", + "-104.73 0.94 \n", + "None 2.28 \n", + "None 1.94 \n", + "-20.24 1.89 \n", + "-20.24 1.89 \n", + "None 2.28 \n", + "None 7.59 \n", + "None 2.28 \n", + "None 7.59 \n", + "17.29 0.78 \n", + "None 7.59 \n", + "None 1.94 \n", + "-13.11 5.07 \n", + "-13.11 5.07 \n", + "-13.11 5.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 5.43 \n", + "-6.35 0.31 \n", + "None 2.12 \n", + "-8.12 0.28 \n", + "None 5.06 \n", + "None 2.21 \n", + "-8.12 0.28 \n", + "-11.68 0.56 \n", + "0.59 0.63 \n", + "None 2.21 \n", + "None 5.43 \n", + "-2.27 1.28 \n", + "None 2.12 \n", + "-11.68 0.56 \n", + "None 11.17 \n", + "None 5.08 \n", + "-11.68 0.56 \n", + "-14.55 1.34 \n", + "None 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.71 5.06 \n", + "-15.71 5.06 \n", + "10000000.0 10000000.0 \n", + "-15.71 5.06 \n", + "None 1.36 \n", + "None 1.58 \n", + "3.8 0.94 \n", + "None 1.58 \n", + "None 3.85 \n", + "6.11 0.38 \n", + "6.11 0.38 \n", + "None 9.64 \n", + "6.11 0.38 \n", + "-4.73 0.54 \n", + "None 4.67 \n", + "None 4.67 \n", + "-225.22 7.13 \n", + "0.67 0.33 \n", + "0.67 0.33 \n", + "None 5.91 \n", + "-53.52 9.09 \n", + "-8.88 3.08 \n", + "-53.52 9.09 \n", + "10000000.0 10000000.0 \n", + "None 2.91 \n", + "0.2 0.71 \n", + "10000000.0 10000000.0 \n", + "-8.82 9.8 \n", + "0.2 0.71 \n", + "-0.76 0.87 \n", + "10000000.0 10000000.0 \n", + "None 9.79 \n", + "10000000.0 10000000.0 \n", + "-104.62 1.45 \n", + "10000000.0 10000000.0 \n", + "-104.62 1.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 6.51 \n", + "-0.99 0.31 \n", + "10000000.0 10000000.0 \n", + "None 4.3 \n", + "10000000.0 10000000.0 \n", + "-9.8 9.66 \n", + "10000000.0 10000000.0 \n", + "-9.8 9.66 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 10.25 \n", + "10000000.0 10000000.0 \n", + "-6.93 0.23 \n", + "0.13 0.25 \n", + "None 2.08 \n", + "None 6.0 \n", + "10000000.0 10000000.0 \n", + "-41.16 1.36 \n", + "6.11 0.38 \n", + "6.11 0.38 \n", + "6.11 0.38 \n", + "None 6.0 \n", + "None 2.88 \n", + "None 0.71 \n", + "None 1.44 \n", + "-9.67 0.58 \n", + "None 0.71 \n", + "None 5.9 \n", + "-2.79 0.87 \n", + "-2.79 0.87 \n", + "7.13 0.34 \n", + "-2.18 9.81 \n", + "-0.27 0.56 \n", + "-3.34 0.67 \n", + "10000000.0 10000000.0 \n", + "-15.16 5.5 \n", + "-19.81 0.31 \n", + "None 2.18 \n", + "-3.24 0.3 \n", + "-4.56 0.5 \n", + "1.77 1.18 \n", + "2.93 0.34 \n", + "1.77 1.18 \n", + "10000000.0 10000000.0 \n", + "-77.79 0.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.36 0.55 \n", + "-15.13 0.33 \n", + "2.36 0.55 \n", + "None 0.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.43 1.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "18.13 0.71 \n", + "-30.37 4.49 \n", + "-219.07 1.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-55.53 3.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.08 5.88 \n", + "-6.23 0.45 \n", + "-1.5 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 6.12 \n", + "None 6.13 \n", + "0.36 0.55 \n", + "-2.61 8.18 \n", + "10000000.0 10000000.0 \n", + "-2.61 7.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.3 0.8 \n", + "-109.25 0.25 \n", + "1.05 2.03 \n", + "-4.64 1.64 \n", + "5.08 1.19 \n", + "-20.85 7.97 \n", + "-23.15 7.9 \n", + "-0.45 5.35 \n", + "-0.48 0.46 \n", + "-5.17 0.46 \n", + "-5.13 0.46 \n", + "-5.45 0.46 \n", + "-5.68 0.46 \n", + "29.34 9.52 \n", + "28.02 7.91 \n", + "0.48 6.55 \n", + "-10.46 5.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-343.34 7.1 \n", + "-50.15 2.78 \n", + "-33.35 2.77 \n", + "-6.24 0.59 \n", + "10000000.0 10000000.0 \n", + "-13.48 10.35 \n", + "-35.32 0.65 \n", + "122.3 0.56 \n", + "107.12 0.95 \n", + "3.37 1.69 \n", + "63.34 2.32 \n", + "-65.27 0.77 \n", + "15.73 0.73 \n", + "6.62 2.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "65.07 3.82 \n", + "80.28 3.81 \n", + "10.87 0.19 \n", + "10000000.0 10000000.0 \n", + "20.18 1.97 \n", + "12.65 2.26 \n", + "10000000.0 10000000.0 \n", + "43.26 0.51 \n", + "10000000.0 10000000.0 \n", + "1.47 0.13 \n", + "-97.11 1.26 \n", + "43.13 0.99 \n", + "23.32 0.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "112.39 2.43 \n", + "20.7 2.63 \n", + "2.37 2.63 \n", + "-4.36 5.63 \n", + "12.03 3.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "33.85 1.4 \n", + "-27.09 1.0 \n", + "-29.6 4.86 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-25.93 0.84 \n", + "22.62 3.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "62.85 0.4 \n", + "57.91 1.0 \n", + "10.96 0.19 \n", + "-10.46 5.07 \n", + "10.96 0.19 \n", + "-10.46 5.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.13 3.42 \n", + "104.76 1.52 \n", + "84.14 1.27 \n", + "15.95 1.3 \n", + "69.03 1.27 \n", + "48.63 3.76 \n", + "-51.86 1.69 \n", + "43.92 2.9 \n", + "263.23 3.94 \n", + "-43.99 10.0 \n", + "-212.5 2.77 \n", + "-63.79 4.07 \n", + "1.21 1.13 \n", + "-1.6 2.61 \n", + "-23.14 2.72 \n", + "0.89 1.04 \n", + "57.15 5.87 \n", + "-64.92 0.48 \n", + "49.24 0.53 \n", + "117.96 6.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "272.02 4.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-51.55 1.37 \n", + "60.41 4.23 \n", + "29.34 2.26 \n", + "-15.81 2.05 \n", + "10000000.0 10000000.0 \n", + "13.71 1.71 \n", + "-37.41 0.17 \n", + "6.95 12.41 \n", + "-12.43 12.7 \n", + "56.26 10.72 \n", + "101.24 2.15 \n", + "-5.26 0.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "22.6 2.64 \n", + "-18.98 2.28 \n", + "-0.09 0.43 \n", + "-1.5 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-86.99 1.14 \n", + "-8.38 0.6 \n", + "1.24 0.54 \n", + "1.24 0.54 \n", + "1.24 0.54 \n", + "10000000.0 10000000.0 \n", + "-0.78 0.68 \n", + "-217.65 13.23 \n", + "3.73 0.29 \n", + "-13.11 5.52 \n", + "-3.53 6.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-165.93 6.53 \n", + "-3.22 0.5 \n", + "-55.7 2.54 \n", + "-26.91 4.54 \n", + "-2.36 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.14 0.3 \n", + "10000000.0 10000000.0 \n", + "1.56 0.16 \n", + "10000000.0 10000000.0 \n", + "-6.8 0.8 \n", + "0.33 1.5 \n", + "-16.61 1.52 \n", + "-1.26 0.55 \n", + "-6.58 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.52 1.33 \n", + "-12.47 1.14 \n", + "-6.98 0.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-40.11 2.62 \n", + "10000000.0 10000000.0 \n", + "363.33 1.55 \n", + "-80.83 6.11 \n", + "-82.88 11.78 \n", + "-57.83 1.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-114.68 1.11 \n", + "-94.62 0.83 \n", + "-9.17 0.44 \n", + "-6.39 0.52 \n", + "10000000.0 10000000.0 \n", + "4.5 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-29.84 0.3 \n", + "-5.72 0.54 \n", + "None 1.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.66 0.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.78 0.35 \n", + "10.66 0.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "-2.61 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.08 0.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.84 0.24 \n", + "55.11 0.84 \n", + "10000000.0 10000000.0 \n", + "-6.06 0.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.82 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.33 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.94 1.6 \n", + "0.33 1.5 \n", + "None 2.8 \n", + "None 0.35 \n", + "None 0.35 \n", + "None 0.27 \n", + "None 2.18 \n", + "None 0.71 \n", + "None 0.54 \n", + "None 0.71 \n", + "None 0.49 \n", + "10000000.0 10000000.0 \n", + "None 1.32 \n", + "None 2.77 \n", + "None 1.26 \n", + "None 0.49 \n", + "None 0.79 \n", + "None 0.34 \n", + "None 2.79 \n", + "None 4.3 \n", + "None 0.59 \n", + "None 1.34 \n", + "None 1.12 \n", + "None 1.02 \n", + "None 1.26 \n", + "None 1.51 \n", + "None 1.75 \n", + "10000000.0 10000000.0 \n", + "None 1.99 \n", + "None 1.88 \n", + "None 0.44 \n", + "None 0.54 \n", + "None 1.54 \n", + "None 0.78 \n", + "None 1.8 \n", + "None 1.8 \n", + "None 2.43 \n", + "None 1.87 \n", + "None 1.56 \n", + "None 1.26 \n", + "None 1.47 \n", + "None 0.69 \n", + "None 0.48 \n", + "None 0.38 \n", + "None 1.05 \n", + "None 2.18 \n", + "None 1.26 \n", + "10000000.0 10000000.0 \n", + "None 1.4 \n", + "10000000.0 10000000.0 \n", + "None 1.53 \n", + "None 2.73 \n", + "None 4.23 \n", + "None 2.6 \n", + "None 3.8 \n", + "None 3.8 \n", + "None 2.55 \n", + "None 0.41 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 1.02 \n", + "None 1.26 \n", + "None 0.48 \n", + "None 0.27 \n", + "None 3.89 \n", + "None 1.95 \n", + "None 3.9 \n", + "None 2.77 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "None 1.26 \n", + "None 1.67 \n", + "None 1.16 \n", + "None 1.16 \n", + "None 2.21 \n", + "None 1.63 \n", + "None 0.48 \n", + "None 3.78 \n", + "None 1.16 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "None 0.58 \n", + "None 3.89 \n", + "None 0.44 \n", + "None 0.34 \n", + "10000000.0 10000000.0 \n", + "None 1.17 \n", + "None 0.71 \n", + "None 1.33 \n", + "None 1.48 \n", + "None 0.71 \n", + "None 0.81 \n", + "None 0.4 \n", + "None 0.58 \n", + "None 2.5 \n", + "None 2.23 \n", + "None 1.27 \n", + "None 2.69 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-126.86 1.09 \n", + "-45.76 3.05 \n", + "10000000.0 10000000.0 \n", + "-2.64 1.79 \n", + "-17.56 1.57 \n", + "None 0.71 \n", + "-3.61 0.3 \n", + "-11.36 1.12 \n", + "524.69 0.78 \n", + "None 0.76 \n", + "None 2.18 \n", + "None 0.58 \n", + "None 0.44 \n", + "10000000.0 10000000.0 \n", + "None 2.21 \n", + "None 0.42 \n", + "None 2.14 \n", + "None 1.33 \n", + "None 1.33 \n", + "None 0.62 \n", + "None 0.48 \n", + "None 1.16 \n", + "None 1.13 \n", + "None 1.16 \n", + "None 2.26 \n", + "None 1.09 \n", + "None 1.54 \n", + "None 1.85 \n", + "None 4.16 \n", + "None 2.18 \n", + "None 2.56 \n", + "None 1.19 \n", + "10000000.0 10000000.0 \n", + "None 1.05 \n", + "10000000.0 10000000.0 \n", + "None 0.76 \n", + "None 2.79 \n", + "None 5.03 \n", + "None 6.41 \n", + "None 1.26 \n", + "None 0.49 \n", + "None 1.13 \n", + "None 1.5 \n", + "None 0.51 \n", + "None 1.1 \n", + "None 1.5 \n", + "None 1.02 \n", + "None 0.59 \n", + "None 1.26 \n", + "None 1.12 \n", + "10000000.0 10000000.0 \n", + "None 0.38 \n", + "None 0.86 \n", + "None 0.74 \n", + "None 1.97 \n", + "None 0.44 \n", + "None 0.59 \n", + "10000000.0 10000000.0 \n", + "None 1.53 \n", + "None 0.34 \n", + "None 1.47 \n", + "None 1.48 \n", + "None 1.0 \n", + "None 0.69 \n", + "None 1.94 \n", + "None 2.14 \n", + "10000000.0 10000000.0 \n", + "None 2.31 \n", + "None 2.56 \n", + "None 0.76 \n", + "None 1.29 \n", + "10000000.0 10000000.0 \n", + "None 2.14 \n", + "None 1.4 \n", + "None 1.65 \n", + "None 0.38 \n", + "None 1.3 \n", + "None 1.4 \n", + "None 0.58 \n", + "None 1.26 \n", + "None 1.22 \n", + "None 0.64 \n", + "None 1.06 \n", + "10000000.0 10000000.0 \n", + "None 1.9 \n", + "None 3.76 \n", + "None 0.54 \n", + "None 2.22 \n", + "None 4.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.12 \n", + "10000000.0 10000000.0 \n", + "None 1.84 \n", + "None 2.8 \n", + "None 0.47 \n", + "None 0.48 \n", + "None 1.06 \n", + "None 4.51 \n", + "None 0.54 \n", + "10000000.0 10000000.0 \n", + "None 1.03 \n", + "None 0.99 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "None 2.09 \n", + "None 0.88 \n", + "None 6.01 \n", + "None 1.91 \n", + "10000000.0 10000000.0 \n", + "None 0.98 \n", + "None 1.13 \n", + "None 1.94 \n", + "None 1.02 \n", + "None 8.53 \n", + "None 1.12 \n", + "None 0.44 \n", + "None 2.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.88 0.86 \n", + "10000000.0 10000000.0 \n", + "0.28 0.55 \n", + "10000000.0 10000000.0 \n", + "-1.61 0.87 \n", + "10000000.0 10000000.0 \n", + "-1.33 1.14 \n", + "10000000.0 10000000.0 \n", + "-0.79 0.84 \n", + "2.18 0.76 \n", + "-1.32 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.06 1.13 \n", + "None 4.23 \n", + "None 3.8 \n", + "-9.51 0.93 \n", + "-14.2 4.93 \n", + "10000000.0 10000000.0 \n", + "None 3.89 \n", + "None 5.71 \n", + "10000000.0 10000000.0 \n", + "None 2.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.54 \n", + "None 1.54 \n", + "None 0.55 \n", + "0.07 0.43 \n", + "2.41 0.42 \n", + "-0.04 0.43 \n", + "0.16 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.26 \n", + "-8.38 0.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.81 5.26 \n", + "-3.52 7.6 \n", + "0.63 0.76 \n", + "-4.79 2.64 \n", + "-2.68 2.62 \n", + "-1.85 0.91 \n", + "-2.06 0.8 \n", + "10000000.0 10000000.0 \n", + "-108.63 1.19 \n", + "-48.25 0.88 \n", + "-6.24 1.52 \n", + "-84.75 1.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "12.87 0.74 \n", + "None 1.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.98 1.35 \n", + "10000000.0 10000000.0 \n", + "-71.92 4.37 \n", + "24.75 18.35 \n", + "-8.68 0.26 \n", + "-8.68 0.26 \n", + "None 1.05 \n", + "None 1.05 \n", + "None 1.8 \n", + "None 0.55 \n", + "None 1.26 \n", + "None 1.06 \n", + "None 1.24 \n", + "None 1.24 \n", + "None 2.96 \n", + "None 0.71 \n", + "None 1.85 \n", + "None 1.85 \n", + "None 1.87 \n", + "None 1.87 \n", + "None 1.92 \n", + "None 1.92 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "None 0.68 \n", + "None 0.68 \n", + "None 1.74 \n", + "None 1.74 \n", + "None 2.01 \n", + "None 1.74 \n", + "None 1.74 \n", + "None 1.16 \n", + "None 1.48 \n", + "10000000.0 10000000.0 \n", + "None 1.56 \n", + "None 1.56 \n", + "None 1.65 \n", + "None 1.65 \n", + "None 1.63 \n", + "None 1.64 \n", + "None 1.63 \n", + "None 1.64 \n", + "-6.81 4.51 \n", + "10000000.0 10000000.0 \n", + "-56.22 1.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 6.12 \n", + "-344.88 2.28 \n", + "15.32 7.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 13.55 \n", + "10000000.0 10000000.0 \n", + "None 9.81 \n", + "None 9.79 \n", + "10000000.0 10000000.0 \n", + "None 9.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.34 13.23 \n", + "10000000.0 10000000.0 \n", + "-109.5 7.95 \n", + "-19.42 8.4 \n", + "-33.48 7.06 \n", + "-2.68 0.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.87 1.5 \n", + "-434.13 2.69 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-98.48 11.53 \n", + "-95.25 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.26 0.13 \n", + "-15.26 0.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.36 0.98 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.03 0.53 \n", + "10000000.0 10000000.0 \n", + "2.54 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.21 0.77 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.42 0.32 \n", + "None 1.92 \n", + "None 2.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-108.02 3.07 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.12 1.32 \n", + "-4.31 0.75 \n", + "-14.44 10.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.63 0.39 \n", + "-16.31 1.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "-2.43 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 2.2 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.3 \n", + "-29.57 10.72 \n", + "10000000.0 10000000.0 \n", + "14.3 38.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.72 10.36 \n", + "10000000.0 10000000.0 \n", + "-6.42 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "13.27 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.95 0.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.15 9.21 \n", + "9.21 6.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.84 5.0 \n", + "10000000.0 10000000.0 \n", + "-3.44 0.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.64 0.68 \n", + "None 1.98 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.23 5.07 \n", + "-6.07 0.85 \n", + "10000000.0 10000000.0 \n", + "-3.88 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-206.92 1.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-39.44 1.6 \n", + "-0.52 0.41 \n", + "-66.24 1.66 \n", + "-11.13 5.39 \n", + "-4.05 6.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.73 6.2 \n", + "10000000.0 10000000.0 \n", + "-109.83 1.21 \n", + "10000000.0 10000000.0 \n", + "-27.02 3.12 \n", + "3.92 0.44 \n", + "-2.19 0.53 \n", + "10000000.0 10000000.0 \n", + "27.26 3.81 \n", + "-121.75 2.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-20.4 4.74 \n", + "7.8 1.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.05 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.67 0.69 \n", + "0.14 0.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.76 6.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 9.66 \n", + "10000000.0 10000000.0 \n", + "-11.99 3.5 \n", + "-0.46 1.61 \n", + "9.53 8.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.19 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 2.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "148.82 2.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-37.55 2.49 \n", + "10000000.0 10000000.0 \n", + "18.0 8.15 \n", + "-7.85 0.58 \n", + "-13.2 1.07 \n", + "-4.36 6.19 \n", + "10000000.0 10000000.0 \n", + "-0.78 0.68 \n", + "-5.03 1.27 \n", + "10000000.0 10000000.0 \n", + "-1.7 4.71 \n", + "8.37 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-36.91 2.95 \n", + "10000000.0 10000000.0 \n", + "7.45 7.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.71 0.17 \n", + "4.44 0.24 \n", + "-71.82 10.24 \n", + "291.38 0.21 \n", + "-107.66 1.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.51 1.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-52.23 2.13 \n", + "10000000.0 10000000.0 \n", + "9.59 5.93 \n", + "10000000.0 10000000.0 \n", + "3.21 5.18 \n", + "-1.66 3.21 \n", + "-2.03 0.43 \n", + "-8.44 7.97 \n", + "-23.48 1.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 6.46 \n", + "10000000.0 10000000.0 \n", + "-17.46 1.06 \n", + "10000000.0 10000000.0 \n", + "-0.17 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.45 0.11 \n", + "-119.81 1.18 \n", + "-4.44 0.24 \n", + "-71.82 10.22 \n", + "10000000.0 10000000.0 \n", + "-16.31 4.28 \n", + "10000000.0 10000000.0 \n", + "-5.44 1.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-119.84 2.64 \n", + "10000000.0 10000000.0 \n", + "6.36 6.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.67 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.32 1.01 \n", + "-20.23 2.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-91.65 4.71 \n", + "2.98 0.46 \n", + "-60.58 3.88 \n", + "10000000.0 10000000.0 \n", + "-8.88 3.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.3 0.62 \n", + "-3.99 0.33 \n", + "10000000.0 10000000.0 \n", + "-14.03 5.23 \n", + "10000000.0 10000000.0 \n", + "-4.73 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.74 0.66 \n", + "-0.18 0.36 \n", + "6.79 1.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.9 0.42 \n", + "14.28 6.29 \n", + "-6.76 0.57 \n", + "10000000.0 10000000.0 \n", + "-14.03 9.91 \n", + "-38.41 1.13 \n", + "-0.18 0.36 \n", + "-104.63 0.81 \n", + "10000000.0 10000000.0 \n", + "-3.75 1.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.42 1.89 \n", + "10000000.0 10000000.0 \n", + "None 5.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 7.58 \n", + "0.45 1.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.67 0.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.25 7.09 \n", + "3.51 0.38 \n", + "-0.09 0.72 \n", + "10000000.0 10000000.0 \n", + "-3.53 7.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 10.06 \n", + "4.7 0.66 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-78.51 1.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.78 0.69 \n", + "-5.53 0.33 \n", + "-37.02 1.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.68 0.26 \n", + "-17.46 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.03 0.74 \n", + "290.64 0.37 \n", + "-1.7 5.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.76 6.66 \n", + "10000000.0 10000000.0 \n", + "7.19 0.32 \n", + "-52.69 3.81 \n", + "-1.7 5.88 \n", + "9.53 8.91 \n", + "10000000.0 10000000.0 \n", + "-58.99 4.64 \n", + "10000000.0 10000000.0 \n", + "0.38 0.45 \n", + "None None \n", + "-69.82 6.33 \n", + "10000000.0 10000000.0 \n", + "-3.27 0.66 \n", + "-2.24 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 7.21 \n", + "-11.94 1.67 \n", + "-4.65 0.59 \n", + "10000000.0 10000000.0 \n", + "7.75 0.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.71 2.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.33 5.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.05 0.47 \n", + "10000000.0 10000000.0 \n", + "1.39 1.2 \n", + "-4.31 0.75 \n", + "-7.55 0.58 \n", + "10000000.0 10000000.0 \n", + "-8.67 0.83 \n", + "-0.74 0.53 \n", + "9.17 3.7 \n", + "10000000.0 10000000.0 \n", + "4.46 0.24 \n", + "-4.89 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.02 0.56 \n", + "-3.53 6.04 \n", + "-3.86 0.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.17 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "47.66 1.83 \n", + "2.06 0.59 \n", + "-0.06 0.78 \n", + "16.11 3.29 \n", + "-97.47 2.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-89.08 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-104.6 7.95 \n", + "-4.36 6.71 \n", + "-1.94 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 5.19 \n", + "4.57 3.97 \n", + "16.01 1.05 \n", + "10000000.0 10000000.0 \n", + "-3.62 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "170.38 0.93 \n", + "10000000.0 10000000.0 \n", + "-32.75 1.05 \n", + "-81.93 9.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.37 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.95 0.61 \n", + "10000000.0 10000000.0 \n", + "-6.71 0.69 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-183.51 2.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.96 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.18 \n", + "10000000.0 10000000.0 \n", + "-15.02 0.79 \n", + "None 2.32 \n", + "-3.8 5.42 \n", + "508.46 1.96 \n", + "1.19 0.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.1 3.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.01 0.82 \n", + "-0.01 0.72 \n", + "10000000.0 10000000.0 \n", + "-16.03 4.87 \n", + "None None \n", + "-20.81 4.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.69 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.56 0.91 \n", + "-21.47 1.95 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.77 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.0 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.27 0.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-96.54 1.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-73.98 7.84 \n", + "10000000.0 10000000.0 \n", + "-5.72 1.34 \n", + "10000000.0 10000000.0 \n", + "9.59 6.29 \n", + "-20.77 3.0 \n", + "10000000.0 10000000.0 \n", + "-0.5 10.11 \n", + "10000000.0 10000000.0 \n", + "-4.54 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-416.26 1.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-83.96 1.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.33 1.01 \n", + "10000000.0 10000000.0 \n", + "-3.59 0.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.73 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.34 4.93 \n", + "0.01 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-104.91 13.08 \n", + "-4.31 6.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.96 6.86 \n", + "-5.73 0.54 \n", + "10000000.0 10000000.0 \n", + "12.89 2.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.33 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.4 5.46 \n", + "10000000.0 10000000.0 \n", + "13.42 4.79 \n", + "-37.79 1.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.73 1.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.08 0.87 \n", + "-0.43 0.31 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.35 \n", + "-12.82 1.08 \n", + "0.44 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "1.74 1.88 \n", + "-5.98 0.49 \n", + "-4.36 6.37 \n", + "-0.58 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-25.6 4.46 \n", + "-6.02 0.56 \n", + "10000000.0 10000000.0 \n", + "-121.2 1.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.48 0.61 \n", + "10000000.0 10000000.0 \n", + "-9.72 2.11 \n", + "-4.85 0.66 \n", + "10000000.0 10000000.0 \n", + "None 14.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 10.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.04 0.42 \n", + "10000000.0 10000000.0 \n", + "3.24 0.82 \n", + "-0.42 0.31 \n", + "144.0 1.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "-1.3 0.62 \n", + "10000000.0 10000000.0 \n", + "-13.83 4.44 \n", + "4.89 0.24 \n", + "4.89 0.25 \n", + "-8.68 0.27 \n", + "10000000.0 10000000.0 \n", + "-16.03 4.87 \n", + "10000000.0 10000000.0 \n", + "-29.0 1.62 \n", + "-3.28 0.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.71 1.53 \n", + "5.22 6.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-27.76 3.44 \n", + "-9.06 0.26 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.45 \n", + "5.31 1.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.15 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.29 14.59 \n", + "10000000.0 10000000.0 \n", + "43.0 4.13 \n", + "-5.33 6.34 \n", + "-1.25 0.68 \n", + "4.44 0.24 \n", + "-12.51 9.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 11.73 \n", + "10000000.0 10000000.0 \n", + "0.67 0.33 \n", + "-96.99 1.25 \n", + "10000000.0 10000000.0 \n", + "-13.83 5.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.57 0.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-106.01 0.91 \n", + "6.47 1.0 \n", + "-1.82 0.72 \n", + "3.83 2.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.24 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.68 0.26 \n", + "2.4 2.8 \n", + "10.71 1.01 \n", + "196.31 16.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.5 11.5 \n", + "-0.49 0.41 \n", + "10000000.0 10000000.0 \n", + "-117.49 4.26 \n", + "10000000.0 10000000.0 \n", + "-11.99 3.5 \n", + "10000000.0 10000000.0 \n", + "3.49 2.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.88 0.56 \n", + "None 18.72 \n", + "-49.17 0.22 \n", + "-11.13 5.03 \n", + "-3.13 0.83 \n", + "10000000.0 10000000.0 \n", + "-0.36 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.11 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-103.08 1.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.88 0.86 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.97 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.16 1.44 \n", + "10000000.0 10000000.0 \n", + "-13.14 1.07 \n", + "10000000.0 10000000.0 \n", + "-3.11 6.88 \n", + "10000000.0 10000000.0 \n", + "-2.23 0.53 \n", + "10000000.0 10000000.0 \n", + "-3.83 0.39 \n", + "-96.89 7.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.46 1.32 \n", + "10000000.0 10000000.0 \n", + "-12.17 1.91 \n", + "9.94 0.79 \n", + "-6.17 0.81 \n", + "332.62 1.19 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.48 0.85 \n", + "10000000.0 10000000.0 \n", + "3.76 6.27 \n", + "10000000.0 10000000.0 \n", + "-2.67 4.78 \n", + "-13.03 2.14 \n", + "4.88 0.24 \n", + "10000000.0 10000000.0 \n", + "-8.35 5.48 \n", + "-1.83 1.4 \n", + "-21.52 3.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.13 5.99 \n", + "-6.97 1.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.88 0.24 \n", + "10000000.0 10000000.0 \n", + "-57.29 1.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "4.83 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-80.62 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-34.73 0.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.05 1.48 \n", + "-2.18 0.53 \n", + "-194.4 1.6 \n", + "10000000.0 10000000.0 \n", + "-118.19 0.76 \n", + "-194.4 1.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.99 1.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.79 0.88 \n", + "10000000.0 10000000.0 \n", + "None 0.82 \n", + "10000000.0 10000000.0 \n", + "40.2 11.93 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "-5.37 1.97 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.45 0.64 \n", + "-1.0 0.7 \n", + "-1.7 10.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.66 1.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.8 24.23 \n", + "-4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.5 0.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.7 0.8 \n", + "-1.7 13.32 \n", + "-3.04 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.51 8.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.34 4.81 \n", + "10000000.0 10000000.0 \n", + "-7.15 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 14.28 \n", + "-6.61 0.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.67 0.45 \n", + "10000000.0 10000000.0 \n", + "-3.38 0.51 \n", + "-5.75 6.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 4.61 \n", + "-4.36 5.65 \n", + "10000000.0 10000000.0 \n", + "-51.7 4.61 \n", + "10000000.0 10000000.0 \n", + "-17.15 0.62 \n", + "5.32 1.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.76 6.29 \n", + "1.82 0.72 \n", + "-20.64 5.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 8.77 \n", + "10000000.0 10000000.0 \n", + "-8.18 1.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.27 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-63.25 1.24 \n", + "-3.04 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.19 0.53 \n", + "None 1.0 \n", + "-8.98 3.75 \n", + "10000000.0 10000000.0 \n", + "-6.53 4.99 \n", + "-104.34 10.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.04 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "-27.02 3.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.39 1.03 \n", + "10000000.0 10000000.0 \n", + "-3.61 6.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.82 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2700.1 9.1 \n", + "-4.36 5.36 \n", + "10000000.0 10000000.0 \n", + "-2.03 0.43 \n", + "-0.13 None \n", + "-0.46 5.17 \n", + "-1.75 0.57 \n", + "-3.88 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.92 0.96 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "64.4 1.3 \n", + "10000000.0 10000000.0 \n", + "-100.02 1.53 \n", + "4.17 2.24 \n", + "-55.98 1.29 \n", + "-75.53 1.19 \n", + "-45.99 1.18 \n", + "-44.44 0.96 \n", + "-43.3 1.34 \n", + "-87.68 1.21 \n", + "-10.37 0.2 \n", + "-61.47 0.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "51.88 0.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-34.49 0.77 \n", + "10000000.0 10000000.0 \n", + "-2.17 0.97 \n", + "-82.17 2.13 \n", + "-82.17 2.13 \n", + "-72.24 1.55 \n", + "-14.93 1.42 \n", + "10000000.0 10000000.0 \n", + "-2.28 0.8 \n", + "-82.45 2.12 \n", + "-37.89 2.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.52 3.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.52 3.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-106.19 2.3 \n", + "-20.25 1.89 \n", + "-70.71 1.84 \n", + "10000000.0 10000000.0 \n", + "-9.56 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-20.64 9.81 \n", + "-165.71 14.37 \n", + "-23.57 11.5 \n", + "-7.99 8.82 \n", + "-62.83 8.9 \n", + "-8.82 8.98 \n", + "-6.86 0.6 \n", + "10000000.0 10000000.0 \n", + "30.24 6.16 \n", + "-40.72 0.31 \n", + "30.24 6.28 \n", + "-23.57 11.57 \n", + "-69.88 6.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-87.49 1.56 \n", + "-30.19 1.41 \n", + "10000000.0 10000000.0 \n", + "-2.28 0.8 \n", + "-2.28 0.8 \n", + "-87.49 1.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-30.19 1.41 \n", + "-13.0 6.55 \n", + "-93.88 2.47 \n", + "-1.4 2.11 \n", + "-30.19 1.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.2 0.13 \n", + "12.32 2.3 \n", + "10000000.0 10000000.0 \n", + "6.72 1.46 \n", + "10000000.0 10000000.0 \n", + "-14.27 0.33 \n", + "-5.91 0.96 \n", + "2.65 1.62 \n", + "-93.87 1.66 \n", + "-8.54 1.22 \n", + "-5.4 0.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.83 1.83 \n", + "-59.15 1.73 \n", + "-10.14 0.49 \n", + "-19.46 None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-126.88 4.94 \n", + "-36.25 1.41 \n", + "-72.5 2.82 \n", + "-126.88 4.94 \n", + "-90.63 3.53 \n", + "6.03 0.68 \n", + "-5.68 0.5 \n", + "0.02 0.52 \n", + "-6.2 0.45 \n", + "-6.34 0.45 \n", + "-6.21 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.41 1.4 \n", + "3.4 1.4 \n", + "-61.38 1.7 \n", + "-1.92 0.86 \n", + "-9.13 2.07 \n", + "-90.32 1.25 \n", + "-62.31 1.42 \n", + "-10.69 0.39 \n", + "-2.28 0.8 \n", + "-6.44 0.46 \n", + "2.8 0.67 \n", + "-0.1 0.42 \n", + "-0.38 0.45 \n", + "None None \n", + "-6.44 1.51 \n", + "-4.96 0.47 \n", + "-0.47 0.79 \n", + "-4.97 0.47 \n", + "10000000.0 10000000.0 \n", + "5.59 0.72 \n", + "9.96 0.97 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "11.84 3.12 \n", + "-15.02 3.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-31.89 7.2 \n", + "-101.99 1.16 \n", + "-59.89 5.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-96.99 4.36 \n", + "-3.21 5.18 \n", + "0.71 0.38 \n", + "-49.21 0.53 \n", + "-4.93 0.53 \n", + "-3.91 0.53 \n", + "56.83 0.8 \n", + "-32.0 1.07 \n", + "-25.58 1.37 \n", + "-32.71 6.13 \n", + "-0.84 0.86 \n", + "-97.02 1.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.51 5.86 \n", + "-6.93 5.8 \n", + "-30.03 2.42 \n", + "-48.62 5.64 \n", + "-17.98 6.89 \n", + "44.36 5.45 \n", + "7.08 1.09 \n", + "16.35 0.56 \n", + "56.83 0.8 \n", + "10000000.0 10000000.0 \n", + "-13.25 1.06 \n", + "-3.91 0.53 \n", + "-93.4 12.83 \n", + "10.82 0.19 \n", + "10000000.0 10000000.0 \n", + "-63.65 10.04 \n", + "-49.27 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "16.35 0.56 \n", + "16.35 0.56 \n", + "56.83 0.8 \n", + "-103.05 1.68 \n", + "3.91 3.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.08 1.34 \n", + "-8.88 2.64 \n", + "-4.35 0.59 \n", + "-7.76 1.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-103.68 7.31 \n", + "10000000.0 10000000.0 \n", + "9.19 3.93 \n", + "-0.28 0.37 \n", + "-103.68 7.3 \n", + "-83.06 1.82 \n", + "-17.58 0.93 \n", + "-17.58 0.93 \n", + "-103.68 7.3 \n", + "-11.02 5.36 \n", + "10000000.0 10000000.0 \n", + "-35.09 10.31 \n", + "-1.1 0.51 \n", + "-14.03 5.56 \n", + "-5.42 0.66 \n", + "-5.4 1.05 \n", + "-7.28 1.01 \n", + "10000000.0 10000000.0 \n", + "-189.98 12.73 \n", + "-97.2 0.8 \n", + "-104.34 8.85 \n", + "-90.27 9.84 \n", + "-90.27 9.19 \n", + "-90.27 9.19 \n", + "-5.31 7.18 \n", + "0.37 6.86 \n", + "8.04 4.9 \n", + "9.58 3.83 \n", + "9.58 3.83 \n", + "10.67 0.2 \n", + "10.7 0.2 \n", + "-71.06 9.71 \n", + "0.37 6.32 \n", + "-85.45 8.77 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-61.47 0.2 \n", + "-71.84 0.2 \n", + "-65.42 0.74 \n", + "-71.84 0.2 \n", + "-94.13 0.75 \n", + "-59.71 9.4 \n", + "0.37 5.32 \n", + "-14.03 9.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.95 0.46 \n", + "-8.12 0.28 \n", + "-10.37 0.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-93.67 1.62 \n", + "-94.13 0.75 \n", + "-94.13 0.75 \n", + "-94.13 0.75 \n", + "-10.37 0.2 \n", + "-10.37 0.2 \n", + "-61.86 0.2 \n", + "-61.86 0.2 \n", + "-61.86 0.2 \n", + "-95.07 0.74 \n", + "-94.13 0.75 \n", + "-94.13 0.75 \n", + "-94.13 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.48 0.85 \n", + "6.48 0.85 \n", + "6.48 0.85 \n", + "6.48 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-27.47 1.38 \n", + "0.89 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-121.63 13.08 \n", + "1.17 0.54 \n", + "1.17 0.54 \n", + "1.17 0.54 \n", + "5.22 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.56 1.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-23.05 1.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-101.85 2.55 \n", + "-86.3 6.23 \n", + "-104.6 7.94 \n", + "-94.39 12.23 \n", + "-94.39 12.28 \n", + "-102.35 1.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.96 0.63 \n", + "-43.91 1.77 \n", + "-34.5 4.44 \n", + "2.07 0.78 \n", + "-2.24 0.52 \n", + "-12.84 1.03 \n", + "-5.57 1.11 \n", + "-10.46 5.37 \n", + "-0.9 0.57 \n", + "6.66 1.06 \n", + "6.83 0.98 \n", + "6.59 0.98 \n", + "2.43 1.05 \n", + "2.78 0.41 \n", + "-2.84 0.54 \n", + "-8.8 0.77 \n", + "-2.66 0.8 \n", + "10000000.0 10000000.0 \n", + "48.81 2.02 \n", + "10000000.0 10000000.0 \n", + "-5.33 6.98 \n", + "4.83 0.46 \n", + "-4.18 0.32 \n", + "4.89 0.25 \n", + "-8.68 0.27 \n", + "-3.79 0.33 \n", + "-94.13 0.75 \n", + "0.77 0.79 \n", + "-0.99 0.92 \n", + "-0.68 0.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.22 0.27 \n", + "-72.69 8.54 \n", + "4.68 6.03 \n", + "-4.4 0.34 \n", + "-47.96 2.47 \n", + "-21.22 2.22 \n", + "-44.72 2.82 \n", + "3.8 0.5 \n", + "-16.82 1.56 \n", + "-73.98 0.94 \n", + "10000000.0 10000000.0 \n", + "-74.56 1.74 \n", + "-45.24 12.09 \n", + "-452.97 5.79 \n", + "-2.74 0.45 \n", + "-4.36 10.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-116.99 2.25 \n", + "-194.4 1.6 \n", + "-45.31 3.93 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "-109.79 0.86 \n", + "-189.98 12.77 \n", + "-90.63 6.26 \n", + "-83.95 6.36 \n", + "-15.4 3.63 \n", + "-90.63 6.54 \n", + "-83.95 6.64 \n", + "-15.4 4.09 \n", + "-116.04 1.19 \n", + "10000000.0 10000000.0 \n", + "-1.3 0.9 \n", + "-2.68 0.35 \n", + "10000000.0 10000000.0 \n", + "-11.31 1.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.28 0.82 \n", + "-4.71 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "-87.04 0.89 \n", + "-131.19 2.46 \n", + "-175.24 1.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-43.05 3.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-27.76 3.44 \n", + "-8.72 10.49 \n", + "-4.36 6.28 \n", + "-4.36 6.32 \n", + "10000000.0 10000000.0 \n", + "-46.16 2.48 \n", + "-57.55 3.98 \n", + "-60.52 3.78 \n", + "-7.15 0.85 \n", + "-46.99 1.58 \n", + "-46.99 1.58 \n", + "-40.69 3.32 \n", + "-4.92 0.43 \n", + "-36.19 1.56 \n", + "-58.76 2.61 \n", + "-28.06 1.57 \n", + "-50.98 2.52 \n", + "-25.34 3.31 \n", + "-61.65 3.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.61 \n", + "1.42 0.62 \n", + "1.83 0.5 \n", + "1.83 0.5 \n", + "-35.96 1.31 \n", + "-4.08 0.85 \n", + "-3.61 0.51 \n", + "-3.38 0.51 \n", + "10000000.0 10000000.0 \n", + "-22.2 1.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.91 1.09 \n", + "-14.03 6.32 \n", + "-5.81 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.46 0.54 \n", + "-3.91 1.48 \n", + "-2.46 0.54 \n", + "4.75 1.92 \n", + "-2.43 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "8.72 6.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.68 0.65 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.6 0.3 \n", + "-2.17 0.61 \n", + "-2.5 1.02 \n", + "-2.08 0.98 \n", + "2.08 0.7 \n", + "-1.52 0.4 \n", + "-14.03 4.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.64 1.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.42 \n", + "-13.08 15.1 \n", + "-2.31 0.63 \n", + "-40.99 5.86 \n", + "10000000.0 10000000.0 \n", + "-6.28 0.52 \n", + "-6.17 0.87 \n", + "-25.34 3.62 \n", + "10000000.0 10000000.0 \n", + "-39.25 1.74 \n", + "-39.25 1.74 \n", + "-39.25 1.74 \n", + "-95.39 10.03 \n", + "-76.89 10.42 \n", + "42.65 3.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.65 0.54 \n", + "5.63 1.0 \n", + "-7.02 0.87 \n", + "-15.9 0.82 \n", + "10000000.0 10000000.0 \n", + "3.71 2.4 \n", + "70.87 7.36 \n", + "97.54 10.2 \n", + "0.98 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.03 None \n", + "None None \n", + "-0.34 0.82 \n", + "-0.9 0.62 \n", + "-51.08 5.3 \n", + "-121.63 13.08 \n", + "-112.81 13.1 \n", + "-92.48 10.27 \n", + "-26.19 1.78 \n", + "-48.38 3.99 \n", + "-32.32 2.82 \n", + "10000000.0 10000000.0 \n", + "0.6 0.66 \n", + "-0.9 0.91 \n", + "10.66 0.78 \n", + "1.56 0.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.13 0.57 \n", + "-5.73 0.54 \n", + "-5.73 0.54 \n", + "-3.58 0.52 \n", + "10000000.0 10000000.0 \n", + "1.07 8.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 9.25 \n", + "-126.88 4.94 \n", + "10000000.0 10000000.0 \n", + "-4.16 0.51 \n", + "-2.08 0.98 \n", + "-2.08 0.98 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "13.11 0.65 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "124.21 13.22 \n", + "10.66 0.78 \n", + "10.66 0.78 \n", + "10.66 0.78 \n", + "-194.4 1.6 \n", + "-1.73 0.73 \n", + "1.3 2.68 \n", + "-1.7 0.83 \n", + "-3.88 0.56 \n", + "-3.83 0.39 \n", + "-0.4 0.68 \n", + "-0.78 0.68 \n", + "-0.78 0.68 \n", + "-18.59 13.93 \n", + "-36.23 10.13 \n", + "-37.41 0.17 \n", + "-11.23 11.46 \n", + "-11.23 13.0 \n", + "-4.51 0.33 \n", + "0.31 0.55 \n", + "-2.16 0.33 \n", + "-1.84 0.3 \n", + "-1.09 0.51 \n", + "None 11.37 \n", + "2.81 None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.58 0.52 \n", + "2.81 None \n", + "-87.62 0.79 \n", + "-8.68 0.26 \n", + "-109.01 2.4 \n", + "-116.31 2.29 \n", + "-91.16 1.33 \n", + "10000000.0 10000000.0 \n", + "-60.14 3.84 \n", + "-51.32 3.94 \n", + "0.38 0.45 \n", + "-4.36 5.78 \n", + "-4.36 5.66 \n", + "-13.19 4.67 \n", + "-2.66 0.8 \n", + "-3.92 0.44 \n", + "-0.06 0.35 \n", + "-76.61 4.54 \n", + "10000000.0 10000000.0 \n", + "-4.9 2.12 \n", + "-2.39 0.44 \n", + "-1.7 5.51 \n", + "-1.7 5.66 \n", + "3.45 2.4 \n", + "-15.62 0.83 \n", + "10000000.0 10000000.0 \n", + "-26.84 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-69.98 2.5 \n", + "-65.16 2.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "-109.79 0.86 \n", + "-207.0 1.57 \n", + "-108.63 1.2 \n", + "-76.98 6.59 \n", + "-9.8 7.99 \n", + "-23.57 10.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.83 0.58 \n", + "-7.85 0.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.24 0.59 \n", + "-7.15 0.85 \n", + "8.81 0.51 \n", + "-2.63 0.42 \n", + "-10.38 1.41 \n", + "-10.38 1.41 \n", + "-6.58 0.38 \n", + "10000000.0 10000000.0 \n", + "-10.6 6.01 \n", + "31.8 7.26 \n", + "-82.42 8.99 \n", + "-8.61 7.11 \n", + "-5.59 0.48 \n", + "-14.5 0.44 \n", + "-5.86 0.43 \n", + "-12.96 4.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.37 0.2 \n", + "-2.6 0.56 \n", + "0.53 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.12 0.75 \n", + "-104.34 13.18 \n", + "10000000.0 10000000.0 \n", + "-94.13 0.75 \n", + "-104.63 0.81 \n", + "-118.19 0.76 \n", + "-316.94 2.26 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "-4.36 5.71 \n", + "-4.36 5.76 \n", + "-8.72 10.16 \n", + "-5.86 0.43 \n", + "-61.65 4.06 \n", + "-8.88 4.33 \n", + "-7.49 1.31 \n", + "-6.71 0.31 \n", + "-9.31 8.63 \n", + "10000000.0 10000000.0 \n", + "-18.84 7.48 \n", + "-11.2 0.52 \n", + "10000000.0 10000000.0 \n", + "3.56 10.09 \n", + "-52.55 3.91 \n", + "-28.34 2.97 \n", + "-43.05 3.68 \n", + "10000000.0 10000000.0 \n", + "-52.55 3.91 \n", + "10000000.0 10000000.0 \n", + "-27.76 3.44 \n", + "-35.58 2.64 \n", + "-50.05 1.65 \n", + "-64.27 3.09 \n", + "-58.99 4.64 \n", + "-44.58 2.57 \n", + "-51.7 2.63 \n", + "-6.77 0.68 \n", + "10000000.0 10000000.0 \n", + "-41.93 4.06 \n", + "-41.93 4.06 \n", + "10000000.0 10000000.0 \n", + "-3.7 0.46 \n", + "-14.84 1.99 \n", + "-116.6 12.88 \n", + "-95.39 10.03 \n", + "-44.02 5.49 \n", + "-121.63 13.08 \n", + "-143.27 15.93 \n", + "10000000.0 10000000.0 \n", + "-97.0 7.45 \n", + "-29.37 1.75 \n", + "-96.33 7.51 \n", + "-112.81 13.1 \n", + "-95.39 10.03 \n", + "-94.96 10.1 \n", + "-29.12 3.6 \n", + "-187.6 0.76 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "-94.12 0.75 \n", + "-94.12 0.75 \n", + "-104.62 0.81 \n", + "-198.75 1.53 \n", + "-198.75 1.53 \n", + "-198.75 1.53 \n", + "4.89 0.25 \n", + "4.89 0.25 \n", + "4.89 0.25 \n", + "4.89 0.25 \n", + "10000000.0 10000000.0 \n", + "21.79 0.51 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "-56.95 4.65 \n", + "-57.29 4.63 \n", + "10000000.0 10000000.0 \n", + "-19.2 5.32 \n", + "-19.76 5.12 \n", + "2.46 0.53 \n", + "2.86 0.44 \n", + "2.86 0.44 \n", + "2.59 0.57 \n", + "2.87 0.44 \n", + "2.46 0.53 \n", + "2.86 0.44 \n", + "2.86 0.44 \n", + "10000000.0 10000000.0 \n", + "-0.7 0.7 \n", + "-0.7 0.7 \n", + "-0.66 0.33 \n", + "-3.0 0.7 \n", + "-2.04 1.57 \n", + "1.49 1.65 \n", + "-2.04 1.57 \n", + "1.49 1.65 \n", + "-0.61 0.4 \n", + "None None \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "0.4 0.21 \n", + "-0.28 0.37 \n", + "-0.28 0.37 \n", + "-3.15 0.75 \n", + "10000000.0 10000000.0 \n", + "0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "-6.77 0.68 \n", + "-33.35 2.77 \n", + "10000000.0 10000000.0 \n", + "-16.29 4.42 \n", + "-16.29 4.42 \n", + "-37.17 1.61 \n", + "-50.05 1.65 \n", + "-50.05 1.65 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-66.5 6.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-39.25 1.74 \n", + "-24.4 2.95 \n", + "-7.07 7.42 \n", + "None None \n", + "-13.32 1.05 \n", + "-28.26 6.33 \n", + "33.7 1.0 \n", + "-4.2 1.33 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "-0.28 0.37 \n", + "0.74 7.13 \n", + "8.9 0.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "16.6 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.45 1.21 \n", + "-5.39 0.93 \n", + "-3.93 1.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.63 4.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.88 1.41 \n", + "3.72 0.43 \n", + "10000000.0 10000000.0 \n", + "3.57 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.96 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.48 0.43 \n", + "0.48 0.43 \n", + "0.48 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-114.39 1.15 \n", + "-104.86 1.27 \n", + "10000000.0 10000000.0 \n", + "-114.39 1.15 \n", + "-28.01 1.11 \n", + "-6.06 7.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.1 0.69 \n", + "-5.1 0.69 \n", + "10000000.0 10000000.0 \n", + "-15.82 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.98 1.01 \n", + "-94.13 0.75 \n", + "-104.63 0.81 \n", + "-118.19 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.73 2.41 \n", + "-17.73 2.41 \n", + "-3.53 5.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.28 0.52 \n", + "-5.33 5.03 \n", + "10000000.0 10000000.0 \n", + "1.4 1.03 \n", + "1.4 1.03 \n", + "-5.33 4.97 \n", + "-5.33 4.97 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.59 0.56 \n", + "-3.38 1.0 \n", + "-13.21 1.07 \n", + "10000000.0 10000000.0 \n", + "0.18 0.36 \n", + "-0.02 0.26 \n", + "-2.39 0.75 \n", + "-12.79 4.51 \n", + "-16.73 10.87 \n", + "-120.27 1.5 \n", + "-7.1 0.31 \n", + "10000000.0 10000000.0 \n", + "14.83 1.53 \n", + "-2.84 0.54 \n", + "9.19 3.93 \n", + "10000000.0 10000000.0 \n", + "-3.3 0.32 \n", + "-2.6 0.3 \n", + "-3.35 0.3 \n", + "0.94 0.31 \n", + "-5.28 0.33 \n", + "-6.83 0.33 \n", + "-3.59 0.11 \n", + "-4.22 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-114.16 1.07 \n", + "-201.94 0.9 \n", + "6.53 0.88 \n", + "-10.8 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.06 7.25 \n", + "4.57 0.33 \n", + "-97.2 0.8 \n", + "-85.38 7.42 \n", + "-5.33 6.16 \n", + "-0.34 0.55 \n", + "9.11 0.92 \n", + "-52.6 1.06 \n", + "0.28 0.89 \n", + "50.23 1.04 \n", + "-5.48 0.59 \n", + "6.49 1.15 \n", + "-43.82 2.13 \n", + "3.81 0.88 \n", + "-21.4 4.1 \n", + "-24.65 5.4 \n", + "-5.59 8.16 \n", + "-5.59 8.16 \n", + "-24.04 5.51 \n", + "-0.12 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-22.93 1.05 \n", + "-19.56 1.68 \n", + "-21.33 1.47 \n", + "0.18 0.36 \n", + "-8.84 0.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-24.65 5.4 \n", + "-5.59 8.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.5 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "57.15 4.95 \n", + "23.32 0.94 \n", + "57.15 4.95 \n", + "23.32 0.94 \n", + "279.62 4.08 \n", + "110.74 2.59 \n", + "87.43 2.46 \n", + "143.71 3.08 \n", + "-18.1 2.41 \n", + "-49.26 0.53 \n", + "-1.36 0.59 \n", + "-12.31 0.75 \n", + "-37.41 0.17 \n", + "10000000.0 10000000.0 \n", + "-3.87 0.56 \n", + "-16.89 1.41 \n", + "-12.45 4.37 \n", + "-12.45 4.37 \n", + "-0.28 0.37 \n", + "-97.2 0.8 \n", + "-36.19 1.56 \n", + "4.51 0.45 \n", + "10000000.0 10000000.0 \n", + "-110.63 1.48 \n", + "-18.76 1.3 \n", + "-0.28 0.38 \n", + "-0.24 0.54 \n", + "6.62 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-38.87 1.13 \n", + "-84.12 14.62 \n", + "-120.14 4.77 \n", + "0.35 0.41 \n", + "43.9 2.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-40.99 5.86 \n", + "-40.99 5.86 \n", + "-54.24 5.78 \n", + "-54.24 5.78 \n", + "-28.5 6.21 \n", + "-45.42 5.88 \n", + "-81.88 7.0 \n", + "1.24 0.54 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "-0.09 0.55 \n", + "1.24 0.54 \n", + "-22.74 4.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-316.76 14.16 \n", + "-279.31 14.17 \n", + "95.41 1.42 \n", + "402.7 3.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-37.41 0.17 \n", + "-37.41 0.17 \n", + "-37.41 0.17 \n", + "-10.37 0.2 \n", + "-10.37 0.2 \n", + "-10.37 0.2 \n", + "-61.47 0.2 \n", + "-61.47 0.2 \n", + "-61.47 0.2 \n", + "10000000.0 10000000.0 \n", + "-8.68 0.26 \n", + "-0.34 0.34 \n", + "-2.62 0.35 \n", + "12.31 0.75 \n", + "8.76 1.96 \n", + "15.25 0.71 \n", + "-15.54 0.35 \n", + "-15.54 0.35 \n", + "-15.54 0.35 \n", + "-15.54 0.35 \n", + "-15.54 0.35 \n", + "-15.54 0.35 \n", + "None None \n", + "None None \n", + "-15.54 0.35 \n", + "-15.54 0.35 \n", + "-15.54 0.35 \n", + "-15.54 0.35 \n", + "-26.34 1.67 \n", + "-26.34 1.67 \n", + "-26.34 1.67 \n", + "-26.34 1.67 \n", + "-48.09 0.98 \n", + "-46.62 0.99 \n", + "-48.09 0.98 \n", + "-46.62 0.99 \n", + "-10.82 0.19 \n", + "-10.82 0.19 \n", + "-0.34 0.34 \n", + "-386.17 1.91 \n", + "-103.68 7.31 \n", + "-15.54 0.35 \n", + "-100.63 1.78 \n", + "10000000.0 10000000.0 \n", + "-15.54 0.35 \n", + "10000000.0 10000000.0 \n", + "-8.68 0.26 \n", + "-8.68 0.26 \n", + "206.94 6.73 \n", + "206.94 6.73 \n", + "-1.6 5.24 \n", + "-1.6 5.24 \n", + "3.76 8.01 \n", + "-5.25 7.14 \n", + "-5.75 5.05 \n", + "26.05 1.39 \n", + "-10.8 0.8 \n", + "12.19 0.77 \n", + "12.19 0.77 \n", + "389.3 1.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.9 0.8 \n", + "0.88 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.28 \n", + "None None \n", + "0.28 0.38 \n", + "-20.33 6.2 \n", + "10000000.0 10000000.0 \n", + "-3.7 0.46 \n", + "15.54 0.35 \n", + "-23.57 10.59 \n", + "None None \n", + "16.14 0.35 \n", + "43.14 4.13 \n", + "555.27 3.14 \n", + "40.48 0.31 \n", + "10000000.0 10000000.0 \n", + "-126.88 4.94 \n", + "181.04 7.8 \n", + "-141.91 0.81 \n", + "-4.85 0.53 \n", + "-6.05 0.57 \n", + "10000000.0 10000000.0 \n", + "85.14 7.08 \n", + "10000000.0 10000000.0 \n", + "-3.91 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1107.52 4.1 \n", + "1117.05 4.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-95.07 0.74 \n", + "-98.05 0.82 \n", + "-98.05 0.82 \n", + "10000000.0 10000000.0 \n", + "-120.3 13.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-121.63 13.08 \n", + "10000000.0 10000000.0 \n", + "-122.3 13.03 \n", + "0.28 0.38 \n", + "0.28 0.38 \n", + "0.28 0.38 \n", + "0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.91 0.53 \n", + "-3.91 0.53 \n", + "-3.91 0.53 \n", + "-3.91 0.53 \n", + "-3.91 0.53 \n", + "-3.91 0.53 \n", + "-3.91 0.53 \n", + "-3.91 0.53 \n", + "-3.91 0.53 \n", + "-3.91 0.53 \n", + "-3.91 0.53 \n", + "-3.91 0.53 \n", + "-3.91 0.53 \n", + "-3.91 0.53 \n", + "-3.91 0.53 \n", + "-3.91 0.53 \n", + "2.63 0.42 \n", + "-81.81 0.81 \n", + "None None \n", + "-12.8 0.49 \n", + "-22.33 1.11 \n", + "-1.17 1.12 \n", + "-1.99 0.55 \n", + "9.52 13.13 \n", + "-49.54 3.37 \n", + "-49.47 3.37 \n", + "-2.62 0.35 \n", + "1.06 0.52 \n", + "10000000.0 10000000.0 \n", + "-4.06 0.3 \n", + "-4.06 0.3 \n", + "10000000.0 10000000.0 \n", + "-50.31 3.85 \n", + "10000000.0 10000000.0 \n", + "-95.07 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.35 0.75 \n", + "1.25 0.7 \n", + "-12.31 0.36 \n", + "-12.31 0.36 \n", + "-6.11 2.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.61 7.21 \n", + "-120.41 4.05 \n", + "-122.57 1.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "31.19 0.99 \n", + "31.04 0.99 \n", + "-77.75 2.24 \n", + "-77.9 2.24 \n", + "23.38 0.94 \n", + "16.52 2.22 \n", + "-11.66 2.02 \n", + "-121.99 3.96 \n", + "-12.27 3.31 \n", + "-14.12 3.34 \n", + "-14.12 3.2 \n", + "-25.01 3.26 \n", + "-23.32 1.22 \n", + "-77.06 12.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-106.01 0.91 \n", + "-105.98 0.91 \n", + "-0.68 6.96 \n", + "-0.68 7.07 \n", + "-4.36 5.92 \n", + "36.55 4.25 \n", + "82.93 4.36 \n", + "422.3 2.1 \n", + "2.91 0.34 \n", + "-4.89 0.25 \n", + "-4.88 0.25 \n", + "-104.73 0.94 \n", + "-107.2 0.94 \n", + "-4.36 5.17 \n", + "-4.36 5.17 \n", + "-4.36 5.35 \n", + "-4.36 5.35 \n", + "-4.36 7.34 \n", + "-49.24 0.53 \n", + "-49.25 0.53 \n", + "-49.25 0.53 \n", + "-49.25 0.53 \n", + "-2.66 0.35 \n", + "-49.28 0.53 \n", + "70.95 0.52 \n", + "435.71 1.23 \n", + "-210.88 0.26 \n", + "-0.3 0.17 \n", + "-10.82 2.5 \n", + "12.01 1.82 \n", + "-7.4 1.23 \n", + "-11.45 0.74 \n", + "-0.32 0.56 \n", + "-13.29 1.2 \n", + "-36.96 5.05 \n", + "-39.48 4.94 \n", + "-40.21 5.13 \n", + "-63.18 5.47 \n", + "2.1 4.19 \n", + "-27.14 1.78 \n", + "-26.91 1.75 \n", + "-16.57 1.1 \n", + "-16.57 1.1 \n", + "-105.99 0.91 \n", + "-105.98 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.41 0.38 \n", + "-30.21 2.27 \n", + "-12.13 0.98 \n", + "-3.09 6.99 \n", + "-12.31 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "-83.06 1.82 \n", + "-96.39 0.82 \n", + "1092.32 3.83 \n", + "2.17 0.68 \n", + "-20.33 6.2 \n", + "None None \n", + "0.46 0.38 \n", + "15.72 0.35 \n", + "7.8 0.36 \n", + "-111.26 1.46 \n", + "0.2 0.74 \n", + "1.43 0.16 \n", + "10000000.0 10000000.0 \n", + "-28.4 5.42 \n", + "23.38 0.94 \n", + "-37.48 0.17 \n", + "-37.49 0.17 \n", + "23.39 0.94 \n", + "-54.55 5.03 \n", + "-30.78 5.84 \n", + "-129.47 6.05 \n", + "-98.69 5.94 \n", + "-3.91 0.53 \n", + "10000000.0 10000000.0 \n", + "-66.37 2.34 \n", + "10000000.0 10000000.0 \n", + "-126.25 8.14 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.81 \n", + "-1.7 10.48 \n", + "-3.91 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "42.45 5.48 \n", + "14.39 5.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "15.97 0.35 \n", + "-36.38 4.32 \n", + "-5.33 6.58 \n", + "-3.21 5.18 \n", + "15.97 0.35 \n", + "-49.27 0.53 \n", + "-4.86 0.53 \n", + "-35.43 0.45 \n", + "-3.51 0.79 \n", + "23.35 0.94 \n", + "-38.35 0.11 \n", + "-10.84 0.19 \n", + "-37.41 0.17 \n", + "-38.35 0.11 \n", + "-10.84 0.19 \n", + "23.36 0.94 \n", + "10.84 0.19 \n", + "-16.49 3.73 \n", + "-3.33 3.75 \n", + "-223.01 6.26 \n", + "-47.68 4.79 \n", + "-41.76 7.45 \n", + "-9.6 7.21 \n", + "23.85 0.94 \n", + "23.31 0.94 \n", + "35.88 0.45 \n", + "-90.92 2.82 \n", + "45.06 5.93 \n", + "30.93 7.15 \n", + "26.68 7.07 \n", + "-186.08 9.56 \n", + "36.06 0.45 \n", + "-2.31 0.8 \n", + "-2.5 0.8 \n", + "-55.04 2.87 \n", + "35.88 0.45 \n", + "-116.98 7.96 \n", + "-4.36 7.79 \n", + "10000000.0 10000000.0 \n", + "-3.91 0.53 \n", + "-3.91 0.53 \n", + "-19.01 4.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.55 2.21 \n", + "-55.79 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.72 0.54 \n", + "-0.75 0.86 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.38 1.37 \n", + "10000000.0 10000000.0 \n", + "0.29 0.38 \n", + "-12.8 0.49 \n", + "-12.8 0.49 \n", + "10000000.0 10000000.0 \n", + "-20.8 3.0 \n", + "60.43 2.66 \n", + "-22.19 1.11 \n", + "-5.62 2.59 \n", + "14.74 2.26 \n", + "71.74 0.83 \n", + "3.13 0.97 \n", + "10000000.0 10000000.0 \n", + "-20.33 6.33 \n", + "-32.21 1.4 \n", + "-106.52 1.03 \n", + "-116.52 1.03 \n", + "67.81 0.22 \n", + "-60.95 0.2 \n", + "10000000.0 10000000.0 \n", + "-12.12 14.06 \n", + "-7.84 0.81 \n", + "-13.15 1.06 \n", + "-4.36 6.61 \n", + "2.23 4.69 \n", + "4.21 2.4 \n", + "-4.36 6.62 \n", + "0.53 0.8 \n", + "-25.6 5.78 \n", + "-25.6 7.45 \n", + "189.69 2.44 \n", + "-49.25 0.53 \n", + "-47.77 1.07 \n", + "-88.3 1.92 \n", + "-86.82 2.07 \n", + "-14.12 1.64 \n", + "-14.12 1.64 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "-62.49 1.36 \n", + "-11.63 0.68 \n", + "-42.01 1.24 \n", + "-42.01 1.24 \n", + "10000000.0 10000000.0 \n", + "-11.91 3.41 \n", + "-3.53 5.93 \n", + "-13.39 1.07 \n", + "-0.91 0.53 \n", + "-1.88 0.58 \n", + "-88.73 1.37 \n", + "-0.71 0.53 \n", + "1.03 0.55 \n", + "-7.86 2.14 \n", + "-5.97 0.42 \n", + "-13.09 1.07 \n", + "-3.88 0.56 \n", + "-3.88 0.56 \n", + "-2.19 0.53 \n", + "-3.14 6.09 \n", + "-30.21 2.27 \n", + "-14.03 6.29 \n", + "10000000.0 10000000.0 \n", + "-3.82 0.44 \n", + "-4.5 0.62 \n", + "-3.88 0.56 \n", + "-4.45 0.51 \n", + "-4.36 6.35 \n", + "-4.36 6.38 \n", + "-0.91 0.53 \n", + "-12.99 2.11 \n", + "-13.07 1.07 \n", + "-3.83 0.39 \n", + "-0.93 0.53 \n", + "10000000.0 10000000.0 \n", + "-24.14 0.43 \n", + "-3.53 7.84 \n", + "10000000.0 10000000.0 \n", + "-3.83 0.39 \n", + "-4.11 0.51 \n", + "-13.74 1.03 \n", + "-3.83 0.39 \n", + "-4.68 0.75 \n", + "-69.88 6.61 \n", + "-13.83 6.77 \n", + "-93.05 3.0 \n", + "10000000.0 10000000.0 \n", + "-25.72 2.84 \n", + "1.94 0.63 \n", + "-214.36 0.62 \n", + "-0.89 0.92 \n", + "-95.64 1.69 \n", + "27.2 2.71 \n", + "-18.97 0.67 \n", + "4.49 0.35 \n", + "-1.6 0.39 \n", + "-0.13 0.47 \n", + "-1.8 0.54 \n", + "-3.71 0.53 \n", + "2.3 0.33 \n", + "10000000.0 10000000.0 \n", + "14.01 1.01 \n", + "10000000.0 10000000.0 \n", + "-105.96 0.91 \n", + "1.47 1.99 \n", + "-6.84 2.55 \n", + "1.46 2.43 \n", + "-16.08 0.9 \n", + "-72.32 6.31 \n", + "-10.56 6.33 \n", + "-25.11 1.73 \n", + "-19.42 5.78 \n", + "-23.09 1.01 \n", + "0.05 0.45 \n", + "-4.5 0.7 \n", + "0.4 0.66 \n", + "-53.17 0.89 \n", + "-2.66 0.8 \n", + "-13.11 5.07 \n", + "23.24 5.36 \n", + "-0.75 0.77 \n", + "-2.17 0.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "62.61 0.37 \n", + "-49.25 0.53 \n", + "-1.71 1.66 \n", + "-97.36 1.23 \n", + "-94.12 0.75 \n", + "0.36 0.45 \n", + "-89.06 0.82 \n", + "-113.31 0.76 \n", + "-97.36 1.23 \n", + "-117.6 2.35 \n", + "-95.07 0.74 \n", + "4.28 0.24 \n", + "-116.64 0.78 \n", + "-2.14 0.66 \n", + "-4.84 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.18 0.36 \n", + "24.53 1.88 \n", + "43.03 2.87 \n", + "-96.27 1.66 \n", + "2.66 0.8 \n", + "-49.24 0.53 \n", + "-9.4 0.52 \n", + "None 5.88 \n", + "-3.63 5.9 \n", + "3.22 5.93 \n", + "-12.59 5.89 \n", + "-5.25 7.68 \n", + "-82.17 2.13 \n", + "-20.25 1.89 \n", + "-86.23 1.62 \n", + "15.59 1.32 \n", + "3.12 0.49 \n", + "-8.66 0.26 \n", + "-108.62 1.19 \n", + "-94.12 0.75 \n", + "4.89 0.24 \n", + "-8.68 0.26 \n", + "-82.17 2.13 \n", + "-35.51 1.88 \n", + "-86.61 1.62 \n", + "15.6 1.32 \n", + "3.51 0.49 \n", + "-40.79 1.05 \n", + "-2.28 0.8 \n", + "-94.12 0.75 \n", + "4.89 0.24 \n", + "-8.68 0.26 \n", + "-178.53 1.26 \n", + "-82.17 2.13 \n", + "-20.25 1.89 \n", + "-86.23 1.62 \n", + "15.56 1.32 \n", + "3.11 0.49 \n", + "-8.61 0.26 \n", + "-108.63 1.19 \n", + "-82.17 2.13 \n", + "-115.53 2.15 \n", + "-108.62 1.19 \n", + "-6.31 1.33 \n", + "4.44 0.24 \n", + "0.18 0.36 \n", + "10.66 0.78 \n", + "-3.78 0.35 \n", + "-98.3 0.82 \n", + "-104.91 12.09 \n", + "-104.91 17.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-70.47 15.95 \n", + "13.38 9.01 \n", + "-61.47 0.2 \n", + "-1.42 6.63 \n", + "-40.4 1.05 \n", + "10.37 0.2 \n", + "71.84 0.2 \n", + "-28.4 1.67 \n", + "-6.34 8.12 \n", + "-20.13 8.43 \n", + "16.89 9.28 \n", + "-90.26 8.14 \n", + "-28.4 1.67 \n", + "2.41 0.55 \n", + "3.71 3.05 \n", + "-6.02 3.14 \n", + "3.71 3.1 \n", + "-6.02 3.87 \n", + "3.71 3.89 \n", + "7.97 3.83 \n", + "-1.78 1.28 \n", + "-7.55 4.94 \n", + "0.67 0.86 \n", + "3.52 0.32 \n", + "-6.18 1.17 \n", + "-5.02 0.43 \n", + "5.0 2.12 \n", + "-9.06 0.26 \n", + "10000000.0 10000000.0 \n", + "-2.53 0.68 \n", + "-7.33 1.11 \n", + "-14.38 0.55 \n", + "-0.45 1.16 \n", + "-6.44 1.51 \n", + "-36.23 5.02 \n", + "-1.05 5.09 \n", + "-28.7 4.99 \n", + "22.63 5.39 \n", + "10.84 5.31 \n", + "-4.68 5.46 \n", + "-37.45 5.29 \n", + "14.65 5.35 \n", + "4.68 5.6 \n", + "-71.06 7.15 \n", + "-71.06 7.15 \n", + "-5.31 3.93 \n", + "-5.31 3.93 \n", + "-5.31 3.93 \n", + "33.94 0.67 \n", + "33.94 0.67 \n", + "-11.72 1.01 \n", + "33.94 0.67 \n", + "-28.45 3.54 \n", + "-28.45 3.54 \n", + "-28.45 3.54 \n", + "-28.45 3.54 \n", + "0.37 3.29 \n", + "0.37 3.29 \n", + "-20.24 1.89 \n", + "-85.45 6.92 \n", + "4.43 1.96 \n", + "-49.25 0.53 \n", + "1.87 2.17 \n", + "-105.97 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "33.04 3.07 \n", + "6.48 0.85 \n", + "6.48 0.85 \n", + "-26.32 5.34 \n", + "-26.32 5.34 \n", + "6.48 0.85 \n", + "-69.98 3.1 \n", + "-10.1 3.32 \n", + "-10.1 3.32 \n", + "-94.02 0.83 \n", + "-10.1 3.32 \n", + "-10.1 3.32 \n", + "6.48 0.85 \n", + "6.48 0.85 \n", + "-94.96 0.8 \n", + "-69.98 3.1 \n", + "-101.26 1.16 \n", + "-69.98 3.1 \n", + "-101.26 1.16 \n", + "-101.26 1.16 \n", + "-101.26 1.16 \n", + "-69.98 3.1 \n", + "-94.96 0.8 \n", + "-102.63 1.15 \n", + "10000000.0 10000000.0 \n", + "-69.98 2.15 \n", + "2.21 6.44 \n", + "None None \n", + "0.28 0.38 \n", + "-65.16 2.1 \n", + "-14.84 1.99 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.31 0.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-105.88 1.21 \n", + "-96.7 1.52 \n", + "-108.5 6.26 \n", + "2.12 0.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.59 4.01 \n", + "9.17 1.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-100.02 1.53 \n", + "-101.16 1.21 \n", + "10000000.0 10000000.0 \n", + "9.17 1.44 \n", + "-13.03 2.4 \n", + "-49.24 1.29 \n", + "-18.97 6.25 \n", + "-14.39 6.27 \n", + "-5.52 0.54 \n", + "-128.56 0.76 \n", + "6.48 0.85 \n", + "6.48 0.85 \n", + "6.48 0.85 \n", + "6.48 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-45.57 1.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "33.94 0.67 \n", + "10000000.0 10000000.0 \n", + "10.37 0.2 \n", + "10000000.0 10000000.0 \n", + "6.48 0.85 \n", + "6.63 0.96 \n", + "-6.57 0.43 \n", + "-2.47 0.74 \n", + "-249.95 0.64 \n", + "-3.58 0.3 \n", + "4.22 0.71 \n", + "3.02 0.36 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "-0.28 0.38 \n", + "3.96 0.41 \n", + "-7.33 1.11 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "2.81 0.9 \n", + "4.23 0.72 \n", + "1.8 0.69 \n", + "-0.57 0.37 \n", + "-1.02 0.27 \n", + "10000000.0 10000000.0 \n", + "-5.93 0.97 \n", + "-4.58 12.88 \n", + "-25.49 1.85 \n", + "-30.56 1.15 \n", + "-8.68 0.26 \n", + "9.41 0.13 \n", + "9.41 0.15 \n", + "8.92 1.02 \n", + "15.09 13.82 \n", + "-7.35 2.51 \n", + "-31.72 1.02 \n", + "-31.73 1.02 \n", + "22.25 1.18 \n", + "2.91 11.5 \n", + "-18.11 3.81 \n", + "-1.43 16.24 \n", + "-1.43 10.59 \n", + "-101.57 1.28 \n", + "10000000.0 10000000.0 \n", + "-107.67 1.13 \n", + "-109.81 1.17 \n", + "-109.79 1.17 \n", + "-83.0 2.53 \n", + "10000000.0 10000000.0 \n", + "-15.4 3.68 \n", + "-106.57 0.91 \n", + "-101.03 1.21 \n", + "-115.73 1.59 \n", + "-113.03 1.41 \n", + "-115.73 1.59 \n", + "10000000.0 10000000.0 \n", + "-104.91 12.08 \n", + "-104.91 17.25 \n", + "-102.22 0.86 \n", + "-94.13 0.75 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "-95.07 0.74 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "-91.65 4.65 \n", + "-91.65 4.71 \n", + "-91.65 5.01 \n", + "10000000.0 10000000.0 \n", + "-104.99 2.05 \n", + "-95.25 0.85 \n", + "-95.25 0.85 \n", + "15.68 0.45 \n", + "8.71 0.8 \n", + "-28.17 1.16 \n", + "-6.06 6.35 \n", + "-3.74 0.42 \n", + "-3.78 0.6 \n", + "-5.97 0.42 \n", + "-3.74 0.42 \n", + "-3.78 0.6 \n", + "-1.7 6.37 \n", + "-1.7 6.37 \n", + "3.87 2.37 \n", + "-9.12 0.55 \n", + "-3.98 0.52 \n", + "-10.33 2.37 \n", + "-52.22 0.86 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "-1.11 4.75 \n", + "12.5 4.83 \n", + "10000000.0 10000000.0 \n", + "62.85 4.12 \n", + "9.58 4.84 \n", + "-22.74 4.57 \n", + "-53.72 5.96 \n", + "10000000.0 10000000.0 \n", + "-40.99 5.86 \n", + "0.94 0.31 \n", + "0.94 0.31 \n", + "-38.04 0.8 \n", + "-3.83 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-90.63 6.18 \n", + "-90.63 6.18 \n", + "-83.95 6.29 \n", + "-83.95 6.29 \n", + "-15.4 3.48 \n", + "-15.4 3.48 \n", + "None None \n", + "None None \n", + "-49.39 8.47 \n", + "-95.81 9.29 \n", + "-16.29 4.42 \n", + "-41.93 3.86 \n", + "-18.46 0.78 \n", + "-18.46 0.78 \n", + "-18.46 0.78 \n", + "-18.46 0.78 \n", + "-115.73 1.59 \n", + "-33.35 2.77 \n", + "-6.77 0.68 \n", + "-39.25 1.74 \n", + "4.46 0.81 \n", + "0.28 0.38 \n", + "0.28 0.38 \n", + "-4.94 0.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "54.52 2.24 \n", + "-7.11 2.06 \n", + "-3.11 7.33 \n", + "-3.11 7.33 \n", + "-13.05 0.99 \n", + "-93.93 1.58 \n", + "-10.82 0.19 \n", + "-79.81 0.75 \n", + "-79.81 0.75 \n", + "-79.81 0.75 \n", + "4.89 0.24 \n", + "-10.82 0.19 \n", + "10000000.0 10000000.0 \n", + "-10.82 0.19 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "-1.7 14.27 \n", + "-1.7 14.27 \n", + "-1.7 15.52 \n", + "-1.7 15.52 \n", + "-3.4 19.5 \n", + "-3.4 19.5 \n", + "-11.23 22.52 \n", + "-11.23 22.52 \n", + "-11.23 24.1 \n", + "-11.23 24.1 \n", + "-11.23 25.76 \n", + "-11.23 25.76 \n", + "-11.23 27.49 \n", + "-11.23 27.49 \n", + "-11.23 29.27 \n", + "-11.23 29.27 \n", + "-11.23 31.1 \n", + "-11.23 31.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.39 0.24 \n", + "-4.36 5.81 \n", + "-11.91 3.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.51 1.09 \n", + "-5.36 2.64 \n", + "10000000.0 10000000.0 \n", + "-10.46 4.93 \n", + "-13.11 5.07 \n", + "23.24 5.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 6.17 \n", + "-62.7 0.4 \n", + "1.52 1.23 \n", + "-64.95 1.44 \n", + "-4.9 2.85 \n", + "-59.01 3.21 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "43.54 2.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.74 0.51 \n", + "-0.78 0.68 \n", + "-4.29 0.8 \n", + "-0.37 0.39 \n", + "-16.57 1.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-126.78 1.67 \n", + "-126.78 1.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.17 2.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "11.78 1.79 \n", + "0.71 1.21 \n", + "10000000.0 10000000.0 \n", + "-9.54 1.46 \n", + "-5.49 1.77 \n", + "10000000.0 10000000.0 \n", + "-82.17 2.13 \n", + "-20.04 1.5 \n", + "-20.04 1.5 \n", + "-6.52 1.89 \n", + "0.62 2.34 \n", + "-57.58 2.38 \n", + "31.09 2.52 \n", + "-10.46 4.93 \n", + "-13.11 5.07 \n", + "23.24 5.36 \n", + "-4.08 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.53 0.62 \n", + "-2.96 0.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.68 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-118.59 1.24 \n", + "-4.36 6.31 \n", + "10000000.0 10000000.0 \n", + "-5.33 5.07 \n", + "-5.33 4.99 \n", + "-5.33 5.02 \n", + "-4.36 5.17 \n", + "-4.36 5.04 \n", + "-0.91 0.51 \n", + "-90.63 6.18 \n", + "-6.67 1.32 \n", + "0.75 0.93 \n", + "10000000.0 10000000.0 \n", + "-5.27 1.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.48 0.38 \n", + "1.48 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.14 0.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.53 1.46 \n", + "-3.83 0.39 \n", + "-3.83 0.39 \n", + "-3.88 0.56 \n", + "-4.36 6.39 \n", + "-1.7 5.81 \n", + "-13.17 0.99 \n", + "-5.97 0.42 \n", + "-5.97 0.42 \n", + "-13.17 0.99 \n", + "-5.97 0.42 \n", + "-19.78 1.92 \n", + "-19.78 1.92 \n", + "-16.98 11.54 \n", + "-16.98 11.54 \n", + "-2.63 0.42 \n", + "-15.54 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.44 0.78 \n", + "-18.44 0.78 \n", + "10000000.0 10000000.0 \n", + "-6.83 0.33 \n", + "-6.83 0.33 \n", + "-6.83 0.33 \n", + "-6.83 0.33 \n", + "-8.38 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-83.06 1.82 \n", + "-2.17 0.33 \n", + "-3.73 0.33 \n", + "-5.28 0.33 \n", + "0.68 7.06 \n", + "-18.52 0.78 \n", + "-18.42 0.78 \n", + "-0.68 7.22 \n", + "0.67 0.33 \n", + "0.67 0.33 \n", + "-0.88 0.33 \n", + "-2.43 0.33 \n", + "-3.99 0.33 \n", + "0.67 0.33 \n", + "-0.88 0.33 \n", + "-0.88 0.33 \n", + "-2.43 0.33 \n", + "-3.99 0.33 \n", + "4.47 1.53 \n", + "13.07 1.31 \n", + "None None \n", + "0.67 0.33 \n", + "-0.88 0.33 \n", + "-0.88 0.33 \n", + "-2.43 0.33 \n", + "-3.98 0.33 \n", + "-30.22 32.61 \n", + "0.95 0.42 \n", + "-1.07 0.42 \n", + "-30.08 3.91 \n", + "-17.35 5.42 \n", + "-17.35 5.42 \n", + "-21.39 1.41 \n", + "-1.7 8.11 \n", + "-314.94 2.6 \n", + "-10.45 1.56 \n", + "-5.64 1.15 \n", + "-5.09 1.56 \n", + "None None \n", + "-5.02 0.89 \n", + "-105.98 0.91 \n", + "-107.71 7.24 \n", + "-107.71 7.24 \n", + "-106.27 0.91 \n", + "-105.88 0.91 \n", + "-106.11 0.91 \n", + "-2.94 0.9 \n", + "-2.74 0.9 \n", + "-6.94 1.24 \n", + "10000000.0 10000000.0 \n", + "3.15 1.25 \n", + "10000000.0 10000000.0 \n", + "-21.41 0.92 \n", + "-21.41 0.92 \n", + "-39.7 6.07 \n", + "-3.63 0.41 \n", + "-108.63 1.19 \n", + "6.25 13.27 \n", + "3.92 2.53 \n", + "10.95 2.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.95 1.33 \n", + "-1.83 1.07 \n", + "-6.74 6.05 \n", + "-6.74 6.0 \n", + "10000000.0 10000000.0 \n", + "-4.24 0.71 \n", + "-40.68 3.32 \n", + "-4.36 5.59 \n", + "-1.06 6.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.71 0.53 \n", + "-105.97 0.91 \n", + "-105.97 0.91 \n", + "-105.97 0.91 \n", + "-105.97 0.91 \n", + "-4.44 0.24 \n", + "-0.68 0.53 \n", + "10000000.0 10000000.0 \n", + "-2.78 0.75 \n", + "-2.78 0.75 \n", + "3.67 0.39 \n", + "10000000.0 10000000.0 \n", + "-105.97 0.91 \n", + "-108.1 7.14 \n", + "-97.22 0.8 \n", + "-11.91 3.41 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "-13.27 0.43 \n", + "-13.27 0.43 \n", + "-13.27 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.6 0.56 \n", + "-2.6 0.56 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.7 \n", + "-1.87 0.46 \n", + "-14.49 0.33 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "4.89 0.24 \n", + "-3.02 0.72 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.97 0.42 \n", + "-14.68 1.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "55.65 10.25 \n", + "2.34 0.68 \n", + "-0.8 1.14 \n", + "-83.95 6.39 \n", + "-15.4 3.68 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.91 \n", + "-4.36 5.91 \n", + "-13.05 0.99 \n", + "-5.97 0.42 \n", + "-3.83 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "64.25 0.74 \n", + "-81.94 0.8 \n", + "-4.14 0.82 \n", + "-4.36 5.78 \n", + "-18.47 0.78 \n", + "-18.46 0.78 \n", + "-18.42 0.78 \n", + "10000000.0 10000000.0 \n", + "-3.98 1.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-25.79 2.94 \n", + "-67.41 3.65 \n", + "-67.41 3.64 \n", + "-18.53 0.78 \n", + "-18.51 0.78 \n", + "-18.51 0.78 \n", + "-18.52 0.78 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.21 \n", + "11.68 17.96 \n", + "9.52 13.15 \n", + "11.68 17.89 \n", + "-13.05 0.99 \n", + "-13.09 1.07 \n", + "-13.05 0.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.91 0.53 \n", + "10000000.0 10000000.0 \n", + "-38.02 2.73 \n", + "-18.75 0.66 \n", + "-54.4 3.35 \n", + "-30.75 1.47 \n", + "-37.94 1.71 \n", + "-2.67 0.8 \n", + "-2.67 0.8 \n", + "-2.67 0.8 \n", + "-18.75 0.66 \n", + "-6.96 4.28 \n", + "-3.61 5.41 \n", + "-30.75 1.47 \n", + "-21.47 1.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.39 11.55 \n", + "-94.39 11.55 \n", + "-94.39 11.9 \n", + "-177.08 1.65 \n", + "-177.08 1.65 \n", + "-177.08 1.65 \n", + "-177.08 1.65 \n", + "-88.54 0.82 \n", + "-88.54 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-88.54 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.59 4.48 \n", + "3.51 0.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.22 0.33 \n", + "2.22 0.33 \n", + "-9.85 0.73 \n", + "-9.85 0.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-104.91 12.08 \n", + "-104.91 12.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-104.91 17.25 \n", + "-104.91 17.25 \n", + "-1.43 16.24 \n", + "-1.43 10.59 \n", + "10000000.0 10000000.0 \n", + "-1.82 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.98 2.24 \n", + "-115.09 1.38 \n", + "-115.09 1.38 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "-3.57 0.8 \n", + "-1.7 4.94 \n", + "-13.19 0.99 \n", + "-1.7 6.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.09 1.3 \n", + "10000000.0 10000000.0 \n", + "-34.54 1.84 \n", + "10000000.0 10000000.0 \n", + "-28.4 1.67 \n", + "-62.11 1.36 \n", + "-94.13 0.75 \n", + "-104.63 0.81 \n", + "2.08 5.66 \n", + "13.87 0.31 \n", + "-8.68 0.27 \n", + "-59.05 2.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.83 0.34 \n", + "-1.02 0.51 \n", + "-1.1 0.51 \n", + "-5.42 0.66 \n", + "-5.4 1.05 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "-3.38 0.51 \n", + "-6.35 6.52 \n", + "-40.4 1.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "83.07 3.14 \n", + "-4.73 0.64 \n", + "-11.0 0.39 \n", + "0.37 0.45 \n", + "-8.72 1.32 \n", + "-8.88 1.86 \n", + "-14.0 0.53 \n", + "26.71 0.76 \n", + "10.82 0.19 \n", + "0.81 0.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.09 0.97 \n", + "1.52 0.57 \n", + "0.46 3.02 \n", + "10000000.0 10000000.0 \n", + "-21.64 0.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.91 0.53 \n", + "-13.15 0.99 \n", + "-13.19 1.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.09 1.32 \n", + "6.09 1.32 \n", + "10000000.0 10000000.0 \n", + "-0.74 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-38.89 2.2 \n", + "26.67 0.39 \n", + "-20.04 2.24 \n", + "-20.08 2.27 \n", + "-2.18 0.53 \n", + "10000000.0 10000000.0 \n", + "-3.83 0.39 \n", + "-3.83 0.39 \n", + "-3.83 0.39 \n", + "10000000.0 10000000.0 \n", + "-9.06 0.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.89 0.73 \n", + "-31.07 0.7 \n", + "-18.22 1.85 \n", + "-18.74 1.74 \n", + "None None \n", + "-94.13 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.03 0.53 \n", + "-20.19 2.24 \n", + "-20.23 2.27 \n", + "-1.02 0.53 \n", + "-12.79 0.99 \n", + "-13.54 0.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.23 4.79 \n", + "10000000.0 10000000.0 \n", + "-19.98 2.24 \n", + "-13.04 0.99 \n", + "-2.15 0.53 \n", + "-2.15 0.53 \n", + "-13.04 0.99 \n", + "-2.15 0.53 \n", + "-177.08 1.65 \n", + "-112.0 0.83 \n", + "-5.33 8.66 \n", + "-5.33 8.71 \n", + "-89.24 1.05 \n", + "-20.8 3.0 \n", + "0.07 6.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-36.3 1.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.18 \n", + "-0.87 5.49 \n", + "-0.87 5.63 \n", + "-12.97 0.99 \n", + "-13.01 1.07 \n", + "3.49 2.37 \n", + "3.45 2.4 \n", + "-1.7 5.66 \n", + "3.49 2.37 \n", + "3.45 2.4 \n", + "10000000.0 10000000.0 \n", + "3.49 2.37 \n", + "3.45 2.4 \n", + "3.49 2.37 \n", + "3.45 2.4 \n", + "10000000.0 10000000.0 \n", + "-6.45 3.03 \n", + "-6.45 3.03 \n", + "0.65 0.27 \n", + "0.65 0.27 \n", + "-1.49 0.27 \n", + "0.65 0.27 \n", + "-1.49 0.27 \n", + "-0.87 5.21 \n", + "-1.81 0.19 \n", + "0.33 0.13 \n", + "-0.98 0.4 \n", + "0.39 0.83 \n", + "-1.49 0.27 \n", + "-3.83 0.39 \n", + "-3.84 0.39 \n", + "-2.19 0.53 \n", + "0.65 0.27 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "3.3 6.42 \n", + "3.3 6.42 \n", + "3.3 6.66 \n", + "3.3 6.66 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "3.3 4.27 \n", + "3.3 4.27 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "3.3 4.39 \n", + "3.3 4.39 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-82.4 3.41 \n", + "-82.4 3.41 \n", + "4.7 2.24 \n", + "-6.27 2.07 \n", + "-2.6 2.39 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.02 5.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "42.32 0.18 \n", + "42.32 0.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-95.25 0.85 \n", + "-2.18 9.81 \n", + "-13.16 0.99 \n", + "3.87 2.37 \n", + "-0.68 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "10000000.0 10000000.0 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "10000000.0 10000000.0 \n", + "-18.53 0.78 \n", + "-18.53 0.78 \n", + "-113.8 1.42 \n", + "-113.8 1.42 \n", + "-102.93 7.48 \n", + "-122.99 2.46 \n", + "-122.99 2.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.99 0.31 \n", + "-38.35 0.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.22 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.25 0.47 \n", + "-2.25 0.47 \n", + "-2.25 0.47 \n", + "-2.25 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-64.27 3.09 \n", + "10000000.0 10000000.0 \n", + "-50.31 3.85 \n", + "-33.24 4.46 \n", + "-6.27 1.53 \n", + "-58.88 3.91 \n", + "-53.47 3.33 \n", + "-20.18 2.19 \n", + "None 6.31 \n", + "-4.2 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.2 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.09 0.84 \n", + "2.26 0.76 \n", + "-8.44 0.86 \n", + "10000000.0 10000000.0 \n", + "-5.97 0.42 \n", + "-1.7 5.27 \n", + "-109.95 2.25 \n", + "-109.95 2.25 \n", + "-13.14 0.99 \n", + "-109.98 2.25 \n", + "-109.98 2.25 \n", + "2.83 0.96 \n", + "-6.7 1.58 \n", + "-14.26 0.34 \n", + "-175.24 1.58 \n", + "10000000.0 10000000.0 \n", + "-0.35 0.51 \n", + "-5.97 0.42 \n", + "-0.74 0.51 \n", + "-5.97 0.42 \n", + "-0.74 0.51 \n", + "-5.97 0.42 \n", + "-3.83 0.39 \n", + "-1.7 5.9 \n", + "-1.7 5.9 \n", + "-13.16 0.99 \n", + "-93.39 6.2 \n", + "-0.01 None \n", + "4.87 3.48 \n", + "6.85 1.08 \n", + "-20.34 1.78 \n", + "3.71 2.4 \n", + "3.71 2.4 \n", + "-102.36 1.16 \n", + "-94.39 8.31 \n", + "-9.17 5.63 \n", + "-118.19 0.76 \n", + "-40.99 5.86 \n", + "-94.13 0.75 \n", + "-9.17 5.63 \n", + "-94.39 8.31 \n", + "-118.19 0.76 \n", + "-94.13 0.75 \n", + "-94.39 8.9 \n", + "-9.17 6.48 \n", + "-118.19 0.76 \n", + "-94.13 0.75 \n", + "-94.39 8.44 \n", + "-9.17 5.82 \n", + "-118.19 0.76 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "-96.26 8.08 \n", + "-94.39 8.04 \n", + "-9.17 5.23 \n", + "-118.58 8.03 \n", + "-94.13 0.75 \n", + "-94.39 8.4 \n", + "-9.17 5.77 \n", + "-118.19 0.76 \n", + "-35.91 4.43 \n", + "-27.33 3.53 \n", + "-44.15 2.69 \n", + "-52.97 2.82 \n", + "10000000.0 10000000.0 \n", + "-0.83 1.04 \n", + "0.85 0.65 \n", + "-22.88 1.52 \n", + "-3.8 0.27 \n", + "-5.09 0.81 \n", + "0.61 1.02 \n", + "-6.06 0.47 \n", + "-5.16 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.88 3.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.71 0.85 \n", + "-7.51 0.62 \n", + "-3.65 0.32 \n", + "-4.17 0.94 \n", + "1.17 0.61 \n", + "-3.34 0.2 \n", + "8.72 0.09 \n", + "-2.82 0.21 \n", + "4.36 0.98 \n", + "10000000.0 10000000.0 \n", + "-10.46 7.23 \n", + "-8.88 3.73 \n", + "-32.71 2.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.69 0.67 \n", + "1.52 1.34 \n", + "-1.38 0.78 \n", + "-3.89 0.58 \n", + "-4.38 1.17 \n", + "-4.95 0.97 \n", + "-33.61 6.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-23.36 1.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.42 0.49 \n", + "-20.54 1.56 \n", + "-6.8 0.72 \n", + "-6.93 0.23 \n", + "-9.47 1.75 \n", + "10000000.0 10000000.0 \n", + "-5.92 1.01 \n", + "4.95 0.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.81 0.71 \n", + "-5.9 1.18 \n", + "10000000.0 10000000.0 \n", + "-8.34 0.82 \n", + "10000000.0 10000000.0 \n", + "-0.13 0.6 \n", + "-5.85 0.61 \n", + "8.71 0.07 \n", + "-18.42 5.84 \n", + "-1.2 1.08 \n", + "-2.23 1.11 \n", + "10000000.0 10000000.0 \n", + "-3.13 1.37 \n", + "-1.75 1.36 \n", + "1.82 0.08 \n", + "5.03 0.08 \n", + "0.18 0.33 \n", + "-1.29 0.36 \n", + "-11.48 0.32 \n", + "-10.65 0.48 \n", + "7.34 1.47 \n", + "-0.99 0.81 \n", + "-9.31 1.46 \n", + "0.95 0.63 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.18 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.12 0.81 \n", + "-1.75 1.36 \n", + "10000000.0 10000000.0 \n", + "190.83 1.55 \n", + "-226.79 1.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-163.63 2.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.48 0.38 \n", + "-259.8 2.07 \n", + "-7.03 0.53 \n", + "10000000.0 10000000.0 \n", + "3.81 1.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.41 0.78 \n", + "4.75 0.65 \n", + "-5.92 1.01 \n", + "8.27 0.9 \n", + "-8.44 0.34 \n", + "4.56 0.71 \n", + "10000000.0 10000000.0 \n", + "2.01 0.36 \n", + "5.96 0.32 \n", + "-1.5 0.34 \n", + "1.86 0.82 \n", + "6.93 0.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.93 1.02 \n", + "2.04 0.28 \n", + "-1.89 0.66 \n", + "-1.3 0.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.18 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "11.27 0.87 \n", + "1.97 0.45 \n", + "17.53 0.82 \n", + "-7.54 0.79 \n", + "1.1 0.6 \n", + "1.45 0.48 \n", + "-0.06 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.38 0.78 \n", + "1.97 0.32 \n", + "2.67 0.5 \n", + "-3.14 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.69 0.67 \n", + "5.34 1.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "166.19 2.34 \n", + "167.58 6.35 \n", + "165.86 2.37 \n", + "166.48 1.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.02 0.72 \n", + "-46.34 0.68 \n", + "10000000.0 10000000.0 \n", + "-2.58 0.85 \n", + "-10.95 0.48 \n", + "-3.08 0.94 \n", + "10000000.0 10000000.0 \n", + "-4.22 1.25 \n", + "0.57 0.71 \n", + "None 6.17 \n", + "-5.9 1.12 \n", + "0.36 0.71 \n", + "-2.79 0.26 \n", + "-22.57 1.11 \n", + "10000000.0 10000000.0 \n", + "None 0.44 \n", + "None 0.44 \n", + "None 0.3 \n", + "None 0.3 \n", + "None 0.41 \n", + "None 0.41 \n", + "None 0.41 \n", + "None 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.23 \n", + "None 1.23 \n", + "None 1.23 \n", + "None 1.16 \n", + "None 1.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.56 \n", + "None 0.48 \n", + "None 0.48 \n", + "-3.44 0.61 \n", + "-9.34 0.31 \n", + "None 4.27 \n", + "None 1.44 \n", + "None 1.44 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "None 1.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-20.43 0.65 \n", + "46.17 0.24 \n", + "-20.24 0.35 \n", + "86.82 1.25 \n", + "105.88 0.52 \n", + "None 0.38 \n", + "None 0.38 \n", + "None 8.53 \n", + "None 8.53 \n", + "None 1.24 \n", + "None 1.24 \n", + "None 2.14 \n", + "None 2.14 \n", + "None 0.83 \n", + "None 0.83 \n", + "-6.16 0.07 \n", + "None 0.71 \n", + "None 4.58 \n", + "None 4.58 \n", + "0.01 5.37 \n", + "8.78 0.13 \n", + "-5.66 0.58 \n", + "-22.32 1.03 \n", + "10000000.0 10000000.0 \n", + "0.54 1.48 \n", + "-22.93 1.05 \n", + "-6.03 0.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.54 0.55 \n", + "10.75 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.01 1.14 \n", + "-18.13 0.71 \n", + "10000000.0 10000000.0 \n", + "-7.11 1.11 \n", + "-3.53 7.16 \n", + "-80.46 1.66 \n", + "-19.42 6.89 \n", + "-18.19 1.11 \n", + "-2.66 0.8 \n", + "-8.67 0.26 \n", + "-0.95 0.36 \n", + "5.6 0.74 \n", + "-5.83 1.19 \n", + "-8.27 0.9 \n", + "-7.3 0.13 \n", + "10000000.0 10000000.0 \n", + "-4.04 0.7 \n", + "-1.13 0.1 \n", + "-1.6 0.39 \n", + "-9.68 2.26 \n", + "-0.01 5.37 \n", + "10000000.0 10000000.0 \n", + "-8.68 0.26 \n", + "-8.67 0.27 \n", + "-20.14 1.86 \n", + "-2.46 0.54 \n", + "7.34 1.47 \n", + "-2.84 0.54 \n", + "-7.56 0.47 \n", + "-22.54 1.11 \n", + "10000000.0 10000000.0 \n", + "-4.01 0.86 \n", + "10000000.0 10000000.0 \n", + "0.69 0.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.35 0.71 \n", + "-2.67 0.35 \n", + "0.85 0.65 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.48 0.57 \n", + "-8.44 0.34 \n", + "1.51 0.68 \n", + "-6.45 0.71 \n", + "-0.18 0.36 \n", + "-2.44 0.61 \n", + "-2.44 0.61 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "-2.63 1.54 \n", + "10000000.0 10000000.0 \n", + "-13.94 1.55 \n", + "-6.14 0.18 \n", + "-8.07 1.19 \n", + "-0.95 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.36 0.98 \n", + "-6.76 0.73 \n", + "-4.44 0.24 \n", + "-6.93 0.67 \n", + "-1.26 0.75 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "4.62 0.58 \n", + "-0.94 1.4 \n", + "11.95 1.71 \n", + "11.95 1.71 \n", + "1.41 0.78 \n", + "1.41 0.78 \n", + "10000000.0 10000000.0 \n", + "-4.44 0.24 \n", + "-4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.27 0.73 \n", + "-9.57 0.81 \n", + "-8.38 0.33 \n", + "-5.28 0.33 \n", + "-8.79 0.73 \n", + "-3.69 0.67 \n", + "-5.52 0.3 \n", + "-1.38 0.78 \n", + "1.81 5.51 \n", + "1.81 5.07 \n", + "-4.05 1.05 \n", + "-8.47 0.78 \n", + "10.16 1.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.13 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.06 0.3 \n", + "-2.77 0.26 \n", + "-5.72 0.44 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.1 1.06 \n", + "-5.92 1.01 \n", + "10000000.0 10000000.0 \n", + "-2.79 0.26 \n", + "10000000.0 10000000.0 \n", + "-0.09 0.5 \n", + "-0.09 0.5 \n", + "-1.13 0.78 \n", + "-0.04 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.82 \n", + "None 0.82 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "None 2.8 \n", + "None 2.32 \n", + "None 2.21 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.28 0.37 \n", + "None 6.11 \n", + "-9.31 0.31 \n", + "-2.75 0.69 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.65 \n", + "None 4.65 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.26 \n", + "36.52 4.09 \n", + "38.58 4.09 \n", + "-35.4 1.67 \n", + "-9.51 1.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.47 \n", + "1.12 0.25 \n", + "None 0.49 \n", + "-0.61 0.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.15 \n", + "-31.87 1.48 \n", + "-5.98 1.16 \n", + "-11.55 1.46 \n", + "10000000.0 10000000.0 \n", + "1.52 1.23 \n", + "-2.64 1.79 \n", + "-28.53 1.54 \n", + "-75.98 3.57 \n", + "1.71 4.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.77 \n", + "None 1.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.87 \n", + "-22.87 1.22 \n", + "-29.44 1.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.12 \n", + "None 1.39 \n", + "6.15 6.55 \n", + "4.93 6.45 \n", + "5.94 6.55 \n", + "1.85 6.58 \n", + "22.2 6.84 \n", + "18.11 6.86 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.68 2.23 \n", + "10000000.0 10000000.0 \n", + "-9.68 2.26 \n", + "-1.66 0.92 \n", + "-61.44 0.32 \n", + "4.9 1.06 \n", + "4.95 0.24 \n", + "7.37 0.85 \n", + "8.78 0.39 \n", + "10000000.0 10000000.0 \n", + "-0.89 0.13 \n", + "None 1.04 \n", + "9.23 0.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-86.77 21.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.99 6.67 \n", + "-56.59 0.75 \n", + "-7.42 0.57 \n", + "-46.87 0.22 \n", + "-77.94 1.03 \n", + "10000000.0 10000000.0 \n", + "-28.8 0.74 \n", + "-28.8 0.74 \n", + "-28.86 0.78 \n", + "-16.82 1.56 \n", + "0.04 0.72 \n", + "-43.5 0.33 \n", + "10000000.0 10000000.0 \n", + "-1.72 8.61 \n", + "9.53 11.63 \n", + "10000000.0 10000000.0 \n", + "-0.98 0.07 \n", + "-1.21 0.44 \n", + "2.48 1.24 \n", + "-6.53 4.99 \n", + "-1.26 0.5 \n", + "-43.42 0.43 \n", + "-7.26 0.6 \n", + "-2.43 0.33 \n", + "-5.35 0.66 \n", + "10000000.0 10000000.0 \n", + "-45.06 4.16 \n", + "-111.57 4.97 \n", + "-47.86 1.47 \n", + "9.9 1.88 \n", + "-0.72 0.79 \n", + "2.22 0.33 \n", + "0.14 0.96 \n", + "-42.85 0.43 \n", + "-4.44 0.24 \n", + "-4.44 0.24 \n", + "-1.62 0.84 \n", + "-42.63 0.83 \n", + "-43.03 0.25 \n", + "-5.39 0.53 \n", + "8.79 0.58 \n", + "-13.43 1.51 \n", + "-7.84 1.14 \n", + "None 0.54 \n", + "0.31 0.45 \n", + "10000000.0 10000000.0 \n", + "0.44 0.71 \n", + "-13.28 2.3 \n", + "-46.96 0.68 \n", + "-2.47 0.77 \n", + "-45.1 0.48 \n", + "-3.37 0.34 \n", + "None 8.27 \n", + "10000000.0 10000000.0 \n", + "-86.98 0.38 \n", + "-7.0 1.54 \n", + "-106.64 1.69 \n", + "-8.34 0.82 \n", + "-4.01 0.86 \n", + "1.99 0.28 \n", + "0.14 0.61 \n", + "-6.94 0.95 \n", + "-51.32 1.69 \n", + "-2.51 0.68 \n", + "-66.0 7.44 \n", + "38.8 0.77 \n", + "18.49 2.63 \n", + "-1.42 0.64 \n", + "0.63 0.65 \n", + "10000000.0 10000000.0 \n", + "-43.31 1.22 \n", + "-46.14 0.21 \n", + "7.93 0.99 \n", + "0.54 1.48 \n", + "0.85 0.65 \n", + "-7.79 0.66 \n", + "-42.7 0.49 \n", + "-41.34 0.33 \n", + "10000000.0 10000000.0 \n", + "None 1.06 \n", + "None 0.71 \n", + "-8.6 0.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-2.13 0.18 \n", + "-17.48 0.57 \n", + "-43.6 0.49 \n", + "-36.24 1.08 \n", + "-18.13 0.71 \n", + "45.53 1.4 \n", + "-1.82 0.63 \n", + "-38.6 0.45 \n", + "-39.52 0.45 \n", + "-8.44 0.34 \n", + "-8.44 0.34 \n", + "-14.03 11.24 \n", + "-91.95 2.55 \n", + "-11.96 0.72 \n", + "-198.02 5.32 \n", + "-46.64 0.6 \n", + "10000000.0 10000000.0 \n", + "-1.84 0.3 \n", + "-129.98 2.86 \n", + "-13.45 5.25 \n", + "-48.05 0.48 \n", + "-6.42 1.8 \n", + "-41.81 0.64 \n", + "196.32 10.66 \n", + "-54.46 0.86 \n", + "None 1.02 \n", + "-0.82 0.07 \n", + "10000000.0 10000000.0 \n", + "-7.43 0.57 \n", + "-13.88 0.97 \n", + "-28.83 0.2 \n", + "-28.82 0.21 \n", + "-2.82 0.21 \n", + "0.99 0.75 \n", + "-27.74 1.51 \n", + "-1.57 0.57 \n", + "-51.66 0.58 \n", + "2.48 0.6 \n", + "-44.3 0.72 \n", + "-51.24 5.87 \n", + "-7.41 0.5 \n", + "-56.08 1.97 \n", + "-129.41 1.39 \n", + "-75.1 3.7 \n", + "-75.1 3.95 \n", + "-47.95 1.41 \n", + "10000000.0 10000000.0 \n", + "-43.9 0.47 \n", + "4.04 6.28 \n", + "-4.1 0.53 \n", + "-64.93 6.43 \n", + "39.2 3.56 \n", + "-42.16 0.61 \n", + "10000000.0 10000000.0 \n", + "-73.59 1.24 \n", + "21.9 0.84 \n", + "21.89 0.85 \n", + "None 0.68 \n", + "19.06 1.44 \n", + "-9.86 0.47 \n", + "-32.79 0.94 \n", + "4.15 1.31 \n", + "-139.41 1.08 \n", + "-5.2 0.53 \n", + "23.04 0.43 \n", + "23.04 0.43 \n", + "1.11 0.92 \n", + "-3.37 0.44 \n", + "-15.72 0.65 \n", + "-3.11 3.56 \n", + "-9.58 3.78 \n", + "29.22 1.94 \n", + "-22.32 1.03 \n", + "10000000.0 10000000.0 \n", + "-48.19 0.48 \n", + "10000000.0 10000000.0 \n", + "-43.54 0.82 \n", + "55.12 2.07 \n", + "-45.64 0.52 \n", + "10000000.0 10000000.0 \n", + "-38.84 0.29 \n", + "-2.23 1.11 \n", + "1.52 0.35 \n", + "0.38 0.45 \n", + "-0.73 4.44 \n", + "-58.14 1.95 \n", + "-50.23 1.12 \n", + "-3.02 0.72 \n", + "-1.38 0.78 \n", + "3.03 1.02 \n", + "-43.08 1.18 \n", + "-9.47 1.75 \n", + "9.68 2.19 \n", + "-32.71 2.06 \n", + "46.27 0.78 \n", + "4.26 0.57 \n", + "-23.36 1.11 \n", + "-20.16 1.48 \n", + "50.5 0.9 \n", + "10000000.0 10000000.0 \n", + "50.52 0.67 \n", + "-8.05 0.6 \n", + "-8.47 0.78 \n", + "23.67 0.88 \n", + "6.47 1.34 \n", + "10000000.0 10000000.0 \n", + "-46.71 0.44 \n", + "-113.12 4.99 \n", + "4.98 5.01 \n", + "-2.84 0.54 \n", + "-29.3 6.24 \n", + "4.98 5.36 \n", + "1.02 0.71 \n", + "-75.1 3.04 \n", + "-2.17 0.41 \n", + "-3.33 0.3 \n", + "-43.78 0.93 \n", + "-1.19 0.35 \n", + "-56.13 1.61 \n", + "-57.53 0.74 \n", + "-71.84 0.79 \n", + "-63.83 1.09 \n", + "6.48 0.85 \n", + "-68.43 0.9 \n", + "-68.43 0.9 \n", + "10000000.0 10000000.0 \n", + "-67.19 0.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.79 4.51 \n", + "-44.98 0.33 \n", + "-44.98 0.35 \n", + "9.58 0.8 \n", + "10.37 0.2 \n", + "-22.57 1.11 \n", + "-29.78 7.25 \n", + "-34.59 6.27 \n", + "-111.57 5.41 \n", + "-90.63 6.54 \n", + "14.41 0.79 \n", + "-37.57 6.27 \n", + "-4.6 0.65 \n", + "25.23 0.34 \n", + "25.23 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "44.83 1.11 \n", + "0.18 0.36 \n", + "-43.35 0.35 \n", + "-68.42 0.9 \n", + "-49.26 0.53 \n", + "-43.34 0.35 \n", + "-46.6 0.24 \n", + "-2.67 0.69 \n", + "-43.5 0.33 \n", + "-29.78 7.0 \n", + "-68.43 0.9 \n", + "-68.43 0.9 \n", + "10000000.0 10000000.0 \n", + "-0.37 0.56 \n", + "0.88 0.81 \n", + "0.07 0.57 \n", + "0.46 2.41 \n", + "0.46 2.56 \n", + "57.75 17.24 \n", + "7.79 2.72 \n", + "57.75 12.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.78 1.92 \n", + "-2.18 9.81 \n", + "-57.53 0.74 \n", + "-57.53 0.74 \n", + "-57.53 0.74 \n", + "-97.48 0.85 \n", + "14.27 0.34 \n", + "-52.67 0.22 \n", + "-52.67 0.22 \n", + "-52.67 0.22 \n", + "-44.31 0.33 \n", + "-44.31 0.33 \n", + "-43.89 0.33 \n", + "-43.89 0.33 \n", + "-211.84 1.56 \n", + "-3.35 0.3 \n", + "130.05 1.55 \n", + "133.54 1.53 \n", + "-37.41 0.17 \n", + "-3.36 0.57 \n", + "-3.36 0.57 \n", + "-3.35 0.3 \n", + "-29.78 7.0 \n", + "7.08 1.27 \n", + "142.53 1.46 \n", + "7.08 1.27 \n", + "7.08 1.27 \n", + "9.12 1.25 \n", + "-283.26 1.55 \n", + "10000000.0 10000000.0 \n", + "-68.43 0.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "22.11 0.44 \n", + "-2.17 0.1 \n", + "1.52 1.23 \n", + "-59.66 0.79 \n", + "-59.66 0.79 \n", + "11.19 2.22 \n", + "10000000.0 10000000.0 \n", + "-16.57 1.1 \n", + "-25.76 1.8 \n", + "-22.58 1.25 \n", + "-47.08 1.45 \n", + "-47.08 1.45 \n", + "0.52 0.47 \n", + "-46.45 0.79 \n", + "-20.04 1.5 \n", + "-7.12 2.59 \n", + "-6.52 1.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.77 1.18 \n", + "-118.58 1.24 \n", + "0.53 0.79 \n", + "-1.42 6.63 \n", + "10000000.0 10000000.0 \n", + "-2.18 9.81 \n", + "-2.63 0.42 \n", + "-57.53 0.74 \n", + "-45.52 1.82 \n", + "0.67 0.33 \n", + "0.67 0.33 \n", + "-0.88 0.33 \n", + "-2.43 0.33 \n", + "-3.99 0.33 \n", + "0.67 0.33 \n", + "-0.88 0.33 \n", + "-0.88 0.33 \n", + "-2.43 0.33 \n", + "-3.99 0.33 \n", + "-5.17 0.34 \n", + "-5.17 0.34 \n", + "0.67 0.33 \n", + "-0.88 0.33 \n", + "-0.88 0.33 \n", + "-2.43 0.33 \n", + "-3.98 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.29 0.45 \n", + "-1.34 0.82 \n", + "-97.47 2.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-68.43 0.9 \n", + "5.28 7.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-33.74 0.92 \n", + "10000000.0 10000000.0 \n", + "-121.99 3.7 \n", + "-3.02 0.72 \n", + "-57.53 0.74 \n", + "-22.86 1.16 \n", + "10000000.0 10000000.0 \n", + "-42.27 0.72 \n", + "10000000.0 10000000.0 \n", + "-40.85 8.25 \n", + "-44.4 0.78 \n", + "-44.4 0.78 \n", + "-57.53 0.74 \n", + "-47.23 11.54 \n", + "-47.23 11.54 \n", + "-47.23 11.89 \n", + "-57.75 12.08 \n", + "-57.75 17.25 \n", + "-1.43 16.24 \n", + "-1.43 10.59 \n", + "-46.92 0.51 \n", + "6.69 0.98 \n", + "44.56 2.05 \n", + "-77.93 1.04 \n", + "-79.42 1.49 \n", + "-77.94 1.03 \n", + "-40.11 1.05 \n", + "-77.94 1.03 \n", + "-77.94 1.03 \n", + "10000000.0 10000000.0 \n", + "-0.87 5.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.32 3.39 \n", + "4.7 2.24 \n", + "44.56 2.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "14.27 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-48.59 0.88 \n", + "-45.98 0.86 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "24.01 3.68 \n", + "-81.37 4.17 \n", + "-49.27 0.53 \n", + "11.82 3.81 \n", + "1.18 0.45 \n", + "10000000.0 10000000.0 \n", + "2.22 0.33 \n", + "-43.1 0.37 \n", + "-43.03 0.78 \n", + "-11.1 1.81 \n", + "10000000.0 10000000.0 \n", + "-11.88 0.27 \n", + "10000000.0 10000000.0 \n", + "-4.79 0.88 \n", + "-4.7 0.72 \n", + "-2.46 0.07 \n", + "10000000.0 10000000.0 \n", + "-1.44 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "41.78 0.55 \n", + "41.76 0.58 \n", + "40.36 0.94 \n", + "42.17 0.64 \n", + "21.87 0.43 \n", + "21.86 0.43 \n", + "-42.85 1.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-80.97 0.63 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "-8.11 0.41 \n", + "10000000.0 10000000.0 \n", + "-25.91 1.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.14 0.96 \n", + "-19.35 5.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.32 0.3 \n", + "10000000.0 10000000.0 \n", + "-5.31 0.4 \n", + "-5.31 0.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.65 0.46 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "-5.83 1.19 \n", + "6.02 0.21 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.26 0.28 \n", + "1.99 0.28 \n", + "0.14 0.61 \n", + "-11.8 1.28 \n", + "-11.8 1.28 \n", + "10000000.0 10000000.0 \n", + "14.27 0.34 \n", + "14.27 0.34 \n", + "14.27 0.34 \n", + "14.27 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.46 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-20.97 1.86 \n", + "-4.44 0.46 \n", + "-19.81 0.31 \n", + "10000000.0 10000000.0 \n", + "-3.41 1.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.76 0.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.01 0.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.22 6.14 \n", + "5.22 6.15 \n", + "-4.89 0.25 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "-4.89 0.25 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "-26.84 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.68 0.26 \n", + "-8.68 0.26 \n", + "-8.68 0.26 \n", + "-8.68 0.26 \n", + "-10.64 0.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-43.21 1.06 \n", + "-40.4 1.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.48 0.31 \n", + "-9.17 0.44 \n", + "10000000.0 10000000.0 \n", + "4.47 0.63 \n", + "4.47 0.63 \n", + "1.25 0.43 \n", + "1.25 0.43 \n", + "-1.7 5.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.28 2.3 \n", + "-13.28 2.3 \n", + "-25.44 2.52 \n", + "10000000.0 10000000.0 \n", + "4.89 0.25 \n", + "10000000.0 10000000.0 \n", + "-310.37 1.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-22.97 1.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-22.57 1.11 \n", + "10000000.0 10000000.0 \n", + "0.03 0.46 \n", + "10000000.0 10000000.0 \n", + "-10.95 0.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.36 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 8.27 \n", + "None 8.27 \n", + "10000000.0 10000000.0 \n", + "-7.54 3.31 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.01 0.3 \n", + "-0.11 0.27 \n", + "-69.98 3.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.83 1.48 \n", + "-7.0 1.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-40.11 1.05 \n", + "-41.88 1.52 \n", + "-40.4 1.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.42 1.34 \n", + "10000000.0 10000000.0 \n", + "37.57 5.33 \n", + "-6.88 0.86 \n", + "-12.98 0.87 \n", + "-9.57 0.86 \n", + "-4.01 0.86 \n", + "10000000.0 10000000.0 \n", + "-3.81 0.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "17.21 5.64 \n", + "-11.11 11.3 \n", + "-13.57 12.86 \n", + "-1.48 12.84 \n", + "-8.29 0.26 \n", + "-8.29 0.26 \n", + "-8.29 0.26 \n", + "13.57 12.85 \n", + "10000000.0 10000000.0 \n", + "-8.67 0.3 \n", + "-105.97 0.91 \n", + "2.81 0.44 \n", + "2.1 0.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.61 0.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-62.1 1.36 \n", + "-5.05 0.47 \n", + "-1.34 0.85 \n", + "0.07 0.38 \n", + "0.51 0.84 \n", + "-83.04 6.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.05 2.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.29 0.36 \n", + "-0.29 0.36 \n", + "-7.33 1.45 \n", + "0.63 0.65 \n", + "-0.28 0.38 \n", + "-46.06 1.64 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.51 0.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.27 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.43 0.44 \n", + "10000000.0 10000000.0 \n", + "-2.43 0.44 \n", + "10000000.0 10000000.0 \n", + "-5.72 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.44 1.1 \n", + "0.74 1.21 \n", + "10000000.0 10000000.0 \n", + "-66.71 1.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.6 0.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.7 1.01 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "3.25 0.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.28 0.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.68 0.72 \n", + "-7.69 0.72 \n", + "-7.68 0.72 \n", + "-7.83 0.72 \n", + "-9.06 0.26 \n", + "-13.28 1.2 \n", + "-13.28 1.2 \n", + "-13.4 1.06 \n", + "15.23 1.59 \n", + "0.85 0.65 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.68 0.79 \n", + "-0.48 2.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.71 0.52 \n", + "-3.94 0.48 \n", + "-23.57 1.12 \n", + "1.6 1.2 \n", + "-2.5 0.88 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.13 0.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.74 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.67 0.47 \n", + "3.95 0.44 \n", + "-7.2 0.46 \n", + "10000000.0 10000000.0 \n", + "7.84 0.69 \n", + "-17.37 1.76 \n", + "1.02 0.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.53 0.65 \n", + "10000000.0 10000000.0 \n", + "3.8 0.92 \n", + "10000000.0 10000000.0 \n", + "2.32 0.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.15 0.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.61 0.58 \n", + "-11.13 4.62 \n", + "-4.06 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-72.9 0.83 \n", + "-72.9 0.83 \n", + "10000000.0 10000000.0 \n", + "5.71 1.49 \n", + "14.27 0.34 \n", + "10000000.0 10000000.0 \n", + "42.69 7.71 \n", + "-0.9 0.51 \n", + "-0.9 0.51 \n", + "-6.4 0.52 \n", + "-6.4 0.52 \n", + "2.01 0.36 \n", + "-0.28 0.38 \n", + "-29.55 1.49 \n", + "-3.95 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.44 0.34 \n", + "-8.44 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.78 2.26 \n", + "0.79 0.41 \n", + "10000000.0 10000000.0 \n", + "-16.31 2.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.41 0.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 11.24 \n", + "-14.03 11.24 \n", + "10000000.0 10000000.0 \n", + "7.22 10.93 \n", + "-16.34 10.93 \n", + "-3.7 0.46 \n", + "-0.28 0.38 \n", + "0.59 0.63 \n", + "-3.42 0.46 \n", + "0.29 0.3 \n", + "4.53 0.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "-0.18 0.36 \n", + "-0.18 0.36 \n", + "-0.18 0.36 \n", + "0.25 0.71 \n", + "-0.18 0.36 \n", + "-0.91 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.37 4.36 \n", + "-5.66 0.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.8 0.55 \n", + "-1.84 0.3 \n", + "-1.84 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.13 0.71 \n", + "-18.13 0.71 \n", + "-18.13 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-58.25 2.21 \n", + "-58.25 2.21 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.33 0.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "43.97 0.35 \n", + "43.97 0.35 \n", + "-4.45 0.68 \n", + "-3.31 0.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.82 1.79 \n", + "10000000.0 10000000.0 \n", + "-18.13 0.71 \n", + "-2.81 0.3 \n", + "3.8 0.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.31 0.71 \n", + "-0.26 0.49 \n", + "0.82 0.07 \n", + "10000000.0 10000000.0 \n", + "1.55 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.04 0.39 \n", + "-0.81 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.25 0.1 \n", + "4.36 0.98 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.6 0.32 \n", + "-3.76 0.95 \n", + "10000000.0 10000000.0 \n", + "-2.28 0.35 \n", + "10000000.0 10000000.0 \n", + "0.71 1.21 \n", + "-2.41 0.57 \n", + "-2.78 0.43 \n", + "-0.01 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.5 0.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.04 0.72 \n", + "-5.17 0.59 \n", + "-5.46 0.91 \n", + "-5.46 0.91 \n", + "-5.46 0.91 \n", + "10000000.0 10000000.0 \n", + "-3.51 0.43 \n", + "-3.51 0.43 \n", + "-3.33 0.98 \n", + "-3.2 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.83 0.39 \n", + "-0.45 0.11 \n", + "4.89 0.25 \n", + "-2.37 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.78 1.0 \n", + "10000000.0 10000000.0 \n", + "8.71 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-25.53 4.45 \n", + "-2.82 0.21 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.92 0.91 \n", + "-3.34 0.2 \n", + "-3.34 0.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.7 0.19 \n", + "3.7 0.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.45 0.1 \n", + "-4.59 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.08 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.47 0.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "59.81 0.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.48 0.6 \n", + "-7.41 0.5 \n", + "-17.84 0.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.82 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 4.7 \n", + "-30.61 1.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.01 0.11 \n", + "-4.01 0.11 \n", + "-6.36 0.47 \n", + "4.04 6.28 \n", + "10000000.0 10000000.0 \n", + "-7.01 0.53 \n", + "4.85 0.24 \n", + "10000000.0 10000000.0 \n", + "-27.3 6.45 \n", + "10000000.0 10000000.0 \n", + "-10.7 1.43 \n", + "-14.68 1.32 \n", + "10000000.0 10000000.0 \n", + "-8.11 1.09 \n", + "10000000.0 10000000.0 \n", + "-9.2 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-20.34 1.79 \n", + "-20.34 1.79 \n", + "1.57 3.6 \n", + "-4.5 0.42 \n", + "10000000.0 10000000.0 \n", + "-0.06 0.45 \n", + "10000000.0 10000000.0 \n", + "-85.62 3.51 \n", + "10000000.0 10000000.0 \n", + "-14.03 9.25 \n", + "10000000.0 10000000.0 \n", + "-7.89 0.85 \n", + "10000000.0 10000000.0 \n", + "-9.86 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.75 0.95 \n", + "10000000.0 10000000.0 \n", + "-4.25 0.46 \n", + "-4.87 0.46 \n", + "-1.17 0.71 \n", + "-1.17 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.23 0.41 \n", + "1.95 0.63 \n", + "1.11 0.92 \n", + "1.11 0.92 \n", + "-106.01 0.91 \n", + "-106.01 0.91 \n", + "-4.36 5.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.9 \n", + "-11.08 0.84 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "-1.7 6.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "14.5 0.45 \n", + "14.5 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.19 0.32 \n", + "7.4 0.46 \n", + "7.19 0.32 \n", + "7.19 0.32 \n", + "7.19 0.32 \n", + "7.19 0.32 \n", + "10000000.0 10000000.0 \n", + "-7.19 0.32 \n", + "7.4 0.46 \n", + "-7.66 0.45 \n", + "-7.19 0.32 \n", + "-7.19 0.32 \n", + "-7.19 0.32 \n", + "7.19 0.32 \n", + "-0.28 0.38 \n", + "-3.8 0.45 \n", + "10000000.0 10000000.0 \n", + "-12.1 0.51 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.32 0.47 \n", + "-8.47 0.58 \n", + "-1.15 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.07 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.92 1.01 \n", + "-6.81 0.68 \n", + "-10.56 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-72.5 2.82 \n", + "-72.5 2.82 \n", + "-126.88 4.94 \n", + "-126.88 4.94 \n", + "-54.38 2.12 \n", + "-54.38 2.12 \n", + "None 1.94 \n", + "None 0.62 \n", + "None 0.59 \n", + "10000000.0 10000000.0 \n", + "None 0.48 \n", + "10000000.0 10000000.0 \n", + "None 2.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "None 7.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "-9.34 0.31 \n", + "-9.34 0.31 \n", + "-8.98 0.74 \n", + "-11.04 0.45 \n", + "-10.05 0.35 \n", + "None 0.54 \n", + "-10.28 0.36 \n", + "-10.79 0.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.12 \n", + "10000000.0 10000000.0 \n", + "None 2.18 \n", + "None None \n", + "None 1.44 \n", + "None 1.44 \n", + "None 0.72 \n", + "None 0.72 \n", + "None 0.86 \n", + "None 0.86 \n", + "None 0.54 \n", + "None 1.37 \n", + "None 2.19 \n", + "None 0.71 \n", + "None 1.94 \n", + "None 2.25 \n", + "None 1.16 \n", + "None 1.94 \n", + "None 1.85 \n", + "10000000.0 10000000.0 \n", + "None 1.15 \n", + "10000000.0 10000000.0 \n", + "None 1.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.16 \n", + "None 1.16 \n", + "None 2.38 \n", + "-6.16 0.07 \n", + "None 1.04 \n", + "None 2.35 \n", + "None 2.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.26 \n", + "None 1.94 \n", + "None 3.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.64 \n", + "10000000.0 10000000.0 \n", + "-6.81 4.9 \n", + "None 0.62 \n", + "None 0.64 \n", + "None 0.78 \n", + "10000000.0 10000000.0 \n", + "None 1.26 \n", + "10000000.0 10000000.0 \n", + "None 8.12 \n", + "None 2.21 \n", + "10000000.0 10000000.0 \n", + "None 0.35 \n", + "None 1.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.16 \n", + "None 11.54 \n", + "10000000.0 10000000.0 \n", + "None 1.9 \n", + "None 1.9 \n", + "10000000.0 10000000.0 \n", + "None 2.79 \n", + "None 4.57 \n", + "-9.32 0.31 \n", + "None 0.76 \n", + "None 1.85 \n", + "None 1.67 \n", + "None 1.95 \n", + "-6.81 4.77 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 2.14 \n", + "None 2.42 \n", + "None 2.36 \n", + "None 1.8 \n", + "None 0.34 \n", + "None 1.47 \n", + "10000000.0 10000000.0 \n", + "None 8.6 \n", + "None 3.8 \n", + "None 3.89 \n", + "None 3.95 \n", + "None 0.41 \n", + "None 0.71 \n", + "None 4.26 \n", + "10000000.0 10000000.0 \n", + "None 0.41 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.87 \n", + "None 2.96 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "None 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.75 \n", + "None 1.22 \n", + "None 1.98 \n", + "None 2.25 \n", + "None 0.25 \n", + "None 0.42 \n", + "None 4.27 \n", + "None 0.71 \n", + "None 0.69 \n", + "None 0.71 \n", + "-6.16 0.07 \n", + "None 6.08 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.69 \n", + "10000000.0 10000000.0 \n", + "None 2.14 \n", + "None 1.0 \n", + "None 1.91 \n", + "None 1.91 \n", + "None 1.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.94 \n", + "10000000.0 10000000.0 \n", + "None 1.1 \n", + "10000000.0 10000000.0 \n", + "None 4.3 \n", + "10000000.0 10000000.0 \n", + "None 4.3 \n", + "None 4.29 \n", + "None 5.37 \n", + "None 2.72 \n", + "None 2.72 \n", + "None 2.73 \n", + "None 4.21 \n", + "None 2.6 \n", + "None 2.59 \n", + "None 2.62 \n", + "None 3.8 \n", + "None 3.79 \n", + "None 2.55 \n", + "None 2.55 \n", + "None 2.56 \n", + "None 3.87 \n", + "None 3.87 \n", + "None 3.87 \n", + "None 2.5 \n", + "None 2.5 \n", + "None 2.67 \n", + "None 2.66 \n", + "None 2.69 \n", + "10000000.0 10000000.0 \n", + "None 3.9 \n", + "10000000.0 10000000.0 \n", + "None 1.24 \n", + "None 1.29 \n", + "None 2.14 \n", + "None 1.99 \n", + "None 1.9 \n", + "None 0.44 \n", + "None 0.78 \n", + "None 1.16 \n", + "None 2.5 \n", + "None 4.51 \n", + "None 1.77 \n", + "None 1.67 \n", + "None 1.46 \n", + "None 0.66 \n", + "None 1.88 \n", + "None 1.81 \n", + "None 0.35 \n", + "None 1.9 \n", + "None 1.27 \n", + "None 0.68 \n", + "10000000.0 10000000.0 \n", + "None 1.64 \n", + "None 1.47 \n", + "None 0.76 \n", + "None 1.9 \n", + "None 4.27 \n", + "None 2.18 \n", + "None 2.18 \n", + "None 0.92 \n", + "None 1.94 \n", + "None 1.94 \n", + "None 4.27 \n", + "None 6.41 \n", + "None 2.14 \n", + "10000000.0 10000000.0 \n", + "None 4.27 \n", + "None 5.84 \n", + "None 4.89 \n", + "None 4.89 \n", + "None 2.12 \n", + "None 3.92 \n", + "None 2.12 \n", + "None 6.01 \n", + "None 3.86 \n", + "None 3.92 \n", + "None 1.92 \n", + "None 1.94 \n", + "None 1.94 \n", + "None 1.94 \n", + "None 1.94 \n", + "None 1.92 \n", + "None 1.92 \n", + "None 2.01 \n", + "None 4.21 \n", + "None 2.18 \n", + "None 2.18 \n", + "None 4.27 \n", + "None 4.23 \n", + "None 4.27 \n", + "None 1.94 \n", + "None 1.13 \n", + "None 3.92 \n", + "None 1.4 \n", + "None 2.31 \n", + "None 4.27 \n", + "None 2.18 \n", + "None 4.27 \n", + "None 2.14 \n", + "None 15.0 \n", + "None 12.86 \n", + "None 17.14 \n", + "None 2.53 \n", + "None 2.67 \n", + "None 4.09 \n", + "None 1.94 \n", + "None 1.91 \n", + "None 2.79 \n", + "None 10.68 \n", + "None 6.11 \n", + "None 10.27 \n", + "None 12.4 \n", + "None 6.41 \n", + "None 6.02 \n", + "None 8.13 \n", + "None 6.02 \n", + "None 8.13 \n", + "None 1.73 \n", + "10000000.0 10000000.0 \n", + "None 3.68 \n", + "None 1.8 \n", + "None 1.87 \n", + "None 1.09 \n", + "None 1.88 \n", + "None 1.88 \n", + "None 1.88 \n", + "None 1.88 \n", + "None 1.9 \n", + "None 1.9 \n", + "None 1.88 \n", + "None 10.18 \n", + "None 1.94 \n", + "None 7.58 \n", + "None 2.4 \n", + "None 4.27 \n", + "None 2.4 \n", + "None 2.4 \n", + "None 2.55 \n", + "None 2.12 \n", + "None 2.12 \n", + "None 1.26 \n", + "None 14.95 \n", + "None 7.51 \n", + "None 2.22 \n", + "10000000.0 10000000.0 \n", + "None 2.14 \n", + "None 1.85 \n", + "None 2.18 \n", + "None 0.68 \n", + "None 2.18 \n", + "None 0.88 \n", + "None 0.74 \n", + "None 0.68 \n", + "None 1.4 \n", + "None 2.14 \n", + "None 2.18 \n", + "None 2.18 \n", + "10000000.0 10000000.0 \n", + "None 12.06 \n", + "None 1.02 \n", + "None 1.94 \n", + "None 0.91 \n", + "None 1.06 \n", + "None 1.0 \n", + "None 0.91 \n", + "10000000.0 10000000.0 \n", + "None 1.0 \n", + "None 2.31 \n", + "None 2.36 \n", + "None 1.16 \n", + "None 2.12 \n", + "None 1.02 \n", + "None 1.13 \n", + "10000000.0 10000000.0 \n", + "None 1.41 \n", + "None 1.16 \n", + "None 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.64 \n", + "None 1.47 \n", + "None 5.74 \n", + "None 1.9 \n", + "None 5.74 \n", + "None 5.74 \n", + "None 4.27 \n", + "None 2.18 \n", + "None 2.18 \n", + "None 4.27 \n", + "None 2.18 \n", + "None 0.92 \n", + "None 1.94 \n", + "None 1.92 \n", + "None 1.94 \n", + "None 7.58 \n", + "None 4.27 \n", + "None 6.41 \n", + "None 4.57 \n", + "None 2.14 \n", + "10000000.0 10000000.0 \n", + "None 4.27 \n", + "None 5.84 \n", + "None 4.89 \n", + "None 4.89 \n", + "None 2.12 \n", + "None 3.92 \n", + "None 2.12 \n", + "None 6.01 \n", + "None 3.86 \n", + "None 3.92 \n", + "None 1.92 \n", + "None 1.94 \n", + "None 1.94 \n", + "None 1.94 \n", + "None 1.94 \n", + "None 1.92 \n", + "None 1.92 \n", + "None 2.01 \n", + "None 4.21 \n", + "None 2.18 \n", + "None 2.18 \n", + "None 4.27 \n", + "None 4.23 \n", + "None 4.27 \n", + "None 1.94 \n", + "None 7.58 \n", + "None 1.4 \n", + "None 2.18 \n", + "None 1.4 \n", + "None 15.0 \n", + "None 12.86 \n", + "None 17.14 \n", + "None 2.53 \n", + "None 2.67 \n", + "None 4.09 \n", + "None 1.94 \n", + "None 1.91 \n", + "None 2.79 \n", + "None 10.68 \n", + "None 6.11 \n", + "None 10.27 \n", + "None 12.4 \n", + "None 6.41 \n", + "None 6.02 \n", + "None 8.13 \n", + "None 6.02 \n", + "None 8.13 \n", + "None 1.73 \n", + "10000000.0 10000000.0 \n", + "None 3.68 \n", + "None 1.8 \n", + "None 1.87 \n", + "None 1.09 \n", + "None 1.88 \n", + "None 1.88 \n", + "None 1.88 \n", + "None 1.88 \n", + "None 1.9 \n", + "None 1.9 \n", + "None 1.88 \n", + "None 10.18 \n", + "None 1.94 \n", + "None 7.58 \n", + "None 1.16 \n", + "None 2.4 \n", + "None 4.27 \n", + "None 2.4 \n", + "None 2.4 \n", + "None 2.55 \n", + "None 2.12 \n", + "None 1.91 \n", + "None 1.94 \n", + "None 2.12 \n", + "None 1.26 \n", + "None 14.95 \n", + "None 7.51 \n", + "None 2.22 \n", + "10000000.0 10000000.0 \n", + "None 2.14 \n", + "None 1.85 \n", + "None 2.18 \n", + "None 0.68 \n", + "None 2.18 \n", + "None 0.91 \n", + "None 0.74 \n", + "None 0.68 \n", + "None 2.18 \n", + "None 2.18 \n", + "None 0.49 \n", + "None 2.18 \n", + "None 2.18 \n", + "10000000.0 10000000.0 \n", + "None 12.06 \n", + "None 1.02 \n", + "None 1.94 \n", + "None 0.91 \n", + "None 1.06 \n", + "None 1.0 \n", + "None 0.91 \n", + "10000000.0 10000000.0 \n", + "None 1.0 \n", + "None 4.27 \n", + "None 8.53 \n", + "None 2.28 \n", + "None 2.31 \n", + "None 2.31 \n", + "None 2.19 \n", + "None 2.36 \n", + "None 2.12 \n", + "None 1.02 \n", + "10000000.0 10000000.0 \n", + "None 1.41 \n", + "None 0.74 \n", + "None 1.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 3.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.81 4.75 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.81 8.74 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 13.57 \n", + "-6.81 17.69 \n", + "-6.81 11.53 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 7.59 \n", + "None 4.3 \n", + "None 6.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 5.74 \n", + "None 5.74 \n", + "None 5.74 \n", + "None 7.58 \n", + "None 4.57 \n", + "10000000.0 10000000.0 \n", + "None 5.84 \n", + "None 7.58 \n", + "None 15.0 \n", + "None 12.86 \n", + "None 17.14 \n", + "None 10.68 \n", + "10000000.0 10000000.0 \n", + "None 7.58 \n", + "None 2.4 \n", + "None 4.27 \n", + "None 2.4 \n", + "None 2.4 \n", + "None 2.55 \n", + "None 12.06 \n", + "10000000.0 10000000.0 \n", + "None 7.58 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.3 \n", + "None 5.37 \n", + "None 2.72 \n", + "None 2.73 \n", + "None 4.21 \n", + "None 4.23 \n", + "None 2.6 \n", + "None 2.59 \n", + "None 2.62 \n", + "None 3.8 \n", + "None 3.79 \n", + "None 3.8 \n", + "None 2.55 \n", + "None 2.55 \n", + "None 2.56 \n", + "None 3.87 \n", + "None 3.89 \n", + "None 3.87 \n", + "None 2.5 \n", + "None 2.52 \n", + "None 2.67 \n", + "None 2.69 \n", + "None 2.21 \n", + "None 1.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.99 \n", + "None 3.68 \n", + "None 1.27 \n", + "10000000.0 10000000.0 \n", + "None 5.2 \n", + "10000000.0 10000000.0 \n", + "None 1.47 \n", + "10000000.0 10000000.0 \n", + "None 1.27 \n", + "None 4.47 \n", + "10000000.0 10000000.0 \n", + "None 2.91 \n", + "None 2.96 \n", + "None 5.54 \n", + "None 7.68 \n", + "None 7.65 \n", + "None 5.35 \n", + "None 6.9 \n", + "None 4.41 \n", + "None 4.26 \n", + "None 6.36 \n", + "None 4.17 \n", + "None 4.04 \n", + "None 4.14 \n", + "None 5.06 \n", + "None 5.23 \n", + "None 5.23 \n", + "None 5.23 \n", + "None 5.54 \n", + "None 4.37 \n", + "None 4.2 \n", + "None 4.41 \n", + "None 4.37 \n", + "None 4.37 \n", + "None 4.58 \n", + "None 4.89 \n", + "None 4.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.12 \n", + "0.64 0.48 \n", + "10000000.0 10000000.0 \n", + "-1.98 0.65 \n", + "-6.33 0.77 \n", + "-6.37 0.7 \n", + "-1.67 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.29 0.76 \n", + "10000000.0 10000000.0 \n", + "-90.63 6.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.32 1.06 \n", + "-6.28 0.55 \n", + "10000000.0 10000000.0 \n", + "0.03 0.34 \n", + "0.44 0.85 \n", + "-4.01 0.86 \n", + "-3.81 0.62 \n", + "-3.78 0.56 \n", + "-3.35 0.56 \n", + "-22.58 1.11 \n", + "-2.42 0.72 \n", + "-3.09 0.3 \n", + "-4.86 0.32 \n", + "-14.34 2.92 \n", + "-14.34 0.96 \n", + "-14.34 2.31 \n", + "-2.82 0.21 \n", + "-6.09 0.58 \n", + "-0.44 0.64 \n", + "97.86 0.39 \n", + "-22.57 1.11 \n", + "-22.58 1.11 \n", + "-2.46 0.07 \n", + "-2.79 0.26 \n", + "-7.08 0.97 \n", + "-2.65 0.53 \n", + "10000000.0 10000000.0 \n", + "-22.97 1.17 \n", + "-3.94 0.96 \n", + "10000000.0 10000000.0 \n", + "-5.49 0.18 \n", + "-5.3 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.26 6.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.01 0.86 \n", + "-4.43 0.87 \n", + "3.14 0.12 \n", + "-13.75 0.86 \n", + "6.3 0.96 \n", + "-7.27 0.59 \n", + "1.3 1.08 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "-0.18 0.36 \n", + "55.69 0.97 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.83 \n", + "-100.75 7.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.45 1.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-22.96 10.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.92 3.6 \n", + "10000000.0 10000000.0 \n", + "-95.83 6.54 \n", + "10000000.0 10000000.0 \n", + "None 9.31 \n", + "-72.92 13.72 \n", + "-16.97 8.27 \n", + "10000000.0 10000000.0 \n", + "-6.02 0.56 \n", + "-3.29 0.65 \n", + "10000000.0 10000000.0 \n", + "-2.79 0.3 \n", + "10000000.0 10000000.0 \n", + "-4.31 0.75 \n", + "-11.13 4.58 \n", + "-78.4 9.73 \n", + "54.28 7.88 \n", + "200.09 0.35 \n", + "10000000.0 10000000.0 \n", + "-65.98 8.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.35 5.45 \n", + "-16.76 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.24 0.86 \n", + "10000000.0 10000000.0 \n", + "-94.13 0.75 \n", + "10000000.0 10000000.0 \n", + "-40.52 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.99 8.21 \n", + "10000000.0 10000000.0 \n", + "-2.67 10.86 \n", + "9.59 5.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-95.07 0.74 \n", + "-69.98 3.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.67 0.27 \n", + "10000000.0 10000000.0 \n", + "-22.58 1.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.91 1.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 4.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-198.42 18.99 \n", + "-1.17 0.9 \n", + "10000000.0 10000000.0 \n", + "-34.54 1.84 \n", + "10000000.0 10000000.0 \n", + "-21.34 7.18 \n", + "4.39 0.24 \n", + "10000000.0 10000000.0 \n", + "-8.48 0.27 \n", + "10000000.0 10000000.0 \n", + "-13.27 4.92 \n", + "-18.75 0.66 \n", + "-0.74 9.0 \n", + "10000000.0 10000000.0 \n", + "0.14 0.76 \n", + "10000000.0 10000000.0 \n", + "2.0 0.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.3 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.42 0.55 \n", + "10000000.0 10000000.0 \n", + "-88.54 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.87 0.56 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-106.05 1.23 \n", + "10000000.0 10000000.0 \n", + "-2.0 0.53 \n", + "-29.54 8.86 \n", + "9.99 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.21 1.15 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.32 0.45 \n", + "10000000.0 10000000.0 \n", + "126.15 13.43 \n", + "-26.44 9.74 \n", + "-5.66 0.34 \n", + "10000000.0 10000000.0 \n", + "3.39 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.51 3.48 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "-94.2 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.41 0.31 \n", + "9.97 5.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "-13.48 0.98 \n", + "223.04 1.0 \n", + "-94.13 0.75 \n", + "-0.49 0.41 \n", + "-19.23 2.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-86.53 5.81 \n", + "6.48 1.0 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "-117.19 10.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.63 3.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-45.61 5.06 \n", + "10000000.0 10000000.0 \n", + "-4.36 11.1 \n", + "3.76 6.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-207.61 2.41 \n", + "-6.16 0.07 \n", + "-2.82 0.98 \n", + "3.11 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.14 0.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.72 2.11 \n", + "6.25 13.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.24 5.03 \n", + "10000000.0 10000000.0 \n", + "-21.89 1.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.14 0.76 \n", + "13.27 0.43 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 10.1 \n", + "10000000.0 10000000.0 \n", + "-4.05 7.18 \n", + "10000000.0 10000000.0 \n", + "-3.88 0.56 \n", + "-4.15 0.51 \n", + "-14.03 11.03 \n", + "116.63 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-213.4 13.01 \n", + "-2.17 0.53 \n", + "-40.05 2.16 \n", + "-26.84 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-107.56 1.33 \n", + "-4.36 6.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.22 3.07 \n", + "10000000.0 10000000.0 \n", + "-10.46 5.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.51 8.66 \n", + "-9.45 0.51 \n", + "10000000.0 10000000.0 \n", + "10.93 5.09 \n", + "-14.27 0.34 \n", + "10000000.0 10000000.0 \n", + "6.48 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "120.89 2.46 \n", + "10000000.0 10000000.0 \n", + "-17.62 0.92 \n", + "-90.63 6.26 \n", + "-1.21 0.54 \n", + "10000000.0 10000000.0 \n", + "142.02 2.84 \n", + "-4.03 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.9 0.49 \n", + "-2.79 0.79 \n", + "10000000.0 10000000.0 \n", + "-3.11 4.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.96 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.69 0.61 \n", + "-2.16 0.33 \n", + "-13.15 7.39 \n", + "10000000.0 10000000.0 \n", + "457.6 1.88 \n", + "10000000.0 10000000.0 \n", + "-18.46 1.09 \n", + "10000000.0 10000000.0 \n", + "-3.89 0.79 \n", + "None 6.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-98.05 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.32 6.94 \n", + "10000000.0 10000000.0 \n", + "-15.63 3.0 \n", + "None 2.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "19.12 6.0 \n", + "10.72 2.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-25.38 7.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.84 0.41 \n", + "10000000.0 10000000.0 \n", + "-17.46 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-44.49 2.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-91.65 4.65 \n", + "10000000.0 10000000.0 \n", + "-0.52 0.41 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.14 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.7 0.1 \n", + "10000000.0 10000000.0 \n", + "None 1.88 \n", + "10000000.0 10000000.0 \n", + "196.93 0.44 \n", + "10000000.0 10000000.0 \n", + "-90.63 6.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.13 4.71 \n", + "-3.11 14.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.02 0.56 \n", + "9.6 1.73 \n", + "10000000.0 10000000.0 \n", + "-130.02 5.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 4.89 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "-18.75 0.66 \n", + "-3.33 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.17 1.07 \n", + "-20.37 22.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.35 \n", + "10000000.0 10000000.0 \n", + "0.86 0.56 \n", + "-109.84 1.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.24 0.27 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "-3.88 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.04 0.55 \n", + "-1.7 5.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.75 1.76 \n", + "-2.18 0.53 \n", + "-14.03 6.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "14.27 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-75.36 8.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.7 \n", + "-0.05 0.55 \n", + "-4.5 6.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.81 1.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 6.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "571.22 1.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.05 0.55 \n", + "10000000.0 10000000.0 \n", + "424.49 2.63 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.61 0.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.05 6.25 \n", + "10000000.0 10000000.0 \n", + "-0.92 2.06 \n", + "-23.89 9.23 \n", + "-1.01 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.46 7.09 \n", + "4.52 1.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-114.38 1.15 \n", + "-3.76 11.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.34 11.16 \n", + "-2.78 1.11 \n", + "1.42 0.85 \n", + "10000000.0 10000000.0 \n", + "0.18 1.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.13 0.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.56 0.9 \n", + "-31.45 6.18 \n", + "-3.29 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.9 1.64 \n", + "-2.95 1.82 \n", + "10000000.0 10000000.0 \n", + "1.24 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.89 0.24 \n", + "3.68 2.4 \n", + "-4.7 0.75 \n", + "10000000.0 10000000.0 \n", + "-2.28 0.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.71 1.17 \n", + "9.59 5.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.13 1.64 \n", + "-9.87 1.85 \n", + "10000000.0 10000000.0 \n", + "-5.72 1.34 \n", + "10000000.0 10000000.0 \n", + "-2.63 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.18 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 5.56 \n", + "-0.46 7.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "44.77 1.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.51 0.46 \n", + "9.85 8.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-100.63 1.78 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-23.57 10.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.84 0.75 \n", + "-0.18 0.36 \n", + "5.2 5.26 \n", + "16.58 0.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-95.63 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-48.33 5.01 \n", + "-4.36 6.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.21 \n", + "-99.17 1.12 \n", + "10000000.0 10000000.0 \n", + "0.85 0.65 \n", + "-20.03 1.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 1.63 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "148.82 2.35 \n", + "-7.38 4.46 \n", + "-5.45 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.01 0.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-175.97 2.96 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.76 6.69 \n", + "-0.46 1.62 \n", + "-10.96 0.39 \n", + "5.14 1.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-108.28 1.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "-194.4 1.6 \n", + "-56.98 4.99 \n", + "-130.02 5.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-83.01 2.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-68.9 1.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-101.89 1.16 \n", + "-18.0 5.04 \n", + "10000000.0 10000000.0 \n", + "-1.83 1.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.34 1.38 \n", + "10000000.0 10000000.0 \n", + "-4.57 0.91 \n", + "10000000.0 10000000.0 \n", + "-11.83 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.03 0.58 \n", + "10000000.0 10000000.0 \n", + "-1.83 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.12 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-20.64 8.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.46 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.24 1.65 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.1 3.32 \n", + "10000000.0 10000000.0 \n", + "6.18 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.21 0.92 \n", + "None None \n", + "-26.9 2.96 \n", + "-4.36 7.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.15 0.94 \n", + "14.27 0.34 \n", + "-6.16 0.07 \n", + "-4.95 0.47 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.02 \n", + "-1.7 36.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.12 1.07 \n", + "21.7 1.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.88 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.13 4.82 \n", + "-76.61 4.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 3.03 \n", + "9.53 8.67 \n", + "-14.03 9.6 \n", + "14.58 4.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.93 0.53 \n", + "4.87 0.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "11.97 2.69 \n", + "-13.21 1.07 \n", + "-3.25 7.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.17 0.81 \n", + "-3.82 0.44 \n", + "-72.84 2.49 \n", + "-10.76 9.05 \n", + "-6.73 0.55 \n", + "-3.35 0.3 \n", + "10000000.0 10000000.0 \n", + "-10.74 2.38 \n", + "10000000.0 10000000.0 \n", + "-1.7 8.11 \n", + "10000000.0 10000000.0 \n", + "-194.4 1.6 \n", + "4.89 0.25 \n", + "10000000.0 10000000.0 \n", + "-8.7 0.26 \n", + "1.39 5.32 \n", + "-5.68 0.95 \n", + "10000000.0 10000000.0 \n", + "-5.5 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.37 0.76 \n", + "-88.3 1.92 \n", + "10000000.0 10000000.0 \n", + "-8.15 1.08 \n", + "-76.08 10.23 \n", + "10000000.0 10000000.0 \n", + "-48.98 8.47 \n", + "10000000.0 10000000.0 \n", + "None 1.07 \n", + "None None \n", + "-4.36 6.35 \n", + "10000000.0 10000000.0 \n", + "4.29 4.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.01 0.3 \n", + "4.52 1.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.55 7.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.61 8.95 \n", + "10000000.0 10000000.0 \n", + "-9.06 0.26 \n", + "-0.46 1.49 \n", + "-4.05 7.34 \n", + "10000000.0 10000000.0 \n", + "0.58 0.59 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "6.48 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "30.36 6.91 \n", + "10000000.0 10000000.0 \n", + "-5.84 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.48 0.39 \n", + "-0.18 0.36 \n", + "18.9 1.26 \n", + "-0.69 0.17 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.31 2.13 \n", + "10000000.0 10000000.0 \n", + "59.92 3.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-281.44 9.14 \n", + "10000000.0 10000000.0 \n", + "-2.14 2.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.53 8.39 \n", + "10000000.0 10000000.0 \n", + "4.52 1.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.43 2.31 \n", + "4.24 5.02 \n", + "-0.71 0.76 \n", + "-13.12 0.99 \n", + "10000000.0 10000000.0 \n", + "-105.51 1.72 \n", + "506.24 4.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.43 9.95 \n", + "10000000.0 10000000.0 \n", + "-3.62 0.45 \n", + "-32.05 1.14 \n", + "10000000.0 10000000.0 \n", + "-4.62 1.33 \n", + "10000000.0 10000000.0 \n", + "-0.54 0.38 \n", + "-0.37 0.55 \n", + "-3.04 0.42 \n", + "-2.94 3.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.94 0.17 \n", + "10000000.0 10000000.0 \n", + "-124.4 2.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-98.05 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.85 0.65 \n", + "10000000.0 10000000.0 \n", + "-3.11 7.33 \n", + "96.34 10.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "-4.36 6.28 \n", + "-13.15 1.07 \n", + "-19.51 1.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.6 0.3 \n", + "-0.34 1.02 \n", + "-0.57 1.12 \n", + "10000000.0 10000000.0 \n", + "-0.98 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.71 2.4 \n", + "-4.21 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.88 0.53 \n", + "10000000.0 10000000.0 \n", + "1.4 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.83 0.86 \n", + "None 11.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.33 0.3 \n", + "10000000.0 10000000.0 \n", + "-62.92 0.36 \n", + "-28.67 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-255.74 1.15 \n", + "-127.87 0.57 \n", + "112.49 0.6 \n", + "-63.23 0.34 \n", + "-161.65 0.45 \n", + "-160.81 0.38 \n", + "-373.63 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-161.84 0.37 \n", + "-126.2 0.7 \n", + "119.44 0.66 \n", + "156.78 7.34 \n", + "-166.71 0.3 \n", + "-166.51 0.36 \n", + "-64.58 0.19 \n", + "-165.9 0.57 \n", + "-184.1 1.79 \n", + "-64.18 0.33 \n", + "-379.34 0.38 \n", + "-377.25 0.63 \n", + "-379.53 0.29 \n", + "-96.24 0.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.04 0.28 \n", + "-95.43 1.24 \n", + "-166.06 0.35 \n", + "-609.34 2.43 \n", + "-181.43 0.62 \n", + "10000000.0 10000000.0 \n", + "-17.09 3.54 \n", + "10000000.0 10000000.0 \n", + "11.65 0.71 \n", + "333.88 0.31 \n", + "-16.47 1.01 \n", + "10000000.0 10000000.0 \n", + "2.24 1.84 \n", + "-284.26 0.95 \n", + "34.6 0.74 \n", + "14.04 0.24 \n", + "-141.33 0.56 \n", + "234.13 3.51 \n", + "301.66 1.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.34 0.34 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.03 0.53 \n", + "-2.18 0.53 \n", + "-20.08 2.27 \n", + "46.75 1.89 \n", + "-190.44 12.87 \n", + "10000000.0 10000000.0 \n", + "36.55 4.25 \n", + "-105.97 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "79.64 6.97 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-116.35 1.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-28.4 5.42 \n", + "-5.33 6.57 \n", + "-3.21 5.18 \n", + "11.04 4.48 \n", + "-41.76 7.45 \n", + "54.66 5.91 \n", + "109.41 7.05 \n", + "89.95 0.37 \n", + "89.75 0.37 \n", + "-5.62 2.59 \n", + "3.13 0.97 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-116.52 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-31.43 2.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.53 0.8 \n", + "10000000.0 10000000.0 \n", + "15.46 1.01 \n", + "-53.62 0.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-89.59 0.37 \n", + "-80.97 0.63 \n", + "10000000.0 10000000.0 \n", + "-11.9 5.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.45 1.04 \n", + "9.37 2.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.43 0.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-101.27 79.49 \n", + "-40.25 2.59 \n", + "-29.75 2.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-115.73 1.59 \n", + "-12.56 6.38 \n", + "-12.56 3.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "-0.28 0.37 \n", + "-4.52 1.9 \n", + "-95.07 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.54 0.35 \n", + "-95.07 0.74 \n", + "-15.54 0.35 \n", + "-4.52 1.9 \n", + "-79.81 0.75 \n", + "-15.54 0.35 \n", + "-81.94 0.8 \n", + "-15.54 0.35 \n", + "-95.07 0.74 \n", + "-95.07 0.74 \n", + "-95.07 0.74 \n", + "-97.48 0.85 \n", + "-97.48 0.85 \n", + "-97.48 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-27.25 1.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "15.54 0.35 \n", + "10000000.0 10000000.0 \n", + "-15.54 0.35 \n", + "15.54 0.35 \n", + "10000000.0 10000000.0 \n", + "-26.34 1.67 \n", + "15.54 0.35 \n", + "15.54 0.35 \n", + "-81.94 0.8 \n", + "11.92 1.1 \n", + "17.07 7.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.52 1.9 \n", + "1.63 1.66 \n", + "1.99 9.77 \n", + "-4.5 9.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.99 0.31 \n", + "1.99 9.76 \n", + "-4.5 9.72 \n", + "10.74 1.9 \n", + "-13.87 0.31 \n", + "-5.93 0.97 \n", + "30.79 0.38 \n", + "-20.22 0.96 \n", + "-8.82 9.8 \n", + "17.25 1.0 \n", + "17.25 0.43 \n", + "-22.91 1.01 \n", + "-20.64 5.57 \n", + "-14.92 1.4 \n", + "-14.92 1.4 \n", + "-20.64 5.74 \n", + "10.3 11.47 \n", + "14.27 0.34 \n", + "17.25 0.43 \n", + "19.66 0.39 \n", + "-69.79 0.78 \n", + "45.39 1.55 \n", + "45.39 1.55 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "-125.1 2.77 \n", + "1.56 1.73 \n", + "-0.38 0.45 \n", + "-0.99 0.31 \n", + "22.7 0.78 \n", + "-0.38 0.45 \n", + "46.38 1.46 \n", + "-4.36 11.25 \n", + "-0.38 0.45 \n", + "22.7 0.78 \n", + "-4.36 11.69 \n", + "-90.63 0.77 \n", + "-90.63 0.77 \n", + "-4.36 10.53 \n", + "-0.38 0.45 \n", + "-4.36 10.24 \n", + "-40.48 0.31 \n", + "-40.48 0.31 \n", + "-8.25 8.5 \n", + "14.65 8.23 \n", + "21.75 8.61 \n", + "-4.36 10.21 \n", + "-0.38 0.45 \n", + "-90.63 0.77 \n", + "-90.63 0.77 \n", + "-0.38 0.45 \n", + "-21.7 0.82 \n", + "-18.94 1.93 \n", + "-40.64 2.05 \n", + "-0.38 0.45 \n", + "-60.45 1.03 \n", + "10000000.0 10000000.0 \n", + "-60.45 1.03 \n", + "10000000.0 10000000.0 \n", + "-117.75 0.56 \n", + "-56.02 0.43 \n", + "-40.48 0.31 \n", + "15.54 0.35 \n", + "-77.26 0.42 \n", + "40.49 1.03 \n", + "-40.48 0.31 \n", + "-102.07 0.62 \n", + "-40.48 0.31 \n", + "-56.02 0.43 \n", + "-40.48 0.31 \n", + "-40.48 0.31 \n", + "-37.89 3.87 \n", + "-40.48 0.31 \n", + "-56.02 0.43 \n", + "-56.02 0.43 \n", + "-56.02 0.43 \n", + "-40.48 0.31 \n", + "-40.48 0.31 \n", + "-56.02 0.43 \n", + "-40.48 0.31 \n", + "-56.02 0.43 \n", + "-7.75 1.12 \n", + "-0.78 0.68 \n", + "-34.98 9.36 \n", + "15.54 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.05 0.32 \n", + "2.22 0.33 \n", + "2.22 0.33 \n", + "114.47 1.07 \n", + "156.79 1.22 \n", + "199.11 1.37 \n", + "1.83 0.32 \n", + "1.83 0.32 \n", + "1.83 0.32 \n", + "156.79 1.22 \n", + "199.11 1.37 \n", + "241.42 1.53 \n", + "156.79 1.22 \n", + "156.79 1.22 \n", + "156.79 1.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.72 0.82 \n", + "-2.81 4.39 \n", + "-5.98 1.06 \n", + "10000000.0 10000000.0 \n", + "-5.72 0.82 \n", + "10000000.0 10000000.0 \n", + "35.44 13.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-75.57 1.47 \n", + "-14.68 1.18 \n", + "10000000.0 10000000.0 \n", + "6.48 0.85 \n", + "-8.49 1.17 \n", + "-44.4 2.74 \n", + "-7.15 0.85 \n", + "-7.15 0.85 \n", + "2.81 0.97 \n", + "5.28 1.21 \n", + "10000000.0 10000000.0 \n", + "-7.85 7.07 \n", + "10000000.0 10000000.0 \n", + "-34.59 5.98 \n", + "10000000.0 10000000.0 \n", + "1.4 0.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-39.74 2.33 \n", + "-47.96 2.47 \n", + "-44.9 2.32 \n", + "-5.22 0.84 \n", + "-0.08 1.03 \n", + "769.66 1.99 \n", + "-2.96 0.92 \n", + "-109.25 0.25 \n", + "-58.45 0.54 \n", + "260.65 1.26 \n", + "-71.03 1.84 \n", + "-3.06 0.93 \n", + "7.82 0.58 \n", + "1.1 1.33 \n", + "9.53 8.8 \n", + "-5.94 1.33 \n", + "-53.6 3.05 \n", + "0.43 0.74 \n", + "-92.74 0.84 \n", + "-7.28 0.45 \n", + "-7.28 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.79 0.8 \n", + "-1.39 1.02 \n", + "-5.5 0.33 \n", + "-3.0 0.48 \n", + "4.03 0.35 \n", + "-9.04 1.71 \n", + "0.38 1.18 \n", + "10000000.0 10000000.0 \n", + "-4.73 0.54 \n", + "-68.24 3.55 \n", + "-68.24 3.55 \n", + "-71.21 1.84 \n", + "-58.14 0.55 \n", + "-53.6 3.57 \n", + "7.53 2.32 \n", + "-30.95 2.22 \n", + "-0.12 2.26 \n", + "-36.62 4.98 \n", + "-21.61 5.28 \n", + "-20.76 0.65 \n", + "70.5 3.45 \n", + "23.32 0.94 \n", + "-80.03 1.55 \n", + "40.34 0.61 \n", + "10000000.0 10000000.0 \n", + "-68.24 3.19 \n", + "-68.24 3.19 \n", + "-95.67 1.04 \n", + "-70.68 1.84 \n", + "-83.36 2.14 \n", + "-3.29 2.31 \n", + "-82.17 2.13 \n", + "-20.25 1.89 \n", + "10000000.0 10000000.0 \n", + "-39.8 5.33 \n", + "-18.47 1.31 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "-105.93 0.91 \n", + "-14.12 3.2 \n", + "3.51 0.49 \n", + "-96.87 12.62 \n", + "-97.22 0.8 \n", + "-11.91 3.41 \n", + "23.21 0.94 \n", + "3.95 2.4 \n", + "-0.7 0.53 \n", + "3.83 2.4 \n", + "-0.7 0.53 \n", + "23.32 0.94 \n", + "-11.91 3.3 \n", + "-3.53 5.85 \n", + "9.34 2.83 \n", + "-39.13 5.05 \n", + "10000000.0 10000000.0 \n", + "-15.88 7.42 \n", + "3.82 2.4 \n", + "-6.44 1.52 \n", + "-0.68 0.53 \n", + "103.03 0.52 \n", + "53.85 2.37 \n", + "-4.59 1.49 \n", + "-2.57 1.71 \n", + "-14.69 4.72 \n", + "14.05 3.2 \n", + "-15.13 4.29 \n", + "17.34 4.25 \n", + "-13.2 1.07 \n", + "-0.68 0.53 \n", + "103.03 0.52 \n", + "70.88 0.98 \n", + "-0.9 5.62 \n", + "-20.11 0.84 \n", + "-73.8 7.66 \n", + "-32.24 7.57 \n", + "-15.88 9.06 \n", + "-47.99 8.16 \n", + "23.32 0.94 \n", + "-32.24 7.57 \n", + "-15.88 9.06 \n", + "-13.2 1.07 \n", + "-0.68 0.53 \n", + "103.03 0.52 \n", + "70.88 0.98 \n", + "-0.93 0.53 \n", + "3.71 0.88 \n", + "-4.44 0.24 \n", + "-0.18 0.36 \n", + "-14.27 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.13 4.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-105.97 0.91 \n", + "-97.22 0.8 \n", + "-97.22 0.8 \n", + "10000000.0 10000000.0 \n", + "4.98 6.52 \n", + "10000000.0 10000000.0 \n", + "-3.1 0.54 \n", + "89.95 0.37 \n", + "-32.58 1.94 \n", + "10000000.0 10000000.0 \n", + "-95.69 1.04 \n", + "10000000.0 10000000.0 \n", + "-82.85 1.89 \n", + "10000000.0 10000000.0 \n", + "-14.03 10.97 \n", + "-14.03 11.03 \n", + "-63.75 2.98 \n", + "-30.52 3.57 \n", + "-62.48 1.36 \n", + "-11.68 0.39 \n", + "-57.69 1.86 \n", + "-32.12 3.67 \n", + "-136.02 0.35 \n", + "-136.19 0.5 \n", + "10000000.0 10000000.0 \n", + "-270.44 1.82 \n", + "-49.25 0.53 \n", + "-72.01 1.74 \n", + "-1.06 6.99 \n", + "-5.2 5.32 \n", + "10000000.0 10000000.0 \n", + "8.07 1.65 \n", + "-1.49 0.35 \n", + "-9.43 0.65 \n", + "-47.78 0.23 \n", + "-3.54 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "-16.89 8.21 \n", + "-40.48 0.31 \n", + "-40.48 0.31 \n", + "-158.48 9.45 \n", + "-154.53 0.84 \n", + "-49.61 0.85 \n", + "-53.35 1.08 \n", + "-53.35 1.08 \n", + "-34.54 1.84 \n", + "-18.94 1.93 \n", + "-36.77 1.13 \n", + "6.53 5.09 \n", + "13.87 5.18 \n", + "-34.54 1.84 \n", + "-18.94 1.93 \n", + "-18.94 1.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-96.51 0.66 \n", + "4.87 3.68 \n", + "-69.98 2.5 \n", + "4.87 3.68 \n", + "-25.44 2.52 \n", + "3.71 2.83 \n", + "-20.34 2.14 \n", + "-69.98 2.5 \n", + "-20.34 2.05 \n", + "-1.11 2.92 \n", + "None None \n", + "-1.82 0.53 \n", + "-13.09 1.07 \n", + "-13.19 1.07 \n", + "-1.91 0.53 \n", + "-3.88 0.56 \n", + "-3.88 0.56 \n", + "-3.88 0.56 \n", + "10000000.0 10000000.0 \n", + "-5.81 0.35 \n", + "-2.18 0.53 \n", + "-2.18 0.53 \n", + "7.78 2.16 \n", + "0.67 0.55 \n", + "0.56 0.55 \n", + "-21.55 6.89 \n", + "-2.3 9.28 \n", + "2.16 5.6 \n", + "3.76 8.25 \n", + "7.06 7.4 \n", + "-2.3 9.24 \n", + "2.16 5.53 \n", + "3.76 8.2 \n", + "7.06 7.35 \n", + "-2.3 9.21 \n", + "2.16 5.48 \n", + "3.76 8.16 \n", + "7.06 7.31 \n", + "-37.56 1.35 \n", + "23.36 0.94 \n", + "-5.75 5.23 \n", + "-5.97 0.42 \n", + "-44.51 2.54 \n", + "23.45 0.94 \n", + "23.25 0.94 \n", + "46.7 1.89 \n", + "10000000.0 10000000.0 \n", + "-77.69 2.24 \n", + "-0.68 0.53 \n", + "-20.02 2.27 \n", + "-13.08 1.07 \n", + "-12.83 1.07 \n", + "-13.58 1.07 \n", + "-159.34 5.24 \n", + "873.99 2.56 \n", + "-3.8 6.26 \n", + "1.47 1.12 \n", + "-6.74 6.0 \n", + "-6.74 6.16 \n", + "-6.74 6.16 \n", + "-6.74 6.0 \n", + "-13.08 1.07 \n", + "-18.21 1.27 \n", + "-36.41 2.53 \n", + "-1.97 0.53 \n", + "10000000.0 10000000.0 \n", + "-2.0 0.53 \n", + "-2.0 0.53 \n", + "-1.91 0.53 \n", + "-2.15 0.53 \n", + "-4.16 0.51 \n", + "10000000.0 10000000.0 \n", + "10.66 0.78 \n", + "-0.18 0.36 \n", + "4.44 0.24 \n", + "7.19 0.32 \n", + "-1.02 0.53 \n", + "-99.63 0.89 \n", + "-109.18 3.34 \n", + "36.24 2.8 \n", + "-11.23 2.19 \n", + "-49.69 2.16 \n", + "-2.15 0.53 \n", + "-49.24 0.53 \n", + "10000000.0 10000000.0 \n", + "13.25 2.44 \n", + "-95.3 1.99 \n", + "-91.94 1.9 \n", + "10.66 0.78 \n", + "-0.18 0.36 \n", + "4.44 0.24 \n", + "7.19 0.32 \n", + "-99.63 0.89 \n", + "-99.91 0.89 \n", + "-99.91 0.89 \n", + "-99.63 0.89 \n", + "-99.63 0.89 \n", + "-116.57 2.31 \n", + "-116.58 2.3 \n", + "-99.34 0.89 \n", + "-99.34 0.89 \n", + "-99.38 0.89 \n", + "-99.38 0.89 \n", + "-100.35 0.96 \n", + "-100.36 0.96 \n", + "-100.32 0.96 \n", + "-100.32 0.96 \n", + "-83.41 2.27 \n", + "-83.41 2.27 \n", + "-99.67 0.89 \n", + "-99.67 0.89 \n", + "-99.62 0.89 \n", + "-99.62 0.89 \n", + "-116.53 2.31 \n", + "-116.54 2.3 \n", + "-28.17 1.16 \n", + "-28.26 1.16 \n", + "-28.17 1.16 \n", + "-90.7 0.91 \n", + "-106.21 3.02 \n", + "-79.24 2.1 \n", + "-93.66 1.44 \n", + "13.97 0.96 \n", + "-4.89 0.24 \n", + "-2.4 1.03 \n", + "-42.95 3.91 \n", + "-42.88 3.91 \n", + "-42.94 3.91 \n", + "-6.6 2.23 \n", + "-6.6 2.23 \n", + "-6.6 2.23 \n", + "-109.84 1.17 \n", + "-49.24 0.53 \n", + "-23.33 1.22 \n", + "-109.84 1.17 \n", + "-110.08 3.29 \n", + "-0.47 0.38 \n", + "0.75 6.9 \n", + "-15.73 0.35 \n", + "-14.05 3.25 \n", + "-105.97 0.91 \n", + "-26.44 3.74 \n", + "22.62 0.94 \n", + "-110.1 2.25 \n", + "-158.48 3.81 \n", + "-70.85 0.98 \n", + "-109.95 2.25 \n", + "-109.98 2.25 \n", + "-117.49 4.26 \n", + "-49.28 0.53 \n", + "23.32 0.94 \n", + "-0.87 5.21 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.09 1.07 \n", + "-3.83 0.39 \n", + "-124.86 3.02 \n", + "-6.51 2.23 \n", + "-25.93 0.84 \n", + "-25.93 0.84 \n", + "10000000.0 10000000.0 \n", + "-12.8 0.49 \n", + "23.43 0.94 \n", + "10000000.0 10000000.0 \n", + "23.32 0.94 \n", + "-95.83 6.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "33.04 2.24 \n", + "-3.8 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-184.59 1.24 \n", + "98.49 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-109.81 1.17 \n", + "-12.57 1.08 \n", + "-13.19 1.1 \n", + "-15.13 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "14.98 2.36 \n", + "-6.85 0.8 \n", + "1.95 7.82 \n", + "-4.38 1.33 \n", + "-6.77 0.31 \n", + "-6.35 0.31 \n", + "-6.77 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.13 0.25 \n", + "1.99 0.41 \n", + "0.13 0.25 \n", + "-3.35 0.3 \n", + "10000000.0 10000000.0 \n", + "-3.35 0.3 \n", + "0.89 0.62 \n", + "0.89 0.62 \n", + "-0.73 4.41 \n", + "-3.78 0.6 \n", + "-1.7 5.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.35 0.3 \n", + "0.89 0.62 \n", + "-121.99 3.34 \n", + "-120.41 3.42 \n", + "4.89 0.25 \n", + "4.89 0.25 \n", + "4.89 0.25 \n", + "-8.68 0.26 \n", + "-8.68 0.26 \n", + "-21.55 6.66 \n", + "10000000.0 10000000.0 \n", + "-0.19 0.33 \n", + "-7.06 7.13 \n", + "-7.12 9.02 \n", + "2.66 5.17 \n", + "2.21 7.97 \n", + "-7.06 7.1 \n", + "-8.68 0.26 \n", + "5.82 0.35 \n", + "None None \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.4 0.86 \n", + "-3.85 1.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.47 \n", + "None 0.47 \n", + "None 0.47 \n", + "None 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 5.36 \n", + "None 4.2 \n", + "None 5.03 \n", + "None 4.17 \n", + "None 0.62 \n", + "None 0.62 \n", + "None 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.23 0.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.36 1.06 \n", + "None 1.53 \n", + "None 4.29 \n", + "None 2.72 \n", + "None 3.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-55.7 2.54 \n", + "-35.81 4.45 \n", + "-53.4 2.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.23 4.63 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-33.35 2.77 \n", + "-39.25 1.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-52.55 3.91 \n", + "-53.4 2.73 \n", + "-53.4 2.73 \n", + "-27.76 3.44 \n", + "-27.76 3.44 \n", + "-27.76 3.44 \n", + "-44.58 2.57 \n", + "-53.4 2.73 \n", + "-53.4 2.73 \n", + "-53.4 2.73 \n", + "-53.4 2.73 \n", + "-53.4 2.73 \n", + "-53.4 2.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-58.63 3.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-81.74 2.47 \n", + "-101.31 2.19 \n", + "-93.57 0.91 \n", + "-93.57 0.91 \n", + "10000000.0 10000000.0 \n", + "-16.29 4.6 \n", + "-80.71 1.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.91 0.28 \n", + "4.44 0.24 \n", + "-113.53 0.87 \n", + "-50.97 4.75 \n", + "-3.33 0.96 \n", + "-3.33 0.96 \n", + "5.03 0.45 \n", + "10000000.0 10000000.0 \n", + "-16.03 3.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-78.49 1.57 \n", + "-82.24 1.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-112.0 4.39 \n", + "0.94 7.39 \n", + "-8.04 0.71 \n", + "5.9 0.61 \n", + "-3.62 0.45 \n", + "None None \n", + "-0.94 7.39 \n", + "-8.04 0.71 \n", + "62.27 1.18 \n", + "-10.46 5.4 \n", + "-13.11 5.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-115.07 8.34 \n", + "-115.07 9.92 \n", + "-98.3 0.83 \n", + "-48.33 5.17 \n", + "-48.33 5.4 \n", + "-104.86 1.27 \n", + "-64.75 6.42 \n", + "-100.27 7.87 \n", + "-64.75 8.97 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.28 0.45 \n", + "-6.36 0.45 \n", + "-6.38 0.45 \n", + "-6.53 0.45 \n", + "-6.5 0.45 \n", + "-6.26 0.45 \n", + "-6.34 0.45 \n", + "-0.01 None \n", + "-0.02 None \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.04 0.64 \n", + "8.04 0.64 \n", + "8.04 0.64 \n", + "8.16 0.64 \n", + "8.16 0.64 \n", + "8.19 0.64 \n", + "8.16 0.64 \n", + "-105.96 0.91 \n", + "-4.36 7.67 \n", + "-97.2 0.8 \n", + "-81.39 6.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.25 0.9 \n", + "-3.43 0.48 \n", + "24.01 3.68 \n", + "-62.8 4.2 \n", + "-11.73 0.56 \n", + "11.82 3.81 \n", + "-12.68 1.02 \n", + "-29.02 1.94 \n", + "-10.37 0.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.89 0.25 \n", + "3.78 0.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.94 0.49 \n", + "-1.35 0.35 \n", + "-5.04 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.78 1.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.79 0.63 \n", + "-1.63 0.33 \n", + "-1.63 0.33 \n", + "-6.56 0.74 \n", + "-3.79 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.08 0.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.44 1.49 \n", + "-36.61 1.12 \n", + "-8.63 0.26 \n", + "-59.88 1.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.44 1.59 \n", + "-70.77 1.77 \n", + "-8.63 0.26 \n", + "-6.66 0.55 \n", + "-6.73 0.55 \n", + "-5.71 0.77 \n", + "-4.31 0.75 \n", + "-13.25 0.96 \n", + "16.38 1.02 \n", + "None None \n", + "-6.73 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.5 0.55 \n", + "10000000.0 10000000.0 \n", + "-393.65 14.47 \n", + "-279.31 14.17 \n", + "-1.58 0.37 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.09 \n", + "-3.88 0.56 \n", + "-3.83 0.39 \n", + "10.06 14.25 \n", + "-13.46 13.83 \n", + "-3.83 0.39 \n", + "-3.83 0.39 \n", + "-224.03 1.48 \n", + "-5.97 0.42 \n", + "-18.97 0.87 \n", + "-5.31 0.46 \n", + "-63.08 0.4 \n", + "-4.89 0.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "18.1 2.1 \n", + "-10.96 1.38 \n", + "-18.75 0.66 \n", + "-51.9 0.94 \n", + "-94.13 0.75 \n", + "-0.81 0.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.47 0.41 \n", + "-6.77 0.68 \n", + "-83.02 1.05 \n", + "2.54 7.43 \n", + "-4.36 5.84 \n", + "7.97 3.23 \n", + "-5.06 0.57 \n", + "10000000.0 10000000.0 \n", + "-1.22 0.57 \n", + "10000000.0 10000000.0 \n", + "-6.77 0.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.89 1.86 \n", + "-18.91 2.52 \n", + "-122.11 1.35 \n", + "None None \n", + "-15.25 0.71 \n", + "45.16 0.61 \n", + "2.94 0.36 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "-1.99 0.41 \n", + "-0.05 5.09 \n", + "5.02 5.04 \n", + "1.98 0.72 \n", + "-14.19 1.06 \n", + "0.34 0.84 \n", + "0.34 0.84 \n", + "-4.07 0.85 \n", + "-4.07 0.85 \n", + "None None \n", + "-0.62 0.69 \n", + "-11.3 2.13 \n", + "-6.74 5.12 \n", + "-29.3 1.58 \n", + "1.79 1.45 \n", + "1.79 1.45 \n", + "-13.16 0.99 \n", + "-3.77 0.51 \n", + "-3.77 0.51 \n", + "-3.88 0.56 \n", + "-0.35 0.51 \n", + "-1.7 19.13 \n", + "-2.67 19.14 \n", + "-2.67 19.87 \n", + "-1.7 19.85 \n", + "-1.7 19.16 \n", + "10000000.0 10000000.0 \n", + "-0.74 0.51 \n", + "-2.67 18.37 \n", + "-2.67 18.33 \n", + "-4.36 5.08 \n", + "-4.36 5.15 \n", + "-4.36 5.09 \n", + "-4.36 5.15 \n", + "-4.36 5.28 \n", + "2218.72 43.34 \n", + "1483.01 15.21 \n", + "1483.01 15.21 \n", + "1475.79 15.2 \n", + "-6.37 3.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-99.87 6.68 \n", + "-99.87 6.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.02 8.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.97 0.69 \n", + "-4.36 6.05 \n", + "-49.26 0.53 \n", + "-34.31 6.11 \n", + "-4.36 6.27 \n", + "24.84 5.35 \n", + "-37.41 0.17 \n", + "-37.41 0.17 \n", + "-18.54 1.17 \n", + "-37.41 0.17 \n", + "-18.54 1.17 \n", + "-18.54 1.17 \n", + "10000000.0 10000000.0 \n", + "-2.66 0.8 \n", + "25.86 2.01 \n", + "10000000.0 10000000.0 \n", + "97.8 0.85 \n", + "-95.03 1.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 3.23 \n", + "-0.46 3.24 \n", + "-39.48 2.44 \n", + "-39.48 2.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.84 4.93 \n", + "-26.84 5.11 \n", + "-13.9 6.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.79 2.24 \n", + "-49.3 0.53 \n", + "-11.93 1.02 \n", + "-11.97 1.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "31.52 2.35 \n", + "40.54 0.47 \n", + "373.11 2.66 \n", + "758.61 3.82 \n", + "-14.33 4.25 \n", + "-19.15 5.16 \n", + "-41.33 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-145.01 5.64 \n", + "-163.13 6.35 \n", + "-34.58 1.79 \n", + "None None \n", + "-11.75 0.56 \n", + "15.54 0.35 \n", + "-2.87 0.3 \n", + "-2.86 0.3 \n", + "15.54 0.35 \n", + "543.45 1.74 \n", + "-3.69 0.39 \n", + "-30.83 1.04 \n", + "10000000.0 10000000.0 \n", + "-78.37 0.97 \n", + "3.47 0.98 \n", + "-5.97 0.42 \n", + "10000000.0 10000000.0 \n", + "0.42 0.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.79 7.78 \n", + "-3.94 7.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.32 0.87 \n", + "-1.12 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.84 0.83 \n", + "1.56 0.16 \n", + "-10.81 0.19 \n", + "-4.31 0.75 \n", + "1.94 0.47 \n", + "-54.71 2.63 \n", + "-42.95 4.79 \n", + "-42.95 4.79 \n", + "-47.22 4.79 \n", + "-47.22 4.79 \n", + "-54.87 2.63 \n", + "-42.95 4.84 \n", + "-42.95 4.84 \n", + "-47.22 4.85 \n", + "-47.22 4.85 \n", + "-105.91 3.22 \n", + "-28.54 1.89 \n", + "75.8 0.89 \n", + "-0.9 0.51 \n", + "-6.4 0.52 \n", + "10.25 5.31 \n", + "7.06 7.35 \n", + "-48.76 5.31 \n", + "-39.84 1.54 \n", + "10000000.0 10000000.0 \n", + "-13.15 0.99 \n", + "-13.2 1.07 \n", + "24.42 0.69 \n", + "5.35 1.59 \n", + "10000000.0 10000000.0 \n", + "-21.41 0.92 \n", + "-20.64 8.68 \n", + "-20.64 8.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-42.35 1.01 \n", + "-5.29 6.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-20.64 7.23 \n", + "-2.66 0.8 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "-2.66 0.8 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "10000000.0 10000000.0 \n", + "-4.36 9.18 \n", + "-105.96 0.91 \n", + "10000000.0 10000000.0 \n", + "-90.7 0.91 \n", + "-105.96 0.91 \n", + "-2.14 0.53 \n", + "10000000.0 10000000.0 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "-4.36 8.3 \n", + "-4.36 8.86 \n", + "-0.1 6.05 \n", + "-2.66 0.8 \n", + "-2.66 0.8 \n", + "-105.96 0.91 \n", + "-2.66 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.64 0.33 \n", + "10000000.0 10000000.0 \n", + "-8.68 0.26 \n", + "10000000.0 10000000.0 \n", + "-15.27 0.83 \n", + "-5.76 0.35 \n", + "-5.76 0.35 \n", + "-4.36 5.09 \n", + "-49.24 0.53 \n", + "10000000.0 10000000.0 \n", + "-24.93 2.92 \n", + "10000000.0 10000000.0 \n", + "-23.14 2.72 \n", + "10000000.0 10000000.0 \n", + "-11.71 0.56 \n", + "6.8 1.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-55.13 1.27 \n", + "-2.23 0.53 \n", + "-55.13 1.27 \n", + "-20.64 9.23 \n", + "-20.64 9.8 \n", + "-20.64 10.38 \n", + "-181.26 7.05 \n", + "-20.64 10.98 \n", + "-114.04 2.3 \n", + "-3.83 0.39 \n", + "-5.33 6.44 \n", + "-0.96 5.28 \n", + "-11.13 4.36 \n", + "-11.13 4.39 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.94 \n", + "-12.96 7.05 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "15.25 0.71 \n", + "-0.28 0.37 \n", + "-83.06 1.82 \n", + "-10.55 1.0 \n", + "-10.55 1.0 \n", + "-10.55 1.0 \n", + "-83.06 1.82 \n", + "-83.06 1.82 \n", + "-33.9 5.22 \n", + "-33.9 5.22 \n", + "10000000.0 10000000.0 \n", + "-33.9 5.22 \n", + "4.44 0.24 \n", + "-0.34 0.34 \n", + "10000000.0 10000000.0 \n", + "-103.68 7.3 \n", + "10000000.0 10000000.0 \n", + "-32.35 5.27 \n", + "-32.35 5.27 \n", + "9.19 3.93 \n", + "9.19 3.93 \n", + "-83.06 1.82 \n", + "-83.06 1.82 \n", + "-17.58 0.93 \n", + "10000000.0 10000000.0 \n", + "-9.4 0.52 \n", + "4.44 0.24 \n", + "-0.34 0.34 \n", + "None 5.2 \n", + "-9.08 1.01 \n", + "-9.08 1.01 \n", + "3.99 2.37 \n", + "3.98 0.52 \n", + "-10.46 2.37 \n", + "10000000.0 10000000.0 \n", + "-83.06 1.82 \n", + "-83.06 1.82 \n", + "-9.08 1.01 \n", + "71.42 0.52 \n", + "-27.3 4.35 \n", + "7.22 4.35 \n", + "0.46 4.56 \n", + "-4.93 0.43 \n", + "10000000.0 10000000.0 \n", + "-14.2 6.93 \n", + "-8.76 7.02 \n", + "-2.38 0.44 \n", + "None 1.41 \n", + "-270.33 5.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "43.8 4.51 \n", + "10000000.0 10000000.0 \n", + "-4.58 0.53 \n", + "-10.37 0.2 \n", + "-10.37 0.2 \n", + "19.62 0.71 \n", + "None 1.92 \n", + "10000000.0 10000000.0 \n", + "-5.54 7.25 \n", + "446.51 5.01 \n", + "10000000.0 10000000.0 \n", + "-95.07 0.74 \n", + "-95.07 0.74 \n", + "-95.07 0.74 \n", + "-95.07 0.74 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-102.22 0.86 \n", + "-6.27 0.52 \n", + "-9.23 2.23 \n", + "-9.23 2.23 \n", + "-9.83 2.23 \n", + "-102.22 0.86 \n", + "-6.88 0.52 \n", + "-11.65 6.24 \n", + "-41.87 2.18 \n", + "-41.87 2.18 \n", + "27.38 6.85 \n", + "-198.06 13.85 \n", + "-198.06 13.85 \n", + "-48.79 6.6 \n", + "36.08 6.78 \n", + "-13.17 0.99 \n", + "-13.21 1.07 \n", + "-4.36 8.5 \n", + "-4.36 8.54 \n", + "-198.06 13.86 \n", + "-198.06 13.86 \n", + "-48.79 6.63 \n", + "0.64 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "-0.18 0.36 \n", + "14.27 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "18.28 2.9 \n", + "22.76 2.9 \n", + "23.41 2.87 \n", + "23.41 2.88 \n", + "-31.97 6.71 \n", + "-4.09 0.72 \n", + "-4.1 0.72 \n", + "557.35 1.8 \n", + "-4.09 0.72 \n", + "6.76 2.17 \n", + "-4.36 5.46 \n", + "6.76 2.26 \n", + "40.74 3.17 \n", + "-0.28 0.37 \n", + "11.54 0.6 \n", + "-7.43 0.38 \n", + "-3.11 7.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.34 0.55 \n", + "10000000.0 10000000.0 \n", + "-40.21 5.13 \n", + "-36.23 5.02 \n", + "-123.41 0.81 \n", + "-5.43 0.6 \n", + "-0.99 0.31 \n", + "-0.39 0.41 \n", + "-40.68 3.32 \n", + "-4.36 5.49 \n", + "-39.48 2.75 \n", + "-29.36 3.14 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-90.63 6.18 \n", + "-90.63 6.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-83.95 6.29 \n", + "-83.95 6.29 \n", + "-15.4 3.48 \n", + "-15.4 3.48 \n", + "None 4.5 \n", + "None 4.5 \n", + "-34.59 5.89 \n", + "-95.81 9.29 \n", + "-1.7 8.03 \n", + "-2.62 0.35 \n", + "3.24 0.82 \n", + "3.24 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.87 0.5 \n", + "-3.11 7.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-57.08 1.22 \n", + "-102.93 7.48 \n", + "-21.19 1.04 \n", + "-25.93 0.84 \n", + "-51.86 1.69 \n", + "-25.93 0.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.62 1.19 \n", + "-5.62 1.19 \n", + "-1.7 6.46 \n", + "3.81 2.37 \n", + "-1.7 8.04 \n", + "-3.83 0.39 \n", + "2.35 0.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-90.77 6.39 \n", + "6.74 4.7 \n", + "2.45 1.15 \n", + "-60.17 0.73 \n", + "-60.17 0.73 \n", + "1.01 0.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.77 0.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.83 0.46 \n", + "10000000.0 10000000.0 \n", + "-10.77 0.73 \n", + "-16.83 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-37.52 0.74 \n", + "-5.47 0.75 \n", + "-22.19 1.11 \n", + "-8.29 0.26 \n", + "-8.29 0.26 \n", + "10000000.0 10000000.0 \n", + "6.97 0.35 \n", + "-13.22 5.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-49.34 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.12 0.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "-6.64 0.45 \n", + "4.89 0.25 \n", + "-9.06 0.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.13 0.75 \n", + "6.48 0.85 \n", + "-94.13 0.75 \n", + "-4.36 6.36 \n", + "-4.36 6.51 \n", + "-12.6 0.54 \n", + "-108.16 1.79 \n", + "10000000.0 10000000.0 \n", + "-113.15 1.61 \n", + "-1.7 14.41 \n", + "-1.7 14.4 \n", + "-1.7 14.79 \n", + "-1.7 14.4 \n", + "-5.33 5.33 \n", + "-3.11 14.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.28 0.24 \n", + "-7.85 0.77 \n", + "-3.35 0.35 \n", + "-6.46 0.32 \n", + "14.86 0.43 \n", + "14.86 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.13 0.75 \n", + "4.89 0.24 \n", + "-8.68 0.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.18 0.45 \n", + "1.18 0.45 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "-5.66 0.74 \n", + "-5.66 0.74 \n", + "-5.48 0.61 \n", + "-6.64 0.45 \n", + "-71.1 6.4 \n", + "-11.78 6.46 \n", + "-5.16 0.9 \n", + "-107.56 1.44 \n", + "-105.97 0.91 \n", + "-2.08 1.67 \n", + "10000000.0 10000000.0 \n", + "-70.46 6.33 \n", + "-70.46 6.33 \n", + "-12.52 6.35 \n", + "-12.52 6.35 \n", + "-69.57 6.9 \n", + "10000000.0 10000000.0 \n", + "-71.1 6.42 \n", + "-11.78 6.48 \n", + "-69.88 6.67 \n", + "-13.0 6.76 \n", + "-94.76 2.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-25.38 2.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.76 1.91 \n", + "-3.2 1.15 \n", + "-1.74 1.68 \n", + "-105.95 0.91 \n", + "-107.61 1.44 \n", + "-94.76 1.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.2 1.15 \n", + "-71.1 6.32 \n", + "-11.78 6.37 \n", + "-94.12 0.75 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "-12.29 0.87 \n", + "-51.75 7.42 \n", + "-108.65 1.19 \n", + "10000000.0 10000000.0 \n", + "-108.65 1.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.83 3.19 \n", + "349.58 3.28 \n", + "-3.28 1.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-33.9 5.22 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "-17.58 0.93 \n", + "-101.03 1.21 \n", + "10000000.0 10000000.0 \n", + "-235.63 9.17 \n", + "-13.27 11.48 \n", + "-17.54 12.73 \n", + "10000000.0 10000000.0 \n", + "-49.25 0.53 \n", + "-2.77 0.75 \n", + "-15.46 14.89 \n", + "-10.55 1.0 \n", + "-64.39 0.35 \n", + "0.42 0.46 \n", + "-6.73 0.79 \n", + "-2.64 0.46 \n", + "-12.96 3.97 \n", + "-12.96 3.97 \n", + "-52.22 0.46 \n", + "-2.57 0.3 \n", + "-12.96 3.88 \n", + "-12.96 3.88 \n", + "-1.51 0.4 \n", + "-14.03 6.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.22 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-86.18 1.85 \n", + "-11.89 4.12 \n", + "-10.1 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "83.31 20.41 \n", + "83.31 20.41 \n", + "None 4.3 \n", + "10000000.0 10000000.0 \n", + "None 0.64 \n", + "-16.21 1.14 \n", + "10000000.0 10000000.0 \n", + "None 3.63 \n", + "-11.73 1.04 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "None 1.02 \n", + "None 2.6 \n", + "10000000.0 10000000.0 \n", + "None 0.35 \n", + "None 1.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-40.22 1.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.24 0.3 \n", + "10000000.0 10000000.0 \n", + "-3.54 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.54 0.77 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.54 1.48 \n", + "-6.16 0.07 \n", + "43.97 1.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "21.7 0.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-209.04 0.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.35 0.33 \n", + "0.09 0.26 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.53 0.84 \n", + "140.4 1.84 \n", + "10000000.0 10000000.0 \n", + "-2.09 1.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.35 \n", + "10000000.0 10000000.0 \n", + "16.8 1.6 \n", + "None 0.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.62 0.66 \n", + "-3.3 0.77 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.38 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "1.52 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "-65.02 1.07 \n", + "10000000.0 10000000.0 \n", + "-56.37 0.85 \n", + "-13.48 0.98 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.08 0.27 \n", + "-0.39 1.3 \n", + "-1.91 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-81.0 1.83 \n", + "None 0.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.21 0.77 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "339.61 0.3 \n", + "-1.0 1.0 \n", + "-3.6 1.12 \n", + "-9.67 1.26 \n", + "-8.26 1.43 \n", + "-68.95 1.15 \n", + "-9.7 1.31 \n", + "0.03 0.63 \n", + "1.44 0.99 \n", + "2.61 0.71 \n", + "-3.58 1.06 \n", + "-2.17 1.22 \n", + "-8.03 0.52 \n", + "-44.78 0.91 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.87 1.04 \n", + "29.47 1.17 \n", + "127.71 4.96 \n", + "89.36 0.82 \n", + "-35.44 0.84 \n", + "-36.92 0.72 \n", + "-41.0 0.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "19.0 1.98 \n", + "-6.16 0.07 \n", + "None 0.54 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-2.78 0.76 \n", + "97.86 0.39 \n", + "0.39 1.02 \n", + "10000000.0 10000000.0 \n", + "-44.06 0.64 \n", + "-44.43 0.83 \n", + "-53.51 7.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-56.71 0.73 \n", + "-24.76 1.8 \n", + "-36.43 0.75 \n", + "-38.12 0.98 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-1.04 0.83 \n", + "None 0.71 \n", + "-8.38 1.02 \n", + "-2.2 0.76 \n", + "-2.95 0.63 \n", + "4.25 0.5 \n", + "84.44 3.93 \n", + "15.6 1.8 \n", + "10000000.0 10000000.0 \n", + "-38.54 0.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "0.97 0.32 \n", + "-0.78 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.63 0.42 \n", + "-125.74 1.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-182.71 6.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-212.61 6.95 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.55 \n", + "None 0.57 \n", + "None 0.57 \n", + "None 0.49 \n", + "None 0.62 \n", + "None 0.83 \n", + "None 0.64 \n", + "10000000.0 10000000.0 \n", + "None 0.99 \n", + "None 0.65 \n", + "None 0.49 \n", + "None 1.6 \n", + "79.98 0.75 \n", + "None 1.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.12 \n", + "None 2.14 \n", + "None 1.26 \n", + "None 1.17 \n", + "None 1.15 \n", + "None 1.33 \n", + "10000000.0 10000000.0 \n", + "-8.67 0.56 \n", + "-2.78 0.75 \n", + "-2.58 0.61 \n", + "-1.17 0.9 \n", + "7.09 1.23 \n", + "-79.96 1.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.88 1.28 \n", + "-31.72 0.47 \n", + "-2.59 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.83 1.02 \n", + "None 0.71 \n", + "None 2.31 \n", + "10000000.0 10000000.0 \n", + "None 0.64 \n", + "None 1.63 \n", + "None 5.36 \n", + "None 4.2 \n", + "None 4.17 \n", + "None 2.66 \n", + "None 2.21 \n", + "None 1.16 \n", + "None 1.41 \n", + "None 0.61 \n", + "None 1.13 \n", + "-5.83 0.43 \n", + "-55.09 2.23 \n", + "10000000.0 10000000.0 \n", + "40.88 1.06 \n", + "-91.19 1.52 \n", + "10000000.0 10000000.0 \n", + "-15.13 0.33 \n", + "-2.2 0.3 \n", + "2.9 0.9 \n", + "-44.36 0.45 \n", + "7.55 1.06 \n", + "-3.88 0.56 \n", + "-74.71 0.46 \n", + "-14.12 4.63 \n", + "-10.74 1.9 \n", + "-90.82 11.68 \n", + "-39.91 0.2 \n", + "-38.35 0.11 \n", + "-40.48 0.31 \n", + "-39.91 0.2 \n", + "15.54 0.35 \n", + "-38.35 0.11 \n", + "-40.48 0.31 \n", + "0.28 0.37 \n", + "0.28 0.37 \n", + "-37.41 0.17 \n", + "-36.23 13.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "35.74 0.45 \n", + "-99.41 1.12 \n", + "-1.14 0.86 \n", + "-1.14 0.86 \n", + "-5.33 5.75 \n", + "3.96 0.84 \n", + "3.96 0.84 \n", + "-1.38 0.32 \n", + "-37.41 0.17 \n", + "-42.69 0.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.6 0.51 \n", + "-2.61 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-40.71 1.09 \n", + "-105.51 1.72 \n", + "-32.01 1.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.28 0.35 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "69.08 3.67 \n", + "-34.54 1.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.98 2.82 \n", + "-1.7 6.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.61 5.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-27.35 1.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.64 1.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.91 2.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-62.43 0.77 \n", + "10000000.0 10000000.0 \n", + "-9.31 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-104.63 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-34.54 1.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "67.52 1.3 \n", + "-40.4 1.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.45 12.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.07 2.25 \n", + "-6.02 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-112.08 2.49 \n", + "-97.2 0.8 \n", + "-69.24 7.2 \n", + "-95.07 0.74 \n", + "-105.07 0.81 \n", + "10000000.0 10000000.0 \n", + "-68.62 2.16 \n", + "-40.4 1.05 \n", + "-118.19 0.76 \n", + "-126.86 0.82 \n", + "-0.08 0.76 \n", + "133.58 1.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.55 6.73 \n", + "-21.55 6.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-99.35 7.1 \n", + "-120.27 1.5 \n", + "102.64 1.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-147.85 5.12 \n", + "-13.27 0.43 \n", + "-13.27 0.43 \n", + "-316.94 2.26 \n", + "-24.6 1.18 \n", + "41.13 0.49 \n", + "10000000.0 10000000.0 \n", + "-38.35 0.11 \n", + "-38.35 0.11 \n", + "-3.54 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.13 0.33 \n", + "-6.35 0.31 \n", + "1.99 0.41 \n", + "-3.35 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.4 7.04 \n", + "-7.82 1.27 \n", + "-15.27 0.83 \n", + "-14.03 7.09 \n", + "10000000.0 10000000.0 \n", + "-43.09 0.41 \n", + "34.96 0.71 \n", + "98.85 0.84 \n", + "-38.39 0.11 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-4.56 0.5 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-5.92 0.48 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-5.75 5.96 \n", + "-5.82 0.35 \n", + "-0.28 0.38 \n", + "-0.24 0.54 \n", + "-0.24 0.54 \n", + "3.08 1.26 \n", + "5.03 0.45 \n", + "-5.88 0.84 \n", + "-16.48 0.73 \n", + "-1.57 0.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-83.46 1.83 \n", + "-122.1 0.88 \n", + "-102.93 7.48 \n", + "8.9 0.48 \n", + "-40.01 1.05 \n", + "-67.59 2.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.0 0.47 \n", + "2.82 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-54.46 1.09 \n", + "10000000.0 10000000.0 \n", + "-1.34 0.67 \n", + "-11.93 1.11 \n", + "-4.05 0.62 \n", + "-2.81 0.47 \n", + "-5.91 0.63 \n", + "-2.78 0.3 \n", + "-2.78 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.15 6.52 \n", + "10000000.0 10000000.0 \n", + "-208.0 4.36 \n", + "-208.0 4.36 \n", + "-17.77 4.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.63 0.32 \n", + "-4.05 5.53 \n", + "-1.7 2.55 \n", + "-4.05 5.16 \n", + "24.82 2.25 \n", + "0.36 0.55 \n", + "-4.01 3.98 \n", + "-4.01 3.99 \n", + "-30.03 7.74 \n", + "-90.59 2.48 \n", + "-93.45 2.27 \n", + "14.22 7.33 \n", + "-12.71 1.03 \n", + "6.53 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-105.96 0.91 \n", + "-5.9 4.27 \n", + "-5.9 4.36 \n", + "-105.96 0.91 \n", + "-95.07 0.74 \n", + "-27.09 1.0 \n", + "-5.75 5.65 \n", + "-95.07 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.52 2.35 \n", + "-105.96 0.91 \n", + "-45.33 1.38 \n", + "-48.24 1.0 \n", + "-7.52 2.6 \n", + "-49.24 0.53 \n", + "2.91 0.86 \n", + "-0.31 0.8 \n", + "-49.25 0.53 \n", + "10000000.0 10000000.0 \n", + "-105.96 0.91 \n", + "-96.63 0.76 \n", + "46.06 1.83 \n", + "4.89 0.24 \n", + "-8.68 0.26 \n", + "97.06 1.48 \n", + "-3.25 1.05 \n", + "-10.5 0.74 \n", + "-32.46 1.18 \n", + "-80.63 7.79 \n", + "-105.96 0.91 \n", + "0.37 4.75 \n", + "-49.25 0.53 \n", + "-31.43 1.93 \n", + "-49.25 0.53 \n", + "12.37 1.6 \n", + "-26.71 1.97 \n", + "-49.24 0.53 \n", + "15.53 0.35 \n", + "-40.48 0.31 \n", + "-0.39 0.41 \n", + "-95.07 0.74 \n", + "-94.12 0.75 \n", + "-95.07 0.74 \n", + "-2.39 0.75 \n", + "-1.99 0.41 \n", + "-10.82 0.19 \n", + "-7.69 0.49 \n", + "-6.34 0.32 \n", + "-81.64 0.28 \n", + "-72.23 0.2 \n", + "-10.82 0.19 \n", + "-1.99 0.41 \n", + "-0.99 0.31 \n", + "1.18 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.9 2.87 \n", + "-27.09 1.0 \n", + "-5.9 7.93 \n", + "10000000.0 10000000.0 \n", + "-8.55 7.84 \n", + "-40.22 7.87 \n", + "-34.32 7.83 \n", + "-24.02 7.85 \n", + "-41.51 7.83 \n", + "1.26 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "389.3 1.59 \n", + "-280.46 6.2 \n", + "10000000.0 10000000.0 \n", + "413.87 2.77 \n", + "-7.15 0.85 \n", + "10000000.0 10000000.0 \n", + "-86.57 10.11 \n", + "10000000.0 10000000.0 \n", + "-338.58 10.0 \n", + "2.58 0.42 \n", + "7.31 0.74 \n", + "-7.65 1.32 \n", + "5.47 0.54 \n", + "5.47 0.54 \n", + "-40.98 1.18 \n", + "-9.26 0.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.13 0.75 \n", + "-104.91 9.49 \n", + "-97.2 0.8 \n", + "420.23 0.51 \n", + "409.87 0.52 \n", + "457.11 2.73 \n", + "420.23 0.51 \n", + "422.22 0.68 \n", + "409.87 0.52 \n", + "411.85 0.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-27.35 1.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-23.87 1.54 \n", + "10000000.0 10000000.0 \n", + "6.93 0.75 \n", + "6.77 1.15 \n", + "-11.44 1.5 \n", + "66.22 6.33 \n", + "-7.91 1.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.98 0.75 \n", + "6.74 7.19 \n", + "-78.34 3.1 \n", + "-1.72 8.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.85 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-23.06 1.5 \n", + "-51.03 4.58 \n", + "10000000.0 10000000.0 \n", + "-40.4 1.05 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.41 1.4 \n", + "-92.41 1.81 \n", + "-15.06 2.36 \n", + "10000000.0 10000000.0 \n", + "0.97 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-105.96 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.88 0.56 \n", + "10000000.0 10000000.0 \n", + "-3.7 0.46 \n", + "50.04 4.58 \n", + "-0.28 0.38 \n", + "-0.28 0.38 \n", + "-1.67 0.54 \n", + "-11.02 0.54 \n", + "4.16 0.78 \n", + "-12.59 0.54 \n", + "-6.89 0.77 \n", + "-6.35 7.32 \n", + "-4.71 0.54 \n", + "-5.55 0.55 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "-2.62 0.35 \n", + "0.82 0.41 \n", + "-6.17 0.81 \n", + "-15.54 0.35 \n", + "-5.76 0.74 \n", + "-16.37 0.89 \n", + "-9.0 1.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "12.14 3.85 \n", + "-53.01 0.89 \n", + "-14.34 0.94 \n", + "43.75 0.77 \n", + "-36.39 2.54 \n", + "0.5 2.04 \n", + "10000000.0 10000000.0 \n", + "-105.96 0.91 \n", + "-2.67 0.8 \n", + "-0.29 0.38 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "-0.9 0.51 \n", + "-14.03 10.61 \n", + "0.28 0.37 \n", + "4.52 1.9 \n", + "0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "-4.01 0.11 \n", + "-4.88 0.37 \n", + "-4.75 0.36 \n", + "0.03 0.68 \n", + "-3.55 0.64 \n", + "-195.51 2.33 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.02 1.65 \n", + "-3.8 5.36 \n", + "0.01 None \n", + "10000000.0 10000000.0 \n", + "-4.26 0.49 \n", + "-1.9 0.49 \n", + "-5.12 0.6 \n", + "-5.0 0.59 \n", + "-10.46 5.37 \n", + "-21.65 7.54 \n", + "-99.41 1.12 \n", + "-126.69 13.26 \n", + "-26.99 1.03 \n", + "5.88 0.71 \n", + "-48.33 6.68 \n", + "-3.53 6.54 \n", + "4.52 1.9 \n", + "4.52 1.9 \n", + "-18.93 2.18 \n", + "11.12 2.41 \n", + "3.1 0.42 \n", + "-13.1 1.07 \n", + "23.26 1.22 \n", + "-0.71 0.53 \n", + "-10.07 0.53 \n", + "-0.29 0.61 \n", + "-15.14 6.72 \n", + "-28.09 2.78 \n", + "-22.58 1.11 \n", + "-78.49 1.57 \n", + "-10.46 5.4 \n", + "-5.1 0.43 \n", + "2.77 1.67 \n", + "15.88 7.44 \n", + "-20.0 1.66 \n", + "-4.36 5.26 \n", + "-1.49 0.4 \n", + "3.94 1.66 \n", + "-24.49 1.1 \n", + "-1.28 0.89 \n", + "-0.13 0.67 \n", + "-2.58 0.51 \n", + "2.57 0.71 \n", + "-5.13 0.57 \n", + "-1.03 0.57 \n", + "-4.36 6.0 \n", + "-13.39 1.07 \n", + "-4.73 0.54 \n", + "10000000.0 10000000.0 \n", + "-0.86 1.31 \n", + "-0.86 1.31 \n", + "-0.76 1.2 \n", + "-2.84 0.54 \n", + "-9.8 9.66 \n", + "-8.63 0.26 \n", + "-16.73 0.8 \n", + "-22.2 1.44 \n", + "-0.28 0.37 \n", + "-0.28 0.37 \n", + "4.04 0.28 \n", + "-3.14 0.76 \n", + "10000000.0 10000000.0 \n", + "-90.71 0.91 \n", + "-13.2 1.07 \n", + "-3.57 0.8 \n", + "-1.63 6.98 \n", + "-2.64 0.35 \n", + "-1.01 0.39 \n", + "10000000.0 10000000.0 \n", + "0.42 0.46 \n", + "-82.17 2.13 \n", + "-82.17 2.13 \n", + "4.44 0.24 \n", + "-2.26 0.47 \n", + "-3.84 0.3 \n", + "-4.82 0.75 \n", + "0.55 0.41 \n", + "-9.14 3.53 \n", + "0.74 7.13 \n", + "-2.1 0.3 \n", + "4.29 0.24 \n", + "10.66 0.78 \n", + "-4.36 6.48 \n", + "-4.58 12.88 \n", + "None 4.17 \n", + "3.11 8.01 \n", + "-2.62 0.35 \n", + "14.27 0.33 \n", + "14.27 0.34 \n", + "-1.01 0.39 \n", + "-4.95 0.96 \n", + "-6.33 1.74 \n", + "-10.37 0.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.72 0.54 \n", + "-0.68 0.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.94 0.47 \n", + "-2.54 1.12 \n", + "-5.9 1.12 \n", + "-105.97 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.85 0.24 \n", + "-4.1 0.53 \n", + "-3.77 0.67 \n", + "105.36 0.93 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.91 0.41 \n", + "1.02 0.71 \n", + "-3.78 1.0 \n", + "-0.07 0.69 \n", + "-1.76 0.74 \n", + "-10.01 0.3 \n", + "-10.01 0.3 \n", + "-5.26 0.57 \n", + "-4.22 1.25 \n", + "-4.21 1.24 \n", + "-9.48 0.68 \n", + "10.77 5.02 \n", + "5.22 11.94 \n", + "-5.22 11.94 \n", + "-0.52 0.47 \n", + "3.97 5.05 \n", + "-7.31 0.74 \n", + "1.85 0.74 \n", + "1.04 0.46 \n", + "-4.44 0.24 \n", + "None None \n", + "-1.87 0.46 \n", + "-4.89 0.25 \n", + "-1.31 0.67 \n", + "-3.81 0.43 \n", + "6.48 0.85 \n", + "-16.03 3.67 \n", + "0.12 0.98 \n", + "10000000.0 10000000.0 \n", + "-6.4 0.52 \n", + "-2.11 0.69 \n", + "0.9 0.51 \n", + "-0.9 0.51 \n", + "-6.45 0.71 \n", + "-13.94 1.55 \n", + "0.98 0.5 \n", + "10000000.0 10000000.0 \n", + "-1.27 0.64 \n", + "10000000.0 10000000.0 \n", + "None 5.6 \n", + "4.0 0.49 \n", + "-1.05 0.37 \n", + "4.89 0.24 \n", + "-9.02 0.84 \n", + "-1.65 0.45 \n", + "-35.92 1.49 \n", + "-1.26 0.5 \n", + "-105.29 0.94 \n", + "-96.53 0.85 \n", + "-105.29 0.94 \n", + "-12.04 1.05 \n", + "-104.58 1.53 \n", + "1.81 5.51 \n", + "-0.78 0.68 \n", + "-7.26 0.54 \n", + "-2.84 0.54 \n", + "-78.48 1.57 \n", + "12.57 4.39 \n", + "16.72 4.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "-1.08 1.04 \n", + "10000000.0 10000000.0 \n", + "-4.36 8.55 \n", + "-4.36 8.51 \n", + "-0.28 0.38 \n", + "-0.28 0.38 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.45 0.38 \n", + "-105.97 0.91 \n", + "-136.86 1.8 \n", + "-121.63 3.62 \n", + "1.12 1.08 \n", + "2.99 0.87 \n", + "-4.36 5.41 \n", + "-2.94 0.9 \n", + "10000000.0 10000000.0 \n", + "-5.02 0.89 \n", + "-2.95 1.92 \n", + "-11.8 6.4 \n", + "-22.58 1.25 \n", + "-123.41 0.81 \n", + "-352.98 2.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.19 0.47 \n", + "-0.56 0.55 \n", + "-0.28 0.38 \n", + "-2.75 0.78 \n", + "8.91 0.78 \n", + "-0.26 0.49 \n", + "1.31 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.68 1.32 \n", + "13.27 0.43 \n", + "-82.98 1.15 \n", + "-5.64 0.81 \n", + "9.66 0.82 \n", + "0.69 0.38 \n", + "2.3 11.56 \n", + "-8.29 0.26 \n", + "-3.16 0.75 \n", + "-2.46 0.54 \n", + "None None \n", + "2.98 1.63 \n", + "4.89 0.25 \n", + "-32.0 1.07 \n", + "10000000.0 10000000.0 \n", + "-20.21 1.9 \n", + "2.82 1.78 \n", + "-10.13 1.6 \n", + "13.85 0.31 \n", + "13.86 0.31 \n", + "-6.52 0.55 \n", + "10000000.0 10000000.0 \n", + "-8.15 3.02 \n", + "-9.07 0.26 \n", + "-86.57 10.11 \n", + "10000000.0 10000000.0 \n", + "-7.35 2.51 \n", + "-90.99 1.31 \n", + "-0.58 0.54 \n", + "-61.24 1.25 \n", + "-3.78 0.35 \n", + "3.58 0.91 \n", + "5.97 1.7 \n", + "-14.4 6.78 \n", + "-14.03 6.83 \n", + "-16.31 2.64 \n", + "-16.42 1.26 \n", + "-86.18 1.85 \n", + "10000000.0 10000000.0 \n", + "-5.07 0.71 \n", + "-7.38 0.74 \n", + "2.3 11.85 \n", + "2.3 11.85 \n", + "None 10.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.14 None \n", + "-5.13 0.52 \n", + "-4.32 0.3 \n", + "-4.05 0.56 \n", + "-3.64 0.43 \n", + "-5.19 0.46 \n", + "-0.47 0.61 \n", + "-4.4 0.73 \n", + "-1.82 0.71 \n", + "-0.51 0.51 \n", + "-0.57 0.5 \n", + "-74.83 1.75 \n", + "-2.66 0.8 \n", + "-3.28 1.09 \n", + "-5.27 1.33 \n", + "13.43 1.51 \n", + "-20.53 1.89 \n", + "-70.74 1.84 \n", + "15.72 0.65 \n", + "-2.37 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.08 0.84 \n", + "4.89 0.25 \n", + "None None \n", + "-2.44 0.61 \n", + "-13.2 1.07 \n", + "-5.06 0.75 \n", + "-0.32 0.43 \n", + "-10.46 4.97 \n", + "1.12 0.58 \n", + "-0.11 0.82 \n", + "-6.03 0.68 \n", + "-0.28 0.37 \n", + "-0.28 0.37 \n", + "-83.06 1.82 \n", + "-8.29 0.26 \n", + "0.24 0.49 \n", + "-26.84 4.69 \n", + "-0.46 1.9 \n", + "-14.03 6.29 \n", + "-0.57 0.52 \n", + "11.95 1.71 \n", + "-0.56 0.52 \n", + "11.95 1.71 \n", + "8.34 1.85 \n", + "0.01 0.71 \n", + "-0.85 0.68 \n", + "48.28 4.84 \n", + "-105.96 0.91 \n", + "-8.68 0.26 \n", + "-8.68 0.27 \n", + "-72.01 1.66 \n", + "-4.36 5.08 \n", + "-103.43 1.25 \n", + "-3.79 0.86 \n", + "-0.52 1.63 \n", + "-104.99 2.05 \n", + "81.75 10.15 \n", + "2.34 0.39 \n", + "-8.07 1.19 \n", + "-2.81 0.3 \n", + "-2.81 4.39 \n", + "-4.84 0.32 \n", + "-1.84 0.88 \n", + "-1.11 0.42 \n", + "-0.06 0.39 \n", + "-11.24 1.64 \n", + "8.04 0.84 \n", + "3.76 11.5 \n", + "3.76 11.49 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "-96.19 11.48 \n", + "-3.98 0.33 \n", + "-14.34 2.29 \n", + "-7.69 0.72 \n", + "10000000.0 10000000.0 \n", + "18.19 1.11 \n", + "18.19 1.11 \n", + "18.19 1.12 \n", + "18.19 1.12 \n", + "-16.53 1.35 \n", + "-13.76 1.15 \n", + "-52.15 6.69 \n", + "-45.65 2.53 \n", + "-6.31 0.7 \n", + "-0.15 0.69 \n", + "5.34 1.04 \n", + "5.74 0.27 \n", + "-3.37 0.44 \n", + "-15.61 3.67 \n", + "-5.88 0.41 \n", + "-1.63 1.66 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.47 0.24 \n", + "-5.29 0.5 \n", + "-2.72 1.31 \n", + "-75.63 1.39 \n", + "-4.36 5.17 \n", + "-3.56 0.8 \n", + "-105.96 0.91 \n", + "2.22 0.33 \n", + "2.22 0.33 \n", + "4.44 0.24 \n", + "-0.68 0.53 \n", + "-1.45 0.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.74 0.84 \n", + "-6.41 0.83 \n", + "0.07 0.33 \n", + "-92.72 1.1 \n", + "-92.73 1.11 \n", + "-2.65 0.81 \n", + "4.77 0.76 \n", + "14.27 1.57 \n", + "12.59 7.4 \n", + "12.59 7.39 \n", + "-3.98 0.33 \n", + "-2.43 0.33 \n", + "3.4 0.6 \n", + "-0.28 0.37 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "-0.28 0.38 \n", + "4.75 6.33 \n", + "-25.44 2.52 \n", + "-122.5 0.9 \n", + "-16.31 9.76 \n", + "-14.03 10.66 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "-97.2 0.8 \n", + "-5.21 0.31 \n", + "10000000.0 10000000.0 \n", + "-0.83 0.5 \n", + "-0.97 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.43 0.33 \n", + "-5.28 0.33 \n", + "-5.28 0.33 \n", + "-0.88 0.33 \n", + "7.48 0.71 \n", + "-5.28 0.33 \n", + "-0.88 0.33 \n", + "10000000.0 10000000.0 \n", + "-82.17 2.13 \n", + "-82.18 2.13 \n", + "1.6 0.39 \n", + "0.38 0.45 \n", + "-26.89 1.23 \n", + "-8.83 3.01 \n", + "-107.68 1.13 \n", + "-104.34 8.4 \n", + "-39.93 1.55 \n", + "-4.36 6.2 \n", + "-9.86 0.47 \n", + "6.72 0.4 \n", + "-8.88 3.08 \n", + "-3.96 0.55 \n", + "2.37 2.03 \n", + "-62.1 1.36 \n", + "14.27 0.34 \n", + "3.18 4.84 \n", + "3.51 0.49 \n", + "-71.03 1.84 \n", + "-11.41 1.33 \n", + "-2.13 0.3 \n", + "-262.35 0.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.48 1.89 \n", + "-6.83 0.33 \n", + "-6.83 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.38 0.45 \n", + "-2.28 0.35 \n", + "-0.28 0.38 \n", + "-6.25 0.33 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "-6.47 0.59 \n", + "-0.94 1.4 \n", + "1.51 0.68 \n", + "-8.68 0.26 \n", + "4.89 0.24 \n", + "-18.48 1.45 \n", + "-2.28 0.32 \n", + "0.84 7.33 \n", + "-6.06 7.25 \n", + "-16.31 3.99 \n", + "-16.31 3.99 \n", + "4.44 0.24 \n", + "-16.97 3.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.61 0.3 \n", + "-9.66 0.61 \n", + "1.42 0.85 \n", + "53.52 9.09 \n", + "-7.68 0.72 \n", + "-7.83 0.72 \n", + "1.66 0.92 \n", + "-5.96 0.71 \n", + "3.05 5.07 \n", + "-82.73 2.52 \n", + "-5.66 0.58 \n", + "-5.66 0.59 \n", + "-14.87 5.08 \n", + "10000000.0 10000000.0 \n", + "-13.12 1.07 \n", + "-105.0 2.14 \n", + "-74.56 1.74 \n", + "-11.27 1.2 \n", + "-5.33 6.54 \n", + "-85.38 7.45 \n", + "-97.2 0.8 \n", + "-13.21 1.07 \n", + "-88.3 1.92 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "-5.72 0.54 \n", + "5.72 0.54 \n", + "-3.88 0.56 \n", + "-105.96 0.91 \n", + "-2.66 0.8 \n", + "-105.96 0.91 \n", + "10000000.0 10000000.0 \n", + "4.89 0.25 \n", + "-1.7 5.7 \n", + "10000000.0 10000000.0 \n", + "-1.88 0.34 \n", + "42.43 0.26 \n", + "-105.97 0.91 \n", + "-0.35 0.55 \n", + "-4.45 2.26 \n", + "4.89 0.25 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "-7.23 0.6 \n", + "-4.36 6.12 \n", + "-13.37 1.07 \n", + "-13.13 1.03 \n", + "-121.99 3.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.26 5.43 \n", + "-13.15 1.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.29 1.0 \n", + "-13.2 1.07 \n", + "10000000.0 10000000.0 \n", + "-105.96 0.91 \n", + "-97.2 0.8 \n", + "-3.19 0.5 \n", + "16.51 7.04 \n", + "-0.81 0.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.41 0.88 \n", + "4.71 0.35 \n", + "0.25 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.7 8.03 \n", + "-69.98 2.15 \n", + "-2.52 0.71 \n", + "-78.34 1.57 \n", + "-93.87 1.66 \n", + "-21.55 6.87 \n", + "-4.36 6.85 \n", + "-1.55 0.49 \n", + "-3.11 7.46 \n", + "-0.45 0.38 \n", + "-95.83 7.12 \n", + "-95.83 7.11 \n", + "-105.97 0.91 \n", + "-109.84 1.17 \n", + "3.74 7.95 \n", + "3.11 8.15 \n", + "-30.39 2.63 \n", + "-1.06 2.03 \n", + "1.62 0.36 \n", + "1.6 1.2 \n", + "-11.58 3.18 \n", + "-21.72 2.72 \n", + "-23.04 2.78 \n", + "5.86 11.76 \n", + "81.75 10.21 \n", + "10000000.0 10000000.0 \n", + "42.69 7.71 \n", + "-1.7 6.62 \n", + "-10.01 0.3 \n", + "-13.27 0.43 \n", + "-102.01 13.3 \n", + "3.52 0.32 \n", + "-18.18 1.75 \n", + "0.68 0.58 \n", + "1.33 0.72 \n", + "4.81 0.84 \n", + "1.12 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 5.31 \n", + "-13.15 6.25 \n", + "10.24 1.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "14.27 0.33 \n", + "-13.2 1.07 \n", + "10000000.0 10000000.0 \n", + "-13.57 11.59 \n", + "10000000.0 10000000.0 \n", + "-5.47 0.61 \n", + "5.66 0.74 \n", + "-6.64 0.45 \n", + "-4.36 7.05 \n", + "-48.33 5.17 \n", + "5.25 0.91 \n", + "-36.03 13.76 \n", + "-8.13 6.27 \n", + "10000000.0 10000000.0 \n", + "9.68 2.19 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.9 \n", + "9.54 1.03 \n", + "4.23 0.41 \n", + "8.84 0.67 \n", + "-13.8 6.52 \n", + "10000000.0 10000000.0 \n", + "17.73 2.41 \n", + "-7.87 2.9 \n", + "10000000.0 10000000.0 \n", + "61.95 3.21 \n", + "-0.28 0.37 \n", + "-4.36 5.31 \n", + "-4.17 0.75 \n", + "10000000.0 10000000.0 \n", + "-12.01 1.42 \n", + "-59.92 1.38 \n", + "2.3 11.94 \n", + "4.73 0.75 \n", + "4.36 0.24 \n", + "-0.31 0.31 \n", + "-10.42 7.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.83 0.3 \n", + "-14.03 9.25 \n", + "-4.73 0.54 \n", + "-10.01 0.3 \n", + "10000000.0 10000000.0 \n", + "14.27 0.34 \n", + "10.66 0.78 \n", + "7.19 0.32 \n", + "-0.52 0.41 \n", + "0.12 0.33 \n", + "-11.5 1.24 \n", + "None None \n", + "-0.39 0.5 \n", + "-1.92 8.48 \n", + "4.44 0.24 \n", + "None None \n", + "4.44 0.24 \n", + "-91.28 4.02 \n", + "6.56 0.6 \n", + "-215.89 8.18 \n", + "-37.0 1.56 \n", + "-5.05 0.47 \n", + "-5.43 6.79 \n", + "-3.11 8.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.84 1.73 \n", + "-109.96 0.98 \n", + "-109.81 1.17 \n", + "-2.8 0.3 \n", + "-3.04 0.42 \n", + "26.51 7.76 \n", + "-6.36 6.86 \n", + "-90.26 8.68 \n", + "-4.58 12.9 \n", + "-0.28 0.38 \n", + "-32.86 4.45 \n", + "-4.36 5.9 \n", + "114.32 1.15 \n", + "-4.36 6.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.3 11.42 \n", + "2.3 11.41 \n", + "14.27 0.34 \n", + "10.66 0.78 \n", + "7.73 0.73 \n", + "7.4 8.01 \n", + "-33.63 5.8 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "-94.13 0.75 \n", + "-0.49 0.57 \n", + "None None \n", + "-9.15 0.34 \n", + "21.62 0.95 \n", + "61.95 0.28 \n", + "-107.07 1.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "None 4.38 \n", + "11.26 8.26 \n", + "11.26 8.25 \n", + "-2.65 0.35 \n", + "2.55 5.03 \n", + "4.89 0.24 \n", + "-6.73 0.55 \n", + "-8.63 0.26 \n", + "-74.83 1.75 \n", + "None None \n", + "-0.89 0.92 \n", + "-2.78 0.75 \n", + "2.2 0.59 \n", + "2.34 0.68 \n", + "2.34 0.68 \n", + "-20.16 1.48 \n", + "10000000.0 10000000.0 \n", + "-5.32 0.43 \n", + "-1.86 0.42 \n", + "1.41 1.01 \n", + "8.51 1.57 \n", + "-4.88 0.25 \n", + "-7.51 0.62 \n", + "None None \n", + "-7.68 0.72 \n", + "13.83 0.43 \n", + "-0.55 0.89 \n", + "-4.36 5.4 \n", + "-5.26 1.87 \n", + "-12.09 0.51 \n", + "0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "-3.62 0.45 \n", + "-13.11 5.21 \n", + "4.89 0.24 \n", + "-14.03 7.63 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.9 0.46 \n", + "-61.34 1.25 \n", + "26.92 1.23 \n", + "23.35 0.94 \n", + "2.66 0.32 \n", + "6.84 0.46 \n", + "0.68 6.95 \n", + "5.22 8.97 \n", + "-105.96 0.91 \n", + "-0.71 0.53 \n", + "None None \n", + "0.38 0.45 \n", + "-2.53 0.32 \n", + "0.46 7.04 \n", + "-2.63 7.05 \n", + "33.52 4.95 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "0.83 0.41 \n", + "-8.71 0.8 \n", + "-16.31 6.19 \n", + "10000000.0 10000000.0 \n", + "18.83 5.64 \n", + "-14.03 11.18 \n", + "14.27 0.34 \n", + "10.66 0.78 \n", + "7.19 0.32 \n", + "7.54 2.41 \n", + "29.7 1.02 \n", + "-105.89 0.91 \n", + "-114.69 1.81 \n", + "-114.7 1.81 \n", + "-2.65 0.35 \n", + "-1.18 0.45 \n", + "4.86 0.35 \n", + "9.32 0.66 \n", + "-4.88 0.25 \n", + "-13.2 1.07 \n", + "6.29 1.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.53 5.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-22.54 1.11 \n", + "1.68 1.82 \n", + "-28.74 2.24 \n", + "-1.66 0.46 \n", + "-1.65 0.46 \n", + "-21.55 6.74 \n", + "9.47 1.75 \n", + "-10.46 5.06 \n", + "-27.3 6.45 \n", + "4.04 6.28 \n", + "-13.81 1.21 \n", + "10000000.0 10000000.0 \n", + "92.12 1.09 \n", + "24.83 7.31 \n", + "24.83 7.3 \n", + "-35.35 1.1 \n", + "6.73 0.71 \n", + "-3.57 0.81 \n", + "1.6 1.87 \n", + "-2.71 2.02 \n", + "64.73 1.86 \n", + "-0.87 0.44 \n", + "-1.49 0.35 \n", + "10000000.0 10000000.0 \n", + "-0.56 0.76 \n", + "-62.83 8.84 \n", + "-74.84 1.75 \n", + "-8.6 0.26 \n", + "-104.68 1.14 \n", + "-19.35 5.02 \n", + "26.73 0.76 \n", + "-4.36 7.0 \n", + "-17.73 2.41 \n", + "32.13 2.5 \n", + "-14.11 1.64 \n", + "-62.11 1.36 \n", + "-5.02 0.89 \n", + "10.64 0.78 \n", + "-34.59 6.27 \n", + "-54.04 6.75 \n", + "9.66 0.82 \n", + "0.69 0.38 \n", + "-0.28 0.38 \n", + "None None \n", + "2.26 0.55 \n", + "11.6 2.78 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "-13.14 1.07 \n", + "10000000.0 10000000.0 \n", + "-0.3 0.8 \n", + "-20.25 1.89 \n", + "-86.23 1.62 \n", + "-8.28 0.91 \n", + "-4.54 0.57 \n", + "-112.1 2.02 \n", + "0.18 0.36 \n", + "0.18 0.36 \n", + "-2.92 0.8 \n", + "None None \n", + "-4.68 0.75 \n", + "2.1 0.71 \n", + "0.38 0.45 \n", + "-2.28 0.35 \n", + "-0.28 0.37 \n", + "1.81 5.22 \n", + "-16.89 0.8 \n", + "11.52 0.76 \n", + "-14.03 4.79 \n", + "-6.35 4.76 \n", + "None None \n", + "-5.59 0.95 \n", + "-14.27 5.54 \n", + "-20.25 1.89 \n", + "0.65 0.71 \n", + "-13.15 2.46 \n", + "-3.18 0.71 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "0.75 11.48 \n", + "0.75 11.47 \n", + "0.45 0.11 \n", + "-12.31 0.75 \n", + "-2.58 0.3 \n", + "-4.36 6.62 \n", + "-0.18 0.36 \n", + "-1.87 0.46 \n", + "-5.07 0.75 \n", + "2.65 0.09 \n", + "-1.93 0.44 \n", + "-11.31 2.08 \n", + "42.61 4.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.45 0.24 \n", + "4.46 0.24 \n", + "-0.04 0.48 \n", + "0.11 0.47 \n", + "-20.54 1.56 \n", + "6.14 0.93 \n", + "6.15 0.94 \n", + "7.05 0.71 \n", + "7.05 0.72 \n", + "-3.58 0.52 \n", + "4.44 0.24 \n", + "-1.18 0.45 \n", + "10000000.0 10000000.0 \n", + "-1.52 0.35 \n", + "20.66 5.23 \n", + "1.07 1.04 \n", + "4.45 0.24 \n", + "-4.04 1.14 \n", + "-14.03 4.62 \n", + "14.18 1.8 \n", + "-12.96 4.02 \n", + "-0.32 0.47 \n", + "11.76 1.89 \n", + "-25.92 2.19 \n", + "-1.7 6.02 \n", + "-3.6 0.82 \n", + "1.52 0.35 \n", + "-6.04 0.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-118.06 0.77 \n", + "-119.9 0.93 \n", + "-117.79 0.93 \n", + "-1.36 0.5 \n", + "0.23 0.31 \n", + "4.47 0.24 \n", + "10000000.0 10000000.0 \n", + "5.02 0.84 \n", + "10000000.0 10000000.0 \n", + "-77.71 2.01 \n", + "-38.13 0.45 \n", + "27.39 1.1 \n", + "-62.22 0.46 \n", + "-108.84 7.17 \n", + "-94.13 0.75 \n", + "-49.25 0.53 \n", + "-95.64 1.69 \n", + "-3.4 0.86 \n", + "-4.09 0.92 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "0.28 0.38 \n", + "None None \n", + "-1.82 0.75 \n", + "-3.04 0.55 \n", + "-5.0 2.64 \n", + "10000000.0 10000000.0 \n", + "10.24 2.03 \n", + "-3.55 6.45 \n", + "-3.55 6.44 \n", + "-104.86 2.16 \n", + "-163.02 1.34 \n", + "6.22 7.12 \n", + "10000000.0 10000000.0 \n", + "39.34 0.48 \n", + "51.41 1.01 \n", + "37.0 1.12 \n", + "1.72 0.39 \n", + "-1.7 8.11 \n", + "None None \n", + "-22.58 1.11 \n", + "-4.36 5.09 \n", + "10000000.0 10000000.0 \n", + "4.88 0.24 \n", + "-17.73 2.41 \n", + "-128.98 8.61 \n", + "-0.28 0.37 \n", + "-9.49 0.43 \n", + "10000000.0 10000000.0 \n", + "-5.86 0.43 \n", + "-6.29 0.43 \n", + "-21.55 1.64 \n", + "10000000.0 10000000.0 \n", + "-300.11 3.68 \n", + "-59.15 7.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.89 0.79 \n", + "-9.17 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.89 0.24 \n", + "2.27 0.78 \n", + "2.43 1.27 \n", + "2.43 1.27 \n", + "10000000.0 10000000.0 \n", + "-5.9 0.66 \n", + "0.71 1.21 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "8.28 0.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-23.38 1.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.67 0.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-47.22 1.79 \n", + "14.13 0.8 \n", + "10000000.0 10000000.0 \n", + "18.25 1.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.86 6.54 \n", + "-19.86 6.49 \n", + "-39.72 10.63 \n", + "6.67 2.65 \n", + "10000000.0 10000000.0 \n", + "2.28 8.8 \n", + "-5.83 0.43 \n", + "-3.91 0.53 \n", + "-24.6 1.18 \n", + "0.92 0.84 \n", + "-6.58 0.38 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "-118.71 0.79 \n", + "-87.62 0.79 \n", + "10000000.0 10000000.0 \n", + "24.42 7.38 \n", + "-19.86 6.18 \n", + "-19.86 6.14 \n", + "-19.86 6.18 \n", + "-19.86 6.14 \n", + "-39.72 10.41 \n", + "1.24 0.54 \n", + "-16.13 1.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.77 2.23 \n", + "10000000.0 10000000.0 \n", + "-16.53 5.62 \n", + "26.98 7.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.04 0.71 \n", + "18.3 1.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.53 13.5 \n", + "-6.35 0.31 \n", + "5.03 2.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.15 0.85 \n", + "26.98 6.47 \n", + "2.76 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.19 0.61 \n", + "-0.9 0.51 \n", + "10000000.0 10000000.0 \n", + "-3.82 0.44 \n", + "-106.06 0.91 \n", + "-19.01 2.26 \n", + "-122.97 2.46 \n", + "-20.72 2.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "100.02 10.35 \n", + "-10.8 0.54 \n", + "-65.6 4.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-37.17 1.61 \n", + "-36.48 2.54 \n", + "-6.77 0.68 \n", + "-44.69 1.28 \n", + "None None \n", + "4.17 0.54 \n", + "-43.91 1.77 \n", + "-41.04 2.37 \n", + "-1.64 0.95 \n", + "-1.64 0.95 \n", + "-3.82 0.44 \n", + "-3.82 0.44 \n", + "-3.82 0.44 \n", + "-13.09 1.07 \n", + "10000000.0 10000000.0 \n", + "-20.02 2.27 \n", + "-12.25 1.03 \n", + "-18.88 2.26 \n", + "-13.73 1.27 \n", + "-20.66 2.38 \n", + "-7.54 0.63 \n", + "-3.92 0.53 \n", + "-13.48 0.98 \n", + "10000000.0 10000000.0 \n", + "-4.36 8.54 \n", + "4.44 0.24 \n", + "-118.74 1.28 \n", + "-94.13 0.75 \n", + "-104.63 0.81 \n", + "-118.19 0.76 \n", + "-316.94 2.26 \n", + "-95.07 0.74 \n", + "-198.06 13.86 \n", + "-105.96 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "106.13 3.44 \n", + "106.15 3.47 \n", + "-27.75 1.23 \n", + "0.92 5.45 \n", + "-2.98 5.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.77 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.46 0.78 \n", + "10000000.0 10000000.0 \n", + "11.27 2.59 \n", + "-2.63 0.42 \n", + "-17.38 1.46 \n", + "-99.41 1.12 \n", + "-95.04 11.61 \n", + "-57.84 7.43 \n", + "-24.63 12.17 \n", + "-93.51 13.8 \n", + "-96.19 12.12 \n", + "-108.03 12.13 \n", + "-104.34 13.76 \n", + "-52.88 14.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-196.14 18.62 \n", + "-39.84 13.95 \n", + "-96.19 15.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.56 0.16 \n", + "1.56 0.16 \n", + "51.88 0.84 \n", + "-6.88 0.52 \n", + "9.23 2.23 \n", + "9.83 2.23 \n", + "-6.27 0.52 \n", + "-11.65 6.24 \n", + "-26.75 13.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.83 0.72 \n", + "10000000.0 10000000.0 \n", + "-14.05 13.96 \n", + "-107.73 1.13 \n", + "-200.53 13.65 \n", + "-113.19 3.05 \n", + "-0.28 0.38 \n", + "18.15 6.16 \n", + "2.95 0.73 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.2 4.98 \n", + "-3.87 0.56 \n", + "-3.87 0.56 \n", + "-3.87 0.56 \n", + "-3.84 0.39 \n", + "-3.87 0.56 \n", + "2.95 0.73 \n", + "-3.87 0.49 \n", + "-3.88 0.56 \n", + "-14.03 5.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-97.47 2.44 \n", + "10000000.0 10000000.0 \n", + "-107.59 1.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.33 5.04 \n", + "-7.87 0.81 \n", + "-20.64 6.16 \n", + "10000000.0 10000000.0 \n", + "-16.13 1.32 \n", + "-5.37 0.78 \n", + "-20.33 6.28 \n", + "0.28 0.37 \n", + "-7.62 0.58 \n", + "-0.57 1.6 \n", + "10000000.0 10000000.0 \n", + "-17.74 4.48 \n", + "-14.03 5.34 \n", + "0.95 0.84 \n", + "-38.36 3.48 \n", + "10000000.0 10000000.0 \n", + "-57.29 1.19 \n", + "-16.95 4.69 \n", + "-90.57 1.32 \n", + "-4.36 6.47 \n", + "-0.9 0.51 \n", + "10000000.0 10000000.0 \n", + "-102.22 0.86 \n", + "-102.22 0.86 \n", + "-120.87 2.32 \n", + "-48.79 6.63 \n", + "10000000.0 10000000.0 \n", + "-3.31 0.67 \n", + "-109.11 1.49 \n", + "None None \n", + "-20.64 6.09 \n", + "-20.64 5.97 \n", + "-46.45 2.31 \n", + "-5.66 1.31 \n", + "-71.82 10.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.96 0.32 \n", + "1.56 0.16 \n", + "0.13 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-52.66 6.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.65 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-109.52 0.8 \n", + "1.33 0.47 \n", + "10000000.0 10000000.0 \n", + "-10.46 5.17 \n", + "-13.11 5.3 \n", + "10000000.0 10000000.0 \n", + "-3.44 7.02 \n", + "-108.8 1.49 \n", + "10000000.0 10000000.0 \n", + "-3.44 7.17 \n", + "-0.9 0.42 \n", + "0.63 0.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-108.8 1.49 \n", + "-97.2 0.8 \n", + "-11.04 4.48 \n", + "-109.11 1.49 \n", + "-14.03 6.97 \n", + "-14.03 7.14 \n", + "-0.88 0.86 \n", + "-4.26 0.3 \n", + "-4.09 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "-8.92 0.85 \n", + "-1.34 0.56 \n", + "10000000.0 10000000.0 \n", + "53.54 14.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-65.16 1.95 \n", + "-65.16 2.1 \n", + "-65.16 2.47 \n", + "-2.63 0.42 \n", + "-0.9 0.42 \n", + "-9.11 1.38 \n", + "-6.07 1.1 \n", + "-9.25 0.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.08 \n", + "-25.2 1.43 \n", + "-97.2 0.8 \n", + "31.97 6.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.91 1.75 \n", + "-2.65 0.35 \n", + "10000000.0 10000000.0 \n", + "-112.97 1.64 \n", + "10000000.0 10000000.0 \n", + "-4.11 0.54 \n", + "-6.02 0.56 \n", + "-15.14 1.21 \n", + "-1.7 5.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.63 0.88 \n", + "10000000.0 10000000.0 \n", + "-3.83 0.89 \n", + "-12.08 0.39 \n", + "6.11 0.46 \n", + "10000000.0 10000000.0 \n", + "1.66 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "14.92 1.4 \n", + "14.92 1.4 \n", + "10000000.0 10000000.0 \n", + "-95.07 0.74 \n", + "-193.12 1.53 \n", + "-193.12 1.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-31.09 1.08 \n", + "-32.05 1.14 \n", + "-128.98 8.6 \n", + "-1.7 8.09 \n", + "-1.7 8.65 \n", + "1.98 0.72 \n", + "2.11 1.09 \n", + "-0.07 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.13 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.22 0.69 \n", + "-90.63 7.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.29 0.38 \n", + "-26.75 2.19 \n", + "-49.28 5.13 \n", + "10000000.0 10000000.0 \n", + "-104.63 1.45 \n", + "-189.98 12.78 \n", + "-104.63 1.45 \n", + "7.8 1.0 \n", + "2.81 0.38 \n", + "None None \n", + "-5.87 0.89 \n", + "-6.05 0.57 \n", + "-12.48 1.14 \n", + "10000000.0 10000000.0 \n", + "-4.67 0.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "54.34 1.22 \n", + "-0.11 0.57 \n", + "0.28 0.57 \n", + "-4.11 0.54 \n", + "4.42 0.24 \n", + "10000000.0 10000000.0 \n", + "-6.44 0.57 \n", + "10000000.0 10000000.0 \n", + "-4.97 0.47 \n", + "3.44 1.03 \n", + "-7.59 0.58 \n", + "1.28 0.42 \n", + "-1.53 0.8 \n", + "-99.09 1.14 \n", + "1.62 0.09 \n", + "-97.17 1.01 \n", + "-3.95 0.9 \n", + "10000000.0 10000000.0 \n", + "-22.91 1.01 \n", + "-20.64 6.02 \n", + "-5.5 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.78 0.41 \n", + "4.89 0.24 \n", + "-189.16 4.65 \n", + "-74.24 0.91 \n", + "-131.13 1.91 \n", + "-107.15 1.4 \n", + "-107.45 1.2 \n", + "-105.97 0.91 \n", + "10000000.0 10000000.0 \n", + "-237.19 13.52 \n", + "-92.58 6.93 \n", + "-91.65 4.65 \n", + "5.26 0.58 \n", + "10000000.0 10000000.0 \n", + "-107.67 1.13 \n", + "-0.26 1.57 \n", + "-21.0 5.42 \n", + "-17.39 5.43 \n", + "-38.35 0.11 \n", + "-128.25 1.82 \n", + "-107.84 1.19 \n", + "10000000.0 10000000.0 \n", + "-21.39 1.41 \n", + "-38.35 0.11 \n", + "-5.32 0.43 \n", + "-5.68 0.43 \n", + "-2.32 0.3 \n", + "6.43 1.02 \n", + "None None \n", + "-14.03 5.5 \n", + "1.19 0.41 \n", + "-10.59 0.77 \n", + "-16.73 6.2 \n", + "11.19 0.7 \n", + "-48.21 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 14.36 \n", + "10000000.0 10000000.0 \n", + "-3518.78 191.84 \n", + "-1.7 14.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.3 1.35 \n", + "-1.14 0.86 \n", + "1.4 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.34 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.6 4.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.75 0.35 \n", + "-15.02 0.79 \n", + "10000000.0 10000000.0 \n", + "-2.85 0.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.13 4.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.73 0.98 \n", + "-91.61 6.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.52 0.41 \n", + "-3.3 5.78 \n", + "-60.47 1.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.9 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-70.77 1.77 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "13.27 0.43 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "18.7 7.01 \n", + "-118.4 1.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-88.72 9.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.84 1.1 \n", + "10000000.0 10000000.0 \n", + "2.26 0.57 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "14.27 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-20.64 6.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.93 0.84 \n", + "-2.8 0.8 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.34 0.3 \n", + "-127.42 1.58 \n", + "10000000.0 10000000.0 \n", + "-4.36 7.29 \n", + "430.37 2.79 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "-1.66 6.15 \n", + "6.14 0.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.74 0.53 \n", + "10000000.0 10000000.0 \n", + "-94.13 0.75 \n", + "10000000.0 10000000.0 \n", + "71.63 3.55 \n", + "-3.87 0.49 \n", + "-88.54 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-100.63 1.78 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-38.87 1.13 \n", + "-3.53 5.93 \n", + "2.94 0.46 \n", + "10000000.0 10000000.0 \n", + "-0.09 0.55 \n", + "-4.7 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.84 4.94 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.7 1.73 \n", + "-4.36 6.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-74.83 1.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.62 0.46 \n", + "3.76 6.55 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "-4.36 8.09 \n", + "10000000.0 10000000.0 \n", + "-60.14 3.84 \n", + "10000000.0 10000000.0 \n", + "-7.19 1.6 \n", + "10000000.0 10000000.0 \n", + "1.35 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.42 0.93 \n", + "-47.15 10.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.07 0.85 \n", + "10000000.0 10000000.0 \n", + "15.22 10.42 \n", + "0.38 0.45 \n", + "10000000.0 10000000.0 \n", + "-85.55 1.99 \n", + "10000000.0 10000000.0 \n", + "-2.67 10.86 \n", + "10000000.0 10000000.0 \n", + "-43.51 3.86 \n", + "10000000.0 10000000.0 \n", + "-0.59 0.75 \n", + "10000000.0 10000000.0 \n", + "-34.73 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 7.34 \n", + "-3.35 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.3 0.43 \n", + "10000000.0 10000000.0 \n", + "-81.93 6.95 \n", + "10000000.0 10000000.0 \n", + "-0.02 None \n", + "-7.72 0.39 \n", + "10000000.0 10000000.0 \n", + "0.34 5.21 \n", + "-1.55 5.07 \n", + "-96.19 8.26 \n", + "-18.98 2.28 \n", + "-95.07 0.74 \n", + "10000000.0 10000000.0 \n", + "-1.01 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "1.26 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.69 0.81 \n", + "10000000.0 10000000.0 \n", + "-88.36 7.78 \n", + "10000000.0 10000000.0 \n", + "None 2.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-34.18 1.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 4.66 \n", + "10000000.0 10000000.0 \n", + "-0.63 0.39 \n", + "10000000.0 10000000.0 \n", + "-8.62 0.48 \n", + "-3.92 0.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.99 0.55 \n", + "10000000.0 10000000.0 \n", + "-1.72 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.42 9.73 \n", + "10000000.0 10000000.0 \n", + "-2.07 0.98 \n", + "10000000.0 10000000.0 \n", + "-3.87 0.56 \n", + "-0.28 0.38 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.62 0.45 \n", + "-3.87 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.96 2.9 \n", + "-1.05 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.82 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.06 0.26 \n", + "10000000.0 10000000.0 \n", + "-3.11 7.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1533.99 11.69 \n", + "-87.79 0.79 \n", + "0.67 0.55 \n", + "10000000.0 10000000.0 \n", + "1.68 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.76 2.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.13 0.75 \n", + "-10.95 1.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.17 0.81 \n", + "10000000.0 10000000.0 \n", + "291.98 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-102.22 0.86 \n", + "10000000.0 10000000.0 \n", + "-26.49 3.62 \n", + "-5.19 6.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.26 \n", + "-1.7 5.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-55.92 1.37 \n", + "10000000.0 10000000.0 \n", + "-80.62 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.88 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-24.55 1.56 \n", + "10000000.0 10000000.0 \n", + "-6.35 4.88 \n", + "-27.7 1.21 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.76 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 5.12 \n", + "-73.81 1.72 \n", + "10000000.0 10000000.0 \n", + "-0.04 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.46 1.38 \n", + "10000000.0 10000000.0 \n", + "-271.52 16.38 \n", + "7.12 4.66 \n", + "10000000.0 10000000.0 \n", + "-15.44 5.13 \n", + "-4.36 6.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.56 4.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "14.27 0.34 \n", + "10000000.0 10000000.0 \n", + "7.19 0.32 \n", + "10000000.0 10000000.0 \n", + "1.18 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-25.03 1.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "196.31 10.54 \n", + "1.18 0.45 \n", + "0.85 0.65 \n", + "9.63 5.2 \n", + "-3.33 0.68 \n", + "-4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "7.22 1.77 \n", + "10000000.0 10000000.0 \n", + "13.44 1.92 \n", + "-1.0 0.38 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "-105.96 0.91 \n", + "-8.98 3.7 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-58.68 0.35 \n", + "10000000.0 10000000.0 \n", + "-1064.39 11.2 \n", + "-53.6 3.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.87 0.56 \n", + "4.51 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.16 5.19 \n", + "1.56 0.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.56 4.22 \n", + "-6.96 0.41 \n", + "-5.31 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.71 0.38 \n", + "10000000.0 10000000.0 \n", + "None 10.1 \n", + "-109.04 5.02 \n", + "10000000.0 10000000.0 \n", + "-4.36 7.38 \n", + "-2.66 5.73 \n", + "10000000.0 10000000.0 \n", + "-87.18 1.04 \n", + "-5.96 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.59 0.46 \n", + "4.81 2.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.74 6.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "200.95 5.06 \n", + "10000000.0 10000000.0 \n", + "-11.13 4.96 \n", + "10000000.0 10000000.0 \n", + "0.09 0.26 \n", + "-13.74 5.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.46 None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-78.4 9.73 \n", + "-3.4 12.04 \n", + "10000000.0 10000000.0 \n", + "-45.71 3.97 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 6.7 \n", + "-6.62 0.65 \n", + "-10.72 7.64 \n", + "10000000.0 10000000.0 \n", + "-109.41 6.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.41 0.5 \n", + "-30.4 2.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "14.58 4.56 \n", + "10000000.0 10000000.0 \n", + "-2.92 0.86 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.25 0.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.24 0.26 \n", + "-7.11 0.85 \n", + "-7.11 0.85 \n", + "10000000.0 10000000.0 \n", + "-23.36 7.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.35 7.16 \n", + "-11.88 0.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.72 2.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-75.64 1.39 \n", + "-75.64 1.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.65 0.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "11.47 3.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.53 8.8 \n", + "-2.81 0.56 \n", + "-3.84 0.84 \n", + "-3.75 0.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.06 4.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.41 0.41 \n", + "-4.41 0.41 \n", + "0.31 0.55 \n", + "-2.16 0.33 \n", + "-6.12 0.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 1.64 \n", + "10000000.0 10000000.0 \n", + "-1.7 12.11 \n", + "-1.7 12.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.75 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.11 0.92 \n", + "-2.46 0.07 \n", + "-2.61 0.79 \n", + "-1.7 16.66 \n", + "-1.7 16.66 \n", + "-14.03 17.62 \n", + "-14.03 17.62 \n", + "-1.7 18.72 \n", + "-1.7 18.72 \n", + "-14.03 19.45 \n", + "-14.03 19.45 \n", + "-1.7 20.25 \n", + "-1.7 22.15 \n", + "-1.7 24.08 \n", + "-154.53 27.36 \n", + "-154.53 27.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.89 0.25 \n", + "10000000.0 10000000.0 \n", + "1898.65 42.6 \n", + "-371.91 2.02 \n", + "-10.33 7.71 \n", + "-2.53 1.22 \n", + "-3.7 0.78 \n", + "-1.65 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.5 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.01 1.99 \n", + "-1.01 1.99 \n", + "-8.46 7.46 \n", + "-5.97 0.42 \n", + "-4.41 0.41 \n", + "10000000.0 10000000.0 \n", + "1.26 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 2.78 \n", + "10000000.0 10000000.0 \n", + "-2.48 0.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-25.73 1.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "None None \n", + "2.5 6.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "0.32 0.26 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "14.98 2.36 \n", + "10000000.0 10000000.0 \n", + "-2.96 0.68 \n", + "-24.11 1.28 \n", + "-18.97 14.01 \n", + "None 29.93 \n", + "15.82 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.81 0.35 \n", + "None None \n", + "0.18 0.36 \n", + "-2.63 0.42 \n", + "10000000.0 10000000.0 \n", + "-1.7 21.53 \n", + "-1.7 21.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.91 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.77 0.76 \n", + "10000000.0 10000000.0 \n", + "-2.82 0.3 \n", + "10000000.0 10000000.0 \n", + "-22.39 2.12 \n", + "-2.72 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.1 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.01 0.82 \n", + "-15.7 1.65 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.26 1.65 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.89 0.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-20.4 8.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.1 0.19 \n", + "0.4 0.61 \n", + "-2.86 0.3 \n", + "10000000.0 10000000.0 \n", + "-15.85 6.02 \n", + "10000000.0 10000000.0 \n", + "-11.73 7.23 \n", + "-8.46 7.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.54 1.03 \n", + "-8.44 0.72 \n", + "6.75 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.27 0.9 \n", + "10000000.0 10000000.0 \n", + "-11.65 1.23 \n", + "-8.92 0.61 \n", + "-8.92 0.61 \n", + "4.99 5.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.99 1.04 \n", + "9.72 1.12 \n", + "-5.97 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.38 1.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "15.68 0.45 \n", + "15.67 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 1.94 \n", + "-112.88 1.42 \n", + "-116.65 2.22 \n", + "-118.47 1.4 \n", + "11.1 1.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "-15.02 7.69 \n", + "-101.73 10.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.47 1.17 \n", + "-9.73 2.72 \n", + "10000000.0 10000000.0 \n", + "-16.89 9.28 \n", + "-0.05 1.8 \n", + "-34.54 1.84 \n", + "-34.54 1.84 \n", + "10000000.0 10000000.0 \n", + "9.67 6.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.32 3.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.87 3.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.41 2.4 \n", + "-1.7 8.01 \n", + "-1.7 8.01 \n", + "-1.7 5.54 \n", + "-1.7 5.69 \n", + "-1.7 5.38 \n", + "3.41 2.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.65 0.64 \n", + "-0.65 0.64 \n", + "-0.65 0.64 \n", + "-0.65 0.64 \n", + "-0.65 0.64 \n", + "-0.65 0.64 \n", + "None 20.87 \n", + "None 20.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.21 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-3.35 0.3 \n", + "-3.35 0.3 \n", + "-3.35 0.3 \n", + "-3.35 0.3 \n", + "-3.35 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.37 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.15 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-73.98 0.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.34 0.74 \n", + "2.34 0.74 \n", + "2.34 0.74 \n", + "2.34 0.74 \n", + "2.34 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.08 0.75 \n", + "-5.07 0.49 \n", + "-4.36 7.13 \n", + "-4.36 7.13 \n", + "10000000.0 10000000.0 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "-294.47 21.93 \n", + "-294.47 21.93 \n", + "-95.07 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.88 0.24 \n", + "-2.82 0.67 \n", + "-2.82 0.67 \n", + "4.06 0.3 \n", + "-105.96 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 5.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.85 0.5 \n", + "-15.54 0.35 \n", + "-0.4 0.71 \n", + "2.08 1.37 \n", + "-1.45 1.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.46 0.4 \n", + "10000000.0 10000000.0 \n", + "-1.0 0.52 \n", + "-5.9 0.34 \n", + "-72.76 0.79 \n", + "-72.76 0.79 \n", + "6.57 3.02 \n", + "-38.54 2.41 \n", + "-40.35 2.26 \n", + "-59.43 0.49 \n", + "-94.13 0.75 \n", + "-94.13 0.75 \n", + "-104.63 0.81 \n", + "-104.63 0.81 \n", + "-98.33 13.34 \n", + "-98.33 13.34 \n", + "-4.52 1.9 \n", + "-4.52 1.9 \n", + "10.82 0.19 \n", + "-0.18 0.36 \n", + "0.99 0.31 \n", + "-42.32 0.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "13.21 2.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 4.69 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.73 1.39 \n", + "-83.99 0.48 \n", + "10000000.0 10000000.0 \n", + "32.17 1.01 \n", + "-1.14 4.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.85 0.19 \n", + "10.85 0.19 \n", + "-213.26 1.79 \n", + "3.48 0.99 \n", + "0.28 0.38 \n", + "0.28 0.38 \n", + "-104.48 0.79 \n", + "-104.48 0.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.28 0.38 \n", + "0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.52 1.9 \n", + "4.52 1.9 \n", + "-13.27 0.43 \n", + "-21.65 7.54 \n", + "-94.13 0.75 \n", + "-94.13 0.75 \n", + "-103.56 14.88 \n", + "-103.56 14.88 \n", + "-98.33 13.36 \n", + "-98.33 13.36 \n", + "-4.52 1.9 \n", + "10000000.0 10000000.0 \n", + "-94.13 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-104.63 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-118.19 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.94 0.97 \n", + "10000000.0 10000000.0 \n", + "0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "-92.58 11.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-103.56 11.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-118.58 11.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.01 11.51 \n", + "1.01 11.52 \n", + "10000000.0 10000000.0 \n", + "0.28 0.98 \n", + "0.28 0.98 \n", + "4.52 1.9 \n", + "-8.37 0.76 \n", + "10000000.0 10000000.0 \n", + "-102.6 0.84 \n", + "-98.05 0.82 \n", + "-111.02 0.95 \n", + "-4.12 1.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.3 11.49 \n", + "-1.55 9.74 \n", + "-0.28 0.37 \n", + "None None \n", + "-98.05 0.82 \n", + "-94.13 0.75 \n", + "-97.2 0.8 \n", + "-94.13 0.75 \n", + "-97.2 0.8 \n", + "-94.13 0.75 \n", + "-104.63 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-30.57 1.39 \n", + "10000000.0 10000000.0 \n", + "-3.8 5.42 \n", + "-3.79 1.08 \n", + "2.78 0.41 \n", + "13.11 0.64 \n", + "14.37 0.55 \n", + "25.84 7.93 \n", + "7.06 7.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "10.66 0.78 \n", + "-11.48 1.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.32 4.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-68.26 1.27 \n", + "-73.78 3.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-118.58 6.66 \n", + "-39.17 2.71 \n", + "-39.84 2.51 \n", + "10000000.0 10000000.0 \n", + "-7.91 1.04 \n", + "-24.32 4.05 \n", + "-18.64 1.57 \n", + "-44.16 1.66 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.44 0.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.2 0.86 \n", + "-3.11 6.06 \n", + "-3.11 6.06 \n", + "2.59 0.57 \n", + "-2.76 0.44 \n", + "-2.93 0.84 \n", + "-7.92 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.87 0.64 \n", + "-9.14 0.51 \n", + "10000000.0 10000000.0 \n", + "4.29 0.24 \n", + "4.29 0.24 \n", + "4.29 0.24 \n", + "4.29 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.29 0.24 \n", + "4.29 0.24 \n", + "-6.86 0.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-96.26 6.71 \n", + "-105.11 6.72 \n", + "10000000.0 10000000.0 \n", + "-79.28 1.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-20.99 1.11 \n", + "-6.68 1.33 \n", + "4.62 0.29 \n", + "-78.09 0.61 \n", + "-92.02 1.91 \n", + "5.73 0.54 \n", + "-2.0 6.73 \n", + "-2.0 6.73 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "2.3 11.73 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "None None \n", + "-0.68 0.53 \n", + "-13.17 0.99 \n", + "-0.68 0.53 \n", + "-13.16 0.99 \n", + "-0.68 0.53 \n", + "-94.12 0.75 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "-1.18 0.45 \n", + "3.76 12.89 \n", + "-5.25 12.37 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "4.41 0.24 \n", + "-7.16 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.57 8.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-104.34 13.25 \n", + "-104.34 14.43 \n", + "-104.34 14.42 \n", + "-104.34 13.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.4 0.86 \n", + "-2.29 0.75 \n", + "-2.62 0.35 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "4.44 0.24 \n", + "-13.0 0.43 \n", + "None None \n", + "5.53 0.9 \n", + "5.53 0.9 \n", + "10000000.0 10000000.0 \n", + "-14.84 1.99 \n", + "-69.98 2.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-97.43 1.4 \n", + "-3.07 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-23.57 10.53 \n", + "-7.85 0.58 \n", + "10000000.0 10000000.0 \n", + "-23.57 10.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-32.0 1.07 \n", + "10000000.0 10000000.0 \n", + "-21.55 11.94 \n", + "0.06 11.21 \n", + "-2.88 12.23 \n", + "10000000.0 10000000.0 \n", + "-21.55 11.96 \n", + "-8.68 0.26 \n", + "4.89 0.24 \n", + "-94.12 0.75 \n", + "-0.28 0.37 \n", + "None None \n", + "14.87 0.86 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.83 0.58 \n", + "-7.85 0.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-40.99 5.86 \n", + "-94.12 0.75 \n", + "-8.68 0.26 \n", + "4.89 0.24 \n", + "-0.78 0.41 \n", + "-6.74 5.81 \n", + "-197.96 3.56 \n", + "-20.43 1.99 \n", + "None None \n", + "-31.23 2.21 \n", + "-34.84 1.85 \n", + "-34.84 1.85 \n", + "116.7 0.44 \n", + "36.8 0.83 \n", + "2.47 3.5 \n", + "-5.27 3.64 \n", + "-93.66 3.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.73 3.81 \n", + "-8.77 0.44 \n", + "-4.37 0.56 \n", + "-0.01 0.3 \n", + "-21.7 2.04 \n", + "0.39 0.9 \n", + "0.39 0.9 \n", + "-72.33 0.28 \n", + "10000000.0 10000000.0 \n", + "3.25 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-61.65 4.06 \n", + "-11.34 5.16 \n", + "10000000.0 10000000.0 \n", + "-95.09 1.3 \n", + "-0.06 1.06 \n", + "5.73 1.39 \n", + "-12.23 1.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.84 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-31.55 8.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-98.05 0.82 \n", + "-3.88 0.56 \n", + "-2.63 0.42 \n", + "-2.63 0.42 \n", + "-0.28 0.38 \n", + "None None \n", + "-0.28 0.38 \n", + "-0.28 0.38 \n", + "-20.33 6.2 \n", + "-0.28 0.38 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "21.19 0.61 \n", + "10000000.0 10000000.0 \n", + "-20.33 6.2 \n", + "None None \n", + "0.61 None \n", + "22.47 0.61 \n", + "28.31 1.16 \n", + "6.4 0.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.81 0.46 \n", + "10000000.0 10000000.0 \n", + "-118.63 1.24 \n", + "-8.35 5.39 \n", + "-198.75 1.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.81 0.46 \n", + "-2.62 0.35 \n", + "-13.83 5.93 \n", + "-6.77 0.68 \n", + "-6.24 0.59 \n", + "-7.15 0.85 \n", + "-7.15 0.85 \n", + "-90.63 6.29 \n", + "-83.95 6.43 \n", + "-15.4 3.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.24 0.59 \n", + "-7.15 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.24 0.59 \n", + "-7.15 0.85 \n", + "10000000.0 10000000.0 \n", + "-90.63 6.31 \n", + "-83.95 6.42 \n", + "-15.4 3.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-90.63 6.26 \n", + "-83.95 6.37 \n", + "-15.4 3.63 \n", + "-90.63 6.27 \n", + "-83.95 6.38 \n", + "-15.4 3.65 \n", + "-90.63 6.28 \n", + "-83.95 6.39 \n", + "-15.4 3.67 \n", + "-83.95 6.4 \n", + "-15.4 3.69 \n", + "-90.63 6.33 \n", + "120.23 0.59 \n", + "8.9 0.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "-97.25 10.69 \n", + "-19.02 1.47 \n", + "-0.28 0.37 \n", + "-12.75 0.66 \n", + "-13.38 0.43 \n", + "5.38 6.4 \n", + "0.95 2.01 \n", + "-9.75 2.51 \n", + "-7.58 1.67 \n", + "-43.17 1.82 \n", + "10000000.0 10000000.0 \n", + "-5.08 1.3 \n", + "-18.85 1.53 \n", + "-22.59 2.38 \n", + "10000000.0 10000000.0 \n", + "12.25 1.78 \n", + "-0.14 0.58 \n", + "5.93 1.94 \n", + "2.46 0.57 \n", + "10000000.0 10000000.0 \n", + "15.34 2.08 \n", + "-7.88 0.54 \n", + "-93.36 1.04 \n", + "10000000.0 10000000.0 \n", + "-7.36 0.77 \n", + "10000000.0 10000000.0 \n", + "-9.12 1.24 \n", + "-43.94 1.71 \n", + "-20.0 1.66 \n", + "-8.67 0.27 \n", + "-40.4 1.05 \n", + "-26.84 1.03 \n", + "-40.79 1.05 \n", + "-2.28 0.8 \n", + "10000000.0 10000000.0 \n", + "-7.1 5.7 \n", + "-0.85 5.2 \n", + "-8.58 5.07 \n", + "-5.75 5.02 \n", + "4.89 0.24 \n", + "-40.4 1.05 \n", + "0.44 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.88 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-49.33 0.53 \n", + "-49.44 0.53 \n", + "-32.3 1.94 \n", + "-32.46 1.65 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "-3.87 0.56 \n", + "-5.49 0.39 \n", + "-5.91 0.39 \n", + "-2.14 0.66 \n", + "1.16 0.47 \n", + "10000000.0 10000000.0 \n", + "-59.88 1.53 \n", + "-6.66 0.55 \n", + "10000000.0 10000000.0 \n", + "-2.63 0.42 \n", + "10000000.0 10000000.0 \n", + "-12.65 0.97 \n", + "-12.22 0.97 \n", + "None None \n", + "-37.02 1.12 \n", + "5.34 0.56 \n", + "-5.9 0.39 \n", + "1.56 0.47 \n", + "-6.31 0.39 \n", + "-3.86 0.56 \n", + "-3.87 0.56 \n", + "-106.0 0.91 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "-62.11 1.36 \n", + "-62.11 1.36 \n", + "-14.23 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.82 0.39 \n", + "-26.84 1.03 \n", + "2.23 5.73 \n", + "2.23 5.49 \n", + "-106.01 0.91 \n", + "-62.56 1.36 \n", + "-11.13 0.39 \n", + "-108.63 1.19 \n", + "-74.83 1.75 \n", + "2.36 0.47 \n", + "-0.08 0.76 \n", + "-32.0 1.07 \n", + "-3.68 2.32 \n", + "-3.68 2.32 \n", + "10000000.0 10000000.0 \n", + "-2.86 15.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.11 0.66 \n", + "-7.77 1.33 \n", + "4.32 0.41 \n", + "-3.85 0.6 \n", + "-5.47 0.3 \n", + "-4.2 0.85 \n", + "-69.98 2.5 \n", + "-3.43 0.44 \n", + "-26.84 1.03 \n", + "1.97 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-102.0 2.0 \n", + "3.76 7.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.81 0.38 \n", + "-3.8 0.44 \n", + "-35.95 7.33 \n", + "-20.33 7.24 \n", + "-19.2 7.17 \n", + "-28.81 1.09 \n", + "10000000.0 10000000.0 \n", + "-27.33 1.09 \n", + "10000000.0 10000000.0 \n", + "-10.46 7.1 \n", + "None 4.98 \n", + "-67.09 1.16 \n", + "10000000.0 10000000.0 \n", + "-67.09 1.16 \n", + "-66.63 1.84 \n", + "-67.09 1.16 \n", + "-68.34 1.21 \n", + "-67.09 1.16 \n", + "6.39 0.44 \n", + "-10.69 0.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.75 7.62 \n", + "-3.09 5.7 \n", + "4.44 0.24 \n", + "-15.9 0.82 \n", + "-5.86 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.92 0.84 \n", + "0.92 0.84 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.83 0.39 \n", + "-3.84 0.39 \n", + "-11.5 1.16 \n", + "-3.87 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "3.76 8.46 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.86 6.18 \n", + "-19.86 6.14 \n", + "-19.86 6.54 \n", + "-19.86 6.49 \n", + "-9.31 0.43 \n", + "-9.31 0.43 \n", + "-122.35 1.05 \n", + "-122.35 1.05 \n", + "-2.86 0.33 \n", + "-24.42 7.38 \n", + "10000000.0 10000000.0 \n", + "3.24 0.82 \n", + "3.24 0.82 \n", + "3.24 0.82 \n", + "3.24 0.82 \n", + "3.24 0.82 \n", + "3.24 0.82 \n", + "3.24 0.82 \n", + "3.24 0.82 \n", + "3.24 0.82 \n", + "3.24 0.82 \n", + "4.44 0.24 \n", + "3.76 8.46 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "-0.18 0.36 \n", + "-0.18 0.36 \n", + "14.27 0.34 \n", + "14.27 0.34 \n", + "14.27 0.34 \n", + "14.27 0.34 \n", + "-19.86 6.16 \n", + "-19.2 6.21 \n", + "-1.7 9.57 \n", + "-1.7 10.47 \n", + "-1.7 9.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "3.24 0.82 \n", + "3.24 0.82 \n", + "-24.6 1.18 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.48 0.53 \n", + "-0.48 0.53 \n", + "22.6 1.66 \n", + "21.79 6.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "100.02 10.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-50.05 1.65 \n", + "-40.6 5.86 \n", + "10000000.0 10000000.0 \n", + "15.65 5.85 \n", + "-105.97 0.91 \n", + "-111.93 1.28 \n", + "-105.91 1.63 \n", + "-111.93 1.28 \n", + "-105.92 1.63 \n", + "-86.18 1.85 \n", + "-86.18 1.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-197.13 1.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-194.13 1.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.9 0.92 \n", + "-10.11 0.84 \n", + "10000000.0 10000000.0 \n", + "-91.9 1.76 \n", + "10000000.0 10000000.0 \n", + "1.47 11.27 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-40.59 14.57 \n", + "-55.07 9.14 \n", + "10000000.0 10000000.0 \n", + "-0.22 0.26 \n", + "-64.85 6.42 \n", + "10000000.0 10000000.0 \n", + "-207.0 1.57 \n", + "10000000.0 10000000.0 \n", + "-50.85 3.93 \n", + "10000000.0 10000000.0 \n", + "-23.57 9.75 \n", + "10.13 9.91 \n", + "-0.33 14.65 \n", + "None 0.49 \n", + "7.09 0.07 \n", + "-43.73 4.01 \n", + "-26.32 1.97 \n", + "-57.55 3.98 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.48 0.85 \n", + "10000000.0 10000000.0 \n", + "3.74 0.59 \n", + "-0.75 0.86 \n", + "2.59 0.8 \n", + "-20.34 2.05 \n", + "-1.55 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.18 0.75 \n", + "2.18 0.75 \n", + "None 4.26 \n", + "None 4.45 \n", + "2.18 0.75 \n", + "2.18 0.75 \n", + "None 4.46 \n", + "2.18 0.75 \n", + "2.18 0.75 \n", + "None 4.64 \n", + "None 4.67 \n", + "None 4.67 \n", + "None 4.82 \n", + "None 4.82 \n", + "None 5.07 \n", + "2.18 0.75 \n", + "None 4.88 \n", + "None 5.09 \n", + "None 5.09 \n", + "None 5.09 \n", + "None 5.21 \n", + "10000000.0 10000000.0 \n", + "-22.57 1.11 \n", + "-189.98 12.91 \n", + "-34.59 6.27 \n", + "-12.78 1.18 \n", + "-119.88 1.45 \n", + "-14.4 7.04 \n", + "9.59 6.29 \n", + "-13.31 0.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-97.22 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.65 0.46 \n", + "10000000.0 10000000.0 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "-51.69 3.16 \n", + "-0.96 1.47 \n", + "-0.59 0.75 \n", + "-0.59 0.75 \n", + "None None \n", + "None None \n", + "-0.96 1.47 \n", + "-0.96 1.47 \n", + "-0.96 1.47 \n", + "-1.55 0.74 \n", + "-1.55 0.74 \n", + "-1.55 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-125.69 0.47 \n", + "-125.69 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.65 1.11 \n", + "-3.65 1.11 \n", + "-1.36 6.79 \n", + "-1.36 6.79 \n", + "-10.63 1.23 \n", + "-3.0 0.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.4 1.4 \n", + "4.44 0.24 \n", + "-5.81 0.35 \n", + "-5.81 0.35 \n", + "-7.19 0.32 \n", + "-105.98 0.91 \n", + "-5.8 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 7.69 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.89 0.25 \n", + "-9.06 0.27 \n", + "-10.93 5.66 \n", + "-39.48 5.64 \n", + "14.65 5.65 \n", + "10000000.0 10000000.0 \n", + "7.34 2.56 \n", + "-5.96 0.32 \n", + "10000000.0 10000000.0 \n", + "-189.98 12.77 \n", + "-119.88 1.45 \n", + "-14.4 6.86 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.61 7.28 \n", + "None None \n", + "0.18 0.36 \n", + "10.55 0.84 \n", + "5.29 1.76 \n", + "10.72 0.87 \n", + "-15.26 3.57 \n", + "-62.48 1.36 \n", + "-11.68 0.39 \n", + "-22.91 1.01 \n", + "-20.64 5.57 \n", + "-14.92 1.4 \n", + "-14.92 1.4 \n", + "-20.64 5.74 \n", + "-105.97 0.91 \n", + "-105.97 0.91 \n", + "4.21 0.8 \n", + "-22.91 1.01 \n", + "-20.64 8.36 \n", + "-20.64 8.36 \n", + "-34.19 0.26 \n", + "-13.9 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.65 2.03 \n", + "-0.89 0.73 \n", + "-5.96 1.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.8 0.55 \n", + "-7.56 0.81 \n", + "-8.36 0.58 \n", + "-26.84 4.92 \n", + "-26.84 5.0 \n", + "10000000.0 10000000.0 \n", + "0.37 0.56 \n", + "0.37 0.56 \n", + "-0.88 0.81 \n", + "-0.88 0.81 \n", + "-77.12 4.13 \n", + "-117.73 4.26 \n", + "-110.1 2.25 \n", + "None None \n", + "-2.14 0.18 \n", + "-3.59 0.52 \n", + "-5.73 0.54 \n", + "-5.73 0.54 \n", + "-5.4 0.55 \n", + "-3.11 4.19 \n", + "-17.63 1.07 \n", + "-49.25 0.53 \n", + "10000000.0 10000000.0 \n", + "-55.17 1.05 \n", + "-0.07 0.57 \n", + "-39.17 2.52 \n", + "-158.48 2.98 \n", + "-58.45 0.54 \n", + "-97.22 0.8 \n", + "-5.14 1.86 \n", + "-9.33 0.11 \n", + "22.25 1.18 \n", + "10000000.0 10000000.0 \n", + "-4.57 3.39 \n", + "-26.04 3.33 \n", + "-25.52 6.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.35 0.99 \n", + "-9.36 0.55 \n", + "3.87 2.37 \n", + "-9.13 0.55 \n", + "-3.97 0.52 \n", + "6.89 0.98 \n", + "-10.34 2.37 \n", + "-3.74 0.52 \n", + "-0.75 6.88 \n", + "-15.13 4.29 \n", + "-8.55 0.26 \n", + "10000000.0 10000000.0 \n", + "-105.97 0.91 \n", + "-105.97 0.91 \n", + "-105.97 0.91 \n", + "-105.97 0.91 \n", + "-105.98 0.91 \n", + "-105.98 0.91 \n", + "-100.42 1.33 \n", + "9.83 0.39 \n", + "-15.54 0.35 \n", + "13.66 1.6 \n", + "28.01 0.2 \n", + "10000000.0 10000000.0 \n", + "-4.36 9.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.16 0.99 \n", + "-9.12 0.55 \n", + "-3.98 0.52 \n", + "6.7 0.98 \n", + "10000000.0 10000000.0 \n", + "-4.5 9.73 \n", + "-19.78 1.92 \n", + "-19.78 1.92 \n", + "-0.56 9.81 \n", + "-0.56 9.81 \n", + "0.1 9.81 \n", + "0.1 9.81 \n", + "-16.98 11.54 \n", + "-16.98 11.54 \n", + "14.27 0.34 \n", + "-95.25 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.63 1.66 \n", + "21.0 10.87 \n", + "10000000.0 10000000.0 \n", + "-13.19 1.1 \n", + "-13.81 1.21 \n", + "-13.81 1.21 \n", + "-2.73 0.45 \n", + "-2.73 0.45 \n", + "-2.41 0.52 \n", + "-2.41 0.52 \n", + "-13.16 0.99 \n", + "-9.12 0.55 \n", + "-3.98 0.52 \n", + "6.7 0.98 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.88 7.42 \n", + "-104.34 8.4 \n", + "-18.46 0.78 \n", + "-18.46 0.78 \n", + "-115.73 1.59 \n", + "-113.03 1.41 \n", + "-2.41 0.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-104.34 10.2 \n", + "-208.47 2.24 \n", + "-119.88 1.45 \n", + "7.08 1.27 \n", + "7.08 1.27 \n", + "7.08 1.27 \n", + "9.12 1.25 \n", + "7.08 1.27 \n", + "7.08 1.27 \n", + "7.08 1.27 \n", + "7.08 1.27 \n", + "9.12 1.25 \n", + "-13.34 0.99 \n", + "-9.34 0.55 \n", + "-3.76 0.52 \n", + "6.88 0.98 \n", + "-3.74 0.42 \n", + "-3.78 0.6 \n", + "-3.74 0.42 \n", + "-3.78 0.6 \n", + "-5.97 0.42 \n", + "-4.08 5.59 \n", + "-4.08 5.59 \n", + "-4.08 5.59 \n", + "-4.08 5.59 \n", + "-1.7 5.59 \n", + "-3.74 0.42 \n", + "-3.78 0.6 \n", + "-3.74 0.42 \n", + "-3.78 0.6 \n", + "-3.74 0.42 \n", + "-3.78 0.6 \n", + "-3.74 0.42 \n", + "-3.78 0.6 \n", + "-3.74 0.42 \n", + "-3.78 0.6 \n", + "-3.74 0.42 \n", + "-3.78 0.6 \n", + "-3.74 0.42 \n", + "-3.78 0.6 \n", + "10000000.0 10000000.0 \n", + "-37.02 7.55 \n", + "-81.93 6.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.45 0.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.25 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "0.28 0.38 \n", + "1.57 0.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.63 0.68 \n", + "-21.34 4.64 \n", + "-1.89 0.59 \n", + "3.44 0.62 \n", + "95.52 1.97 \n", + "142.45 5.58 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "-18.81 6.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.35 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.04 1.08 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "-106.03 0.91 \n", + "4.29 4.13 \n", + "-67.14 6.81 \n", + "10000000.0 10000000.0 \n", + "2.76 7.66 \n", + "-6.4 0.52 \n", + "-5.06 1.01 \n", + "8.72 5.53 \n", + "-1.6 0.35 \n", + "10000000.0 10000000.0 \n", + "-47.65 1.66 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.68 \n", + "-8.37 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.38 1.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.81 6.28 \n", + "10000000.0 10000000.0 \n", + "-24.88 21.55 \n", + "13.16 0.72 \n", + "-6.51 1.09 \n", + "0.83 2.7 \n", + "237.59 1.08 \n", + "-2.03 0.53 \n", + "-1.58 6.09 \n", + "-97.48 1.09 \n", + "10000000.0 10000000.0 \n", + "-0.9 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.13 4.36 \n", + "5.53 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-107.68 1.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-34.58 1.79 \n", + "10000000.0 10000000.0 \n", + "-4.7 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.23 6.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "-1.64 0.95 \n", + "6.36 6.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.91 7.35 \n", + "-94.13 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-100.37 0.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.47 3.51 \n", + "10000000.0 10000000.0 \n", + "-71.84 0.2 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.56 4.47 \n", + "-27.75 1.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.65 0.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-20.55 1.4 \n", + "10000000.0 10000000.0 \n", + "-11.57 1.97 \n", + "10000000.0 10000000.0 \n", + "-31.45 5.8 \n", + "-0.37 0.55 \n", + "10.56 3.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "87.67 0.3 \n", + "-4.36 6.26 \n", + "-102.35 1.16 \n", + "-13.09 1.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-77.88 13.98 \n", + "10000000.0 10000000.0 \n", + "45.78 4.23 \n", + "-166.81 3.17 \n", + "10000000.0 10000000.0 \n", + "-1.89 1.29 \n", + "10000000.0 10000000.0 \n", + "289.1 0.21 \n", + "-5.82 0.35 \n", + "-6.02 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3091.77 13.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-29.74 1.82 \n", + "4.89 0.25 \n", + "-7.2 0.41 \n", + "2.08 0.34 \n", + "-9.06 0.26 \n", + "10000000.0 10000000.0 \n", + "21.7 3.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.98 0.42 \n", + "10000000.0 10000000.0 \n", + "30.97 2.76 \n", + "10000000.0 10000000.0 \n", + "-91.65 4.65 \n", + "10000000.0 10000000.0 \n", + "-0.1 0.24 \n", + "-10.13 1.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.61 5.1 \n", + "10000000.0 10000000.0 \n", + "-0.74 0.53 \n", + "-4.36 6.58 \n", + "10000000.0 10000000.0 \n", + "-12.96 4.25 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "-25.07 7.17 \n", + "-6.07 0.85 \n", + "7.21 0.31 \n", + "10000000.0 10000000.0 \n", + "-11.86 0.81 \n", + "-69.98 4.36 \n", + "-3.33 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "-5.29 5.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.22 2.23 \n", + "10000000.0 10000000.0 \n", + "-2.86 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 20.23 \n", + "10000000.0 10000000.0 \n", + "4.33 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.2 5.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.12 0.53 \n", + "-0.46 1.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.75 0.52 \n", + "-40.05 2.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "21.65 5.31 \n", + "-14.03 6.62 \n", + "4.81 1.37 \n", + "10000000.0 10000000.0 \n", + "-34.54 1.84 \n", + "-0.37 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "5.86 7.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.07 \n", + "10000000.0 10000000.0 \n", + "-1.35 0.33 \n", + "-42.9 2.18 \n", + "-9.77 5.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.19 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.61 7.11 \n", + "-2.97 2.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 1.65 \n", + "10000000.0 10000000.0 \n", + "-1.7 26.29 \n", + "10000000.0 10000000.0 \n", + "-1.17 13.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.72 8.82 \n", + "177.99 0.73 \n", + "-3.53 6.32 \n", + "10000000.0 10000000.0 \n", + "-1.7 5.31 \n", + "-18.82 0.66 \n", + "3.41 1.14 \n", + "11.57 5.34 \n", + "-1.92 5.04 \n", + "10000000.0 10000000.0 \n", + "4.47 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-29.5 7.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "91.84 3.34 \n", + "-87.62 0.79 \n", + "-4.17 0.32 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.34 0.54 \n", + "-21.55 6.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.99 \n", + "10000000.0 10000000.0 \n", + "23.24 5.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-113.3 0.76 \n", + "-46.66 1.67 \n", + "-7.76 4.0 \n", + "10000000.0 10000000.0 \n", + "-1.83 1.45 \n", + "-0.9 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.56 6.93 \n", + "8.5 1.07 \n", + "7.75 0.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.84 0.39 \n", + "None 3.45 \n", + "-13.11 5.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "-13.18 1.07 \n", + "3.35 0.91 \n", + "-2.51 0.65 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-107.74 1.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-32.53 5.71 \n", + "10000000.0 10000000.0 \n", + "-2.77 0.35 \n", + "10000000.0 10000000.0 \n", + "-4.18 0.32 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.63 \n", + "10000000.0 10000000.0 \n", + "-2.17 0.3 \n", + "-2.94 3.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-34.53 4.86 \n", + "10000000.0 10000000.0 \n", + "-39.72 10.41 \n", + "-2.81 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.02 0.56 \n", + "-26.84 5.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.87 0.31 \n", + "10000000.0 10000000.0 \n", + "-104.51 1.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-88.91 4.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-23.95 7.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.35 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-105.45 1.44 \n", + "-206.26 3.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.07 0.86 \n", + "-105.95 0.91 \n", + "10000000.0 10000000.0 \n", + "-3.62 0.45 \n", + "-8.76 0.66 \n", + "-12.57 0.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "14.27 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.02 0.49 \n", + "-4.36 8.33 \n", + "-0.39 0.41 \n", + "-21.55 6.6 \n", + "-52.23 2.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 5.91 \n", + "-94.96 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.03 0.34 \n", + "10000000.0 10000000.0 \n", + "-12.13 0.72 \n", + "4.89 0.24 \n", + "-0.68 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.86 2.38 \n", + "-17.62 0.92 \n", + "1.19 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "-3.17 0.58 \n", + "10000000.0 10000000.0 \n", + "-0.46 1.57 \n", + "57.67 0.41 \n", + "10000000.0 10000000.0 \n", + "-2.7 9.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.44 0.24 \n", + "-61.38 1.7 \n", + "-108.25 1.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.82 0.35 \n", + "1.78 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.69 0.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.03 0.43 \n", + "-14.03 4.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.76 0.53 \n", + "10000000.0 10000000.0 \n", + "-3.63 0.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "-3.7 0.86 \n", + "10000000.0 10000000.0 \n", + "-26.84 4.48 \n", + "10000000.0 10000000.0 \n", + "-63.79 20.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.59 1.29 \n", + "-11.71 0.91 \n", + "None 11.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.74 0.53 \n", + "-2.03 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-24.99 1.26 \n", + "-84.48 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "15.46 5.06 \n", + "-71.78 4.31 \n", + "-33.35 19.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.51 2.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "429.54 3.37 \n", + "10000000.0 10000000.0 \n", + "-1.7 8.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "-4.69 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "157.16 1.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.63 1.66 \n", + "10000000.0 10000000.0 \n", + "-26.84 5.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.46 0.05 \n", + "-3.84 0.39 \n", + "10000000.0 10000000.0 \n", + "-10.76 10.74 \n", + "10000000.0 10000000.0 \n", + "-3.59 0.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.07 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-65.16 2.1 \n", + "10000000.0 10000000.0 \n", + "-3.04 0.42 \n", + "10000000.0 10000000.0 \n", + "-20.65 1.47 \n", + "10000000.0 10000000.0 \n", + "-1.7 9.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.93 0.56 \n", + "-40.41 3.41 \n", + "-13.21 1.06 \n", + "-118.86 3.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.84 6.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-105.96 0.91 \n", + "10000000.0 10000000.0 \n", + "-1.7 10.73 \n", + "1.6 13.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.88 0.56 \n", + "-50.32 17.9 \n", + "None 2.7 \n", + "-1.59 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-119.29 30.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 3.56 \n", + "-31.45 5.38 \n", + "-0.4 1.75 \n", + "-4.36 6.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-127.44 1.94 \n", + "-11.16 0.62 \n", + "10000000.0 10000000.0 \n", + "250.26 3.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.45 1.21 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-25.07 7.2 \n", + "-6.53 5.01 \n", + "-9.21 6.24 \n", + "10000000.0 10000000.0 \n", + "-4.38 1.47 \n", + "10000000.0 10000000.0 \n", + "-0.46 5.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "290.76 0.58 \n", + "10000000.0 10000000.0 \n", + "2.9 3.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.14 0.76 \n", + "10000000.0 10000000.0 \n", + "1.23 0.72 \n", + "-69.98 4.36 \n", + "-0.9 0.81 \n", + "10000000.0 10000000.0 \n", + "-13.11 6.41 \n", + "-74.27 4.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.99 0.41 \n", + "10000000.0 10000000.0 \n", + "3.76 8.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-90.63 6.18 \n", + "1.22 2.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.56 4.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "None 1.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-43.12 2.54 \n", + "-0.87 5.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.13 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.37 0.45 \n", + "-29.23 7.46 \n", + "7.79 0.68 \n", + "-40.59 8.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.23 \n", + "None None \n", + "5.68 5.96 \n", + "-2.86 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.22 1.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.51 8.68 \n", + "10000000.0 10000000.0 \n", + "-5.1 0.3 \n", + "-6.13 0.57 \n", + "10000000.0 10000000.0 \n", + "-16.41 1.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.13 5.07 \n", + "-4.36 5.23 \n", + "-105.84 1.07 \n", + "-13.89 1.22 \n", + "10000000.0 10000000.0 \n", + "14.26 0.34 \n", + "-2.03 0.43 \n", + "10000000.0 10000000.0 \n", + "-40.05 2.16 \n", + "-6.07 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.07 0.63 \n", + "11.74 1.51 \n", + "-2.62 0.35 \n", + "-14.03 6.71 \n", + "10000000.0 10000000.0 \n", + "61.57 6.42 \n", + "10000000.0 10000000.0 \n", + "-1.26 0.57 \n", + "-12.77 0.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-198.42 18.99 \n", + "-35.12 2.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.51 8.62 \n", + "10000000.0 10000000.0 \n", + "1.27 0.82 \n", + "None None \n", + "-6.16 0.07 \n", + "-2.81 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "96.34 10.05 \n", + "10000000.0 10000000.0 \n", + "-0.8 5.26 \n", + "-13.16 4.71 \n", + "None 1.88 \n", + "10000000.0 10000000.0 \n", + "-7.39 0.65 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-20.64 5.4 \n", + "10000000.0 10000000.0 \n", + "4.62 2.12 \n", + "-1.88 5.55 \n", + "-8.63 0.26 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "-109.13 8.15 \n", + "-4.31 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.61 0.35 \n", + "-20.62 5.54 \n", + "10000000.0 10000000.0 \n", + "-6.73 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.21 \n", + "10000000.0 10000000.0 \n", + "7.19 0.32 \n", + "10000000.0 10000000.0 \n", + "-26.58 1.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 1.63 \n", + "10000000.0 10000000.0 \n", + "-15.02 0.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 6.57 \n", + "10000000.0 10000000.0 \n", + "-0.26 0.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.23 32.97 \n", + "-0.72 0.35 \n", + "-61.14 0.56 \n", + "6.48 0.85 \n", + "1.46 1.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-31.71 1.23 \n", + "10000000.0 10000000.0 \n", + "-15.02 0.79 \n", + "-18.53 0.78 \n", + "-1.11 2.92 \n", + "-101.37 1.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-49.25 0.53 \n", + "10000000.0 10000000.0 \n", + "-9.66 5.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.46 1.06 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "-4.2 0.57 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.17 3.7 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.02 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "668.78 2.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-49.25 0.53 \n", + "-6.81 5.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "72.98 1.02 \n", + "-4.95 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.92 3.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-133.18 4.01 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "-10.42 8.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.3 1.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.52 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.29 5.15 \n", + "-0.18 0.36 \n", + "113.73 1.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.88 0.56 \n", + "-0.28 0.37 \n", + "-15.02 0.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.27 1.0 \n", + "10000000.0 10000000.0 \n", + "1.26 0.28 \n", + "-4.36 7.44 \n", + "10000000.0 10000000.0 \n", + "-109.69 0.86 \n", + "-61.19 1.37 \n", + "None None \n", + "-2.55 0.35 \n", + "10000000.0 10000000.0 \n", + "-0.5 10.37 \n", + "-8.76 0.61 \n", + "10000000.0 10000000.0 \n", + "-14.03 13.67 \n", + "-2.16 0.33 \n", + "-28.55 6.04 \n", + "10000000.0 10000000.0 \n", + "196.31 11.66 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "59.91 0.49 \n", + "21.7 1.84 \n", + "-61.94 1.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-39.72 10.63 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.76 10.72 \n", + "-8.68 0.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-194.39 1.6 \n", + "5.06 6.33 \n", + "-5.73 0.54 \n", + "-2.03 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.07 0.51 \n", + "10000000.0 10000000.0 \n", + "-1.19 0.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.49 0.41 \n", + "None None \n", + "-13.2 1.07 \n", + "-13.25 1.06 \n", + "10000000.0 10000000.0 \n", + "None 0.88 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-195.87 4.47 \n", + "10000000.0 10000000.0 \n", + "-30.31 1.92 \n", + "-0.01 None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.87 3.68 \n", + "-1.98 0.61 \n", + "-0.99 0.31 \n", + "-0.99 0.31 \n", + "3.49 2.37 \n", + "10000000.0 10000000.0 \n", + "-1.7 5.51 \n", + "3.49 2.37 \n", + "10000000.0 10000000.0 \n", + "-54.19 3.53 \n", + "-57.53 0.74 \n", + "5.37 11.48 \n", + "2.32 0.73 \n", + "-56.58 0.75 \n", + "-56.59 0.75 \n", + "-29.54 0.75 \n", + "-29.55 0.76 \n", + "-118.19 0.76 \n", + "-118.19 0.76 \n", + "-56.58 0.75 \n", + "-56.59 0.75 \n", + "-29.54 0.75 \n", + "-29.55 0.76 \n", + "-118.19 0.76 \n", + "-118.19 0.76 \n", + "-61.87 1.11 \n", + "-49.02 0.35 \n", + "-56.59 0.75 \n", + "0.29 14.85 \n", + "-98.33 13.36 \n", + "-56.58 0.75 \n", + "-56.59 0.75 \n", + "-29.54 0.75 \n", + "-29.55 0.76 \n", + "-118.19 0.76 \n", + "-118.19 0.76 \n", + "-45.42 11.5 \n", + "-45.42 11.49 \n", + "0.29 11.49 \n", + "0.29 11.48 \n", + "-118.58 11.5 \n", + "-118.58 11.49 \n", + "-14.89 1.0 \n", + "-28.29 1.18 \n", + "-28.29 1.18 \n", + "10000000.0 10000000.0 \n", + "-77.35 1.25 \n", + "-77.34 1.25 \n", + "-42.68 1.23 \n", + "-5.5 0.33 \n", + "-0.44 0.64 \n", + "638.41 1.2 \n", + "-779.09 1.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.05 1.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-43.5 0.33 \n", + "-43.5 0.33 \n", + "-43.5 0.33 \n", + "-43.5 0.33 \n", + "-43.5 0.33 \n", + "-59.77 4.89 \n", + "-38.18 1.05 \n", + "-17.34 1.53 \n", + "-2.67 0.69 \n", + "-41.09 0.48 \n", + "10000000.0 10000000.0 \n", + "-17.73 2.41 \n", + "-46.99 0.24 \n", + "-46.01 0.58 \n", + "-46.01 0.58 \n", + "-3.95 0.73 \n", + "-1.9 0.45 \n", + "10000000.0 10000000.0 \n", + "None 0.4 \n", + "0.49 0.32 \n", + "-6.81 0.68 \n", + "193.72 5.32 \n", + "182.34 5.34 \n", + "1.18 0.45 \n", + "-66.95 1.29 \n", + "-66.95 1.29 \n", + "-1.98 0.65 \n", + "-1.67 0.54 \n", + "-7.29 0.76 \n", + "-15.71 0.62 \n", + "-1.54 0.44 \n", + "-41.82 0.58 \n", + "-27.53 5.1 \n", + "-44.65 1.14 \n", + "-43.44 1.21 \n", + "-7.24 0.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.65 0.53 \n", + "-5.81 0.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.42 \n", + "None 0.71 \n", + "None 0.48 \n", + "None 4.3 \n", + "None 4.3 \n", + "None 4.29 \n", + "None None \n", + "None 2.18 \n", + "None 0.71 \n", + "None 0.42 \n", + "None 0.41 \n", + "None 2.14 \n", + "None 0.44 \n", + "None 0.45 \n", + "None 0.41 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 4.27 \n", + "None 0.27 \n", + "None 0.54 \n", + "None 0.71 \n", + "None 4.3 \n", + "None 4.3 \n", + "None None \n", + "None 0.47 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 1.75 \n", + "None 0.71 \n", + "None 0.44 \n", + "None 0.71 \n", + "None 3.92 \n", + "None 0.71 \n", + "None 0.34 \n", + "None 0.44 \n", + "None 0.27 \n", + "None 0.54 \n", + "None 0.44 \n", + "None 4.3 \n", + "None 4.29 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.47 \n", + "None 0.71 \n", + "None 0.4 \n", + "None 0.68 \n", + "None 0.49 \n", + "None None \n", + "None 4.88 \n", + "10000000.0 10000000.0 \n", + "-74.63 2.18 \n", + "10000000.0 10000000.0 \n", + "-2.67 0.69 \n", + "-10.42 6.55 \n", + "6.02 0.21 \n", + "6.02 0.21 \n", + "0.07 0.13 \n", + "-9.59 4.37 \n", + "7.09 0.11 \n", + "-21.19 1.04 \n", + "-3.53 0.8 \n", + "-1.42 0.64 \n", + "-6.56 0.87 \n", + "-1.52 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.62 1.19 \n", + "2.13 0.56 \n", + "1.99 0.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.14 0.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.34 0.85 \n", + "-244.56 0.95 \n", + "-244.56 0.95 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.01 5.36 \n", + "10000000.0 10000000.0 \n", + "-0.31 0.71 \n", + "10000000.0 10000000.0 \n", + "-0.32 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.46 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "23.35 0.94 \n", + "10000000.0 10000000.0 \n", + "-6.04 0.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.35 1.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-126.88 4.94 \n", + "-23.09 1.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.51 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.14 0.96 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "50.12 0.52 \n", + "14.4 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.12 0.13 \n", + "10000000.0 10000000.0 \n", + "-40.48 0.31 \n", + "-40.48 0.31 \n", + "-40.48 0.31 \n", + "-40.48 0.31 \n", + "-40.48 0.31 \n", + "-40.48 0.31 \n", + "-40.48 0.31 \n", + "-40.48 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-43.52 8.13 \n", + "-39.84 8.05 \n", + "13.87 5.18 \n", + "873.99 2.56 \n", + "-0.4 0.31 \n", + "10000000.0 10000000.0 \n", + "None 4.29 \n", + "None 0.71 \n", + "-7.23 0.84 \n", + "-7.23 0.84 \n", + "-11.48 0.31 \n", + "-11.48 0.32 \n", + "2.94 0.49 \n", + "2.94 0.49 \n", + "1.6 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-46.06 1.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-91.54 2.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-33.26 2.13 \n", + "3.13 0.76 \n", + "60.01 0.92 \n", + "6.51 0.55 \n", + "1.11 0.92 \n", + "10000000.0 10000000.0 \n", + "-19.54 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-69.76 1.13 \n", + "10000000.0 10000000.0 \n", + "-46.53 2.0 \n", + "10.54 0.21 \n", + "-16.86 1.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-108.63 1.19 \n", + "-29.5 1.61 \n", + "8.8 1.91 \n", + "-0.84 0.58 \n", + "-1.07 1.13 \n", + "10000000.0 10000000.0 \n", + "-14.34 2.92 \n", + "-3.82 0.6 \n", + "9.5 0.95 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-120.92 2.59 \n", + "11.14 0.86 \n", + "10000000.0 10000000.0 \n", + "8.39 0.99 \n", + "363.59 254.56 \n", + "70.04 0.82 \n", + "-3.86 0.48 \n", + "-7.78 2.81 \n", + "-9.29 1.24 \n", + "577.31 3.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-22.49 1.11 \n", + "10000000.0 10000000.0 \n", + "-367.1 4.77 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.63 0.26 \n", + "4.29 0.24 \n", + "43.24 12.2 \n", + "10000000.0 10000000.0 \n", + "10.66 0.78 \n", + "10000000.0 10000000.0 \n", + "10.66 0.78 \n", + "53.36 1.62 \n", + "-2.63 7.05 \n", + "10.66 0.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "52.75 2.15 \n", + "10.77 0.89 \n", + "10.66 0.78 \n", + "22.7 0.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "61.39 2.33 \n", + "-20.18 2.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.52 0.47 \n", + "10000000.0 10000000.0 \n", + "50.98 2.73 \n", + "-89.38 1.4 \n", + "-81.94 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-292.2 26.75 \n", + "-292.2 26.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.47 0.69 \n", + "3.2 0.69 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-224.46 30.72 \n", + "10000000.0 10000000.0 \n", + "-115.53 2.15 \n", + "12.56 6.38 \n", + "-16.82 1.56 \n", + "-449.7 3.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-335.85 2.23 \n", + "10000000.0 10000000.0 \n", + "-71.47 2.4 \n", + "1096.98 36.3 \n", + "1096.98 36.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-38.35 0.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "903.43 1.05 \n", + "-90.7 0.91 \n", + "-166.35 6.42 \n", + "-288.69 38.53 \n", + "-70.77 8.88 \n", + "-550.63 64.31 \n", + "10000000.0 10000000.0 \n", + "-5.48 0.43 \n", + "10000000.0 10000000.0 \n", + "752.51 53.2 \n", + "-96.0 7.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.3 0.85 \n", + "1.01 0.19 \n", + "None 5.03 \n", + "None 0.71 \n", + "None 4.33 \n", + "None 0.41 \n", + "None 1.87 \n", + "None 0.76 \n", + "None 0.51 \n", + "None 0.66 \n", + "None 0.3 \n", + "None 0.81 \n", + "None 1.84 \n", + "None 7.59 \n", + "None 4.99 \n", + "None 0.71 \n", + "None 5.53 \n", + "None 5.06 \n", + "None 1.06 \n", + "None 5.05 \n", + "None 7.23 \n", + "None 5.43 \n", + "None 5.29 \n", + "None 5.5 \n", + "None 5.52 \n", + "None 5.4 \n", + "None 5.3 \n", + "None 5.23 \n", + "None 5.16 \n", + "None 5.09 \n", + "None 5.11 \n", + "None 5.39 \n", + "None 5.22 \n", + "None 5.15 \n", + "109.52 0.8 \n", + "18.48 0.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "576.46 3.42 \n", + "494.26 4.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 5.03 \n", + "None 5.33 \n", + "None 5.16 \n", + "None 5.09 \n", + "None 5.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "335.74 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-684.71 0.71 \n", + "-682.88 0.63 \n", + "-341.98 0.48 \n", + "-344.0 0.57 \n", + "-345.54 0.59 \n", + "-343.71 0.53 \n", + "10000000.0 10000000.0 \n", + "337.26 0.81 \n", + "-338.95 0.37 \n", + "-683.57 0.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "234.08 0.96 \n", + "-2.09 0.69 \n", + "-2.11 0.69 \n", + "337.37 0.86 \n", + "-380.44 1.09 \n", + "-342.69 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-451.57 7.02 \n", + "10000000.0 10000000.0 \n", + "-0.35 0.77 \n", + "-335.6 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-338.55 1.32 \n", + "-338.54 1.32 \n", + "-335.6 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "370.41 8.55 \n", + "337.38 0.86 \n", + "-551.95 9.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-472.92 7.12 \n", + "10000000.0 10000000.0 \n", + "-348.23 1.16 \n", + "-468.1 7.14 \n", + "234.08 0.96 \n", + "-342.65 0.46 \n", + "233.84 1.02 \n", + "930.73 1.67 \n", + "-334.32 1.52 \n", + "10000000.0 10000000.0 \n", + "338.55 0.48 \n", + "-335.52 1.93 \n", + "-326.77 1.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-340.93 0.97 \n", + "234.07 0.96 \n", + "245.91 0.81 \n", + "245.91 0.81 \n", + "-335.6 0.38 \n", + "-343.81 0.46 \n", + "338.25 1.32 \n", + "-347.37 1.15 \n", + "-39.84 8.6 \n", + "-39.84 8.56 \n", + "-338.64 0.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-552.32 7.88 \n", + "10000000.0 10000000.0 \n", + "-335.89 0.43 \n", + "268.37 1.18 \n", + "10000000.0 10000000.0 \n", + "317.13 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.07 6.54 \n", + "-14.03 5.98 \n", + "2.1 4.19 \n", + "0.07 6.54 \n", + "-1.7 8.03 \n", + "-3.01 2.69 \n", + "0.4 0.71 \n", + "10000000.0 10000000.0 \n", + "0.4 0.71 \n", + "10000000.0 10000000.0 \n", + "1.18 0.45 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "1.14 0.09 \n", + "None 0.71 \n", + "4.44 0.24 \n", + "-0.99 0.31 \n", + "10000000.0 10000000.0 \n", + "-40.98 1.18 \n", + "None 2.01 \n", + "-40.98 1.18 \n", + "-5.31 1.13 \n", + "-5.31 1.13 \n", + "-18.13 0.71 \n", + "-18.13 0.71 \n", + "None 3.44 \n", + "-0.88 0.33 \n", + "-1.98 0.47 \n", + "-22.57 1.11 \n", + "-214.79 0.39 \n", + "-23.93 0.27 \n", + "-5.31 1.13 \n", + "0.79 0.71 \n", + "None None \n", + "-5.31 1.13 \n", + "None 1.8 \n", + "-0.33 0.82 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "-6.08 1.02 \n", + "-14.12 0.57 \n", + "6.14 0.2 \n", + "10000000.0 10000000.0 \n", + "None 0.64 \n", + "-105.97 0.91 \n", + "6.36 0.98 \n", + "None None \n", + "1.4 0.94 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.89 0.62 \n", + "-39.75 1.06 \n", + "None 0.44 \n", + "-39.75 1.06 \n", + "10000000.0 10000000.0 \n", + "8.09 0.14 \n", + "10000000.0 10000000.0 \n", + "0.36 0.71 \n", + "None 5.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.66 0.8 \n", + "-2.66 0.8 \n", + "-2.82 0.67 \n", + "None 4.41 \n", + "-2.82 0.67 \n", + "-9.54 1.46 \n", + "-0.99 0.31 \n", + "10000000.0 10000000.0 \n", + "0.36 0.71 \n", + "0.36 0.71 \n", + "None 1.36 \n", + "None 1.63 \n", + "None 2.4 \n", + "None 1.36 \n", + "None 2.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.89 4.12 \n", + "None 4.37 \n", + "None 4.54 \n", + "10000000.0 10000000.0 \n", + "None 2.05 \n", + "None 4.37 \n", + "None 2.05 \n", + "None 2.05 \n", + "-3.33 0.3 \n", + "10000000.0 10000000.0 \n", + "-5.88 0.41 \n", + "-14.27 0.34 \n", + "-5.88 0.41 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "-14.27 0.34 \n", + "-3.99 0.33 \n", + "None 5.87 \n", + "None 1.99 \n", + "None 3.03 \n", + "-15.13 0.33 \n", + "0.74 0.35 \n", + "None 2.23 \n", + "None 0.69 \n", + "None 0.69 \n", + "4.73 0.71 \n", + "None 1.13 \n", + "-2.14 1.05 \n", + "-2.14 1.05 \n", + "-2.14 1.05 \n", + "None 1.13 \n", + "2.27 0.73 \n", + "-0.98 0.4 \n", + "None 1.48 \n", + "-90.63 6.54 \n", + "-0.98 0.4 \n", + "None 1.48 \n", + "0.53 0.21 \n", + "-90.63 6.54 \n", + "None 1.48 \n", + "2.27 0.73 \n", + "10000000.0 10000000.0 \n", + "-4.62 0.68 \n", + "0.08 0.43 \n", + "-8.93 1.02 \n", + "7.87 4.33 \n", + "7.87 4.33 \n", + "None 2.81 \n", + "10000000.0 10000000.0 \n", + "None 2.81 \n", + "10000000.0 10000000.0 \n", + "0.53 0.21 \n", + "-2.3 9.24 \n", + "7.87 4.33 \n", + "10000000.0 10000000.0 \n", + "-27.92 1.39 \n", + "10000000.0 10000000.0 \n", + "None 1.97 \n", + "-0.14 0.58 \n", + "2.04 0.27 \n", + "10000000.0 10000000.0 \n", + "-5.49 0.18 \n", + "9.12 1.25 \n", + "9.12 1.25 \n", + "4.89 0.24 \n", + "4.89 0.25 \n", + "4.89 0.25 \n", + "-8.47 0.57 \n", + "-9.54 1.46 \n", + "3.48 0.52 \n", + "None 5.26 \n", + "None 5.15 \n", + "3.48 0.52 \n", + "None 5.15 \n", + "-8.68 0.26 \n", + "10000000.0 10000000.0 \n", + "None 2.18 \n", + "3.54 0.43 \n", + "-26.84 1.03 \n", + "-11.74 0.56 \n", + "None 6.31 \n", + "None 10.27 \n", + "None 6.04 \n", + "10000000.0 10000000.0 \n", + "None 10.27 \n", + "-11.74 0.56 \n", + "None 6.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 5.47 \n", + "-5.85 0.61 \n", + "None 5.47 \n", + "-3.95 0.73 \n", + "-40.88 1.06 \n", + "3.54 0.43 \n", + "-40.88 1.06 \n", + "-1.89 0.66 \n", + "-1.98 0.41 \n", + "-0.98 0.4 \n", + "None 5.47 \n", + "None 3.66 \n", + "-40.88 1.06 \n", + "-2.63 1.54 \n", + "None 1.51 \n", + "-40.88 1.06 \n", + "-2.63 1.54 \n", + "4.98 5.01 \n", + "-2.04 0.72 \n", + "None 0.71 \n", + "-2.04 0.72 \n", + "None 6.97 \n", + "-5.49 0.18 \n", + "-0.68 0.53 \n", + "-5.49 0.18 \n", + "None 1.09 \n", + "-5.49 0.18 \n", + "None 5.5 \n", + "0.18 0.71 \n", + "-5.9 1.12 \n", + "0.18 0.71 \n", + "1.64 0.42 \n", + "None 5.5 \n", + "None 4.06 \n", + "-5.39 0.58 \n", + "-5.39 0.58 \n", + "1.64 0.42 \n", + "None 4.06 \n", + "-2.66 0.99 \n", + "-5.39 0.58 \n", + "None 5.22 \n", + "None 2.18 \n", + "None 5.22 \n", + "None 5.23 \n", + "-23.36 1.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.18 \n", + "24.01 3.68 \n", + "-3.37 0.34 \n", + "24.01 3.68 \n", + "None 5.47 \n", + "24.01 3.68 \n", + "10000000.0 10000000.0 \n", + "24.01 3.68 \n", + "-3.37 0.34 \n", + "None 1.6 \n", + "-3.37 0.34 \n", + "24.01 3.68 \n", + "-7.26 1.32 \n", + "None 1.6 \n", + "-7.26 1.32 \n", + "-128.56 0.76 \n", + "None 5.47 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "-3.78 0.52 \n", + "23.24 5.36 \n", + "-0.33 0.82 \n", + "10000000.0 10000000.0 \n", + "-1.88 0.46 \n", + "-7.0 1.54 \n", + "None 1.3 \n", + "-0.04 0.55 \n", + "-53.52 9.09 \n", + "None 0.71 \n", + "-22.54 1.11 \n", + "-10.46 0.64 \n", + "-53.52 9.09 \n", + "-0.04 0.55 \n", + "-22.54 1.11 \n", + "10.42 6.57 \n", + "None 8.77 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-80.98 0.81 \n", + "-29.23 7.46 \n", + "10000000.0 10000000.0 \n", + "-9.5 3.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-56.02 0.43 \n", + "-11.13 6.92 \n", + "-34.29 1.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.31 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.43 0.21 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 5.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 5.1 \n", + "29.11 5.93 \n", + "-2.79 0.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.74 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.19 0.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-110.14 1.17 \n", + "10000000.0 10000000.0 \n", + "-100.32 6.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "113.73 1.49 \n", + "10000000.0 10000000.0 \n", + "-8.44 0.72 \n", + "10000000.0 10000000.0 \n", + "-94.47 0.82 \n", + "10000000.0 10000000.0 \n", + "-94.13 0.75 \n", + "-1.36 1.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.84 0.3 \n", + "-21.33 1.4 \n", + "10000000.0 10000000.0 \n", + "-12.96 7.03 \n", + "-11.13 4.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.04 0.55 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.19 0.32 \n", + "-0.44 0.47 \n", + "10000000.0 10000000.0 \n", + "1.07 7.03 \n", + "-9.32 6.94 \n", + "-1.7 8.46 \n", + "10000000.0 10000000.0 \n", + "-94.65 0.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-71.84 0.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.04 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.88 0.56 \n", + "10000000.0 10000000.0 \n", + "-10.99 1.3 \n", + "-13.15 5.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.54 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "14.27 0.34 \n", + "-95.07 0.74 \n", + "10000000.0 10000000.0 \n", + "-18.99 2.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.23 0.93 \n", + "9.53 5.73 \n", + "-0.37 0.55 \n", + "10000000.0 10000000.0 \n", + "-3.86 0.49 \n", + "7.19 0.32 \n", + "10000000.0 10000000.0 \n", + "-0.49 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 6.46 \n", + "-5.72 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.25 7.46 \n", + "10000000.0 10000000.0 \n", + "-45.92 1.67 \n", + "-12.56 4.47 \n", + "None None \n", + "-10.06 0.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.13 4.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-36.72 3.92 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "2.54 9.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.16 1.97 \n", + "10000000.0 10000000.0 \n", + "-3.52 2.88 \n", + "-78.37 4.99 \n", + "10000000.0 10000000.0 \n", + "-27.49 5.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-40.05 2.16 \n", + "4.97 0.67 \n", + "None None \n", + "-6.9 4.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "476.46 4.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-27.66 1.31 \n", + "10000000.0 10000000.0 \n", + "-23.89 6.35 \n", + "-4.36 7.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.45 0.24 \n", + "10000000.0 10000000.0 \n", + "-8.68 0.26 \n", + "-3.09 0.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 13.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.78 1.11 \n", + "-10.33 0.52 \n", + "10000000.0 10000000.0 \n", + "-4.31 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.51 0.78 \n", + "10000000.0 10000000.0 \n", + "-4.44 0.24 \n", + "0.84 0.71 \n", + "10000000.0 10000000.0 \n", + "-26.84 4.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "122.79 0.95 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-53.5 6.81 \n", + "10000000.0 10000000.0 \n", + "-4.17 0.75 \n", + "-2.83 0.3 \n", + "-2.35 0.35 \n", + "None 17.98 \n", + "-2.66 5.33 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "101.72 0.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.04 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.13 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "55.69 0.97 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.94 0.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-105.96 0.91 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.9 0.51 \n", + "-2.77 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.77 1.28 \n", + "10000000.0 10000000.0 \n", + "18.07 0.92 \n", + "-37.55 2.49 \n", + "-124.97 5.26 \n", + "4.88 0.24 \n", + "10000000.0 10000000.0 \n", + "0.36 0.61 \n", + "-2.65 0.77 \n", + "-62.07 2.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-93.65 0.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.34 5.28 \n", + "-2.03 0.43 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.78 \n", + "-119.24 2.25 \n", + "8.37 0.76 \n", + "10000000.0 10000000.0 \n", + "-1.7 9.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.21 0.96 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-69.87 2.5 \n", + "10000000.0 10000000.0 \n", + "31.05 2.86 \n", + "10000000.0 10000000.0 \n", + "-14.2 6.36 \n", + "10000000.0 10000000.0 \n", + "-1.72 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "-4.31 0.75 \n", + "6.34 0.54 \n", + "0.85 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.22 0.41 \n", + "0.35 0.61 \n", + "10000000.0 10000000.0 \n", + "-0.09 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.48 0.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.0 10.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-71.78 7.48 \n", + "-1.19 0.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.02 4.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.82 0.44 \n", + "-13.16 1.07 \n", + "10000000.0 10000000.0 \n", + "-99.12 10.28 \n", + "10000000.0 10000000.0 \n", + "-105.99 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.63 0.61 \n", + "10000000.0 10000000.0 \n", + "-35.94 1.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.66 0.8 \n", + "1.11 6.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.13 0.61 \n", + "-0.83 0.49 \n", + "-8.68 0.26 \n", + "10000000.0 10000000.0 \n", + "2.27 0.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "18.23 5.67 \n", + "153.09 3.71 \n", + "10000000.0 10000000.0 \n", + "-577.19 7.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.26 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.43 0.14 \n", + "-105.96 0.91 \n", + "-0.17 0.72 \n", + "-10.74 2.38 \n", + "-4.36 7.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.94 7.97 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.23 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 5.04 \n", + "0.24 1.65 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-97.65 1.18 \n", + "-2.71 0.45 \n", + "17.79 3.47 \n", + "-35.94 1.01 \n", + "-2646.19 143.61 \n", + "10000000.0 10000000.0 \n", + "-10.49 0.61 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.91 6.64 \n", + "-10.17 5.83 \n", + "21.46 1.06 \n", + "10000000.0 10000000.0 \n", + "-3.53 6.12 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.86 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.86 2.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-105.9 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.65 2.02 \n", + "None 10.93 \n", + "10000000.0 10000000.0 \n", + "7.64 0.68 \n", + "-11.13 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "6.48 0.85 \n", + "-14.03 14.06 \n", + "None 2.77 \n", + "-14.03 7.87 \n", + "-94.61 6.55 \n", + "10000000.0 10000000.0 \n", + "-179.35 5.24 \n", + "4.46 0.24 \n", + "-14.03 9.97 \n", + "0.56 0.76 \n", + "6.36 6.33 \n", + "-5.13 0.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "285.64 0.21 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-84.62 1.22 \n", + "10000000.0 10000000.0 \n", + "-10.46 6.29 \n", + "-0.28 0.37 \n", + "-3.53 8.1 \n", + "-4.92 0.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-28.34 1.62 \n", + "0.18 0.36 \n", + "None 14.71 \n", + "10000000.0 10000000.0 \n", + "-95.83 7.31 \n", + "-122.06 13.02 \n", + "-20.64 5.17 \n", + "-18.46 0.78 \n", + "-14.03 5.33 \n", + "10000000.0 10000000.0 \n", + "420.84 4.02 \n", + "10000000.0 10000000.0 \n", + "-3.87 0.56 \n", + "-87.62 2.22 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-86.41 3.02 \n", + "10000000.0 10000000.0 \n", + "-2.13 0.64 \n", + "10000000.0 10000000.0 \n", + "-21.27 1.97 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.57 0.56 \n", + "3.71 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.44 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.66 0.8 \n", + "-35.35 1.1 \n", + "10000000.0 10000000.0 \n", + "-16.34 4.25 \n", + "-3.31 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.79 1.81 \n", + "10000000.0 10000000.0 \n", + "-118.19 0.76 \n", + "None 0.41 \n", + "3.76 6.39 \n", + "9.51 6.34 \n", + "6.14 0.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.03 0.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.02 2.19 \n", + "-9.23 0.14 \n", + "10000000.0 10000000.0 \n", + "-14.92 3.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 11.24 \n", + "344.32 0.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.51 0.79 \n", + "-6.53 4.97 \n", + "-1.7 13.32 \n", + "-4.41 4.05 \n", + "-0.37 0.64 \n", + "10000000.0 10000000.0 \n", + "14.27 0.34 \n", + "10000000.0 10000000.0 \n", + "-2.55 3.06 \n", + "10000000.0 10000000.0 \n", + "-118.4 1.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.84 5.3 \n", + "10000000.0 10000000.0 \n", + "-2.21 0.53 \n", + "-4.36 6.38 \n", + "10000000.0 10000000.0 \n", + "-108.34 1.21 \n", + "10000000.0 10000000.0 \n", + "-5.48 8.95 \n", + "10000000.0 10000000.0 \n", + "18.6 6.81 \n", + "-117.19 10.54 \n", + "10000000.0 10000000.0 \n", + "0.31 0.31 \n", + "10000000.0 10000000.0 \n", + "-118.57 1.24 \n", + "-0.46 4.16 \n", + "10000000.0 10000000.0 \n", + "-3.97 0.52 \n", + "-0.7 0.78 \n", + "1.83 0.5 \n", + "10000000.0 10000000.0 \n", + "-11.13 5.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "69.67 7.1 \n", + "-8.63 1.24 \n", + "2.06 0.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.59 \n", + "-4.12 0.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "155.37 23.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "67.76 0.85 \n", + "-3.88 0.56 \n", + "-3.53 6.42 \n", + "10000000.0 10000000.0 \n", + "0.3 0.93 \n", + "-14.34 0.94 \n", + "-94.65 0.89 \n", + "15.54 1.41 \n", + "-106.02 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.3 1.88 \n", + "10000000.0 10000000.0 \n", + "None 0.41 \n", + "10000000.0 10000000.0 \n", + "-1.8 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.88 4.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.92 0.63 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-28.37 31.93 \n", + "-32.05 1.14 \n", + "109.46 1.29 \n", + "-2.63 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-80.44 3.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 5.47 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "-95.07 0.74 \n", + "-1.7 9.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.88 1.4 \n", + "-4.49 0.54 \n", + "-1.01 1.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-58.07 2.15 \n", + "-10.01 0.3 \n", + "-5.02 0.56 \n", + "-11.71 5.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.35 4.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.76 6.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.65 8.38 \n", + "-2593.93 12.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.78 0.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.68 0.93 \n", + "-15.81 1.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "152.62 2.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.57 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.46 7.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-25.29 1.02 \n", + "-102.36 1.16 \n", + "-4.36 6.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.91 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.38 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.69 0.37 \n", + "-11.67 0.39 \n", + "-52.23 2.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.83 3.76 \n", + "-8.73 0.93 \n", + "0.17 1.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.35 0.3 \n", + "-7.36 1.14 \n", + "0.36 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "87.3 0.36 \n", + "-0.28 0.37 \n", + "0.18 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.86 0.8 \n", + "-1.76 0.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.89 2.15 \n", + "10000000.0 10000000.0 \n", + "-11.99 3.48 \n", + "0.53 0.84 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.47 \n", + "-120.45 4.3 \n", + "-51.7 2.63 \n", + "-20.0 1.66 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.32 0.67 \n", + "6.21 1.06 \n", + "-72.3 1.04 \n", + "-7.42 1.34 \n", + "-2.65 0.42 \n", + "-3.04 0.42 \n", + "10000000.0 10000000.0 \n", + "-18.74 0.66 \n", + "-6.35 7.16 \n", + "-0.46 5.77 \n", + "10000000.0 10000000.0 \n", + "-1.73 0.52 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.83 \n", + "3.22 2.4 \n", + "10000000.0 10000000.0 \n", + "-345.75 0.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-25.93 0.84 \n", + "-20.03 1.08 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.14 \n", + "-4.36 11.3 \n", + "12.13 11.83 \n", + "-4.36 8.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.35 4.13 \n", + "-0.46 1.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.4 0.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 20.25 \n", + "10000000.0 10000000.0 \n", + "-18.11 0.73 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "-6.4 0.52 \n", + "-0.9 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "13.02 4.56 \n", + "10000000.0 10000000.0 \n", + "6.36 6.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-34.59 5.89 \n", + "-76.35 3.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "13.27 0.43 \n", + "-3.88 0.56 \n", + "-1.35 0.38 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "35.76 0.45 \n", + "10000000.0 10000000.0 \n", + "-3.73 1.04 \n", + "-69.98 4.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.35 1.6 \n", + "-14.16 0.79 \n", + "-4.2 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "58.67 0.33 \n", + "10000000.0 10000000.0 \n", + "-11.13 4.81 \n", + "-80.05 49.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.04 0.42 \n", + "-5.21 1.06 \n", + "-67.05 1.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.76 8.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.09 0.53 \n", + "-94.86 3.98 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 9.92 \n", + "10000000.0 10000000.0 \n", + "4.52 1.9 \n", + "-5.72 1.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.98 0.7 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.88 0.56 \n", + "6.29 1.0 \n", + "-2.63 0.35 \n", + "-10.1 3.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-126.37 1.64 \n", + "-31.45 6.21 \n", + "10000000.0 10000000.0 \n", + "1.66 1.31 \n", + "-4.36 6.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 8.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.75 11.06 \n", + "10000000.0 10000000.0 \n", + "-6.95 1.13 \n", + "-0.63 0.26 \n", + "10000000.0 10000000.0 \n", + "-1.51 0.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "29.23 6.59 \n", + "0.9 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.9 0.51 \n", + "-3.11 6.84 \n", + "10000000.0 10000000.0 \n", + "-0.78 0.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-56.99 4.82 \n", + "10000000.0 10000000.0 \n", + "4.45 0.24 \n", + "10000000.0 10000000.0 \n", + "-1.52 0.54 \n", + "-13.65 1.45 \n", + "51.06 0.44 \n", + "7.96 1.42 \n", + "205.55 1.53 \n", + "64.19 0.97 \n", + "10000000.0 10000000.0 \n", + "83.17 1.1 \n", + "-34.51 1.02 \n", + "10000000.0 10000000.0 \n", + "14.64 3.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.01 0.98 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.68 0.99 \n", + "-5.07 0.71 \n", + "-50.9 0.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.98 0.65 \n", + "10000000.0 10000000.0 \n", + "-20.84 1.07 \n", + "10000000.0 10000000.0 \n", + "-13.45 5.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.5 1.25 \n", + "2.34 0.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "169.58 5.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 2.25 \n", + "None 1.98 \n", + "None 0.84 \n", + "None 0.83 \n", + "None 0.82 \n", + "None 1.09 \n", + "None 0.76 \n", + "None 0.69 \n", + "None 0.86 \n", + "None 0.66 \n", + "None 0.66 \n", + "None 0.4 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 4.27 \n", + "None 4.54 \n", + "None 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "-6.16 0.07 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "None 2.23 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "-6.16 0.07 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "208.81 0.14 \n", + "None 0.55 \n", + "None 0.38 \n", + "None 1.2 \n", + "None 0.47 \n", + "None 1.07 \n", + "None 2.28 \n", + "None 2.28 \n", + "None 0.51 \n", + "None 5.2 \n", + "None 1.99 \n", + "None 0.76 \n", + "None 2.19 \n", + "None 2.19 \n", + "None 1.94 \n", + "None 1.94 \n", + "None 0.81 \n", + "10000000.0 10000000.0 \n", + "None 0.49 \n", + "None 1.0 \n", + "None 0.72 \n", + "None 0.72 \n", + "None 3.87 \n", + "None 6.08 \n", + "None 5.8 \n", + "None 5.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 5.09 \n", + "None 5.09 \n", + "None 6.03 \n", + "None 6.03 \n", + "None 5.74 \n", + "None 5.74 \n", + "None 5.0 \n", + "None 5.0 \n", + "None 5.03 \n", + "None 5.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.3 \n", + "None 0.41 \n", + "0.4 0.31 \n", + "None 4.99 \n", + "None 4.99 \n", + "None 4.99 \n", + "-0.85 0.3 \n", + "1.82 0.08 \n", + "-10.58 0.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.03 0.11 \n", + "10000000.0 10000000.0 \n", + "-9.57 0.15 \n", + "None 6.08 \n", + "None 6.08 \n", + "None 6.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 4.88 \n", + "-8.6 0.11 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 1.98 \n", + "-7.42 1.34 \n", + "-6.42 1.8 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 2.25 \n", + "-0.95 0.32 \n", + "1.45 0.48 \n", + "228.78 1.28 \n", + "None 0.38 \n", + "-2.46 0.78 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.71 \n", + "-21.19 1.04 \n", + "-4.01 0.11 \n", + "7.82 0.41 \n", + "10000000.0 10000000.0 \n", + "5.68 0.5 \n", + "10000000.0 10000000.0 \n", + "6.43 0.11 \n", + "6.43 0.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.1 0.51 \n", + "-8.1 0.51 \n", + "7.09 0.07 \n", + "1.3 0.22 \n", + "None 6.04 \n", + "-3.9 1.06 \n", + "-0.32 0.43 \n", + "-0.32 0.43 \n", + "-2.01 0.36 \n", + "None 0.83 \n", + "-4.64 0.37 \n", + "-4.94 0.36 \n", + "1.4 0.34 \n", + "-7.41 0.5 \n", + "None 0.71 \n", + "-3.38 0.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.87 \n", + "1.04 0.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "11.27 0.87 \n", + "None 1.09 \n", + "-0.35 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.27 \n", + "None 0.68 \n", + "0.4 0.31 \n", + "2.26 0.15 \n", + "3.41 0.13 \n", + "10.54 0.21 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.17 0.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-112.28 0.77 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.4 \n", + "None 0.69 \n", + "None 0.69 \n", + "None 0.68 \n", + "None 0.49 \n", + "None 0.49 \n", + "None 4.41 \n", + "None 6.98 \n", + "None 0.74 \n", + "None 0.41 \n", + "None 5.2 \n", + "10000000.0 10000000.0 \n", + "None 0.48 \n", + "None 2.72 \n", + "None 2.73 \n", + "None 0.99 \n", + "None 0.79 \n", + "None 1.85 \n", + "10000000.0 10000000.0 \n", + "None 1.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "-6.16 0.07 \n", + "None 2.16 \n", + "None 2.25 \n", + "None 2.18 \n", + "None 0.86 \n", + "None 0.73 \n", + "10000000.0 10000000.0 \n", + "None 0.54 \n", + "None 0.54 \n", + "None 0.62 \n", + "10000000.0 10000000.0 \n", + "None 0.34 \n", + "None 1.0 \n", + "None 1.6 \n", + "None 0.64 \n", + "None 0.82 \n", + "None 0.64 \n", + "10000000.0 10000000.0 \n", + "None 2.18 \n", + "None 4.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 6.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 5.53 \n", + "None 5.02 \n", + "None 1.87 \n", + "None 0.75 \n", + "None 4.07 \n", + "10000000.0 10000000.0 \n", + "None 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.58 \n", + "None 2.23 \n", + "-6.81 4.41 \n", + "None 1.27 \n", + "None 5.15 \n", + "None 5.16 \n", + "None 2.67 \n", + "None 2.66 \n", + "None 0.62 \n", + "10000000.0 10000000.0 \n", + "None 4.19 \n", + "None 3.93 \n", + "None 7.96 \n", + "-5.56 0.33 \n", + "-11.89 4.12 \n", + "None 2.49 \n", + "None 2.21 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 5.35 \n", + "10000000.0 10000000.0 \n", + "None 3.79 \n", + "None 0.3 \n", + "None 6.98 \n", + "None 0.83 \n", + "None 0.48 \n", + "None 4.88 \n", + "-6.16 0.07 \n", + "None 0.71 \n", + "None 6.04 \n", + "None 4.54 \n", + "None 0.35 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "None 0.41 \n", + "None 0.34 \n", + "None 4.41 \n", + "None 1.22 \n", + "None 4.44 \n", + "None 5.2 \n", + "None None \n", + "None 2.4 \n", + "None 0.69 \n", + "None 0.41 \n", + "None 0.49 \n", + "None 4.19 \n", + "None 6.98 \n", + "None 0.74 \n", + "None 4.3 \n", + "None 0.89 \n", + "None 0.87 \n", + "None 0.41 \n", + "10000000.0 10000000.0 \n", + "None 0.41 \n", + "None 2.79 \n", + "None 2.69 \n", + "None 5.2 \n", + "None 6.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 5.97 \n", + "None 3.69 \n", + "None 5.38 \n", + "None 2.04 \n", + "None 3.55 \n", + "None 0.86 \n", + "None 0.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 3.87 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 1.0 \n", + "None 0.64 \n", + "None 0.64 \n", + "None 0.81 \n", + "None 4.41 \n", + "None 1.16 \n", + "None 4.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 0.73 \n", + "None 0.86 \n", + "None 0.84 \n", + "None 2.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.2 \n", + "None 0.25 \n", + "None 5.02 \n", + "10000000.0 10000000.0 \n", + "None 1.33 \n", + "None 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.64 \n", + "None 1.64 \n", + "None 4.27 \n", + "10000000.0 10000000.0 \n", + "-6.81 4.41 \n", + "None 2.67 \n", + "None 4.58 \n", + "10000000.0 10000000.0 \n", + "None 0.69 \n", + "None 4.4 \n", + "None 3.87 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.71 \n", + "-6.16 0.07 \n", + "None 2.67 \n", + "10000000.0 10000000.0 \n", + "-22.32 1.03 \n", + "-4.01 0.86 \n", + "1.17 0.61 \n", + "-6.8 0.45 \n", + "-2.34 0.39 \n", + "-2.34 0.39 \n", + "0.95 0.63 \n", + "-4.38 1.17 \n", + "-4.38 1.17 \n", + "10.46 5.37 \n", + "10000000.0 10000000.0 \n", + "-22.58 1.25 \n", + "-20.79 1.5 \n", + "-13.78 1.7 \n", + "-191.87 1.79 \n", + "109.79 0.86 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.91 1.48 \n", + "-0.91 2.03 \n", + "10000000.0 10000000.0 \n", + "-20.64 5.86 \n", + "10000000.0 10000000.0 \n", + "-4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.04 0.46 \n", + "-1.93 0.69 \n", + "-0.91 0.41 \n", + "-4.19 0.3 \n", + "2.6 0.18 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "-99.87 10.18 \n", + "-96.19 10.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.0 1.13 \n", + "-14.01 1.14 \n", + "8.74 1.8 \n", + "4.0 1.13 \n", + "10000000.0 10000000.0 \n", + "0.83 1.04 \n", + "-103.25 7.96 \n", + "10000000.0 10000000.0 \n", + "-24.02 7.85 \n", + "-105.9 7.87 \n", + "-0.31 0.8 \n", + "-202.22 2.74 \n", + "-0.3 0.8 \n", + "-11.93 1.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.25 0.71 \n", + "-0.18 0.36 \n", + "-0.18 0.36 \n", + "-0.18 0.36 \n", + "-0.18 0.36 \n", + "-0.18 0.36 \n", + "-4.96 0.36 \n", + "-4.44 0.24 \n", + "-4.44 0.24 \n", + "-4.44 0.24 \n", + "-4.44 0.24 \n", + "-4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "-7.31 0.92 \n", + "-3.8 0.45 \n", + "-0.21 0.17 \n", + "-8.78 0.6 \n", + "-0.46 0.4 \n", + "3.18 0.39 \n", + "-3.57 0.59 \n", + "-1.3 0.32 \n", + "-39.05 1.1 \n", + "-2.16 0.66 \n", + "-0.83 0.5 \n", + "-3.82 0.6 \n", + "-3.82 0.6 \n", + "-0.13 0.67 \n", + "-3.11 5.68 \n", + "-2.38 0.49 \n", + "-2.66 0.99 \n", + "-1.16 1.02 \n", + "-3.11 7.46 \n", + "-5.31 0.66 \n", + "-1.55 0.49 \n", + "-5.69 0.85 \n", + "-2.82 0.21 \n", + "-3.7 0.21 \n", + "-3.7 0.21 \n", + "8.71 0.07 \n", + "-3.34 0.2 \n", + "-3.34 0.2 \n", + "8.71 0.07 \n", + "8.72 0.09 \n", + "6.67 0.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.17 0.34 \n", + "1.6 0.39 \n", + "-3.14 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.81 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.68 0.31 \n", + "10000000.0 10000000.0 \n", + "-0.68 0.31 \n", + "-14.55 1.34 \n", + "-2.13 0.3 \n", + "-122.46 0.81 \n", + "-18.13 0.71 \n", + "-122.46 0.81 \n", + "-18.13 0.71 \n", + "-6.69 0.71 \n", + "10000000.0 10000000.0 \n", + "-3.17 0.32 \n", + "-6.26 2.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.09 0.14 \n", + "-3.51 1.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.26 0.15 \n", + "2.26 0.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.35 0.3 \n", + "10000000.0 10000000.0 \n", + "-5.49 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-24.58 0.97 \n", + "-2.28 0.32 \n", + "2.25 0.46 \n", + "2.25 0.46 \n", + "-20.31 2.54 \n", + "-3.01 2.69 \n", + "-10.53 1.07 \n", + "1.42 0.71 \n", + "1.42 0.71 \n", + "8.16 0.68 \n", + "8.16 0.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "12.98 0.65 \n", + "13.69 0.86 \n", + "-3.42 0.47 \n", + "2.56 0.46 \n", + "-8.05 0.6 \n", + "-8.05 0.6 \n", + "4.48 0.8 \n", + "4.48 0.8 \n", + "-10.46 4.97 \n", + "1.2 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.72 1.45 \n", + "4.72 1.45 \n", + "-0.94 0.18 \n", + "10000000.0 10000000.0 \n", + "-4.29 0.8 \n", + "-7.54 0.79 \n", + "4.94 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "1.04 0.4 \n", + "-3.12 0.38 \n", + "-3.12 0.38 \n", + "10000000.0 10000000.0 \n", + "-0.8 0.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.76 8.25 \n", + "-7.06 7.4 \n", + "-7.06 7.4 \n", + "-7.06 7.35 \n", + "-7.06 7.35 \n", + "-7.06 7.31 \n", + "-7.06 7.31 \n", + "3.76 8.2 \n", + "3.76 8.16 \n", + "10000000.0 10000000.0 \n", + "-2.11 0.94 \n", + "-2.28 0.75 \n", + "10000000.0 10000000.0 \n", + "-5.17 0.34 \n", + "-5.17 0.34 \n", + "-5.17 0.34 \n", + "-5.17 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.48 0.24 \n", + "-6.46 0.32 \n", + "-6.46 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-50.5 3.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.26 1.28 \n", + "-105.97 0.91 \n", + "-2.23 0.46 \n", + "-2.23 0.46 \n", + "10000000.0 10000000.0 \n", + "-2.3 11.51 \n", + "9.59 6.0 \n", + "-3.83 0.39 \n", + "-1.7 10.62 \n", + "-3.83 0.39 \n", + "-3.83 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.24 0.82 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.26 0.6 \n", + "-0.22 0.59 \n", + "10000000.0 10000000.0 \n", + "0.26 0.6 \n", + "-0.22 0.59 \n", + "12.39 0.75 \n", + "-5.31 0.66 \n", + "-5.31 0.66 \n", + "-5.31 0.66 \n", + "-5.31 0.66 \n", + "-5.31 0.66 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-39.48 5.64 \n", + "7.34 2.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.89 0.73 \n", + "2.53 0.68 \n", + "10000000.0 10000000.0 \n", + "-9.33 0.11 \n", + "10000000.0 10000000.0 \n", + "-50.13 0.35 \n", + "-8.16 0.15 \n", + "-4.77 0.97 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "-12.57 1.08 \n", + "-12.57 1.08 \n", + "-13.19 1.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-105.99 0.91 \n", + "10000000.0 10000000.0 \n", + "-5.97 0.42 \n", + "-1.7 5.59 \n", + "-5.97 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.77 0.68 \n", + "-125.33 12.65 \n", + "-105.97 0.91 \n", + "-120.41 3.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 7.33 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.3 2.73 \n", + "-17.3 2.73 \n", + "4.14 0.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.54 1.46 \n", + "-9.54 1.46 \n", + "0.52 0.47 \n", + "-8.91 0.78 \n", + "-8.91 0.78 \n", + "10000000.0 10000000.0 \n", + "2.54 0.75 \n", + "1.48 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-105.98 0.91 \n", + "-18.44 0.78 \n", + "-18.44 0.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.42 1.26 \n", + "-18.42 0.78 \n", + "-20.64 6.07 \n", + "-97.47 2.09 \n", + "-2.78 0.75 \n", + "-6.6 2.23 \n", + "-105.97 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.04 0.98 \n", + "-4.89 0.24 \n", + "-4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.89 0.24 \n", + "-4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-83.95 6.39 \n", + "-15.4 3.68 \n", + "-18.47 0.78 \n", + "-18.46 0.78 \n", + "-18.42 0.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-177.08 1.65 \n", + "-177.08 1.65 \n", + "10000000.0 10000000.0 \n", + "-0.57 0.71 \n", + "-6.73 1.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-120.41 3.57 \n", + "-1.52 0.54 \n", + "11.76 1.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "-16.89 8.21 \n", + "6.69 0.98 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "76.24 1.49 \n", + "-69.98 2.15 \n", + "-69.98 2.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.77 0.68 \n", + "10000000.0 10000000.0 \n", + "6.91 0.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "23.32 0.86 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-90.63 3.53 \n", + "-90.63 3.53 \n", + "1.18 0.45 \n", + "7.89 0.44 \n", + "165.52 1.53 \n", + "-41.34 0.33 \n", + "-38.48 1.54 \n", + "7.91 0.61 \n", + "-49.24 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "59.52 9.09 \n", + "-65.88 2.34 \n", + "40.35 2.36 \n", + "-19.7 0.39 \n", + "-49.21 0.53 \n", + "23.11 0.94 \n", + "23.28 0.94 \n", + "23.67 0.94 \n", + "23.68 0.94 \n", + "-49.19 0.53 \n", + "23.03 0.94 \n", + "-49.26 0.53 \n", + "23.73 0.94 \n", + "-49.25 0.53 \n", + "-20.12 0.84 \n", + "-25.75 0.84 \n", + "-49.2 0.53 \n", + "-19.71 0.39 \n", + "-49.15 0.53 \n", + "-49.23 0.53 \n", + "-19.68 0.39 \n", + "0.42 0.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-49.22 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-49.24 0.53 \n", + "59.4 1.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-20.07 0.84 \n", + "-20.12 0.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.39 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 7.34 \n", + "10000000.0 10000000.0 \n", + "102.76 0.75 \n", + "10000000.0 10000000.0 \n", + "-63.79 2.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-64.39 0.35 \n", + "None 2.19 \n", + "10000000.0 10000000.0 \n", + "2.22 0.33 \n", + "10000000.0 10000000.0 \n", + "0.31 0.31 \n", + "0.31 0.31 \n", + "0.31 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.49 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 5.74 \n", + "None 5.74 \n", + "None 5.74 \n", + "None 2.18 \n", + "None 2.18 \n", + "None 4.27 \n", + "None 1.92 \n", + "None 7.58 \n", + "None 6.01 \n", + "None 2.31 \n", + "None 3.8 \n", + "10000000.0 10000000.0 \n", + "None 8.13 \n", + "None 7.58 \n", + "None 1.4 \n", + "None 1.94 \n", + "None 0.91 \n", + "None 2.18 \n", + "None 2.18 \n", + "None 4.27 \n", + "None 4.27 \n", + "None 8.53 \n", + "None 6.41 \n", + "None 1.4 \n", + "None 4.27 \n", + "None 2.28 \n", + "None 2.31 \n", + "None 7.58 \n", + "None 3.92 \n", + "None 4.27 \n", + "None 1.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 6.84 \n", + "None 6.84 \n", + "10000000.0 10000000.0 \n", + "None 3.89 \n", + "10000000.0 10000000.0 \n", + "None 1.88 \n", + "10000000.0 10000000.0 \n", + "None 0.74 \n", + "None 0.71 \n", + "None 0.38 \n", + "0.36 0.56 \n", + "None 3.89 \n", + "10000000.0 10000000.0 \n", + "4.59 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "26.77 3.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.33 7.71 \n", + "None 1.63 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.24 0.54 \n", + "-0.24 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.43 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.94 0.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.61 7.11 \n", + "-8.61 7.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.45 0.95 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-24.6 1.18 \n", + "-1.98 0.61 \n", + "-1.98 0.61 \n", + "-20.13 8.43 \n", + "-194.4 1.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.73 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-22.65 0.55 \n", + "-19.86 10.94 \n", + "-21.19 0.96 \n", + "10000000.0 10000000.0 \n", + "-15.54 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-27.0 1.87 \n", + "-72.76 0.79 \n", + "10000000.0 10000000.0 \n", + "-21.65 7.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.68 0.26 \n", + "11.76 1.89 \n", + "-41.57 1.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-28.4 1.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-116.98 1.09 \n", + "10000000.0 10000000.0 \n", + "-5.5 0.33 \n", + "-0.44 0.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.96 0.32 \n", + "-5.96 0.32 \n", + "-5.96 0.32 \n", + "-5.96 0.32 \n", + "-122.3 13.03 \n", + "9.68 3.81 \n", + "9.68 3.1 \n", + "9.68 3.33 \n", + "9.68 2.87 \n", + "9.68 4.05 \n", + "9.68 3.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.88 0.69 \n", + "8.66 0.99 \n", + "4.44 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.22 0.59 \n", + "-0.22 0.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.61 4.92 \n", + "-15.5 1.25 \n", + "-4.62 0.68 \n", + "-2.67 0.69 \n", + "10000000.0 10000000.0 \n", + "0.94 0.19 \n", + "-1.03 0.42 \n", + "-1.03 0.42 \n", + "10000000.0 10000000.0 \n", + "-10.46 4.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.49 0.32 \n", + "10000000.0 10000000.0 \n", + "-1.62 0.41 \n", + "-11.16 0.62 \n", + "-3.94 0.48 \n", + "-17.2 1.16 \n", + "-10.01 0.3 \n", + "10000000.0 10000000.0 \n", + "-29.41 1.7 \n", + "-29.41 1.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.53 0.62 \n", + "10000000.0 10000000.0 \n", + "-19.84 1.97 \n", + "-19.84 1.97 \n", + "4.23 0.41 \n", + "-3.94 0.49 \n", + "10000000.0 10000000.0 \n", + "-4.3 0.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.42 0.46 \n", + "-86.57 10.11 \n", + "-86.57 10.11 \n", + "10000000.0 10000000.0 \n", + "-1.22 0.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.55 0.74 \n", + "59.08 0.45 \n", + "-1.55 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.12 0.75 \n", + "-1.7 8.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.6 6.44 \n", + "10000000.0 10000000.0 \n", + "-72.91 1.69 \n", + "2.62 0.35 \n", + "-6.0 0.82 \n", + "10000000.0 10000000.0 \n", + "-2.14 1.9 \n", + "3.52 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.7 0.53 \n", + "-5.96 0.86 \n", + "10000000.0 10000000.0 \n", + "2.06 1.38 \n", + "-7.96 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.4 0.63 \n", + "-105.96 0.91 \n", + "7.09 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.09 0.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-24.63 1.02 \n", + "-8.1 0.51 \n", + "-2.63 0.42 \n", + "-3.11 7.71 \n", + "None None \n", + "2.86 0.44 \n", + "-102.45 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.59 0.43 \n", + "3.27 0.43 \n", + "3.27 0.42 \n", + "10000000.0 10000000.0 \n", + "-3.75 0.34 \n", + "-3.75 0.34 \n", + "4.44 0.24 \n", + "3.54 0.43 \n", + "-0.45 0.11 \n", + "3.32 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "12.58 1.96 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-23.7 1.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.95 1.48 \n", + "-6.98 0.69 \n", + "-1.52 0.35 \n", + "-1.52 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.81 0.5 \n", + "10000000.0 10000000.0 \n", + "-3.28 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.38 0.6 \n", + "-37.17 1.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "11.27 1.39 \n", + "11.27 1.39 \n", + "10000000.0 10000000.0 \n", + "-14.37 1.78 \n", + "-0.61 0.4 \n", + "-94.56 1.94 \n", + "-12.59 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.14 0.6 \n", + "-8.39 0.32 \n", + "10000000.0 10000000.0 \n", + "-13.95 0.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.21 1.39 \n", + "10000000.0 10000000.0 \n", + "-14.28 2.42 \n", + "-4.07 0.85 \n", + "-4.07 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-31.87 1.48 \n", + "10000000.0 10000000.0 \n", + "-11.55 1.46 \n", + "-8.85 0.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.79 0.73 \n", + "-2.79 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.98 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.98 5.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.68 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-105.96 0.91 \n", + "-9.47 1.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.44 0.24 \n", + "4.19 0.29 \n", + "-4.44 0.24 \n", + "-4.44 0.24 \n", + "4.44 0.24 \n", + "-4.44 0.24 \n", + "4.96 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-32.71 2.06 \n", + "-8.06 0.84 \n", + "10000000.0 10000000.0 \n", + "-6.69 0.71 \n", + "10000000.0 10000000.0 \n", + "-5.45 1.01 \n", + "-1.37 1.09 \n", + "6.56 0.6 \n", + "-3.79 0.74 \n", + "-3.79 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.8 1.53 \n", + "-5.8 1.53 \n", + "-4.82 0.75 \n", + "10000000.0 10000000.0 \n", + "-6.07 2.37 \n", + "10000000.0 10000000.0 \n", + "7.47 0.19 \n", + "6.53 0.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.06 0.39 \n", + "8.09 0.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.58 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.45 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.22 1.32 \n", + "10000000.0 10000000.0 \n", + "-91.65 4.65 \n", + "-2.78 0.75 \n", + "-0.24 0.5 \n", + "2.26 0.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.42 0.11 \n", + "10000000.0 10000000.0 \n", + "0.34 0.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 4.99 \n", + "10000000.0 10000000.0 \n", + "-14.03 4.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 4.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.35 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.95 0.55 \n", + "10000000.0 10000000.0 \n", + "-2.14 4.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.57 0.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-20.16 1.48 \n", + "-20.16 1.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.82 2.03 \n", + "-5.96 0.71 \n", + "-2.27 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.18 0.48 \n", + "10000000.0 10000000.0 \n", + "-0.75 1.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 7.4 \n", + "-3.42 0.47 \n", + "2.65 0.09 \n", + "2.56 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-22.19 1.11 \n", + "-22.19 1.11 \n", + "10000000.0 10000000.0 \n", + "-2.82 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-46.89 5.54 \n", + "-46.89 5.54 \n", + "-74.83 1.75 \n", + "10000000.0 10000000.0 \n", + "-2.27 1.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.26 0.12 \n", + "-8.47 0.78 \n", + "10000000.0 10000000.0 \n", + "-100.17 3.73 \n", + "-3.11 4.62 \n", + "10000000.0 10000000.0 \n", + "-51.41 1.01 \n", + "-68.61 1.43 \n", + "5.34 1.04 \n", + "-0.38 0.45 \n", + "-1.34 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.03 1.11 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "-1.84 1.67 \n", + "-2.62 0.35 \n", + "-0.99 0.31 \n", + "0.18 0.36 \n", + "0.18 0.36 \n", + "4.44 0.24 \n", + "-96.45 0.96 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.08 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-63.69 1.63 \n", + "-14.47 0.33 \n", + "-105.96 0.91 \n", + "-29.3 6.24 \n", + "10000000.0 10000000.0 \n", + "-94.12 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.73 1.66 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-83.05 1.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-83.02 1.05 \n", + "-89.97 1.16 \n", + "10000000.0 10000000.0 \n", + "39.58 3.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.0 7.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "-97.25 10.69 \n", + "9.43 6.26 \n", + "-2.62 0.35 \n", + "-83.06 1.82 \n", + "3.21 1.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-77.71 8.0 \n", + "6.29 4.45 \n", + "-10.96 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-32.86 4.45 \n", + "10000000.0 10000000.0 \n", + "2.58 0.41 \n", + "10000000.0 10000000.0 \n", + "1.85 0.74 \n", + "0.67 0.41 \n", + "10000000.0 10000000.0 \n", + "-2.12 0.7 \n", + "-3.12 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.67 0.27 \n", + "3.95 0.44 \n", + "10000000.0 10000000.0 \n", + "-4.61 0.47 \n", + "6.24 0.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.18 4.84 \n", + "-19.18 4.84 \n", + "-5.86 0.43 \n", + "-6.58 0.38 \n", + "-14.5 0.44 \n", + "-13.94 1.55 \n", + "50.44 0.56 \n", + "-3.33 0.3 \n", + "-8.13 0.6 \n", + "15.7 1.63 \n", + "14.17 4.74 \n", + "-5.44 0.46 \n", + "-5.44 0.46 \n", + "10.96 1.85 \n", + "10.96 1.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-36.76 10.77 \n", + "10000000.0 10000000.0 \n", + "-14.03 9.25 \n", + "-15.54 1.5 \n", + "-11.35 1.54 \n", + "7.22 5.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.18 0.41 \n", + "0.18 0.41 \n", + "3.23 0.51 \n", + "-0.48 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.13 4.11 \n", + "10000000.0 10000000.0 \n", + "-11.76 0.83 \n", + "-2.76 0.85 \n", + "0.54 0.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-108.62 1.19 \n", + "-1.01 0.39 \n", + "7.19 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-69.88 6.46 \n", + "-69.88 6.46 \n", + "-69.88 6.47 \n", + "-13.0 6.55 \n", + "-13.0 6.55 \n", + "-13.0 6.57 \n", + "-93.88 2.47 \n", + "-93.88 2.53 \n", + "-1.4 2.11 \n", + "10000000.0 10000000.0 \n", + "-25.72 2.72 \n", + "10000000.0 10000000.0 \n", + "12.32 2.3 \n", + "-2.31 2.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.2 1.15 \n", + "10000000.0 10000000.0 \n", + "-105.93 0.91 \n", + "-106.02 0.91 \n", + "-105.97 0.91 \n", + "-14.03 6.74 \n", + "-14.03 6.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 5.85 \n", + "-9.67 1.21 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 6.0 \n", + "None None \n", + "-4.59 1.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.16 1.11 \n", + "-3.78 0.75 \n", + "-72.91 1.69 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.78 6.38 \n", + "10000000.0 10000000.0 \n", + "-72.03 2.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.08 0.57 \n", + "-8.71 0.93 \n", + "-9.88 0.39 \n", + "-21.02 1.08 \n", + "-12.98 1.2 \n", + "-2.65 1.91 \n", + "-8.73 0.93 \n", + "-8.73 0.93 \n", + "-26.84 4.6 \n", + "-26.84 4.61 \n", + "-10.89 1.06 \n", + "-9.24 0.43 \n", + "-7.15 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-90.71 0.91 \n", + "-8.58 1.02 \n", + "10000000.0 10000000.0 \n", + "-26.84 4.68 \n", + "0.13 0.25 \n", + "-14.03 4.6 \n", + "-0.81 0.22 \n", + "-14.03 4.59 \n", + "None None \n", + "-8.73 0.93 \n", + "-8.73 0.93 \n", + "-10.89 1.06 \n", + "-26.84 4.6 \n", + "-26.84 4.61 \n", + "-21.42 1.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.79 1.32 \n", + "-19.79 1.32 \n", + "-20.14 1.5 \n", + "-20.14 1.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-56.32 1.13 \n", + "-50.05 1.65 \n", + "10000000.0 10000000.0 \n", + "-69.42 6.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.4 1.03 \n", + "-12.69 1.03 \n", + "-0.43 0.61 \n", + "-0.64 0.61 \n", + "-93.67 1.62 \n", + "-37.19 0.32 \n", + "-37.02 0.32 \n", + "67.92 3.36 \n", + "67.63 3.36 \n", + "-14.03 9.16 \n", + "-14.03 7.69 \n", + "-12.59 1.03 \n", + "-12.59 1.03 \n", + "-0.29 0.61 \n", + "-0.29 0.61 \n", + "-0.29 0.61 \n", + "-0.29 0.61 \n", + "-13.04 1.03 \n", + "-13.04 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.41 0.92 \n", + "39.81 1.3 \n", + "-109.38 0.78 \n", + "-109.38 0.78 \n", + "-109.38 0.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.04 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.8 0.39 \n", + "-2.94 0.36 \n", + "-77.12 4.13 \n", + "-117.73 4.26 \n", + "-3.53 8.64 \n", + "-20.64 5.86 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.23 \n", + "-36.09 14.09 \n", + "-4.36 5.66 \n", + "-13.11 5.07 \n", + "23.24 5.36 \n", + "-1.58 1.0 \n", + "2.59 0.66 \n", + "-0.65 0.64 \n", + "-37.11 3.95 \n", + "15907.72 55.05 \n", + "1.24 0.54 \n", + "495.65 3.01 \n", + "506.15 3.18 \n", + "9.53 9.27 \n", + "-6.02 0.56 \n", + "-5.76 0.35 \n", + "-8.52 5.62 \n", + "2.46 0.53 \n", + "2.08 0.38 \n", + "10000000.0 10000000.0 \n", + "-18.13 0.71 \n", + "10000000.0 10000000.0 \n", + "-18.13 0.71 \n", + "11.76 1.89 \n", + "-18.46 0.78 \n", + "-18.46 0.78 \n", + "-18.75 0.66 \n", + "-8.56 1.05 \n", + "-2.25 0.46 \n", + "-2.08 0.46 \n", + "-0.99 0.34 \n", + "-3.33 0.3 \n", + "-20.06 0.5 \n", + "-14.03 11.13 \n", + "10000000.0 10000000.0 \n", + "2.68 1.63 \n", + "-5.81 0.35 \n", + "-5.82 0.35 \n", + "-5.81 0.35 \n", + "10000000.0 10000000.0 \n", + "-2.99 0.44 \n", + "-2.03 0.44 \n", + "10000000.0 10000000.0 \n", + "-6.32 1.33 \n", + "-17.69 2.07 \n", + "-13.17 1.32 \n", + "-15.16 0.76 \n", + "10000000.0 10000000.0 \n", + "-4.16 0.75 \n", + "-24.59 2.75 \n", + "-15.71 5.06 \n", + "-2.3 0.82 \n", + "-11.91 3.26 \n", + "-6.17 0.81 \n", + "-0.04 0.68 \n", + "14.4 14.8 \n", + "7.2 10.23 \n", + "-119.15 13.26 \n", + "-126.74 13.24 \n", + "-14.37 1.78 \n", + "-109.81 1.17 \n", + "-34.31 5.74 \n", + "-41.18 5.17 \n", + "-62.45 0.98 \n", + "-3.83 0.39 \n", + "-41.18 5.25 \n", + "-1.7 6.33 \n", + "-1.7 7.87 \n", + "-72.98 1.54 \n", + "2.54 7.77 \n", + "2.33 0.52 \n", + "10000000.0 10000000.0 \n", + "-6.33 7.25 \n", + "-6.33 7.24 \n", + "10000000.0 10000000.0 \n", + "-78.49 1.57 \n", + "-124.66 1.52 \n", + "-121.17 0.81 \n", + "-62.41 2.27 \n", + "-122.57 1.2 \n", + "-121.16 3.16 \n", + "-119.58 3.23 \n", + "-105.97 0.91 \n", + "-95.83 6.8 \n", + "-95.83 6.85 \n", + "10000000.0 10000000.0 \n", + "-3.53 5.81 \n", + "-10.0 0.3 \n", + "-0.17 None \n", + "-3.24 0.3 \n", + "-3.41 0.3 \n", + "2.51 0.5 \n", + "-10.46 0.64 \n", + "-25.26 1.1 \n", + "-89.24 1.05 \n", + "1.15 0.36 \n", + "-115.68 1.75 \n", + "-13.69 1.44 \n", + "7.71 1.43 \n", + "-3.65 0.75 \n", + "14.53 0.59 \n", + "-7.12 2.59 \n", + "14.53 0.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.07 0.66 \n", + "-4.94 0.57 \n", + "-22.29 1.11 \n", + "-2.62 0.35 \n", + "-8.61 0.26 \n", + "-8.61 0.27 \n", + "-3.46 0.76 \n", + "-10.05 1.03 \n", + "-97.2 0.8 \n", + "-102.48 1.26 \n", + "-81.93 6.64 \n", + "-49.26 0.53 \n", + "23.32 0.94 \n", + "-3.87 0.56 \n", + "-0.04 0.55 \n", + "4.21 0.8 \n", + "-49.27 0.53 \n", + "-9.38 0.5 \n", + "-9.38 0.5 \n", + "-72.12 1.24 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.81 4.41 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.81 5.26 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "None 2.18 \n", + "None 2.73 \n", + "None 2.69 \n", + "None 2.5 \n", + "None 3.56 \n", + "None 3.78 \n", + "None 3.55 \n", + "None 3.89 \n", + "None 2.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.48 \n", + "None 0.34 \n", + "-6.16 0.07 \n", + "None 0.83 \n", + "10000000.0 10000000.0 \n", + "None 2.23 \n", + "-6.16 0.07 \n", + "None 4.07 \n", + "None 3.08 \n", + "-10.54 0.15 \n", + "10.92 0.92 \n", + "-5.97 0.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.64 \n", + "None 0.64 \n", + "None 0.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.13 0.71 \n", + "10000000.0 10000000.0 \n", + "-114.49 5.99 \n", + "None 0.71 \n", + "-41.4 6.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.54 \n", + "10000000.0 10000000.0 \n", + "None 1.6 \n", + "None 0.58 \n", + "None 1.27 \n", + "None 2.21 \n", + "None 0.79 \n", + "None 1.17 \n", + "None 0.44 \n", + "None 1.2 \n", + "None 2.01 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 3.89 \n", + "None 4.23 \n", + "None 4.3 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.42 \n", + "None 0.27 \n", + "None 3.87 \n", + "None 1.26 \n", + "None 0.3 \n", + "None 0.41 \n", + "None 0.44 \n", + "None 4.29 \n", + "None 2.72 \n", + "None 3.87 \n", + "None 0.41 \n", + "None 2.66 \n", + "None 2.14 \n", + "None 1.16 \n", + "None 1.13 \n", + "None 0.35 \n", + "-8.87 0.64 \n", + "None 2.31 \n", + "None 2.19 \n", + "None 0.71 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "None 3.86 \n", + "None 0.54 \n", + "None 0.41 \n", + "None 0.41 \n", + "None 0.41 \n", + "None 4.29 \n", + "10000000.0 10000000.0 \n", + "None 1.94 \n", + "None 1.94 \n", + "-9.34 0.31 \n", + "None 2.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.83 \n", + "10000000.0 10000000.0 \n", + "None 0.64 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.34 0.31 \n", + "None 1.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.72 \n", + "10000000.0 10000000.0 \n", + "None 1.95 \n", + "10000000.0 10000000.0 \n", + "None 1.36 \n", + "10000000.0 10000000.0 \n", + "None 0.51 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "None 0.41 \n", + "-6.16 0.07 \n", + "None 0.71 \n", + "None 2.33 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "-10.33 0.46 \n", + "None 1.02 \n", + "None 2.56 \n", + "None 2.56 \n", + "None 0.49 \n", + "None 1.16 \n", + "None 2.18 \n", + "-10.29 0.48 \n", + "None 2.09 \n", + "-8.57 0.72 \n", + "-6.16 0.07 \n", + "None 1.26 \n", + "10000000.0 10000000.0 \n", + "None 2.18 \n", + "None 2.12 \n", + "None 0.38 \n", + "None 0.54 \n", + "None 2.77 \n", + "None 8.53 \n", + "None 0.62 \n", + "None 0.34 \n", + "-6.81 4.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.68 \n", + "None 2.12 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "None 0.35 \n", + "None 0.44 \n", + "10000000.0 10000000.0 \n", + "None 0.44 \n", + "-9.38 0.68 \n", + "-6.16 0.07 \n", + "None 2.14 \n", + "-9.58 0.4 \n", + "None 2.18 \n", + "None 4.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.16 \n", + "10000000.0 10000000.0 \n", + "-11.19 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "None 3.25 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.72 \n", + "None 3.92 \n", + "None 0.83 \n", + "None 0.25 \n", + "-6.16 0.07 \n", + "None 4.58 \n", + "10000000.0 10000000.0 \n", + "None 1.33 \n", + "None 0.47 \n", + "None 0.47 \n", + "-6.16 0.07 \n", + "None 6.01 \n", + "-6.16 0.07 \n", + "None 4.07 \n", + "None 2.12 \n", + "-9.34 0.31 \n", + "None 1.4 \n", + "None 0.44 \n", + "None 0.71 \n", + "None 1.64 \n", + "None 1.94 \n", + "None 0.4 \n", + "-8.75 0.74 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "None 2.12 \n", + "None 4.06 \n", + "None 2.23 \n", + "None 2.66 \n", + "None 0.71 \n", + "None 0.62 \n", + "None 1.94 \n", + "None 0.54 \n", + "None 2.12 \n", + "None 1.44 \n", + "None 2.14 \n", + "None 1.24 \n", + "None 2.5 \n", + "None 3.95 \n", + "None 0.83 \n", + "None 2.79 \n", + "None 0.33 \n", + "None 0.49 \n", + "None 1.13 \n", + "None 1.26 \n", + "None 0.75 \n", + "10000000.0 10000000.0 \n", + "None 1.16 \n", + "None 2.12 \n", + "None 2.12 \n", + "None 1.94 \n", + "None 8.13 \n", + "None 1.26 \n", + "None 7.58 \n", + "None 1.17 \n", + "None 1.16 \n", + "None 3.92 \n", + "None 4.27 \n", + "10000000.0 10000000.0 \n", + "None 2.21 \n", + "None 1.13 \n", + "None 0.71 \n", + "None 1.6 \n", + "None 0.52 \n", + "None 0.79 \n", + "None 0.34 \n", + "None 0.83 \n", + "None 2.14 \n", + "None 2.14 \n", + "None 0.62 \n", + "None 0.44 \n", + "10000000.0 10000000.0 \n", + "None 2.79 \n", + "None 4.21 \n", + "None 5.05 \n", + "None 4.29 \n", + "None 3.66 \n", + "None 2.73 \n", + "None 2.72 \n", + "None 0.72 \n", + "None 0.65 \n", + "None 1.9 \n", + "None 0.71 \n", + "None 2.69 \n", + "None 10.15 \n", + "14.74 0.5 \n", + "10000000.0 10000000.0 \n", + "-6.02 0.82 \n", + "-9.36 0.5 \n", + "-2.62 0.35 \n", + "-71.92 4.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.48 2.04 \n", + "-98.38 5.21 \n", + "None None \n", + "-2.9 0.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-92.72 9.67 \n", + "-92.72 9.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "53.01 1.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "11.92 0.96 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "57.67 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-64.58 0.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "44.47 0.91 \n", + "203.53 2.74 \n", + "121.74 1.25 \n", + "164.8 1.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-45.97 0.22 \n", + "-46.33 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "84.83 0.34 \n", + "10000000.0 10000000.0 \n", + "-87.53 0.33 \n", + "-228.17 1.14 \n", + "-254.33 2.79 \n", + "-165.95 1.07 \n", + "243.37 2.8 \n", + "163.52 1.16 \n", + "226.15 1.14 \n", + "10000000.0 10000000.0 \n", + "-28.87 2.14 \n", + "10000000.0 10000000.0 \n", + "57.67 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-63.43 1.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "28.1 1.28 \n", + "-8.43 0.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-64.39 0.35 \n", + "59.47 0.91 \n", + "-6.1 1.05 \n", + "2.09 1.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-23.85 10.04 \n", + "-11.97 0.5 \n", + "-64.58 0.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.89 0.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-28.95 0.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 4.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.87 1.28 \n", + "-3.19 0.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-63.94 0.29 \n", + "14.96 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.46 0.05 \n", + "-20.14 1.86 \n", + "8.27 0.9 \n", + "4.49 0.57 \n", + "-46.06 1.64 \n", + "-2.79 0.26 \n", + "62.53 0.8 \n", + "2.7 1.52 \n", + "-4.57 1.08 \n", + "7.23 0.84 \n", + "-1.36 1.32 \n", + "-3.73 0.95 \n", + "10000000.0 10000000.0 \n", + "-1.2 1.08 \n", + "-3.2 0.86 \n", + "18.48 13.84 \n", + "-6.24 0.92 \n", + "10000000.0 10000000.0 \n", + "-2.63 0.42 \n", + "2.81 0.44 \n", + "-3.48 0.38 \n", + "10000000.0 10000000.0 \n", + "-125.98 2.59 \n", + "-86.46 1.22 \n", + "-26.84 1.03 \n", + "10000000.0 10000000.0 \n", + "-103.9 3.91 \n", + "-24.58 0.97 \n", + "-2.83 0.26 \n", + "None 10.63 \n", + "-101.23 0.92 \n", + "-159.92 2.75 \n", + "-87.92 0.79 \n", + "-119.25 1.85 \n", + "-82.41 3.41 \n", + "-107.75 2.01 \n", + "-11.98 1.19 \n", + "-2.55 0.35 \n", + "-13.77 0.8 \n", + "-13.87 0.8 \n", + "-101.47 1.76 \n", + "-71.27 4.91 \n", + "1.15 0.41 \n", + "None 18.06 \n", + "-1.82 0.96 \n", + "-14.55 0.79 \n", + "-22.96 1.98 \n", + "134.22 3.45 \n", + "-118.04 4.77 \n", + "-40.01 1.05 \n", + "10000000.0 10000000.0 \n", + "-286.32 7.81 \n", + "-34.08 14.54 \n", + "-11.89 4.12 \n", + "-264.94 7.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-32.71 2.06 \n", + "-11.9 0.15 \n", + "-6.16 0.07 \n", + "-8.43 0.14 \n", + "-13.75 0.86 \n", + "1.72 0.24 \n", + "-77.79 0.79 \n", + "2.91 11.5 \n", + "48.81 2.02 \n", + "11.53 0.22 \n", + "3.7 0.21 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.85 0.79 \n", + "-8.79 0.73 \n", + "-3.14 0.71 \n", + "-3.14 0.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.08 \n", + "-77.79 0.79 \n", + "11.53 0.23 \n", + "3.7 0.19 \n", + "-1.54 1.6 \n", + "-3.02 0.72 \n", + "-3.67 5.98 \n", + "-28.02 1.04 \n", + "-70.71 1.25 \n", + "-5.74 0.08 \n", + "-14.62 0.93 \n", + "-7.85 1.99 \n", + "1.69 1.99 \n", + "-0.42 0.04 \n", + "-7.49 0.72 \n", + "-11.69 0.9 \n", + "0.57 0.71 \n", + "-7.11 1.11 \n", + "1.26 0.75 \n", + "-3.53 0.8 \n", + "10000000.0 10000000.0 \n", + "0.36 0.71 \n", + "10000000.0 10000000.0 \n", + "0.62 0.3 \n", + "-0.23 0.31 \n", + "22.97 6.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-71.01 1.18 \n", + "0.14 0.96 \n", + "6.3 0.96 \n", + "10000000.0 10000000.0 \n", + "-5.03 0.78 \n", + "-0.68 0.31 \n", + "0.25 0.31 \n", + "-1.13 0.78 \n", + "-5.48 0.31 \n", + "-5.35 0.94 \n", + "-3.08 0.94 \n", + "-2.71 0.48 \n", + "-3.45 0.48 \n", + "-7.47 4.86 \n", + "-12.61 4.92 \n", + "-5.47 0.75 \n", + "-3.05 5.12 \n", + "1.85 4.92 \n", + "-7.56 0.47 \n", + "-4.78 0.49 \n", + "-3.37 0.34 \n", + "-7.42 1.99 \n", + "-2.79 0.35 \n", + "10000000.0 10000000.0 \n", + "-18.84 7.46 \n", + "-2.59 0.75 \n", + "-3.69 0.67 \n", + "3.85 0.33 \n", + "-10.15 0.27 \n", + "8.79 0.58 \n", + "-5.45 0.69 \n", + "-3.86 0.68 \n", + "0.61 1.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.79 0.12 \n", + "6.53 0.1 \n", + "-6.69 0.5 \n", + "-6.69 0.5 \n", + "4.26 0.12 \n", + "-37.93 1.28 \n", + "-12.69 0.13 \n", + "-8.47 0.78 \n", + "-8.47 0.79 \n", + "-40.2 1.27 \n", + "4.94 0.36 \n", + "-6.46 1.44 \n", + "3.13 0.76 \n", + "5.29 1.26 \n", + "3.13 0.76 \n", + "-3.96 0.76 \n", + "-55.73 4.71 \n", + "5.33 1.04 \n", + "-6.93 0.23 \n", + "-6.8 0.72 \n", + "-4.29 0.8 \n", + "-7.3 0.13 \n", + "-4.18 0.29 \n", + "1.14 0.09 \n", + "2.26 0.15 \n", + "-3.95 0.77 \n", + "-1.13 0.1 \n", + "-10.42 6.55 \n", + "2.81 0.38 \n", + "6.02 0.21 \n", + "6.51 0.55 \n", + "5.82 0.55 \n", + "5.82 0.55 \n", + "8.71 0.07 \n", + "-10.34 0.49 \n", + "8.72 0.09 \n", + "-23.01 1.02 \n", + "-0.72 0.79 \n", + "-3.34 0.2 \n", + "13.21 1.19 \n", + "-2.82 0.21 \n", + "-6.51 0.71 \n", + "0.07 0.13 \n", + "-5.12 0.81 \n", + "0.13 0.52 \n", + "-5.69 0.85 \n", + "-1.77 0.58 \n", + "-8.47 0.49 \n", + "-6.93 0.95 \n", + "1.41 0.78 \n", + "-3.33 0.96 \n", + "-0.14 0.58 \n", + "10.04 0.79 \n", + "6.93 0.67 \n", + "-4.14 0.82 \n", + "-39.15 1.89 \n", + "-74.09 0.81 \n", + "-22.87 1.22 \n", + "52.41 1.12 \n", + "-23.36 1.11 \n", + "-27.09 1.03 \n", + "-23.14 1.15 \n", + "-4.28 0.56 \n", + "-7.08 0.97 \n", + "0.03 0.34 \n", + "None 4.41 \n", + "-15.71 0.62 \n", + "-4.01 0.11 \n", + "-1.02 0.28 \n", + "-2.59 0.51 \n", + "-31.6 1.1 \n", + "-2.15 0.11 \n", + "-4.86 0.32 \n", + "-3.44 0.61 \n", + "0.19 0.34 \n", + "10000000.0 10000000.0 \n", + "3.41 0.13 \n", + "-9.59 4.37 \n", + "-9.57 0.15 \n", + "-20.13 1.71 \n", + "-118.86 1.08 \n", + "6.1 0.16 \n", + "-5.66 0.58 \n", + "-17.71 4.36 \n", + "-10.35 1.06 \n", + "0.62 0.28 \n", + "-6.8 0.57 \n", + "-5.52 0.3 \n", + "-0.6 0.32 \n", + "10000000.0 10000000.0 \n", + "-0.64 0.29 \n", + "10000000.0 10000000.0 \n", + "-5.56 0.33 \n", + "-5.6 1.51 \n", + "-6.56 0.82 \n", + "-12.31 0.82 \n", + "-8.31 0.46 \n", + "2.57 0.76 \n", + "7.09 0.07 \n", + "7.09 0.11 \n", + "-0.94 0.18 \n", + "8.73 0.76 \n", + "5.26 0.76 \n", + "-6.28 0.52 \n", + "-1.53 0.62 \n", + "5.06 0.67 \n", + "8.6 0.11 \n", + "2.44 0.11 \n", + "0.02 0.36 \n", + "3.17 5.06 \n", + "0.69 0.13 \n", + "159.78 1.77 \n", + "-22.32 1.03 \n", + "-23.57 1.12 \n", + "-24.63 1.02 \n", + "1.3 0.12 \n", + "1.36 0.71 \n", + "10000000.0 10000000.0 \n", + "10.75 0.39 \n", + "-20.98 1.09 \n", + "-10.46 4.93 \n", + "8.39 1.11 \n", + "-1.96 0.4 \n", + "8.44 0.51 \n", + "8.44 0.51 \n", + "2.03 0.39 \n", + "1.34 0.4 \n", + "10000000.0 10000000.0 \n", + "8.78 0.13 \n", + "-3.34 0.78 \n", + "8.18 0.71 \n", + "7.76 0.86 \n", + "-0.63 0.18 \n", + "-0.01 0.25 \n", + "14.88 0.5 \n", + "-0.49 0.32 \n", + "-1.04 0.91 \n", + "-5.67 0.33 \n", + "11.27 0.87 \n", + "2.27 0.73 \n", + "2.95 0.16 \n", + "-0.67 0.87 \n", + "-7.01 0.87 \n", + "-0.81 0.71 \n", + "-0.24 0.65 \n", + "10000000.0 10000000.0 \n", + "-0.24 0.65 \n", + "-5.07 0.73 \n", + "-18.54 1.97 \n", + "-16.79 1.43 \n", + "-7.62 0.46 \n", + "-19.32 3.63 \n", + "-3.17 1.65 \n", + "7.13 0.34 \n", + "3.17 0.82 \n", + "0.11 0.11 \n", + "1.22 0.73 \n", + "-4.58 2.16 \n", + "8.65 0.57 \n", + "-24.99 1.15 \n", + "-90.63 6.19 \n", + "-111.77 1.18 \n", + "-4.39 0.91 \n", + "9.66 0.84 \n", + "10000000.0 10000000.0 \n", + "-5.7 0.53 \n", + "10000000.0 10000000.0 \n", + "-1.6 0.54 \n", + "-9.82 2.16 \n", + "None 0.71 \n", + "-1.1 0.5 \n", + "-5.96 0.86 \n", + "4.61 1.01 \n", + "10.54 0.22 \n", + "-37.75 1.3 \n", + "-2.55 0.32 \n", + "-5.9 1.18 \n", + "4.36 0.37 \n", + "8.1 0.51 \n", + "3.48 0.71 \n", + "7.02 0.95 \n", + "-21.19 1.04 \n", + "4.21 0.74 \n", + "0.6 0.66 \n", + "2.25 0.33 \n", + "4.58 0.71 \n", + "-17.2 1.16 \n", + "-2.15 0.86 \n", + "-4.43 0.87 \n", + "-7.39 1.2 \n", + "-4.01 0.86 \n", + "1.81 5.07 \n", + "-4.42 0.59 \n", + "-2.88 0.6 \n", + "-4.89 1.46 \n", + "3.14 0.12 \n", + "1.25 0.48 \n", + "10000000.0 10000000.0 \n", + "-0.44 0.64 \n", + "-6.23 0.63 \n", + "-7.12 0.66 \n", + "-11.56 0.24 \n", + "-4.54 0.62 \n", + "0.03 0.34 \n", + "-2.65 0.54 \n", + "-14.03 6.7 \n", + "0.59 0.46 \n", + "-19.97 1.38 \n", + "-2.75 1.42 \n", + "-3.41 1.42 \n", + "-3.11 0.6 \n", + "-3.34 0.67 \n", + "-0.58 0.71 \n", + "-2.82 0.67 \n", + "-5.58 0.72 \n", + "-8.0 0.56 \n", + "-2.15 0.74 \n", + "-2.22 0.74 \n", + "-4.22 1.37 \n", + "-3.53 0.8 \n", + "-0.79 1.38 \n", + "-3.9 1.06 \n", + "-6.42 1.8 \n", + "-7.21 1.39 \n", + "-6.8 1.41 \n", + "-0.64 1.05 \n", + "10000000.0 10000000.0 \n", + "11.38 0.28 \n", + "14.07 0.29 \n", + "-19.81 0.31 \n", + "-23.82 1.18 \n", + "-41.16 1.36 \n", + "-16.31 2.37 \n", + "-14.03 7.54 \n", + "-14.03 7.59 \n", + "-14.03 7.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.04 0.7 \n", + "-2.12 0.7 \n", + "-0.82 0.76 \n", + "-7.0 1.54 \n", + "-8.34 0.82 \n", + "1.8 0.13 \n", + "-5.68 1.39 \n", + "10000000.0 10000000.0 \n", + "-190.6 3.1 \n", + "-59.15 7.12 \n", + "-106.64 1.69 \n", + "7.53 0.71 \n", + "3.22 1.52 \n", + "-0.08 0.71 \n", + "-0.83 1.48 \n", + "4.63 1.27 \n", + "-6.03 0.6 \n", + "-5.89 0.56 \n", + "-0.27 0.56 \n", + "-0.13 0.6 \n", + "6.8 0.58 \n", + "-2.95 0.63 \n", + "0.79 0.7 \n", + "-1.42 0.64 \n", + "-2.75 0.54 \n", + "-7.24 0.89 \n", + "1.69 0.8 \n", + "-11.13 4.37 \n", + "9.72 0.2 \n", + "-2.46 0.07 \n", + "-1.01 0.08 \n", + "0.94 0.19 \n", + "-1.6 0.71 \n", + "-1.03 0.42 \n", + "-0.13 0.73 \n", + "-1.44 0.45 \n", + "-69.76 1.13 \n", + "10000000.0 10000000.0 \n", + "-10.51 0.47 \n", + "8.02 0.8 \n", + "-2.29 0.82 \n", + "-23.7 1.28 \n", + "-17.34 1.53 \n", + "-15.69 1.36 \n", + "-18.53 1.04 \n", + "6.36 0.98 \n", + "1.05 0.3 \n", + "-12.52 0.98 \n", + "-7.21 0.31 \n", + "-1.16 0.59 \n", + "-6.56 0.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-74.63 2.18 \n", + "-32.0 1.07 \n", + "10000000.0 10000000.0 \n", + "-120.46 1.22 \n", + "None None \n", + "-25.52 1.12 \n", + "-0.16 0.68 \n", + "-13.15 4.96 \n", + "-13.64 0.72 \n", + "-4.55 0.6 \n", + "-5.28 1.38 \n", + "-2.23 1.11 \n", + "-0.64 0.3 \n", + "-5.72 0.82 \n", + "-0.98 0.07 \n", + "7.21 0.33 \n", + "-4.1 0.89 \n", + "3.79 0.71 \n", + "-7.05 0.94 \n", + "-14.87 1.36 \n", + "-5.77 1.2 \n", + "7.4 6.23 \n", + "-1.37 1.09 \n", + "-9.44 1.27 \n", + "-1.62 0.84 \n", + "-7.26 1.32 \n", + "-5.45 1.01 \n", + "-2.31 1.18 \n", + "4.95 0.16 \n", + "-11.88 0.27 \n", + "-0.89 1.21 \n", + "-0.89 1.21 \n", + "-32.61 1.57 \n", + "-82.24 1.58 \n", + "-115.02 1.6 \n", + "-94.74 1.55 \n", + "1.3 1.31 \n", + "-10.46 5.4 \n", + "-9.6 1.21 \n", + "-8.82 1.37 \n", + "-10.07 0.96 \n", + "-21.24 4.5 \n", + "5.2 1.0 \n", + "-26.52 1.41 \n", + "-112.92 1.45 \n", + "-19.05 2.64 \n", + "-3.58 1.0 \n", + "-6.96 1.04 \n", + "-3.51 1.0 \n", + "4.2 1.0 \n", + "-0.89 0.13 \n", + "20.8 1.03 \n", + "-6.72 1.22 \n", + "-27.33 4.38 \n", + "6.43 0.11 \n", + "5.68 0.5 \n", + "-5.96 1.28 \n", + "-5.96 1.28 \n", + "-2.27 1.28 \n", + "-2.26 1.28 \n", + "1.41 0.78 \n", + "-11.48 0.31 \n", + "-11.48 0.32 \n", + "-8.47 0.57 \n", + "-8.47 0.58 \n", + "8.74 0.71 \n", + "8.74 0.72 \n", + "10.54 0.21 \n", + "-7.03 0.36 \n", + "-2.25 0.71 \n", + "0.87 0.35 \n", + "-6.81 3.97 \n", + "5.66 0.35 \n", + "-4.88 0.37 \n", + "1.7 0.82 \n", + "-1.36 0.48 \n", + "-6.32 1.06 \n", + "-22.92 1.14 \n", + "-90.63 6.28 \n", + "-102.49 1.45 \n", + "-5.36 2.64 \n", + "-5.36 2.64 \n", + "0.09 0.5 \n", + "-16.37 1.65 \n", + "-16.86 1.23 \n", + "-9.56 1.06 \n", + "-11.79 0.97 \n", + "-2.02 1.09 \n", + "-0.95 0.36 \n", + "-2.63 0.35 \n", + "-119.68 0.76 \n", + "5.03 0.11 \n", + "-18.07 1.77 \n", + "-9.47 0.64 \n", + "-8.71 0.85 \n", + "-2.94 0.42 \n", + "2.36 0.55 \n", + "5.67 0.45 \n", + "5.03 0.08 \n", + "-2.94 0.49 \n", + "-4.64 0.37 \n", + "4.41 0.52 \n", + "-2.81 0.3 \n", + "-12.71 0.58 \n", + "-1.52 0.37 \n", + "-7.26 0.6 \n", + "-1.95 0.37 \n", + "1.17 0.61 \n", + "-0.6 0.68 \n", + "-4.37 0.71 \n", + "-3.99 0.64 \n", + "-3.97 0.48 \n", + "-5.51 0.51 \n", + "1.4 0.34 \n", + "-0.21 0.17 \n", + "8.13 1.34 \n", + "-6.92 1.69 \n", + "1.21 0.41 \n", + "-14.69 1.56 \n", + "3.55 4.98 \n", + "-83.01 1.03 \n", + "-0.83 1.04 \n", + "10000000.0 10000000.0 \n", + "93.91 0.89 \n", + "93.92 0.91 \n", + "30.61 1.18 \n", + "34.51 1.02 \n", + "34.51 1.03 \n", + "10000000.0 10000000.0 \n", + "19.26 1.03 \n", + "-5.72 0.44 \n", + "-0.85 0.5 \n", + "-3.95 0.73 \n", + "-1.19 0.46 \n", + "-3.29 1.1 \n", + "-5.42 1.13 \n", + "-4.82 0.66 \n", + "-19.68 2.37 \n", + "-22.07 2.56 \n", + "-19.68 2.37 \n", + "-105.97 0.91 \n", + "-62.22 1.39 \n", + "-73.85 1.47 \n", + "-108.63 1.19 \n", + "-120.33 1.49 \n", + "-22.07 2.56 \n", + "-2.66 0.8 \n", + "-2.66 0.8 \n", + "-113.59 1.3 \n", + "-113.59 1.3 \n", + "-4.36 5.01 \n", + "10000000.0 10000000.0 \n", + "6.74 0.65 \n", + "3.81 1.01 \n", + "7.97 0.74 \n", + "-0.5 1.4 \n", + "-1.81 0.5 \n", + "3.02 0.42 \n", + "-0.95 0.32 \n", + "-4.6 0.5 \n", + "-2.31 0.47 \n", + "-4.65 0.59 \n", + "-4.65 0.59 \n", + "14.37 1.78 \n", + "-2.58 0.51 \n", + "6.14 0.18 \n", + "6.14 0.2 \n", + "7.45 0.23 \n", + "-25.58 1.03 \n", + "-3.58 0.51 \n", + "2.54 0.75 \n", + "-0.43 0.51 \n", + "-2.51 0.65 \n", + "-4.0 0.65 \n", + "-8.52 0.58 \n", + "0.52 0.41 \n", + "10000000.0 10000000.0 \n", + "29.45 1.14 \n", + "10000000.0 10000000.0 \n", + "10.11 0.87 \n", + "10000000.0 10000000.0 \n", + "-3.8 0.45 \n", + "2.56 0.44 \n", + "2.56 0.44 \n", + "4.51 0.49 \n", + "-8.78 0.6 \n", + "-3.98 0.49 \n", + "2.96 0.41 \n", + "-3.67 0.46 \n", + "-0.46 0.4 \n", + "-2.77 0.85 \n", + "-4.74 0.99 \n", + "-0.79 0.94 \n", + "-2.88 0.88 \n", + "-13.88 0.97 \n", + "0.4 0.71 \n", + "-1.55 1.6 \n", + "10000000.0 10000000.0 \n", + "-7.43 1.18 \n", + "-4.0 1.13 \n", + "-11.8 1.28 \n", + "1.77 1.18 \n", + "-13.05 1.27 \n", + "-2.14 1.05 \n", + "9.54 1.46 \n", + "-13.78 1.7 \n", + "8.09 1.65 \n", + "0.96 0.71 \n", + "-0.89 0.73 \n", + "-3.38 1.36 \n", + "-8.32 1.4 \n", + "-0.11 1.4 \n", + "-3.17 1.88 \n", + "-14.89 1.97 \n", + "3.94 4.98 \n", + "-73.51 1.49 \n", + "10000000.0 10000000.0 \n", + "92.6 4.94 \n", + "83.08 7.52 \n", + "-14.14 0.81 \n", + "3.69 0.72 \n", + "4.48 0.8 \n", + "-6.89 1.05 \n", + "-4.15 1.45 \n", + "10.53 1.07 \n", + "1.42 0.71 \n", + "-10.42 6.57 \n", + "6.98 0.69 \n", + "2.55 0.72 \n", + "-0.18 1.28 \n", + "9.57 0.81 \n", + "9.2 0.85 \n", + "382.79 2.1 \n", + "-5.02 5.04 \n", + "5.18 0.58 \n", + "-5.75 0.93 \n", + "5.18 0.57 \n", + "-5.75 0.92 \n", + "-7.8 0.95 \n", + "10000000.0 10000000.0 \n", + "-1.89 0.66 \n", + "-4.27 0.66 \n", + "2.48 0.6 \n", + "-1.81 1.19 \n", + "-2.78 0.43 \n", + "10000000.0 10000000.0 \n", + "-5.65 0.43 \n", + "1.42 0.65 \n", + "1.52 0.77 \n", + "-0.4 0.77 \n", + "None 4.9 \n", + "1.07 4.01 \n", + "-6.25 0.68 \n", + "-2.72 0.31 \n", + "10000000.0 10000000.0 \n", + "1.32 0.8 \n", + "-3.69 0.76 \n", + "-2.05 1.01 \n", + "-4.11 1.01 \n", + "-6.26 2.08 \n", + "3.32 1.06 \n", + "-3.43 1.18 \n", + "-3.5 1.06 \n", + "-8.33 1.46 \n", + "-4.97 1.07 \n", + "-4.97 0.94 \n", + "-7.27 0.59 \n", + "-31.11 1.35 \n", + "0.61 0.92 \n", + "0.61 0.92 \n", + "-20.0 4.54 \n", + "-110.93 1.05 \n", + "-2.62 0.35 \n", + "-107.59 1.89 \n", + "-14.2 5.04 \n", + "-21.94 1.79 \n", + "-24.76 1.8 \n", + "-12.1 0.51 \n", + "-7.42 1.34 \n", + "-3.96 0.81 \n", + "-2.66 0.8 \n", + "-35.36 1.3 \n", + "10000000.0 10000000.0 \n", + "-54.26 1.22 \n", + "0.8 1.14 \n", + "5.24 1.17 \n", + "-5.92 1.01 \n", + "9.9 1.88 \n", + "8.92 4.99 \n", + "-14.01 1.14 \n", + "4.44 0.41 \n", + "0.54 1.48 \n", + "-2.99 0.53 \n", + "-3.17 0.53 \n", + "-9.7 0.54 \n", + "6.69 0.44 \n", + "-1.31 0.13 \n", + "-14.0 0.46 \n", + "-27.07 1.53 \n", + "82.33 2.67 \n", + "-3.99 0.12 \n", + "-27.58 1.05 \n", + "-2.31 0.24 \n", + "-4.99 0.25 \n", + "-14.03 5.21 \n", + "-16.31 2.96 \n", + "10000000.0 10000000.0 \n", + "-14.34 2.92 \n", + "10.18 0.58 \n", + "-10.18 0.58 \n", + "-104.4 1.64 \n", + "5.73 0.44 \n", + "9.31 0.49 \n", + "5.73 0.45 \n", + "9.31 0.49 \n", + "-6.09 0.58 \n", + "-0.88 0.51 \n", + "-8.29 0.52 \n", + "-9.24 0.51 \n", + "0.19 0.49 \n", + "-2.17 0.33 \n", + "-6.42 0.49 \n", + "-0.25 0.79 \n", + "-7.7 0.44 \n", + "-5.49 0.8 \n", + "-8.05 0.6 \n", + "1.04 0.4 \n", + "-3.38 0.48 \n", + "-9.33 0.13 \n", + "-5.44 0.35 \n", + "1.25 0.1 \n", + "1.25 0.13 \n", + "3.32 0.71 \n", + "0.15 0.59 \n", + "1.6 0.57 \n", + "5.12 0.13 \n", + "4.8 0.55 \n", + "17.21 5.64 \n", + "12.98 0.65 \n", + "13.69 0.86 \n", + "-11.13 5.39 \n", + "-21.55 7.38 \n", + "-2.84 0.54 \n", + "1.07 0.53 \n", + "3.42 2.87 \n", + "-2.99 0.53 \n", + "0.65 0.2 \n", + "0.82 0.07 \n", + "2.8 0.34 \n", + "-10.11 0.84 \n", + "-2.64 1.18 \n", + "-1.53 0.77 \n", + "8.78 0.39 \n", + "-3.66 0.85 \n", + "0.07 0.38 \n", + "1.68 0.71 \n", + "-1.3 0.32 \n", + "27.91 0.52 \n", + "-2.07 0.44 \n", + "27.91 0.52 \n", + "-3.22 0.51 \n", + "-2.06 0.45 \n", + "-39.05 1.1 \n", + "-26.49 2.26 \n", + "97.86 0.39 \n", + "97.9 0.54 \n", + "-1.16 1.02 \n", + "-2.16 0.66 \n", + "10000000.0 10000000.0 \n", + "0.47 4.73 \n", + "4.18 2.07 \n", + "-0.13 0.71 \n", + "5.25 1.61 \n", + "-12.96 3.97 \n", + "10000000.0 10000000.0 \n", + "-7.82 0.97 \n", + "-1.17 0.71 \n", + "-1.29 0.45 \n", + "4.15 1.31 \n", + "-2.51 0.57 \n", + "4.75 0.95 \n", + "-4.87 0.46 \n", + "6.11 0.38 \n", + "10.46 7.23 \n", + "2.34 0.52 \n", + "0.74 0.35 \n", + "5.79 0.37 \n", + "-4.75 0.36 \n", + "-3.55 0.23 \n", + "-90.39 1.25 \n", + "-90.39 1.25 \n", + "0.17 0.95 \n", + "-13.06 1.12 \n", + "-7.56 1.69 \n", + "-0.43 0.54 \n", + "0.21 0.52 \n", + "-1.52 0.88 \n", + "-6.08 1.02 \n", + "-22.19 1.11 \n", + "-12.69 1.11 \n", + "-10.46 4.97 \n", + "-4.8 0.43 \n", + "0.82 0.47 \n", + "-2.51 0.44 \n", + "-13.43 1.51 \n", + "-1.52 0.54 \n", + "6.74 5.11 \n", + "-7.01 0.53 \n", + "-3.56 0.39 \n", + "-6.36 0.47 \n", + "-9.6 1.46 \n", + "1.17 1.45 \n", + "-6.96 0.87 \n", + "1.12 0.25 \n", + "13.11 0.64 \n", + "-1.93 0.69 \n", + "-1.93 0.69 \n", + "5.21 0.43 \n", + "9.5 0.95 \n", + "-0.07 0.8 \n", + "7.4 0.46 \n", + "-1.06 0.79 \n", + "7.94 0.59 \n", + "-0.53 0.22 \n", + "-0.99 0.34 \n", + "-0.61 0.4 \n", + "-95.68 1.96 \n", + "-5.17 0.34 \n", + "-5.17 0.34 \n", + "-5.17 0.34 \n", + "-4.36 5.28 \n", + "-4.36 5.28 \n", + "-4.36 5.28 \n", + "-4.36 5.28 \n", + "-4.53 0.61 \n", + "-14.34 2.31 \n", + "-2.38 0.49 \n", + "-2.14 0.6 \n", + "-2.34 0.63 \n", + "-8.11 0.46 \n", + "-39.83 1.11 \n", + "-5.17 0.59 \n", + "-3.59 0.68 \n", + "None 2.31 \n", + "-8.44 0.34 \n", + "-5.64 0.81 \n", + "-0.07 1.22 \n", + "9.23 0.84 \n", + "5.96 0.32 \n", + "0.51 0.84 \n", + "0.44 0.85 \n", + "4.5 1.22 \n", + "2.04 0.27 \n", + "2.04 0.28 \n", + "4.36 0.98 \n", + "-5.32 0.71 \n", + "8.93 1.02 \n", + "1.74 0.76 \n", + "2.48 1.24 \n", + "-1.34 0.82 \n", + "-4.82 0.82 \n", + "6.58 0.54 \n", + "-18.42 5.84 \n", + "-23.14 5.89 \n", + "-10.32 1.49 \n", + "-7.22 0.89 \n", + "-8.84 0.76 \n", + "-2.66 0.8 \n", + "-4.36 4.98 \n", + "-13.21 1.07 \n", + "3.68 1.38 \n", + "-16.31 1.49 \n", + "-5.3 0.39 \n", + "-1.15 0.43 \n", + "5.6 0.37 \n", + "4.72 1.45 \n", + "5.61 0.36 \n", + "4.72 1.45 \n", + "-117.0 2.28 \n", + "-7.19 1.91 \n", + "-1.53 0.87 \n", + "3.49 0.73 \n", + "5.01 1.07 \n", + "-6.53 4.99 \n", + "-1.38 0.78 \n", + "-3.8 5.3 \n", + "-5.54 1.2 \n", + "3.08 1.26 \n", + "-6.8 0.83 \n", + "-5.8 1.53 \n", + "-3.34 0.46 \n", + "14.74 0.5 \n", + "11.14 0.86 \n", + "-2.63 1.54 \n", + "1.74 0.94 \n", + "-1.14 1.36 \n", + "0.85 0.65 \n", + "-14.73 1.19 \n", + "-7.79 0.66 \n", + "11.5 0.72 \n", + "-0.1 0.53 \n", + "-8.29 0.26 \n", + "-8.29 0.27 \n", + "-105.97 0.91 \n", + "-105.96 0.91 \n", + "-108.62 1.19 \n", + "-105.96 0.91 \n", + "-108.62 1.2 \n", + "-2.89 0.35 \n", + "-5.54 0.35 \n", + "26.91 1.75 \n", + "-13.2 1.07 \n", + "-118.45 1.59 \n", + "4.6 0.98 \n", + "9.87 0.48 \n", + "-1.06 6.63 \n", + "-1.54 5.1 \n", + "1.82 0.08 \n", + "1.99 0.28 \n", + "-3.05 0.39 \n", + "-3.92 0.52 \n", + "-3.57 0.59 \n", + "-3.79 0.42 \n", + "-14.12 0.57 \n", + "-7.41 0.5 \n", + "-4.0 0.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.16 0.68 \n", + "-11.13 4.35 \n", + "0.41 0.71 \n", + "0.19 0.35 \n", + "-8.62 0.34 \n", + "-1.32 0.34 \n", + "-4.0 0.63 \n", + "2.6 0.18 \n", + "16.92 0.92 \n", + "0.25 0.82 \n", + "-3.91 1.0 \n", + "77.66 5.31 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "-117.42 1.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.66 \n", + "None 1.23 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "None 3.11 \n", + "None 1.02 \n", + "None 1.02 \n", + "-3.06 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.92 0.53 \n", + "10000000.0 10000000.0 \n", + "5.09 1.02 \n", + "None 0.49 \n", + "None 0.49 \n", + "None 0.35 \n", + "None 0.35 \n", + "None 0.71 \n", + "None 0.71 \n", + "-3.8 0.81 \n", + "-5.52 0.33 \n", + "None 2.28 \n", + "None 2.31 \n", + "-5.79 0.52 \n", + "None 2.28 \n", + "0.71 1.21 \n", + "-8.87 0.64 \n", + "None 2.31 \n", + "-5.83 1.19 \n", + "-0.76 0.79 \n", + "-3.56 0.39 \n", + "-9.05 0.5 \n", + "None 2.31 \n", + "-10.1 0.31 \n", + "None 2.36 \n", + "None 2.19 \n", + "None 2.19 \n", + "10.66 0.78 \n", + "None 28.44 \n", + "None 0.74 \n", + "None 0.74 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 3.86 \n", + "None 3.86 \n", + "0.18 0.33 \n", + "-1.29 0.36 \n", + "None 4.3 \n", + "None 4.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "12.3 0.88 \n", + "None 6.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.94 0.95 \n", + "None 0.54 \n", + "None 0.54 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "None 1.1 \n", + "None None \n", + "None 0.41 \n", + "10000000.0 10000000.0 \n", + "0.42 0.49 \n", + "None 0.41 \n", + "-11.98 0.63 \n", + "-10.3 0.94 \n", + "-6.16 0.07 \n", + "-0.45 0.11 \n", + "-6.66 1.32 \n", + "None 2.18 \n", + "None 2.79 \n", + "None 2.79 \n", + "-0.69 0.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.34 0.61 \n", + "None 8.27 \n", + "None 10.24 \n", + "-0.44 0.54 \n", + "10000000.0 10000000.0 \n", + "-20.64 8.16 \n", + "-42.75 1.12 \n", + "-40.64 1.59 \n", + "None 4.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.31 7.47 \n", + "-6.16 0.07 \n", + "None 1.94 \n", + "None 1.94 \n", + "None 1.94 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.47 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "None 3.13 \n", + "None 2.32 \n", + "None 2.21 \n", + "None 2.21 \n", + "-9.11 2.23 \n", + "None 2.14 \n", + "-6.16 0.07 \n", + "None 0.83 \n", + "None 0.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-17.35 1.57 \n", + "8.55 1.27 \n", + "-0.35 0.81 \n", + "None 0.48 \n", + "None 0.48 \n", + "10000000.0 10000000.0 \n", + "4.02 0.24 \n", + "6.16 0.07 \n", + "None 0.41 \n", + "None 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.98 5.53 \n", + "-6.16 0.07 \n", + "None 1.12 \n", + "None 0.33 \n", + "None 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "None 1.36 \n", + "-6.16 0.07 \n", + "None 2.79 \n", + "None 2.79 \n", + "None 0.81 \n", + "None 0.71 \n", + "None 12.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.72 \n", + "None 0.71 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "None 30.46 \n", + "-6.81 8.11 \n", + "1.1 6.86 \n", + "-33.65 15.6 \n", + "-33.65 14.35 \n", + "-42.92 14.24 \n", + "None 6.84 \n", + "None 6.84 \n", + "None 6.84 \n", + "-6.16 0.07 \n", + "0.24 0.33 \n", + "1.05 0.49 \n", + "None None \n", + "81.09 0.39 \n", + "-0.18 0.36 \n", + "-6.16 0.07 \n", + "1.68 0.68 \n", + "None 2.8 \n", + "None 2.8 \n", + "None 3.96 \n", + "None 3.96 \n", + "None 2.8 \n", + "None 1.95 \n", + "None 1.95 \n", + "-6.16 0.07 \n", + "-80.04 0.38 \n", + "None 2.91 \n", + "10000000.0 10000000.0 \n", + "-79.0 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.34 5.16 \n", + "None 7.09 \n", + "None 7.09 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "None 0.99 \n", + "None 0.99 \n", + "None 0.99 \n", + "-48.78 1.22 \n", + "-22.88 1.52 \n", + "None 2.73 \n", + "None 2.73 \n", + "5.19 0.78 \n", + "None 4.23 \n", + "None 4.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.41 \n", + "None 0.41 \n", + "None 4.21 \n", + "-6.16 0.07 \n", + "None 0.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.01 0.48 \n", + "None 1.02 \n", + "None 2.59 \n", + "None 2.6 \n", + "None 2.6 \n", + "None 1.26 \n", + "None 0.83 \n", + "None 0.83 \n", + "None 3.79 \n", + "None 3.8 \n", + "None 3.8 \n", + "None 0.51 \n", + "None 0.51 \n", + "10000000.0 10000000.0 \n", + "-21.41 0.92 \n", + "-29.08 1.5 \n", + "-3.18 1.19 \n", + "-18.75 1.44 \n", + "None None \n", + "None 3.8 \n", + "None 3.8 \n", + "None 3.8 \n", + "10000000.0 10000000.0 \n", + "-5.83 0.28 \n", + "-5.83 0.28 \n", + "-124.58 0.86 \n", + "-15.07 0.59 \n", + "None 0.35 \n", + "None 0.35 \n", + "-15.67 0.44 \n", + "10000000.0 10000000.0 \n", + "-54.2 1.37 \n", + "-54.2 1.37 \n", + "-48.62 1.63 \n", + "-48.62 1.63 \n", + "10000000.0 10000000.0 \n", + "None 1.09 \n", + "None 1.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.64 0.62 \n", + "None 0.44 \n", + "None 0.44 \n", + "None 2.5 \n", + "None 2.55 \n", + "None 2.55 \n", + "None 2.55 \n", + "-2.83 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 52.42 \n", + "394.5 47.75 \n", + "-3.77 0.36 \n", + "-4.16 0.36 \n", + "-1.7 27.24 \n", + "None 10.54 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 12.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.41 \n", + "None 0.41 \n", + "-6.16 0.07 \n", + "None 1.06 \n", + "None 0.71 \n", + "None 0.71 \n", + "3.65 0.62 \n", + "-3.35 0.3 \n", + "None 2.33 \n", + "None 1.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.82 0.35 \n", + "10000000.0 10000000.0 \n", + "-5.82 0.35 \n", + "-5.82 0.35 \n", + "-2.62 0.35 \n", + "-2.62 0.35 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "-2.63 1.54 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "-2.61 0.35 \n", + "-2.61 0.35 \n", + "-3.6 0.73 \n", + "-3.61 0.73 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "-35.4 1.67 \n", + "-9.51 1.39 \n", + "-71.92 4.36 \n", + "-67.45 4.38 \n", + "-71.27 4.38 \n", + "-71.92 4.36 \n", + "-69.46 4.36 \n", + "-6.16 0.07 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.71 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-45.21 2.14 \n", + "None 0.71 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "2.84 0.71 \n", + "-50.9 1.6 \n", + "-50.49 1.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.9 1.06 \n", + "10000000.0 10000000.0 \n", + "-9.58 7.19 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.71 \n", + "-8.9 1.25 \n", + "-3.32 1.54 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "None 1.9 \n", + "None 1.9 \n", + "-9.34 0.31 \n", + "-10.33 0.46 \n", + "None 1.92 \n", + "None 1.84 \n", + "None 1.84 \n", + "None 2.12 \n", + "None 2.12 \n", + "None 1.02 \n", + "None 1.02 \n", + "None 1.02 \n", + "None 2.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "None 2.91 \n", + "-25.73 1.49 \n", + "0.16 1.17 \n", + "-5.41 1.47 \n", + "-6.81 4.46 \n", + "None 0.93 \n", + "-6.16 0.07 \n", + "None 1.15 \n", + "-6.16 0.07 \n", + "None 2.32 \n", + "-6.16 0.07 \n", + "None 0.96 \n", + "None 2.56 \n", + "None 2.14 \n", + "-4.86 0.32 \n", + "None 2.14 \n", + "-6.16 0.07 \n", + "None 2.18 \n", + "4.35 0.35 \n", + "None 1.26 \n", + "None 1.26 \n", + "None 1.26 \n", + "None 1.26 \n", + "None 1.16 \n", + "None 1.16 \n", + "-0.4 0.31 \n", + "-1.7 23.69 \n", + "None 2.18 \n", + "None 2.18 \n", + "-10.29 0.48 \n", + "None 1.4 \n", + "None 2.12 \n", + "None 2.12 \n", + "None 2.53 \n", + "None 2.09 \n", + "-8.57 0.72 \n", + "None 2.14 \n", + "None 2.8 \n", + "None None \n", + "-2.83 1.5 \n", + "-4.46 0.92 \n", + "None 3.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-0.5 0.57 \n", + "-39.69 1.66 \n", + "None 1.26 \n", + "None 1.26 \n", + "10000000.0 10000000.0 \n", + "-10.54 0.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.18 \n", + "None 2.18 \n", + "10000000.0 10000000.0 \n", + "-1.7 25.64 \n", + "-1.7 27.63 \n", + "10000000.0 10000000.0 \n", + "None 2.12 \n", + "None 2.12 \n", + "-6.16 0.07 \n", + "None 0.86 \n", + "-6.16 0.07 \n", + "None 0.73 \n", + "None 0.54 \n", + "10000000.0 10000000.0 \n", + "None 0.54 \n", + "None 0.49 \n", + "None 0.49 \n", + "-6.16 0.07 \n", + "None 2.77 \n", + "None 2.77 \n", + "None 0.54 \n", + "-6.16 0.07 \n", + "None 0.89 \n", + "None 0.54 \n", + "None 0.47 \n", + "None 0.47 \n", + "-1.69 0.17 \n", + "None 0.27 \n", + "10000000.0 10000000.0 \n", + "None 0.27 \n", + "None 0.62 \n", + "-21.34 1.49 \n", + "4.56 1.18 \n", + "-1.02 1.48 \n", + "None 0.62 \n", + "-12.37 0.71 \n", + "None 0.34 \n", + "10000000.0 10000000.0 \n", + "None 0.34 \n", + "None 3.87 \n", + "0.28 0.38 \n", + "-10.36 1.54 \n", + "-14.34 0.98 \n", + "-14.34 1.12 \n", + "10000000.0 10000000.0 \n", + "None 3.89 \n", + "None 3.89 \n", + "None 4.33 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "None 2.18 \n", + "-8.88 3.99 \n", + "None 3.89 \n", + "None 3.55 \n", + "None 3.55 \n", + "None 3.55 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.71 \n", + "-199.02 1.69 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.71 \n", + "4.44 0.24 \n", + "None 1.56 \n", + "None 1.56 \n", + "-13.15 2.75 \n", + "None 1.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 15.92 \n", + "-14.03 17.66 \n", + "-2.61 0.79 \n", + "-1.7 15.34 \n", + "-1.7 17.0 \n", + "-1.7 29.86 \n", + "None 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "None 1.6 \n", + "None 1.6 \n", + "None 0.49 \n", + "None 0.49 \n", + "None 1.24 \n", + "None 1.24 \n", + "None None \n", + "None 0.54 \n", + "-1.48 0.35 \n", + "-40.3 1.63 \n", + "-14.41 1.35 \n", + "-19.98 1.62 \n", + "None 3.56 \n", + "None 3.56 \n", + "None 1.26 \n", + "None 1.26 \n", + "-6.16 0.07 \n", + "None 0.64 \n", + "None 0.64 \n", + "None 3.87 \n", + "None 2.25 \n", + "None 2.25 \n", + "10000000.0 10000000.0 \n", + "None 3.89 \n", + "None 3.89 \n", + "None 2.12 \n", + "-14.5 0.44 \n", + "-6.16 0.07 \n", + "None 1.09 \n", + "-6.16 0.07 \n", + "None 10.1 \n", + "10000000.0 10000000.0 \n", + "-4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "-7.66 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.31 0.84 \n", + "None 4.27 \n", + "None 4.27 \n", + "None 4.27 \n", + "-26.19 1.56 \n", + "-6.16 0.07 \n", + "None 0.64 \n", + "None 0.64 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "2.14 30.8 \n", + "260.84 1.92 \n", + "None 12.06 \n", + "-25.44 1.48 \n", + "0.45 1.16 \n", + "None 0.35 \n", + "None 0.35 \n", + "-5.6 0.58 \n", + "-5.6 0.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.6 0.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "None 0.79 \n", + "None 0.79 \n", + "None 0.79 \n", + "10000000.0 10000000.0 \n", + "None 1.94 \n", + "None 1.94 \n", + "10000000.0 10000000.0 \n", + "None 0.44 \n", + "None 0.44 \n", + "None 0.44 \n", + "None 0.44 \n", + "-6.16 0.07 \n", + "None 0.44 \n", + "-6.16 0.07 \n", + "None 12.81 \n", + "-6.16 0.07 \n", + "-9.38 0.68 \n", + "None 10.68 \n", + "None 4.27 \n", + "-6.16 0.07 \n", + "None 6.41 \n", + "-6.81 9.58 \n", + "None 8.53 \n", + "None 2.56 \n", + "None 2.14 \n", + "-10.1 0.31 \n", + "None 2.29 \n", + "-1.44 0.38 \n", + "-9.58 0.4 \n", + "None 2.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-24.78 1.48 \n", + "1.11 1.16 \n", + "None 4.27 \n", + "None 4.27 \n", + "None 4.27 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "None 1.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "None 2.28 \n", + "-0.46 14.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 7.71 \n", + "-3.11 9.8 \n", + "-3.04 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.33 9.79 \n", + "1.83 0.5 \n", + "10000000.0 10000000.0 \n", + "None 2.96 \n", + "None 2.96 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 0.39 \n", + "-11.19 0.53 \n", + "None 1.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-223.73 8.84 \n", + "-11.23 18.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "None 1.06 \n", + "10000000.0 10000000.0 \n", + "None 2.15 \n", + "None 2.15 \n", + "-2.0 0.44 \n", + "None 2.01 \n", + "None 2.01 \n", + "-5.98 1.16 \n", + "-31.87 1.48 \n", + "-5.98 1.16 \n", + "-11.55 1.46 \n", + "-31.87 1.48 \n", + "-11.55 1.46 \n", + "-31.88 1.48 \n", + "-5.98 1.16 \n", + "-11.56 1.46 \n", + "-6.34 0.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.84 \n", + "-5.54 1.2 \n", + "None 2.84 \n", + "None 0.71 \n", + "None 0.71 \n", + "-20.31 2.54 \n", + "0.83 1.13 \n", + "-6.09 1.45 \n", + "-2.78 0.75 \n", + "4.95 1.33 \n", + "-0.74 0.39 \n", + "10000000.0 10000000.0 \n", + "-2.79 0.87 \n", + "-0.26 0.41 \n", + "-2.99 0.87 \n", + "-0.6 0.28 \n", + "7.45 0.1 \n", + "-0.75 1.0 \n", + "7.46 0.13 \n", + "-4.93 0.87 \n", + "0.37 0.42 \n", + "4.0 0.5 \n", + "-0.65 1.16 \n", + "-5.07 0.71 \n", + "-6.69 0.71 \n", + "0.24 1.08 \n", + "-0.73 4.44 \n", + "2.69 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.92 0.65 \n", + "-105.77 1.22 \n", + "1.01 0.76 \n", + "1.01 0.76 \n", + "-7.84 1.14 \n", + "10.22 4.94 \n", + "13.43 1.51 \n", + "-8.67 0.3 \n", + "-8.66 0.3 \n", + "-11.02 0.35 \n", + "-2.62 0.35 \n", + "-16.17 4.49 \n", + "-0.27 0.55 \n", + "0.06 0.41 \n", + "8.39 0.99 \n", + "-49.25 0.53 \n", + "-3.62 0.45 \n", + "-3.62 0.46 \n", + "1.17 0.54 \n", + "3.48 0.52 \n", + "9.23 0.84 \n", + "-2.7 1.11 \n", + "-82.32 0.78 \n", + "-4.45 0.68 \n", + "-2.81 0.3 \n", + "-35.35 1.1 \n", + "-2.93 1.07 \n", + "None None \n", + "-10.65 0.48 \n", + "-0.66 0.13 \n", + "-16.31 1.05 \n", + "3.55 0.75 \n", + "0.75 0.52 \n", + "4.52 1.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-96.63 0.76 \n", + "4.52 1.9 \n", + "13.27 0.43 \n", + "-32.0 1.07 \n", + "-3.04 0.42 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "6.62 0.66 \n", + "-6.81 0.68 \n", + "2.6 0.65 \n", + "-5.41 0.78 \n", + "-24.42 1.36 \n", + "-14.34 0.96 \n", + "-1.07 0.42 \n", + "-0.02 0.21 \n", + "-1.26 0.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.77 0.45 \n", + "0.13 0.71 \n", + "-5.85 0.66 \n", + "-5.22 0.64 \n", + "-3.58 1.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.13 4.62 \n", + "-14.11 1.64 \n", + "-75.64 1.39 \n", + "-60.57 1.36 \n", + "-7.65 0.5 \n", + "-9.93 0.51 \n", + "-3.47 0.14 \n", + "4.42 0.11 \n", + "8.09 0.14 \n", + "-2.69 0.15 \n", + "-10.58 0.13 \n", + "-1.9 0.57 \n", + "5.02 0.34 \n", + "-1.0 0.09 \n", + "-6.8 0.8 \n", + "-1.43 0.41 \n", + "-1.42 0.41 \n", + "-33.15 1.09 \n", + "-5.49 0.55 \n", + "5.63 0.42 \n", + "5.64 0.42 \n", + "-6.03 0.43 \n", + "2.54 0.77 \n", + "-0.8 0.28 \n", + "0.63 0.42 \n", + "10000000.0 10000000.0 \n", + "0.91 1.09 \n", + "10000000.0 10000000.0 \n", + "-7.77 1.09 \n", + "-8.27 0.89 \n", + "-4.96 0.94 \n", + "2.7 0.9 \n", + "3.15 0.9 \n", + "-5.81 0.93 \n", + "0.07 0.35 \n", + "-3.56 0.59 \n", + "-4.84 0.92 \n", + "-1.62 0.08 \n", + "10000000.0 10000000.0 \n", + "2.42 0.49 \n", + "-0.94 0.88 \n", + "-0.69 0.44 \n", + "-4.96 0.89 \n", + "-2.2 0.94 \n", + "-5.49 0.18 \n", + "1.97 0.32 \n", + "-4.12 0.71 \n", + "-7.69 1.9 \n", + "-16.38 1.81 \n", + "-11.34 1.48 \n", + "-3.74 0.72 \n", + "-3.32 0.72 \n", + "-2.42 0.72 \n", + "1.11 0.89 \n", + "-0.95 0.77 \n", + "-5.39 0.58 \n", + "-6.62 0.61 \n", + "-6.62 0.61 \n", + "5.63 0.54 \n", + "1.27 0.18 \n", + "-4.38 0.94 \n", + "-0.22 0.7 \n", + "10000000.0 10000000.0 \n", + "-1.74 0.69 \n", + "-2.0 0.32 \n", + "10.92 1.31 \n", + "-7.0 1.03 \n", + "-0.9 1.3 \n", + "2.45 0.94 \n", + "-11.67 1.68 \n", + "10000000.0 10000000.0 \n", + "-69.98 3.1 \n", + "-69.98 3.1 \n", + "-69.98 3.1 \n", + "-69.98 3.1 \n", + "-2.51 0.49 \n", + "-2.96 0.46 \n", + "-16.31 2.37 \n", + "0.4 0.31 \n", + "-6.69 1.09 \n", + "-6.68 1.09 \n", + "5.59 0.71 \n", + "10000000.0 10000000.0 \n", + "0.42 1.07 \n", + "74.39 5.31 \n", + "10000000.0 10000000.0 \n", + "-0.61 18.03 \n", + "-40.66 3.32 \n", + "2.9 0.34 \n", + "-2.67 0.35 \n", + "-6.3 0.45 \n", + "-12.38 2.0 \n", + "-20.02 4.44 \n", + "-7.96 0.54 \n", + "-14.32 0.38 \n", + "-26.77 1.4 \n", + "-105.96 0.91 \n", + "-108.62 1.19 \n", + "-108.62 1.2 \n", + "-75.63 1.39 \n", + "-61.57 1.37 \n", + "-16.11 1.89 \n", + "-2.28 0.8 \n", + "-2.27 0.8 \n", + "-83.04 6.34 \n", + "-49.25 0.53 \n", + "-5.42 0.49 \n", + "0.35 0.57 \n", + "-0.1 0.41 \n", + "2.18 0.45 \n", + "-2.18 0.45 \n", + "1.55 0.36 \n", + "-11.99 1.04 \n", + "10000000.0 10000000.0 \n", + "-5.9 1.0 \n", + "4.05 1.05 \n", + "19.23 1.8 \n", + "-7.31 0.92 \n", + "-1.3 0.22 \n", + "-22.2 1.44 \n", + "-17.84 0.67 \n", + "-17.84 0.67 \n", + "10000000.0 10000000.0 \n", + "-8.68 0.57 \n", + "-5.85 0.61 \n", + "-3.78 0.56 \n", + "-0.57 0.71 \n", + "-2.38 0.57 \n", + "-5.59 0.72 \n", + "-9.31 0.58 \n", + "-1.0 0.77 \n", + "-11.22 0.71 \n", + "-8.88 3.73 \n", + "-0.45 0.66 \n", + "-2.53 0.67 \n", + "-16.55 8.5 \n", + "10000000.0 10000000.0 \n", + "-4.67 0.75 \n", + "9.54 1.03 \n", + "0.05 0.47 \n", + "10000000.0 10000000.0 \n", + "43.42 1.35 \n", + "7.41 0.82 \n", + "16.82 0.79 \n", + "-16.17 3.95 \n", + "5.14 0.58 \n", + "-26.58 1.17 \n", + "1.08 0.23 \n", + "-7.54 0.79 \n", + "-9.68 2.26 \n", + "-9.68 2.23 \n", + "-6.3 1.01 \n", + "-139.01 2.21 \n", + "-9.13 1.52 \n", + "-2.65 1.79 \n", + "6.33 0.5 \n", + "-21.62 2.52 \n", + "-22.86 1.25 \n", + "-25.4 1.14 \n", + "0.08 0.71 \n", + "-0.55 0.74 \n", + "-10.37 0.91 \n", + "-11.44 1.1 \n", + "-3.79 0.74 \n", + "0.23 0.41 \n", + "-2.04 0.21 \n", + "6.51 0.83 \n", + "-3.8 5.25 \n", + "-1.02 0.8 \n", + "2.58 0.84 \n", + "0.18 0.71 \n", + "-75.34 1.36 \n", + "5.16 1.04 \n", + "-3.01 2.69 \n", + "-3.01 2.69 \n", + "-2.95 0.47 \n", + "-6.53 1.15 \n", + "-85.51 1.71 \n", + "-8.41 0.61 \n", + "-6.76 0.73 \n", + "-2.46 0.78 \n", + "4.93 0.79 \n", + "4.23 0.22 \n", + "4.94 0.79 \n", + "0.63 0.76 \n", + "7.82 0.41 \n", + "7.82 0.42 \n", + "-4.47 0.16 \n", + "9.69 0.93 \n", + "9.69 0.93 \n", + "-3.08 0.83 \n", + "-12.08 0.38 \n", + "-0.33 0.4 \n", + "-3.29 0.51 \n", + "-2.66 0.52 \n", + "3.6 0.35 \n", + "3.6 0.35 \n", + "1.17 0.41 \n", + "4.87 0.29 \n", + "-2.78 0.78 \n", + "-0.24 0.5 \n", + "10000000.0 10000000.0 \n", + "3.8 0.94 \n", + "-27.92 1.39 \n", + "-0.95 0.43 \n", + "-8.11 1.09 \n", + "5.36 0.42 \n", + "5.37 0.41 \n", + "-6.11 1.15 \n", + "-6.34 1.32 \n", + "5.51 0.46 \n", + "3.57 0.41 \n", + "3.57 0.41 \n", + "2.67 0.47 \n", + "2.77 0.26 \n", + "-4.55 7.17 \n", + "-4.55 7.16 \n", + "-91.28 4.02 \n", + "13.67 0.56 \n", + "-2.64 0.46 \n", + "-3.61 5.41 \n", + "-3.61 5.41 \n", + "-3.61 5.41 \n", + "10000000.0 10000000.0 \n", + "0.98 0.55 \n", + "1.88 1.41 \n", + "3.76 7.12 \n", + "-91.28 4.43 \n", + "-91.28 4.08 \n", + "-91.28 4.1 \n", + "4.63 0.51 \n", + "2.14 0.18 \n", + "-10.51 0.53 \n", + "-17.48 0.57 \n", + "0.64 0.48 \n", + "4.62 0.68 \n", + "0.53 0.21 \n", + "0.12 0.21 \n", + "0.53 0.22 \n", + "0.12 0.22 \n", + "-94.53 0.78 \n", + "-1.1 0.49 \n", + "-40.89 0.35 \n", + "-3.49 0.69 \n", + "-3.63 0.58 \n", + "-2.67 0.69 \n", + "-3.22 0.8 \n", + "-2.82 0.75 \n", + "-4.36 0.77 \n", + "21.15 5.73 \n", + "-12.92 1.54 \n", + "-9.67 0.58 \n", + "10000000.0 10000000.0 \n", + "0.61 0.58 \n", + "5.92 0.59 \n", + "-0.75 1.28 \n", + "-2.66 0.8 \n", + "-14.82 4.59 \n", + "2.16 0.26 \n", + "2.8 0.3 \n", + "-28.93 1.06 \n", + "2.79 0.29 \n", + "-3.17 0.32 \n", + "-3.71 0.52 \n", + "-19.3 1.66 \n", + "1.3 1.08 \n", + "0.13 0.32 \n", + "-3.32 0.45 \n", + "-3.8 0.27 \n", + "-107.99 1.21 \n", + "-4.72 0.95 \n", + "3.25 0.05 \n", + "-9.41 0.09 \n", + "-8.76 5.39 \n", + "0.64 1.03 \n", + "-2.11 0.94 \n", + "-3.17 1.18 \n", + "1.81 5.07 \n", + "2.2 0.33 \n", + "-3.72 0.43 \n", + "0.79 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.84 0.51 \n", + "4.65 0.23 \n", + "-2.53 0.45 \n", + "4.75 0.65 \n", + "0.17 0.28 \n", + "-5.73 0.6 \n", + "-5.7 0.6 \n", + "7.34 0.62 \n", + "4.57 0.32 \n", + "-0.32 0.94 \n", + "-3.4 0.63 \n", + "-6.58 1.59 \n", + "-1.76 0.52 \n", + "-25.72 1.11 \n", + "4.4 0.53 \n", + "-4.91 0.7 \n", + "-139.17 1.04 \n", + "-20.79 1.5 \n", + "-2.99 0.44 \n", + "-6.35 5.35 \n", + "-0.46 3.19 \n", + "0.2 0.43 \n", + "-10.46 4.99 \n", + "6.25 0.5 \n", + "-2.69 0.63 \n", + "0.43 0.71 \n", + "-0.25 0.71 \n", + "-2.1 0.3 \n", + "4.27 0.24 \n", + "-6.02 0.56 \n", + "-14.03 4.4 \n", + "-24.51 1.0 \n", + "10000000.0 10000000.0 \n", + "-5.78 0.39 \n", + "-8.14 0.89 \n", + "1.86 0.82 \n", + "-2.58 0.85 \n", + "19.65 0.79 \n", + "19.65 0.79 \n", + "-0.17 0.71 \n", + "10000000.0 10000000.0 \n", + "-2.93 0.34 \n", + "-4.36 7.2 \n", + "-2.69 0.35 \n", + "-6.11 0.45 \n", + "-0.02 0.55 \n", + "-0.42 0.86 \n", + "-1.09 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.68 1.08 \n", + "-1.86 0.46 \n", + "-3.9 0.57 \n", + "-7.42 1.34 \n", + "-105.96 0.91 \n", + "-2.04 0.72 \n", + "-39.75 1.06 \n", + "-14.28 2.42 \n", + "-2.91 0.79 \n", + "-2.78 0.74 \n", + "-2.81 0.57 \n", + "-3.35 0.56 \n", + "3.8 0.92 \n", + "-3.54 0.71 \n", + "-19.2 5.33 \n", + "-19.2 5.33 \n", + "1.21 0.82 \n", + "4.19 0.29 \n", + "4.19 0.3 \n", + "4.3 0.88 \n", + "4.62 0.58 \n", + "-1.52 0.42 \n", + "-8.21 0.36 \n", + "0.32 0.5 \n", + "5.59 0.6 \n", + "-10.95 0.49 \n", + "4.56 0.55 \n", + "9.09 1.94 \n", + "-16.1 1.54 \n", + "-26.84 4.68 \n", + "-0.46 1.86 \n", + "-1.06 0.41 \n", + "-18.13 0.71 \n", + "10000000.0 10000000.0 \n", + "-40.23 3.83 \n", + "52.66 6.26 \n", + "368.95 1.39 \n", + "-6.17 0.87 \n", + "-46.99 1.58 \n", + "-36.19 1.56 \n", + "3.81 0.46 \n", + "3.81 0.46 \n", + "-5.31 0.4 \n", + "-10.27 0.63 \n", + "-10.46 4.94 \n", + "0.21 0.71 \n", + "5.01 0.41 \n", + "0.11 0.47 \n", + "0.04 0.48 \n", + "-5.46 0.91 \n", + "-1.84 0.91 \n", + "-0.68 0.41 \n", + "-18.13 0.71 \n", + "-39.81 1.3 \n", + "10000000.0 10000000.0 \n", + "-36.37 1.84 \n", + "-22.74 4.57 \n", + "-2.51 0.32 \n", + "-3.65 0.32 \n", + "-61.19 1.37 \n", + "-61.2 1.37 \n", + "-1.88 0.46 \n", + "-104.2 2.06 \n", + "2.22 0.51 \n", + "-5.08 0.75 \n", + "0.48 0.41 \n", + "0.48 0.43 \n", + "-4.66 0.35 \n", + "-1.01 0.39 \n", + "0.38 0.45 \n", + "1.97 0.45 \n", + "-0.18 0.44 \n", + "-3.81 0.62 \n", + "-2.35 0.62 \n", + "0.2 0.71 \n", + "-3.44 0.67 \n", + "-5.5 0.72 \n", + "0.59 0.63 \n", + "-0.66 0.71 \n", + "-6.75 0.63 \n", + "-3.41 0.78 \n", + "-4.69 1.0 \n", + "-0.04 0.31 \n", + "-3.07 0.3 \n", + "-9.1 0.61 \n", + "-10.56 0.71 \n", + "-3.09 0.3 \n", + "-5.31 1.13 \n", + "-27.53 5.1 \n", + "-37.03 1.52 \n", + "-1.7 8.5 \n", + "108.57 6.19 \n", + "-6.02 0.56 \n", + "-1.7 5.49 \n", + "-9.26 0.61 \n", + "2.58 0.41 \n", + "-40.98 1.18 \n", + "1.84 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.69 1.08 \n", + "-66.85 2.04 \n", + "11.86 1.31 \n", + "10.94 1.06 \n", + "17.1 1.06 \n", + "-5.6 0.54 \n", + "0.48 0.63 \n", + "2.96 2.87 \n", + "2.01 1.46 \n", + "5.17 0.59 \n", + "-0.54 0.83 \n", + "-6.74 5.2 \n", + "-8.88 3.98 \n", + "2.67 0.5 \n", + "-3.13 0.83 \n", + "-22.49 1.11 \n", + "-4.99 0.43 \n", + "-4.94 0.57 \n", + "-7.22 0.58 \n", + "-6.74 5.1 \n", + "-100.17 3.73 \n", + "-4.36 6.18 \n", + "-1.46 5.66 \n", + "-14.03 5.84 \n", + "-120.41 3.78 \n", + "-1.5 0.52 \n", + "-4.25 0.89 \n", + "-3.67 2.95 \n", + "-3.67 2.97 \n", + "-22.57 1.11 \n", + "-10.46 5.4 \n", + "-0.28 0.38 \n", + "-96.63 0.76 \n", + "-3.88 0.56 \n", + "10000000.0 10000000.0 \n", + "-1.64 0.42 \n", + "-2.63 0.35 \n", + "-3.61 5.5 \n", + "7.37 0.85 \n", + "-24.35 1.32 \n", + "-1.34 0.85 \n", + "1.86 1.01 \n", + "5.24 0.3 \n", + "5.24 0.29 \n", + "-19.84 1.97 \n", + "8.28 1.83 \n", + "10000000.0 10000000.0 \n", + "4.52 1.9 \n", + "10000000.0 10000000.0 \n", + "-102.22 0.86 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "-4.52 1.9 \n", + "2.92 0.34 \n", + "-1.97 0.56 \n", + "451.42 1.97 \n", + "451.42 1.97 \n", + "1.51 0.33 \n", + "-12.96 8.73 \n", + "1.55 0.33 \n", + "-7.67 0.33 \n", + "-1.92 0.36 \n", + "-84.15 1.83 \n", + "-3.12 0.44 \n", + "-28.78 1.13 \n", + "4.32 0.77 \n", + "4.33 0.76 \n", + "-3.95 0.81 \n", + "-3.31 0.87 \n", + "-3.83 0.89 \n", + "1.04 0.68 \n", + "-3.28 0.51 \n", + "5.22 6.14 \n", + "5.22 6.12 \n", + "-12.79 0.99 \n", + "-104.49 1.31 \n", + "-104.49 1.31 \n", + "-1.14 1.13 \n", + "0.69 1.32 \n", + "7.72 0.37 \n", + "7.72 0.36 \n", + "2.47 0.51 \n", + "4.44 0.36 \n", + "4.73 0.71 \n", + "4.73 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.13 3.39 \n", + "-1.98 0.41 \n", + "-4.17 0.75 \n", + "0.12 0.49 \n", + "1.98 0.16 \n", + "-2.46 0.54 \n", + "0.05 0.47 \n", + "-1.87 0.44 \n", + "-9.56 0.3 \n", + "-12.39 0.79 \n", + "8.72 0.83 \n", + "0.56 0.71 \n", + "-0.99 0.81 \n", + "-0.55 0.71 \n", + "21.38 1.65 \n", + "2.82 1.79 \n", + "1.37 0.6 \n", + "-14.18 1.82 \n", + "-4.87 0.41 \n", + "-29.55 1.49 \n", + "6.11 1.17 \n", + "-3.68 0.71 \n", + "1.24 0.74 \n", + "3.6 0.58 \n", + "2.57 0.71 \n", + "-10.89 2.96 \n", + "11.78 1.79 \n", + "-17.94 1.79 \n", + "10.04 4.53 \n", + "0.61 0.3 \n", + "10000000.0 10000000.0 \n", + "-59.61 3.21 \n", + "-45.31 3.93 \n", + "-242.37 1.84 \n", + "2.33 1.14 \n", + "-44.58 2.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.52 1.34 \n", + "1.52 1.23 \n", + "-7.68 1.23 \n", + "-6.06 0.47 \n", + "1.02 0.58 \n", + "-5.12 0.95 \n", + "-1.2 0.77 \n", + "-1.2 0.77 \n", + "-6.45 0.31 \n", + "0.29 0.3 \n", + "-4.39 0.9 \n", + "-81.83 1.55 \n", + "-90.25 1.72 \n", + "4.59 0.71 \n", + "0.89 0.62 \n", + "4.0 0.62 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "0.29 0.41 \n", + "0.39 0.26 \n", + "0.4 0.27 \n", + "-14.03 7.53 \n", + "121.58 10.2 \n", + "1.07 0.36 \n", + "1.07 0.37 \n", + "-106.63 0.94 \n", + "-106.64 0.95 \n", + "-97.88 0.83 \n", + "-13.39 1.07 \n", + "1.14 1.19 \n", + "-83.66 3.85 \n", + "-14.56 4.33 \n", + "-10.53 1.69 \n", + "4.74 0.71 \n", + "-2.89 0.54 \n", + "-5.09 0.53 \n", + "-3.84 0.67 \n", + "-3.11 0.57 \n", + "-32.0 1.07 \n", + "0.38 0.54 \n", + "-8.21 0.46 \n", + "-5.95 0.75 \n", + "0.73 1.88 \n", + "-4.36 5.35 \n", + "0.64 0.74 \n", + "-3.55 0.47 \n", + "-22.58 1.11 \n", + "-105.96 0.91 \n", + "-10.46 5.08 \n", + "-6.33 0.45 \n", + "-3.83 0.81 \n", + "-10.81 0.83 \n", + "-5.34 12.82 \n", + "-5.3 2.35 \n", + "-5.3 2.35 \n", + "-120.11 4.77 \n", + "5.61 0.41 \n", + "-0.29 0.36 \n", + "-107.91 1.18 \n", + "-4.32 0.83 \n", + "-9.06 0.26 \n", + "-1.5 0.34 \n", + "-1.5 0.34 \n", + "-0.9 0.4 \n", + "-2.37 0.49 \n", + "-1.01 0.39 \n", + "8.74 1.8 \n", + "10000000.0 10000000.0 \n", + "-2.66 0.99 \n", + "-1.22 0.75 \n", + "-5.63 0.68 \n", + "2.3 0.32 \n", + "-4.47 0.57 \n", + "-13.29 1.54 \n", + "-4.23 0.8 \n", + "-112.18 3.85 \n", + "4.52 0.71 \n", + "0.44 0.71 \n", + "1.57 2.05 \n", + "-13.28 2.3 \n", + "-13.9 4.37 \n", + "-4.1 0.59 \n", + "-4.73 0.54 \n", + "-10.01 0.3 \n", + "-2.83 0.3 \n", + "4.34 0.33 \n", + "10000000.0 10000000.0 \n", + "-2.23 0.46 \n", + "10000000.0 10000000.0 \n", + "-18.54 4.46 \n", + "-3.11 4.62 \n", + "0.67 0.41 \n", + "1.03 0.43 \n", + "-2.65 0.55 \n", + "4.77 0.35 \n", + "-105.97 0.91 \n", + "-78.28 12.69 \n", + "-109.84 1.17 \n", + "10000000.0 10000000.0 \n", + "7.54 3.31 \n", + "-42.94 3.91 \n", + "-106.03 0.91 \n", + "-5.64 0.81 \n", + "-5.54 0.61 \n", + "-5.16 0.81 \n", + "3.9 0.44 \n", + "3.77 0.44 \n", + "3.77 0.45 \n", + "-23.98 1.19 \n", + "-13.95 1.6 \n", + "1.37 0.71 \n", + "4.89 0.24 \n", + "14.27 0.34 \n", + "0.08 0.43 \n", + "-4.68 0.75 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "-94.13 0.75 \n", + "4.15 0.54 \n", + "4.56 0.71 \n", + "-8.51 0.94 \n", + "0.07 0.93 \n", + "-0.28 0.37 \n", + "-0.28 0.38 \n", + "-3.38 0.51 \n", + "10000000.0 10000000.0 \n", + "-5.33 0.43 \n", + "-5.45 0.45 \n", + "0.7 0.48 \n", + "-5.16 0.47 \n", + "-130.52 1.26 \n", + "6.88 1.2 \n", + "-2.66 0.8 \n", + "0.98 0.39 \n", + "0.98 0.39 \n", + "10000000.0 10000000.0 \n", + "-2.95 0.65 \n", + "3.21 0.66 \n", + "0.68 0.57 \n", + "0.68 0.57 \n", + "-93.72 0.79 \n", + "-2.98 0.53 \n", + "10000000.0 10000000.0 \n", + "-40.7 3.32 \n", + "-2.86 0.34 \n", + "14.55 1.34 \n", + "0.8 1.26 \n", + "-45.32 1.28 \n", + "-5.76 1.84 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "-108.67 1.04 \n", + "-62.5 1.36 \n", + "-93.42 1.04 \n", + "-131.16 1.7 \n", + "-10.01 0.3 \n", + "-4.1 0.59 \n", + "-4.73 0.54 \n", + "3.96 0.41 \n", + "-4.41 0.41 \n", + "-22.97 1.17 \n", + "5.61 0.71 \n", + "3.96 0.41 \n", + "-22.57 1.11 \n", + "-10.46 5.17 \n", + "-4.36 5.1 \n", + "-91.95 2.55 \n", + "2.26 6.24 \n", + "2.26 6.23 \n", + "-33.61 6.67 \n", + "7.34 1.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.49 0.5 \n", + "9.48 0.71 \n", + "-2.86 0.45 \n", + "3.62 0.93 \n", + "-0.28 0.38 \n", + "-10.95 0.48 \n", + "-94.12 0.77 \n", + "5.31 1.55 \n", + "5.31 1.63 \n", + "-0.28 0.37 \n", + "-83.06 1.82 \n", + "4.35 0.35 \n", + "-5.09 0.81 \n", + "2.53 0.65 \n", + "-3.11 7.4 \n", + "58.79 0.73 \n", + "55.19 1.03 \n", + "-108.64 1.19 \n", + "-108.64 1.2 \n", + "-14.03 2.86 \n", + "-14.28 2.12 \n", + "-8.29 0.26 \n", + "-8.29 0.27 \n", + "-11.89 0.76 \n", + "6.91 0.28 \n", + "2.01 0.36 \n", + "0.01 5.37 \n", + "10000000.0 10000000.0 \n", + "0.48 1.07 \n", + "-6.74 4.71 \n", + "-7.78 2.26 \n", + "-0.71 0.71 \n", + "-4.92 0.91 \n", + "6.23 0.41 \n", + "4.44 0.24 \n", + "-0.28 0.38 \n", + "-6.17 0.81 \n", + "-3.35 0.3 \n", + "-105.95 0.91 \n", + "10000000.0 10000000.0 \n", + "-14.34 2.93 \n", + "2.42 0.41 \n", + "-14.44 1.08 \n", + "7.53 1.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.18 0.36 \n", + "-3.78 0.75 \n", + "12.24 0.62 \n", + "9.31 0.43 \n", + "12.85 1.33 \n", + "-11.67 0.39 \n", + "4.52 1.9 \n", + "4.52 1.9 \n", + "4.89 0.24 \n", + "-22.57 1.11 \n", + "-3.07 0.91 \n", + "6.47 0.46 \n", + "-2.24 0.46 \n", + "-14.03 5.98 \n", + "-14.03 5.98 \n", + "1.0 0.47 \n", + "-2.52 0.88 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "-1.55 9.81 \n", + "206.04 1.44 \n", + "-23.06 1.5 \n", + "5.6 0.74 \n", + "-8.66 0.26 \n", + "-62.51 1.36 \n", + "40.38 1.05 \n", + "-2.88 0.84 \n", + "0.09 1.0 \n", + "-81.78 0.97 \n", + "10.26 0.76 \n", + "0.01 5.36 \n", + "-5.26 0.57 \n", + "-59.93 1.53 \n", + "-29.45 3.3 \n", + "-20.64 5.15 \n", + "-12.1 0.51 \n", + "-2.66 0.8 \n", + "-73.9 4.41 \n", + "-2.93 0.75 \n", + "-30.44 1.25 \n", + "10000000.0 10000000.0 \n", + "-5.49 0.8 \n", + "-8.68 0.26 \n", + "4.89 0.24 \n", + "4.89 0.25 \n", + "-64.33 1.15 \n", + "4.44 0.24 \n", + "-0.28 0.38 \n", + "-8.68 0.26 \n", + "-8.68 0.27 \n", + "-105.96 0.91 \n", + "-2.66 0.35 \n", + "-1.87 0.46 \n", + "-5.08 0.75 \n", + "-92.1 2.09 \n", + "-2.52 0.49 \n", + "3.64 0.48 \n", + "6.77 0.53 \n", + "-94.39 9.36 \n", + "-1.7 8.11 \n", + "-5.59 0.56 \n", + "-2.85 0.54 \n", + "-65.98 0.52 \n", + "-4.73 0.54 \n", + "10000000.0 10000000.0 \n", + "-2.65 0.53 \n", + "-9.66 0.61 \n", + "424.78 1.34 \n", + "-7.29 0.76 \n", + "-95.07 0.74 \n", + "3.11 0.42 \n", + "-2.3 0.4 \n", + "0.04 0.74 \n", + "-1.83 0.3 \n", + "1.1 0.6 \n", + "-1.79 0.56 \n", + "1.8 0.9 \n", + "-0.4 0.71 \n", + "-2.41 0.57 \n", + "1.45 0.48 \n", + "-5.5 1.35 \n", + "2.91 6.75 \n", + "-4.17 1.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.32 0.59 \n", + "-2.13 0.18 \n", + "0.99 0.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.03 0.68 \n", + "7.04 0.58 \n", + "10000000.0 10000000.0 \n", + "-9.06 0.26 \n", + "4.31 0.75 \n", + "-6.41 1.09 \n", + "None 0.71 \n", + "-11.96 0.72 \n", + "1.72 0.59 \n", + "-4.11 0.46 \n", + "-51.89 4.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.49 0.35 \n", + "-25.6 4.67 \n", + "10000000.0 10000000.0 \n", + "-9.13 0.43 \n", + "10000000.0 10000000.0 \n", + "-2.78 1.11 \n", + "-6.07 0.85 \n", + "-8.67 0.27 \n", + "-19.41 2.26 \n", + "0.75 6.86 \n", + "10000000.0 10000000.0 \n", + "-101.03 1.21 \n", + "-5.82 0.35 \n", + "10000000.0 10000000.0 \n", + "-17.98 6.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.98 3.43 \n", + "10000000.0 10000000.0 \n", + "-6.81 7.13 \n", + "-2717.63 13.15 \n", + "59.6 3.61 \n", + "428.93 2.83 \n", + "10000000.0 10000000.0 \n", + "-3.04 0.42 \n", + "10000000.0 10000000.0 \n", + "-25.07 7.01 \n", + "-1.83 1.43 \n", + "10000000.0 10000000.0 \n", + "-1.7 14.66 \n", + "12.13 11.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-108.89 1.4 \n", + "-0.02 None \n", + "7.19 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "11.73 8.08 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.97 0.32 \n", + "0.7 0.36 \n", + "-22.21 5.67 \n", + "-2.35 0.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 10.21 \n", + "-3.51 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.02 2.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.52 1.9 \n", + "9.16 1.03 \n", + "10000000.0 10000000.0 \n", + "-13.76 1.93 \n", + "10000000.0 10000000.0 \n", + "-3.61 10.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-34.98 9.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.73 0.79 \n", + "-27.3 4.69 \n", + "43.0 4.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "62.96 3.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-108.62 1.19 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.98 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-35.26 2.54 \n", + "10000000.0 10000000.0 \n", + "17.21 0.98 \n", + "-0.22 0.59 \n", + "-58.68 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.62 13.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.13 2.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "32.33 7.76 \n", + "-15.02 0.79 \n", + "107.07 1.82 \n", + "-13.14 7.34 \n", + "10000000.0 10000000.0 \n", + "-17.46 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.23 8.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.18 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.24 0.82 \n", + "-5.72 1.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "45.64 0.86 \n", + "4.45 0.24 \n", + "300.49 0.69 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.0 0.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.06 0.53 \n", + "10000000.0 10000000.0 \n", + "-4.36 7.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.74 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.01 0.3 \n", + "-0.48 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.88 1.29 \n", + "2.83 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "-3.59 0.3 \n", + "10000000.0 10000000.0 \n", + "-3.04 0.42 \n", + "10000000.0 10000000.0 \n", + "89.95 5.4 \n", + "-6.66 0.55 \n", + "10000000.0 10000000.0 \n", + "-17.62 0.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "15.4 1.81 \n", + "10000000.0 10000000.0 \n", + "-62.0 1.72 \n", + "-1.86 0.42 \n", + "-2.78 1.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.52 0.41 \n", + "-5.86 0.43 \n", + "10000000.0 10000000.0 \n", + "-3.88 0.56 \n", + "-230.23 1.28 \n", + "0.93 0.38 \n", + "10000000.0 10000000.0 \n", + "340.91 0.65 \n", + "-51.6 3.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.01 \n", + "10000000.0 10000000.0 \n", + "3.24 0.82 \n", + "10000000.0 10000000.0 \n", + "4.7 0.66 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.66 0.55 \n", + "4.51 1.4 \n", + "9.59 6.0 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.29 1.0 \n", + "10000000.0 10000000.0 \n", + "-16.3 1.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.57 0.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.24 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.87 8.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.22 1.56 \n", + "10000000.0 10000000.0 \n", + "-0.35 0.34 \n", + "10000000.0 10000000.0 \n", + "1.89 0.97 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.38 0.51 \n", + "-4.36 6.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.04 0.55 \n", + "10000000.0 10000000.0 \n", + "-6.02 0.56 \n", + "6.48 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.04 0.55 \n", + "-97.09 8.26 \n", + "0.14 0.76 \n", + "-3.62 0.45 \n", + "10000000.0 10000000.0 \n", + "-5.44 1.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.19 0.32 \n", + "-4.36 5.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 2.32 \n", + "10000000.0 10000000.0 \n", + "-3.8 0.81 \n", + "-1.7 5.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-32.8 5.02 \n", + "10000000.0 10000000.0 \n", + "-0.9 0.51 \n", + "-0.9 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-74.42 4.42 \n", + "1.39 5.33 \n", + "-33.79 2.12 \n", + "10000000.0 10000000.0 \n", + "-108.59 12.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.5 10.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.41 0.47 \n", + "-4.49 0.54 \n", + "-4.36 6.51 \n", + "None 2.19 \n", + "-0.05 0.55 \n", + "-0.05 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.55 0.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.03 \n", + "-277.62 2.51 \n", + "-1.7 5.56 \n", + "509.23 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "-43.86 2.15 \n", + "-86.98 4.5 \n", + "None 3.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.1 0.52 \n", + "-47.15 9.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-75.26 13.55 \n", + "10000000.0 10000000.0 \n", + "-6.35 4.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.88 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.01 None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.47 0.78 \n", + "10000000.0 10000000.0 \n", + "-0.04 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.87 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.34 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "76.63 1.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.78 1.07 \n", + "-14.75 1.07 \n", + "10000000.0 10000000.0 \n", + "3.63 1.99 \n", + "10000000.0 10000000.0 \n", + "-2.4 0.47 \n", + "10000000.0 10000000.0 \n", + "-10.01 0.3 \n", + "10000000.0 10000000.0 \n", + "-91.65 5.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-113.69 2.22 \n", + "3.24 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 7.75 \n", + "-3.87 0.56 \n", + "4.24 5.03 \n", + "2.91 0.38 \n", + "12.09 3.73 \n", + "10000000.0 10000000.0 \n", + "-118.53 1.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.24 0.82 \n", + "10000000.0 10000000.0 \n", + "-1.95 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "44.54 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.77 6.14 \n", + "-1.31 0.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.12 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.3 0.3 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.51 \n", + "-4.36 5.94 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "14.3 41.52 \n", + "-3.31 0.8 \n", + "-2.25 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.14 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.13 0.75 \n", + "10000000.0 10000000.0 \n", + "-3.77 0.35 \n", + "10000000.0 10000000.0 \n", + "-16.69 7.47 \n", + "10000000.0 10000000.0 \n", + "10.13 10.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.81 4.9 \n", + "3.28 1.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-61.47 1.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-92.12 6.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-36.12 3.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 10.73 \n", + "-2.06 4.54 \n", + "3.69 0.46 \n", + "3.41 0.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "71.86 0.77 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "435.2 3.61 \n", + "3.79 3.58 \n", + "-3.82 1.87 \n", + "10000000.0 10000000.0 \n", + "1.09 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-44.41 6.24 \n", + "-3.04 0.42 \n", + "-95.07 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.53 1.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-25.92 12.94 \n", + "-6.07 1.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "-13.83 5.13 \n", + "-0.46 1.56 \n", + "-0.02 2.94 \n", + "0.08 0.43 \n", + "10000000.0 10000000.0 \n", + "7.06 7.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.18 0.41 \n", + "-81.72 6.51 \n", + "10000000.0 10000000.0 \n", + "-2.59 0.51 \n", + "386.87 6.53 \n", + "-111.09 1.52 \n", + "-0.01 None \n", + "10000000.0 10000000.0 \n", + "-388.95 2.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 1.61 \n", + "10000000.0 10000000.0 \n", + "-14.27 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-152.59 8.9 \n", + "7.06 7.13 \n", + "-12.1 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 5.69 \n", + "10000000.0 10000000.0 \n", + "-45.13 5.91 \n", + "-3.11 5.68 \n", + "-75.62 8.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.42 1.34 \n", + "-0.85 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.12 0.75 \n", + "10000000.0 10000000.0 \n", + "-6.17 0.81 \n", + "-14.03 11.08 \n", + "None None \n", + "-95.44 6.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 4.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.62 2.12 \n", + "10000000.0 10000000.0 \n", + "-94.13 0.75 \n", + "10000000.0 10000000.0 \n", + "12.57 4.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.18 0.36 \n", + "1.51 0.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2592.49 12.48 \n", + "10000000.0 10000000.0 \n", + "-7.49 1.31 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "-2.23 0.53 \n", + "3.49 2.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 7.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.05 6.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.98 6.41 \n", + "-4.36 5.26 \n", + "9.53 11.69 \n", + "-3.75 1.62 \n", + "3.41 8.75 \n", + "-9.11 1.38 \n", + "15.15 9.45 \n", + "-3.88 0.56 \n", + "-107.28 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.29 5.01 \n", + "-1.7 10.43 \n", + "10000000.0 10000000.0 \n", + "-3.56 0.32 \n", + "-17.46 1.06 \n", + "-0.04 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.72 0.41 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "6.0 1.72 \n", + "-26.96 1.29 \n", + "-105.96 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.11 0.69 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.94 1.83 \n", + "10000000.0 10000000.0 \n", + "-14.23 0.81 \n", + "-16.03 4.87 \n", + "-3.88 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.0 5.22 \n", + "10000000.0 10000000.0 \n", + "29.11 6.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "392.62 15.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.9 4.7 \n", + "4.81 1.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 3.59 \n", + "-3.31 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.87 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.1 0.51 \n", + "10000000.0 10000000.0 \n", + "17.49 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.04 0.42 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "13.17 2.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.13 4.36 \n", + "-1.7 4.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.2 1.07 \n", + "10000000.0 10000000.0 \n", + "-4.36 7.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "-1.11 2.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-28.36 5.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.25 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.05 0.55 \n", + "-17.98 5.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.54 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-96.9 8.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.85 0.65 \n", + "-82.85 1.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-136.56 7.46 \n", + "10000000.0 10000000.0 \n", + "-0.4 0.31 \n", + "-79.48 3.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.56 1.29 \n", + "-1.7 10.33 \n", + "10000000.0 10000000.0 \n", + "2.79 3.73 \n", + "10000000.0 10000000.0 \n", + "-0.27 6.14 \n", + "10000000.0 10000000.0 \n", + "3.76 6.75 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "-0.06 0.78 \n", + "10000000.0 10000000.0 \n", + "-0.02 3.18 \n", + "9.21 0.89 \n", + "10000000.0 10000000.0 \n", + "17.5 7.58 \n", + "4.47 0.24 \n", + "10000000.0 10000000.0 \n", + "-0.73 18.69 \n", + "3.0 0.49 \n", + "10000000.0 10000000.0 \n", + "-2.63 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.82 0.44 \n", + "10000000.0 10000000.0 \n", + "-0.52 0.77 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.38 \n", + "10000000.0 10000000.0 \n", + "0.16 0.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-91.39 13.61 \n", + "-2.58 0.3 \n", + "-3.04 0.42 \n", + "6.17 1.0 \n", + "10000000.0 10000000.0 \n", + "-10.94 4.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.5 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.83 0.39 \n", + "108.99 4.83 \n", + "10000000.0 10000000.0 \n", + "-21.34 5.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.72 2.08 \n", + "-2579.51 11.1 \n", + "-0.1 4.7 \n", + "-9.17 0.71 \n", + "-11.13 4.65 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-71.92 4.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 7.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "11.88 1.69 \n", + "10000000.0 10000000.0 \n", + "-105.08 0.81 \n", + "-4.36 6.01 \n", + "10000000.0 10000000.0 \n", + "None 6.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.09 0.46 \n", + "502.54 1.65 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "-17.06 5.77 \n", + "-61.18 1.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-117.67 4.24 \n", + "10000000.0 10000000.0 \n", + "124.71 0.38 \n", + "-12.51 1.03 \n", + "-2.2 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "18.27 7.19 \n", + "10000000.0 10000000.0 \n", + "-38.35 0.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.25 1.41 \n", + "-55.35 7.83 \n", + "10000000.0 10000000.0 \n", + "422.26 3.2 \n", + "9.21 6.69 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.4 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.94 4.77 \n", + "-45.31 3.93 \n", + "-14.27 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.45 1.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.73 7.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.68 0.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "14.26 3.22 \n", + "10000000.0 10000000.0 \n", + "None 3.45 \n", + "10000000.0 10000000.0 \n", + "9.21 6.67 \n", + "10000000.0 10000000.0 \n", + "0.13 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.52 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-62.68 1.27 \n", + "10000000.0 10000000.0 \n", + "-122.88 2.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.55 5.03 \n", + "-16.87 0.62 \n", + "10000000.0 10000000.0 \n", + "31.45 6.33 \n", + "None 4.41 \n", + "-20.64 6.86 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.09 1.32 \n", + "10000000.0 10000000.0 \n", + "0.38 0.54 \n", + "10000000.0 10000000.0 \n", + "0.38 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-33.2 12.91 \n", + "2.86 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 7.58 \n", + "19.48 6.85 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "-2.63 0.42 \n", + "None None \n", + "-94.39 6.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.26 0.3 \n", + "10000000.0 10000000.0 \n", + "None 1.54 \n", + "10000000.0 10000000.0 \n", + "-35.26 2.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-61.57 1.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 8.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.09 4.32 \n", + "10000000.0 10000000.0 \n", + "0.14 0.96 \n", + "10000000.0 10000000.0 \n", + "-4.32 0.3 \n", + "-4.32 0.3 \n", + "-4.32 0.3 \n", + "10000000.0 10000000.0 \n", + "2.54 0.77 \n", + "2.54 0.77 \n", + "10000000.0 10000000.0 \n", + "2.54 0.77 \n", + "2.54 0.77 \n", + "-0.95 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.62 1.19 \n", + "-17.46 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.79 0.35 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "3.85 0.33 \n", + "10000000.0 10000000.0 \n", + "1.07 1.04 \n", + "10000000.0 10000000.0 \n", + "0.07 0.13 \n", + "0.07 0.13 \n", + "-0.01 0.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.03 0.08 \n", + "5.03 0.08 \n", + "-60.57 0.79 \n", + "-60.57 0.79 \n", + "-8.68 0.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-24.76 1.8 \n", + "-24.76 1.8 \n", + "-7.54 3.31 \n", + "10000000.0 10000000.0 \n", + "-7.24 0.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-3.45 0.69 \n", + "-1.34 0.85 \n", + "0.07 0.38 \n", + "0.51 0.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.89 0.92 \n", + "-1.42 0.64 \n", + "10000000.0 10000000.0 \n", + "57.71 0.34 \n", + "10000000.0 10000000.0 \n", + "-3.99 0.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.48 0.57 \n", + "-6.08 1.02 \n", + "10000000.0 10000000.0 \n", + "-14.11 1.64 \n", + "-14.11 1.64 \n", + "-14.11 1.64 \n", + "-14.11 1.64 \n", + "-14.11 1.64 \n", + "2.01 0.36 \n", + "1.08 0.23 \n", + "0.45 0.38 \n", + "10000000.0 10000000.0 \n", + "-29.08 1.5 \n", + "-28.93 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.59 0.95 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.34 10.93 \n", + "-0.28 0.38 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "-5.41 0.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.8 0.55 \n", + "10000000.0 10000000.0 \n", + "-18.13 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.24 5.56 \n", + "-1.7 5.69 \n", + "-18.13 0.71 \n", + "-16.92 0.92 \n", + "-16.92 0.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.25 0.1 \n", + "-13.88 0.97 \n", + "-2.41 0.57 \n", + "-0.01 0.43 \n", + "0.03 0.34 \n", + "0.5 0.13 \n", + "-0.21 0.17 \n", + "10000000.0 10000000.0 \n", + "0.56 0.71 \n", + "6.51 0.55 \n", + "6.51 0.55 \n", + "-2.69 0.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.48 0.6 \n", + "5.61 0.71 \n", + "5.61 0.71 \n", + "-23.14 5.89 \n", + "-23.14 5.89 \n", + "-17.84 0.67 \n", + "-1.98 0.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.46 0.54 \n", + "-2.46 0.54 \n", + "10000000.0 10000000.0 \n", + "-4.01 0.11 \n", + "-4.42 0.32 \n", + "-4.2 0.34 \n", + "-4.42 0.32 \n", + "1.82 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.11 1.09 \n", + "-8.11 1.09 \n", + "-8.11 1.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.57 3.6 \n", + "-3.46 0.05 \n", + "-3.46 0.05 \n", + "1.95 0.63 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 3.56 \n", + "-103.9 3.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.02 0.8 \n", + "10000000.0 10000000.0 \n", + "-14.37 1.78 \n", + "-16.14 1.75 \n", + "336.9 1.05 \n", + "10000000.0 10000000.0 \n", + "-31.87 1.48 \n", + "10000000.0 10000000.0 \n", + "-31.87 1.48 \n", + "10000000.0 10000000.0 \n", + "-8.79 0.73 \n", + "34.51 1.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.9 0.35 \n", + "-7.18 0.58 \n", + "-6.77 0.58 \n", + "-6.45 0.31 \n", + "-6.75 0.63 \n", + "-5.48 0.31 \n", + "10000000.0 10000000.0 \n", + "-5.89 0.56 \n", + "-6.9 0.35 \n", + "-7.18 0.58 \n", + "-6.77 0.58 \n", + "-6.45 0.31 \n", + "-6.75 0.63 \n", + "-5.48 0.31 \n", + "10000000.0 10000000.0 \n", + "-5.89 0.56 \n", + "-6.9 0.35 \n", + "-7.18 0.58 \n", + "-6.77 0.58 \n", + "-6.45 0.31 \n", + "-6.75 0.63 \n", + "-5.48 0.31 \n", + "10000000.0 10000000.0 \n", + "-5.89 0.56 \n", + "-6.9 0.35 \n", + "-7.18 0.58 \n", + "-6.77 0.58 \n", + "-6.45 0.31 \n", + "-6.75 0.63 \n", + "-5.48 0.31 \n", + "10000000.0 10000000.0 \n", + "-5.89 0.56 \n", + "-6.9 0.35 \n", + "-7.18 0.58 \n", + "-6.77 0.58 \n", + "-6.45 0.31 \n", + "-6.75 0.63 \n", + "-5.48 0.31 \n", + "10000000.0 10000000.0 \n", + "-5.89 0.56 \n", + "-6.9 0.35 \n", + "-7.18 0.58 \n", + "-6.77 0.58 \n", + "-6.45 0.31 \n", + "-5.56 0.33 \n", + "-6.75 0.63 \n", + "-5.48 0.31 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-5.89 0.56 \n", + "-6.9 0.35 \n", + "-7.18 0.58 \n", + "-6.77 0.58 \n", + "-6.45 0.31 \n", + "-5.56 0.33 \n", + "-6.75 0.63 \n", + "-5.48 0.31 \n", + "10000000.0 10000000.0 \n", + "-3.17 0.32 \n", + "-6.26 2.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.06 0.39 \n", + "3.51 1.0 \n", + "10000000.0 10000000.0 \n", + "4.42 0.11 \n", + "4.42 0.11 \n", + "0.34 0.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.49 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "84.83 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.19 0.49 \n", + "13.69 0.86 \n", + "6.33 0.5 \n", + "-7.54 0.79 \n", + "-2.84 0.54 \n", + "-2.84 0.54 \n", + "-1.38 0.78 \n", + "-1.38 0.78 \n", + "-0.28 0.37 \n", + "-0.28 0.37 \n", + "-0.28 0.37 \n", + "1.04 0.4 \n", + "-3.12 0.38 \n", + "-6.24 0.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.16 5.63 \n", + "-7.06 7.4 \n", + "-7.06 7.35 \n", + "-7.06 7.31 \n", + "-15.16 5.55 \n", + "-15.16 5.5 \n", + "-1.14 0.86 \n", + "-1.14 0.86 \n", + "-1.14 0.86 \n", + "-1.14 0.86 \n", + "-4.89 0.24 \n", + "-4.89 0.24 \n", + "-4.89 0.24 \n", + "-4.89 0.24 \n", + "-117.42 1.16 \n", + "-117.42 1.16 \n", + "-4.89 0.24 \n", + "-4.89 0.24 \n", + "-4.89 0.24 \n", + "-4.89 0.24 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-95.07 0.74 \n", + "-95.07 0.74 \n", + "-6.46 0.32 \n", + "0.34 0.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-36.25 1.41 \n", + "0.11 0.57 \n", + "0.5 1.05 \n", + "-3.52 0.33 \n", + "-2.81 0.3 \n", + "-95.07 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.63 1.66 \n", + "1.63 1.66 \n", + "-2.14 1.9 \n", + "10000000.0 10000000.0 \n", + "1.81 5.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.65 0.46 \n", + "-0.96 1.47 \n", + "-125.69 0.47 \n", + "-3.65 1.11 \n", + "-4.36 1.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.04 0.55 \n", + "10000000.0 10000000.0 \n", + "0.68 6.96 \n", + "0.68 8.27 \n", + "1.63 1.66 \n", + "1.63 1.66 \n", + "-5.97 0.42 \n", + "-6.02 0.56 \n", + "-5.97 0.42 \n", + "-6.02 0.56 \n", + "-1.6 0.39 \n", + "10000000.0 10000000.0 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "-1.7 14.27 \n", + "10000000.0 10000000.0 \n", + "-3.02 0.72 \n", + "-3.02 0.72 \n", + "-97.2 0.8 \n", + "0.45 0.38 \n", + "4.14 0.29 \n", + "4.14 0.29 \n", + "4.14 0.29 \n", + "-0.37 0.39 \n", + "10000000.0 10000000.0 \n", + "-118.19 0.76 \n", + "-118.19 0.76 \n", + "10000000.0 10000000.0 \n", + "-10.46 4.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.54 0.35 \n", + "-15.54 0.35 \n", + "-15.54 0.35 \n", + "-15.54 0.35 \n", + "-18.42 0.78 \n", + "-17.35 5.42 \n", + "-17.35 5.42 \n", + "-3.63 0.41 \n", + "-4.89 0.24 \n", + "-4.89 0.24 \n", + "-4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.89 0.24 \n", + "-4.89 0.24 \n", + "-4.89 0.24 \n", + "-4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "-4.89 0.24 \n", + "-4.89 0.24 \n", + "-4.89 0.24 \n", + "-4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.45 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.59 4.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-104.91 12.08 \n", + "-104.91 12.09 \n", + "10000000.0 10000000.0 \n", + "-104.91 17.25 \n", + "-104.91 17.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.87 5.49 \n", + "-0.87 5.49 \n", + "-0.87 5.63 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.91 0.28 \n", + "-50.97 4.75 \n", + "-50.97 4.75 \n", + "-50.97 4.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.34 0.84 \n", + "-18.75 0.66 \n", + "2218.72 43.34 \n", + "1483.01 15.21 \n", + "1475.79 15.2 \n", + "40.54 0.47 \n", + "0.42 0.27 \n", + "0.42 0.27 \n", + "0.42 0.27 \n", + "0.42 0.27 \n", + "-18.75 0.66 \n", + "-18.75 0.66 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.82 2.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.35 0.81 \n", + "10000000.0 10000000.0 \n", + "-0.89 0.92 \n", + "10000000.0 10000000.0 \n", + "-64.39 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.18 \n", + "None 4.27 \n", + "None 2.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-45.76 3.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.61 7.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 5.54 \n", + "-1.7 5.54 \n", + "-1.7 5.69 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.35 0.3 \n", + "-3.35 0.3 \n", + "-3.35 0.3 \n", + "-3.35 0.3 \n", + "-3.35 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.88 0.24 \n", + "-4.88 0.24 \n", + "-4.88 0.24 \n", + "0.02 0.52 \n", + "-2.1 0.3 \n", + "10000000.0 10000000.0 \n", + "-72.76 0.79 \n", + "-1.63 1.66 \n", + "-1.63 1.66 \n", + "10000000.0 10000000.0 \n", + "-21.65 7.54 \n", + "-21.65 7.55 \n", + "-99.41 1.12 \n", + "1.63 0.71 \n", + "1.63 0.71 \n", + "4.52 1.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.8 5.42 \n", + "-3.8 5.42 \n", + "-4.04 0.7 \n", + "294.32 1.02 \n", + "-3.45 0.48 \n", + "-1.76 0.52 \n", + "-27.09 1.03 \n", + "-2.95 0.65 \n", + "336.89 0.77 \n", + "-3.14 0.71 \n", + "None 4.07 \n", + "-149.31 1.14 \n", + "10000000.0 10000000.0 \n", + "-209.79 0.62 \n", + "-2.84 0.54 \n", + "-2.84 0.54 \n", + "211.92 6.08 \n", + "-1.14 0.86 \n", + "-1.14 0.86 \n", + "-0.64 1.05 \n", + "10000000.0 10000000.0 \n", + "-5.63 0.68 \n", + "-5.63 0.68 \n", + "-5.63 0.68 \n", + "-2.1 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.0 1.55 \n", + "10000000.0 10000000.0 \n", + "-17.0 1.55 \n", + "10000000.0 10000000.0 \n", + "-12.52 0.98 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 3.63 \n", + "None 2.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 1.99 \n", + "None 1.36 \n", + "10000000.0 10000000.0 \n", + "None 2.18 \n", + "None 1.92 \n", + "None 2.31 \n", + "None 2.18 \n", + "10000000.0 10000000.0 \n", + "None 1.4 \n", + "None 1.94 \n", + "None 0.91 \n", + "None 2.18 \n", + "None 2.18 \n", + "None 0.49 \n", + "None 0.62 \n", + "None 0.31 \n", + "None 1.13 \n", + "None 2.18 \n", + "None 1.4 \n", + "None 2.31 \n", + "None 1.4 \n", + "None 1.94 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 3.89 \n", + "None 3.93 \n", + "None 5.37 \n", + "None 4.16 \n", + "10000000.0 10000000.0 \n", + "None 2.91 \n", + "None 2.96 \n", + "None 5.37 \n", + "None 5.54 \n", + "None 7.68 \n", + "None 7.65 \n", + "None 4.16 \n", + "None 5.35 \n", + "None 6.9 \n", + "None 4.41 \n", + "None 4.26 \n", + "None 6.36 \n", + "None 4.17 \n", + "None 4.04 \n", + "None 4.14 \n", + "None 5.06 \n", + "None 5.23 \n", + "None 5.23 \n", + "None 5.54 \n", + "None 4.2 \n", + "None 4.37 \n", + "None 4.37 \n", + "None 4.58 \n", + "None 4.89 \n", + "None 4.5 \n", + "None 1.8 \n", + "None 2.43 \n", + "None 1.8 \n", + "None 0.79 \n", + "None 0.79 \n", + "None 0.96 \n", + "None 3.13 \n", + "None 3.13 \n", + "None 3.13 \n", + "None 3.92 \n", + "None 3.63 \n", + "None 4.47 \n", + "None 4.27 \n", + "None 4.47 \n", + "10000000.0 10000000.0 \n", + "None 1.2 \n", + "10000000.0 10000000.0 \n", + "None 6.91 \n", + "None 6.91 \n", + "None 4.06 \n", + "None 3.63 \n", + "10000000.0 10000000.0 \n", + "13.11 0.65 \n", + "14.27 0.34 \n", + "10000000.0 10000000.0 \n", + "13.11 0.65 \n", + "14.27 0.34 \n", + "-1.67 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.6 1.21 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.26 0.41 \n", + "0.04 0.39 \n", + "0.04 0.39 \n", + "None 4.41 \n", + "0.04 0.39 \n", + "None 4.41 \n", + "-4.11 1.01 \n", + "-4.11 1.01 \n", + "-3.5 1.06 \n", + "-3.5 1.06 \n", + "10000000.0 10000000.0 \n", + "3.48 0.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.64 0.3 \n", + "1.94 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-134.27 6.56 \n", + "-134.27 6.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.49 1.31 \n", + "-16.69 4.11 \n", + "-21.3 4.74 \n", + "-37.91 4.11 \n", + "-1.09 0.99 \n", + "-3.4 0.87 \n", + "10000000.0 10000000.0 \n", + "43.21 0.79 \n", + "2.89 0.73 \n", + "2.14 0.53 \n", + "-6.69 0.5 \n", + "23.94 1.15 \n", + "32.5 1.08 \n", + "31.76 0.96 \n", + "22.93 0.95 \n", + "-3.42 4.82 \n", + "-24.64 4.82 \n", + "2.46 1.44 \n", + "-29.08 1.5 \n", + "-29.08 1.5 \n", + "2.46 1.44 \n", + "2.46 1.44 \n", + "10000000.0 10000000.0 \n", + "-6.35 6.71 \n", + "-33.3 1.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.67 0.36 \n", + "-5.36 0.33 \n", + "-5.36 0.33 \n", + "-4.91 0.32 \n", + "-4.42 0.32 \n", + "-5.36 0.33 \n", + "7.46 0.13 \n", + "-22.94 1.03 \n", + "-25.52 1.12 \n", + "-20.98 1.09 \n", + "-22.94 1.03 \n", + "-22.92 1.14 \n", + "6.09 1.41 \n", + "-25.44 1.48 \n", + "-25.44 1.48 \n", + "-25.44 1.48 \n", + "6.09 1.41 \n", + "6.09 1.41 \n", + "10000000.0 10000000.0 \n", + "-31.87 1.48 \n", + "-31.87 1.48 \n", + "-31.87 1.48 \n", + "10000000.0 10000000.0 \n", + "3.8 4.12 \n", + "-17.42 4.12 \n", + "-18.13 0.71 \n", + "1.15 1.1 \n", + "-3.4 1.14 \n", + "-1.43 1.09 \n", + "-1.46 1.2 \n", + "4.72 1.45 \n", + "4.72 1.45 \n", + "0.59 0.87 \n", + "-7.0 0.72 \n", + "-7.99 0.96 \n", + "-7.0 0.72 \n", + "-7.99 0.96 \n", + "-5.03 0.54 \n", + "-6.02 0.56 \n", + "-7.0 0.72 \n", + "-6.02 0.56 \n", + "-7.0 0.72 \n", + "-3.05 0.9 \n", + "-4.04 0.68 \n", + "-5.03 0.54 \n", + "-4.04 0.68 \n", + "-5.03 0.54 \n", + "-1.08 1.44 \n", + "-2.06 1.16 \n", + "-3.05 0.9 \n", + "-2.06 1.16 \n", + "-3.05 0.9 \n", + "-5.03 0.54 \n", + "-7.0 0.72 \n", + "-6.02 0.56 \n", + "-7.0 0.72 \n", + "-4.04 0.68 \n", + "-5.03 0.54 \n", + "-5.03 0.54 \n", + "-6.02 0.56 \n", + "-4.04 0.68 \n", + "-5.03 0.54 \n", + "-6.02 0.56 \n", + "-5.03 0.54 \n", + "-6.02 0.56 \n", + "-3.05 0.9 \n", + "-4.04 0.68 \n", + "-5.03 0.54 \n", + "-4.04 0.68 \n", + "-5.03 0.54 \n", + "-4.04 0.68 \n", + "-5.03 0.54 \n", + "-6.02 0.56 \n", + "-5.03 0.54 \n", + "-6.02 0.56 \n", + "-2.06 1.16 \n", + "-3.05 0.9 \n", + "-4.04 0.68 \n", + "-3.05 0.9 \n", + "-4.04 0.68 \n", + "-3.05 0.9 \n", + "-4.04 0.68 \n", + "-5.03 0.54 \n", + "-4.04 0.68 \n", + "-5.03 0.54 \n", + "-2.06 1.16 \n", + "-3.05 0.9 \n", + "-4.04 0.68 \n", + "-3.05 0.9 \n", + "-4.04 0.68 \n", + "-7.33 1.11 \n", + "-7.33 1.11 \n", + "0.1 0.42 \n", + "0.1 0.41 \n", + "20.14 4.42 \n", + "-1.08 4.42 \n", + "-1.9 0.73 \n", + "0.35 0.91 \n", + "-1.63 0.41 \n", + "-1.9 0.73 \n", + "0.35 0.91 \n", + "-1.63 0.41 \n", + "-0.24 0.54 \n", + "-16.62 1.47 \n", + "-16.62 1.47 \n", + "-16.62 1.47 \n", + "-16.62 1.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-25.73 1.49 \n", + "-25.73 1.49 \n", + "-25.73 1.49 \n", + "-17.0 1.55 \n", + "-17.0 1.55 \n", + "-17.0 1.55 \n", + "-17.0 1.55 \n", + "-17.0 1.55 \n", + "-7.08 0.97 \n", + "-7.04 0.85 \n", + "26.07 0.24 \n", + "26.07 0.24 \n", + "2.37 0.55 \n", + "-18.94 1.93 \n", + "-18.94 1.93 \n", + "6.48 0.85 \n", + "0.13 0.25 \n", + "-34.3 0.27 \n", + "0.13 0.25 \n", + "-34.69 0.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.82 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 9.5 \n", + "-1.7 9.5 \n", + "-1.7 10.08 \n", + "-1.7 10.08 \n", + "10000000.0 10000000.0 \n", + "-11.13 4.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.05 0.43 \n", + "10000000.0 10000000.0 \n", + "-5.36 0.66 \n", + "-9.79 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-40.68 3.32 \n", + "9.52 13.16 \n", + "11.68 17.9 \n", + "-5.97 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.55 6.89 \n", + "-15.16 5.63 \n", + "-15.16 5.63 \n", + "2.16 5.6 \n", + "3.76 8.25 \n", + "-7.06 7.4 \n", + "-7.06 7.35 \n", + "-7.06 7.31 \n", + "3.76 8.2 \n", + "3.76 8.16 \n", + "2.16 5.53 \n", + "2.16 5.48 \n", + "-15.16 5.55 \n", + "-15.16 5.55 \n", + "-15.16 5.5 \n", + "-15.16 5.5 \n", + "-5.75 5.23 \n", + "-13.03 0.34 \n", + "-4.89 0.25 \n", + "-1.14 0.86 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.87 0.46 \n", + "-35.58 0.99 \n", + "-15.41 29.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "53.83 1.9 \n", + "-19.41 2.96 \n", + "-3.83 0.75 \n", + "5.68 2.19 \n", + "-10.81 34.85 \n", + "-10.18 39.82 \n", + "-10.18 39.82 \n", + "10000000.0 10000000.0 \n", + "-4.89 0.24 \n", + "-4.89 0.25 \n", + "-88.54 0.82 \n", + "10000000.0 10000000.0 \n", + "-20.79 1.5 \n", + "131.39 3.7 \n", + "10000000.0 10000000.0 \n", + "131.39 3.7 \n", + "-111.4 0.49 \n", + "1.42 0.62 \n", + "-2.84 0.54 \n", + "-2.31 0.63 \n", + "-2.46 0.54 \n", + "10000000.0 10000000.0 \n", + "-1.14 0.86 \n", + "-5.33 5.03 \n", + "6.54 0.98 \n", + "10000000.0 10000000.0 \n", + "-3.41 0.78 \n", + "-2.28 0.75 \n", + "-14.03 4.93 \n", + "-22.58 1.11 \n", + "-6.24 2.68 \n", + "-8.68 0.26 \n", + "-4.89 0.24 \n", + "-14.03 4.93 \n", + "6.66 0.98 \n", + "-1.7 4.51 \n", + "10000000.0 10000000.0 \n", + "-0.66 0.87 \n", + "-1.46 5.66 \n", + "-13.12 0.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.51 27.65 \n", + "24.42 5.13 \n", + "-53.0 1.46 \n", + "10000000.0 10000000.0 \n", + "-8.35 0.71 \n", + "10000000.0 10000000.0 \n", + "-3.51 1.0 \n", + "10000000.0 10000000.0 \n", + "0.05 0.47 \n", + "10000000.0 10000000.0 \n", + "-98.66 0.79 \n", + "0.26 0.67 \n", + "-0.87 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.58 0.42 \n", + "2.58 0.42 \n", + "16.97 6.02 \n", + "47.56 2.9 \n", + "29.69 1.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.83 1.42 \n", + "None None \n", + "1.51 0.68 \n", + "-148.49 5.98 \n", + "-9.85 0.48 \n", + "121.23 6.74 \n", + "10000000.0 10000000.0 \n", + "-14.03 11.08 \n", + "-1.87 0.46 \n", + "-4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "-14.03 11.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "28.01 0.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 11.07 \n", + "10000000.0 10000000.0 \n", + "-19.42 7.45 \n", + "-61.57 1.37 \n", + "-3.31 0.8 \n", + "-26.84 4.59 \n", + "-8.23 0.58 \n", + "-8.12 0.58 \n", + "-8.06 0.58 \n", + "-18.56 8.83 \n", + "-1.92 0.86 \n", + "-90.32 1.25 \n", + "-10.69 0.39 \n", + "4.37 0.24 \n", + "4.37 0.24 \n", + "4.37 0.24 \n", + "4.37 0.24 \n", + "-8.79 3.56 \n", + "-8.79 3.56 \n", + "-8.79 3.56 \n", + "-5.8 4.17 \n", + "-4.36 5.1 \n", + "-22.57 1.11 \n", + "-20.0 1.66 \n", + "-4.36 5.26 \n", + "-22.57 1.11 \n", + "-8.68 0.26 \n", + "-20.0 1.66 \n", + "4.89 0.24 \n", + "-44.72 2.78 \n", + "16.97 5.93 \n", + "-255.03 4.97 \n", + "-3.89 0.54 \n", + "-2.95 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.78 0.54 \n", + "-82.8 0.82 \n", + "-14.03 6.86 \n", + "-14.03 6.86 \n", + "-4.73 0.33 \n", + "-4.73 0.33 \n", + "-4.69 0.75 \n", + "-7.47 2.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.22 0.33 \n", + "2.22 0.33 \n", + "2.22 0.33 \n", + "2.22 0.33 \n", + "2.22 0.33 \n", + "2.22 0.33 \n", + "2.22 0.33 \n", + "0.67 0.33 \n", + "0.67 0.33 \n", + "-0.88 0.33 \n", + "-0.88 0.33 \n", + "10000000.0 10000000.0 \n", + "-3.73 0.33 \n", + "10000000.0 10000000.0 \n", + "-5.17 0.34 \n", + "-5.17 0.34 \n", + "-5.17 0.34 \n", + "0.67 0.33 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.43 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.1 0.31 \n", + "-4.67 1.31 \n", + "10000000.0 10000000.0 \n", + "0.94 0.31 \n", + "-1.49 1.31 \n", + "-1.49 1.31 \n", + "-1.49 1.31 \n", + "-1.49 1.31 \n", + "-4.67 1.31 \n", + "-4.67 1.31 \n", + "-7.1 0.31 \n", + "-7.1 0.31 \n", + "-1.49 1.31 \n", + "-2.44 6.37 \n", + "10000000.0 10000000.0 \n", + "-2.18 0.33 \n", + "-3.73 0.33 \n", + "-5.28 0.33 \n", + "5.81 0.35 \n", + "-8.38 0.9 \n", + "41.59 3.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-75.83 1.17 \n", + "-6.51 1.43 \n", + "-10.16 0.83 \n", + "68.99 11.69 \n", + "-6.65 1.32 \n", + "-11.81 24.93 \n", + "-7.89 0.82 \n", + "-10.48 0.83 \n", + "-92.58 7.03 \n", + "-92.58 7.03 \n", + "-55.8 3.26 \n", + "-64.01 0.28 \n", + "-75.83 1.11 \n", + "-6.51 1.43 \n", + "-9.32 0.43 \n", + "35.6 7.0 \n", + "-95.08 0.74 \n", + "-9.24 0.43 \n", + "31.41 6.89 \n", + "38.56 7.31 \n", + "-9.35 0.43 \n", + "-5.51 0.33 \n", + "-18.13 0.71 \n", + "-18.13 0.71 \n", + "-18.13 0.71 \n", + "-18.13 0.71 \n", + "10000000.0 10000000.0 \n", + "-6.42 0.31 \n", + "None 10.33 \n", + "-1.7 11.09 \n", + "-105.97 0.91 \n", + "-105.97 0.91 \n", + "-6.19 33.84 \n", + "-6.19 33.84 \n", + "4.44 0.24 \n", + "4.04 0.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.41 0.92 \n", + "-21.41 0.92 \n", + "-21.41 0.92 \n", + "-21.41 0.92 \n", + "-21.41 0.92 \n", + "-21.41 0.92 \n", + "-21.41 0.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-95.07 0.74 \n", + "-10.22 0.27 \n", + "4.68 6.03 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 5.09 \n", + "-14.03 5.01 \n", + "-1.7 4.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-251.97 53.0 \n", + "-251.97 53.0 \n", + "-2.21 0.44 \n", + "-22.57 1.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 8.73 \n", + "-61.87 1.57 \n", + "-1.7 9.67 \n", + "-7.44 1.34 \n", + "-1.7 10.84 \n", + "118.67 0.76 \n", + "1.07 7.44 \n", + "1.07 7.44 \n", + "-2.59 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-328.58 387.2 \n", + "-120.45 3.3 \n", + "-42.94 4.93 \n", + "-47.84 3.11 \n", + "13.42 3.76 \n", + "-4.5 0.42 \n", + "-25.5 62.86 \n", + "2818.03 123.38 \n", + "2818.03 123.38 \n", + "1573.52 137.75 \n", + "1158.55 257.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-95.07 0.74 \n", + "-0.9 0.57 \n", + "10000000.0 10000000.0 \n", + "-75.63 17.92 \n", + "5.63 0.42 \n", + "10000000.0 10000000.0 \n", + "-11.13 4.53 \n", + "-21.83 8.48 \n", + "-11.13 4.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.26 0.75 \n", + "-75.83 1.09 \n", + "10000000.0 10000000.0 \n", + "-6.68 1.32 \n", + "-2.63 0.42 \n", + "-0.49 0.41 \n", + "-2.63 0.42 \n", + "-0.49 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.73 1.04 \n", + "-19.84 0.86 \n", + "-2.63 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "227.14 1.18 \n", + "10000000.0 10000000.0 \n", + "-4.64 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.16 7.18 \n", + "8.13 5.3 \n", + "-0.44 5.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.05 1.83 \n", + "-16.62 2.12 \n", + "-58.77 2.72 \n", + "-159.44 5.1 \n", + "9.59 5.93 \n", + "9.59 5.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-40.15 11.35 \n", + "-39.64 10.27 \n", + "-37.17 10.27 \n", + "10000000.0 10000000.0 \n", + "-21.24 1.38 \n", + "-47.99 7.64 \n", + "-47.99 7.6 \n", + "-105.97 0.91 \n", + "-1.3 0.69 \n", + "-62.11 1.36 \n", + "-61.19 1.37 \n", + "-6.35 4.69 \n", + "42.32 0.18 \n", + "-0.41 1.91 \n", + "3.3 1.88 \n", + "40.39 0.79 \n", + "-0.81 0.22 \n", + "-10.01 2.04 \n", + "83.69 0.77 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-49.3 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-25.89 0.84 \n", + "-0.18 0.36 \n", + "3.48 0.24 \n", + "-6.46 0.32 \n", + "10000000.0 10000000.0 \n", + "49.05 1.16 \n", + "-1.71 1.66 \n", + "10000000.0 10000000.0 \n", + "-49.25 0.53 \n", + "10000000.0 10000000.0 \n", + "-43.25 0.35 \n", + "1.7 0.82 \n", + "35.49 0.84 \n", + "-21.59 2.14 \n", + "-22.07 2.14 \n", + "10000000.0 10000000.0 \n", + "-13.08 15.77 \n", + "10000000.0 10000000.0 \n", + "-4.36 8.67 \n", + "21.79 0.51 \n", + "-2.23 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.65 0.97 \n", + "-1.38 0.33 \n", + "-3.58 0.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-188.03 1.84 \n", + "-203.29 1.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.11 0.31 \n", + "-50.05 1.65 \n", + "-33.35 2.77 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-43.91 1.77 \n", + "-36.19 1.56 \n", + "10000000.0 10000000.0 \n", + "-1.7 28.8 \n", + "-94.11 1.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 20.71 \n", + "-1639.1 29.34 \n", + "-1639.1 29.34 \n", + "10.12 1.05 \n", + "2.58 0.53 \n", + "-4.05 0.3 \n", + "10000000.0 10000000.0 \n", + "202.31 2.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.34 0.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-71.08 1.28 \n", + "-94.13 0.75 \n", + "15.39 0.24 \n", + "-11.23 11.46 \n", + "-4.51 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.12 0.75 \n", + "10000000.0 10000000.0 \n", + "-4.82 0.56 \n", + "3.62 0.54 \n", + "-95.07 0.74 \n", + "10000000.0 10000000.0 \n", + "-7.72 0.41 \n", + "3.61 0.54 \n", + "-7.72 0.41 \n", + "3.62 0.54 \n", + "-4.07 0.85 \n", + "0.34 0.84 \n", + "-1.7 22.51 \n", + "-237.67 39.0 \n", + "-237.67 39.0 \n", + "-1.7 23.81 \n", + "-237.67 41.94 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "23.74 2.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.24 0.54 \n", + "-16.13 1.32 \n", + "10000000.0 10000000.0 \n", + "-18.75 0.66 \n", + "-18.75 0.66 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.1 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.01 0.3 \n", + "2.95 0.3 \n", + "-4.03 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.46 5.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-112.84 0.76 \n", + "10000000.0 10000000.0 \n", + "-10.38 1.41 \n", + "-10.38 1.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "None None \n", + "-70.75 3.19 \n", + "-70.75 3.15 \n", + "-9.06 0.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-37.49 0.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-104.73 0.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.87 0.57 \n", + "-0.87 0.57 \n", + "-0.87 0.57 \n", + "-0.87 0.57 \n", + "-0.87 0.57 \n", + "-0.87 0.57 \n", + "-0.87 0.57 \n", + "-0.46 5.41 \n", + "9.59 5.62 \n", + "9.59 5.93 \n", + "9.59 5.72 \n", + "9.59 5.73 \n", + "-107.2 0.94 \n", + "9.59 5.75 \n", + "9.59 5.76 \n", + "9.59 5.78 \n", + "9.59 5.81 \n", + "10000000.0 10000000.0 \n", + "-3.61 7.59 \n", + "-9.68 1.99 \n", + "-3.61 7.29 \n", + "-3.61 7.29 \n", + "-3.61 7.61 \n", + "-3.61 7.62 \n", + "10000000.0 10000000.0 \n", + "-54.38 2.12 \n", + "-11.22 0.43 \n", + "-1.77 0.49 \n", + "-10.92 0.33 \n", + "-87.68 0.79 \n", + "12.31 0.75 \n", + "-13.19 0.99 \n", + "-25.91 0.79 \n", + "-25.75 2.94 \n", + "-5.73 0.54 \n", + "0.28 0.38 \n", + "-0.28 0.37 \n", + "0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-90.63 3.53 \n", + "-90.63 3.53 \n", + "-163.13 6.35 \n", + "-126.88 4.94 \n", + "0.06 0.78 \n", + "1.88 0.76 \n", + "2.2 0.79 \n", + "-94.12 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.52 0.33 \n", + "1.05 0.37 \n", + "-109.85 1.64 \n", + "-117.67 1.29 \n", + "10000000.0 10000000.0 \n", + "6.74 0.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-28.17 1.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-95.07 0.74 \n", + "-95.07 0.74 \n", + "-95.07 0.74 \n", + "-112.74 0.85 \n", + "-82.22 0.88 \n", + "-83.06 1.82 \n", + "-83.06 1.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-114.38 1.15 \n", + "-49.24 0.53 \n", + "10000000.0 10000000.0 \n", + "-9.43 1.0 \n", + "10000000.0 10000000.0 \n", + "-0.63 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.33 5.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.5 0.8 \n", + "-4.23 0.75 \n", + "-5.21 0.94 \n", + "-8.82 0.43 \n", + "-4.14 1.48 \n", + "-4.13 1.48 \n", + "-22.21 5.21 \n", + "-22.21 5.21 \n", + "-478.4 2.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-22.58 1.11 \n", + "-4.36 5.09 \n", + "-14.03 4.66 \n", + "-3.79 0.91 \n", + "-1.77 0.44 \n", + "-2.79 1.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.38 1.18 \n", + "-5.5 0.33 \n", + "3.49 2.37 \n", + "3.49 2.37 \n", + "-5.96 0.32 \n", + "-15.12 0.75 \n", + "-15.12 0.75 \n", + "-15.12 0.75 \n", + "-15.12 0.75 \n", + "-15.12 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-46.07 6.27 \n", + "-8.35 1.22 \n", + "-189.98 12.78 \n", + "-189.98 12.78 \n", + "-189.98 12.79 \n", + "-189.98 12.8 \n", + "-189.98 12.81 \n", + "-100.63 7.88 \n", + "-100.63 7.9 \n", + "-100.63 7.91 \n", + "-100.63 7.92 \n", + "-100.63 7.93 \n", + "2.08 5.67 \n", + "2.08 5.69 \n", + "2.08 5.7 \n", + "2.08 5.72 \n", + "2.08 5.74 \n", + "-14.4 6.87 \n", + "-14.4 6.88 \n", + "-14.4 6.89 \n", + "-14.4 6.91 \n", + "-14.4 6.93 \n", + "-14.03 7.02 \n", + "-14.03 7.03 \n", + "-14.03 7.05 \n", + "-14.03 7.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "121.0 6.91 \n", + "10000000.0 10000000.0 \n", + "42.79 0.28 \n", + "-36.1 0.45 \n", + "-10.37 0.2 \n", + "-5.68 3.17 \n", + "-5.68 2.5 \n", + "-28.95 4.36 \n", + "9.59 6.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.14 0.86 \n", + "-1.7 10.99 \n", + "-4.5 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.73 2.41 \n", + "-13.17 0.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.11 0.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.94 0.19 \n", + "10000000.0 10000000.0 \n", + "1.74 0.94 \n", + "1.74 0.94 \n", + "-1.6 0.71 \n", + "-1.6 0.71 \n", + "2.3 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.68 2.32 \n", + "0.68 0.8 \n", + "-1.9 0.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-99.41 1.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.31 9.76 \n", + "-7.67 0.33 \n", + "-3.07 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.11 0.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.0 1.55 \n", + "10000000.0 10000000.0 \n", + "-8.47 0.57 \n", + "-5.67 0.33 \n", + "10000000.0 10000000.0 \n", + "-0.56 0.49 \n", + "-0.85 0.5 \n", + "-1.15 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "11.38 0.28 \n", + "14.07 0.29 \n", + "-78.78 4.27 \n", + "-78.78 4.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-41.16 1.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-22.87 1.22 \n", + "-22.87 1.22 \n", + "-22.87 1.22 \n", + "-22.87 1.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.12 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.83 0.43 \n", + "-14.03 9.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.17 0.33 \n", + "-48.33 6.68 \n", + "0.01 None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.82 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.15 6.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.11 0.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.18 0.45 \n", + "-58.79 0.73 \n", + "-20.64 5.86 \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-104.49 1.31 \n", + "0.48 1.95 \n", + "-9.31 0.31 \n", + "-10.1 0.44 \n", + "-9.49 0.47 \n", + "-8.57 0.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 3.9 \n", + "None 3.97 \n", + "None 3.97 \n", + "None 4.03 \n", + "None 4.43 \n", + "None 4.43 \n", + "None 0.83 \n", + "None 1.96 \n", + "None 1.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "None 0.44 \n", + "None 0.44 \n", + "None 0.49 \n", + "None 0.83 \n", + "10000000.0 10000000.0 \n", + "None 0.08 \n", + "None 2.37 \n", + "10000000.0 10000000.0 \n", + "-1.98 0.65 \n", + "-1.98 0.65 \n", + "-6.33 0.77 \n", + "10000000.0 10000000.0 \n", + "-107.68 1.13 \n", + "-1.31 0.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-91.65 5.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-91.65 4.71 \n", + "-90.63 6.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.2 \n", + "None 4.2 \n", + "-2.53 0.9 \n", + "-15.67 0.45 \n", + "-2.79 0.87 \n", + "-2.79 0.87 \n", + "10000000.0 10000000.0 \n", + "0.04 0.39 \n", + "-3.56 0.39 \n", + "-4.84 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.24 0.43 \n", + "-6.42 0.31 \n", + "-6.42 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.7 0.48 \n", + "10000000.0 10000000.0 \n", + "-27.53 5.1 \n", + "-27.53 5.1 \n", + "-5.9 1.18 \n", + "-5.9 1.18 \n", + "1.21 0.41 \n", + "-6.28 0.55 \n", + "10000000.0 10000000.0 \n", + "-8.15 3.02 \n", + "10000000.0 10000000.0 \n", + "-4.11 0.54 \n", + "-8.23 1.28 \n", + "-1.82 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 8.15 \n", + "-3.83 0.39 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "0.87 0.14 \n", + "-10.01 0.3 \n", + "-4.73 0.54 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.19 0.29 \n", + "0.48 0.43 \n", + "3.13 0.76 \n", + "6.14 0.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.13 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.64 0.81 \n", + "-8.15 0.78 \n", + "0.61 0.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.67 0.93 \n", + "10000000.0 10000000.0 \n", + "4.75 6.33 \n", + "0.35 0.57 \n", + "10000000.0 10000000.0 \n", + "-5.96 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.73 10.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "26.76 1.17 \n", + "57.71 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-36.37 1.84 \n", + "1.86 1.01 \n", + "-0.02 0.49 \n", + "10000000.0 10000000.0 \n", + "0.09 0.5 \n", + "-1.09 1.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.49 0.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.64 0.81 \n", + "-5.9 1.0 \n", + "10000000.0 10000000.0 \n", + "-1.6 0.57 \n", + "10000000.0 10000000.0 \n", + "1.02 0.71 \n", + "2.6 0.18 \n", + "-5.81 0.35 \n", + "-5.81 0.35 \n", + "4.44 0.24 \n", + "0.38 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.24 0.46 \n", + "-2.24 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.06 0.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-5.56 0.33 \n", + "10000000.0 10000000.0 \n", + "-3.05 5.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.54 0.77 \n", + "2.54 0.77 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-4.18 0.29 \n", + "1.14 0.09 \n", + "1.14 0.09 \n", + "-1.13 0.1 \n", + "-1.13 0.1 \n", + "3.41 0.13 \n", + "3.41 0.13 \n", + "4.44 0.24 \n", + "-8.27 0.9 \n", + "10000000.0 10000000.0 \n", + "-4.44 0.24 \n", + "-5.83 1.19 \n", + "-0.95 0.36 \n", + "5.6 0.74 \n", + "-1.62 0.84 \n", + "-0.99 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.79 0.35 \n", + "-4.44 0.46 \n", + "-4.44 0.46 \n", + "8.79 0.58 \n", + "-0.42 0.04 \n", + "-0.42 0.04 \n", + "2.34 0.52 \n", + "10000000.0 10000000.0 \n", + "-3.41 1.42 \n", + "10000000.0 10000000.0 \n", + "-7.84 1.14 \n", + "3.52 0.71 \n", + "2.56 0.91 \n", + "20.66 5.23 \n", + "-1.96 0.4 \n", + "-1.96 0.4 \n", + "10000000.0 10000000.0 \n", + "0.07 0.13 \n", + "0.07 0.13 \n", + "10000000.0 10000000.0 \n", + "5.03 0.08 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "1.25 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.8 0.34 \n", + "-24.76 1.8 \n", + "-11.9 0.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.86 1.6 \n", + "-2.64 1.18 \n", + "5.68 1.08 \n", + "10000000.0 10000000.0 \n", + "0.69 0.13 \n", + "0.69 0.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.87 0.41 \n", + "4.58 0.71 \n", + "-5.07 0.71 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-8.29 0.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.3 0.87 \n", + "10000000.0 10000000.0 \n", + "-1.34 0.85 \n", + "0.07 0.38 \n", + "0.51 0.84 \n", + "1.26 0.75 \n", + "1.26 0.75 \n", + "10000000.0 10000000.0 \n", + "-1.42 0.64 \n", + "-46.06 1.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.27 0.56 \n", + "-0.27 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-23.32 1.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.6 0.11 \n", + "-0.58 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.95 0.63 \n", + "-5.36 2.64 \n", + "0.21 0.52 \n", + "0.21 0.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.74 0.35 \n", + "0.74 0.35 \n", + "-0.14 None \n", + "1.02 0.58 \n", + "1.02 0.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.98 1.63 \n", + "0.61 0.58 \n", + "0.61 0.58 \n", + "-4.39 0.91 \n", + "-0.4 0.71 \n", + "14.27 0.34 \n", + "1.08 0.23 \n", + "1.08 0.23 \n", + "5.18 0.57 \n", + "-1.06 0.41 \n", + "10000000.0 10000000.0 \n", + "-28.93 1.06 \n", + "-28.93 1.06 \n", + "10000000.0 10000000.0 \n", + "6.15 0.94 \n", + "6.14 0.93 \n", + "-8.44 0.34 \n", + "-8.44 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.59 0.63 \n", + "0.59 0.63 \n", + "-0.66 0.71 \n", + "0.29 0.3 \n", + "0.29 0.3 \n", + "-9.1 0.61 \n", + "-7.67 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.8 0.55 \n", + "10000000.0 10000000.0 \n", + "-48.81 2.02 \n", + "10000000.0 10000000.0 \n", + "-13.45 5.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.35 6.28 \n", + "-6.35 6.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "14.88 0.5 \n", + "1.55 0.36 \n", + "10000000.0 10000000.0 \n", + "0.04 0.39 \n", + "10000000.0 10000000.0 \n", + "1.25 0.1 \n", + "-6.68 4.98 \n", + "-0.6 0.32 \n", + "-0.6 0.32 \n", + "10000000.0 10000000.0 \n", + "-1.69 0.17 \n", + "-2.41 0.57 \n", + "-0.01 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.72 0.09 \n", + "11.53 0.22 \n", + "11.53 0.23 \n", + "10000000.0 10000000.0 \n", + "-74.09 0.81 \n", + "-6.23 0.63 \n", + "-7.43 1.18 \n", + "10000000.0 10000000.0 \n", + "-2.69 0.15 \n", + "-25.73 1.49 \n", + "10000000.0 10000000.0 \n", + "6.14 0.2 \n", + "-12.08 0.38 \n", + "7.45 0.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.03 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.48 0.6 \n", + "10.54 0.22 \n", + "-6.35 4.76 \n", + "0.2 0.71 \n", + "-23.14 5.89 \n", + "-18.42 5.84 \n", + "-1.98 0.16 \n", + "-1.98 0.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.64 0.29 \n", + "1.82 0.71 \n", + "-4.1 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.7 1.43 \n", + "10000000.0 10000000.0 \n", + "5.37 0.41 \n", + "5.36 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "22.97 6.2 \n", + "-4.0 0.63 \n", + "0.48 0.41 \n", + "1.49 1.28 \n", + "10000000.0 10000000.0 \n", + "7.45 0.1 \n", + "4.75 0.95 \n", + "4.15 1.31 \n", + "-3.46 0.05 \n", + "-3.46 0.05 \n", + "-3.46 0.05 \n", + "-4.25 0.46 \n", + "-4.25 0.46 \n", + "1.95 0.63 \n", + "10000000.0 10000000.0 \n", + "1.11 0.92 \n", + "9.66 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.45 1.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-74.63 2.18 \n", + "-27.2 2.15 \n", + "-69.98 2.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.09 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.13 0.76 \n", + "3.13 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.95 0.77 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.26 0.76 \n", + "14.01 1.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.28 0.35 \n", + "0.38 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "39.91 0.2 \n", + "-15.26 0.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-27.39 1.97 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.96 1.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-344.88 2.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.66 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.64 0.38 \n", + "-1.64 0.39 \n", + "10000000.0 10000000.0 \n", + "-342.08 2.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-341.27 2.39 \n", + "-13.55 5.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 3.63 \n", + "None 2.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.85 0.79 \n", + "-90.7 0.91 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 0.44 \n", + "None 0.34 \n", + "None 0.81 \n", + "None 0.57 \n", + "None 0.62 \n", + "None 0.35 \n", + "None 0.71 \n", + "None 0.58 \n", + "None 0.78 \n", + "None 0.35 \n", + "None 0.89 \n", + "None 2.05 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.16 \n", + "None 2.12 \n", + "None 1.4 \n", + "10000000.0 10000000.0 \n", + "None 2.12 \n", + "-348.4 2.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.81 0.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.42 0.93 \n", + "-16.48 0.89 \n", + "0.5 0.74 \n", + "-33.13 0.56 \n", + "-9.12 0.58 \n", + "18.88 1.17 \n", + "-11.0 0.8 \n", + "10000000.0 10000000.0 \n", + "187.73 2.17 \n", + "93.68 1.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.02 \n", + "None 1.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-105.96 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.1 0.51 \n", + "10000000.0 10000000.0 \n", + "-7.68 0.72 \n", + "-3.53 7.16 \n", + "-41.05 5.14 \n", + "10000000.0 10000000.0 \n", + "None 0.45 \n", + "None 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.44 \n", + "None 1.15 \n", + "None 1.15 \n", + "None 0.68 \n", + "None 4.7 \n", + "10000000.0 10000000.0 \n", + "None 0.45 \n", + "None 0.45 \n", + "10000000.0 10000000.0 \n", + "-51.21 0.64 \n", + "None 4.55 \n", + "None 1.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.04 0.98 \n", + "-2.82 0.67 \n", + "None 0.71 \n", + "None 4.99 \n", + "10000000.0 10000000.0 \n", + "-6.4 0.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.54 \n", + "None 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.89 0.25 \n", + "None 4.29 \n", + "None 2.21 \n", + "None 0.83 \n", + "None 0.83 \n", + "None 0.72 \n", + "None 0.48 \n", + "None 0.48 \n", + "-95.24 0.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.88 \n", + "None 4.88 \n", + "None 3.85 \n", + "10000000.0 10000000.0 \n", + "None 0.55 \n", + "-12.08 0.58 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.16 \n", + "None 2.91 \n", + "None 2.32 \n", + "10000000.0 10000000.0 \n", + "None 6.51 \n", + "223.92 1.25 \n", + "None 8.53 \n", + "228.78 1.28 \n", + "-230.83 1.3 \n", + "None 0.86 \n", + "None 0.86 \n", + "None 0.54 \n", + "None 0.54 \n", + "None 0.38 \n", + "-6.16 0.07 \n", + "None 5.49 \n", + "None 0.71 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.3 \n", + "None 1.6 \n", + "None 0.82 \n", + "None 0.48 \n", + "None 0.48 \n", + "10000000.0 10000000.0 \n", + "None 0.44 \n", + "None 0.44 \n", + "None 0.64 \n", + "None 0.64 \n", + "None 0.64 \n", + "None 2.22 \n", + "None 2.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.82 \n", + "10000000.0 10000000.0 \n", + "None 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.73 \n", + "None 0.64 \n", + "None 0.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.79 \n", + "-6.83 0.33 \n", + "None 2.02 \n", + "None 2.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 6.15 \n", + "None 6.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 0.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.9 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.9 0.51 \n", + "None 1.13 \n", + "None 1.13 \n", + "10000000.0 10000000.0 \n", + "None 3.59 \n", + "None 1.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.94 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-20.81 1.48 \n", + "10000000.0 10000000.0 \n", + "None 0.75 \n", + "None 0.75 \n", + "-7.11 0.85 \n", + "10000000.0 10000000.0 \n", + "None 1.97 \n", + "None 1.64 \n", + "None 2.88 \n", + "-99.41 1.12 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "None 1.1 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 6.04 \n", + "10000000.0 10000000.0 \n", + "None 1.27 \n", + "None 1.27 \n", + "None 4.41 \n", + "-10.52 0.94 \n", + "None 3.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-27.82 10.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-54.38 2.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.85 \n", + "-35.4 1.67 \n", + "-9.51 1.39 \n", + "None 2.14 \n", + "None 2.09 \n", + "-228.69 1.3 \n", + "None 2.14 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "1.71 4.5 \n", + "-75.98 3.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "13.27 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-125.0 9.1 \n", + "-144.72 10.59 \n", + "-165.35 12.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.52 \n", + "10000000.0 10000000.0 \n", + "-230.08 1.25 \n", + "None 0.47 \n", + "-6.16 0.07 \n", + "-6.38 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-31.87 1.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-27.15 2.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.58 \n", + "-26.92 1.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.11 2.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.75 \n", + "6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.84 6.26 \n", + "-109.51 0.79 \n", + "34.78 0.84 \n", + "-0.61 0.36 \n", + "-3.21 0.75 \n", + "10000000.0 10000000.0 \n", + "None 2.19 \n", + "None 0.48 \n", + "None 4.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-108.72 1.19 \n", + "-3.83 2.65 \n", + "10000000.0 10000000.0 \n", + "4.23 0.22 \n", + "None 1.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.41 \n", + "-6.16 0.07 \n", + "-3.83 0.38 \n", + "-6.08 1.02 \n", + "0.35 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-82.17 18.33 \n", + "None 3.13 \n", + "10000000.0 10000000.0 \n", + "None 2.14 \n", + "-40.49 1.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.29 \n", + "-9.97 0.69 \n", + "10000000.0 10000000.0 \n", + "-27.8 2.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "-2.63 1.54 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-1.02 0.27 \n", + "10000000.0 10000000.0 \n", + "-6.8 0.8 \n", + "None 0.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.61 0.92 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "None 1.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-177.25 1.72 \n", + "10000000.0 10000000.0 \n", + "171.48 1.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-61.94 4.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.19 1.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.01 0.45 \n", + "7.33 1.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-318.73 14.75 \n", + "-318.73 14.75 \n", + "10000000.0 10000000.0 \n", + "-4.01 0.73 \n", + "-2.16 0.33 \n", + "10000000.0 10000000.0 \n", + "4.41 0.52 \n", + "-11.19 0.53 \n", + "-318.73 14.75 \n", + "10000000.0 10000000.0 \n", + "0.31 0.55 \n", + "10000000.0 10000000.0 \n", + "-4.01 0.73 \n", + "-2.95 0.8 \n", + "-2.16 0.33 \n", + "10000000.0 10000000.0 \n", + "4.41 0.52 \n", + "-11.19 0.53 \n", + "-318.73 14.75 \n", + "10000000.0 10000000.0 \n", + "0.31 0.55 \n", + "10000000.0 10000000.0 \n", + "-3.35 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-48.33 5.4 \n", + "-118.19 0.76 \n", + "-1.99 0.43 \n", + "-2.08 0.98 \n", + "None None \n", + "-18.13 0.71 \n", + "2.2 0.79 \n", + "10000000.0 10000000.0 \n", + "-1.7 5.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-189.98 12.78 \n", + "-1.7 5.81 \n", + "-82.42 3.41 \n", + "-130.79 1.14 \n", + "-3.83 0.51 \n", + "10000000.0 10000000.0 \n", + "0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.56 0.16 \n", + "10000000.0 10000000.0 \n", + "-15.12 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "-25.66 1.58 \n", + "10000000.0 10000000.0 \n", + "-15.12 0.75 \n", + "-189.98 12.77 \n", + "10000000.0 10000000.0 \n", + "-189.98 12.78 \n", + "10000000.0 10000000.0 \n", + "-83.06 1.82 \n", + "-1.7 7.15 \n", + "-0.37 0.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.56 0.16 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "2.16 7.32 \n", + "0.28 0.38 \n", + "38.74 1.52 \n", + "38.73 1.52 \n", + "35.82 1.55 \n", + "35.82 1.55 \n", + "30.11 7.09 \n", + "30.11 7.11 \n", + "30.99 7.1 \n", + "30.99 7.11 \n", + "31.3 7.14 \n", + "31.3 7.15 \n", + "3.9 0.48 \n", + "3.9 0.48 \n", + "55.14 8.69 \n", + "55.14 8.7 \n", + "56.02 8.7 \n", + "56.02 8.71 \n", + "56.33 8.73 \n", + "56.33 8.74 \n", + "23.13 1.62 \n", + "23.13 1.62 \n", + "24.06 1.67 \n", + "24.06 1.66 \n", + "21.14 1.76 \n", + "21.14 1.76 \n", + "55.14 8.69 \n", + "55.14 8.7 \n", + "56.02 8.7 \n", + "56.02 8.71 \n", + "56.33 8.73 \n", + "56.33 8.74 \n", + "39.77 1.35 \n", + "39.77 1.35 \n", + "40.7 1.44 \n", + "40.7 1.44 \n", + "37.78 1.47 \n", + "37.78 1.47 \n", + "36.7 1.39 \n", + "36.69 1.39 \n", + "37.63 1.44 \n", + "37.62 1.44 \n", + "34.71 1.51 \n", + "34.71 1.51 \n", + "39.77 1.35 \n", + "39.77 1.35 \n", + "40.7 1.44 \n", + "40.7 1.44 \n", + "37.78 1.47 \n", + "37.78 1.47 \n", + "6.36 0.28 \n", + "6.36 0.27 \n", + "4.84 0.46 \n", + "4.84 0.45 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "5.88 0.72 \n", + "37.81 1.42 \n", + "37.81 1.42 \n", + "38.74 1.52 \n", + "38.73 1.52 \n", + "35.82 1.55 \n", + "35.82 1.55 \n", + "23.13 1.62 \n", + "23.13 1.62 \n", + "24.06 1.67 \n", + "24.06 1.66 \n", + "21.14 1.76 \n", + "21.14 1.76 \n", + "23.13 1.62 \n", + "23.13 1.62 \n", + "24.06 1.67 \n", + "24.06 1.66 \n", + "21.14 1.76 \n", + "21.14 1.76 \n", + "65.4 1.51 \n", + "65.4 1.51 \n", + "5.95 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.41 6.55 \n", + "-26.41 6.57 \n", + "-29.74 6.6 \n", + "-29.74 6.61 \n", + "-29.74 6.6 \n", + "-29.74 6.61 \n", + "-26.94 6.53 \n", + "-26.94 6.55 \n", + "-30.27 6.58 \n", + "-30.27 6.6 \n", + "-30.27 6.58 \n", + "-30.27 6.6 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "-5.48 0.42 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "-57.05 7.45 \n", + "-57.05 7.47 \n", + "-57.05 7.45 \n", + "-57.05 7.47 \n", + "-31.31 7.79 \n", + "-31.31 7.8 \n", + "-48.23 7.52 \n", + "-48.23 7.54 \n", + "-87.11 7.3 \n", + "-87.11 7.32 \n", + "-43.8 7.51 \n", + "-43.8 7.52 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "3.9 0.48 \n", + "3.9 0.48 \n", + "3.9 0.48 \n", + "3.9 0.48 \n", + "2.91 0.76 \n", + "2.91 0.76 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "3.9 0.48 \n", + "3.9 0.48 \n", + "3.9 0.48 \n", + "3.9 0.48 \n", + "2.91 0.76 \n", + "2.91 0.76 \n", + "2.91 0.76 \n", + "2.91 0.76 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "2.91 0.76 \n", + "2.91 0.76 \n", + "3.9 0.48 \n", + "3.9 0.48 \n", + "3.9 0.48 \n", + "3.9 0.48 \n", + "67.49 7.44 \n", + "67.49 7.45 \n", + "67.49 7.44 \n", + "67.49 7.45 \n", + "41.75 7.77 \n", + "41.75 7.78 \n", + "58.67 7.51 \n", + "58.67 7.52 \n", + "97.55 7.28 \n", + "97.55 7.3 \n", + "54.24 7.49 \n", + "54.24 7.5 \n", + "6.88 0.4 \n", + "6.88 0.4 \n", + "7.81 0.93 \n", + "7.8 0.93 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "-5.48 0.43 \n", + "-5.48 0.42 \n", + "4.89 0.24 \n", + "5.82 0.62 \n", + "5.82 0.62 \n", + "2.9 0.55 \n", + "2.9 0.54 \n", + "8.17 0.76 \n", + "8.17 0.76 \n", + "9.1 0.95 \n", + "9.1 0.95 \n", + "6.19 0.94 \n", + "6.18 0.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.61 0.54 \n", + "7.61 0.54 \n", + "7.61 0.54 \n", + "7.61 0.54 \n", + "7.78 0.43 \n", + "7.78 0.43 \n", + "7.78 0.43 \n", + "7.78 0.43 \n", + "17.25 0.43 \n", + "17.24 0.43 \n", + "6.88 0.4 \n", + "6.88 0.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.54 0.86 \n", + "8.54 0.86 \n", + "8.54 0.86 \n", + "8.54 0.86 \n", + "8.71 0.78 \n", + "8.71 0.78 \n", + "8.71 0.78 \n", + "8.71 0.78 \n", + "18.18 0.99 \n", + "18.17 0.99 \n", + "7.81 0.93 \n", + "7.8 0.93 \n", + "41.32 8.25 \n", + "41.32 8.26 \n", + "41.32 8.25 \n", + "41.32 8.26 \n", + "15.58 8.55 \n", + "15.58 8.56 \n", + "32.5 8.32 \n", + "32.5 8.33 \n", + "71.38 8.12 \n", + "71.38 8.13 \n", + "28.07 8.3 \n", + "28.07 8.31 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "7.95 0.61 \n", + "7.95 0.61 \n", + "3.26 1.68 \n", + "3.26 1.67 \n", + "-24.84 8.14 \n", + "-24.84 8.15 \n", + "20.71 1.0 \n", + "20.71 1.0 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "1.83 0.59 \n", + "1.83 0.59 \n", + "6.51 1.68 \n", + "6.51 1.67 \n", + "35.28 8.14 \n", + "35.28 8.15 \n", + "-10.93 0.93 \n", + "-10.94 0.92 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "7.95 0.61 \n", + "7.95 0.61 \n", + "3.26 1.68 \n", + "3.26 1.67 \n", + "-24.84 8.14 \n", + "-24.84 8.15 \n", + "20.71 1.0 \n", + "20.71 1.0 \n", + "1.83 0.59 \n", + "1.83 0.59 \n", + "6.51 1.68 \n", + "6.51 1.67 \n", + "35.28 8.14 \n", + "35.28 8.15 \n", + "-10.93 0.93 \n", + "-10.94 0.92 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "0.2 1.76 \n", + "0.2 1.76 \n", + "-50.58 8.45 \n", + "-50.58 8.46 \n", + "17.65 1.15 \n", + "17.65 1.14 \n", + "9.58 1.77 \n", + "9.57 1.77 \n", + "61.02 8.45 \n", + "61.02 8.46 \n", + "-7.87 1.09 \n", + "-7.87 1.09 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "-33.66 8.2 \n", + "-33.66 8.21 \n", + "22.34 1.94 \n", + "22.33 1.94 \n", + "44.1 8.2 \n", + "44.1 8.21 \n", + "-12.56 1.9 \n", + "-12.56 1.9 \n", + "5.22 8.0 \n", + "5.22 8.01 \n", + "48.53 8.19 \n", + "48.53 8.2 \n", + "-38.09 8.19 \n", + "-38.09 8.2 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.63 0.67 \n", + "5.62 0.66 \n", + "5.63 0.67 \n", + "5.62 0.66 \n", + "6.38 0.36 \n", + "6.38 0.36 \n", + "-6.41 0.51 \n", + "-6.41 0.51 \n", + "5.79 0.65 \n", + "5.79 0.65 \n", + "5.79 0.65 \n", + "5.79 0.65 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "15.26 0.14 \n", + "15.26 0.13 \n", + "4.89 0.24 \n", + "4.89 0.24 \n", + "66.0 1.35 \n", + "66.0 1.35 \n", + "8.03 0.81 \n", + "4.89 0.25 \n", + "5.88 0.28 \n", + "5.87 0.28 \n", + "3.9 0.48 \n", + "3.9 0.48 \n", + "-6.41 0.51 \n", + "-6.41 0.51 \n", + "-46.51 0.85 \n", + "-46.51 0.85 \n", + "-8.68 0.27 \n", + "-4.3 1.55 \n", + "-4.3 1.55 \n", + "-13.62 1.46 \n", + "-13.62 1.46 \n", + "59.33 7.75 \n", + "59.33 7.76 \n", + "59.33 7.75 \n", + "59.33 7.76 \n", + "33.59 8.07 \n", + "33.59 8.08 \n", + "50.51 7.82 \n", + "50.51 7.83 \n", + "89.39 7.61 \n", + "89.39 7.62 \n", + "46.08 7.8 \n", + "46.08 7.81 \n", + "-13.62 1.46 \n", + "-13.62 1.46 \n", + "68.97 7.7 \n", + "68.97 7.72 \n", + "68.97 7.7 \n", + "68.97 7.72 \n", + "43.23 8.03 \n", + "43.23 8.04 \n", + "60.15 7.77 \n", + "60.15 7.78 \n", + "99.03 7.56 \n", + "99.03 7.57 \n", + "55.72 7.76 \n", + "55.72 7.77 \n", + "-8.68 0.27 \n", + "-8.68 0.26 \n", + "52.47 7.45 \n", + "52.47 7.46 \n", + "52.47 7.45 \n", + "52.47 7.46 \n", + "26.73 7.79 \n", + "26.73 7.8 \n", + "43.65 7.52 \n", + "43.65 7.53 \n", + "82.53 7.3 \n", + "82.53 7.31 \n", + "39.22 7.51 \n", + "39.22 7.52 \n", + "-12.74 1.32 \n", + "-12.74 1.32 \n", + "65.67 7.59 \n", + "65.67 7.6 \n", + "65.67 7.59 \n", + "65.67 7.6 \n", + "39.93 7.92 \n", + "39.93 7.93 \n", + "56.85 7.65 \n", + "56.85 7.67 \n", + "95.73 7.44 \n", + "95.73 7.45 \n", + "52.42 7.64 \n", + "52.42 7.65 \n", + "-10.29 0.94 \n", + "-20.61 0.81 \n", + "-20.61 0.8 \n", + "-11.76 0.81 \n", + "-11.76 0.81 \n", + "-10.24 0.84 \n", + "-10.24 0.84 \n", + "-13.1 6.15 \n", + "-13.1 6.16 \n", + "3.34 0.86 \n", + "3.33 0.86 \n", + "-7.48 0.8 \n", + "-7.48 0.79 \n", + "-7.48 0.8 \n", + "-7.48 0.79 \n", + "3.34 0.86 \n", + "3.33 0.86 \n", + "-14.6 1.76 \n", + "-14.61 1.76 \n", + "-3.2 6.48 \n", + "-3.2 6.49 \n", + "-13.61 1.46 \n", + "-13.62 1.46 \n", + "8.56 2.5 \n", + "8.56 2.5 \n", + "-9.66 0.33 \n", + "-9.67 0.33 \n", + "55.77 7.43 \n", + "55.77 7.44 \n", + "55.77 7.43 \n", + "55.77 7.44 \n", + "30.03 7.77 \n", + "30.03 7.78 \n", + "46.95 7.5 \n", + "46.95 7.51 \n", + "85.83 7.28 \n", + "85.83 7.29 \n", + "42.52 7.48 \n", + "42.52 7.5 \n", + "-10.07 0.31 \n", + "-10.07 0.31 \n", + "-40.48 1.4 \n", + "-40.49 1.4 \n", + "-40.48 1.4 \n", + "-40.49 1.4 \n", + "-41.41 1.46 \n", + "-41.41 1.46 \n", + "-38.49 1.52 \n", + "-38.5 1.52 \n", + "-15.95 1.74 \n", + "-15.95 1.74 \n", + "22.67 1.49 \n", + "22.67 1.48 \n", + "23.61 6.62 \n", + "23.61 6.63 \n", + "24.14 6.6 \n", + "24.14 6.62 \n", + "35.34 7.9 \n", + "35.34 7.91 \n", + "0.1 6.59 \n", + "0.1 6.6 \n", + "38.64 7.95 \n", + "38.64 7.96 \n", + "-9.8 6.39 \n", + "-9.8 6.41 \n", + "-3.2 6.48 \n", + "-3.2 6.49 \n", + "-6.5 6.42 \n", + "-6.5 6.43 \n", + "-12.84 6.54 \n", + "-12.84 6.55 \n", + "-12.84 6.54 \n", + "-12.84 6.55 \n", + "-12.84 6.54 \n", + "-12.84 6.55 \n", + "-9.8 6.39 \n", + "-9.8 6.41 \n", + "-6.5 6.42 \n", + "-6.5 6.43 \n", + "-6.5 6.42 \n", + "-6.5 6.43 \n", + "-3.2 6.48 \n", + "-3.2 6.49 \n", + "-9.8 6.39 \n", + "-13.1 6.41 \n", + "-9.8 6.41 \n", + "-13.1 6.42 \n", + "-8.67 0.27 \n", + "6.63 1.86 \n", + "6.63 1.86 \n", + "-7.75 0.74 \n", + "-7.75 0.74 \n", + "-7.69 0.47 \n", + "-7.69 0.47 \n", + "46.56 6.53 \n", + "46.56 6.54 \n", + "-5.24 1.12 \n", + "-5.24 1.11 \n", + "-8.68 0.27 \n", + "-8.68 0.26 \n", + "-7.69 0.47 \n", + "-7.69 0.47 \n", + "-9.66 0.33 \n", + "-9.67 0.33 \n", + "-9.66 0.33 \n", + "-9.67 0.33 \n", + "-9.17 0.45 \n", + "43.22 0.79 \n", + "43.21 0.79 \n", + "-8.41 0.61 \n", + "-9.15 0.36 \n", + "-9.16 0.36 \n", + "-17.98 0.32 \n", + "-17.98 0.31 \n", + "-7.75 0.74 \n", + "-7.75 0.74 \n", + "-8.68 0.27 \n", + "-5.76 1.07 \n", + "-5.76 1.07 \n", + "6.63 1.86 \n", + "6.63 1.86 \n", + "22.37 6.55 \n", + "22.37 6.56 \n", + "22.9 6.53 \n", + "22.9 6.54 \n", + "-8.68 0.27 \n", + "-8.68 0.27 \n", + "-7.69 0.47 \n", + "-7.69 0.47 \n", + "-7.69 0.47 \n", + "-7.69 0.47 \n", + "-6.7 0.74 \n", + "-6.7 0.74 \n", + "-8.68 0.27 \n", + "-7.69 0.47 \n", + "-7.69 0.47 \n", + "-7.69 0.47 \n", + "-7.69 0.47 \n", + "-6.7 0.74 \n", + "-6.7 0.74 \n", + "-6.7 0.74 \n", + "-6.7 0.74 \n", + "-8.68 0.27 \n", + "-8.68 0.27 \n", + "-6.7 0.74 \n", + "-6.7 0.74 \n", + "-7.69 0.47 \n", + "-7.69 0.47 \n", + "-7.69 0.47 \n", + "-7.69 0.47 \n", + "-8.68 0.27 \n", + "-8.68 0.26 \n", + "-8.68 0.27 \n", + "-8.68 0.27 \n", + "-8.68 0.26 \n", + "-11.64 0.86 \n", + "-11.64 0.86 \n", + "-12.63 1.16 \n", + "-12.63 1.16 \n", + "-10.65 0.58 \n", + "-10.65 0.58 \n", + "-10.65 0.58 \n", + "-10.65 0.58 \n", + "-10.65 0.58 \n", + "-10.65 0.58 \n", + "-10.65 0.58 \n", + "-10.65 0.58 \n", + "-8.68 0.27 \n", + "-8.68 0.26 \n", + "-10.65 0.58 \n", + "-10.65 0.58 \n", + "-8.68 0.27 \n", + "-8.68 0.26 \n", + "11.53 3.28 \n", + "11.53 3.28 \n", + "62.37 7.5 \n", + "62.37 7.51 \n", + "62.37 7.5 \n", + "62.37 7.51 \n", + "36.63 7.83 \n", + "36.63 7.84 \n", + "53.55 7.57 \n", + "53.55 7.58 \n", + "92.43 7.35 \n", + "92.43 7.36 \n", + "49.12 7.55 \n", + "49.12 7.56 \n", + "65.67 7.59 \n", + "65.67 7.6 \n", + "65.67 7.59 \n", + "65.67 7.6 \n", + "39.93 7.92 \n", + "39.93 7.93 \n", + "56.85 7.65 \n", + "56.85 7.67 \n", + "95.73 7.44 \n", + "95.73 7.45 \n", + "52.42 7.64 \n", + "52.42 7.65 \n", + "-8.68 0.27 \n", + "-7.69 0.47 \n", + "-7.69 0.47 \n", + "-6.7 0.74 \n", + "-6.7 0.74 \n", + "54.25 7.46 \n", + "54.25 7.47 \n", + "54.25 7.46 \n", + "54.25 7.47 \n", + "54.25 7.46 \n", + "54.25 7.47 \n", + "54.25 7.46 \n", + "54.25 7.47 \n", + "54.25 7.46 \n", + "54.25 7.47 \n", + "54.25 7.46 \n", + "54.25 7.47 \n", + "54.25 7.46 \n", + "54.25 7.47 \n", + "54.25 7.46 \n", + "54.25 7.47 \n", + "28.51 7.8 \n", + "28.51 7.81 \n", + "28.51 7.8 \n", + "28.51 7.81 \n", + "28.51 7.8 \n", + "28.51 7.81 \n", + "28.51 7.8 \n", + "28.51 7.81 \n", + "45.43 7.53 \n", + "45.43 7.54 \n", + "45.43 7.53 \n", + "45.43 7.54 \n", + "45.43 7.53 \n", + "45.43 7.54 \n", + "45.43 7.53 \n", + "45.43 7.54 \n", + "84.31 7.31 \n", + "84.31 7.32 \n", + "84.31 7.31 \n", + "84.31 7.32 \n", + "84.31 7.31 \n", + "84.31 7.32 \n", + "84.31 7.31 \n", + "84.31 7.32 \n", + "41.0 7.51 \n", + "41.0 7.53 \n", + "41.0 7.51 \n", + "41.0 7.53 \n", + "41.0 7.51 \n", + "41.0 7.53 \n", + "41.0 7.51 \n", + "41.0 7.53 \n", + "-8.68 0.27 \n", + "8.83 1.02 \n", + "8.82 1.02 \n", + "-9.9 0.69 \n", + "-9.9 0.69 \n", + "2.89 0.73 \n", + "2.89 0.73 \n", + "-8.68 0.27 \n", + "-7.69 0.47 \n", + "-7.69 0.47 \n", + "2.14 0.53 \n", + "2.14 0.53 \n", + "-19.47 0.45 \n", + "-19.47 0.44 \n", + "-2.18 0.83 \n", + "-1.33 0.3 \n", + "-0.28 0.38 \n", + "-0.28 0.37 \n", + "-1.51 0.4 \n", + "-1.51 0.4 \n", + "-1.51 0.4 \n", + "-1.51 0.4 \n", + "-1.51 0.4 \n", + "-1.51 0.4 \n", + "-1.51 0.4 \n", + "-1.51 0.4 \n", + "-1.51 0.4 \n", + "-7.54 3.31 \n", + "14.27 0.34 \n", + "14.27 0.33 \n", + "2.81 1.19 \n", + "-2.76 1.49 \n", + "-23.08 1.5 \n", + "-23.08 1.5 \n", + "-23.08 1.5 \n", + "2.81 1.19 \n", + "-2.76 1.49 \n", + "-23.08 1.5 \n", + "-23.08 1.5 \n", + "-23.08 1.5 \n", + "-2.11 0.69 \n", + "-3.12 0.44 \n", + "-3.4 0.14 \n", + "-2.99 0.52 \n", + "-2.66 0.4 \n", + "-1.78 0.65 \n", + "-3.24 0.66 \n", + "-2.96 0.7 \n", + "-1.7 0.64 \n", + "-3.61 5.28 \n", + "-1.76 0.52 \n", + "-3.61 5.28 \n", + "-1.76 0.52 \n", + "-2.81 0.3 \n", + "-2.81 0.3 \n", + "-3.18 1.19 \n", + "-8.76 1.49 \n", + "-29.08 1.5 \n", + "-29.08 1.5 \n", + "-3.18 1.19 \n", + "-8.76 1.49 \n", + "-29.08 1.5 \n", + "-29.08 1.5 \n", + "-29.08 1.5 \n", + "-0.3 1.26 \n", + "-5.87 1.55 \n", + "-26.19 1.56 \n", + "-26.19 1.56 \n", + "-0.3 1.26 \n", + "-5.87 1.55 \n", + "-26.19 1.56 \n", + "-26.19 1.56 \n", + "-26.19 1.56 \n", + "1.07 0.37 \n", + "1.07 0.36 \n", + "-14.03 4.92 \n", + "-14.24 5.56 \n", + "-1.7 5.69 \n", + "-6.83 0.57 \n", + "-7.21 0.57 \n", + "-6.83 0.57 \n", + "-7.21 0.57 \n", + "-6.83 0.57 \n", + "-7.21 0.57 \n", + "4.51 0.49 \n", + "-33.3 1.53 \n", + "-33.3 1.53 \n", + "-33.3 1.53 \n", + "-33.3 1.53 \n", + "-33.3 1.53 \n", + "-33.3 1.53 \n", + "-0.21 0.17 \n", + "-3.88 0.56 \n", + "-4.42 0.32 \n", + "-4.42 0.32 \n", + "-4.2 0.34 \n", + "-3.57 0.46 \n", + "-4.42 0.32 \n", + "-4.42 0.32 \n", + "-3.98 0.51 \n", + "-4.42 0.32 \n", + "-4.42 0.32 \n", + "-4.2 0.34 \n", + "-3.57 0.46 \n", + "-4.42 0.32 \n", + "-4.42 0.32 \n", + "-3.98 0.51 \n", + "4.46 0.24 \n", + "4.46 0.24 \n", + "4.45 0.24 \n", + "-0.66 0.33 \n", + "-56.1 11.35 \n", + "-119.57 0.8 \n", + "-82.5 6.28 \n", + "-2.14 3.72 \n", + "-2.14 3.72 \n", + "1.11 1.16 \n", + "-13.89 2.83 \n", + "-4.46 1.47 \n", + "-4.46 1.47 \n", + "-24.78 1.48 \n", + "-24.78 1.48 \n", + "1.11 1.16 \n", + "-13.89 2.83 \n", + "-4.46 1.47 \n", + "-4.46 1.47 \n", + "-24.78 1.48 \n", + "-24.78 1.48 \n", + "-24.78 1.48 \n", + "2.56 0.44 \n", + "2.56 0.44 \n", + "-31.87 1.48 \n", + "-31.87 1.48 \n", + "-31.87 1.48 \n", + "-31.87 1.48 \n", + "-31.87 1.48 \n", + "-31.87 1.48 \n", + "-31.87 1.48 \n", + "-19.93 1.14 \n", + "-19.92 1.14 \n", + "-25.5 1.48 \n", + "-25.5 1.48 \n", + "-5.98 1.16 \n", + "-20.98 2.83 \n", + "-20.98 2.83 \n", + "-0.34 1.41 \n", + "-0.33 1.41 \n", + "-25.5 1.48 \n", + "-25.5 1.48 \n", + "-25.5 1.48 \n", + "-25.5 1.48 \n", + "-19.93 1.14 \n", + "-19.92 1.14 \n", + "-6.3 2.12 \n", + "-6.3 2.12 \n", + "-11.56 1.46 \n", + "-11.55 1.46 \n", + "-11.56 1.46 \n", + "-11.55 1.46 \n", + "-11.56 1.46 \n", + "-11.55 1.46 \n", + "-11.56 1.46 \n", + "-11.55 1.46 \n", + "-11.56 1.46 \n", + "-11.55 1.46 \n", + "-11.56 1.46 \n", + "-11.55 1.46 \n", + "-11.56 1.46 \n", + "-11.55 1.46 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-7.97 1.22 \n", + "-7.97 1.22 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-2.4 1.36 \n", + "-2.4 1.36 \n", + "-11.56 1.46 \n", + "-11.55 1.46 \n", + "-31.87 1.48 \n", + "-31.87 1.48 \n", + "-34.79 1.77 \n", + "-34.79 1.76 \n", + "-28.96 1.78 \n", + "-28.95 1.78 \n", + "39.01 1.8 \n", + "39.01 1.8 \n", + "41.09 1.81 \n", + "41.1 1.81 \n", + "-31.88 1.48 \n", + "-31.87 1.48 \n", + "-31.88 1.48 \n", + "-31.88 1.48 \n", + "-31.88 1.48 \n", + "-31.87 1.48 \n", + "-0.34 1.41 \n", + "-0.33 1.41 \n", + "-0.34 1.41 \n", + "-0.33 1.41 \n", + "-31.88 1.48 \n", + "10000000.0 10000000.0 \n", + "-31.87 1.48 \n", + "-31.87 1.48 \n", + "-19.93 1.14 \n", + "-19.92 1.14 \n", + "-25.5 1.48 \n", + "-25.5 1.48 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-20.98 2.83 \n", + "-20.98 2.83 \n", + "-0.34 1.41 \n", + "-0.33 1.41 \n", + "-25.5 1.48 \n", + "-25.5 1.48 \n", + "-25.5 1.48 \n", + "-25.5 1.48 \n", + "-19.93 1.14 \n", + "-19.92 1.14 \n", + "-6.3 2.12 \n", + "-6.3 2.12 \n", + "-11.56 1.46 \n", + "-11.55 1.46 \n", + "-11.56 1.46 \n", + "-11.55 1.46 \n", + "-11.56 1.46 \n", + "-11.55 1.46 \n", + "-11.56 1.46 \n", + "-11.55 1.46 \n", + "-11.56 1.46 \n", + "-11.55 1.46 \n", + "-11.56 1.46 \n", + "-11.55 1.46 \n", + "-11.56 1.46 \n", + "-11.55 1.46 \n", + "-11.56 1.46 \n", + "-11.55 1.46 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-7.97 1.22 \n", + "-7.97 1.22 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-5.98 1.16 \n", + "-2.4 1.36 \n", + "-2.4 1.36 \n", + "-11.56 1.46 \n", + "-11.55 1.46 \n", + "-31.87 1.48 \n", + "-31.87 1.48 \n", + "-34.79 1.77 \n", + "-34.79 1.76 \n", + "-28.96 1.78 \n", + "-28.95 1.78 \n", + "39.01 1.8 \n", + "39.01 1.8 \n", + "41.09 1.81 \n", + "41.1 1.81 \n", + "-31.88 1.48 \n", + "-31.87 1.48 \n", + "-31.88 1.48 \n", + "-31.87 1.48 \n", + "-31.88 1.48 \n", + "-31.87 1.48 \n", + "-31.88 1.48 \n", + "-31.87 1.48 \n", + "-31.88 1.48 \n", + "-31.87 1.48 \n", + "-0.34 1.41 \n", + "-0.33 1.41 \n", + "-0.34 1.41 \n", + "-0.33 1.41 \n", + "-31.88 1.48 \n", + "10000000.0 10000000.0 \n", + "-31.87 1.48 \n", + "10000000.0 10000000.0 \n", + "-6.23 0.35 \n", + "-6.12 0.31 \n", + "-2.58 0.3 \n", + "-2.58 0.3 \n", + "7.22 4.08 \n", + "-2.58 0.3 \n", + "-2.58 0.3 \n", + "-2.58 0.3 \n", + "7.22 4.08 \n", + "-2.58 0.3 \n", + "-2.58 0.3 \n", + "-2.58 0.3 \n", + "7.22 4.08 \n", + "-2.58 0.3 \n", + "-2.58 0.3 \n", + "-2.58 0.3 \n", + "7.22 4.08 \n", + "-14.03 5.38 \n", + "-14.03 4.99 \n", + "-14.03 5.38 \n", + "-14.03 5.38 \n", + "-14.03 5.38 \n", + "-14.03 4.99 \n", + "-14.03 5.38 \n", + "-4.69 0.75 \n", + "-4.69 0.75 \n", + "-4.69 0.75 \n", + "-4.69 0.75 \n", + "-3.09 4.27 \n", + "-3.09 4.46 \n", + "-4.69 0.75 \n", + "-4.69 0.75 \n", + "-3.09 4.47 \n", + "-4.69 0.75 \n", + "-4.69 0.75 \n", + "-3.09 4.64 \n", + "-3.09 4.68 \n", + "-3.09 4.68 \n", + "-3.09 4.83 \n", + "-3.09 4.83 \n", + "-3.09 5.07 \n", + "-4.69 0.75 \n", + "-3.09 4.89 \n", + "-3.09 5.09 \n", + "-3.09 5.1 \n", + "-3.09 5.1 \n", + "-3.09 5.21 \n", + "-4.69 0.75 \n", + "-4.69 0.75 \n", + "-4.69 0.75 \n", + "-4.69 0.75 \n", + "-3.09 4.27 \n", + "-3.09 4.46 \n", + "-4.69 0.75 \n", + "-4.69 0.75 \n", + "-3.09 4.47 \n", + "-4.69 0.75 \n", + "-4.69 0.75 \n", + "-3.09 4.64 \n", + "-3.09 4.68 \n", + "-3.09 4.68 \n", + "-3.09 4.83 \n", + "-3.09 4.83 \n", + "-3.09 5.07 \n", + "-4.69 0.75 \n", + "-3.09 4.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 5.11 \n", + "-169.06 1.49 \n", + "-115.03 6.56 \n", + "-1.7 18.38 \n", + "10000000.0 10000000.0 \n", + "-6.14 0.96 \n", + "-13.11 7.92 \n", + "-53.4 2.73 \n", + "-2.0 1.79 \n", + "10000000.0 10000000.0 \n", + "-5.35 2.71 \n", + "-87.62 0.79 \n", + "10000000.0 10000000.0 \n", + "-12.72 2.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-69.98 4.36 \n", + "10000000.0 10000000.0 \n", + "-4.4 0.52 \n", + "-4.7 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "178.0 0.73 \n", + "2060.91 7.26 \n", + "None None \n", + "-114.14 1.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "-59.88 1.53 \n", + "-31.09 1.08 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-105.85 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 4.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-113.66 1.73 \n", + "-18.1 2.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.65 0.54 \n", + "-4.36 11.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.85 0.58 \n", + "-30.19 1.75 \n", + "10000000.0 10000000.0 \n", + "-0.5 10.54 \n", + "-72.34 0.88 \n", + "10000000.0 10000000.0 \n", + "17.12 1.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.89 0.24 \n", + "12.57 4.9 \n", + "10000000.0 10000000.0 \n", + "-5.51 1.58 \n", + "1.81 5.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.5 1.16 \n", + "19.12 6.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.12 0.98 \n", + "10000000.0 10000000.0 \n", + "-7.73 0.77 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.13 5.63 \n", + "10000000.0 10000000.0 \n", + "-10.22 0.27 \n", + "9.59 6.32 \n", + "128.35 1.04 \n", + "10000000.0 10000000.0 \n", + "-3.93 0.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.38 0.45 \n", + "10000000.0 10000000.0 \n", + "106.47 1.22 \n", + "-80.9 6.41 \n", + "4.52 1.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.25 1.0 \n", + "-102.22 0.86 \n", + "-0.74 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-61.48 1.42 \n", + "-1.92 4.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.54 0.51 \n", + "10000000.0 10000000.0 \n", + "-5.33 5.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.82 0.68 \n", + "10000000.0 10000000.0 \n", + "-2.26 0.44 \n", + "16.94 1.92 \n", + "10000000.0 10000000.0 \n", + "-6.02 0.56 \n", + "-0.09 0.55 \n", + "-14.27 0.34 \n", + "10000000.0 10000000.0 \n", + "7.06 8.57 \n", + "10000000.0 10000000.0 \n", + "17.22 1.65 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.16 0.62 \n", + "10000000.0 10000000.0 \n", + "None 1.92 \n", + "17.12 1.95 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "74.83 2.38 \n", + "0.17 1.29 \n", + "-3.33 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.9 0.36 \n", + "4.51 2.12 \n", + "10000000.0 10000000.0 \n", + "13.27 0.43 \n", + "10000000.0 10000000.0 \n", + "-21.89 2.16 \n", + "-9.92 1.49 \n", + "-0.19 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-126.6 1.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.18 0.45 \n", + "-102.36 1.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.33 4.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-47.35 1.44 \n", + "10000000.0 10000000.0 \n", + "-12.51 8.61 \n", + "-90.9 2.67 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.18 \n", + "10000000.0 10000000.0 \n", + "-10.46 5.4 \n", + "-3.04 0.42 \n", + "10000000.0 10000000.0 \n", + "None 1.16 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "12.09 3.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-239.77 4.96 \n", + "10000000.0 10000000.0 \n", + "5.44 0.76 \n", + "-4.36 6.1 \n", + "-4.36 6.77 \n", + "10000000.0 10000000.0 \n", + "-7.83 0.58 \n", + "-13.09 1.07 \n", + "9.59 5.93 \n", + "-3.78 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.21 0.53 \n", + "186.28 4.73 \n", + "-3.62 0.45 \n", + "-69.98 4.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-47.22 1.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "14.27 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.29 5.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.53 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "0.13 0.45 \n", + "-12.71 6.09 \n", + "10000000.0 10000000.0 \n", + "-3.28 1.14 \n", + "-21.55 7.4 \n", + "-40.51 2.05 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "-4.36 6.87 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "-3.88 0.56 \n", + "-27.82 7.29 \n", + "0.24 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.79 0.33 \n", + "-11.13 4.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "148.82 2.35 \n", + "10000000.0 10000000.0 \n", + "-6.02 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.09 0.55 \n", + "10000000.0 10000000.0 \n", + "-0.87 5.83 \n", + "-1.56 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.27 1.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.52 0.78 \n", + "-31.41 8.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.18 0.47 \n", + "10000000.0 10000000.0 \n", + "-113.71 0.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.31 0.75 \n", + "-2.24 0.42 \n", + "10000000.0 10000000.0 \n", + "-76.98 6.8 \n", + "-11.13 4.37 \n", + "-26.84 4.75 \n", + "-2.65 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.73 1.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.75 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.13 0.75 \n", + "-2.22 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.7 0.98 \n", + "10000000.0 10000000.0 \n", + "-117.27 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.89 \n", + "-8.52 0.77 \n", + "-26.84 1.03 \n", + "-84.15 5.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "22.02 3.31 \n", + "10000000.0 10000000.0 \n", + "-18.0 5.44 \n", + "10000000.0 10000000.0 \n", + "820.97 10.11 \n", + "10000000.0 10000000.0 \n", + "-16.03 4.87 \n", + "10000000.0 10000000.0 \n", + "-5.33 7.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "-3.61 9.57 \n", + "-10.55 1.0 \n", + "-87.62 0.79 \n", + "10000000.0 10000000.0 \n", + "-18.38 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.75 1.67 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.84 5.01 \n", + "3.97 0.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.68 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 7.46 \n", + "-3.88 0.56 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "9.53 7.91 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "-0.2 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-76.08 10.23 \n", + "24.54 13.06 \n", + "-0.48 4.68 \n", + "10000000.0 10000000.0 \n", + "-6.05 0.57 \n", + "-12.3 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.63 0.26 \n", + "10000000.0 10000000.0 \n", + "-0.46 9.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.61 0.43 \n", + "10000000.0 10000000.0 \n", + "-10.72 8.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.42 0.31 \n", + "1.07 0.53 \n", + "-3.84 0.39 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "-13.21 1.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "146.18 2.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 4.19 \n", + "-4.36 8.53 \n", + "10000000.0 10000000.0 \n", + "-5.21 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.54 4.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.88 \n", + "-6.02 0.56 \n", + "-7.47 2.31 \n", + "-0.21 0.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.07 3.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 5.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.66 0.27 \n", + "44.56 2.39 \n", + "-3.11 8.22 \n", + "-2.84 0.54 \n", + "11.46 0.74 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.86 \n", + "-60.94 0.74 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.56 0.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.04 0.42 \n", + "None 0.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-89.39 6.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.87 \n", + "3.41 8.27 \n", + "-0.86 0.57 \n", + "10000000.0 10000000.0 \n", + "-5.29 2.21 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.04 0.42 \n", + "-34.88 4.38 \n", + "-2.78 1.11 \n", + "-2.62 0.35 \n", + "-28.55 3.33 \n", + "1.16 5.05 \n", + "4.01 2.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.22 1.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "27.68 1.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.46 1.06 \n", + "-34.07 1.63 \n", + "3.51 0.85 \n", + "-5.33 8.18 \n", + "-79.72 2.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "492.52 0.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.11 1.87 \n", + "2.95 0.73 \n", + "-4.36 5.36 \n", + "10000000.0 10000000.0 \n", + "-6.02 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.76 7.08 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "0.39 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.58 0.38 \n", + "10000000.0 10000000.0 \n", + "0.92 5.45 \n", + "-4.36 6.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1864.66 10.65 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.19 2.85 \n", + "-33.3 1.53 \n", + "-33.3 1.53 \n", + "-33.3 1.53 \n", + "-50.36 14.18 \n", + "-36.24 2.84 \n", + "-47.13 1.49 \n", + "-47.13 1.49 \n", + "-47.13 1.49 \n", + "10000000.0 10000000.0 \n", + "-14.84 2.84 \n", + "10000000.0 10000000.0 \n", + "None 2.25 \n", + "None 3.01 \n", + "None 2.04 \n", + "None 2.4 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "None 2.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "56.78 0.76 \n", + "56.77 0.75 \n", + "36.85 7.74 \n", + "36.85 7.75 \n", + "-52.55 7.37 \n", + "-52.55 7.38 \n", + "-37.02 1.96 \n", + "-37.02 1.96 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 7.94 \n", + "-3.11 7.95 \n", + "10000000.0 10000000.0 \n", + "-115.68 1.75 \n", + "-115.68 1.75 \n", + "10000000.0 10000000.0 \n", + "-70.47 15.95 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.34 0.98 \n", + "-14.34 1.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.26 0.49 \n", + "None 0.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "29.47 1.17 \n", + "93.68 1.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.61 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "3.05 5.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.74 0.59 \n", + "10000000.0 10000000.0 \n", + "-244.74 1.51 \n", + "-25.11 1.73 \n", + "-226.68 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-255.54 1.52 \n", + "-214.72 0.77 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-214.79 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.66 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 5.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.03 \n", + "10000000.0 10000000.0 \n", + "None 1.95 \n", + "None 1.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 9.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.03 \n", + "None 4.37 \n", + "None 4.41 \n", + "None 2.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 5.2 \n", + "2.12 0.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 6.45 \n", + "None 7.18 \n", + "None 6.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.41 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.13 0.58 \n", + "-0.06 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.05 1.4 \n", + "-0.9 1.87 \n", + "10000000.0 10000000.0 \n", + "-5.03 0.79 \n", + "-3.33 0.98 \n", + "1.13 0.57 \n", + "10000000.0 10000000.0 \n", + "-0.1 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-121.03 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.87 0.3 \n", + "-40.39 1.05 \n", + "-0.23 0.32 \n", + "-26.85 1.06 \n", + "0.91 1.09 \n", + "10000000.0 10000000.0 \n", + "-9.45 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.63 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.81 5.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.68 0.77 \n", + "6.59 1.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.61 0.41 \n", + "-0.29 0.36 \n", + "-107.91 1.18 \n", + "-4.32 0.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.45 0.42 \n", + "-2.84 0.48 \n", + "-2.62 0.6 \n", + "10000000.0 10000000.0 \n", + "-4.89 0.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.1 0.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "43.75 0.77 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-195.51 2.33 \n", + "4.84 0.44 \n", + "-22.2 1.44 \n", + "-0.28 0.37 \n", + "3.64 0.5 \n", + "0.4 0.28 \n", + "10000000.0 10000000.0 \n", + "-9.42 0.7 \n", + "-9.42 0.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.64 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.97 0.63 \n", + "10000000.0 10000000.0 \n", + "-6.35 4.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.06 0.45 \n", + "-2.68 0.81 \n", + "-2.02 0.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-74.56 1.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "96.63 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.17 1.08 \n", + "-0.74 0.53 \n", + "-118.83 0.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "14.27 0.33 \n", + "14.27 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "40.81 1.05 \n", + "61.89 0.2 \n", + "-20.69 1.43 \n", + "-3.11 3.44 \n", + "None None \n", + "-5.26 1.87 \n", + "3.53 0.32 \n", + "-2.89 5.45 \n", + "10000000.0 10000000.0 \n", + "-0.34 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.39 0.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.89 0.66 \n", + "0.02 0.49 \n", + "0.05 0.47 \n", + "12.31 0.36 \n", + "12.31 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-106.33 1.43 \n", + "-0.73 0.33 \n", + "-0.68 0.51 \n", + "-94.12 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.56 0.39 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.95 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.06 \n", + "1.69 0.45 \n", + "10000000.0 10000000.0 \n", + "-5.81 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.82 0.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "-6.89 0.38 \n", + "10000000.0 10000000.0 \n", + "-106.19 0.97 \n", + "-107.57 1.44 \n", + "-98.05 0.82 \n", + "-98.05 0.82 \n", + "0.28 0.38 \n", + "6.55 1.89 \n", + "-50.72 1.03 \n", + "-2.87 0.3 \n", + "0.34 0.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.45 4.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-40.99 5.86 \n", + "-54.24 5.78 \n", + "-54.24 5.78 \n", + "-28.5 6.21 \n", + "-45.42 5.88 \n", + "10000000.0 10000000.0 \n", + "-239.47 14.16 \n", + "-94.13 0.75 \n", + "-104.63 0.81 \n", + "-8.68 0.26 \n", + "-40.16 0.43 \n", + "10000000.0 10000000.0 \n", + "-15.54 0.35 \n", + "-0.28 0.37 \n", + "-0.28 0.37 \n", + "-0.28 0.37 \n", + "-0.28 0.37 \n", + "-0.28 0.37 \n", + "-0.28 0.37 \n", + "-0.28 0.37 \n", + "-0.28 0.37 \n", + "-83.06 1.82 \n", + "-83.06 1.82 \n", + "-83.06 1.82 \n", + "-83.06 1.82 \n", + "-10.55 1.0 \n", + "-9.08 1.01 \n", + "-9.08 1.01 \n", + "-0.28 0.37 \n", + "-83.06 1.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.79 1.4 \n", + "-3.07 0.78 \n", + "-3.07 0.78 \n", + "7.83 0.58 \n", + "7.85 0.58 \n", + "0.88 0.38 \n", + "-0.28 0.37 \n", + "15.54 0.35 \n", + "-198.76 1.53 \n", + "-47.89 7.61 \n", + "10000000.0 10000000.0 \n", + "-4.88 0.53 \n", + "-4.88 0.53 \n", + "-4.88 0.53 \n", + "-40.16 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-105.97 0.91 \n", + "-20.23 2.27 \n", + "7.82 0.58 \n", + "-2.07 0.3 \n", + "10000000.0 10000000.0 \n", + "-33.42 3.27 \n", + "-27.51 1.03 \n", + "-1.79 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-82.41 5.61 \n", + "0.71 0.38 \n", + "-96.99 4.37 \n", + "0.71 0.38 \n", + "-105.99 0.91 \n", + "-0.83 0.86 \n", + "-4.36 7.85 \n", + "-95.07 0.74 \n", + "-105.09 0.81 \n", + "-94.13 0.75 \n", + "-95.07 0.74 \n", + "-105.1 0.81 \n", + "-4.36 7.86 \n", + "-63.94 3.81 \n", + "19.16 7.97 \n", + "-70.21 7.24 \n", + "-5.33 7.44 \n", + "-166.81 3.17 \n", + "-20.64 9.92 \n", + "10000000.0 10000000.0 \n", + "-54.35 0.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "38.07 0.78 \n", + "-25.6 5.74 \n", + "-66.88 12.19 \n", + "-49.48 0.65 \n", + "-49.48 0.65 \n", + "-4.36 6.06 \n", + "-1.7 5.54 \n", + "10000000.0 10000000.0 \n", + "-64.62 1.6 \n", + "-71.85 0.2 \n", + "-108.36 0.3 \n", + "-102.06 0.86 \n", + "-16.73 0.8 \n", + "-102.35 1.16 \n", + "10000000.0 10000000.0 \n", + "-3.61 7.23 \n", + "-4.36 7.22 \n", + "-10.1 3.32 \n", + "-222.81 1.53 \n", + "6.48 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-30.56 1.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.53 9.27 \n", + "2.48 0.5 \n", + "10000000.0 10000000.0 \n", + "-14.03 11.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.74 1.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "-4.36 9.55 \n", + "10000000.0 10000000.0 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "-23.07 1.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.92 13.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.15 0.85 \n", + "10000000.0 10000000.0 \n", + "31.99 2.33 \n", + "10000000.0 10000000.0 \n", + "-90.11 1.59 \n", + "-90.11 1.84 \n", + "10000000.0 10000000.0 \n", + "54.31 3.37 \n", + "2.54 7.43 \n", + "-114.37 1.15 \n", + "-0.68 8.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.48 1.04 \n", + "-79.0 2.98 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.81 5.16 \n", + "10000000.0 10000000.0 \n", + "-1.7 5.27 \n", + "-13.18 1.07 \n", + "-10.01 0.3 \n", + "10000000.0 10000000.0 \n", + "0.52 0.76 \n", + "0.52 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.54 4.38 \n", + "-5.9 0.63 \n", + "83.3 3.46 \n", + "-19.65 3.45 \n", + "-36.79 1.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.09 0.55 \n", + "1.27 0.59 \n", + "10.96 0.19 \n", + "-10.46 5.07 \n", + "-0.45 0.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.49 1.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.41 0.67 \n", + "-33.58 6.25 \n", + "70.98 0.52 \n", + "14.45 4.15 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "7.86 1.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.79 0.33 \n", + "0.35 0.61 \n", + "-69.98 1.15 \n", + "-0.64 0.33 \n", + "-0.37 0.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-126.88 4.94 \n", + "10000000.0 10000000.0 \n", + "-1.91 0.86 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-108.62 1.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.23 2.23 \n", + "0.31 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.86 1.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.57 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-316.94 2.26 \n", + "-15.4 3.48 \n", + "None 4.5 \n", + "-130.4 8.53 \n", + "-130.4 8.53 \n", + "None None \n", + "-105.96 0.91 \n", + "-105.96 0.91 \n", + "-83.06 1.82 \n", + "-97.2 0.8 \n", + "-1.87 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.55 0.51 \n", + "14.63 6.24 \n", + "10000000.0 10000000.0 \n", + "-26.41 2.13 \n", + "-191.66 12.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.39 8.31 \n", + "-9.17 5.63 \n", + "-108.28 2.38 \n", + "-16.5 2.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.87 0.66 \n", + "10000000.0 10000000.0 \n", + "-1.98 0.65 \n", + "-1.98 0.65 \n", + "-0.96 1.47 \n", + "-0.96 1.47 \n", + "-2.65 0.42 \n", + "-2.28 0.75 \n", + "2.81 0.44 \n", + "2.81 0.44 \n", + "-2.67 0.69 \n", + "-2.63 0.42 \n", + "-2.15 0.18 \n", + "-2.15 0.18 \n", + "-1.42 0.97 \n", + "-1.42 0.97 \n", + "10000000.0 10000000.0 \n", + "1.85 4.92 \n", + "-4.78 0.49 \n", + "0.61 1.02 \n", + "10000000.0 10000000.0 \n", + "8.27 0.9 \n", + "1.11 0.92 \n", + "1.11 0.92 \n", + "-1.43 0.41 \n", + "-2.99 0.48 \n", + "-2.99 0.48 \n", + "-32.0 1.07 \n", + "-32.0 1.07 \n", + "-3.2 0.46 \n", + "-4.46 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.63 0.42 \n", + "-0.21 0.17 \n", + "-6.4 0.52 \n", + "-6.4 0.52 \n", + "-6.16 0.86 \n", + "-6.16 0.86 \n", + "-8.31 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.17 0.54 \n", + "1.95 0.63 \n", + "1.95 0.63 \n", + "-3.84 0.59 \n", + "-3.84 0.59 \n", + "-3.11 0.6 \n", + "-16.31 2.37 \n", + "-0.42 0.76 \n", + "-0.42 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.44 1.27 \n", + "1.11 0.92 \n", + "1.11 0.92 \n", + "-3.52 0.58 \n", + "-3.83 0.58 \n", + "-12.71 0.58 \n", + "1.17 0.61 \n", + "-0.6 0.68 \n", + "-4.05 0.56 \n", + "-3.99 0.64 \n", + "-3.64 0.43 \n", + "-5.19 0.46 \n", + "-5.31 0.66 \n", + "-5.31 0.66 \n", + "-5.31 0.66 \n", + "4.78 0.63 \n", + "4.47 0.63 \n", + "-2.72 0.57 \n", + "-0.14 0.8 \n", + "-0.45 0.8 \n", + "-2.47 0.55 \n", + "-2.79 0.55 \n", + "-2.79 0.55 \n", + "0.93 0.67 \n", + "0.62 0.67 \n", + "-2.81 0.3 \n", + "-4.39 0.71 \n", + "-4.39 0.71 \n", + "-3.67 0.46 \n", + "-0.21 0.17 \n", + "-0.21 0.17 \n", + "-0.21 0.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.87 1.24 \n", + "-3.87 1.24 \n", + "10.7 1.02 \n", + "11.79 1.1 \n", + "-6.83 1.02 \n", + "-4.46 0.42 \n", + "1.83 0.5 \n", + "2.18 0.59 \n", + "1.93 0.83 \n", + "1.93 0.83 \n", + "-6.25 0.68 \n", + "-6.29 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.75 0.59 \n", + "-9.24 0.51 \n", + "0.19 0.49 \n", + "-2.17 0.33 \n", + "-0.25 0.79 \n", + "-7.7 0.44 \n", + "-8.05 0.6 \n", + "1.04 0.4 \n", + "-3.38 0.48 \n", + "4.8 0.55 \n", + "-8.36 0.35 \n", + "-6.6 0.58 \n", + "-1.7 0.41 \n", + "-2.95 0.37 \n", + "-3.01 0.4 \n", + "-4.26 0.59 \n", + "-2.47 0.5 \n", + "-3.72 0.33 \n", + "-3.01 0.4 \n", + "-4.27 0.59 \n", + "-3.62 0.46 \n", + "-4.87 0.59 \n", + "-2.47 0.51 \n", + "-3.72 0.34 \n", + "-39.45 1.05 \n", + "-40.71 1.14 \n", + "-26.49 2.26 \n", + "-26.49 2.26 \n", + "-2.67 0.69 \n", + "-2.16 0.52 \n", + "-2.16 0.52 \n", + "-0.76 0.87 \n", + "0.5 1.05 \n", + "-1.75 0.57 \n", + "-0.5 0.73 \n", + "-12.96 3.97 \n", + "-12.96 3.97 \n", + "-2.51 0.57 \n", + "-3.39 0.42 \n", + "-3.7 0.42 \n", + "-3.55 0.23 \n", + "-95.5 1.92 \n", + "-1.98 0.47 \n", + "-0.72 0.57 \n", + "-2.41 0.44 \n", + "-2.61 0.5 \n", + "-8.39 0.32 \n", + "-40.11 1.06 \n", + "-4.89 0.43 \n", + "-3.86 0.56 \n", + "-28.67 0.53 \n", + "-0.27 0.38 \n", + "-4.76 0.5 \n", + "5.29 1.0 \n", + "-5.54 1.2 \n", + "-10.41 0.87 \n", + "0.85 0.65 \n", + "-7.79 0.66 \n", + "-0.1 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.13 0.56 \n", + "2.13 0.56 \n", + "-2.81 0.3 \n", + "-2.81 0.3 \n", + "-3.67 0.46 \n", + "-3.67 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.16 0.52 \n", + "-3.55 0.23 \n", + "-3.55 0.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.62 0.45 \n", + "-3.62 0.45 \n", + "-3.62 0.46 \n", + "-3.62 0.46 \n", + "1.17 0.54 \n", + "1.17 0.54 \n", + "3.48 0.52 \n", + "3.48 0.52 \n", + "46.99 0.4 \n", + "46.99 0.4 \n", + "-2.81 0.3 \n", + "-2.45 0.73 \n", + "-35.35 1.1 \n", + "-34.99 1.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.53 1.22 \n", + "-2.89 0.79 \n", + "None None \n", + "0.36 0.74 \n", + "-2.63 0.42 \n", + "-2.63 0.42 \n", + "-1.43 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.94 0.27 \n", + "-0.04 0.37 \n", + "-5.68 0.55 \n", + "-5.05 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.92 0.47 \n", + "-4.38 1.07 \n", + "2.86 0.44 \n", + "-0.94 0.88 \n", + "-0.9 0.51 \n", + "-0.69 0.44 \n", + "-0.65 0.64 \n", + "-3.84 0.54 \n", + "0.35 0.57 \n", + "-4.06 0.7 \n", + "-3.86 0.48 \n", + "10000000.0 10000000.0 \n", + "-1.23 0.64 \n", + "-1.3 0.43 \n", + "-1.3 0.43 \n", + "-3.62 0.45 \n", + "-3.62 0.45 \n", + "4.57 0.34 \n", + "4.57 0.34 \n", + "4.57 0.34 \n", + "4.57 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.2 0.32 \n", + "0.2 0.32 \n", + "-46.36 0.37 \n", + "-46.36 0.37 \n", + "-4.57 0.51 \n", + "-2.65 0.46 \n", + "-3.51 0.46 \n", + "-64.18 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "13.61 0.44 \n", + "13.67 0.56 \n", + "-2.58 0.3 \n", + "-2.64 0.46 \n", + "-3.61 5.41 \n", + "-3.61 5.41 \n", + "-3.61 5.41 \n", + "-3.61 5.41 \n", + "-3.61 5.41 \n", + "-3.61 5.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.92 0.44 \n", + "0.98 0.55 \n", + "-0.21 0.17 \n", + "1.6 0.57 \n", + "-2.3 0.64 \n", + "1.81 5.07 \n", + "1.81 5.07 \n", + "10000000.0 10000000.0 \n", + "3.72 0.4 \n", + "-3.48 0.52 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "-0.14 0.61 \n", + "-0.14 0.61 \n", + "-0.72 0.53 \n", + "-0.72 0.53 \n", + "-2.04 0.72 \n", + "-39.75 1.06 \n", + "-14.28 2.42 \n", + "-2.91 0.79 \n", + "-2.78 0.74 \n", + "9.74 0.47 \n", + "-1.43 0.33 \n", + "-8.12 0.28 \n", + "-136.02 0.35 \n", + "0.41 0.26 \n", + "5.68 0.55 \n", + "-12.12 1.46 \n", + "-9.7 0.8 \n", + "-0.02 0.49 \n", + "-1.62 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 8.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "108.57 6.19 \n", + "10000000.0 10000000.0 \n", + "-3.13 0.52 \n", + "-4.16 0.87 \n", + "-6.02 1.01 \n", + "-5.7 1.01 \n", + "-3.67 2.95 \n", + "-3.67 2.97 \n", + "-211.46 0.44 \n", + "10000000.0 10000000.0 \n", + "6.38 0.36 \n", + "10000000.0 10000000.0 \n", + "-2.72 0.45 \n", + "0.69 0.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.56 0.3 \n", + "-9.56 0.3 \n", + "5.61 0.41 \n", + "-0.29 0.36 \n", + "0.35 0.74 \n", + "-107.91 1.18 \n", + "-108.54 1.28 \n", + "-4.32 0.83 \n", + "-3.68 0.96 \n", + "-13.28 2.3 \n", + "-13.28 2.3 \n", + "-3.11 4.62 \n", + "-3.11 4.62 \n", + "0.27 0.22 \n", + "0.27 0.22 \n", + "0.63 0.26 \n", + "0.63 0.26 \n", + "2.47 0.51 \n", + "-3.11 7.4 \n", + "-3.11 7.4 \n", + "6.38 0.36 \n", + "4.89 0.25 \n", + "7.93 0.99 \n", + "7.93 0.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.41 0.52 \n", + "-1.7 8.11 \n", + "3.52 0.6 \n", + "3.52 0.6 \n", + "-7.26 0.6 \n", + "-6.37 0.7 \n", + "10000000.0 10000000.0 \n", + "-0.37 0.39 \n", + "10000000.0 10000000.0 \n", + "43.75 0.77 \n", + "41.74 1.0 \n", + "0.5 2.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-195.51 2.33 \n", + "-195.51 2.33 \n", + "4.84 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-125.73 0.57 \n", + "-126.08 0.56 \n", + "23.26 1.22 \n", + "0.28 0.48 \n", + "1.53 0.71 \n", + "-0.28 0.37 \n", + "-3.54 0.82 \n", + "3.11 8.01 \n", + "3.11 8.01 \n", + "10000000.0 10000000.0 \n", + "3.59 0.5 \n", + "3.59 0.5 \n", + "10000000.0 10000000.0 \n", + "-3.28 1.09 \n", + "-0.97 0.63 \n", + "-14.55 1.34 \n", + "-1.7 6.17 \n", + "8.45 0.85 \n", + "8.45 0.85 \n", + "-5.81 0.35 \n", + "10000000.0 10000000.0 \n", + "-2.72 1.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.92 0.88 \n", + "4.01 1.06 \n", + "3.05 5.07 \n", + "10000000.0 10000000.0 \n", + "6.7 0.98 \n", + "6.7 0.98 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.15 0.47 \n", + "0.11 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.43 6.79 \n", + "-5.43 6.79 \n", + "-3.11 8.07 \n", + "-3.11 8.07 \n", + "-109.81 1.17 \n", + "-1.47 0.43 \n", + "-2.63 0.42 \n", + "-2.63 0.42 \n", + "2.55 5.03 \n", + "10000000.0 10000000.0 \n", + "-2.81 0.3 \n", + "-5.26 1.87 \n", + "-0.63 1.35 \n", + "-1.15 0.64 \n", + "-0.06 0.8 \n", + "6.7 0.98 \n", + "6.7 0.98 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-54.04 6.75 \n", + "-54.04 6.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "59.08 0.45 \n", + "59.08 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.33 0.13 \n", + "-0.33 0.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.58 0.77 \n", + "-4.58 0.77 \n", + "-1.99 0.44 \n", + "-1.99 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "-8.44 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.68 2.08 \n", + "-17.68 2.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.77 0.42 \n", + "-3.88 0.56 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "9.66 0.82 \n", + "9.66 0.82 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.92 1.11 \n", + "-11.92 1.11 \n", + "1.04 0.46 \n", + "-4.32 0.3 \n", + "-1.84 0.3 \n", + "4.44 0.24 \n", + "-1.18 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.69 0.98 \n", + "6.69 0.98 \n", + "-2.25 0.46 \n", + "-1.08 0.78 \n", + "-1.08 0.78 \n", + "4.89 0.24 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.17 1.43 \n", + "-0.79 13.23 \n", + "-0.79 13.23 \n", + "-3.11 10.14 \n", + "-3.11 10.14 \n", + "-4.36 5.7 \n", + "-2.6 0.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.82 0.5 \n", + "-10.09 1.07 \n", + "-4.15 1.26 \n", + "-0.81 0.22 \n", + "-3.11 5.68 \n", + "10000000.0 10000000.0 \n", + "56.69 0.5 \n", + "-6.26 1.71 \n", + "4.13 0.36 \n", + "4.13 0.36 \n", + "-28.95 1.1 \n", + "-28.95 1.1 \n", + "10000000.0 10000000.0 \n", + "5.36 0.85 \n", + "5.04 0.85 \n", + "-120.27 1.5 \n", + "133.58 1.37 \n", + "133.59 1.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.83 0.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.83 0.5 \n", + "1.83 0.5 \n", + "-6.25 0.68 \n", + "10000000.0 10000000.0 \n", + "-3.06 0.6 \n", + "-3.06 0.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.23 0.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.45 0.69 \n", + "-5.75 0.67 \n", + "-2.63 0.42 \n", + "-2.53 1.22 \n", + "-2.53 1.22 \n", + "-3.45 0.69 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-22.74 4.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-61.96 8.03 \n", + "-51.63 7.98 \n", + "-292.88 2.27 \n", + "-35.49 7.45 \n", + "-47.55 6.43 \n", + "-37.21 6.32 \n", + "-53.41 7.63 \n", + "-41.01 7.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.82 2.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.83 1.06 \n", + "-5.1 13.74 \n", + "-95.07 0.74 \n", + "-20.8 3.0 \n", + "71.74 0.83 \n", + "-9.18 1.43 \n", + "0.4 0.66 \n", + "-0.61 0.36 \n", + "-6.14 0.96 \n", + "0.37 3.29 \n", + "0.37 3.29 \n", + "0.37 3.29 \n", + "0.37 3.29 \n", + "-20.24 1.89 \n", + "-20.24 1.89 \n", + "-85.45 6.92 \n", + "-85.45 6.92 \n", + "10000000.0 10000000.0 \n", + "-5.31 0.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.41 0.52 \n", + "-0.89 0.89 \n", + "2.77 0.42 \n", + "2.77 0.42 \n", + "3.96 0.41 \n", + "-0.89 0.9 \n", + "-1.42 0.41 \n", + "10000000.0 10000000.0 \n", + "2.86 0.44 \n", + "2.86 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.14 1.75 \n", + "-15.82 1.75 \n", + "-109.81 1.17 \n", + "-62.45 0.98 \n", + "-72.98 1.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-121.16 3.16 \n", + "-105.97 0.91 \n", + "-2.24 0.42 \n", + "293.01 1.02 \n", + "10.3 11.47 \n", + "14.27 0.34 \n", + "-1.98 0.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.99 0.31 \n", + "-1.52 8.59 \n", + "1.99 0.41 \n", + "-16.96 1.92 \n", + "-96.19 10.57 \n", + "-34.83 8.59 \n", + "-34.83 8.57 \n", + "-96.19 10.53 \n", + "2.22 0.33 \n", + "10000000.0 10000000.0 \n", + "2.81 0.97 \n", + "2.81 0.97 \n", + "3.94 0.27 \n", + "-20.6 0.65 \n", + "-11.13 4.91 \n", + "-95.07 0.74 \n", + "-95.07 0.74 \n", + "15.54 0.35 \n", + "-15.54 0.35 \n", + "10.74 1.9 \n", + "10000000.0 10000000.0 \n", + "-96.19 10.13 \n", + "-2.14 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-43.68 3.12 \n", + "-4.16 2.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.73 0.45 \n", + "-2.73 0.45 \n", + "-0.73 4.41 \n", + "-2.73 0.45 \n", + "4.67 0.93 \n", + "4.67 1.06 \n", + "4.36 0.93 \n", + "4.36 1.06 \n", + "7.73 0.98 \n", + "6.52 0.5 \n", + "6.7 0.98 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.38 1.37 \n", + "10000000.0 10000000.0 \n", + "-0.09 0.55 \n", + "10000000.0 10000000.0 \n", + "-2.08 1.44 \n", + "25.22 2.41 \n", + "-18.98 2.28 \n", + "-18.98 2.28 \n", + "-3.62 0.45 \n", + "-4.88 0.59 \n", + "-19.42 5.36 \n", + "-0.76 0.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.7 0.96 \n", + "-15.54 1.5 \n", + "4.38 0.71 \n", + "0.64 0.48 \n", + "10000000.0 10000000.0 \n", + "140.95 1.99 \n", + "-24.71 3.95 \n", + "102.93 4.23 \n", + "0.61 None \n", + "10000000.0 10000000.0 \n", + "16.14 0.35 \n", + "-3.68 2.32 \n", + "-3.68 2.32 \n", + "-3.68 2.32 \n", + "-3.68 2.32 \n", + "-17.8 3.86 \n", + "10000000.0 10000000.0 \n", + "-71.66 1.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.01 0.48 \n", + "-34.23 1.66 \n", + "-33.91 1.66 \n", + "-2.72 0.31 \n", + "-65.09 1.52 \n", + "4.51 0.49 \n", + "7.65 1.04 \n", + "-10.37 0.2 \n", + "-10.37 0.2 \n", + "-0.18 0.36 \n", + "-2.8 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.22 8.36 \n", + "10000000.0 10000000.0 \n", + "-225.36 3.16 \n", + "-4.36 6.01 \n", + "-4.36 6.01 \n", + "-6.74 5.85 \n", + "-3.44 1.97 \n", + "-3.47 1.97 \n", + "14.42 1.07 \n", + "14.42 1.07 \n", + "14.42 1.07 \n", + "-49.25 0.53 \n", + "-49.25 0.53 \n", + "-24.83 3.7 \n", + "-24.83 3.98 \n", + "3.59 1.62 \n", + "None None \n", + "None None \n", + "3.65 1.62 \n", + "-0.38 4.17 \n", + "-2.14 0.18 \n", + "-2.14 0.18 \n", + "5.12 4.88 \n", + "5.12 4.96 \n", + "-18.4 5.33 \n", + "5.12 4.98 \n", + "-13.23 2.44 \n", + "3.68 1.62 \n", + "5.12 4.95 \n", + "-28.69 2.05 \n", + "None 10.22 \n", + "-15.54 0.35 \n", + "-38.35 0.11 \n", + "-9.69 1.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.23 0.44 \n", + "-101.7 1.13 \n", + "-21.27 0.09 \n", + "-19.11 0.66 \n", + "-52.7 0.65 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.83 0.28 \n", + "4.44 0.24 \n", + "3.74 0.81 \n", + "20.48 1.85 \n", + "47.21 1.43 \n", + "193.86 1.76 \n", + "133.32 1.51 \n", + "215.02 1.78 \n", + "215.01 1.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.19 0.78 \n", + "3.71 0.78 \n", + "-0.29 0.37 \n", + "-21.37 5.1 \n", + "-4.16 0.85 \n", + "-3.05 0.44 \n", + "-26.84 1.03 \n", + "-4.24 0.71 \n", + "-3.17 0.6 \n", + "-6.16 0.3 \n", + "-4.3 0.85 \n", + "-3.71 0.44 \n", + "-26.84 1.03 \n", + "-5.04 0.71 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.44 0.64 \n", + "None None \n", + "-0.28 0.37 \n", + "-0.28 0.37 \n", + "16.14 0.35 \n", + "70.98 0.52 \n", + "14.45 4.15 \n", + "40.48 0.31 \n", + "7.85 0.58 \n", + "-23.57 10.5 \n", + "3.42 0.46 \n", + "10000000.0 10000000.0 \n", + "-2.4 0.54 \n", + "-2.4 0.54 \n", + "1.2 1.06 \n", + "10000000.0 10000000.0 \n", + "-0.64 0.33 \n", + "-0.64 0.33 \n", + "-0.64 0.33 \n", + "-4.36 6.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.55 1.0 \n", + "-22.11 2.14 \n", + "-147.31 1.59 \n", + "69.67 2.83 \n", + "-147.42 1.59 \n", + "-4.36 8.67 \n", + "-259.16 7.11 \n", + "-2.89 1.5 \n", + "-40.48 0.31 \n", + "1.23 9.87 \n", + "30.5 0.44 \n", + "-102.93 7.48 \n", + "0.63 0.32 \n", + "-0.69 0.17 \n", + "55.65 10.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.29 1.0 \n", + "6.7 0.98 \n", + "6.7 0.98 \n", + "-18.75 0.66 \n", + "40.35 0.61 \n", + "-94.13 0.75 \n", + "-108.3 2.19 \n", + "-38.35 0.11 \n", + "-56.43 1.01 \n", + "-1.71 1.66 \n", + "-12.96 7.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "81.41 1.99 \n", + "3.85 1.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.72 1.43 \n", + "-21.63 1.5 \n", + "-21.19 1.48 \n", + "-8.21 6.24 \n", + "-8.21 6.23 \n", + "-3.09 1.69 \n", + "-3.09 1.63 \n", + "-33.22 1.68 \n", + "-3.9 0.3 \n", + "-2.23 0.46 \n", + "-2.54 0.46 \n", + "43.54 0.85 \n", + "64.47 0.38 \n", + "2107.76 7.21 \n", + "-0.47 0.41 \n", + "12.6 0.48 \n", + "-18.78 0.79 \n", + "-4.21 0.71 \n", + "26.98 6.85 \n", + "-10.33 0.91 \n", + "-2.35 0.71 \n", + "204.59 0.27 \n", + "204.27 0.51 \n", + "-38.36 0.11 \n", + "-11.12 0.19 \n", + "-45.23 0.45 \n", + "-13.88 0.8 \n", + "-2.21 0.53 \n", + "-6.73 1.05 \n", + "-37.41 0.17 \n", + "-10.37 0.2 \n", + "-61.47 0.2 \n", + "-40.99 5.86 \n", + "-37.41 0.17 \n", + "-10.37 0.2 \n", + "-61.47 0.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-40.99 5.86 \n", + "10000000.0 10000000.0 \n", + "-53.72 5.96 \n", + "-40.99 5.86 \n", + "-94.13 0.75 \n", + "-62.43 4.68 \n", + "-4.89 1.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.33 1.11 \n", + "-68.66 7.04 \n", + "-68.66 7.03 \n", + "-15.05 7.22 \n", + "-15.05 7.21 \n", + "-92.17 3.95 \n", + "10000000.0 10000000.0 \n", + "-26.06 3.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.99 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-20.03 1.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.81 1.36 \n", + "10000000.0 10000000.0 \n", + "-2.55 0.35 \n", + "-48.38 3.99 \n", + "-8.3 1.18 \n", + "-3.35 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.62 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.53 9.3 \n", + "10000000.0 10000000.0 \n", + "-4.07 0.85 \n", + "10000000.0 10000000.0 \n", + "-94.86 3.94 \n", + "None 4.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-86.72 3.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.14 1.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.14 1.0 \n", + "10000000.0 10000000.0 \n", + "3.91 2.16 \n", + "10000000.0 10000000.0 \n", + "-8.77 0.66 \n", + "10000000.0 10000000.0 \n", + "-49.17 0.53 \n", + "-20.72 2.38 \n", + "10000000.0 10000000.0 \n", + "-3.61 8.26 \n", + "-5.42 1.13 \n", + "-3.77 0.81 \n", + "10000000.0 10000000.0 \n", + "3.49 2.37 \n", + "10000000.0 10000000.0 \n", + "-0.29 0.61 \n", + "-1.7 6.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.86 1.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.13 4.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.12 0.75 \n", + "6.3 1.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-35.34 5.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.03 0.43 \n", + "-97.2 0.8 \n", + "10000000.0 10000000.0 \n", + "-109.04 5.01 \n", + "6.33 1.74 \n", + "-80.62 0.75 \n", + "10000000.0 10000000.0 \n", + "-0.99 0.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "20.58 2.37 \n", + "10000000.0 10000000.0 \n", + "4.33 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.67 4.83 \n", + "10000000.0 10000000.0 \n", + "-31.72 1.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.78 0.66 \n", + "3.77 2.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.09 1.56 \n", + "10000000.0 10000000.0 \n", + "-12.9 2.28 \n", + "13.48 0.49 \n", + "-9.69 1.99 \n", + "-3.04 0.42 \n", + "0.63 0.26 \n", + "-5.5 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.18 0.45 \n", + "-6.15 0.82 \n", + "5.82 1.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.52 1.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 28.12 \n", + "10000000.0 10000000.0 \n", + "-4.36 7.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 7.95 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.86 0.48 \n", + "10000000.0 10000000.0 \n", + "-27.02 3.12 \n", + "-4.42 1.64 \n", + "2.3 7.39 \n", + "-3.59 4.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.16 1.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-27.02 0.57 \n", + "-4.36 5.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.48 0.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.74 1.91 \n", + "-13.16 1.07 \n", + "-11.35 2.18 \n", + "-4.36 5.91 \n", + "-3.11 13.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-25.79 2.94 \n", + "10000000.0 10000000.0 \n", + "-4.52 1.9 \n", + "-5.66 0.66 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.84 1.41 \n", + "10000000.0 10000000.0 \n", + "-99.07 1.14 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "-11.13 4.7 \n", + "-0.49 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "62.28 4.19 \n", + "None 1.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-112.01 0.91 \n", + "-0.28 0.37 \n", + "-105.05 1.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.12 5.08 \n", + "None 13.85 \n", + "10000000.0 10000000.0 \n", + "-0.41 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.2 1.0 \n", + "10000000.0 10000000.0 \n", + "-29.01 2.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.17 1.3 \n", + "10000000.0 10000000.0 \n", + "-17.74 0.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 10.23 \n", + "-9.79 1.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "4.44 0.24 \n", + "27.79 5.85 \n", + "-18.46 0.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 14.05 \n", + "10000000.0 10000000.0 \n", + "-3.88 0.56 \n", + "10000000.0 10000000.0 \n", + "-25.2 1.43 \n", + "10000000.0 10000000.0 \n", + "1.04 0.89 \n", + "-6.74 5.21 \n", + "-122.97 1.24 \n", + "-31.09 1.08 \n", + "4.89 0.24 \n", + "44.56 2.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.21 5.63 \n", + "10000000.0 10000000.0 \n", + "4.63 1.27 \n", + "10000000.0 10000000.0 \n", + "None 8.29 \n", + "-0.05 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "24.2 107.18 \n", + "-14.03 6.65 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.44 4.34 \n", + "0.32 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.01 1.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-61.18 1.37 \n", + "-5.96 0.32 \n", + "10000000.0 10000000.0 \n", + "-3.34 0.74 \n", + "-101.03 1.21 \n", + "10000000.0 10000000.0 \n", + "-1.83 2.92 \n", + "10000000.0 10000000.0 \n", + "-8.12 2.13 \n", + "-4.36 6.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.87 0.46 \n", + "-1.76 2.2 \n", + "-51.7 4.72 \n", + "10000000.0 10000000.0 \n", + "None 1.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.82 2.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.13 1.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 19.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.31 0.8 \n", + "-0.49 0.41 \n", + "-13.34 1.07 \n", + "10000000.0 10000000.0 \n", + "6.34 0.54 \n", + "10000000.0 10000000.0 \n", + "-13.1 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.6 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.69 0.57 \n", + "None 1.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 11.91 \n", + "-16.61 1.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "215.42 2.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-138.57 1.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.2 1.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.77 0.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.57 0.47 \n", + "10000000.0 10000000.0 \n", + "-32.42 2.39 \n", + "-92.29 1.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-45.42 10.4 \n", + "-4.53 0.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.04 0.42 \n", + "-11.32 0.62 \n", + "-81.93 6.95 \n", + "10000000.0 10000000.0 \n", + "-5.26 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.99 0.53 \n", + "-14.2 5.66 \n", + "10000000.0 10000000.0 \n", + "-10.82 0.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.94 0.8 \n", + "-8.66 8.04 \n", + "0.38 0.45 \n", + "-1.5 0.34 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.32 0.73 \n", + "-34.78 7.44 \n", + "-21.52 3.79 \n", + "-14.03 5.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.11 0.62 \n", + "-0.46 3.3 \n", + "0.18 0.41 \n", + "-4.09 6.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.14 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.48 0.24 \n", + "1.7 0.53 \n", + "-112.12 4.87 \n", + "None 2.19 \n", + "-4.64 3.32 \n", + "10000000.0 10000000.0 \n", + "131.63 0.85 \n", + "6.37 0.77 \n", + "10000000.0 10000000.0 \n", + "-3.33 0.3 \n", + "4.9 0.51 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.81 \n", + "10000000.0 10000000.0 \n", + "-2.03 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.17 0.45 \n", + "2.35 1.4 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.81 \n", + "-8.37 0.76 \n", + "10000000.0 10000000.0 \n", + "-19.72 1.19 \n", + "10000000.0 10000000.0 \n", + "None 16.22 \n", + "-7.55 0.58 \n", + "-124.64 1.75 \n", + "-6.74 6.73 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.59 5.94 \n", + "10000000.0 10000000.0 \n", + "None 1.63 \n", + "-105.96 0.91 \n", + "10000000.0 10000000.0 \n", + "-34.54 1.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.17 0.52 \n", + "-160.47 9.01 \n", + "10000000.0 10000000.0 \n", + "9.53 8.84 \n", + "10000000.0 10000000.0 \n", + "-4.59 1.28 \n", + "-107.24 10.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-70.71 4.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.22 0.51 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "-26.84 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "572.9 4.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-23.57 10.0 \n", + "-4.36 6.1 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.04 0.55 \n", + "-9.78 1.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "461.13 0.57 \n", + "-0.46 1.81 \n", + "3.76 7.93 \n", + "-6.07 0.85 \n", + "-6.58 3.95 \n", + "-11.65 7.95 \n", + "-26.68 4.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.67 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-30.04 2.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.97 0.42 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "0.01 5.56 \n", + "10000000.0 10000000.0 \n", + "-16.19 1.41 \n", + "10000000.0 10000000.0 \n", + "4.52 1.9 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "-3.91 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 11.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.51 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.13 0.71 \n", + "639.38 7.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.81 4.05 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-116.99 2.25 \n", + "10000000.0 10000000.0 \n", + "-100.75 7.98 \n", + "-15.4 3.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-43.91 1.77 \n", + "10000000.0 10000000.0 \n", + "-1.7 10.73 \n", + "10000000.0 10000000.0 \n", + "-99.51 8.1 \n", + "10000000.0 10000000.0 \n", + "None 1.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.61 0.53 \n", + "10000000.0 10000000.0 \n", + "-14.27 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 11.82 \n", + "-1.83 1.45 \n", + "-104.62 1.45 \n", + "-6.93 5.81 \n", + "10000000.0 10000000.0 \n", + "272.17 0.62 \n", + "-203.29 1.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.47 0.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 4.4 \n", + "10000000.0 10000000.0 \n", + "1.39 5.27 \n", + "10000000.0 10000000.0 \n", + "-46.45 2.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-72.34 0.88 \n", + "-77.89 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-35.59 1.14 \n", + "0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "None 2.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "17.62 0.24 \n", + "-28.05 0.83 \n", + "4.81 1.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "17.46 4.43 \n", + "-0.9 0.42 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.25 0.42 \n", + "-14.03 6.87 \n", + "-5.97 0.42 \n", + "-3.95 0.95 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-114.38 1.15 \n", + "-2.67 11.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "-5.67 0.95 \n", + "-370.68 18.6 \n", + "10000000.0 10000000.0 \n", + "27.59 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.81 1.35 \n", + "-273.69 44.3 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 11.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.74 0.66 \n", + "10000000.0 10000000.0 \n", + "-123.88 2.46 \n", + "-9.05 1.75 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.96 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.75 8.21 \n", + "-101.64 0.94 \n", + "10000000.0 10000000.0 \n", + "-10.46 5.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "11.92 1.11 \n", + "10000000.0 10000000.0 \n", + "-1.66 2.0 \n", + "-118.19 0.76 \n", + "10000000.0 10000000.0 \n", + "7.22 2.86 \n", + "-6.83 3.39 \n", + "-4.36 6.38 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.67 4.09 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "-6.49 0.38 \n", + "10000000.0 10000000.0 \n", + "-12.71 3.5 \n", + "-2.84 0.3 \n", + "-1.7 8.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-96.19 11.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.03 \n", + "-7.42 1.34 \n", + "-1.7 5.56 \n", + "-27.02 3.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.35 5.62 \n", + "5.22 6.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.47 \n", + "10000000.0 10000000.0 \n", + "-4.11 0.54 \n", + "-4.0 0.65 \n", + "-18.89 2.26 \n", + "-13.2 1.07 \n", + "10000000.0 10000000.0 \n", + "-13.94 1.55 \n", + "10000000.0 10000000.0 \n", + "23.87 5.6 \n", + "10000000.0 10000000.0 \n", + "-2.88 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.03 0.68 \n", + "10000000.0 10000000.0 \n", + "-3.57 0.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "99.67 5.32 \n", + "10000000.0 10000000.0 \n", + "-0.64 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-32.8 7.42 \n", + "-21.03 2.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.74 5.83 \n", + "-0.74 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "67.65 1.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.39 5.76 \n", + "-4.55 2.75 \n", + "-3.57 0.3 \n", + "2.3 6.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.73 1.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-24.29 1.62 \n", + "-6.02 0.56 \n", + "10000000.0 10000000.0 \n", + "4.11 0.54 \n", + "-19.86 6.14 \n", + "5.51 8.18 \n", + "-148.13 2.64 \n", + "10000000.0 10000000.0 \n", + "-109.26 3.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-316.94 2.26 \n", + "2.58 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.52 \n", + "3.24 0.82 \n", + "-0.46 5.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.36 \n", + "None 4.55 \n", + "10000000.0 10000000.0 \n", + "-1.91 0.42 \n", + "-44.04 3.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.68 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "15.02 5.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "-3.88 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.75 7.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.32 0.97 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.81 5.08 \n", + "None 4.7 \n", + "10000000.0 10000000.0 \n", + "-4.55 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.89 1.22 \n", + "-118.86 3.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 5.41 \n", + "10000000.0 10000000.0 \n", + "-1.63 0.36 \n", + "10000000.0 10000000.0 \n", + "-4.36 1.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-88.93 6.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.36 \n", + "-4.36 5.93 \n", + "-3.11 3.44 \n", + "-15.16 5.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.41 4.47 \n", + "-50.32 12.78 \n", + "10000000.0 10000000.0 \n", + "6.25 1.0 \n", + "-1.09 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.64 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.11 \n", + "10000000.0 10000000.0 \n", + "-0.63 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.86 0.43 \n", + "-15.63 1.75 \n", + "10000000.0 10000000.0 \n", + "-113.53 0.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.44 1.32 \n", + "-6.44 1.32 \n", + "7.93 0.99 \n", + "10000000.0 10000000.0 \n", + "-15.54 0.35 \n", + "None 9.09 \n", + "-15.54 0.35 \n", + "None 1.32 \n", + "-0.99 0.31 \n", + "-17.63 1.07 \n", + "-17.63 1.07 \n", + "-1.18 0.45 \n", + "2.58 0.42 \n", + "None 2.35 \n", + "None 4.07 \n", + "-14.03 5.84 \n", + "None 3.28 \n", + "None 2.69 \n", + "None 1.33 \n", + "2.08 5.88 \n", + "-0.6 0.32 \n", + "-0.81 0.22 \n", + "None 7.04 \n", + "-0.81 0.22 \n", + "-0.81 0.22 \n", + "11.13 4.35 \n", + "None 9.66 \n", + "None 0.71 \n", + "-0.5 1.4 \n", + "None 1.3 \n", + "None 0.71 \n", + "-1.31 0.13 \n", + "2.08 5.88 \n", + "None 0.71 \n", + "-18.13 0.71 \n", + "0.28 0.98 \n", + "-18.13 0.71 \n", + "6.62 0.66 \n", + "9.9 1.88 \n", + "6.62 0.66 \n", + "None 1.3 \n", + "4.44 0.24 \n", + "4.44 0.24 \n", + "-18.13 0.71 \n", + "10000000.0 10000000.0 \n", + "15.54 0.35 \n", + "None 6.41 \n", + "None 3.97 \n", + "None 3.97 \n", + "None 3.97 \n", + "15.54 0.35 \n", + "10000000.0 10000000.0 \n", + "None 5.06 \n", + "10000000.0 10000000.0 \n", + "None 0.86 \n", + "-42.94 3.91 \n", + "-42.94 3.91 \n", + "-0.25 0.79 \n", + "-5.6 1.51 \n", + "10000000.0 10000000.0 \n", + "-42.94 3.91 \n", + "-42.94 3.91 \n", + "4.57 0.32 \n", + "0.57 0.71 \n", + "-14.74 0.5 \n", + "None 2.22 \n", + "-9.17 2.84 \n", + "None 2.22 \n", + "10000000.0 10000000.0 \n", + "-0.88 0.33 \n", + "-15.54 0.35 \n", + "-15.54 0.35 \n", + "-105.97 0.91 \n", + "-15.54 0.35 \n", + "-3.01 2.69 \n", + "-6.76 0.73 \n", + "-105.95 0.91 \n", + "10000000.0 10000000.0 \n", + "-14.74 0.5 \n", + "-6.51 0.71 \n", + "10000000.0 10000000.0 \n", + "-15.43 0.47 \n", + "-12.59 5.89 \n", + "-4.32 0.3 \n", + "10000000.0 10000000.0 \n", + "None 1.75 \n", + "-10.46 4.93 \n", + "2.44 0.11 \n", + "2.44 0.11 \n", + "-10.46 4.93 \n", + "-10.46 4.93 \n", + "-5.8 0.35 \n", + "-5.8 0.35 \n", + "1.07 1.04 \n", + "-17.1 1.06 \n", + "10000000.0 10000000.0 \n", + "None 1.46 \n", + "None 4.04 \n", + "None 2.05 \n", + "None 4.04 \n", + "-5.72 0.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.8 0.35 \n", + "-5.8 0.35 \n", + "None 6.01 \n", + "None 0.83 \n", + "None 0.71 \n", + "-7.28 0.45 \n", + "None 0.75 \n", + "-7.28 0.45 \n", + "None 0.83 \n", + "None 0.71 \n", + "None 4.33 \n", + "-6.98 0.69 \n", + "None 9.72 \n", + "None 9.72 \n", + "None 4.33 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 2.39 \n", + "None 2.39 \n", + "-11.71 0.56 \n", + "-3.08 0.94 \n", + "-8.29 0.27 \n", + "-10.95 0.49 \n", + "-10.95 0.49 \n", + "-6.77 0.31 \n", + "-1.03 0.42 \n", + "-0.43 0.54 \n", + "None 0.35 \n", + "-10.33 7.71 \n", + "None 2.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.52 \n", + "None 0.71 \n", + "6.72 0.4 \n", + "10000000.0 10000000.0 \n", + "-8.29 0.27 \n", + "-86.23 1.62 \n", + "-86.23 1.62 \n", + "-95.68 1.96 \n", + "-11.71 0.56 \n", + "2.7 1.52 \n", + "4.89 0.24 \n", + "2.7 1.52 \n", + "10000000.0 10000000.0 \n", + "-105.95 0.91 \n", + "-95.68 1.96 \n", + "None 0.38 \n", + "0.85 0.65 \n", + "None 2.12 \n", + "10000000.0 10000000.0 \n", + "-9.8 9.66 \n", + "None 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.27 0.9 \n", + "-5.46 0.91 \n", + "-3.96 0.55 \n", + "None 3.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.88 0.33 \n", + "None 3.55 \n", + "None 5.39 \n", + "-0.32 0.47 \n", + "None 5.39 \n", + "10000000.0 10000000.0 \n", + "None 3.55 \n", + "None 3.78 \n", + "None 0.83 \n", + "-11.96 0.72 \n", + "-4.11 1.01 \n", + "-11.96 0.72 \n", + "None 0.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 6.02 \n", + "None 4.27 \n", + "10000000.0 10000000.0 \n", + "None 6.02 \n", + "None 6.02 \n", + "None 4.27 \n", + "None 6.02 \n", + "-3.17 1.65 \n", + "-4.53 0.61 \n", + "-4.53 0.61 \n", + "None 6.02 \n", + "None 6.02 \n", + "10000000.0 10000000.0 \n", + "-4.53 0.61 \n", + "10000000.0 10000000.0 \n", + "-3.5 1.06 \n", + "None 0.52 \n", + "None 0.52 \n", + "None 1.57 \n", + "-5.46 0.91 \n", + "-9.8 9.66 \n", + "3.96 0.41 \n", + "-13.87 0.31 \n", + "None 5.16 \n", + "10000000.0 10000000.0 \n", + "-107.2 0.94 \n", + "-15.64 0.86 \n", + "0.53 0.22 \n", + "None 0.51 \n", + "None 1.57 \n", + "-2.17 0.33 \n", + "None 1.57 \n", + "None 1.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.75 1.42 \n", + "None 5.43 \n", + "0.89 0.62 \n", + "-3.54 0.44 \n", + "None 1.12 \n", + "1.99 0.28 \n", + "-16.92 0.92 \n", + "None 0.52 \n", + "None 1.12 \n", + "1.99 0.28 \n", + "-90.63 6.28 \n", + "10000000.0 10000000.0 \n", + "None 0.52 \n", + "None 1.12 \n", + "None 1.37 \n", + "4.17 0.54 \n", + "None 3.63 \n", + "-16.92 0.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.95 0.63 \n", + "-8.88 3.73 \n", + "-0.26 0.41 \n", + "-8.88 3.73 \n", + "-5.14 1.86 \n", + "-5.14 1.86 \n", + "None 3.86 \n", + "-8.88 3.73 \n", + "-8.88 3.73 \n", + "-82.4 3.41 \n", + "-0.26 0.41 \n", + "None 0.76 \n", + "-0.26 0.41 \n", + "-8.88 3.73 \n", + "None 5.05 \n", + "4.17 0.54 \n", + "4.17 0.54 \n", + "None 5.05 \n", + "10000000.0 10000000.0 \n", + "-5.75 5.23 \n", + "10000000.0 10000000.0 \n", + "-2.1 0.3 \n", + "None 2.26 \n", + "0.79 0.12 \n", + "-2.65 0.46 \n", + "None 2.26 \n", + "-10.51 0.47 \n", + "-10.51 0.47 \n", + "None 1.27 \n", + "-10.51 0.47 \n", + "None 1.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.75 5.23 \n", + "10000000.0 10000000.0 \n", + "None 2.35 \n", + "-0.07 0.57 \n", + "10000000.0 10000000.0 \n", + "4.59 0.71 \n", + "10000000.0 10000000.0 \n", + "-0.99 0.31 \n", + "1.82 0.71 \n", + "10000000.0 10000000.0 \n", + "-2.6 2.11 \n", + "10000000.0 10000000.0 \n", + "-2.6 2.11 \n", + "10000000.0 10000000.0 \n", + "-8.79 0.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.81 0.22 \n", + "-0.81 0.22 \n", + "-2.24 0.46 \n", + "-7.33 1.11 \n", + "None 0.79 \n", + "-16.42 1.26 \n", + "-11.44 1.1 \n", + "-0.99 0.31 \n", + "None 0.52 \n", + "-1.15 0.47 \n", + "None 6.41 \n", + "2.54 0.77 \n", + "-4.44 0.24 \n", + "None 0.71 \n", + "None 6.41 \n", + "-2.18 9.81 \n", + "None 3.01 \n", + "None 3.01 \n", + "-3.54 0.44 \n", + "10000000.0 10000000.0 \n", + "-2.17 0.33 \n", + "10000000.0 10000000.0 \n", + "-1.37 1.09 \n", + "0.64 0.48 \n", + "10000000.0 10000000.0 \n", + "0.64 0.48 \n", + "None 2.43 \n", + "-18.13 0.71 \n", + "-5.81 0.35 \n", + "-5.81 0.35 \n", + "2.54 0.77 \n", + "-3.53 0.8 \n", + "-14.27 0.34 \n", + "None 5.06 \n", + "-14.27 0.34 \n", + "-3.53 0.8 \n", + "-1.58 0.37 \n", + "None 1.34 \n", + "-5.65 0.43 \n", + "-104.49 1.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.71 0.56 \n", + "None 7.3 \n", + "-5.74 0.08 \n", + "None 7.3 \n", + "-3.41 0.78 \n", + "0.29 0.3 \n", + "None 5.15 \n", + "-104.49 1.31 \n", + "None 5.15 \n", + "None 3.04 \n", + "-74.09 0.81 \n", + "-20.31 2.54 \n", + "-11.71 0.56 \n", + "10000000.0 10000000.0 \n", + "-74.09 0.81 \n", + "-4.52 1.9 \n", + "-4.52 1.9 \n", + "-0.83 1.04 \n", + "-95.25 0.85 \n", + "-12.87 1.28 \n", + "-11.71 0.56 \n", + "-95.25 0.85 \n", + "-4.52 1.9 \n", + "None 5.25 \n", + "1.57 2.05 \n", + "0.28 0.38 \n", + "-7.19 0.32 \n", + "10000000.0 10000000.0 \n", + "-7.19 0.32 \n", + "None 5.25 \n", + "-5.17 0.59 \n", + "None 0.47 \n", + "-9.26 0.61 \n", + "None 0.71 \n", + "None 2.08 \n", + "-9.26 0.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.28 0.38 \n", + "4.87 0.41 \n", + "None 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.57 0.71 \n", + "0.61 0.58 \n", + "None 3.95 \n", + "-1.49 0.27 \n", + "-22.97 1.17 \n", + "2.34 0.68 \n", + "10000000.0 10000000.0 \n", + "0.83 1.13 \n", + "0.83 1.13 \n", + "-1.04 0.46 \n", + "-13.78 1.7 \n", + "None 1.0 \n", + "5.61 0.71 \n", + "None 0.71 \n", + "None 0.25 \n", + "-14.34 2.92 \n", + "10000000.0 10000000.0 \n", + "8.79 0.58 \n", + "-2.96 0.46 \n", + "-0.99 0.31 \n", + "-3.87 0.5 \n", + "-2.96 0.46 \n", + "-3.87 0.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "11.46 1.31 \n", + "11.46 1.31 \n", + "None 5.03 \n", + "11.46 1.31 \n", + "-5.21 0.31 \n", + "-1.14 0.86 \n", + "10000000.0 10000000.0 \n", + "-4.56 0.55 \n", + "10000000.0 10000000.0 \n", + "-4.56 0.55 \n", + "10000000.0 10000000.0 \n", + "None 1.33 \n", + "None 1.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 3.92 \n", + "10000000.0 10000000.0 \n", + "0.47 4.73 \n", + "0.54 1.48 \n", + "10000000.0 10000000.0 \n", + "0.54 1.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.44 0.64 \n", + "-8.68 0.26 \n", + "-3.87 0.5 \n", + "-8.34 0.82 \n", + "-18.18 1.75 \n", + "-5.35 0.94 \n", + "-3.02 0.72 \n", + "-2.39 0.75 \n", + "-8.34 0.82 \n", + "None 5.88 \n", + "-8.34 0.82 \n", + "-2.39 0.75 \n", + "-18.18 1.75 \n", + "-0.38 0.5 \n", + "None 4.27 \n", + "-1.19 0.46 \n", + "None 8.13 \n", + "-8.34 0.82 \n", + "-103.9 3.91 \n", + "None 8.13 \n", + "-13.43 1.51 \n", + "-13.43 1.51 \n", + "-2.39 0.75 \n", + "-0.83 0.5 \n", + "-2.43 0.33 \n", + "-0.83 0.5 \n", + "None 5.06 \n", + "-6.27 2.07 \n", + "10000000.0 10000000.0 \n", + "None 2.29 \n", + "None 2.29 \n", + "10000000.0 10000000.0 \n", + "-3.8 0.27 \n", + "None 10.17 \n", + "-103.9 3.91 \n", + "None 2.08 \n", + "-20.79 1.5 \n", + "-0.83 0.5 \n", + "-6.42 0.49 \n", + "-4.36 5.35 \n", + "-3.81 0.62 \n", + "-6.77 0.31 \n", + "None 5.05 \n", + "-3.81 0.62 \n", + "None 0.74 \n", + "-3.11 4.62 \n", + "10000000.0 10000000.0 \n", + "None 4.27 \n", + "10000000.0 10000000.0 \n", + "4.7 2.24 \n", + "None 0.71 \n", + "None 4.99 \n", + "-105.99 0.91 \n", + "-10.42 6.55 \n", + "-5.31 0.66 \n", + "-0.06 0.39 \n", + "-0.62 0.69 \n", + "-5.31 0.66 \n", + "-0.62 0.69 \n", + "11.38 0.28 \n", + "-0.62 0.69 \n", + "-0.62 0.69 \n", + "-8.67 0.26 \n", + "None 2.22 \n", + "-2.81 0.3 \n", + "-128.98 8.61 \n", + "-2.81 0.3 \n", + "-0.98 0.07 \n", + "2.54 0.77 \n", + "None 3.22 \n", + "-15.65 0.87 \n", + "1.97 0.45 \n", + "10000000.0 10000000.0 \n", + "None 2.04 \n", + "None 2.04 \n", + "None 2.04 \n", + "0.54 1.48 \n", + "None 5.03 \n", + "None 4.14 \n", + "None 1.8 \n", + "None 0.38 \n", + "None 0.38 \n", + "None 0.38 \n", + "None 4.41 \n", + "4.73 0.75 \n", + "-14.87 5.08 \n", + "4.73 0.75 \n", + "None 0.62 \n", + "-3.05 5.12 \n", + "None 0.62 \n", + "None 4.4 \n", + "None 4.4 \n", + "None 6.43 \n", + "-6.42 1.8 \n", + "10000000.0 10000000.0 \n", + "-14.87 5.08 \n", + "None 6.43 \n", + "None 4.4 \n", + "None 4.03 \n", + "None 4.03 \n", + "12.39 0.75 \n", + "2.25 0.33 \n", + "None 1.91 \n", + "2.25 0.33 \n", + "None 2.76 \n", + "5.59 0.71 \n", + "None 2.76 \n", + "10000000.0 10000000.0 \n", + "-2.67 0.35 \n", + "5.59 0.71 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 0.71 \n", + "-0.81 0.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.81 0.22 \n", + "10000000.0 10000000.0 \n", + "2.54 0.77 \n", + "-0.68 0.31 \n", + "-11.73 0.56 \n", + "-11.73 0.56 \n", + "-105.97 0.91 \n", + "-105.97 0.91 \n", + "None 4.2 \n", + "-1.97 0.56 \n", + "-8.68 0.26 \n", + "-0.21 0.17 \n", + "-8.41 0.61 \n", + "-3.11 7.46 \n", + "None 9.77 \n", + "10000000.0 10000000.0 \n", + "-2.26 1.28 \n", + "-15.54 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.69 0.98 \n", + "-7.62 0.46 \n", + "6.69 0.98 \n", + "0.87 0.35 \n", + "-0.95 0.55 \n", + "None 2.14 \n", + "0.87 0.35 \n", + "10000000.0 10000000.0 \n", + "-0.21 0.17 \n", + "-18.13 0.71 \n", + "None 0.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.63 0.42 \n", + "-4.17 0.94 \n", + "1.49 1.28 \n", + "-4.17 0.94 \n", + "10.37 0.2 \n", + "10000000.0 10000000.0 \n", + "10.37 0.2 \n", + "10.37 0.2 \n", + "10000000.0 10000000.0 \n", + "-1.84 0.3 \n", + "10.37 0.2 \n", + "-1.84 0.3 \n", + "10000000.0 10000000.0 \n", + "-9.13 1.52 \n", + "-2.6 2.2 \n", + "-1.45 0.4 \n", + "None 1.56 \n", + "-3.14 0.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.13 1.52 \n", + "None 1.32 \n", + "-0.37 0.39 \n", + "10000000.0 10000000.0 \n", + "None 1.32 \n", + "10000000.0 10000000.0 \n", + "0.48 1.07 \n", + "-107.89 6.27 \n", + "None 2.59 \n", + "10.66 0.78 \n", + "-5.12 0.81 \n", + "None 0.45 \n", + "-107.89 6.27 \n", + "9.34 2.83 \n", + "-0.21 0.17 \n", + "9.34 2.83 \n", + "-0.21 0.17 \n", + "-5.28 0.33 \n", + "-8.14 0.89 \n", + "-2.63 0.35 \n", + "-6.02 0.56 \n", + "-6.02 0.56 \n", + "-22.49 1.11 \n", + "-3.98 0.33 \n", + "None 2.18 \n", + "None 6.51 \n", + "None 1.34 \n", + "None 6.43 \n", + "-5.5 0.33 \n", + "-117.42 1.16 \n", + "-0.21 0.17 \n", + "2.08 1.37 \n", + "10000000.0 10000000.0 \n", + "-2.88 0.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "-74.63 2.18 \n", + "None 0.54 \n", + "None 0.54 \n", + "0.94 0.19 \n", + "None 0.54 \n", + "10000000.0 10000000.0 \n", + "None 1.1 \n", + "None 5.73 \n", + "None 5.73 \n", + "None 2.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.99 0.33 \n", + "2.22 0.33 \n", + "-21.65 7.55 \n", + "None 5.42 \n", + "10000000.0 10000000.0 \n", + "-68.61 1.43 \n", + "None 5.42 \n", + "-2.66 0.35 \n", + "None 0.71 \n", + "None 1.02 \n", + "1.32 0.8 \n", + "1.32 0.8 \n", + "-18.97 6.25 \n", + "None 1.02 \n", + "-3.63 5.9 \n", + "10000000.0 10000000.0 \n", + "23.24 5.36 \n", + "23.24 5.36 \n", + "23.24 5.36 \n", + "None 0.41 \n", + "-0.66 0.71 \n", + "None 9.79 \n", + "-18.13 0.71 \n", + "-6.06 0.67 \n", + "None 1.4 \n", + "None 9.79 \n", + "None 6.99 \n", + "-2.6 2.39 \n", + "-48.6 0.41 \n", + "-95.32 1.25 \n", + "-2.6 2.39 \n", + "-1.22 0.75 \n", + "-6.06 0.67 \n", + "-2.6 2.2 \n", + "-8.68 0.26 \n", + "None 0.69 \n", + "-4.36 7.2 \n", + "None 0.44 \n", + "-6.06 0.67 \n", + "-4.4 0.53 \n", + "None 6.84 \n", + "-2.6 2.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.55 0.26 \n", + "10000000.0 10000000.0 \n", + "-3.33 0.61 \n", + "-3.33 0.61 \n", + "3.11 0.49 \n", + "3.11 0.49 \n", + "-5.82 0.35 \n", + "-4.36 7.34 \n", + "-9.86 1.06 \n", + "-15.13 0.33 \n", + "-18.48 1.45 \n", + "10000000.0 10000000.0 \n", + "-1.43 0.33 \n", + "-1.2 0.77 \n", + "-1.2 0.77 \n", + "None 0.54 \n", + "None None \n", + "None 1.88 \n", + "-1.2 0.77 \n", + "-1.2 0.77 \n", + "None 1.88 \n", + "None 1.88 \n", + "None 2.21 \n", + "None 9.8 \n", + "None 9.8 \n", + "-6.27 2.07 \n", + "10000000.0 10000000.0 \n", + "-20.54 1.56 \n", + "-7.29 4.95 \n", + "-4.05 1.05 \n", + "None 2.69 \n", + "None 5.33 \n", + "-5.92 0.48 \n", + "None 2.69 \n", + "-20.54 1.56 \n", + "None 4.04 \n", + "None 2.69 \n", + "None 5.33 \n", + "-12.78 1.18 \n", + "-4.97 0.94 \n", + "10000000.0 10000000.0 \n", + "-13.4 1.06 \n", + "-4.5 9.72 \n", + "5.63 0.54 \n", + "-2.23 0.46 \n", + "-13.4 1.06 \n", + "-13.28 1.2 \n", + "None 3.65 \n", + "None 0.45 \n", + "None 8.05 \n", + "None 3.65 \n", + "None 0.45 \n", + "-13.4 1.06 \n", + "None 0.44 \n", + "3.53 0.8 \n", + "-19.86 10.91 \n", + "None 0.44 \n", + "None 0.44 \n", + "-4.32 0.3 \n", + "-1.45 1.11 \n", + "-8.35 5.5 \n", + "-1.45 1.11 \n", + "-2.83 1.5 \n", + "-0.99 0.31 \n", + "2.92 0.34 \n", + "None 5.18 \n", + "-2.65 0.53 \n", + "10000000.0 10000000.0 \n", + "None 5.18 \n", + "-1.45 1.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.62 0.69 \n", + "0.62 0.69 \n", + "-2.84 0.54 \n", + "-0.81 0.22 \n", + "-20.56 5.08 \n", + "None 6.15 \n", + "None 0.93 \n", + "-40.4 1.05 \n", + "None 4.29 \n", + "-40.4 1.05 \n", + "10000000.0 10000000.0 \n", + "None 4.29 \n", + "-20.56 5.08 \n", + "None 6.15 \n", + "-20.56 5.08 \n", + "None 6.15 \n", + "None 6.15 \n", + "-1.36 0.48 \n", + "None 6.15 \n", + "10000000.0 10000000.0 \n", + "None 6.15 \n", + "0.62 0.69 \n", + "None 4.2 \n", + "None 4.2 \n", + "10000000.0 10000000.0 \n", + "-105.97 0.91 \n", + "11.92 0.96 \n", + "11.92 0.96 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "11.92 0.96 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.81 0.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.67 \n", + "10000000.0 10000000.0 \n", + "1.41 0.78 \n", + "10000000.0 10000000.0 \n", + "None 4.67 \n", + "None 2.39 \n", + "None 2.39 \n", + "None None \n", + "None 6.17 \n", + "None 6.17 \n", + "None 5.29 \n", + "10000000.0 10000000.0 \n", + "None 5.29 \n", + "None 6.17 \n", + "10000000.0 10000000.0 \n", + "-10.34 0.49 \n", + "-10.34 0.49 \n", + "None 1.26 \n", + "-22.58 1.25 \n", + "None 1.26 \n", + "None 6.17 \n", + "None 6.17 \n", + "-2.51 0.49 \n", + "None 0.64 \n", + "None 0.64 \n", + "None 0.81 \n", + "-17.63 1.07 \n", + "-98.48 11.53 \n", + "-8.35 5.5 \n", + "-1.43 0.33 \n", + "-18.13 0.71 \n", + "None 0.81 \n", + "-1.43 0.33 \n", + "-1.43 0.33 \n", + "1.4 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "251.57 0.24 \n", + "-8.47 0.79 \n", + "-8.47 0.79 \n", + "-46.14 0.21 \n", + "252.02 0.37 \n", + "252.62 0.22 \n", + "0.82 0.07 \n", + "0.82 0.07 \n", + "0.82 0.07 \n", + "1.85 0.87 \n", + "-0.36 0.54 \n", + "10000000.0 10000000.0 \n", + "-0.51 0.51 \n", + "-1.21 0.44 \n", + "0.04 0.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.72 0.31 \n", + "-5.3 0.59 \n", + "-2.17 0.41 \n", + "-2.17 0.41 \n", + "-204.98 0.17 \n", + "-204.98 0.17 \n", + "-2.67 0.69 \n", + "10000000.0 10000000.0 \n", + "-43.78 0.93 \n", + "10000000.0 10000000.0 \n", + "-4.81 0.66 \n", + "-44.22 0.45 \n", + "-1.13 0.1 \n", + "2.25 0.33 \n", + "-8.1 0.51 \n", + "6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-208.81 0.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.43 0.14 \n", + "-434.91 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-392.76 3.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.25 0.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-58.92 0.81 \n", + "-58.92 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "383.56 1.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.54 1.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.51 0.84 \n", + "1.89 1.02 \n", + "-12.89 0.27 \n", + "2.38 0.83 \n", + "0.44 0.85 \n", + "-0.07 0.13 \n", + "-1.96 0.4 \n", + "-1.96 0.4 \n", + "-8.72 0.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.72 1.45 \n", + "10000000.0 10000000.0 \n", + "-0.69 0.13 \n", + "-0.69 0.13 \n", + "-4.01 0.86 \n", + "-44.78 0.91 \n", + "-3.34 0.2 \n", + "-3.34 0.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.8 1.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.53 0.23 \n", + "10000000.0 10000000.0 \n", + "397.52 1.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.79 0.74 \n", + "10000000.0 10000000.0 \n", + "-2.28 0.23 \n", + "10000000.0 10000000.0 \n", + "-2.48 0.6 \n", + "8.79 0.58 \n", + "-1.81 1.19 \n", + "-14.73 1.19 \n", + "-6.34 1.32 \n", + "-14.55 1.34 \n", + "0.85 0.65 \n", + "10000000.0 10000000.0 \n", + "-4.39 0.91 \n", + "-0.13 1.19 \n", + "-5.8 1.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.07 0.87 \n", + "-38.45 2.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.29 0.76 \n", + "0.19 0.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-36.16 4.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.09 0.26 \n", + "-13.15 4.94 \n", + "0.45 0.38 \n", + "-4.36 6.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-22.12 2.71 \n", + "-1.09 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.76 6.3 \n", + "10000000.0 10000000.0 \n", + "1483.01 15.21 \n", + "10000000.0 10000000.0 \n", + "-34.83 5.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.56 0.91 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "-0.78 0.68 \n", + "-2.68 0.45 \n", + "-3.11 2.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.12 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 7.42 \n", + "-2.7 2.72 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-93.25 0.99 \n", + "None 0.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.07 0.85 \n", + "-4.36 6.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.21 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.52 0.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.52 \n", + "12.92 0.57 \n", + "10000000.0 10000000.0 \n", + "-3.53 6.42 \n", + "10000000.0 10000000.0 \n", + "-3.88 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.11 0.98 \n", + "10000000.0 10000000.0 \n", + "-11.13 4.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.87 0.56 \n", + "10000000.0 10000000.0 \n", + "-121.36 15.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-68.14 10.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.51 0.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.59 0.54 \n", + "8.88 0.48 \n", + "10000000.0 10000000.0 \n", + "1.27 0.59 \n", + "1.63 1.66 \n", + "-12.96 3.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.3 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.83 1.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.66 0.95 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "24.54 13.06 \n", + "10000000.0 10000000.0 \n", + "3.25 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.39 0.42 \n", + "-49.4 2.6 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "105.79 2.12 \n", + "-9.66 5.58 \n", + "-17.34 0.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "201.94 5.08 \n", + "347.01 0.64 \n", + "10000000.0 10000000.0 \n", + "-0.24 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.9 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.11 7.88 \n", + "-3.04 0.42 \n", + "-97.37 1.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.33 \n", + "10000000.0 10000000.0 \n", + "-3.09 2.28 \n", + "10000000.0 10000000.0 \n", + "170.55 0.82 \n", + "-48.38 3.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.31 2.44 \n", + "-62.53 1.27 \n", + "-4.28 0.86 \n", + "-21.41 0.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "-3.53 6.57 \n", + "10000000.0 10000000.0 \n", + "-19.29 2.26 \n", + "-5.86 0.38 \n", + "10000000.0 10000000.0 \n", + "-13.89 7.22 \n", + "-3.47 0.39 \n", + "10000000.0 10000000.0 \n", + "7.19 0.32 \n", + "10000000.0 10000000.0 \n", + "-61.85 3.54 \n", + "10000000.0 10000000.0 \n", + "4.89 0.25 \n", + "-99.07 1.14 \n", + "10000000.0 10000000.0 \n", + "7.12 2.55 \n", + "0.95 0.84 \n", + "10000000.0 10000000.0 \n", + "-3.81 0.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.86 2.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-94.13 0.75 \n", + "-1.32 0.94 \n", + "10000000.0 10000000.0 \n", + "-4.41 0.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.59 0.64 \n", + "-4.36 5.98 \n", + "-4.36 7.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.71 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.46 2.13 \n", + "10000000.0 10000000.0 \n", + "78.7 39.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-74.54 11.69 \n", + "-9.31 3.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "150.77 0.64 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "-2.88 0.3 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "-4.36 5.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-82.1 5.5 \n", + "-4.36 6.33 \n", + "10000000.0 10000000.0 \n", + "-0.75 0.96 \n", + "None 2.05 \n", + "-6.02 0.56 \n", + "-8.78 0.66 \n", + "-3.87 0.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-80.62 0.75 \n", + "9.59 6.03 \n", + "-0.74 0.53 \n", + "1.63 1.66 \n", + "10000000.0 10000000.0 \n", + "-13.26 1.47 \n", + "10000000.0 10000000.0 \n", + "-4.31 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.74 0.3 \n", + "0.14 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.69 0.46 \n", + "10000000.0 10000000.0 \n", + "-9.79 1.34 \n", + "-1.7 7.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-92.91 1.77 \n", + "-48.38 3.99 \n", + "None 36.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-21.55 6.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-32.24 1.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.22 13.4 \n", + "-14.35 5.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.12 1.34 \n", + "-21.41 0.92 \n", + "10000000.0 10000000.0 \n", + "-8.66 8.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.82 0.35 \n", + "10000000.0 10000000.0 \n", + "-105.88 0.91 \n", + "-2.47 0.53 \n", + "10.3 11.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.22 0.5 \n", + "10000000.0 10000000.0 \n", + "5.18 0.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.47 4.87 \n", + "-0.9 0.51 \n", + "None 6.87 \n", + "-14.68 0.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.97 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.34 8.59 \n", + "-22.21 5.65 \n", + "-91.39 12.93 \n", + "4.44 0.24 \n", + "-94.13 0.75 \n", + "-96.89 1.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-104.14 1.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.18 0.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.37 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.22 4.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-20.64 5.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.3 2.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.22 0.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.75 9.62 \n", + "-1.14 0.86 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.38 0.45 \n", + "-88.93 6.31 \n", + "-0.86 0.57 \n", + "-0.05 0.55 \n", + "-5.27 1.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.71 1.53 \n", + "-24.64 1.05 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.71 \n", + "10000000.0 10000000.0 \n", + "0.32 0.53 \n", + "10000000.0 10000000.0 \n", + "-16.65 1.71 \n", + "10000000.0 10000000.0 \n", + "-1.66 2.77 \n", + "10000000.0 10000000.0 \n", + "-63.97 1.64 \n", + "-14.44 9.86 \n", + "125.2 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 52.67 \n", + "10000000.0 10000000.0 \n", + "3.69 0.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.08 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 7.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 9.26 \n", + "-81.63 0.8 \n", + "-74.14 13.97 \n", + "10000000.0 10000000.0 \n", + "0.95 0.3 \n", + "3.51 0.38 \n", + "-106.05 0.91 \n", + "-4.36 6.19 \n", + "-3.83 0.39 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "-0.37 0.49 \n", + "-9.31 4.79 \n", + "6.48 0.85 \n", + "-4.36 5.53 \n", + "10000000.0 10000000.0 \n", + "-5.75 11.29 \n", + "10000000.0 10000000.0 \n", + "345.25 1.38 \n", + "-79.05 1.96 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-25.04 2.76 \n", + "10000000.0 10000000.0 \n", + "7.22 1.36 \n", + "10000000.0 10000000.0 \n", + "6.34 0.54 \n", + "-4.36 11.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "21.7 1.69 \n", + "-36.69 2.69 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.81 \n", + "8.43 5.36 \n", + "-194.4 1.6 \n", + "10000000.0 10000000.0 \n", + "-3.4 1.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.65 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.43 2.21 \n", + "10000000.0 10000000.0 \n", + "55.69 0.97 \n", + "10000000.0 10000000.0 \n", + "7.19 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-27.02 3.12 \n", + "-3.53 0.76 \n", + "10000000.0 10000000.0 \n", + "10.72 2.07 \n", + "10000000.0 10000000.0 \n", + "-9.0 0.26 \n", + "10000000.0 10000000.0 \n", + "188.9 5.08 \n", + "10000000.0 10000000.0 \n", + "-0.37 0.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.7 0.98 \n", + "None 14.71 \n", + "10000000.0 10000000.0 \n", + "-0.46 5.14 \n", + "-39.57 1.11 \n", + "-97.44 0.8 \n", + "10000000.0 10000000.0 \n", + "-5.81 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.02 0.37 \n", + "10000000.0 10000000.0 \n", + "-11.56 1.23 \n", + "None 1.88 \n", + "-33.25 9.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.97 0.47 \n", + "-4.36 6.38 \n", + "10000000.0 10000000.0 \n", + "-1.25 1.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.32 0.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-69.98 4.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.68 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.24 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-110.23 1.25 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.02 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.86 6.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.9 1.45 \n", + "10000000.0 10000000.0 \n", + "-1.66 2.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.09 0.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-53.02 4.97 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.79 0.89 \n", + "-2.46 0.54 \n", + "-4.58 0.52 \n", + "10000000.0 10000000.0 \n", + "6.24 1.0 \n", + "-20.37 20.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "177.5 0.35 \n", + "10000000.0 10000000.0 \n", + "-95.07 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.21 0.18 \n", + "10000000.0 10000000.0 \n", + "-15.13 6.71 \n", + "452.9 1.91 \n", + "0.29 0.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.18 0.5 \n", + "-54.09 2.0 \n", + "7.56 0.6 \n", + "10000000.0 10000000.0 \n", + "2.2 0.18 \n", + "10000000.0 10000000.0 \n", + "None 1.88 \n", + "-4.36 5.95 \n", + "-0.46 2.22 \n", + "-4.36 5.87 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.31 1.07 \n", + "10000000.0 10000000.0 \n", + "-96.82 7.07 \n", + "10000000.0 10000000.0 \n", + "-5.5 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.24 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.22 14.29 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-102.36 1.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "13.26 1.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.96 3.77 \n", + "-1.7 1.19 \n", + "-0.18 0.36 \n", + "-15.14 1.21 \n", + "-4.36 7.67 \n", + "10000000.0 10000000.0 \n", + "2.89 3.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 5.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.85 4.75 \n", + "-1.7 7.81 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.66 5.24 \n", + "10000000.0 10000000.0 \n", + "-26.17 5.56 \n", + "-6.08 6.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.8 0.66 \n", + "-63.86 1.17 \n", + "-14.6 2.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-75.26 13.55 \n", + "-93.98 1.29 \n", + "None 0.44 \n", + "10000000.0 10000000.0 \n", + "-6.02 0.56 \n", + "10000000.0 10000000.0 \n", + "-14.03 10.79 \n", + "240.79 2.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-105.54 7.39 \n", + "-1.76 0.41 \n", + "0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.24 0.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-87.36 2.22 \n", + "10000000.0 10000000.0 \n", + "None 1.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-60.93 3.32 \n", + "10000000.0 10000000.0 \n", + "7.19 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-61.85 1.31 \n", + "10000000.0 10000000.0 \n", + "-9.39 2.39 \n", + "-9.39 4.52 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.18 0.36 \n", + "-2.67 11.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "-52.78 6.62 \n", + "None 4.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-67.62 2.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.89 0.25 \n", + "10000000.0 10000000.0 \n", + "-64.51 2.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-95.07 0.74 \n", + "-0.28 0.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.02 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-88.56 7.14 \n", + "-5.2 43.14 \n", + "-4.13 1.05 \n", + "-4.36 5.78 \n", + "6.48 0.85 \n", + "10000000.0 10000000.0 \n", + "-0.02 3.47 \n", + "-1.7 8.08 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "633.84 1.4 \n", + "-95.83 6.5 \n", + "-122.89 1.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.23 2.71 \n", + "1.19 0.29 \n", + "10000000.0 10000000.0 \n", + "-1.49 1.31 \n", + "55.18 1.91 \n", + "10000000.0 10000000.0 \n", + "-0.28 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.27 0.95 \n", + "10000000.0 10000000.0 \n", + "-10.46 5.18 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 3.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.66 0.8 \n", + "10000000.0 10000000.0 \n", + "0.72 0.84 \n", + "-1.41 0.33 \n", + "-71.13 4.47 \n", + "-4.36 7.88 \n", + "0.63 0.26 \n", + "10000000.0 10000000.0 \n", + "-14.03 12.88 \n", + "10000000.0 10000000.0 \n", + "1.55 0.5 \n", + "-2.03 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.79 0.33 \n", + "10000000.0 10000000.0 \n", + "-6.43 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.64 0.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.24 0.63 \n", + "10000000.0 10000000.0 \n", + "-3.98 0.33 \n", + "-29.0 1.76 \n", + "10000000.0 10000000.0 \n", + "-137.68 8.37 \n", + "10000000.0 10000000.0 \n", + "-3.91 0.53 \n", + "0.9 0.62 \n", + "10000000.0 10000000.0 \n", + "-3.82 0.44 \n", + "-0.83 1.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.8 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-13.35 1.67 \n", + "10000000.0 10000000.0 \n", + "-35.94 1.01 \n", + "10000000.0 10000000.0 \n", + "-1.98 0.56 \n", + "-3.04 0.42 \n", + "10000000.0 10000000.0 \n", + "-26.84 4.57 \n", + "-0.88 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.95 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.77 0.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.61 0.84 \n", + "10000000.0 10000000.0 \n", + "-21.18 4.7 \n", + "-23.57 10.51 \n", + "10000000.0 10000000.0 \n", + "None 2.98 \n", + "10000000.0 10000000.0 \n", + "-3.11 8.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "0.38 0.45 \n", + "-0.52 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.9 0.42 \n", + "10000000.0 10000000.0 \n", + "-0.94 0.17 \n", + "-3.04 0.42 \n", + "10000000.0 10000000.0 \n", + "-0.24 0.65 \n", + "10000000.0 10000000.0 \n", + "-11.68 0.39 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.82 0.44 \n", + "-16.87 0.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-26.84 5.69 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.67 0.4 \n", + "-2.61 0.5 \n", + "10000000.0 10000000.0 \n", + "11.68 17.95 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.37 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-34.94 1.12 \n", + "10000000.0 10000000.0 \n", + "87.3 0.36 \n", + "7.19 0.32 \n", + "14.27 0.34 \n", + "1.22 2.85 \n", + "0.48 1.95 \n", + "64.32 6.11 \n", + "0.28 0.38 \n", + "7.22 5.13 \n", + "10000000.0 10000000.0 \n", + "-60.68 3.91 \n", + "10000000.0 10000000.0 \n", + "-4.31 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "453.65 1.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-14.03 4.84 \n", + "-27.07 4.66 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.36 6.48 \n", + "-3.53 6.32 \n", + "7.75 0.68 \n", + "10000000.0 10000000.0 \n", + "-14.03 5.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-9.56 4.91 \n", + "10000000.0 10000000.0 \n", + "46.99 0.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-47.33 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-59.72 0.33 \n", + "58.87 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.47 4.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.74 0.47 \n", + "-135.93 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "11.45 2.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "208.81 0.14 \n", + "-212.82 0.16 \n", + "10000000.0 10000000.0 \n", + "-211.77 0.44 \n", + "204.39 0.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.64 0.86 \n", + "-15.65 0.87 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "21.94 0.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-269.79 0.65 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "59.81 0.4 \n", + "-191.66 12.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-12.31 0.75 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.95 4.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-56.99 4.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.02 0.28 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-125.73 0.57 \n", + "-64.18 0.33 \n", + "-58.02 0.82 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "15.88 7.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.7 1.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-214.97 0.14 \n", + "-4.36 7.37 \n", + "10000000.0 10000000.0 \n", + "-1.05 0.37 \n", + "40.53 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "55.7 8.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-30.79 0.38 \n", + "10000000.0 10000000.0 \n", + "-211.94 1.81 \n", + "130.29 0.54 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.7 6.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "121.36 1.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.11 0.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-19.86 10.91 \n", + "10000000.0 10000000.0 \n", + "-7.87 2.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.74 8.09 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.28 1.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.19 0.32 \n", + "10000000.0 10000000.0 \n", + "-32.56 2.8 \n", + "107.07 1.08 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "268.92 0.96 \n", + "10000000.0 10000000.0 \n", + "40.54 0.47 \n", + "-12.27 0.77 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "18.83 5.64 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "206.41 0.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "240.8 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "336.9 1.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "58.67 0.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "43.97 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.8 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "320.17 2.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "130.27 0.56 \n", + "10000000.0 10000000.0 \n", + "-26.13 0.96 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.41 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.99 0.8 \n", + "-2.39 0.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.42 4.94 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "71.63 3.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.77 0.53 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "44.77 1.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.44 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-10.37 0.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "22.7 0.78 \n", + "22.7 0.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.7 3.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "39.18 0.34 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-1.49 0.81 \n", + "56.08 4.97 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.44 1.35 \n", + "10000000.0 10000000.0 \n", + "-3.11 0.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.87 0.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "234.97 2.76 \n", + "-10.37 0.2 \n", + "-23.93 0.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-110.65 1.18 \n", + "10000000.0 10000000.0 \n", + "-13.2 1.07 \n", + "10000000.0 10000000.0 \n", + "433.04 1.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-11.92 3.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-107.87 1.44 \n", + "-80.62 0.75 \n", + "-94.25 0.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.6 6.38 \n", + "-8.26 9.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-89.38 1.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.29 0.8 \n", + "-75.41 0.8 \n", + "138.88 1.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-226.79 1.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-183.29 1.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-64.93 4.26 \n", + "0.46 4.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-82.17 2.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.1 2.41 \n", + "-1.36 0.59 \n", + "-12.31 0.75 \n", + "-21.34 0.25 \n", + "-283.04 1.36 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-101.72 0.27 \n", + "-236.65 1.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.93 0.56 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-371.91 2.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "9.19 3.93 \n", + "9.19 3.93 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "1.0 0.52 \n", + "10000000.0 10000000.0 \n", + "-0.46 1.22 \n", + "-6.86 1.89 \n", + "-2.16 0.97 \n", + "-2.25 0.96 \n", + "-2.03 0.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "47.13 1.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.04 1.51 \n", + "10000000.0 10000000.0 \n", + "-0.46 6.84 \n", + "0.35 0.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-50.13 0.35 \n", + "0.79 0.41 \n", + "10000000.0 10000000.0 \n", + "-70.88 0.37 \n", + "10000000.0 10000000.0 \n", + "38.0 1.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.3 0.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.27 0.66 \n", + "0.24 0.41 \n", + "10000000.0 10000000.0 \n", + "2.1 4.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.73 0.55 \n", + "10000000.0 10000000.0 \n", + "-10.38 1.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 7.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 5.78 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 6.12 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 5.96 \n", + "-6.16 0.07 \n", + "-6.81 6.12 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 6.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 6.21 \n", + "-6.81 6.42 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 6.11 \n", + "-6.81 6.11 \n", + "-6.81 6.24 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 6.25 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 6.37 \n", + "-6.81 6.57 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 6.3 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 6.44 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 6.05 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 5.02 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 5.94 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 6.97 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 7.12 \n", + "-6.81 7.12 \n", + "-6.16 0.07 \n", + "-6.81 7.22 \n", + "-6.81 7.38 \n", + "-6.81 6.38 \n", + "-6.81 6.41 \n", + "-6.81 6.41 \n", + "-6.81 6.51 \n", + "-6.81 6.51 \n", + "-6.81 6.69 \n", + "-6.16 0.07 \n", + "-6.81 6.55 \n", + "-6.81 6.56 \n", + "-6.81 6.72 \n", + "-6.81 6.72 \n", + "-6.81 6.72 \n", + "-6.81 6.81 \n", + "-6.81 6.36 \n", + "-6.81 6.31 \n", + "-6.81 6.34 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 6.54 \n", + "-6.81 6.48 \n", + "-6.81 6.5 \n", + "-6.16 0.07 \n", + "-6.81 6.71 \n", + "-6.81 6.65 \n", + "-6.81 6.66 \n", + "-6.16 0.07 \n", + "-6.81 6.82 \n", + "-6.81 6.82 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 4.92 \n", + "-6.16 0.07 \n", + "-6.81 5.93 \n", + "-6.81 5.93 \n", + "-6.16 0.07 \n", + "-6.81 6.22 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 4.8 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 4.7 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 4.74 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 24.02 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 8.05 \n", + "-6.16 0.07 \n", + "-6.81 8.78 \n", + "-6.81 9.91 \n", + "-6.81 11.85 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 11.08 \n", + "-6.81 15.91 \n", + "-6.81 6.69 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 5.04 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 7.75 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.81 5.02 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 7.53 \n", + "-6.81 7.82 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 18.47 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 7.91 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 4.76 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 8.39 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 15.88 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 4.9 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 8.05 \n", + "-6.81 9.91 \n", + "-6.81 11.85 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 7.02 \n", + "-6.81 6.94 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.81 8.01 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.81 8.94 \n", + "-6.81 8.51 \n", + "-6.16 0.07 \n", + "-6.81 7.26 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.81 7.25 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 9.14 \n", + "-6.81 8.88 \n", + "-6.16 0.07 \n", + "-6.81 12.14 \n", + "10000000.0 10000000.0 \n", + "-6.81 24.02 \n", + "-6.16 0.07 \n", + "-6.81 15.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 7.01 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 6.95 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 13.57 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 5.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.81 7.64 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 5.27 \n", + "-6.16 0.07 \n", + "-6.81 8.88 \n", + "-6.81 9.1 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.81 9.29 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.81 7.04 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.56 0.33 \n", + "-11.67 0.39 \n", + "-9.31 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.3 12.91 \n", + "1.0 0.09 \n", + "-72.91 1.9 \n", + "-9.94 1.83 \n", + "10000000.0 10000000.0 \n", + "-2.44 0.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.78 0.75 \n", + "1.21 0.82 \n", + "-3.78 0.75 \n", + "4.73 0.71 \n", + "2.95 0.3 \n", + "4.49 0.57 \n", + "4.49 0.57 \n", + "10000000.0 10000000.0 \n", + "-1.18 0.45 \n", + "-1.18 0.45 \n", + "-8.4 0.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-364.54 7.23 \n", + "-321.97 5.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-478.4 2.81 \n", + "-416.26 1.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-54.24 5.78 \n", + "10000000.0 10000000.0 \n", + "-0.07 0.69 \n", + "0.61 1.02 \n", + "-27.3 0.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.36 0.37 \n", + "-18.75 0.66 \n", + "10000000.0 10000000.0 \n", + "-17.94 1.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.37 0.34 \n", + "-3.34 0.67 \n", + "-1.34 0.82 \n", + "-1.29 0.45 \n", + "-2.05 1.01 \n", + "10000000.0 10000000.0 \n", + "-0.13 0.73 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.71 1.43 \n", + "-22.74 4.57 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "-2.64 1.79 \n", + "-2.64 1.79 \n", + "-28.53 1.54 \n", + "-28.53 1.54 \n", + "None 1.0 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-3.89 0.58 \n", + "-6.77 0.31 \n", + "-6.77 0.31 \n", + "-9.67 0.61 \n", + "-8.78 0.63 \n", + "10000000.0 10000000.0 \n", + "1.71 4.5 \n", + "-75.98 3.57 \n", + "None 67.64 \n", + "356.38 60.74 \n", + "-1.7 25.08 \n", + "-1.7 29.89 \n", + "-1.7 39.36 \n", + "1.24 0.54 \n", + "None 13.17 \n", + "-5.97 0.42 \n", + "-3.88 0.56 \n", + "-1.7 12.91 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 1.99 \n", + "10000000.0 10000000.0 \n", + "None 0.78 \n", + "-90.63 3.53 \n", + "10000000.0 10000000.0 \n", + "-20.64 7.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-41.44 6.04 \n", + "-0.67 12.28 \n", + "-41.44 5.89 \n", + "-0.67 12.21 \n", + "-6.16 0.07 \n", + "None 0.72 \n", + "None 2.19 \n", + "None 2.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.13 \n", + "None 1.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.63 0.24 \n", + "-52.68 1.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.17 \n", + "None 1.17 \n", + "-9.57 1.97 \n", + "None 0.71 \n", + "None 0.71 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.2 \n", + "-47.65 1.66 \n", + "None 0.31 \n", + "None 0.31 \n", + "10000000.0 10000000.0 \n", + "None 0.25 \n", + "-4.18 0.79 \n", + "-2.7 0.08 \n", + "-10.93 1.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.13 \n", + "None 1.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "1.11 1.62 \n", + "-6.81 4.66 \n", + "None 1.64 \n", + "None 1.33 \n", + "10000000.0 10000000.0 \n", + "None 1.33 \n", + "None 1.9 \n", + "None 1.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.41 0.7 \n", + "-6.16 0.07 \n", + "None 1.04 \n", + "None 0.75 \n", + "None 0.75 \n", + "None 0.42 \n", + "None 0.42 \n", + "8.6 6.67 \n", + "12.69 6.65 \n", + "-5.55 0.64 \n", + "0.26 0.49 \n", + "None 1.87 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "None 1.91 \n", + "None 2.12 \n", + "None 2.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.82 0.43 \n", + "-10.79 0.5 \n", + "None 1.4 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.44 \n", + "10000000.0 10000000.0 \n", + "None 0.44 \n", + "10000000.0 10000000.0 \n", + "None 1.34 \n", + "None 1.34 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.71 \n", + "-6.16 0.07 \n", + "-4.32 0.43 \n", + "-4.31 0.43 \n", + "None 1.64 \n", + "None 0.4 \n", + "None 0.4 \n", + "None 0.4 \n", + "-17.0 1.55 \n", + "None 1.09 \n", + "-8.75 0.74 \n", + "None 3.92 \n", + "-6.16 0.07 \n", + "-6.16 0.07 \n", + "None 1.06 \n", + "10000000.0 10000000.0 \n", + "None 0.75 \n", + "None 0.64 \n", + "-6.16 0.07 \n", + "None 1.1 \n", + "None 8.05 \n", + "10000000.0 10000000.0 \n", + "-5.83 0.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.08 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "None 2.5 \n", + "None 2.5 \n", + "None 3.63 \n", + "-6.16 0.07 \n", + "None 0.61 \n", + "None 0.58 \n", + "None 0.58 \n", + "10000000.0 10000000.0 \n", + "None 0.58 \n", + "None 2.12 \n", + "None 2.12 \n", + "-57.04 4.82 \n", + "-52.81 1.37 \n", + "-52.81 1.37 \n", + "-47.24 1.63 \n", + "-47.24 1.63 \n", + "None 3.07 \n", + "None 1.71 \n", + "-1.46 1.02 \n", + "-11.02 0.54 \n", + "None 4.27 \n", + "None 2.23 \n", + "None 2.23 \n", + "-6.81 4.41 \n", + "None 0.71 \n", + "None 1.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.26 \n", + "7.22 1.46 \n", + "None 1.29 \n", + "None 1.27 \n", + "None 1.27 \n", + "-6.01 0.82 \n", + "-6.24 1.14 \n", + "None 4.58 \n", + "-145.01 5.64 \n", + "None 7.88 \n", + "None 4.58 \n", + "-7.08 0.97 \n", + "None 4.41 \n", + "10000000.0 10000000.0 \n", + "None 4.37 \n", + "None 4.41 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "31.66 0.59 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.66 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 2.18 \n", + "None 2.18 \n", + "None 0.71 \n", + "None 0.71 \n", + "-22.39 2.12 \n", + "None 2.69 \n", + "None 2.69 \n", + "-6.16 0.07 \n", + "None 0.62 \n", + "None 0.62 \n", + "None 3.78 \n", + "None 3.78 \n", + "None 3.78 \n", + "None 3.93 \n", + "None 3.95 \n", + "None 3.95 \n", + "-6.16 0.07 \n", + "None 1.94 \n", + "None 1.94 \n", + "None 0.91 \n", + "None 0.91 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "3.1 0.42 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.27 0.73 \n", + "-2.33 0.38 \n", + "-20.94 1.86 \n", + "-17.0 1.55 \n", + "-51.44 2.63 \n", + "-45.62 2.57 \n", + "10000000.0 10000000.0 \n", + "-15.65 0.87 \n", + "-46.95 2.6 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-15.18 0.93 \n", + "10000000.0 10000000.0 \n", + "-15.19 1.83 \n", + "10000000.0 10000000.0 \n", + "-16.12 0.96 \n", + "10000000.0 10000000.0 \n", + "-16.1 1.55 \n", + "10000000.0 10000000.0 \n", + "-15.65 0.87 \n", + "10000000.0 10000000.0 \n", + "-15.65 0.87 \n", + "-15.65 0.87 \n", + "10000000.0 10000000.0 \n", + "-15.65 0.87 \n", + "-15.65 0.87 \n", + "10000000.0 10000000.0 \n", + "-15.65 0.87 \n", + "-2.61 0.35 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.62 0.35 \n", + "-2.62 0.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-61.4 3.25 \n", + "-60.08 3.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-17.46 1.06 \n", + "-16.98 1.12 \n", + "-17.46 1.06 \n", + "-17.46 1.06 \n", + "-17.46 1.06 \n", + "10000000.0 10000000.0 \n", + "10.92 0.92 \n", + "-1.05 0.37 \n", + "-10.34 0.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.56 0.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.77 0.58 \n", + "-6.36 0.72 \n", + "3.05 5.07 \n", + "10000000.0 10000000.0 \n", + "-28.27 1.63 \n", + "-31.87 1.48 \n", + "-31.87 1.48 \n", + "-35.4 1.67 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.16 0.07 \n", + "6.16 0.07 \n", + "6.16 0.07 \n", + "-6.11 2.69 \n", + "-8.35 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.8 0.75 \n", + "-10.4 1.02 \n", + "-9.16 0.67 \n", + "-1.38 0.46 \n", + "-29.08 1.5 \n", + "4.8 1.49 \n", + "10000000.0 10000000.0 \n", + "91.96 1.72 \n", + "-9.86 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.61 0.59 \n", + "-2.68 0.6 \n", + "-3.01 0.64 \n", + "10000000.0 10000000.0 \n", + "-113.88 10.96 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-51.63 2.72 \n", + "-52.25 2.45 \n", + "-10.74 0.59 \n", + "-21.54 0.99 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.47 \n", + "None 4.55 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 2.14 \n", + "None 9.74 \n", + "None 9.69 \n", + "10000000.0 10000000.0 \n", + "None 1.75 \n", + "None 9.8 \n", + "None 1.94 \n", + "None 1.13 \n", + "None 3.78 \n", + "None 0.71 \n", + "None 1.51 \n", + "None 4.27 \n", + "None 2.12 \n", + "None 3.63 \n", + "None 3.92 \n", + "None 2.88 \n", + "None 1.64 \n", + "None 1.4 \n", + "None 1.4 \n", + "None 1.91 \n", + "10000000.0 10000000.0 \n", + "None 4.3 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.99 \n", + "None 2.84 \n", + "None 2.96 \n", + "None 1.16 \n", + "None 4.27 \n", + "None 0.79 \n", + "10000000.0 10000000.0 \n", + "None 1.75 \n", + "None 4.33 \n", + "None 0.86 \n", + "None 2.18 \n", + "None 0.31 \n", + "None 1.92 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 9.69 \n", + "None 2.55 \n", + "None 2.52 \n", + "None 3.8 \n", + "None 3.8 \n", + "None 0.96 \n", + "None 0.99 \n", + "None 2.8 \n", + "None 2.79 \n", + "None 3.13 \n", + "-6.16 0.07 \n", + "None 1.94 \n", + "None 5.2 \n", + "None 2.69 \n", + "None 2.79 \n", + "None 0.69 \n", + "None 0.71 \n", + "None 0.79 \n", + "None 0.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 3.87 \n", + "None 0.71 \n", + "None 0.62 \n", + "None 1.27 \n", + "None 2.23 \n", + "None 0.58 \n", + "None 4.27 \n", + "None 1.09 \n", + "None 0.81 \n", + "None 0.44 \n", + "None 4.07 \n", + "None 2.09 \n", + "None 0.42 \n", + "10000000.0 10000000.0 \n", + "None 1.87 \n", + "None 1.33 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 1.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 4.3 \n", + "None 0.69 \n", + "None 2.22 \n", + "None 0.87 \n", + "None 0.72 \n", + "None 5.73 \n", + "None 0.49 \n", + "None 0.71 \n", + "None 2.84 \n", + "None 0.71 \n", + "None 4.37 \n", + "None 1.16 \n", + "None 0.83 \n", + "None 0.79 \n", + "None 2.21 \n", + "None 2.21 \n", + "None 5.11 \n", + "None 1.6 \n", + "None 0.71 \n", + "None 3.55 \n", + "None 3.89 \n", + "None 0.34 \n", + "None 0.54 \n", + "10000000.0 10000000.0 \n", + "None 0.54 \n", + "None 0.31 \n", + "-11.27 0.87 \n", + "None 0.71 \n", + "None 8.61 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 0.66 \n", + "None 0.64 \n", + "None 0.59 \n", + "None 3.93 \n", + "None 3.69 \n", + "None 4.26 \n", + "None 0.45 \n", + "None 0.35 \n", + "None 2.8 \n", + "None 4.02 \n", + "None 0.71 \n", + "None 2.72 \n", + "None 0.98 \n", + "None 1.09 \n", + "None 0.83 \n", + "None 6.08 \n", + "None 0.48 \n", + "None 0.83 \n", + "None 2.21 \n", + "None 5.2 \n", + "None 4.44 \n", + "None 3.86 \n", + "None 0.71 \n", + "None 2.88 \n", + "None 4.03 \n", + "None 0.55 \n", + "None 1.22 \n", + "None 1.26 \n", + "None 0.57 \n", + "None 1.34 \n", + "None 0.49 \n", + "None 0.52 \n", + "10000000.0 10000000.0 \n", + "None 0.57 \n", + "None 0.55 \n", + "None 0.72 \n", + "None 0.68 \n", + "None 1.27 \n", + "None 0.61 \n", + "10000000.0 10000000.0 \n", + "None 0.72 \n", + "None 0.69 \n", + "None 0.99 \n", + "None 2.66 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 0.71 \n", + "None 0.54 \n", + "None 0.86 \n", + "None 3.87 \n", + "None 2.55 \n", + "None 2.04 \n", + "None 3.8 \n", + "None 2.6 \n", + "None 4.21 \n", + "None 0.71 \n", + "None 2.72 \n", + "None 0.76 \n", + "None 1.4 \n", + "None 0.48 \n", + "None 5.2 \n", + "None 0.54 \n", + "None 4.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.27 \n", + "None 0.42 \n", + "None 0.71 \n", + "None 2.84 \n", + "None 0.71 \n", + "None 0.66 \n", + "None 1.0 \n", + "None 0.71 \n", + "None 0.38 \n", + "None 0.78 \n", + "None 2.98 \n", + "None 2.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.75 \n", + "-6.16 0.07 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None 1.51 \n", + "-6.16 0.07 \n", + "None 1.26 \n", + "None 1.02 \n", + "None 0.64 \n", + "None 2.8 \n", + "None 4.02 \n", + "None 0.71 \n", + "None 0.98 \n", + "None 0.83 \n", + "None 6.08 \n", + "None 6.07 \n", + "None 0.72 \n", + "None 0.71 \n", + "None 2.88 \n", + "None 0.57 \n", + "None 1.27 \n", + "None 4.27 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "10000000.0 10000000.0 \n", + "None 0.71 \n", + "None 2.18 \n", + "None 0.71 \n", + "-21.67 1.48 \n", + "-4.96 0.43 \n", + "-8.67 0.27 \n", + "10000000.0 10000000.0 \n", + "-19.42 5.23 \n", + "-8.44 0.34 \n", + "7.37 0.85 \n", + "-6.38 0.98 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.84 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.44 0.56 \n", + "-5.37 0.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.7 0.84 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.1 1.13 \n", + "-4.83 1.13 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.34 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.09 0.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-2.13 0.75 \n", + "-11.78 0.87 \n", + "-8.55 0.85 \n", + "3.21 0.51 \n", + "10000000.0 10000000.0 \n", + "-1.36 0.55 \n", + "-6.15 0.49 \n", + "-8.68 0.26 \n", + "10000000.0 10000000.0 \n", + "-8.68 0.26 \n", + "10000000.0 10000000.0 \n", + "-8.68 0.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.68 0.26 \n", + "-11.98 0.63 \n", + "-8.68 0.26 \n", + "-8.68 0.26 \n", + "-8.68 0.26 \n", + "10000000.0 10000000.0 \n", + "-8.68 0.26 \n", + "1.55 0.84 \n", + "10000000.0 10000000.0 \n", + "373.65 4.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "2.22 0.33 \n", + "5.09 1.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "17.95 1.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "25.58 1.03 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-22.97 1.17 \n", + "10000000.0 10000000.0 \n", + "8.44 0.51 \n", + "-2.03 0.39 \n", + "10000000.0 10000000.0 \n", + "2.36 0.55 \n", + "-6.93 0.23 \n", + "10000000.0 10000000.0 \n", + "-0.98 0.07 \n", + "1.0 0.09 \n", + "10000000.0 10000000.0 \n", + "-4.42 0.11 \n", + "-6.53 0.1 \n", + "-6.42 1.8 \n", + "1.3 0.22 \n", + "-7.41 0.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-22.49 1.11 \n", + "-3.99 0.33 \n", + "-0.88 0.33 \n", + "-14.43 2.15 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-39.55 7.46 \n", + "-18.76 1.3 \n", + "-14.73 1.19 \n", + "0.85 0.65 \n", + "10000000.0 10000000.0 \n", + "-10.7 1.43 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-5.9 1.12 \n", + "0.36 0.71 \n", + "0.14 0.96 \n", + "-6.42 1.8 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "8.13 1.34 \n", + "-10.04 0.79 \n", + "17.59 12.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.29 4.95 \n", + "-10.04 4.53 \n", + "-1.81 1.19 \n", + "-8.92 1.02 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-4.44 0.24 \n", + "-8.51 0.94 \n", + "4.56 0.71 \n", + "-2.72 0.57 \n", + "0.19 0.49 \n", + "-21.94 1.79 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.84 1.14 \n", + "-7.84 1.14 \n", + "-0.83 1.48 \n", + "-12.69 1.11 \n", + "-4.95 0.97 \n", + "-22.19 1.11 \n", + "10000000.0 10000000.0 \n", + "5.3 2.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-40.11 2.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-32.71 2.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-8.15 3.02 \n", + "9.9 1.88 \n", + "9.9 1.88 \n", + "-11.13 4.35 \n", + "-10.42 6.57 \n", + "-0.45 1.16 \n", + "14.14 0.81 \n", + "1.69 1.99 \n", + "1.72 0.24 \n", + "-5.92 0.59 \n", + "-12.38 2.0 \n", + "-10.15 0.27 \n", + "0.44 0.71 \n", + "10000000.0 10000000.0 \n", + "-13.28 2.3 \n", + "-16.57 1.1 \n", + "-18.84 7.46 \n", + "-7.85 1.99 \n", + "-5.79 0.37 \n", + "-8.84 0.76 \n", + "-18.42 5.84 \n", + "-7.13 0.34 \n", + "1.22 0.73 \n", + "2.1 4.19 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-27.53 5.1 \n", + "-5.07 0.71 \n", + "1.06 0.41 \n", + "-28.93 1.06 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-86.46 1.22 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-16.16 0.73 \n", + "1.85 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-294.7 3.27 \n", + "-8.88 3.08 \n", + "10000000.0 10000000.0 \n", + "-19.01 0.45 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-6.37 0.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10.11 0.87 \n", + "1.82 0.08 \n", + "2.57 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "None None \n", + "-20.14 1.86 \n", + "1.4 0.94 \n", + "-8.44 0.34 \n", + "-8.44 0.34 \n", + "None None \n", + "-4.44 0.24 \n", + "-4.44 0.24 \n", + "-5.92 1.01 \n", + "10000000.0 10000000.0 \n", + "-9.09 0.26 \n", + "-0.69 0.38 \n", + "-0.01 5.36 \n", + "-0.69 0.38 \n", + "1.52 0.35 \n", + "-0.38 0.45 \n", + "-5.81 0.35 \n", + "4.89 0.24 \n", + "4.44 0.24 \n", + "9.66 0.82 \n", + "-6.83 1.02 \n", + "-5.72 0.82 \n", + "-0.32 0.43 \n", + "-2.81 4.39 \n", + "-0.32 0.43 \n", + "-5.72 0.82 \n", + "-5.98 1.06 \n", + "-22.86 1.25 \n", + "-2.67 0.69 \n", + "4.04 0.28 \n", + "-64.18 0.33 \n", + "-64.18 0.33 \n", + "10000000.0 10000000.0 \n", + "-214.76 4.42 \n", + "-215.31 0.55 \n", + "-215.31 0.55 \n", + "-15.5 1.25 \n", + "3.52 0.71 \n", + "-226.68 0.57 \n", + "190.71 0.88 \n", + "None 1.47 \n", + "-6.93 0.23 \n", + "10000000.0 10000000.0 \n", + "-3.63 3.1 \n", + "-3.62 0.46 \n", + "-3.62 0.45 \n", + "-3.62 0.46 \n", + "-3.62 0.45 \n", + "-2.99 0.53 \n", + "-2.99 0.53 \n", + "-2.99 0.53 \n", + "-2.99 0.53 \n", + "-0.28 0.37 \n", + "-9.69 1.18 \n", + "-24.69 3.01 \n", + "-15.26 1.57 \n", + "-15.26 1.57 \n", + "-35.58 1.5 \n", + "-35.58 1.5 \n", + "-35.58 1.5 \n", + "-9.69 1.18 \n", + "-24.69 3.01 \n", + "-15.26 1.57 \n", + "-15.26 1.57 \n", + "-35.58 1.5 \n", + "-35.58 1.5 \n", + "-35.58 1.5 \n", + "-4.39 0.71 \n", + "-4.39 0.71 \n", + "-3.78 1.25 \n", + "-18.78 2.9 \n", + "-9.35 1.5 \n", + "-9.35 1.5 \n", + "-29.67 1.67 \n", + "-29.67 1.67 \n", + "-29.67 1.67 \n", + "-105.97 0.91 \n", + "-105.97 0.91 \n", + "-105.97 0.91 \n", + "-194.4 1.6 \n", + "-94.12 0.75 \n", + "-94.12 0.75 \n", + "-116.64 0.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-102.21 0.86 \n", + "-97.2 0.8 \n", + "-97.2 0.8 \n", + "-104.99 2.05 \n", + "-104.99 2.05 \n", + "-55.44 7.96 \n", + "-55.44 7.97 \n", + "-55.44 7.96 \n", + "-55.44 7.97 \n", + "6.93 2.3 \n", + "-23.08 5.64 \n", + "-4.22 2.9 \n", + "-4.22 2.9 \n", + "-44.86 2.95 \n", + "-44.86 2.95 \n", + "-44.86 2.95 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-22.2 4.1 \n", + "-14.64 2.65 \n", + "-20.98 6.74 \n", + "-20.98 3.97 \n", + "-18.11 6.86 \n", + "-18.11 7.48 \n", + "-18.11 8.12 \n", + "-22.2 4.1 \n", + "-14.64 2.65 \n", + "-20.98 6.74 \n", + "-20.98 3.97 \n", + "-18.11 6.86 \n", + "-18.11 7.48 \n", + "-18.11 8.12 \n", + "-3.88 0.56 \n", + "10000000.0 10000000.0 \n", + "1.79 0.71 \n", + "-1.05 0.37 \n", + "-1.01 0.44 \n", + "-1.05 0.37 \n", + "-14.03 5.29 \n", + "-14.03 5.29 \n", + "-14.03 5.29 \n", + "7.05 0.72 \n", + "7.05 0.71 \n", + "-5.9 0.57 \n", + "-8.17 1.42 \n", + "10000000.0 10000000.0 \n", + "-18.75 0.66 \n", + "-0.11 0.82 \n", + "14.98 0.45 \n", + "14.97 0.44 \n", + "-18.62 1.19 \n", + "-17.46 1.06 \n", + "-17.46 1.06 \n", + "-17.46 1.06 \n", + "-17.46 1.06 \n", + "-17.46 1.06 \n", + "-17.46 1.06 \n", + "-17.46 1.06 \n", + "-16.98 1.12 \n", + "-17.46 1.06 \n", + "-17.35 1.14 \n", + "-17.46 1.06 \n", + "-17.46 1.06 \n", + "-17.46 1.06 \n", + "-17.46 1.06 \n", + "3.52 0.71 \n", + "-7.29 0.77 \n", + "-7.29 0.77 \n", + "23.13 1.62 \n", + "23.13 1.62 \n", + "23.13 1.62 \n", + "23.13 1.62 \n", + "24.06 1.67 \n", + "24.06 1.66 \n", + "21.14 1.76 \n", + "21.14 1.76 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "-29.74 6.6 \n", + "-29.74 6.61 \n", + "-30.27 6.58 \n", + "-30.27 6.6 \n", + "4.85 0.44 \n", + "4.85 0.43 \n", + "-47.54 0.82 \n", + "-47.54 0.81 \n", + "4.89 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "5.79 0.65 \n", + "5.79 0.65 \n", + "52.05 7.13 \n", + "52.05 7.14 \n", + "5.79 0.65 \n", + "5.79 0.65 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "-29.74 6.6 \n", + "-29.74 6.61 \n", + "-30.27 6.58 \n", + "-30.27 6.6 \n", + "4.9 0.68 \n", + "4.9 0.68 \n", + "15.98 0.68 \n", + "15.97 0.67 \n", + "7.12 0.68 \n", + "7.12 0.68 \n", + "5.61 0.71 \n", + "5.6 0.71 \n", + "8.52 6.13 \n", + "8.52 6.15 \n", + "5.22 6.14 \n", + "5.22 6.15 \n", + "6.5 0.45 \n", + "6.49 0.45 \n", + "5.51 0.38 \n", + "5.51 0.38 \n", + "-5.9 0.76 \n", + "-5.9 0.76 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "25.45 1.66 \n", + "25.45 1.66 \n", + "22.53 1.71 \n", + "22.53 1.71 \n", + "-5.9 0.76 \n", + "-5.9 0.76 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "25.45 1.66 \n", + "25.45 1.66 \n", + "22.53 1.71 \n", + "22.53 1.71 \n", + "-5.9 0.76 \n", + "-5.9 0.76 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "25.45 1.66 \n", + "25.45 1.66 \n", + "22.53 1.71 \n", + "22.53 1.71 \n", + "-5.9 0.76 \n", + "-5.9 0.76 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "25.45 1.66 \n", + "25.45 1.66 \n", + "22.53 1.71 \n", + "22.53 1.71 \n", + "-5.9 0.76 \n", + "-5.9 0.76 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "25.45 1.66 \n", + "25.45 1.66 \n", + "22.53 1.71 \n", + "22.53 1.71 \n", + "-5.9 0.76 \n", + "-5.9 0.76 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "25.45 1.66 \n", + "25.45 1.66 \n", + "22.53 1.71 \n", + "22.53 1.71 \n", + "-5.9 0.76 \n", + "-5.9 0.76 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "25.45 1.66 \n", + "25.45 1.66 \n", + "22.53 1.71 \n", + "22.53 1.71 \n", + "-5.9 0.76 \n", + "-5.9 0.76 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "24.52 1.6 \n", + "25.45 1.66 \n", + "25.45 1.66 \n", + "22.53 1.71 \n", + "22.53 1.71 \n", + "9.36 0.4 \n", + "9.35 0.39 \n", + "39.77 1.35 \n", + "39.77 1.35 \n", + "39.77 1.35 \n", + "39.77 1.35 \n", + "40.7 1.44 \n", + "40.7 1.44 \n", + "37.78 1.47 \n", + "37.78 1.47 \n", + "9.36 0.4 \n", + "9.35 0.39 \n", + "39.77 1.35 \n", + "39.77 1.35 \n", + "39.77 1.35 \n", + "39.77 1.35 \n", + "40.7 1.44 \n", + "40.7 1.44 \n", + "37.78 1.47 \n", + "37.78 1.47 \n", + "9.36 0.4 \n", + "9.35 0.39 \n", + "39.77 1.35 \n", + "39.77 1.35 \n", + "39.77 1.35 \n", + "39.77 1.35 \n", + "40.7 1.44 \n", + "40.7 1.44 \n", + "37.78 1.47 \n", + "37.78 1.47 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-25.53 1.39 \n", + "-25.53 1.39 \n", + "14.33 7.13 \n", + "14.33 7.14 \n", + "7.39 0.34 \n", + "7.39 0.34 \n", + "14.33 7.13 \n", + "14.33 7.14 \n", + "39.36 8.72 \n", + "39.36 8.73 \n", + "-7.29 0.77 \n", + "-7.29 0.77 \n", + "39.36 8.72 \n", + "39.36 8.73 \n", + "9.36 0.4 \n", + "9.35 0.39 \n", + "6.28 0.26 \n", + "6.28 0.26 \n", + "9.36 0.4 \n", + "9.35 0.39 \n", + "7.39 0.34 \n", + "7.39 0.34 \n", + "-7.29 0.77 \n", + "-7.29 0.77 \n", + "-7.29 0.77 \n", + "-7.29 0.77 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-23.54 1.51 \n", + "-23.54 1.5 \n", + "-25.53 1.39 \n", + "-25.53 1.39 \n", + "-22.24 1.49 \n", + "-22.24 1.49 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-22.8 1.45 \n", + "-22.8 1.45 \n", + "-22.8 1.45 \n", + "-22.8 1.45 \n", + "-22.63 1.4 \n", + "-22.64 1.4 \n", + "-22.63 1.4 \n", + "-22.64 1.4 \n", + "-13.17 1.52 \n", + "-13.17 1.52 \n", + "-23.54 1.51 \n", + "-23.54 1.5 \n", + "-26.41 6.55 \n", + "-26.41 6.57 \n", + "-26.94 6.53 \n", + "-26.94 6.55 \n", + "8.52 6.41 \n", + "8.52 6.43 \n", + "18.64 7.26 \n", + "18.64 7.27 \n", + "18.11 7.24 \n", + "18.11 7.25 \n", + "4.89 0.24 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "5.82 0.62 \n", + "5.82 0.62 \n", + "2.9 0.55 \n", + "2.9 0.54 \n", + "30.11 7.09 \n", + "30.11 7.11 \n", + "37.81 1.42 \n", + "37.81 1.42 \n", + "30.11 7.09 \n", + "30.11 7.11 \n", + "55.14 8.69 \n", + "55.14 8.7 \n", + "23.13 1.62 \n", + "23.13 1.62 \n", + "55.14 8.69 \n", + "55.14 8.7 \n", + "39.77 1.35 \n", + "39.77 1.35 \n", + "36.7 1.39 \n", + "36.69 1.39 \n", + "39.77 1.35 \n", + "39.77 1.35 \n", + "37.81 1.42 \n", + "37.81 1.42 \n", + "23.13 1.62 \n", + "23.13 1.62 \n", + "23.13 1.62 \n", + "23.13 1.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "6.88 0.4 \n", + "6.88 0.4 \n", + "4.89 0.25 \n", + "4.89 0.24 \n", + "8.17 0.76 \n", + "8.17 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "7.61 0.54 \n", + "7.61 0.54 \n", + "7.61 0.54 \n", + "7.61 0.54 \n", + "7.78 0.43 \n", + "7.78 0.43 \n", + "7.78 0.43 \n", + "7.78 0.43 \n", + "17.25 0.43 \n", + "17.24 0.43 \n", + "6.88 0.4 \n", + "6.88 0.4 \n", + "4.89 0.24 \n", + "6.27 0.48 \n", + "6.26 0.48 \n", + "3.9 0.48 \n", + "3.9 0.48 \n", + "5.88 0.28 \n", + "5.87 0.28 \n", + "15.21 0.32 \n", + "15.21 0.32 \n", + "7.25 0.53 \n", + "7.25 0.53 \n", + "30.11 7.09 \n", + "30.11 7.11 \n", + "30.99 7.1 \n", + "30.99 7.11 \n", + "31.3 7.14 \n", + "31.3 7.15 \n", + "37.81 1.42 \n", + "37.81 1.42 \n", + "-37.54 0.18 \n", + "3.92 0.71 \n", + "301.15 1.97 \n", + "-12.55 0.71 \n", + "-12.83 0.71 \n", + "276.09 1.72 \n", + "2.95 4.67 \n", + "0.0 0.0 \n", + "-70.22 5.56 \n", + "-502.62 1.46 \n", + "10000000.0 10000000.0 \n", + "-480.68 1.14 \n", + "10000000.0 10000000.0 \n", + "-627.54 1.16 \n", + "179.11 2.26 \n", + "-418.46 1.06 \n", + "-29.44 2.33 \n", + "390.79 2.23 \n", + "-59.27 0.85 \n", + "10000000.0 10000000.0 \n", + "-87.67 0.3 \n", + "10000000.0 10000000.0 \n", + "-66.63 3.68 \n", + "10000000.0 10000000.0 \n", + "115.75 0.96 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-329.32 1.77 \n", + "10000000.0 10000000.0 \n", + "-209.06 1.06 \n", + "10000000.0 10000000.0 \n", + "-483.1 1.62 \n", + "-59.86 2.4 \n", + "-498.36 1.63 \n", + "2.67 2.26 \n", + "-113.81 2.23 \n", + "-51.01 3.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "802.68 5.13 \n", + "10000000.0 10000000.0 \n", + "801.69 5.32 \n", + "10000000.0 10000000.0 \n", + "797.51 5.21 \n", + "796.52 5.41 \n", + "830.27 5.79 \n", + "10000000.0 10000000.0 \n", + "781.1 5.85 \n", + "10000000.0 10000000.0 \n", + "731.93 5.92 \n", + "91.66 1.03 \n", + "-538.39 1.22 \n", + "33.21 1.15 \n", + "301.85 1.86 \n", + "591.86 3.81 \n", + "41.94 4.19 \n", + "-51.41 0.64 \n", + "-122.29 1.06 \n", + "-109.87 0.86 \n", + "-2.17 0.58 \n", + "-60.62 0.81 \n", + "591.86 3.81 \n", + "-68.68 1.12 \n", + "68.77 5.16 \n", + "-139.21 5.41 \n", + "-41.92 0.33 \n", + "-32.23 5.27 \n", + "-1.65 5.23 \n", + "10000000.0 10000000.0 \n", + "-6.13 2.06 \n", + "-237.5 2.34 \n", + "-429.53 1.87 \n", + "148.67 1.0 \n", + "-92.26 0.71 \n", + "236.76 1.01 \n", + "281.75 1.49 \n", + "-33.28 0.96 \n", + "-54.23 2.19 \n", + "110.02 0.7 \n", + "-236.57 3.58 \n", + "-274.69 3.94 \n", + "-548.85 0.36 \n", + "-205.23 0.75 \n", + "-464.02 0.27 \n", + "-130.8 0.29 \n", + "-904.31 3.62 \n", + "-531.87 1.84 \n", + "-105.68 2.77 \n", + "-63.36 2.89 \n", + "-692.83 4.04 \n", + "-64.35 3.01 \n", + "-64.35 3.01 \n", + "-65.34 3.16 \n", + "279.51 1.54 \n", + "63.85 4.82 \n", + "278.52 1.68 \n", + "86.21 4.91 \n", + "-87.06 2.69 \n", + "-153.0 2.21 \n", + "-218.28 1.54 \n", + "-327.76 2.95 \n", + "-313.58 3.48 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-171.54 1.14 \n", + "-100.66 1.02 \n", + "-171.53 1.14 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "343.94 1.51 \n", + "10000000.0 10000000.0 \n", + "-49.62 0.51 \n", + "-40.09 0.46 \n", + "-49.2 0.17 \n", + "-340.04 0.3 \n", + "-248.97 0.33 \n", + "-414.01 1.12 \n", + "-286.41 1.59 \n", + "-63.22 0.45 \n", + "-271.15 1.59 \n", + "-82.42 0.63 \n", + "-124.69 0.47 \n", + "-252.51 0.18 \n", + "99.77 0.75 \n", + "122.4 0.39 \n", + "-273.02 0.55 \n", + "-153.92 0.62 \n", + "-455.32 1.91 \n", + "-417.96 2.06 \n", + "-506.08 1.93 \n", + "-118.5 2.43 \n", + "-109.39 1.92 \n", + "6.89 1.56 \n", + "-76.12 1.01 \n", + "10000000.0 10000000.0 \n", + "-51.35 1.01 \n", + "10000000.0 10000000.0 \n", + "-443.56 1.86 \n", + "-129.39 6.26 \n", + "-198.43 0.81 \n", + "-190.41 0.79 \n", + "-198.43 0.81 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-30.56 4.94 \n", + "46.33 0.31 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-241.65 0.78 \n", + "-231.17 0.79 \n", + "-296.58 3.2 \n", + "-437.6 1.99 \n", + "-486.85 2.11 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-261.59 0.14 \n", + "10000000.0 10000000.0 \n", + "-111.05 0.74 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-791.47 4.15 \n", + "-20.05 2.93 \n", + "-15.1 2.94 \n", + "22.26 3.07 \n", + "27.22 3.08 \n", + "64.58 3.21 \n", + "-220.42 4.94 \n", + "-250.02 5.1 \n", + "-274.2 5.52 \n", + "-322.17 5.17 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "587.51 3.87 \n", + "607.17 4.0 \n", + "691.85 4.42 \n", + "711.5 4.55 \n", + "1004.85 6.11 \n", + "1024.51 6.23 \n", + "900.51 5.54 \n", + "920.17 5.67 \n", + "-610.68 1.27 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "732.51 4.86 \n", + "755.83 4.92 \n", + "941.17 6.01 \n", + "964.5 6.06 \n", + "836.84 5.43 \n", + "860.16 5.48 \n", + "628.17 4.29 \n", + "651.5 4.35 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "662.26 4.69 \n", + "685.57 4.84 \n", + "975.26 6.33 \n", + "998.58 6.45 \n", + "-309.74 3.08 \n", + "-99.34 2.49 \n", + "-172.61 0.32 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-440.81 1.32 \n", + "-420.59 1.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "214.62 1.62 \n", + "-45.96 2.17 \n", + "-454.6 3.56 \n", + "-55.9 3.55 \n", + "-1.16 6.64 \n", + "-1.16 6.64 \n", + "-133.77 1.77 \n", + "74.78 1.69 \n", + "286.46 1.65 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-673.08 3.7 \n", + "581.21 6.67 \n", + "-516.3 2.74 \n", + "-632.02 7.23 \n", + "-833.72 8.23 \n", + "-992.2 9.4 \n", + "909.45 6.34 \n", + "-270.74 1.36 \n", + "642.75 6.52 \n", + "10000000.0 10000000.0 \n", + "149.71 0.9 \n", + "135.47 0.83 \n", + "10000000.0 10000000.0 \n", + "72.09 1.02 \n", + "-810.91 3.7 \n", + "10000000.0 10000000.0 \n", + "-56.78 8.32 \n", + "700.9 6.38 \n", + "-1102.35 10.26 \n", + "700.9 6.38 \n", + "10000000.0 10000000.0 \n", + "-150.81 0.32 \n", + "10000000.0 10000000.0 \n", + "-123.95 0.45 \n", + "10000000.0 10000000.0 \n", + "309.01 7.32 \n", + "294.07 7.49 \n", + "-284.84 0.2 \n", + "323.95 7.18 \n", + "260.26 7.37 \n", + "233.99 7.67 \n", + "219.05 7.82 \n", + "204.1 7.99 \n", + "-58.88 0.24 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-230.92 5.21 \n", + "-92.15 0.66 \n", + "-148.06 6.71 \n", + "-39.31 2.46 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "73.12 4.19 \n", + "-193.93 4.69 \n", + "-90.41 0.36 \n", + "-101.93 0.3 \n", + "-90.41 0.36 \n", + "-100.98 0.38 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-305.06 4.77 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "757.46 4.46 \n", + "777.12 4.59 \n", + "-376.03 2.03 \n", + "10000000.0 10000000.0 \n", + "222.13 1.29 \n", + "172.89 1.57 \n", + "26.1 1.44 \n", + "-363.76 12.58 \n", + "-401.8 12.59 \n", + "10.14 0.69 \n", + "-48.31 0.88 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "34.06 9.57 \n", + "58.76 6.99 \n", + "44.2 6.88 \n", + "-803.42 2.87 \n", + "-590.92 2.92 \n", + "-73.47 0.33 \n", + "35.38 6.87 \n", + "37.37 6.91 \n", + "10000000.0 10000000.0 \n", + "51.93 6.83 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-66.21 0.5 \n", + "72.52 1.98 \n", + "105.06 2.25 \n", + "145.61 2.05 \n", + "54.54 1.7 \n", + "9.67 0.67 \n", + "-39.48 1.04 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-133.77 1.77 \n", + "79.7 3.04 \n", + "285.35 2.4 \n", + "71.88 2.09 \n", + "285.56 1.43 \n", + "240.3 1.19 \n", + "45.94 0.49 \n", + "184.12 0.85 \n", + "173.75 0.89 \n", + "112.27 0.8 \n", + "-754.69 3.65 \n", + "-275.89 2.5 \n", + "505.05 6.98 \n", + "-169.1 0.34 \n", + "631.84 6.78 \n", + "-757.74 3.61 \n", + "-741.75 3.67 \n", + "-795.78 3.61 \n", + "-789.31 3.63 \n", + "10000000.0 10000000.0 \n", + "-116.63 0.71 \n", + "10000000.0 10000000.0 \n", + "12.31 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "34.53 6.88 \n", + "-1.7 6.87 \n", + "7.78 6.87 \n", + "-44.92 6.87 \n", + "43.08 6.91 \n", + "36.52 6.92 \n", + "36.81 6.89 \n", + "0.58 6.88 \n", + "10.06 6.88 \n", + "-42.64 6.88 \n", + "45.36 6.92 \n", + "38.8 6.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-178.87 0.55 \n", + "10000000.0 10000000.0 \n", + "-122.7 0.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-0.85 6.87 \n", + "8.63 6.86 \n", + "-44.07 6.86 \n", + "43.93 6.9 \n", + "-341.56 0.76 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-7.89 0.71 \n", + "-67.15 2.67 \n", + "9.41 1.02 \n", + "171.76 1.14 \n", + "171.76 1.14 \n", + "5.4 0.3 \n", + "129.51 0.77 \n", + "-238.11 1.22 \n", + "-133.77 1.77 \n", + "840.6 5.45 \n", + "839.61 5.65 \n", + "-120.44 2.1 \n", + "805.07 5.26 \n", + "-168.87 4.1 \n", + "-60.47 6.76 \n", + "9.62 5.18 \n", + "-20.15 5.28 \n", + "-20.41 5.31 \n", + "-94.83 2.98 \n", + "44.41 0.71 \n", + "-103.65 3.82 \n", + "-430.78 1.51 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-186.06 4.11 \n", + "10000000.0 10000000.0 \n", + "688.49 4.89 \n", + "627.02 4.78 \n", + "592.47 4.44 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-219.97 1.69 \n", + "-432.73 1.74 \n", + "-181.47 1.7 \n", + "-485.78 0.51 \n", + "-458.55 0.54 \n", + "10000000.0 10000000.0 \n", + "-48.04 1.92 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-52.03 2.09 \n", + "10000000.0 10000000.0 \n", + "-28.53 2.3 \n", + "10000000.0 10000000.0 \n", + "-252.32 0.55 \n", + "10000000.0 10000000.0 \n", + "2.01 2.08 \n", + "-53.27 3.2 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-258.99 3.75 \n", + "-101.72 0.27 \n", + "-78.28 4.4 \n", + "42.72 4.98 \n", + "10000000.0 10000000.0 \n", + "51.49 5.04 \n", + "10000000.0 10000000.0 \n", + "-385.26 0.43 \n", + "-446.8 0.72 \n", + "-42.87 3.3 \n", + "10000000.0 10000000.0 \n", + "41.23 1.43 \n", + "34.71 1.37 \n", + "41.21 1.43 \n", + "54.25 3.16 \n", + "-42.87 3.3 \n", + "53.97 3.16 \n", + "47.45 2.18 \n", + "-322.41 0.19 \n", + "-673.08 3.7 \n", + "-234.43 0.74 \n", + "-317.88 1.62 \n", + "-570.7 2.0 \n", + "59.82 0.9 \n", + "-471.89 2.46 \n", + "147.8 4.22 \n", + "141.44 3.18 \n", + "141.28 3.18 \n", + "134.92 2.2 \n", + "128.41 1.46 \n", + "128.4 1.46 \n", + "121.89 1.38 \n", + "134.93 2.2 \n", + "134.76 2.2 \n", + "-734.05 4.5 \n", + "-798.47 3.78 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "90.08 0.53 \n", + "-49.75 1.65 \n", + "-77.35 1.95 \n", + "46.67 3.53 \n", + "46.67 3.53 \n", + "92.38 1.31 \n", + "20.62 3.27 \n", + "-103.4 1.42 \n", + "-19.62 0.71 \n", + "10000000.0 10000000.0 \n", + "-2.84 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-161.83 0.71 \n", + "-89.47 0.48 \n", + "-101.72 0.27 \n", + "-101.22 0.27 \n", + "-89.64 0.31 \n", + "-102.56 0.43 \n", + "-59.28 0.59 \n", + "36.54 0.38 \n", + "10000000.0 10000000.0 \n", + "-100.46 0.34 \n", + "208.49 1.5 \n", + "124.95 0.73 \n", + "41.28 0.65 \n", + "-97.3 0.27 \n", + "-108.14 0.39 \n", + "-82.56 0.18 \n", + "-73.74 0.23 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "594.18 3.34 \n", + "-2.32 12.68 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-182.49 0.42 \n", + "-174.45 0.42 \n", + "-162.25 0.33 \n", + "-135.51 0.63 \n", + "-173.06 0.3 \n", + "-31.38 0.4 \n", + "-138.23 0.25 \n", + "-200.09 0.35 \n", + "18.26 1.52 \n", + "20.67 0.71 \n", + "-762.55 3.12 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "185.36 2.06 \n", + "-13.71 10.32 \n", + "-172.19 10.58 \n", + "-36.26 7.19 \n", + "-18.43 6.89 \n", + "37.74 6.93 \n", + "-120.74 7.17 \n", + "39.36 6.93 \n", + "-119.12 7.17 \n", + "15.57 6.9 \n", + "-142.91 7.14 \n", + "17.0 6.92 \n", + "-141.48 7.16 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "4.47 0.5 \n", + "-111.43 1.47 \n", + "-149.9 1.5 \n", + "-149.92 1.5 \n", + "204.78 1.24 \n", + "166.43 1.15 \n", + "191.19 2.1 \n", + "279.51 1.54 \n", + "234.85 1.67 \n", + "234.85 1.67 \n", + "234.85 1.67 \n", + "203.79 1.28 \n", + "203.79 1.28 \n", + "203.79 1.28 \n", + "281.48 1.42 \n", + "236.83 1.61 \n", + "45.43 5.47 \n", + "10000000.0 10000000.0 \n", + "28.4 2.51 \n", + "10000000.0 10000000.0 \n", + "-28.27 0.45 \n", + "10000000.0 10000000.0 \n", + "-182.05 1.5 \n", + "-63.68 0.34 \n", + "-291.27 5.58 \n", + "-713.37 0.41 \n", + "19.05 0.26 \n", + "-296.55 5.56 \n", + "-724.3 2.75 \n", + "-108.42 0.31 \n", + "-391.86 5.69 \n", + "-124.33 0.29 \n", + "-240.82 5.67 \n", + "-28.32 5.68 \n", + "367.11 1.82 \n", + "329.7 1.8 \n", + "319.33 1.81 \n", + "257.47 1.76 \n", + "-82.56 0.49 \n", + "51.18 0.89 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "717.77 4.29 \n", + "741.09 4.34 \n", + "1030.77 6.01 \n", + "1054.09 6.06 \n", + "926.44 5.43 \n", + "949.76 5.48 \n", + "10.14 0.69 \n", + "-376.03 2.03 \n", + "-395.85 5.47 \n", + "0.0 0.0 \n", + "-510.27 1.91 \n", + "-103.84 0.65 \n", + "-491.02 2.05 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-172.46 0.9 \n", + "-64.31 0.26 \n", + "-145.08 0.36 \n", + "10000000.0 10000000.0 \n", + "-173.56 0.29 \n", + "-64.31 0.26 \n", + "-478.4 2.81 \n", + "-327.13 1.75 \n", + "-174.35 1.04 \n", + "-66.21 0.5 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-163.23 0.42 \n", + "-101.72 0.27 \n", + "22.2 5.69 \n", + "14.62 4.98 \n", + "-215.96 0.9 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "89.66 1.02 \n", + "28.19 1.02 \n", + "49.35 1.02 \n", + "10000000.0 10000000.0 \n", + "-158.93 3.75 \n", + "-87.19 1.81 \n", + "-87.19 1.81 \n", + "-119.51 1.78 \n", + "-87.19 1.81 \n", + "-82.03 1.03 \n", + "10000000.0 10000000.0 \n", + "23.69 0.71 \n", + "30.74 0.71 \n", + "10000000.0 10000000.0 \n", + "-2.94 0.71 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-160.8 0.36 \n", + "-217.42 0.82 \n", + "-48.91 0.89 \n", + "10000000.0 10000000.0 \n", + "-129.85 0.94 \n", + "10000000.0 10000000.0 \n", + "631.93 4.33 \n", + "536.38 4.36 \n", + "413.05 4.14 \n", + "777.66 5.29 \n", + "200.92 5.7 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-762.55 3.12 \n", + "-844.8 3.18 \n", + "690.55 5.16 \n", + "-159.12 6.94 \n", + "-257.46 0.71 \n", + "-637.83 3.68 \n", + "-667.43 3.77 \n", + "-624.64 3.66 \n", + "-595.95 3.74 \n", + "-625.55 3.94 \n", + "6.66 1.01 \n", + "-77.71 1.04 \n", + "-568.4 3.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-18.86 3.29 \n", + "3.24 5.0 \n", + "842.58 5.09 \n", + "10000000.0 10000000.0 \n", + "840.6 5.45 \n", + "10000000.0 10000000.0 \n", + "844.55 4.78 \n", + "952.9 5.86 \n", + "965.75 5.69 \n", + "843.56 4.93 \n", + "842.58 5.09 \n", + "-103.41 0.51 \n", + "-145.05 0.29 \n", + "841.59 5.26 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "502.85 3.02 \n", + "439.16 3.16 \n", + "499.88 3.2 \n", + "436.2 3.38 \n", + "497.91 3.45 \n", + "434.22 3.66 \n", + "501.86 3.05 \n", + "438.17 3.21 \n", + "500.87 3.11 \n", + "437.19 3.28 \n", + "499.88 3.2 \n", + "436.2 3.38 \n", + "498.9 3.32 \n", + "435.21 3.51 \n", + "498.9 3.32 \n", + "435.21 3.51 \n", + "545.17 3.19 \n", + "481.48 3.32 \n", + "544.18 3.22 \n", + "480.49 3.37 \n", + "544.18 3.22 \n", + "480.49 3.37 \n", + "543.19 3.27 \n", + "479.5 3.44 \n", + "543.19 3.27 \n", + "479.5 3.44 \n", + "542.2 3.36 \n", + "478.51 3.53 \n", + "-227.4 3.56 \n", + "521.82 3.59 \n", + "585.51 3.44 \n", + "521.82 3.59 \n", + "584.52 3.51 \n", + "520.83 3.68 \n", + "584.52 3.51 \n", + "520.83 3.68 \n", + "583.53 3.61 \n", + "519.84 3.79 \n", + "582.54 3.73 \n", + "518.86 3.92 \n", + "-10.88 2.18 \n", + "-81.75 1.93 \n", + "38.38 2.03 \n", + "20.43 0.65 \n", + "-72.42 1.83 \n", + "69.68 0.62 \n", + "10.02 0.67 \n", + "108.63 1.29 \n", + "59.3 0.62 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "206.35 2.62 \n", + "-37.54 3.57 \n", + "-302.87 3.09 \n", + "-49.38 7.19 \n", + "-42.82 7.18 \n", + "301.11 1.39 \n", + "-19.5 0.28 \n", + "236.49 1.37 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "-295.56 1.46 \n", + "-187.4 0.9 \n", + "-852.2 7.55 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "10000000.0 10000000.0 \n", + "26.17 0.44 \n", + "26.57 0.2 \n", + "-691.4 4.79 \n", + "-163.62 0.51 \n", + "10000000.0 10000000.0" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/tmp/ipykernel_2337286/3239136473.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mr\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmodelseed\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreactions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdelta_g\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdelta_g_error\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdelta_g\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/usr/local/lib/python3.8/dist-packages/ipykernel/iostream.py\u001b[0m in \u001b[0;36mwrite\u001b[0;34m(self, string)\u001b[0m\n\u001b[1;32m 527\u001b[0m \u001b[0mis_child\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_is_master_process\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 528\u001b[0m \u001b[0;31m# only touch the buffer in the IO thread to avoid races\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 529\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpub_thread\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mschedule\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_buffer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrite\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstring\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 530\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_child\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 531\u001b[0m \u001b[0;31m# mp.Pool cannot be trusted to flush promptly (or ever),\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.8/dist-packages/ipykernel/iostream.py\u001b[0m in \u001b[0;36mschedule\u001b[0;34m(self, f)\u001b[0m\n\u001b[1;32m 212\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_events\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 213\u001b[0m \u001b[0;31m# wake event thread (message content is ignored)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 214\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_event_pipe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mb''\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 215\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/zmq/sugar/socket.py\u001b[0m in \u001b[0;36msend\u001b[0;34m(self, data, flags, copy, track, routing_id, group)\u001b[0m\n\u001b[1;32m 545\u001b[0m )\n\u001b[1;32m 546\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroup\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgroup\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 547\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mSocket\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflags\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mflags\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtrack\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtrack\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 548\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 549\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0msend_multipart\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmsg_parts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflags\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtrack\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32mzmq/backend/cython/socket.pyx\u001b[0m in \u001b[0;36mzmq.backend.cython.socket.Socket.send\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mzmq/backend/cython/socket.pyx\u001b[0m in \u001b[0;36mzmq.backend.cython.socket.Socket.send\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mzmq/backend/cython/socket.pyx\u001b[0m in \u001b[0;36mzmq.backend.cython.socket._send_copy\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/zmq/backend/cython/checkrc.pxd\u001b[0m in \u001b[0;36mzmq.backend.cython.checkrc._check_rc\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] } ], "source": [ - "modelseed.reactions.rxn22000.to_template_reaction({0: 'a'})" + "for r in modelseed.reactions:\n", + " print(r.delta_g, r.delta_g_error, type(r.delta_g))" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -101,15 +44736,24 @@ " else:\n", " print('error', o)\n", " #print(_compounds_data[0].keys())\n", + " \n", " return metabolites\n", "metabolites = load_metabolites(database_path)" ] }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 18, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'abbreviation': 'RXN-11623.v', 'abstract_reaction': None, 'aliases': ['AraCyc: RXN-11623', 'CornCyc: RXN-11623', 'KEGG: R09562', 'MetaCyc: RXN-11623', 'PlantCyc: RXN-11623', 'Name: FC lyase; FCLY; S-(2E,6E)-farnesyl-L-cysteine oxidase; farnesylcysteine lyase'], 'code': '(1) cpd00001[0] + (1) cpd00007[0] + (1) cpd20939[0] <=> (1) cpd00025[0] + (1) cpd00084[0] + (1) cpd02188[0]', 'compound_ids': 'cpd00001;cpd00007;cpd00025;cpd00084;cpd02188;cpd20939', 'definition': '(1) H2O[0] + (1) O2[0] + (1) Farnesylcysteine[0] => (1) H2O2[0] + (1) L-Cysteine[0] + (1) 2-trans,6-trans-Farnesal[0]', 'deltag': -16.82, 'deltagerr': 1.56, 'ec_numbers': ['1.8.3.5', '1.8.3.6'], 'equation': '(1) cpd00001[0] + (1) cpd00007[0] + (1) cpd20939[0] => (1) cpd00025[0] + (1) cpd00084[0] + (1) cpd02188[0]', 'id': 'rxn22000', 'is_obsolete': 1, 'is_transport': 0, 'linked_reaction': 'rxn16406', 'name': 'farnesylcysteine lyase', 'notes': ['GCC', 'EQC', 'EQU'], 'pathways': ['MetaCyc: All-Trans-Farnesyl-PP-Biosynthesis (); Cofactor-Biosynthesis (Cofactor, Prosthetic Group, Electron Carrier, and Vitamin Biosynthesis); Detoxification (Detoxification); PWY-6577 (farnesylcysteine salvage pathway); Polyprenyl-Biosynthesis (Polyprenyl Biosynthesis)', 'KEGG: rn00900 (Terpenoid backbone biosynthesis)'], 'reversibility': '>', 'source': 'Primary Database', 'status': 'OK', 'stoichiometry': [{'charge': 0, 'coefficient': -1, 'compartment': 0, 'compound': 'cpd00001', 'formula': 'H2O', 'name': 'H2O'}, {'charge': 0, 'coefficient': -1, 'compartment': 0, 'compound': 'cpd00007', 'formula': 'O2', 'name': 'O2'}, {'charge': 0, 'coefficient': -1, 'compartment': 0, 'compound': 'cpd20939', 'formula': 'C18H31NO2S', 'name': 'Farnesylcysteine'}, {'charge': 0, 'coefficient': 1, 'compartment': 0, 'compound': 'cpd00025', 'formula': 'H2O2', 'name': 'H2O2'}, {'charge': 0, 'coefficient': 1, 'compartment': 0, 'compound': 'cpd00084', 'formula': 'C3H7NO2S', 'name': 'L-Cysteine'}, {'charge': 0, 'coefficient': 1, 'compartment': 0, 'compound': 'cpd02188', 'formula': 'C15H24O', 'name': '2-trans,6-trans-Farnesal'}]}\n" + ] + } + ], "source": [ "from modelseedpy.biochem.modelseed_reaction import ModelSEEDReaction2\n", "from modelseedpy.core.msmodel import get_reaction_constraints_from_direction\n", @@ -138,12 +44782,13 @@ " cpd_token.compartment = cmp_token\n", " metabolites_indexed[cpd_index_id] = cpd_token\n", " reaction_metabolites[metabolites_indexed[cpd_index_id]] = value\n", - " rxn = ModelSEEDReaction2(o['id'], o.get('name'), '', lower_bound, upper_bound)\n", + " rxn = ModelSEEDReaction2(o['id'], o.get('name'), '', lower_bound, upper_bound, delta_g=_reactions_data.get('deltag'), delta_g_error=_reactions_data.get(deltagerr))\n", " rxn.add_metabolites(reaction_metabolites)\n", " reactions[rxn.id] = rxn\n", " else:\n", " print('error', o)\n", - " #print(_reactions_data[0])\n", + " print(_reactions_data[0])\n", + " break\n", " return reactions\n", "reactions = load_reactions(database_path, metabolites)" ] diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index b498d199..181bc2c8 100644 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -224,12 +224,14 @@ def _load_reactions(database_path: str, metabolites: dict) -> (dict, dict): cpd_token.compartment = cmp_token metabolites_indexed[cpd_index_id] = cpd_token reaction_metabolites[metabolites_indexed[cpd_index_id]] = value - rxn = ModelSEEDReaction2(o['id'], o.get('name'), '', lower_bound, upper_bound) + rxn = ModelSEEDReaction2(o['id'], o.get('name'), '', lower_bound, upper_bound, + delta_g=o.get('deltag'), + delta_g_error=o.get('deltagerr')) rxn.add_metabolites(reaction_metabolites) reactions[rxn.id] = rxn else: - print('error', o) - #print(_reactions_data[0]) + logger.error(f'failed to read reaction record {o}') + return reactions, metabolites_indexed diff --git a/modelseedpy/biochem/modelseed_reaction.py b/modelseedpy/biochem/modelseed_reaction.py index 5d19a1b4..af5711fb 100644 --- a/modelseedpy/biochem/modelseed_reaction.py +++ b/modelseedpy/biochem/modelseed_reaction.py @@ -147,8 +147,14 @@ def __init__( self.is_obsolete = is_obsolete self.is_abstract = is_abstract - self.delta_g = delta_g - self.delta_g_error = delta_g_error + self.delta_g = float(delta_g) if delta_g else None + self.delta_g_error = float(delta_g_error) if delta_g_error else None + + # removing symbolic high values representing null/none + if self.delta_g and self.delta_g > 10000: + self.delta_g = None + if self.delta_g_error and self.delta_g_error > 10000: + self.delta_g_error = None self.flags = set() if flags: @@ -156,7 +162,7 @@ def __init__( @property def compound_ids(self): - pass + return None def to_template_reaction(self, compartment_setup=None): if compartment_setup is None: From 26cd5f4bed3f3cec50aeac261fdeb4cd0924155d Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Fri, 21 Oct 2022 13:51:01 -0500 Subject: [PATCH 034/298] updated biochem loader and objects --- examples/Others/Biochem.ipynb | 47299 ++------------------ modelseedpy/biochem/modelseed_biochem.py | 128 +- modelseedpy/biochem/modelseed_compound.py | 26 +- modelseedpy/biochem/modelseed_reaction.py | 5 + 4 files changed, 2702 insertions(+), 44756 deletions(-) diff --git a/examples/Others/Biochem.ipynb b/examples/Others/Biochem.ipynb index 43a6fdb2..1f494e6e 100644 --- a/examples/Others/Biochem.ipynb +++ b/examples/Others/Biochem.ipynb @@ -20,44797 +20,204 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "modelseed = modelseedpy.biochem.from_local('../../../ModelSEEDDatabase')" + "database_path = '../../../ModelSEEDDatabase/'\n", + "modelseed = modelseedpy.biochem.from_local(database_path)" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'LCTONWCANYUPML-UHFFFAOYSA-M'" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "modelseed.compounds.cpd00020.inchi_key" + ] + }, + { + "cell_type": "code", + "execution_count": 17, "metadata": { "tags": [] }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "-16.82 1.56 \n", - "-114.63 2.23 \n", - "10000000.0 10000000.0 \n", - "0.53 0.54 \n", - "-2.6 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.68 6.88 \n", - "-105.97 0.91 \n", - "6.11 4.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.74 0.51 \n", - "-11.84 0.42 \n", - "-48.9 5.79 \n", - "-13.17 0.99 \n", - "-0.74 0.51 \n", - "-0.74 0.51 \n", - "-53.3 0.85 \n", - "-6.09 7.63 \n", - "75.94 7.57 \n", - "-76.86 7.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.81 0.35 \n", - "-4.17 0.75 \n", - "-14.92 2.92 \n", - "-94.47 8.12 \n", - "-3.78 0.35 \n", - "-15.65 0.87 \n", - "-15.65 0.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "38.28 3.21 \n", - "-10.24 0.5 \n", - "-52.04 4.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-49.25 0.53 \n", - "-13.17 0.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.07 0.58 \n", - "-1.52 0.4 \n", - "-3.94 0.48 \n", - "-4.73 0.54 \n", - "2.12 0.83 \n", - "-5.18 0.42 \n", - "-8.17 1.11 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "11.12 0.81 \n", - "10000000.0 10000000.0 \n", - "-13.52 1.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-29.32 10.65 \n", - "4.44 0.24 \n", - "-4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.42 6.68 \n", - "-105.97 0.91 \n", - "-5.79 0.35 \n", - "2.12 0.83 \n", - "-2.27 0.32 \n", - "2.05 0.32 \n", - "-63.56 1.16 \n", - "10000000.0 10000000.0 \n", - "2.16 5.87 \n", - "-0.18 0.36 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "2.16 5.87 \n", - "-0.18 0.36 \n", - "-0.18 0.36 \n", - "-4.39 0.43 \n", - "8.72 7.58 \n", - "10000000.0 10000000.0 \n", - "-20.64 6.86 \n", - "-20.64 7.33 \n", - "-20.64 8.94 \n", - "-20.64 8.38 \n", - "-3.61 0.51 \n", - "10000000.0 10000000.0 \n", - "-4.36 7.75 \n", - "-4.36 8.86 \n", - "-4.36 8.3 \n", - "-4.36 7.24 \n", - "10000000.0 10000000.0 \n", - "-4.36 7.6 \n", - "-4.36 9.18 \n", - "7.77 1.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-99.41 1.12 \n", - "43.0 4.13 \n", - "-4.25 0.74 \n", - "-37.02 7.55 \n", - "-37.02 7.55 \n", - "-6.42 0.31 \n", - "-3.29 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 10.69 \n", - "-1.7 13.32 \n", - "-1.7 11.54 \n", - "0.95 0.84 \n", - "-3.83 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.64 1.59 \n", - "-118.21 0.69 \n", - "10000000.0 10000000.0 \n", - "-3.79 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.9 0.51 \n", - "-0.9 0.51 \n", - "-18.59 13.94 \n", - "10000000.0 10000000.0 \n", - "-1.7 13.02 \n", - "-5.97 0.42 \n", - "-6.05 0.57 \n", - "-0.9 0.51 \n", - "-0.9 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-98.2 8.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-67.75 2.3 \n", - "3.73 0.29 \n", - "4.68 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-65.15 0.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-20.64 7.68 \n", - "10000000.0 10000000.0 \n", - "-105.96 0.91 \n", - "-17.31 1.63 \n", - "-0.85 0.22 \n", - "-0.74 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-39.9 20.73 \n", - "-4.73 0.33 \n", - "-294.47 21.92 \n", - "1.63 1.66 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.8 6.31 \n", - "-108.43 1.54 \n", - "-88.27 0.79 \n", - "10000000.0 10000000.0 \n", - "-27.76 3.44 \n", - "10000000.0 10000000.0 \n", - "-93.57 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.55 6.66 \n", - "10000000.0 10000000.0 \n", - "-4.77 0.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.01 11.51 \n", - "-2.3 11.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.01 11.52 \n", - "-2.3 11.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.01 11.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.89 0.24 \n", - "0.69 0.57 \n", - "0.69 0.57 \n", - "-18.13 0.71 \n", - "10000000.0 10000000.0 \n", - "-54.34 7.44 \n", - "-34.54 1.84 \n", - "-74.84 4.75 \n", - "-87.69 5.97 \n", - "10000000.0 10000000.0 \n", - "-16.73 2.48 \n", - "-78.34 3.1 \n", - "0.87 4.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-151.12 0.78 \n", - "10000000.0 10000000.0 \n", - "-34.54 1.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.95 0.3 \n", - "-107.82 1.13 \n", - "-5.77 6.15 \n", - "-2.46 0.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-25.66 5.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-151.81 4.4 \n", - "10000000.0 10000000.0 \n", - "9.59 6.0 \n", - "10000000.0 10000000.0 \n", - "-48.2 6.71 \n", - "10000000.0 10000000.0 \n", - "-2.08 0.98 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.82 0.93 \n", - "-2.6 0.3 \n", - "-2.08 0.98 \n", - "-5.13 0.49 \n", - "-4.71 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.26 5.9 \n", - "-17.26 5.9 \n", - "10000000.0 10000000.0 \n", - "-90.63 6.54 \n", - "-83.95 6.64 \n", - "-15.4 4.09 \n", - "None None \n", - "21.6 3.42 \n", - "-37.0 1.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.01 0.4 \n", - "3.51 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.33 1.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.19 1.48 \n", - "4.42 0.24 \n", - "-10.62 0.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-121.63 13.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.4 0.64 \n", - "3.45 0.41 \n", - "-61.86 0.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-46.06 1.64 \n", - "10000000.0 10000000.0 \n", - "-3.83 0.39 \n", - "4.92 1.91 \n", - "-3.83 0.39 \n", - "-3.83 0.39 \n", - "-1.7 10.62 \n", - "-1.7 10.62 \n", - "-3.83 0.39 \n", - "-3.83 0.39 \n", - "-3.83 0.39 \n", - "-3.83 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-23.21 1.55 \n", - "-23.21 1.55 \n", - "-0.02 None \n", - "-110.33 0.77 \n", - "-116.63 1.11 \n", - "-116.63 1.11 \n", - "-116.63 1.11 \n", - "-116.63 1.11 \n", - "-116.63 1.11 \n", - "-116.63 1.11 \n", - "-116.63 1.11 \n", - "-116.63 1.11 \n", - "6.48 0.85 \n", - "6.48 0.85 \n", - "6.48 0.85 \n", - "-116.63 1.11 \n", - "-116.63 1.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.03 0.43 \n", - "12.54 7.94 \n", - "10.46 9.97 \n", - "-2.59 8.87 \n", - "7.34 8.06 \n", - "7.22 8.06 \n", - "-109.38 0.78 \n", - "-109.38 0.78 \n", - "-109.38 0.78 \n", - "4.89 0.25 \n", - "-9.06 0.27 \n", - "-3.62 0.46 \n", - "-24.62 13.76 \n", - "10000000.0 10000000.0 \n", - "-4.36 7.15 \n", - "-4.36 8.79 \n", - "-4.36 8.22 \n", - "-0.34 0.34 \n", - "352.22 6.59 \n", - "10000000.0 10000000.0 \n", - "-0.86 0.86 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.61 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.0 0.82 \n", - "0.6 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.06 8.98 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "61.55 0.38 \n", - "-5.89 0.56 \n", - "-11.47 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-61.47 0.2 \n", - "-21.16 0.09 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "-4.36 5.28 \n", - "-89.39 6.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-429.94 0.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.79 4.51 \n", - "-7.67 0.77 \n", - "-7.67 0.77 \n", - "0.37 0.94 \n", - "-5.63 0.43 \n", - "-0.41 0.49 \n", - "7.63 0.58 \n", - "-5.66 0.43 \n", - "-6.58 0.56 \n", - "-14.5 0.44 \n", - "-12.96 4.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-34.59 6.01 \n", - "10000000.0 10000000.0 \n", - "11.87 1.4 \n", - "11.87 1.4 \n", - "-4.1 0.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-1.7 6.79 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "10000000.0 10000000.0 \n", - "-6.29 1.0 \n", - "10000000.0 10000000.0 \n", - "3.58 0.52 \n", - "3.57 0.5 \n", - "10000000.0 10000000.0 \n", - "-70.26 1.92 \n", - "-49.25 0.56 \n", - "-89.43 2.06 \n", - "-192.35 2.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-49.28 0.57 \n", - "-13.04 1.56 \n", - "-27.33 4.38 \n", - "10000000.0 10000000.0 \n", - "-1.55 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.61 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.87 0.43 \n", - "-14.87 0.43 \n", - "371.33 5.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.2 0.73 \n", - "-15.2 0.73 \n", - "-14.87 0.43 \n", - "-14.87 0.43 \n", - "10000000.0 10000000.0 \n", - "-14.87 0.43 \n", - "-14.87 0.43 \n", - "-14.27 0.34 \n", - "-14.27 0.34 \n", - "-4.89 0.25 \n", - "-4.89 0.25 \n", - "-5.22 6.14 \n", - "-4.89 0.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.87 0.3 \n", - "-5.43 7.73 \n", - "-2.87 0.3 \n", - "-54.69 1.16 \n", - "-54.69 1.16 \n", - "-11.65 0.71 \n", - "4.68 7.75 \n", - "-118.19 0.76 \n", - "10000000.0 10000000.0 \n", - "-3.88 0.56 \n", - "10000000.0 10000000.0 \n", - "1.01 0.41 \n", - "-18.59 13.93 \n", - "-2.87 0.3 \n", - "-95.39 10.03 \n", - "-9.54 1.46 \n", - "0.98 0.39 \n", - "-0.9 0.62 \n", - "126.69 13.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.92 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.37 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-118.59 1.24 \n", - "-8.35 5.5 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-23.06 3.95 \n", - "-23.06 3.95 \n", - "-3.33 0.64 \n", - "-3.76 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.8 0.82 \n", - "-4.38 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 11.37 \n", - "2.81 None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.97 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-125.73 0.57 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-2.66 0.8 \n", - "124.14 1.02 \n", - "124.14 1.02 \n", - "-59.72 0.33 \n", - "-88.54 0.82 \n", - "-177.08 1.65 \n", - "-176.16 1.58 \n", - "-177.08 1.65 \n", - "10000000.0 10000000.0 \n", - "-2.63 0.42 \n", - "-2.63 0.42 \n", - "-5.26 0.84 \n", - "-0.49 0.41 \n", - "10000000.0 10000000.0 \n", - "-13.11 6.39 \n", - "-10.46 6.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "57.71 0.34 \n", - "-94.12 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 13.49 \n", - "-3.11 13.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-106.05 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.73 0.73 \n", - "-0.94 7.39 \n", - "7.54 1.78 \n", - "-16.97 8.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.42 0.51 \n", - "-10.46 5.41 \n", - "-13.42 1.51 \n", - "-37.17 1.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 6.06 \n", - "-3.11 6.06 \n", - "-13.86 0.8 \n", - "-13.86 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-334.33 6.05 \n", - "-21.5 2.54 \n", - "-103.28 2.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "41.46 2.0 \n", - "-2.45 0.44 \n", - "-2.45 0.44 \n", - "-2.89 0.56 \n", - "-1.61 0.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.28 3.9 \n", - "-189.98 12.91 \n", - "10000000.0 10000000.0 \n", - "-5.96 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "-32.46 1.65 \n", - "-6.24 0.59 \n", - "10000000.0 10000000.0 \n", - "-18.13 0.71 \n", - "-18.13 0.71 \n", - "-111.38 8.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.28 0.38 \n", - "-106.02 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "18.97 13.97 \n", - "10000000.0 10000000.0 \n", - "-14.03 6.87 \n", - "-14.03 10.71 \n", - "10000000.0 10000000.0 \n", - "82.17 18.33 \n", - "10000000.0 10000000.0 \n", - "-3.91 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "14.45 4.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.49 0.8 \n", - "-1.84 0.85 \n", - "-18.13 0.71 \n", - "0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.22 0.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "-90.66 1.46 \n", - "5.37 9.07 \n", - "10000000.0 10000000.0 \n", - "-105.84 0.91 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-300.12 3.68 \n", - "1.56 0.16 \n", - "10000000.0 10000000.0 \n", - "-18.13 0.71 \n", - "-282.1 0.94 \n", - "7.22 0.5 \n", - "10000000.0 10000000.0 \n", - "5.37 9.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.08 5.56 \n", - "-12.04 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.13 0.75 \n", - "10000000.0 10000000.0 \n", - "-14.4 6.86 \n", - "-1.7 5.9 \n", - "10000000.0 10000000.0 \n", - "0.75 0.49 \n", - "-3.17 1.18 \n", - "-0.78 0.68 \n", - "-6.24 0.59 \n", - "-118.59 1.24 \n", - "-90.63 6.54 \n", - "-106.12 1.04 \n", - "-106.7 6.51 \n", - "-22.91 1.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.89 0.24 \n", - "-25.66 3.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.64 0.33 \n", - "-13.27 0.43 \n", - "10000000.0 10000000.0 \n", - "-59.6 4.25 \n", - "-0.33 14.73 \n", - "10000000.0 10000000.0 \n", - "4.92 1.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.96 0.32 \n", - "-13.21 1.07 \n", - "-0.94 0.5 \n", - "3.13 6.84 \n", - "-1.81 5.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.91 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.5 0.94 \n", - "0.35 0.61 \n", - "-15.12 0.75 \n", - "0.46 7.04 \n", - "0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "-18.13 0.71 \n", - "-189.98 12.77 \n", - "10000000.0 10000000.0 \n", - "-110.53 6.99 \n", - "2.08 5.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 7.0 \n", - "-105.96 0.91 \n", - "10000000.0 10000000.0 \n", - "-10.55 1.0 \n", - "10000000.0 10000000.0 \n", - "5.66 0.74 \n", - "-87.15 0.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.27 0.43 \n", - "-62.32 5.99 \n", - "-6.19 0.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.05 0.44 \n", - "-118.19 0.76 \n", - "4.34 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.56 0.16 \n", - "-1.75 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-189.98 12.81 \n", - "10000000.0 10000000.0 \n", - "-45.31 3.93 \n", - "-97.2 0.8 \n", - "-189.98 12.73 \n", - "10000000.0 10000000.0 \n", - "-7.32 1.0 \n", - "10000000.0 10000000.0 \n", - "-3.19 0.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.12 0.75 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "0.28 0.38 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "16.31 9.81 \n", - "10000000.0 10000000.0 \n", - "-15.12 0.75 \n", - "-5.96 0.32 \n", - "-40.49 2.14 \n", - "10000000.0 10000000.0 \n", - "-105.97 0.91 \n", - "10000000.0 10000000.0 \n", - "19.52 0.97 \n", - "10000000.0 10000000.0 \n", - "-15.34 1.27 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.72 \n", - "10000000.0 10000000.0 \n", - "-14.4 6.8 \n", - "10000000.0 10000000.0 \n", - "-46.0 7.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.06 \n", - "10000000.0 10000000.0 \n", - "-5.96 0.32 \n", - "-3.77 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-189.98 12.77 \n", - "10000000.0 10000000.0 \n", - "-2.55 0.35 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "-14.03 10.68 \n", - "-6.17 0.87 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.78 0.5 \n", - "-82.35 3.41 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.64 0.45 \n", - "-8.8 1.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-37.17 1.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-222.82 1.53 \n", - "-189.98 12.8 \n", - "16.31 9.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.76 0.89 \n", - "3.17 0.82 \n", - "-15.12 0.75 \n", - "-5.49 0.44 \n", - "6.18 1.16 \n", - "10000000.0 10000000.0 \n", - "1.56 0.16 \n", - "-13.2 1.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.91 0.53 \n", - "10000000.0 10000000.0 \n", - "-62.08 6.61 \n", - "10000000.0 10000000.0 \n", - "-16.31 1.05 \n", - "-4.36 6.01 \n", - "-104.63 1.45 \n", - "-4.59 0.57 \n", - "-13.27 0.43 \n", - "0.28 0.37 \n", - "-3.7 0.77 \n", - "-18.52 0.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.79 1.4 \n", - "10000000.0 10000000.0 \n", - "-104.62 1.45 \n", - "None 11.44 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "1.56 0.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-95.84 1.17 \n", - "10000000.0 10000000.0 \n", - "5.37 9.14 \n", - "-189.98 12.78 \n", - "-35.79 1.96 \n", - "1.24 0.54 \n", - "2.61 1.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.12 1.92 \n", - "-69.88 9.77 \n", - "10000000.0 10000000.0 \n", - "-6.77 0.68 \n", - "None None \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.78 2.81 \n", - "10000000.0 10000000.0 \n", - "8.39 1.92 \n", - "-4.44 0.24 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "-189.98 12.79 \n", - "-18.98 2.28 \n", - "-8.85 0.79 \n", - "-5.96 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-112.92 1.45 \n", - "10000000.0 10000000.0 \n", - "10.17 0.27 \n", - "-0.28 0.37 \n", - "-3.68 2.32 \n", - "-4.89 0.25 \n", - "-4.52 1.9 \n", - "-117.23 1.16 \n", - "-3.92 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "100.09 0.25 \n", - "-92.42 1.81 \n", - "-104.63 1.45 \n", - "1.24 0.54 \n", - "-18.13 0.71 \n", - "-18.13 0.71 \n", - "-0.41 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.08 5.66 \n", - "10000000.0 10000000.0 \n", - "4.95 4.36 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "5.81 0.35 \n", - "-1.51 0.4 \n", - "0.36 0.56 \n", - "-5.96 0.32 \n", - "10000000.0 10000000.0 \n", - "-700.89 3.56 \n", - "-33.6 8.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-104.62 1.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.2 1.06 \n", - "10000000.0 10000000.0 \n", - "5.09 0.69 \n", - "-0.25 0.79 \n", - "10000000.0 10000000.0 \n", - "-14.03 7.01 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "-3.68 2.32 \n", - "70.98 0.52 \n", - "10000000.0 10000000.0 \n", - "-5.36 0.58 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "-222.82 1.53 \n", - "-0.91 1.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.28 0.38 \n", - "-189.98 12.73 \n", - "-4.87 0.57 \n", - "0.28 0.38 \n", - "4.52 1.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.33 \n", - "10000000.0 10000000.0 \n", - "0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "44.43 1.91 \n", - "82.17 18.29 \n", - "10000000.0 10000000.0 \n", - "-10.55 1.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.37 9.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "15.26 0.13 \n", - "15.26 0.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.82 1.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "280.35 2.24 \n", - "-14.37 0.55 \n", - "14.27 0.33 \n", - "14.27 0.33 \n", - "14.27 0.33 \n", - "14.27 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-129.68 6.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.23 1.04 \n", - "-5.08 1.01 \n", - "-2.27 0.58 \n", - "-2.54 0.78 \n", - "-3.88 0.8 \n", - "-3.75 0.92 \n", - "-4.16 0.92 \n", - "-3.73 0.95 \n", - "-3.42 1.09 \n", - "0.54 0.76 \n", - "10000000.0 10000000.0 \n", - "-71.92 4.39 \n", - "10000000.0 10000000.0 \n", - "12.79 0.85 \n", - "-45.58 0.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.3 2.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.6 2.32 \n", - "-25.11 1.73 \n", - "-19.42 7.95 \n", - "-58.0 1.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "53.16 5.6 \n", - "44.61 4.89 \n", - "60.8 6.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-22.88 1.52 \n", - "-22.88 1.52 \n", - "-35.4 1.67 \n", - "-9.51 1.39 \n", - "-39.69 1.66 \n", - "-19.98 1.62 \n", - "-40.3 1.63 \n", - "-14.41 1.35 \n", - "-2.64 1.79 \n", - "-28.53 1.54 \n", - "-31.87 1.48 \n", - "-5.98 1.16 \n", - "-11.55 1.46 \n", - "None 0.08 \n", - "-28.27 1.63 \n", - "-52.81 1.37 \n", - "-47.24 1.63 \n", - "-54.2 1.37 \n", - "-48.62 1.63 \n", - "None 2.32 \n", - "None 7.09 \n", - "None 1.13 \n", - "None 1.24 \n", - "None 1.56 \n", - "None 0.73 \n", - "None 0.75 \n", - "-6.16 0.07 \n", - "-0.85 0.3 \n", - "None 0.47 \n", - "-5.54 1.2 \n", - "None 3.55 \n", - "None 3.56 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "None 1.15 \n", - "None 3.96 \n", - "None 0.81 \n", - "None 0.48 \n", - "None 1.02 \n", - "None 0.44 \n", - "None 0.4 \n", - "None 0.48 \n", - "None 0.44 \n", - "None 0.4 \n", - "None 1.02 \n", - "None 1.09 \n", - "None 1.26 \n", - "None 1.99 \n", - "None 1.75 \n", - "None 1.51 \n", - "None 0.49 \n", - "None 0.89 \n", - "None 1.26 \n", - "10000000.0 10000000.0 \n", - "None 4.27 \n", - "-6.16 0.07 \n", - "None 0.35 \n", - "-6.16 0.07 \n", - "-6.81 9.58 \n", - "-6.16 0.07 \n", - "-9.34 0.31 \n", - "None 2.25 \n", - "None 1.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.84 \n", - "None 1.04 \n", - "-9.05 0.5 \n", - "-10.79 0.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.56 \n", - "None 2.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.22 0.59 \n", - "-0.22 0.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "None 1.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.12 1.14 \n", - "-4.37 0.72 \n", - "None 0.49 \n", - "-0.67 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.61 0.78 \n", - "10000000.0 10000000.0 \n", - "-6.55 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.62 \n", - "-0.63 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.18 0.45 \n", - "1.18 0.45 \n", - "None 0.92 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.08 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.84 1.67 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.57 1.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.32 \n", - "10000000.0 10000000.0 \n", - "-20.03 2.76 \n", - "None 1.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.74 0.4 \n", - "-6.74 0.4 \n", - "-8.88 2.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 0.71 \n", - "-6.96 0.72 \n", - "-6.36 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.23 \n", - "None 2.21 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.33 0.91 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.9 0.35 \n", - "-7.18 0.58 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "None 1.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.1 0.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.28 0.32 \n", - "0.38 0.45 \n", - "0.38 0.45 \n", - "10000000.0 10000000.0 \n", - "-4.66 6.33 \n", - "0.38 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.24 1.7 \n", - "None 0.71 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.38 0.45 \n", - "1.25 0.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.89 1.14 \n", - "None 1.71 \n", - "-23.85 1.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.9 1.25 \n", - "-1.53 0.44 \n", - "10000000.0 10000000.0 \n", - "-1.46 0.43 \n", - "10000000.0 10000000.0 \n", - "-120.33 0.78 \n", - "-1.86 0.56 \n", - "-18.96 0.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.65 0.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.91 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.19 0.45 \n", - "-3.4 0.64 \n", - "4.14 0.29 \n", - "10000000.0 10000000.0 \n", - "-18.97 0.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-126.88 4.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.08 0.46 \n", - "10000000.0 10000000.0 \n", - "-3.18 1.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.64 1.38 \n", - "10000000.0 10000000.0 \n", - "-48.78 1.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-35.85 2.2 \n", - "10000000.0 10000000.0 \n", - "None 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "None 0.71 \n", - "None 0.72 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 1.34 \n", - "10000000.0 10000000.0 \n", - "None 2.18 \n", - "10000000.0 10000000.0 \n", - "None 2.21 \n", - "None 4.88 \n", - "10000000.0 10000000.0 \n", - "None 0.79 \n", - "10000000.0 10000000.0 \n", - "None 0.25 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "-6.16 0.07 \n", - "None 2.21 \n", - "None 0.41 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-0.05 1.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.05 1.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.15 8.06 \n", - "-2.78 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.16 0.68 \n", - "10000000.0 10000000.0 \n", - "None 2.14 \n", - "10000000.0 10000000.0 \n", - "7.53 0.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.9 1.96 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-7.98 8.77 \n", - "-12.04 1.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 3.89 \n", - "None 0.58 \n", - "10000000.0 10000000.0 \n", - "-0.3 1.26 \n", - "None 1.02 \n", - "-0.96 0.33 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "None 0.48 \n", - "10000000.0 10000000.0 \n", - "None 2.19 \n", - "10000000.0 10000000.0 \n", - "-5.98 1.16 \n", - "None 2.18 \n", - "10000000.0 10000000.0 \n", - "None 2.5 \n", - "None 0.54 \n", - "None 3.86 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.41 \n", - "None 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.86 \n", - "None 0.42 \n", - "None 1.6 \n", - "None 0.64 \n", - "None 0.71 \n", - "None 0.74 \n", - "10000000.0 10000000.0 \n", - "None 4.23 \n", - "None 0.98 \n", - "6.24 0.52 \n", - "None 1.33 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.48 1.05 \n", - "None 0.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.35 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "None 0.44 \n", - "10000000.0 10000000.0 \n", - "None 0.44 \n", - "-14.41 1.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.27 \n", - "None 1.16 \n", - "None 0.71 \n", - "None 2.19 \n", - "None 0.69 \n", - "10000000.0 10000000.0 \n", - "-2.37 1.35 \n", - "None 2.55 \n", - "1.11 1.16 \n", - "10000000.0 10000000.0 \n", - "None 2.69 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.41 \n", - "10000000.0 10000000.0 \n", - "None 2.18 \n", - "10000000.0 10000000.0 \n", - "-5.98 1.16 \n", - "0.62 0.87 \n", - "None 2.73 \n", - "None 0.99 \n", - "None 0.44 \n", - "-3.09 5.09 \n", - "-3.09 5.1 \n", - "-3.09 5.1 \n", - "-3.09 5.21 \n", - "-14.03 5.33 \n", - "-14.03 4.93 \n", - "-14.03 5.33 \n", - "-14.03 4.93 \n", - "-3.35 0.3 \n", - "-3.35 0.3 \n", - "-14.34 4.97 \n", - "-14.34 4.97 \n", - "5.61 0.36 \n", - "5.6 0.37 \n", - "-5.13 0.52 \n", - "-5.12 0.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.81 0.3 \n", - "4.27 0.49 \n", - "0.13 0.25 \n", - "0.13 0.25 \n", - "-8.73 0.93 \n", - "-8.73 0.93 \n", - "-1.7 9.5 \n", - "-1.7 9.5 \n", - "-1.7 10.08 \n", - "-1.7 10.08 \n", - "-6.02 0.56 \n", - "10000000.0 10000000.0 \n", - "-13.16 1.07 \n", - "-9.06 0.27 \n", - "-9.06 0.26 \n", - "-2.83 1.42 \n", - "-26.84 1.48 \n", - "-26.84 1.48 \n", - "-26.84 1.48 \n", - "-0.28 0.38 \n", - "-0.28 0.37 \n", - "0.28 0.38 \n", - "0.28 0.37 \n", - "-19.08 2.46 \n", - "-19.08 2.46 \n", - "-19.08 2.46 \n", - "-28.53 1.54 \n", - "-22.96 1.78 \n", - "-2.64 1.79 \n", - "-2.64 1.79 \n", - "-9.51 1.39 \n", - "-15.08 1.66 \n", - "-35.4 1.67 \n", - "-35.4 1.67 \n", - "-35.4 1.67 \n", - "8.29 1.18 \n", - "2.71 1.42 \n", - "-17.61 1.49 \n", - "-17.61 1.49 \n", - "-17.61 1.49 \n", - "8.29 1.18 \n", - "2.71 1.42 \n", - "-17.61 1.49 \n", - "-17.61 1.49 \n", - "-17.61 1.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.23 1.07 \n", - "-47.65 1.66 \n", - "-47.65 1.66 \n", - "-47.65 1.66 \n", - "-47.65 1.66 \n", - "-47.65 1.66 \n", - "3.33 0.45 \n", - "-28.32 1.58 \n", - "-28.32 1.58 \n", - "-28.32 1.58 \n", - "-0.78 0.68 \n", - "-13.21 1.07 \n", - "-0.79 0.68 \n", - "-0.78 0.68 \n", - "14.27 0.34 \n", - "14.27 0.33 \n", - "-13.21 1.07 \n", - "-6.15 0.49 \n", - "0.91 1.09 \n", - "-3.88 0.56 \n", - "-1.7 13.02 \n", - "-6.02 0.56 \n", - "-0.78 0.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-124.03 3.5 \n", - "-124.03 3.5 \n", - "-5.18 0.6 \n", - "-7.22 0.51 \n", - "-3.88 0.56 \n", - "-3.88 0.56 \n", - "-3.88 0.56 \n", - "-1.7 10.62 \n", - "-1.7 10.62 \n", - "-3.88 0.56 \n", - "-3.88 0.56 \n", - "-3.88 0.56 \n", - "-3.88 0.56 \n", - "-84.41 1.7 \n", - "-69.41 3.09 \n", - "-78.84 1.92 \n", - "-78.84 1.92 \n", - "-58.52 1.93 \n", - "-58.52 1.93 \n", - "-58.52 1.93 \n", - "-84.41 1.7 \n", - "-69.41 3.09 \n", - "-78.84 1.92 \n", - "-78.84 1.92 \n", - "-58.52 1.93 \n", - "-58.52 1.93 \n", - "-58.52 1.93 \n", - "-7.75 1.12 \n", - "16.58 2.36 \n", - "5.43 2.84 \n", - "-35.21 2.99 \n", - "-35.21 2.99 \n", - "-35.21 2.99 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-1.7 6.79 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.69 0.98 \n", - "-13.21 2.26 \n", - "-0.28 0.38 \n", - "-0.28 0.37 \n", - "-45.76 3.05 \n", - "-45.76 3.05 \n", - "-45.76 3.05 \n", - "-45.76 3.05 \n", - "-45.76 3.05 \n", - "-45.76 3.05 \n", - "None None \n", - "-0.89 0.37 \n", - "-2.86 0.34 \n", - "-2.86 0.33 \n", - "4.05 7.87 \n", - "4.05 7.88 \n", - "-5.22 6.11 \n", - "-5.22 6.13 \n", - "-13.21 1.07 \n", - "-13.21 1.07 \n", - "-0.88 0.38 \n", - "-0.89 0.37 \n", - "-0.28 0.38 \n", - "-0.28 0.37 \n", - "-3.15 0.9 \n", - "-3.15 0.9 \n", - "17.69 1.3 \n", - "17.68 1.29 \n", - "4.89 0.25 \n", - "-4.44 0.24 \n", - "-4.44 0.24 \n", - "-0.28 0.38 \n", - "-38.87 1.13 \n", - "-3.86 0.56 \n", - "-316.94 2.26 \n", - "-316.93 2.26 \n", - "-209.82 19.37 \n", - "-209.82 19.39 \n", - "-26.41 2.13 \n", - "0.26 0.6 \n", - "0.26 0.6 \n", - "-0.22 0.59 \n", - "2.18 0.75 \n", - "2.18 0.75 \n", - "2.18 0.75 \n", - "2.18 0.75 \n", - "2.18 0.75 \n", - "2.18 0.75 \n", - "None 4.26 \n", - "None 4.45 \n", - "2.18 0.75 \n", - "2.18 0.75 \n", - "None 4.46 \n", - "2.18 0.75 \n", - "2.18 0.75 \n", - "None 4.64 \n", - "None 4.67 \n", - "None 4.67 \n", - "None 4.82 \n", - "None 4.82 \n", - "None 5.07 \n", - "2.18 0.75 \n", - "None 4.88 \n", - "None 5.09 \n", - "None 5.09 \n", - "None 5.09 \n", - "None 5.21 \n", - "-0.27 0.52 \n", - "-0.74 0.53 \n", - "-0.27 0.52 \n", - "-0.74 0.53 \n", - "-0.27 0.52 \n", - "-0.74 0.53 \n", - "-0.27 0.52 \n", - "-0.74 0.53 \n", - "-0.27 0.52 \n", - "-0.74 0.53 \n", - "-4.36 1.12 \n", - "-4.36 1.12 \n", - "-3.11 6.88 \n", - "-3.11 6.88 \n", - "1.95 7.84 \n", - "-13.39 1.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-14.03 5.65 \n", - "-14.03 5.65 \n", - "-134.27 6.56 \n", - "-134.27 6.57 \n", - "-134.27 6.56 \n", - "-134.27 6.57 \n", - "-10.02 0.37 \n", - "-10.02 0.37 \n", - "0.94 0.5 \n", - "1.57 0.59 \n", - "-1.7 4.8 \n", - "-1.19 0.46 \n", - "-0.84 0.89 \n", - "-3.26 4.81 \n", - "-0.56 0.56 \n", - "-0.21 0.94 \n", - "-115.68 1.75 \n", - "-97.19 0.8 \n", - "-102.48 1.26 \n", - "-81.93 6.65 \n", - "10000000.0 10000000.0 \n", - "-3.87 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-13.21 1.07 \n", - "-6.02 0.56 \n", - "1.6 0.47 \n", - "2.96 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "-0.18 0.36 \n", - "-0.18 0.36 \n", - "-0.18 0.36 \n", - "2.16 5.87 \n", - "-0.18 0.36 \n", - "-0.18 0.36 \n", - "-13.09 1.07 \n", - "0.26 0.31 \n", - "0.53 0.54 \n", - "-0.48 0.18 \n", - "-0.76 0.39 \n", - "-0.35 0.39 \n", - "-0.02 0.09 \n", - "0.86 0.44 \n", - "-0.61 0.47 \n", - "-0.32 0.57 \n", - "0.94 0.43 \n", - "0.26 0.31 \n", - "0.53 0.54 \n", - "-0.48 0.18 \n", - "-0.76 0.39 \n", - "-0.35 0.39 \n", - "-0.02 0.09 \n", - "0.86 0.44 \n", - "-0.61 0.47 \n", - "-0.32 0.57 \n", - "0.94 0.43 \n", - "0.26 0.31 \n", - "0.53 0.54 \n", - "-0.48 0.18 \n", - "-0.76 0.39 \n", - "-0.35 0.39 \n", - "-0.02 0.09 \n", - "0.86 0.44 \n", - "-0.61 0.47 \n", - "-0.32 0.57 \n", - "0.94 0.43 \n", - "-2.62 0.35 \n", - "-2.62 0.35 \n", - "-2.62 0.35 \n", - "-2.62 0.35 \n", - "-2.62 0.35 \n", - "-2.62 0.35 \n", - "-2.62 0.35 \n", - "-2.62 0.35 \n", - "-2.62 0.35 \n", - "-2.63 1.54 \n", - "-2.62 0.35 \n", - "-2.62 0.35 \n", - "-2.62 0.35 \n", - "-2.62 0.35 \n", - "-2.63 1.54 \n", - "-2.62 0.35 \n", - "-2.62 0.35 \n", - "-2.62 0.35 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "-20.02 2.27 \n", - "-1.7 4.94 \n", - "-13.24 1.07 \n", - "-1.7 6.1 \n", - "3.25 0.27 \n", - "3.25 0.26 \n", - "-12.83 1.07 \n", - "-13.08 1.07 \n", - "-3.88 0.56 \n", - "-3.88 0.56 \n", - "-13.2 1.07 \n", - "3.83 2.4 \n", - "-1.7 5.27 \n", - "-13.18 1.07 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-3.88 0.56 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "10000000.0 10000000.0 \n", - "-2.99 0.53 \n", - "-2.99 0.53 \n", - "-2.99 0.53 \n", - "-2.99 0.53 \n", - "-3.62 0.46 \n", - "-3.62 0.46 \n", - "-8.48 0.49 \n", - "-19.39 6.27 \n", - "-19.39 6.28 \n", - "-3.88 0.56 \n", - "-13.46 13.83 \n", - "-6.02 0.56 \n", - "-94.01 0.75 \n", - "-94.01 0.75 \n", - "4.84 0.25 \n", - "4.84 0.24 \n", - "-8.67 0.51 \n", - "-8.67 0.51 \n", - "0.28 0.38 \n", - "0.28 0.37 \n", - "-90.63 3.53 \n", - "-0.4 0.68 \n", - "-2.67 19.14 \n", - "-2.67 19.87 \n", - "-1.7 19.85 \n", - "-1.7 19.16 \n", - "-0.78 0.68 \n", - "-2.67 18.37 \n", - "-2.67 18.33 \n", - "-2.67 18.33 \n", - "-1.7 18.33 \n", - "-1.7 18.37 \n", - "-0.78 0.68 \n", - "-1.7 18.34 \n", - "-1.7 18.34 \n", - "-1.7 18.34 \n", - "-1.7 18.32 \n", - "-1.7 18.32 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "-3.73 0.56 \n", - "-6.02 0.56 \n", - "0.28 0.37 \n", - "2.45 1.22 \n", - "2.46 1.22 \n", - "-3.87 0.56 \n", - "-103.68 7.3 \n", - "-103.68 7.31 \n", - "-103.68 7.3 \n", - "-103.68 7.31 \n", - "-103.68 7.3 \n", - "-103.68 7.31 \n", - "-103.68 7.3 \n", - "-103.68 7.31 \n", - "3.95 2.4 \n", - "-4.77 0.24 \n", - "-4.77 0.24 \n", - "-95.81 9.29 \n", - "-1.7 8.03 \n", - "-1.7 8.03 \n", - "-102.63 1.15 \n", - "-102.63 1.15 \n", - "-102.63 1.15 \n", - "3.77 2.4 \n", - "-10.81 0.83 \n", - "-1.7 14.41 \n", - "-1.7 14.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 16.66 \n", - "-1.7 16.66 \n", - "-1.7 22.15 \n", - "-1.7 24.08 \n", - "-2.36 0.45 \n", - "-25.73 1.49 \n", - "-25.73 1.49 \n", - "-25.73 1.49 \n", - "-25.73 1.49 \n", - "-25.73 1.49 \n", - "0.16 1.17 \n", - "0.16 1.17 \n", - "-5.41 1.47 \n", - "-25.73 1.49 \n", - "-25.73 1.49 \n", - "0.16 1.17 \n", - "-5.41 1.47 \n", - "-45.76 3.05 \n", - "-45.76 3.05 \n", - "-2.64 1.79 \n", - "-2.64 1.79 \n", - "-2.64 1.79 \n", - "-98.04 0.79 \n", - "-98.04 0.79 \n", - "-98.04 0.79 \n", - "-98.04 0.79 \n", - "-94.13 0.75 \n", - "-94.12 0.75 \n", - "-94.13 0.75 \n", - "-94.12 0.75 \n", - "-94.13 0.75 \n", - "-94.12 0.75 \n", - "-104.63 0.81 \n", - "-104.62 0.81 \n", - "-104.63 0.81 \n", - "-104.62 0.81 \n", - "-104.63 0.81 \n", - "-104.62 0.81 \n", - "-118.19 0.76 \n", - "-118.19 0.76 \n", - "-118.19 0.76 \n", - "-118.19 0.76 \n", - "-118.19 0.76 \n", - "-118.19 0.76 \n", - "-5.93 0.97 \n", - "-5.94 0.97 \n", - "-94.13 0.75 \n", - "-94.12 0.75 \n", - "-94.13 0.75 \n", - "-94.12 0.75 \n", - "-94.13 0.75 \n", - "-94.12 0.75 \n", - "-104.63 0.81 \n", - "-104.62 0.81 \n", - "-104.63 0.81 \n", - "-104.62 0.81 \n", - "-104.63 0.81 \n", - "-104.62 0.81 \n", - "-118.19 0.76 \n", - "-118.19 0.76 \n", - "-118.19 0.76 \n", - "-118.19 0.76 \n", - "-118.19 0.76 \n", - "-118.19 0.76 \n", - "-3.51 0.88 \n", - "-3.51 0.87 \n", - "-104.99 1.51 \n", - "-104.99 1.51 \n", - "-104.99 1.51 \n", - "-104.99 1.51 \n", - "-94.12 0.75 \n", - "-94.13 0.75 \n", - "-94.12 0.75 \n", - "-94.13 0.75 \n", - "-94.12 0.75 \n", - "-104.62 0.81 \n", - "-104.63 0.81 \n", - "-104.62 0.81 \n", - "-104.63 0.81 \n", - "-104.62 0.81 \n", - "-118.19 0.76 \n", - "-118.19 0.76 \n", - "-118.19 0.76 \n", - "-118.19 0.76 \n", - "-118.19 0.76 \n", - "-5.93 0.97 \n", - "-5.94 0.97 \n", - "-92.58 11.51 \n", - "-92.58 11.5 \n", - "-92.58 11.51 \n", - "-92.58 11.5 \n", - "-92.58 11.51 \n", - "-103.56 11.53 \n", - "-103.56 11.53 \n", - "-103.56 11.53 \n", - "-103.56 11.53 \n", - "-103.56 11.53 \n", - "-118.58 11.5 \n", - "-118.58 11.49 \n", - "-118.58 11.5 \n", - "-118.58 11.49 \n", - "-118.58 11.5 \n", - "1.01 11.51 \n", - "1.01 11.52 \n", - "-14.4 6.87 \n", - "-14.4 6.88 \n", - "-14.4 6.89 \n", - "-14.4 6.91 \n", - "-14.4 6.93 \n", - "-1.7 10.99 \n", - "-4.54 0.57 \n", - "-15.5 1.25 \n", - "-3.68 1.2 \n", - "-18.68 2.85 \n", - "-9.26 1.5 \n", - "-9.26 1.5 \n", - "-29.58 1.51 \n", - "-29.58 1.51 \n", - "-29.58 1.51 \n", - "-3.68 1.2 \n", - "-18.68 2.85 \n", - "-9.26 1.5 \n", - "-9.26 1.5 \n", - "-29.58 1.51 \n", - "-29.58 1.51 \n", - "-29.58 1.51 \n", - "-3.88 0.56 \n", - "-17.0 1.55 \n", - "-17.0 1.55 \n", - "-17.0 1.55 \n", - "-17.0 1.55 \n", - "-17.0 1.55 \n", - "-17.0 1.55 \n", - "-17.0 1.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.04 1.58 \n", - "-2.14 1.9 \n", - "-4.04 1.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.33 0.46 \n", - "-9.34 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.76 0.5 \n", - "-4.76 0.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.18 1.19 \n", - "-29.08 1.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.3 1.26 \n", - "-26.19 1.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.57 0.51 \n", - "-4.57 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-31.87 1.48 \n", - "10000000.0 10000000.0 \n", - "-18.13 0.71 \n", - "-18.13 0.71 \n", - "-18.13 0.71 \n", - "-18.13 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.44 0.24 \n", - "-4.44 0.24 \n", - "-4.44 0.24 \n", - "-4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.86 0.31 \n", - "-5.41 1.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.16 1.17 \n", - "-5.41 1.47 \n", - "-25.73 1.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.26 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.0 1.55 \n", - "10000000.0 10000000.0 \n", - "-1.19 0.46 \n", - "-2.14 1.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.64 0.81 \n", - "-6.06 0.67 \n", - "-6.06 0.67 \n", - "10000000.0 10000000.0 \n", - "4.57 0.34 \n", - "4.57 0.34 \n", - "1.8 0.52 \n", - "1.8 0.52 \n", - "10000000.0 10000000.0 \n", - "4.57 0.34 \n", - "4.57 0.34 \n", - "1.8 0.52 \n", - "1.8 0.52 \n", - "9.31 0.49 \n", - "9.31 0.49 \n", - "10000000.0 10000000.0 \n", - "6.3 0.96 \n", - "4.65 0.23 \n", - "-29.08 1.5 \n", - "-26.19 1.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.48 0.41 \n", - "-4.56 0.5 \n", - "-1.52 0.35 \n", - "10000000.0 10000000.0 \n", - "-31.87 1.48 \n", - "10000000.0 10000000.0 \n", - "-31.87 1.48 \n", - "-11.55 1.46 \n", - "10000000.0 10000000.0 \n", - "-2.95 0.47 \n", - "-2.58 0.51 \n", - "-93.67 1.62 \n", - "2.16 5.6 \n", - "2.16 5.53 \n", - "2.16 5.48 \n", - "-5.17 0.34 \n", - "-75.83 1.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.59 5.93 \n", - "9.59 5.93 \n", - "1.01 0.76 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "-3.83 0.39 \n", - "-3.83 0.39 \n", - "-3.88 0.56 \n", - "-1.7 10.62 \n", - "-3.88 0.56 \n", - "-3.88 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-7.91 1.04 \n", - "-24.32 4.05 \n", - "10000000.0 10000000.0 \n", - "-7.16 0.32 \n", - "-7.16 0.32 \n", - "10000000.0 10000000.0 \n", - "-4.44 0.24 \n", - "-4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "-5.82 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "54.09 3.58 \n", - "-178.78 13.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 7.94 \n", - "-3.11 7.95 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "-88.54 0.82 \n", - "-186.65 1.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.84 2.49 \n", - "-0.46 2.33 \n", - "-0.46 1.77 \n", - "-294.47 21.92 \n", - "10000000.0 10000000.0 \n", - "-314.72 20.84 \n", - "-314.72 20.88 \n", - "10000000.0 10000000.0 \n", - "-316.94 2.26 \n", - "-316.93 2.26 \n", - "10000000.0 10000000.0 \n", - "-316.94 2.26 \n", - "-316.93 2.26 \n", - "10000000.0 10000000.0 \n", - "-316.93 2.26 \n", - "-191.66 12.73 \n", - "1.4 0.34 \n", - "0.26 0.6 \n", - "-0.22 0.59 \n", - "10000000.0 10000000.0 \n", - "0.26 0.6 \n", - "-0.22 0.59 \n", - "10000000.0 10000000.0 \n", - "-0.64 0.3 \n", - "1.94 0.47 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-6.02 0.56 \n", - "-1.7 5.59 \n", - "-6.02 0.56 \n", - "-1.7 6.37 \n", - "-1.7 6.37 \n", - "0.94 0.5 \n", - "-0.84 0.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 8.11 \n", - "-105.97 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.89 0.25 \n", - "4.57 0.34 \n", - "-15.74 0.78 \n", - "0.42 0.27 \n", - "-2.23 0.53 \n", - "-5.82 0.35 \n", - "-102.63 1.15 \n", - "-102.63 1.15 \n", - "-25.73 1.49 \n", - "-12.08 0.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.96 1.28 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "-6.06 4.24 \n", - "10000000.0 10000000.0 \n", - "-31.87 1.48 \n", - "-24.11 1.28 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-37.41 0.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-37.41 0.17 \n", - "-37.41 0.17 \n", - "-26.84 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.68 1.76 \n", - "-37.41 0.17 \n", - "9.68 2.64 \n", - "9.68 2.41 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-1.7 6.96 \n", - "-6.02 0.56 \n", - "None 4.9 \n", - "None 4.86 \n", - "13.23 0.36 \n", - "-8.63 0.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.22 0.59 \n", - "10000000.0 10000000.0 \n", - "-3.88 0.56 \n", - "-1.18 0.45 \n", - "10000000.0 10000000.0 \n", - "None 4.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.48 0.43 \n", - "0.48 0.43 \n", - "0.48 0.43 \n", - "3.13 0.76 \n", - "6.14 0.18 \n", - "-32.01 1.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.13 0.75 \n", - "-94.12 0.75 \n", - "-52.15 6.69 \n", - "-52.15 6.69 \n", - "-52.15 6.69 \n", - "-52.15 6.69 \n", - "-94.13 0.75 \n", - "1.25 0.13 \n", - "10000000.0 10000000.0 \n", - "-4.52 1.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.74 0.72 \n", - "10000000.0 10000000.0 \n", - "15.26 0.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "15.26 0.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "57.71 0.34 \n", - "4.56 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.2 9.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.23 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 6.57 \n", - "-1.7 6.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.87 5.63 \n", - "-0.83 0.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-27.33 4.38 \n", - "-18.75 0.66 \n", - "-34.08 14.54 \n", - "10000000.0 10000000.0 \n", - "0.09 0.5 \n", - "-3.58 1.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 11.68 \n", - "10000000.0 10000000.0 \n", - "-0.98 0.07 \n", - "-0.98 0.07 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.06 0.67 \n", - "-64.18 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-101.93 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.18 4.84 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-5.56 0.33 \n", - "-5.56 0.33 \n", - "-131.16 1.7 \n", - "10000000.0 10000000.0 \n", - "-36.19 1.56 \n", - "-3.05 5.12 \n", - "-3.05 5.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-122.57 1.2 \n", - "10000000.0 10000000.0 \n", - "-116.99 2.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-189.98 12.73 \n", - "-189.98 12.73 \n", - "-189.98 12.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-105.97 0.91 \n", - "-94.39 9.36 \n", - "10000000.0 10000000.0 \n", - "-97.25 9.7 \n", - "-97.19 0.8 \n", - "-105.97 0.91 \n", - "-105.96 0.91 \n", - "-90.63 6.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-128.98 8.61 \n", - "-294.47 21.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-116.64 0.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "-102.45 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-114.32 1.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.34 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.25 0.13 \n", - "-8.15 0.78 \n", - "-8.09 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-119.46 1.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "14.27 0.34 \n", - "10000000.0 10000000.0 \n", - "13.87 0.31 \n", - "10000000.0 10000000.0 \n", - "-142.25 4.98 \n", - "-85.38 7.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.25 0.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.92 1.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.74 0.72 \n", - "8.68 0.76 \n", - "-20.81 1.48 \n", - "10.18 0.69 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.18 2.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.47 4.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.04 0.55 \n", - "57.71 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.17 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.62 0.69 \n", - "-9.57 0.81 \n", - "10000000.0 10000000.0 \n", - "-95.83 8.6 \n", - "-14.49 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.18 0.36 \n", - "3.41 0.86 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.76 \n", - "-4.36 7.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.74 5.72 \n", - "-16.73 10.87 \n", - "-8.72 10.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.2 9.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 8.62 \n", - "-4.36 8.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.12 1.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "19.12 5.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.43 3.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.66 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.61 5.41 \n", - "-3.61 5.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.45 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "26.76 1.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.07 0.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.4 1.01 \n", - "10000000.0 10000000.0 \n", - "-13.16 0.99 \n", - "10000000.0 10000000.0 \n", - "-13.02 0.99 \n", - "9.53 11.63 \n", - "9.53 11.63 \n", - "10000000.0 10000000.0 \n", - "-0.74 0.51 \n", - "10000000.0 10000000.0 \n", - "59.57 0.45 \n", - "-13.16 0.99 \n", - "-3.83 0.39 \n", - "-17.09 3.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.08 0.85 \n", - "10000000.0 10000000.0 \n", - "-1.7 12.2 \n", - "-1.7 12.2 \n", - "-1.7 13.27 \n", - "-1.7 13.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.87 0.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 8.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.83 0.39 \n", - "10000000.0 10000000.0 \n", - "-3.83 0.39 \n", - "-3.83 0.39 \n", - "-13.16 0.99 \n", - "-14.4 6.78 \n", - "-4.09 0.85 \n", - "10000000.0 10000000.0 \n", - "156.78 7.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.16 0.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.17 0.99 \n", - "10000000.0 10000000.0 \n", - "-16.85 1.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-62.41 0.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "130.27 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.53 11.96 \n", - "9.53 11.96 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.53 11.55 \n", - "10000000.0 10000000.0 \n", - "-3.82 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-122.46 0.81 \n", - "10000000.0 10000000.0 \n", - "-18.75 0.66 \n", - "-7.89 0.66 \n", - "-6.4 0.66 \n", - "-6.4 0.66 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.82 1.27 \n", - "-18.52 0.78 \n", - "-25.66 3.88 \n", - "10000000.0 10000000.0 \n", - "0.96 0.71 \n", - "4.16 0.78 \n", - "10000000.0 10000000.0 \n", - "-7.82 0.58 \n", - "10000000.0 10000000.0 \n", - "-3.9 0.57 \n", - "-1.86 0.46 \n", - "-1.36 0.5 \n", - "-6.3 2.64 \n", - "10000000.0 10000000.0 \n", - "-5.28 0.33 \n", - "-6.83 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.94 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.84 1.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.88 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "208.0 10.9 \n", - "-1.49 1.31 \n", - "0.21 0.71 \n", - "0.21 0.71 \n", - "10000000.0 10000000.0 \n", - "-1.09 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.05 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 11.68 \n", - "None 11.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-35.04 10.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.48 1.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.64 0.81 \n", - "-6.94 0.95 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.98 0.07 \n", - "2.48 1.24 \n", - "10000000.0 10000000.0 \n", - "-1.26 0.5 \n", - "-1.26 0.5 \n", - "4.29 0.24 \n", - "4.29 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.89 0.24 \n", - "-5.81 0.35 \n", - "-5.2 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.12 0.71 \n", - "-3.13 0.83 \n", - "-5.09 0.53 \n", - "-3.32 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.02 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.53 0.85 \n", - "-7.53 0.85 \n", - "-7.53 0.85 \n", - "-7.53 0.85 \n", - "-9.32 1.49 \n", - "-7.51 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-5.8 1.53 \n", - "-5.82 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.43 0.33 \n", - "-0.88 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.34 0.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.68 0.72 \n", - "-7.67 0.72 \n", - "-7.84 0.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.34 11.16 \n", - "-12.02 11.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.79 28.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.69 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-187.37 1.02 \n", - "-7.9 1.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-63.23 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.63 0.42 \n", - "-2.63 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-101.22 0.27 \n", - "-63.68 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.46 2.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-100.77 0.29 \n", - "10000000.0 10000000.0 \n", - "-47.28 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.06 0.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "155.37 23.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.82 0.43 \n", - "10000000.0 10000000.0 \n", - "-64.18 0.33 \n", - "10000000.0 10000000.0 \n", - "-637.03 6.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-125.73 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-101.72 0.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-101.93 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-269.79 0.65 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "-3.34 0.3 \n", - "-3.63 0.8 \n", - "-6.68 4.98 \n", - "7.29 4.95 \n", - "1769.48 5.39 \n", - "13.27 1.0 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "-1.7 5.31 \n", - "-3.83 0.39 \n", - "-12.61 0.96 \n", - "-1.86 0.46 \n", - "5.81 1.92 \n", - "5.81 1.92 \n", - "-105.97 0.91 \n", - "-0.28 0.38 \n", - "3.2 1.15 \n", - "10000000.0 10000000.0 \n", - "-11.12 1.44 \n", - "0.26 6.58 \n", - "10000000.0 10000000.0 \n", - "-3.57 0.3 \n", - "-3.38 0.51 \n", - "-12.71 1.03 \n", - "-12.71 1.03 \n", - "-3.61 6.53 \n", - "983.91 1.03 \n", - "-3.88 0.56 \n", - "6.93 1.03 \n", - "7.3 1.24 \n", - "-8.3 0.8 \n", - "4.44 0.24 \n", - "-1.18 0.45 \n", - "-3.99 0.33 \n", - "10000000.0 10000000.0 \n", - "0.48 1.95 \n", - "-62.49 1.36 \n", - "7.17 2.81 \n", - "None None \n", - "-2.92 0.8 \n", - "-14.55 0.79 \n", - "2.8 0.75 \n", - "10000000.0 10000000.0 \n", - "0.84 1.02 \n", - "3.53 0.32 \n", - "-3.6 0.3 \n", - "-10.83 1.01 \n", - "-4.36 6.35 \n", - "0.38 0.45 \n", - "114.39 1.15 \n", - "-10.7 1.43 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "-9.8 6.34 \n", - "-9.8 6.33 \n", - "-2.56 0.59 \n", - "-4.36 5.53 \n", - "10000000.0 10000000.0 \n", - "-0.62 0.69 \n", - "-0.62 0.69 \n", - "4.44 0.24 \n", - "-19.86 10.94 \n", - "14.67 0.4 \n", - "23.24 5.58 \n", - "-4.11 0.46 \n", - "4.44 0.24 \n", - "10.16 1.22 \n", - "1.49 1.28 \n", - "1.49 1.28 \n", - "14.39 0.83 \n", - "-7.38 0.85 \n", - "-3.78 0.52 \n", - "-1.7 8.05 \n", - "10000000.0 10000000.0 \n", - "-9.45 0.27 \n", - "-6.02 6.8 \n", - "-23.88 2.0 \n", - "-54.67 4.16 \n", - "-83.95 6.39 \n", - "-83.89 2.02 \n", - "-13.45 5.25 \n", - "-2.12 1.51 \n", - "-2.23 0.46 \n", - "0.09 0.71 \n", - "-14.03 6.47 \n", - "0.38 0.45 \n", - "7.22 2.55 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "-5.94 0.97 \n", - "-0.34 0.55 \n", - "0.83 0.41 \n", - "10000000.0 10000000.0 \n", - "13.71 1.53 \n", - "-3.68 7.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.09 2.11 \n", - "10000000.0 10000000.0 \n", - "27.59 2.72 \n", - "-94.12 0.75 \n", - "-4.36 6.36 \n", - "-8.68 0.26 \n", - "-2.62 0.35 \n", - "1.2 1.06 \n", - "-8.8 1.03 \n", - "-1.94 0.56 \n", - "-15.89 0.83 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "-6.4 0.66 \n", - "1.57 3.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "66.56 1.93 \n", - "-3.68 7.49 \n", - "-1.7 6.08 \n", - "10000000.0 10000000.0 \n", - "-7.85 0.58 \n", - "-1.7 6.57 \n", - "-11.23 6.48 \n", - "None None \n", - "-6.87 0.48 \n", - "-6.14 1.01 \n", - "54.83 0.74 \n", - "9.66 0.82 \n", - "-6.0 0.82 \n", - "0.13 0.42 \n", - "10000000.0 10000000.0 \n", - "14.27 0.33 \n", - "14.27 0.34 \n", - "25.53 4.45 \n", - "3.52 0.71 \n", - "2.56 0.91 \n", - "-1.69 1.85 \n", - "-90.71 1.22 \n", - "10000000.0 10000000.0 \n", - "-6.94 0.41 \n", - "None None \n", - "-3.88 0.56 \n", - "-3.88 0.56 \n", - "-2.62 0.35 \n", - "-1.54 0.44 \n", - "-15.5 1.25 \n", - "9.66 0.82 \n", - "6.25 1.74 \n", - "-3.39 0.3 \n", - "10000000.0 10000000.0 \n", - "-61.07 1.42 \n", - "-20.04 6.38 \n", - "20.04 6.36 \n", - "-20.04 6.38 \n", - "20.04 6.36 \n", - "-73.74 2.89 \n", - "10000000.0 10000000.0 \n", - "-5.98 0.42 \n", - "-1.14 0.86 \n", - "-3.63 3.1 \n", - "10000000.0 10000000.0 \n", - "-72.23 0.2 \n", - "10000000.0 10000000.0 \n", - "-3.61 7.51 \n", - "-4.08 0.85 \n", - "-15.7 1.65 \n", - "1.82 0.63 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "74.21 5.32 \n", - "-10.41 1.41 \n", - "7.22 3.18 \n", - "-2.27 0.32 \n", - "-4.97 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.17 0.33 \n", - "-11.23 8.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.92 1.11 \n", - "-20.66 0.7 \n", - "-4316.25 26.67 \n", - "6.19 13.26 \n", - "1.63 1.66 \n", - "1.4 0.94 \n", - "-22.56 1.11 \n", - "-94.13 0.75 \n", - "-103.41 0.78 \n", - "0.28 0.37 \n", - "0.28 0.38 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "-3.38 0.51 \n", - "None None \n", - "7.22 0.46 \n", - "7.22 0.46 \n", - "114.39 1.15 \n", - "10000000.0 10000000.0 \n", - "-6.74 5.72 \n", - "-90.74 0.91 \n", - "104.86 1.27 \n", - "-21.35 1.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-97.19 0.8 \n", - "10000000.0 10000000.0 \n", - "-30.31 1.92 \n", - "-105.97 0.91 \n", - "-34.18 1.58 \n", - "-4.36 10.38 \n", - "-34.18 1.58 \n", - "-4.36 10.33 \n", - "-105.96 0.91 \n", - "-42.89 3.91 \n", - "-4.36 6.76 \n", - "46.59 0.99 \n", - "-6.74 5.58 \n", - "-4.36 5.88 \n", - "-4.36 5.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.38 0.45 \n", - "-16.25 1.45 \n", - "2.79 0.8 \n", - "0.37 4.55 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "4.44 0.24 \n", - "-0.18 0.36 \n", - "-0.18 0.36 \n", - "4.44 0.24 \n", - "7.19 0.32 \n", - "4.44 0.24 \n", - "-0.18 0.36 \n", - "4.44 0.24 \n", - "-0.18 0.36 \n", - "7.19 0.32 \n", - "4.96 0.36 \n", - "0.25 0.71 \n", - "10.77 0.89 \n", - "14.27 0.34 \n", - "10.66 0.78 \n", - "None None \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "-25.63 0.25 \n", - "-4.36 7.84 \n", - "-25.88 10.89 \n", - "-4.36 7.84 \n", - "-34.18 1.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.29 0.69 \n", - "-5.41 0.61 \n", - "-0.28 0.38 \n", - "0.38 0.45 \n", - "-3.11 3.56 \n", - "-15.89 0.83 \n", - "-2.8 1.41 \n", - "-0.99 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.63 0.71 \n", - "4.89 0.24 \n", - "-94.13 0.75 \n", - "-94.13 0.75 \n", - "-150.73 10.1 \n", - "1.18 0.45 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "-1.18 0.45 \n", - "4.52 1.9 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "4.52 1.9 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "0.28 0.38 \n", - "4.44 0.24 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "4.44 0.24 \n", - "2.3 11.79 \n", - "2.3 11.78 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "4.44 0.24 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "4.44 0.24 \n", - "0.28 0.37 \n", - "-97.2 0.8 \n", - "0.28 0.38 \n", - "-98.05 0.82 \n", - "-95.07 0.74 \n", - "-96.63 0.76 \n", - "-1.23 1.41 \n", - "4.44 0.24 \n", - "-6.75 0.75 \n", - "-25.91 1.72 \n", - "-98.75 2.72 \n", - "-2.88 0.75 \n", - "-0.22 0.74 \n", - "-4.45 0.24 \n", - "10000000.0 10000000.0 \n", - "18.89 3.42 \n", - "4.89 0.24 \n", - "-4.36 5.12 \n", - "-8.68 0.26 \n", - "-8.68 0.27 \n", - "-62.32 6.07 \n", - "13.71 1.25 \n", - "-4.36 5.1 \n", - "-8.68 0.26 \n", - "-8.67 0.27 \n", - "-22.58 1.11 \n", - "-8.68 0.26 \n", - "-8.67 0.27 \n", - "-22.57 1.11 \n", - "-20.0 1.66 \n", - "0.18 0.36 \n", - "-74.42 6.19 \n", - "-50.41 6.19 \n", - "49.25 0.53 \n", - "-6.6 0.5 \n", - "-0.41 0.38 \n", - "-95.83 7.08 \n", - "-8.68 0.26 \n", - "-23.93 0.27 \n", - "-4.36 5.33 \n", - "-4.02 0.42 \n", - "-49.36 1.65 \n", - "-49.36 1.65 \n", - "5.07 0.75 \n", - "-14.27 0.34 \n", - "-0.5 1.88 \n", - "-26.9 1.23 \n", - "-102.15 2.15 \n", - "-9.07 0.26 \n", - "-9.06 0.27 \n", - "2.39 0.75 \n", - "-4.84 0.25 \n", - "10000000.0 10000000.0 \n", - "5.9 1.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.15 3.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.58 9.84 \n", - "-105.96 0.91 \n", - "-4.36 6.66 \n", - "-80.46 1.66 \n", - "-19.42 6.89 \n", - "-95.44 7.99 \n", - "-2.66 0.8 \n", - "-95.83 8.5 \n", - "-4.36 7.67 \n", - "-95.63 8.62 \n", - "-19.42 7.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.66 0.26 \n", - "10000000.0 10000000.0 \n", - "6.29 1.0 \n", - "-2.6 2.11 \n", - "-49.25 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.54 0.55 \n", - "-4.07 0.85 \n", - "10000000.0 10000000.0 \n", - "-3.14 6.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.45 0.38 \n", - "-110.08 3.81 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.5 3.21 \n", - "120.14 3.17 \n", - "0.62 2.74 \n", - "-9.45 0.26 \n", - "-8.55 0.26 \n", - "8.67 0.26 \n", - "1.88 0.49 \n", - "-0.37 0.55 \n", - "-6.14 0.96 \n", - "6.14 0.96 \n", - "None None \n", - "38.5 9.08 \n", - "-8.92 5.0 \n", - "-5.88 0.41 \n", - "4.44 0.24 \n", - "None None \n", - "-8.44 0.34 \n", - "-11.23 10.05 \n", - "0.05 5.09 \n", - "8.79 0.45 \n", - "0.38 0.45 \n", - "10.79 0.66 \n", - "0.9 0.42 \n", - "-2.56 0.46 \n", - "-3.3 0.3 \n", - "-5.06 0.75 \n", - "10000000.0 10000000.0 \n", - "-15.98 1.38 \n", - "-221.21 3.19 \n", - "-125.07 0.95 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.06 0.27 \n", - "-7.31 1.71 \n", - "-1.24 0.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.8 9.66 \n", - "-53.52 9.09 \n", - "38.5 9.08 \n", - "-48.84 10.19 \n", - "-4.36 5.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.17 1.43 \n", - "-15.44 1.35 \n", - "-8.34 1.05 \n", - "20.81 3.0 \n", - "6.55 1.05 \n", - "6.54 1.05 \n", - "-7.69 0.72 \n", - "-3.11 0.49 \n", - "-15.57 1.32 \n", - "14.49 0.33 \n", - "-0.79 13.23 \n", - "-3.11 10.14 \n", - "3.75 0.29 \n", - "-88.58 1.97 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-103.72 1.71 \n", - "-105.96 0.91 \n", - "-103.39 2.28 \n", - "-110.94 1.04 \n", - "-82.17 2.13 \n", - "-105.97 0.91 \n", - "-97.2 0.8 \n", - "-4.36 5.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.75 0.44 \n", - "-8.05 1.15 \n", - "-7.77 1.33 \n", - "-4.6 1.24 \n", - "4.32 0.41 \n", - "10000000.0 10000000.0 \n", - "-6.26 9.67 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.55 1.5 \n", - "-23.91 1.3 \n", - "8.38 0.33 \n", - "-11.24 0.43 \n", - "-43.22 0.65 \n", - "10000000.0 10000000.0 \n", - "0.49 0.57 \n", - "10000000.0 10000000.0 \n", - "-104.87 1.27 \n", - "-6.74 5.93 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.88 \n", - "-4.36 5.83 \n", - "-104.86 1.27 \n", - "-6.74 5.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "227.13 2.37 \n", - "106.73 1.14 \n", - "2.23 2.95 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "-10.37 0.2 \n", - "-10.37 0.2 \n", - "-8.68 0.26 \n", - "-6.45 0.99 \n", - "-23.93 0.27 \n", - "-23.93 0.27 \n", - "-23.28 2.05 \n", - "-8.53 1.22 \n", - "-23.28 2.05 \n", - "-16.6 6.44 \n", - "-12.56 6.36 \n", - "-62.1 1.36 \n", - "-64.83 1.45 \n", - "-93.87 1.66 \n", - "-60.46 1.41 \n", - "-105.96 0.91 \n", - "105.97 0.91 \n", - "-34.3 0.27 \n", - "26.0 0.87 \n", - "-11.78 6.84 \n", - "-11.78 6.83 \n", - "-68.76 3.69 \n", - "-61.0 1.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-79.14 2.26 \n", - "-79.14 2.26 \n", - "-79.14 2.26 \n", - "-79.14 2.26 \n", - "10000000.0 10000000.0 \n", - "-94.12 0.75 \n", - "2.73 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-45.25 0.8 \n", - "4.89 0.24 \n", - "-9.06 0.26 \n", - "-118.03 0.76 \n", - "-90.21 1.25 \n", - "-8.55 1.22 \n", - "10000000.0 10000000.0 \n", - "-10.0 6.76 \n", - "-75.61 1.39 \n", - "-95.71 1.04 \n", - "95.68 1.04 \n", - "-94.12 0.75 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "-10.7 1.47 \n", - "-8.68 0.26 \n", - "10000000.0 10000000.0 \n", - "-94.12 0.75 \n", - "-8.67 0.27 \n", - "-70.46 6.3 \n", - "-70.46 6.29 \n", - "-12.52 6.33 \n", - "-12.52 6.31 \n", - "-83.04 6.34 \n", - "-61.19 1.37 \n", - "-8.84 0.52 \n", - "0.18 0.36 \n", - "-2.95 0.3 \n", - "-74.87 1.39 \n", - "-3.4 0.86 \n", - "-128.24 1.94 \n", - "-110.65 1.18 \n", - "-4.36 5.71 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "-10.29 1.04 \n", - "-15.57 1.74 \n", - "-12.52 6.33 \n", - "-20.33 1.89 \n", - "14.27 0.33 \n", - "-20.31 1.89 \n", - "-14.11 1.64 \n", - "-16.49 1.89 \n", - "-0.28 0.37 \n", - "-20.54 2.43 \n", - "10000000.0 10000000.0 \n", - "-88.54 0.82 \n", - "-104.66 1.29 \n", - "-95.24 0.84 \n", - "-95.24 0.84 \n", - "-3.53 6.16 \n", - "1.54 0.63 \n", - "-0.37 0.64 \n", - "5.66 0.74 \n", - "-25.79 2.94 \n", - "-4.17 0.94 \n", - "-22.19 1.11 \n", - "-6.55 1.89 \n", - "-5.31 0.46 \n", - "-0.52 0.47 \n", - "-6.32 0.41 \n", - "-2.58 0.52 \n", - "-264.62 0.76 \n", - "-34.54 1.84 \n", - "-112.02 0.74 \n", - "-56.02 0.43 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "-8.19 1.12 \n", - "-8.06 0.42 \n", - "-10.56 6.38 \n", - "-0.79 6.2 \n", - "2.96 1.11 \n", - "-13.43 1.51 \n", - "0.26 5.09 \n", - "-13.74 0.93 \n", - "-10.96 0.39 \n", - "-14.31 0.8 \n", - "-11.67 0.39 \n", - "10000000.0 10000000.0 \n", - "-11.68 0.39 \n", - "-11.92 2.04 \n", - "-14.98 0.63 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.1 1.16 \n", - "2.1 1.16 \n", - "-6.21 0.86 \n", - "-4.31 0.75 \n", - "-2.27 0.8 \n", - "4.7 0.75 \n", - "-4.31 0.75 \n", - "-4.98 5.01 \n", - "101.79 9.55 \n", - "2.97 1.22 \n", - "-4.69 1.75 \n", - "6.44 1.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.44 2.54 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "27.2 2.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.79 0.86 \n", - "-11.78 6.46 \n", - "-8.41 2.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-62.11 1.36 \n", - "-60.9 1.49 \n", - "-72.01 1.74 \n", - "-94.76 2.17 \n", - "10000000.0 10000000.0 \n", - "-94.76 2.17 \n", - "-61.79 3.91 \n", - "-62.77 1.36 \n", - "-75.17 1.93 \n", - "-62.0 1.72 \n", - "-101.85 2.55 \n", - "-74.46 2.47 \n", - "-62.11 1.36 \n", - "-76.0 6.42 \n", - "-114.65 4.8 \n", - "-107.87 1.44 \n", - "4.22 1.68 \n", - "10000000.0 10000000.0 \n", - "-115.4 0.99 \n", - "-84.04 12.79 \n", - "-0.39 0.41 \n", - "-80.62 0.75 \n", - "-105.07 0.81 \n", - "-78.74 0.79 \n", - "-88.58 1.97 \n", - "-71.1 6.4 \n", - "-87.11 3.42 \n", - "-115.4 0.99 \n", - "-87.11 3.42 \n", - "-115.41 0.99 \n", - "-82.87 7.01 \n", - "-80.36 12.78 \n", - "-80.36 12.75 \n", - "-87.11 3.42 \n", - "-87.11 3.42 \n", - "-94.91 1.75 \n", - "-88.3 1.92 \n", - "-105.97 0.91 \n", - "-94.12 0.75 \n", - "-94.12 0.75 \n", - "-105.72 1.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-106.11 0.91 \n", - "10000000.0 10000000.0 \n", - "-105.95 0.91 \n", - "3.78 0.86 \n", - "-2.62 0.35 \n", - "4.17 0.75 \n", - "15.39 3.88 \n", - "9.64 6.29 \n", - "10000000.0 10000000.0 \n", - "-20.89 0.81 \n", - "-7.99 8.79 \n", - "4.6 6.38 \n", - "38.9 9.75 \n", - "-49.12 0.53 \n", - "-27.05 1.52 \n", - "-107.67 1.13 \n", - "-7.05 1.76 \n", - "-127.64 2.84 \n", - "-118.06 1.34 \n", - "-63.08 0.4 \n", - "10.37 0.2 \n", - "-4.14 1.43 \n", - "-148.9 0.5 \n", - "-9.05 1.87 \n", - "-102.55 1.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.52 0.35 \n", - "38.39 0.21 \n", - "38.83 1.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-107.89 6.27 \n", - "128.71 2.6 \n", - "-56.3 2.88 \n", - "-80.42 2.13 \n", - "-0.81 0.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.19 0.32 \n", - "0.05 0.47 \n", - "1.01 0.38 \n", - "-1.49 0.35 \n", - "-1.1 0.96 \n", - "5.71 1.49 \n", - "3.56 0.69 \n", - "-61.25 1.89 \n", - "-4.89 0.24 \n", - "-0.89 4.0 \n", - "-3.7 0.46 \n", - "-16.29 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "41.33 0.36 \n", - "41.33 0.36 \n", - "40.48 0.31 \n", - "70.98 0.52 \n", - "-23.57 10.53 \n", - "15.54 0.35 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.91 0.53 \n", - "-4.88 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.33 0.82 \n", - "-19.17 3.21 \n", - "11.03 1.98 \n", - "130.96 4.28 \n", - "-102.41 1.28 \n", - "-102.41 1.28 \n", - "-30.27 3.76 \n", - "13.32 1.59 \n", - "243.55 2.78 \n", - "2.12 1.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 5.68 \n", - "2.84 0.54 \n", - "-0.97 0.71 \n", - "-20.97 1.86 \n", - "-8.23 1.28 \n", - "-18.13 0.71 \n", - "22.57 3.37 \n", - "7.97 3.23 \n", - "7.97 3.06 \n", - "-18.95 1.96 \n", - "-20.8 1.85 \n", - "-7.77 1.33 \n", - "-100.94 1.93 \n", - "-87.05 1.67 \n", - "-3.84 0.39 \n", - "-83.58 6.31 \n", - "-93.44 6.34 \n", - "3.71 3.14 \n", - "3.75 0.29 \n", - "22.57 3.12 \n", - "7.97 3.04 \n", - "3.71 3.12 \n", - "4.44 0.24 \n", - "4.3 0.88 \n", - "10000000.0 10000000.0 \n", - "2.8 0.64 \n", - "-9.17 0.71 \n", - "6.74 0.68 \n", - "-7.19 0.32 \n", - "-5.94 0.69 \n", - "None 5.17 \n", - "-2.5 0.54 \n", - "0.26 5.17 \n", - "7.35 1.99 \n", - "9.45 1.95 \n", - "12.89 1.43 \n", - "-1.02 0.71 \n", - "4.98 5.1 \n", - "None 0.71 \n", - "-14.21 1.61 \n", - "1.18 0.45 \n", - "12.31 0.75 \n", - "0.18 0.36 \n", - "15.39 1.0 \n", - "7.32 1.47 \n", - "2.81 0.89 \n", - "3.9 0.5 \n", - "-8.27 0.89 \n", - "4.41 0.52 \n", - "-10.01 0.3 \n", - "3.06 1.31 \n", - "-3.08 0.54 \n", - "-40.14 1.7 \n", - "-18.13 0.71 \n", - "-18.13 0.71 \n", - "-18.75 0.66 \n", - "-18.75 0.66 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "-83.0 2.53 \n", - "-83.01 2.53 \n", - "-50.72 1.02 \n", - "-61.44 0.32 \n", - "-6.42 0.31 \n", - "10000000.0 10000000.0 \n", - "0.34 0.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-108.63 1.19 \n", - "-1.49 0.4 \n", - "-1.09 1.02 \n", - "-7.67 0.82 \n", - "26.77 3.57 \n", - "4.52 1.9 \n", - "-294.47 21.93 \n", - "13.87 0.31 \n", - "10.98 3.51 \n", - "-9.07 0.26 \n", - "-2.95 0.8 \n", - "0.31 0.55 \n", - "-2.16 0.33 \n", - "-1.84 0.3 \n", - "1.86 3.18 \n", - "-8.57 0.26 \n", - "-86.23 1.62 \n", - "-13.3 1.07 \n", - "-0.02 0.49 \n", - "-59.71 8.19 \n", - "-71.06 8.13 \n", - "-105.96 0.91 \n", - "-28.45 5.23 \n", - "0.37 4.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.07 0.85 \n", - "-8.67 0.27 \n", - "-8.67 0.27 \n", - "-70.46 6.3 \n", - "-49.24 0.53 \n", - "-0.45 0.97 \n", - "-27.3 4.29 \n", - "28.69 4.26 \n", - "0.46 4.55 \n", - "-5.29 6.81 \n", - "-14.2 6.92 \n", - "-8.76 7.02 \n", - "212.5 5.09 \n", - "-4.36 7.04 \n", - "-2.38 0.44 \n", - "4.44 0.24 \n", - "3.57 0.24 \n", - "-0.28 0.38 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "4.89 0.24 \n", - "4.89 0.25 \n", - "3.42 0.46 \n", - "4.53 0.29 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "-0.28 0.38 \n", - "-0.28 0.38 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "-106.16 2.15 \n", - "-28.22 1.26 \n", - "-77.94 1.03 \n", - "-28.71 1.08 \n", - "-8.52 0.26 \n", - "-7.44 0.33 \n", - "-7.44 0.34 \n", - "17.54 7.26 \n", - "13.27 1.0 \n", - "4.01 0.73 \n", - "4.01 0.73 \n", - "9.58 7.18 \n", - "4.17 9.16 \n", - "10000000.0 10000000.0 \n", - "8.64 1.05 \n", - "3.57 0.74 \n", - "3.8 0.5 \n", - "3.81 0.5 \n", - "6.67 0.93 \n", - "-65.16 2.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.71 0.71 \n", - "-108.28 5.59 \n", - "-122.57 1.2 \n", - "-116.78 2.48 \n", - "-116.79 2.48 \n", - "-98.06 0.82 \n", - "-128.98 8.61 \n", - "-101.03 1.21 \n", - "-101.03 1.21 \n", - "-294.47 21.93 \n", - "-106.0 0.91 \n", - "-104.62 0.81 \n", - "-87.68 0.79 \n", - "10000000.0 10000000.0 \n", - "15.57 1.32 \n", - "15.57 1.32 \n", - "-5.56 0.33 \n", - "-5.56 0.33 \n", - "10000000.0 10000000.0 \n", - "-5.56 0.33 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "None 1.87 \n", - "None 1.87 \n", - "10000000.0 10000000.0 \n", - "None 1.54 \n", - "-2.53 0.68 \n", - "None 4.3 \n", - "None 4.3 \n", - "-5.89 0.73 \n", - "-0.13 0.6 \n", - "None 0.68 \n", - "-23.88 2.0 \n", - "15.54 0.35 \n", - "15.54 0.35 \n", - "-0.99 0.31 \n", - "-19.86 10.94 \n", - "-106.02 0.91 \n", - "-0.63 0.42 \n", - "-0.63 0.42 \n", - "None 8.53 \n", - "None 8.53 \n", - "10000000.0 10000000.0 \n", - "-2.3 9.28 \n", - "None 2.22 \n", - "None 1.87 \n", - "10000000.0 10000000.0 \n", - "None 2.22 \n", - "None 2.35 \n", - "None 9.8 \n", - "None 2.22 \n", - "-1.98 0.61 \n", - "None 9.8 \n", - "None 0.83 \n", - "None 0.83 \n", - "-0.63 0.42 \n", - "-3.02 0.72 \n", - "None 2.46 \n", - "None 2.46 \n", - "1.11 1.62 \n", - "4.38 0.71 \n", - "4.38 0.71 \n", - "-3.11 5.68 \n", - "-1.81 1.19 \n", - "-22.32 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 3.39 \n", - "-0.13 0.6 \n", - "None 10.18 \n", - "-1.04 0.46 \n", - "None 4.61 \n", - "-2.78 0.74 \n", - "None 4.61 \n", - "-0.52 0.47 \n", - "-2.78 0.74 \n", - "-13.3 1.07 \n", - "None 1.26 \n", - "-3.35 0.3 \n", - "1.0 0.47 \n", - "-13.3 1.07 \n", - "1.0 0.47 \n", - "1.0 0.47 \n", - "-13.3 1.07 \n", - "2.58 0.41 \n", - "None 10.27 \n", - "-3.37 0.44 \n", - "None 1.4 \n", - "1.0 0.47 \n", - "-14.34 2.93 \n", - "None 2.64 \n", - "None 5.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.22 0.33 \n", - "None 5.06 \n", - "-14.27 0.34 \n", - "None 3.03 \n", - "-5.17 0.34 \n", - "None 10.27 \n", - "-106.51 13.35 \n", - "-0.8 1.14 \n", - "None 10.27 \n", - "-14.27 0.34 \n", - "None 10.27 \n", - "-1.13 0.78 \n", - "None 1.41 \n", - "None 0.81 \n", - "None 0.81 \n", - "5.01 0.41 \n", - "5.01 0.41 \n", - "None 1.41 \n", - "-7.79 0.66 \n", - "15.54 0.35 \n", - "11.86 1.31 \n", - "-17.48 0.57 \n", - "10000000.0 10000000.0 \n", - "-5.67 0.33 \n", - "2.82 1.78 \n", - "10000000.0 10000000.0 \n", - "2.82 1.78 \n", - "2.82 1.78 \n", - "-3.87 1.24 \n", - "-13.8 0.7 \n", - "-5.42 0.49 \n", - "None 2.08 \n", - "-3.87 1.24 \n", - "-13.8 0.7 \n", - "-3.87 1.24 \n", - "-3.44 0.61 \n", - "None 2.08 \n", - "0.67 0.33 \n", - "-5.42 0.49 \n", - "-105.98 0.91 \n", - "-6.02 0.56 \n", - "-105.98 0.91 \n", - "-6.02 0.56 \n", - "3.02 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.2 1.07 \n", - "-13.2 1.07 \n", - "-5.47 0.75 \n", - "-3.7 0.19 \n", - "None 0.64 \n", - "None 2.16 \n", - "-8.2 3.63 \n", - "10000000.0 10000000.0 \n", - "-8.2 3.63 \n", - "-12.08 0.38 \n", - "0.33 0.13 \n", - "10000000.0 10000000.0 \n", - "-8.2 3.63 \n", - "-2.25 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.3 9.21 \n", - "10000000.0 10000000.0 \n", - "-2.25 0.71 \n", - "None 2.25 \n", - "0.26 5.09 \n", - "None 3.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.67 0.33 \n", - "-10.53 1.07 \n", - "None 3.78 \n", - "1.52 0.35 \n", - "10000000.0 10000000.0 \n", - "-1.2 0.77 \n", - "2.1 0.72 \n", - "2.1 0.72 \n", - "None 2.16 \n", - "None 2.16 \n", - "-5.77 1.2 \n", - "-0.64 0.29 \n", - "-34.51 1.02 \n", - "4.75 0.65 \n", - "-0.64 0.29 \n", - "10000000.0 10000000.0 \n", - "-2.28 3.9 \n", - "4.75 0.65 \n", - "10000000.0 10000000.0 \n", - "-2.28 3.9 \n", - "-13.45 5.25 \n", - "-0.64 0.29 \n", - "-0.64 0.29 \n", - "-1.2 0.77 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 9.74 \n", - "None 10.24 \n", - "-0.89 0.13 \n", - "-105.98 0.91 \n", - "-0.89 0.13 \n", - "-11.7 0.56 \n", - "-0.89 0.13 \n", - "-105.98 0.91 \n", - "-4.27 0.66 \n", - "None 10.24 \n", - "-0.89 0.13 \n", - "-4.27 0.66 \n", - "-8.47 0.58 \n", - "2.2 0.59 \n", - "10000000.0 10000000.0 \n", - "-2.59 0.43 \n", - "None 9.74 \n", - "3.02 0.36 \n", - "-11.7 0.56 \n", - "None 2.73 \n", - "-5.09 0.81 \n", - "-5.09 0.81 \n", - "-9.4 0.52 \n", - "None 4.88 \n", - "None 4.88 \n", - "10000000.0 10000000.0 \n", - "-14.38 0.55 \n", - "-14.38 0.55 \n", - "None 4.88 \n", - "10000000.0 10000000.0 \n", - "-0.83 1.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.69 0.67 \n", - "10000000.0 10000000.0 \n", - "-79.81 0.75 \n", - "-79.81 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.59 0.43 \n", - "None 0.99 \n", - "None 2.25 \n", - "None 1.44 \n", - "-1.16 0.59 \n", - "-7.24 0.89 \n", - "-17.94 1.79 \n", - "0.96 0.71 \n", - "None 2.67 \n", - "None 4.37 \n", - "-10.01 0.3 \n", - "-5.81 0.35 \n", - "0.96 0.71 \n", - "-10.01 0.3 \n", - "None 2.67 \n", - "None 4.37 \n", - "-2.25 0.46 \n", - "10000000.0 10000000.0 \n", - "None 4.67 \n", - "None 4.67 \n", - "-21.94 1.79 \n", - "6.53 4.99 \n", - "-10.01 0.3 \n", - "None 2.02 \n", - "-0.54 0.83 \n", - "-7.56 0.47 \n", - "-9.1 0.61 \n", - "2.51 0.5 \n", - "None 1.71 \n", - "-7.56 0.47 \n", - "-2.25 0.46 \n", - "-2.25 0.46 \n", - "10000000.0 10000000.0 \n", - "-21.19 1.04 \n", - "10000000.0 10000000.0 \n", - "-9.1 0.61 \n", - "-14.18 1.8 \n", - "0.28 0.38 \n", - "None 0.62 \n", - "None 2.14 \n", - "-14.18 1.8 \n", - "None 1.26 \n", - "None 1.26 \n", - "-3.35 0.3 \n", - "1.49 1.28 \n", - "10000000.0 10000000.0 \n", - "-10.17 0.38 \n", - "None 0.88 \n", - "1.49 1.28 \n", - "-4.44 0.24 \n", - "None 0.88 \n", - "10000000.0 10000000.0 \n", - "None 6.05 \n", - "None 6.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 3.75 \n", - "None 5.01 \n", - "10000000.0 10000000.0 \n", - "None 1.02 \n", - "None 5.01 \n", - "None 5.01 \n", - "-16.79 1.43 \n", - "None 5.01 \n", - "-37.03 1.52 \n", - "-37.03 1.52 \n", - "-14.18 1.8 \n", - "-1.98 0.61 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 7.33 \n", - "5.26 0.76 \n", - "-8.36 0.58 \n", - "5.26 0.76 \n", - "None 5.46 \n", - "-1.98 0.65 \n", - "None 2.18 \n", - "5.26 0.76 \n", - "None 2.18 \n", - "-130.79 1.14 \n", - "None 2.28 \n", - "2.03 0.39 \n", - "1.02 0.58 \n", - "-13.27 0.43 \n", - "10000000.0 10000000.0 \n", - "-1.26 0.5 \n", - "-7.33 1.11 \n", - "None 0.62 \n", - "-14.03 6.74 \n", - "10000000.0 10000000.0 \n", - "None 2.16 \n", - "None 5.2 \n", - "10000000.0 10000000.0 \n", - "-0.13 0.73 \n", - "10000000.0 10000000.0 \n", - "10.32 1.49 \n", - "None 2.06 \n", - "None 2.06 \n", - "10.32 1.49 \n", - "-3.35 0.56 \n", - "-48.81 2.02 \n", - "-10.46 4.94 \n", - "-48.81 2.02 \n", - "-2.66 0.8 \n", - "-2.66 0.8 \n", - "-38.53 0.36 \n", - "-38.53 0.36 \n", - "10.66 0.78 \n", - "10000000.0 10000000.0 \n", - "-11.7 0.56 \n", - "None 5.52 \n", - "-96.0 7.26 \n", - "-1.62 0.3 \n", - "None 2.38 \n", - "None 1.7 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-11.8 1.28 \n", - "-6.96 0.87 \n", - "-13.64 0.72 \n", - "None 0.93 \n", - "-6.96 0.87 \n", - "176.21 7.46 \n", - "-0.4 0.77 \n", - "-5.77 1.2 \n", - "-0.4 0.77 \n", - "-0.4 0.77 \n", - "None 4.04 \n", - "None 5.05 \n", - "-0.4 0.77 \n", - "None 0.41 \n", - "-1.72 8.08 \n", - "-5.41 0.78 \n", - "None 3.52 \n", - "None 1.19 \n", - "-5.25 7.68 \n", - "None 1.19 \n", - "None 0.41 \n", - "4.19 0.3 \n", - "-15.72 0.65 \n", - "None 3.18 \n", - "-3.99 0.64 \n", - "10000000.0 10000000.0 \n", - "-3.99 0.64 \n", - "10000000.0 10000000.0 \n", - "-3.99 0.64 \n", - "10000000.0 10000000.0 \n", - "None 4.85 \n", - "None 4.85 \n", - "10000000.0 10000000.0 \n", - "-126.88 4.94 \n", - "10000000.0 10000000.0 \n", - "-3.35 0.56 \n", - "None 5.23 \n", - "-6.58 0.54 \n", - "-34.51 1.03 \n", - "-6.58 0.54 \n", - "-6.58 0.54 \n", - "-0.21 0.17 \n", - "-6.58 0.54 \n", - "-6.58 0.54 \n", - "-0.21 0.17 \n", - "-8.6 0.11 \n", - "7.34 1.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.1 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 8.27 \n", - "0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.72 \n", - "None 3.04 \n", - "-22.87 1.22 \n", - "None 3.04 \n", - "-1.7 0.41 \n", - "None 3.04 \n", - "None 3.04 \n", - "-1.7 0.41 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "-9.59 4.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.51 0.44 \n", - "2.51 0.44 \n", - "-38.87 1.13 \n", - "2.51 0.44 \n", - "None 2.18 \n", - "-8.73 0.76 \n", - "9.12 1.25 \n", - "10000000.0 10000000.0 \n", - "-2.12 0.7 \n", - "10000000.0 10000000.0 \n", - "None 1.94 \n", - "10000000.0 10000000.0 \n", - "None 1.94 \n", - "None 2.26 \n", - "-7.55 4.94 \n", - "-8.44 0.86 \n", - "-8.44 0.86 \n", - "10000000.0 10000000.0 \n", - "-5.18 0.58 \n", - "None 0.47 \n", - "-2.62 0.35 \n", - "None 0.68 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.28 0.33 \n", - "-226.68 0.57 \n", - "-1.81 0.19 \n", - "-2.62 0.35 \n", - "None 0.41 \n", - "0.68 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 5.23 \n", - "0.68 0.41 \n", - "9.12 1.25 \n", - "None 2.14 \n", - "10000000.0 10000000.0 \n", - "None 5.23 \n", - "None 5.53 \n", - "None 2.14 \n", - "10000000.0 10000000.0 \n", - "None 5.53 \n", - "-2.62 0.35 \n", - "-10.37 0.91 \n", - "10000000.0 10000000.0 \n", - "-121.17 0.81 \n", - "10000000.0 10000000.0 \n", - "None 0.41 \n", - "None 1.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.01 0.19 \n", - "0.07 0.35 \n", - "0.38 0.45 \n", - "10000000.0 10000000.0 \n", - "0.07 0.35 \n", - "None 1.26 \n", - "None 1.26 \n", - "10000000.0 10000000.0 \n", - "-6.06 0.47 \n", - "-6.06 0.47 \n", - "-2.34 0.39 \n", - "None 0.92 \n", - "-6.06 0.47 \n", - "None 0.91 \n", - "-131.16 1.7 \n", - "-3.05 0.39 \n", - "None 4.44 \n", - "-131.16 1.7 \n", - "-3.46 0.05 \n", - "-3.05 0.39 \n", - "None 9.83 \n", - "-13.11 5.07 \n", - "10000000.0 10000000.0 \n", - "-3.64 0.43 \n", - "None 9.83 \n", - "10000000.0 10000000.0 \n", - "None 2.21 \n", - "10000000.0 10000000.0 \n", - "-0.32 0.47 \n", - "None 2.29 \n", - "None 7.09 \n", - "None None \n", - "2.32 0.59 \n", - "None 1.43 \n", - "None 0.31 \n", - "2.32 0.59 \n", - "None 1.87 \n", - "-5.89 8.15 \n", - "None 0.31 \n", - "-28.45 3.54 \n", - "-83.95 6.39 \n", - "None 0.62 \n", - "4.21 0.8 \n", - "4.21 0.8 \n", - "4.21 0.8 \n", - "None 0.4 \n", - "-8.6 0.26 \n", - "-8.6 0.26 \n", - "-3.45 0.69 \n", - "None 2.98 \n", - "7.29 1.13 \n", - "7.29 1.13 \n", - "10000000.0 10000000.0 \n", - "None 5.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 5.57 \n", - "None 5.57 \n", - "-1.14 0.86 \n", - "-4.52 1.9 \n", - "None 1.32 \n", - "7.46 0.13 \n", - "10000000.0 10000000.0 \n", - "-1.09 0.51 \n", - "-6.35 0.31 \n", - "None 1.97 \n", - "-1.09 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.16 1.22 \n", - "-7.56 0.81 \n", - "-117.23 1.16 \n", - "10000000.0 10000000.0 \n", - "-62.5 1.36 \n", - "None 2.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.8 0.55 \n", - "-15.82 1.75 \n", - "10000000.0 10000000.0 \n", - "None 0.41 \n", - "-8.44 0.34 \n", - "-14.03 6.29 \n", - "-8.15 0.78 \n", - "-10.56 0.71 \n", - "-1.96 0.4 \n", - "1.07 0.36 \n", - "-35.92 1.49 \n", - "3.77 0.45 \n", - "None 3.63 \n", - "1.07 0.36 \n", - "None 4.85 \n", - "None 5.02 \n", - "None 4.85 \n", - "None 3.63 \n", - "-6.06 0.47 \n", - "None 5.02 \n", - "-0.02 0.21 \n", - "10000000.0 10000000.0 \n", - "-5.19 0.46 \n", - "-62.5 1.36 \n", - "-117.23 1.16 \n", - "None 6.04 \n", - "None 6.04 \n", - "None 6.04 \n", - "None 6.04 \n", - "None 5.2 \n", - "None 9.74 \n", - "None 0.08 \n", - "-4.04 0.7 \n", - "None 6.04 \n", - "None 5.2 \n", - "None 6.04 \n", - "-10.46 4.93 \n", - "3.8 0.92 \n", - "-0.17 0.28 \n", - "-0.17 0.28 \n", - "-0.17 0.28 \n", - "-17.73 2.41 \n", - "-22.96 1.98 \n", - "None 1.99 \n", - "-10.01 0.3 \n", - "-2.67 0.69 \n", - "-2.67 0.69 \n", - "None 4.17 \n", - "-38.53 0.36 \n", - "-10.01 0.3 \n", - "-10.01 0.3 \n", - "10000000.0 10000000.0 \n", - "-38.53 0.36 \n", - "None 4.43 \n", - "None 4.43 \n", - "-34.59 6.27 \n", - "None 4.17 \n", - "None 1.13 \n", - "-11.96 0.72 \n", - "-34.59 6.27 \n", - "-4.36 5.7 \n", - "None 2.25 \n", - "3.8 0.92 \n", - "-7.21 0.31 \n", - "None 2.25 \n", - "-2.43 0.33 \n", - "-10.46 4.93 \n", - "-7.21 0.31 \n", - "-10.46 4.93 \n", - "None 5.11 \n", - "10000000.0 10000000.0 \n", - "-4.87 0.46 \n", - "-2.43 0.33 \n", - "-4.87 0.46 \n", - "-18.13 0.71 \n", - "-25.88 10.89 \n", - "-25.88 10.89 \n", - "None 5.11 \n", - "10000000.0 10000000.0 \n", - "None 4.19 \n", - "None 4.19 \n", - "-112.92 1.45 \n", - "-94.12 0.75 \n", - "None 0.71 \n", - "-4.87 0.46 \n", - "10000000.0 10000000.0 \n", - "-9.57 0.15 \n", - "1.02 0.71 \n", - "10000000.0 10000000.0 \n", - "None 5.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.13 0.18 \n", - "None 7.23 \n", - "-4.22 1.25 \n", - "-2.13 0.18 \n", - "4.3 0.87 \n", - "None 7.23 \n", - "-97.2 0.8 \n", - "None 7.23 \n", - "10000000.0 10000000.0 \n", - "None 1.8 \n", - "None 1.8 \n", - "10000000.0 10000000.0 \n", - "-0.5 1.4 \n", - "-0.5 1.4 \n", - "None 1.34 \n", - "1.07 0.37 \n", - "-2.81 0.3 \n", - "-2.81 0.3 \n", - "1.07 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.4 \n", - "None 1.16 \n", - "None 1.7 \n", - "6.38 0.36 \n", - "None 4.4 \n", - "-4.36 5.47 \n", - "-3.59 0.5 \n", - "None 5.6 \n", - "None 5.6 \n", - "-104.68 1.14 \n", - "-104.68 1.14 \n", - "-8.52 5.62 \n", - "-0.21 0.17 \n", - "-4.36 5.47 \n", - "-0.28 0.38 \n", - "None 5.6 \n", - "-4.36 5.47 \n", - "-0.28 0.38 \n", - "-3.73 0.33 \n", - "10000000.0 10000000.0 \n", - "-14.39 6.27 \n", - "0.08 0.43 \n", - "-0.21 0.17 \n", - "None 4.27 \n", - "2.9 0.34 \n", - "2.9 0.34 \n", - "2.9 0.34 \n", - "None 5.06 \n", - "-8.82 1.37 \n", - "None 5.56 \n", - "-5.54 1.2 \n", - "None 5.56 \n", - "10000000.0 10000000.0 \n", - "None 5.06 \n", - "0.13 0.25 \n", - "None 4.41 \n", - "-5.54 1.2 \n", - "None 4.41 \n", - "5.79 0.37 \n", - "None 9.81 \n", - "-6.74 4.71 \n", - "-48.81 2.02 \n", - "-5.81 0.93 \n", - "None 4.41 \n", - "-5.81 0.93 \n", - "None 5.2 \n", - "-0.67 0.87 \n", - "10000000.0 10000000.0 \n", - "-4.18 0.29 \n", - "-4.18 0.29 \n", - "None 1.75 \n", - "-9.15 0.34 \n", - "-9.67 0.61 \n", - "None 0.71 \n", - "None 9.12 \n", - "-9.15 0.34 \n", - "-7.19 0.32 \n", - "None 2.87 \n", - "-9.15 0.34 \n", - "None 2.87 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "-6.8 0.72 \n", - "None 0.99 \n", - "None 3.97 \n", - "-6.8 1.41 \n", - "-6.8 1.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-118.19 0.76 \n", - "-9.57 0.81 \n", - "0.37 3.29 \n", - "-9.57 0.81 \n", - "-9.57 0.81 \n", - "-3.95 0.77 \n", - "None 5.49 \n", - "None 0.47 \n", - "-15.4 3.68 \n", - "None 0.47 \n", - "-4.36 5.35 \n", - "None 4.3 \n", - "1.3 1.08 \n", - "1.3 1.08 \n", - "10000000.0 10000000.0 \n", - "-6.68 4.98 \n", - "None 5.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.14 0.18 \n", - "None 9.8 \n", - "None 2.5 \n", - "-6.8 1.41 \n", - "10000000.0 10000000.0 \n", - "None 2.5 \n", - "None None \n", - "None 5.11 \n", - "None 5.11 \n", - "None 4.65 \n", - "None 3.86 \n", - "None 4.65 \n", - "-8.63 0.26 \n", - "-8.63 0.26 \n", - "None 3.86 \n", - "-2.21 8.07 \n", - "None 0.62 \n", - "10000000.0 10000000.0 \n", - "None 1.16 \n", - "None 1.16 \n", - "None 1.16 \n", - "-5.92 0.59 \n", - "-0.99 0.34 \n", - "-2.04 0.28 \n", - "-0.02 0.55 \n", - "-19.97 1.38 \n", - "-0.02 0.55 \n", - "-0.02 0.55 \n", - "0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "None 6.01 \n", - "0.18 0.36 \n", - "None 6.01 \n", - "-62.8 4.2 \n", - "-2.51 1.09 \n", - "-62.8 4.2 \n", - "-62.8 4.2 \n", - "-62.8 4.2 \n", - "10000000.0 10000000.0 \n", - "-2.51 1.09 \n", - "-5.63 0.68 \n", - "-62.8 4.2 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.15 0.78 \n", - "-4.05 0.56 \n", - "-8.15 0.78 \n", - "5.95 0.29 \n", - "10000000.0 10000000.0 \n", - "4.17 0.75 \n", - "-18.13 0.71 \n", - "-2.59 0.75 \n", - "None 5.43 \n", - "None 5.43 \n", - "-18.13 0.71 \n", - "-20.06 0.5 \n", - "-6.02 0.56 \n", - "-18.13 0.71 \n", - "-4.23 0.8 \n", - "-6.02 0.56 \n", - "-1.7 0.83 \n", - "-0.64 1.05 \n", - "-3.38 0.48 \n", - "-4.23 0.8 \n", - "15.54 0.35 \n", - "-1.7 0.83 \n", - "-1.7 0.83 \n", - "None 1.23 \n", - "0.15 0.59 \n", - "None None \n", - "-0.99 0.31 \n", - "-2.43 0.33 \n", - "9.66 0.82 \n", - "None 3.97 \n", - "None 3.97 \n", - "None 0.82 \n", - "None 3.97 \n", - "4.17 0.75 \n", - "4.17 0.75 \n", - "4.17 0.75 \n", - "-0.4 0.71 \n", - "None None \n", - "0.38 1.18 \n", - "-8.23 1.28 \n", - "3.22 5.93 \n", - "-9.45 0.26 \n", - "None 2.79 \n", - "10000000.0 10000000.0 \n", - "-14.27 0.34 \n", - "10000000.0 10000000.0 \n", - "-14.27 0.34 \n", - "20.66 5.23 \n", - "None 0.71 \n", - "0.15 0.59 \n", - "-7.11 0.85 \n", - "10000000.0 10000000.0 \n", - "-7.11 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.17 \n", - "10000000.0 10000000.0 \n", - "None 1.17 \n", - "10000000.0 10000000.0 \n", - "None 1.17 \n", - "10000000.0 10000000.0 \n", - "None 1.17 \n", - "10000000.0 10000000.0 \n", - "-8.12 0.28 \n", - "None 1.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.54 0.22 \n", - "-104.73 0.94 \n", - "None 2.28 \n", - "None 1.94 \n", - "-20.24 1.89 \n", - "-20.24 1.89 \n", - "None 2.28 \n", - "None 7.59 \n", - "None 2.28 \n", - "None 7.59 \n", - "17.29 0.78 \n", - "None 7.59 \n", - "None 1.94 \n", - "-13.11 5.07 \n", - "-13.11 5.07 \n", - "-13.11 5.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 5.43 \n", - "-6.35 0.31 \n", - "None 2.12 \n", - "-8.12 0.28 \n", - "None 5.06 \n", - "None 2.21 \n", - "-8.12 0.28 \n", - "-11.68 0.56 \n", - "0.59 0.63 \n", - "None 2.21 \n", - "None 5.43 \n", - "-2.27 1.28 \n", - "None 2.12 \n", - "-11.68 0.56 \n", - "None 11.17 \n", - "None 5.08 \n", - "-11.68 0.56 \n", - "-14.55 1.34 \n", - "None 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.71 5.06 \n", - "-15.71 5.06 \n", - "10000000.0 10000000.0 \n", - "-15.71 5.06 \n", - "None 1.36 \n", - "None 1.58 \n", - "3.8 0.94 \n", - "None 1.58 \n", - "None 3.85 \n", - "6.11 0.38 \n", - "6.11 0.38 \n", - "None 9.64 \n", - "6.11 0.38 \n", - "-4.73 0.54 \n", - "None 4.67 \n", - "None 4.67 \n", - "-225.22 7.13 \n", - "0.67 0.33 \n", - "0.67 0.33 \n", - "None 5.91 \n", - "-53.52 9.09 \n", - "-8.88 3.08 \n", - "-53.52 9.09 \n", - "10000000.0 10000000.0 \n", - "None 2.91 \n", - "0.2 0.71 \n", - "10000000.0 10000000.0 \n", - "-8.82 9.8 \n", - "0.2 0.71 \n", - "-0.76 0.87 \n", - "10000000.0 10000000.0 \n", - "None 9.79 \n", - "10000000.0 10000000.0 \n", - "-104.62 1.45 \n", - "10000000.0 10000000.0 \n", - "-104.62 1.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 6.51 \n", - "-0.99 0.31 \n", - "10000000.0 10000000.0 \n", - "None 4.3 \n", - "10000000.0 10000000.0 \n", - "-9.8 9.66 \n", - "10000000.0 10000000.0 \n", - "-9.8 9.66 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 10.25 \n", - "10000000.0 10000000.0 \n", - "-6.93 0.23 \n", - "0.13 0.25 \n", - "None 2.08 \n", - "None 6.0 \n", - "10000000.0 10000000.0 \n", - "-41.16 1.36 \n", - "6.11 0.38 \n", - "6.11 0.38 \n", - "6.11 0.38 \n", - "None 6.0 \n", - "None 2.88 \n", - "None 0.71 \n", - "None 1.44 \n", - "-9.67 0.58 \n", - "None 0.71 \n", - "None 5.9 \n", - "-2.79 0.87 \n", - "-2.79 0.87 \n", - "7.13 0.34 \n", - "-2.18 9.81 \n", - "-0.27 0.56 \n", - "-3.34 0.67 \n", - "10000000.0 10000000.0 \n", - "-15.16 5.5 \n", - "-19.81 0.31 \n", - "None 2.18 \n", - "-3.24 0.3 \n", - "-4.56 0.5 \n", - "1.77 1.18 \n", - "2.93 0.34 \n", - "1.77 1.18 \n", - "10000000.0 10000000.0 \n", - "-77.79 0.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.36 0.55 \n", - "-15.13 0.33 \n", - "2.36 0.55 \n", - "None 0.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.43 1.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "18.13 0.71 \n", - "-30.37 4.49 \n", - "-219.07 1.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-55.53 3.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.08 5.88 \n", - "-6.23 0.45 \n", - "-1.5 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 6.12 \n", - "None 6.13 \n", - "0.36 0.55 \n", - "-2.61 8.18 \n", - "10000000.0 10000000.0 \n", - "-2.61 7.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.3 0.8 \n", - "-109.25 0.25 \n", - "1.05 2.03 \n", - "-4.64 1.64 \n", - "5.08 1.19 \n", - "-20.85 7.97 \n", - "-23.15 7.9 \n", - "-0.45 5.35 \n", - "-0.48 0.46 \n", - "-5.17 0.46 \n", - "-5.13 0.46 \n", - "-5.45 0.46 \n", - "-5.68 0.46 \n", - "29.34 9.52 \n", - "28.02 7.91 \n", - "0.48 6.55 \n", - "-10.46 5.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-343.34 7.1 \n", - "-50.15 2.78 \n", - "-33.35 2.77 \n", - "-6.24 0.59 \n", - "10000000.0 10000000.0 \n", - "-13.48 10.35 \n", - "-35.32 0.65 \n", - "122.3 0.56 \n", - "107.12 0.95 \n", - "3.37 1.69 \n", - "63.34 2.32 \n", - "-65.27 0.77 \n", - "15.73 0.73 \n", - "6.62 2.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "65.07 3.82 \n", - "80.28 3.81 \n", - "10.87 0.19 \n", - "10000000.0 10000000.0 \n", - "20.18 1.97 \n", - "12.65 2.26 \n", - "10000000.0 10000000.0 \n", - "43.26 0.51 \n", - "10000000.0 10000000.0 \n", - "1.47 0.13 \n", - "-97.11 1.26 \n", - "43.13 0.99 \n", - "23.32 0.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "112.39 2.43 \n", - "20.7 2.63 \n", - "2.37 2.63 \n", - "-4.36 5.63 \n", - "12.03 3.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "33.85 1.4 \n", - "-27.09 1.0 \n", - "-29.6 4.86 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-25.93 0.84 \n", - "22.62 3.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "62.85 0.4 \n", - "57.91 1.0 \n", - "10.96 0.19 \n", - "-10.46 5.07 \n", - "10.96 0.19 \n", - "-10.46 5.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.13 3.42 \n", - "104.76 1.52 \n", - "84.14 1.27 \n", - "15.95 1.3 \n", - "69.03 1.27 \n", - "48.63 3.76 \n", - "-51.86 1.69 \n", - "43.92 2.9 \n", - "263.23 3.94 \n", - "-43.99 10.0 \n", - "-212.5 2.77 \n", - "-63.79 4.07 \n", - "1.21 1.13 \n", - "-1.6 2.61 \n", - "-23.14 2.72 \n", - "0.89 1.04 \n", - "57.15 5.87 \n", - "-64.92 0.48 \n", - "49.24 0.53 \n", - "117.96 6.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "272.02 4.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-51.55 1.37 \n", - "60.41 4.23 \n", - "29.34 2.26 \n", - "-15.81 2.05 \n", - "10000000.0 10000000.0 \n", - "13.71 1.71 \n", - "-37.41 0.17 \n", - "6.95 12.41 \n", - "-12.43 12.7 \n", - "56.26 10.72 \n", - "101.24 2.15 \n", - "-5.26 0.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "22.6 2.64 \n", - "-18.98 2.28 \n", - "-0.09 0.43 \n", - "-1.5 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-86.99 1.14 \n", - "-8.38 0.6 \n", - "1.24 0.54 \n", - "1.24 0.54 \n", - "1.24 0.54 \n", - "10000000.0 10000000.0 \n", - "-0.78 0.68 \n", - "-217.65 13.23 \n", - "3.73 0.29 \n", - "-13.11 5.52 \n", - "-3.53 6.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-165.93 6.53 \n", - "-3.22 0.5 \n", - "-55.7 2.54 \n", - "-26.91 4.54 \n", - "-2.36 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.14 0.3 \n", - "10000000.0 10000000.0 \n", - "1.56 0.16 \n", - "10000000.0 10000000.0 \n", - "-6.8 0.8 \n", - "0.33 1.5 \n", - "-16.61 1.52 \n", - "-1.26 0.55 \n", - "-6.58 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.52 1.33 \n", - "-12.47 1.14 \n", - "-6.98 0.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-40.11 2.62 \n", - "10000000.0 10000000.0 \n", - "363.33 1.55 \n", - "-80.83 6.11 \n", - "-82.88 11.78 \n", - "-57.83 1.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-114.68 1.11 \n", - "-94.62 0.83 \n", - "-9.17 0.44 \n", - "-6.39 0.52 \n", - "10000000.0 10000000.0 \n", - "4.5 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-29.84 0.3 \n", - "-5.72 0.54 \n", - "None 1.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.66 0.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.78 0.35 \n", - "10.66 0.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "-2.61 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.08 0.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.84 0.24 \n", - "55.11 0.84 \n", - "10000000.0 10000000.0 \n", - "-6.06 0.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.82 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.33 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.94 1.6 \n", - "0.33 1.5 \n", - "None 2.8 \n", - "None 0.35 \n", - "None 0.35 \n", - "None 0.27 \n", - "None 2.18 \n", - "None 0.71 \n", - "None 0.54 \n", - "None 0.71 \n", - "None 0.49 \n", - "10000000.0 10000000.0 \n", - "None 1.32 \n", - "None 2.77 \n", - "None 1.26 \n", - "None 0.49 \n", - "None 0.79 \n", - "None 0.34 \n", - "None 2.79 \n", - "None 4.3 \n", - "None 0.59 \n", - "None 1.34 \n", - "None 1.12 \n", - "None 1.02 \n", - "None 1.26 \n", - "None 1.51 \n", - "None 1.75 \n", - "10000000.0 10000000.0 \n", - "None 1.99 \n", - "None 1.88 \n", - "None 0.44 \n", - "None 0.54 \n", - "None 1.54 \n", - "None 0.78 \n", - "None 1.8 \n", - "None 1.8 \n", - "None 2.43 \n", - "None 1.87 \n", - "None 1.56 \n", - "None 1.26 \n", - "None 1.47 \n", - "None 0.69 \n", - "None 0.48 \n", - "None 0.38 \n", - "None 1.05 \n", - "None 2.18 \n", - "None 1.26 \n", - "10000000.0 10000000.0 \n", - "None 1.4 \n", - "10000000.0 10000000.0 \n", - "None 1.53 \n", - "None 2.73 \n", - "None 4.23 \n", - "None 2.6 \n", - "None 3.8 \n", - "None 3.8 \n", - "None 2.55 \n", - "None 0.41 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 1.02 \n", - "None 1.26 \n", - "None 0.48 \n", - "None 0.27 \n", - "None 3.89 \n", - "None 1.95 \n", - "None 3.9 \n", - "None 2.77 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "None 1.26 \n", - "None 1.67 \n", - "None 1.16 \n", - "None 1.16 \n", - "None 2.21 \n", - "None 1.63 \n", - "None 0.48 \n", - "None 3.78 \n", - "None 1.16 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "None 0.58 \n", - "None 3.89 \n", - "None 0.44 \n", - "None 0.34 \n", - "10000000.0 10000000.0 \n", - "None 1.17 \n", - "None 0.71 \n", - "None 1.33 \n", - "None 1.48 \n", - "None 0.71 \n", - "None 0.81 \n", - "None 0.4 \n", - "None 0.58 \n", - "None 2.5 \n", - "None 2.23 \n", - "None 1.27 \n", - "None 2.69 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-126.86 1.09 \n", - "-45.76 3.05 \n", - "10000000.0 10000000.0 \n", - "-2.64 1.79 \n", - "-17.56 1.57 \n", - "None 0.71 \n", - "-3.61 0.3 \n", - "-11.36 1.12 \n", - "524.69 0.78 \n", - "None 0.76 \n", - "None 2.18 \n", - "None 0.58 \n", - "None 0.44 \n", - "10000000.0 10000000.0 \n", - "None 2.21 \n", - "None 0.42 \n", - "None 2.14 \n", - "None 1.33 \n", - "None 1.33 \n", - "None 0.62 \n", - "None 0.48 \n", - "None 1.16 \n", - "None 1.13 \n", - "None 1.16 \n", - "None 2.26 \n", - "None 1.09 \n", - "None 1.54 \n", - "None 1.85 \n", - "None 4.16 \n", - "None 2.18 \n", - "None 2.56 \n", - "None 1.19 \n", - "10000000.0 10000000.0 \n", - "None 1.05 \n", - "10000000.0 10000000.0 \n", - "None 0.76 \n", - "None 2.79 \n", - "None 5.03 \n", - "None 6.41 \n", - "None 1.26 \n", - "None 0.49 \n", - "None 1.13 \n", - "None 1.5 \n", - "None 0.51 \n", - "None 1.1 \n", - "None 1.5 \n", - "None 1.02 \n", - "None 0.59 \n", - "None 1.26 \n", - "None 1.12 \n", - "10000000.0 10000000.0 \n", - "None 0.38 \n", - "None 0.86 \n", - "None 0.74 \n", - "None 1.97 \n", - "None 0.44 \n", - "None 0.59 \n", - "10000000.0 10000000.0 \n", - "None 1.53 \n", - "None 0.34 \n", - "None 1.47 \n", - "None 1.48 \n", - "None 1.0 \n", - "None 0.69 \n", - "None 1.94 \n", - "None 2.14 \n", - "10000000.0 10000000.0 \n", - "None 2.31 \n", - "None 2.56 \n", - "None 0.76 \n", - "None 1.29 \n", - "10000000.0 10000000.0 \n", - "None 2.14 \n", - "None 1.4 \n", - "None 1.65 \n", - "None 0.38 \n", - "None 1.3 \n", - "None 1.4 \n", - "None 0.58 \n", - "None 1.26 \n", - "None 1.22 \n", - "None 0.64 \n", - "None 1.06 \n", - "10000000.0 10000000.0 \n", - "None 1.9 \n", - "None 3.76 \n", - "None 0.54 \n", - "None 2.22 \n", - "None 4.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.12 \n", - "10000000.0 10000000.0 \n", - "None 1.84 \n", - "None 2.8 \n", - "None 0.47 \n", - "None 0.48 \n", - "None 1.06 \n", - "None 4.51 \n", - "None 0.54 \n", - "10000000.0 10000000.0 \n", - "None 1.03 \n", - "None 0.99 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "None 2.09 \n", - "None 0.88 \n", - "None 6.01 \n", - "None 1.91 \n", - "10000000.0 10000000.0 \n", - "None 0.98 \n", - "None 1.13 \n", - "None 1.94 \n", - "None 1.02 \n", - "None 8.53 \n", - "None 1.12 \n", - "None 0.44 \n", - "None 2.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.88 0.86 \n", - "10000000.0 10000000.0 \n", - "0.28 0.55 \n", - "10000000.0 10000000.0 \n", - "-1.61 0.87 \n", - "10000000.0 10000000.0 \n", - "-1.33 1.14 \n", - "10000000.0 10000000.0 \n", - "-0.79 0.84 \n", - "2.18 0.76 \n", - "-1.32 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.06 1.13 \n", - "None 4.23 \n", - "None 3.8 \n", - "-9.51 0.93 \n", - "-14.2 4.93 \n", - "10000000.0 10000000.0 \n", - "None 3.89 \n", - "None 5.71 \n", - "10000000.0 10000000.0 \n", - "None 2.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.54 \n", - "None 1.54 \n", - "None 0.55 \n", - "0.07 0.43 \n", - "2.41 0.42 \n", - "-0.04 0.43 \n", - "0.16 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.26 \n", - "-8.38 0.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.81 5.26 \n", - "-3.52 7.6 \n", - "0.63 0.76 \n", - "-4.79 2.64 \n", - "-2.68 2.62 \n", - "-1.85 0.91 \n", - "-2.06 0.8 \n", - "10000000.0 10000000.0 \n", - "-108.63 1.19 \n", - "-48.25 0.88 \n", - "-6.24 1.52 \n", - "-84.75 1.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "12.87 0.74 \n", - "None 1.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.98 1.35 \n", - "10000000.0 10000000.0 \n", - "-71.92 4.37 \n", - "24.75 18.35 \n", - "-8.68 0.26 \n", - "-8.68 0.26 \n", - "None 1.05 \n", - "None 1.05 \n", - "None 1.8 \n", - "None 0.55 \n", - "None 1.26 \n", - "None 1.06 \n", - "None 1.24 \n", - "None 1.24 \n", - "None 2.96 \n", - "None 0.71 \n", - "None 1.85 \n", - "None 1.85 \n", - "None 1.87 \n", - "None 1.87 \n", - "None 1.92 \n", - "None 1.92 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "None 0.68 \n", - "None 0.68 \n", - "None 1.74 \n", - "None 1.74 \n", - "None 2.01 \n", - "None 1.74 \n", - "None 1.74 \n", - "None 1.16 \n", - "None 1.48 \n", - "10000000.0 10000000.0 \n", - "None 1.56 \n", - "None 1.56 \n", - "None 1.65 \n", - "None 1.65 \n", - "None 1.63 \n", - "None 1.64 \n", - "None 1.63 \n", - "None 1.64 \n", - "-6.81 4.51 \n", - "10000000.0 10000000.0 \n", - "-56.22 1.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 6.12 \n", - "-344.88 2.28 \n", - "15.32 7.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 13.55 \n", - "10000000.0 10000000.0 \n", - "None 9.81 \n", - "None 9.79 \n", - "10000000.0 10000000.0 \n", - "None 9.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.34 13.23 \n", - "10000000.0 10000000.0 \n", - "-109.5 7.95 \n", - "-19.42 8.4 \n", - "-33.48 7.06 \n", - "-2.68 0.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.87 1.5 \n", - "-434.13 2.69 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-98.48 11.53 \n", - "-95.25 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.26 0.13 \n", - "-15.26 0.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.36 0.98 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.03 0.53 \n", - "10000000.0 10000000.0 \n", - "2.54 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.21 0.77 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.42 0.32 \n", - "None 1.92 \n", - "None 2.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-108.02 3.07 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.12 1.32 \n", - "-4.31 0.75 \n", - "-14.44 10.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.63 0.39 \n", - "-16.31 1.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "-2.43 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 2.2 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.3 \n", - "-29.57 10.72 \n", - "10000000.0 10000000.0 \n", - "14.3 38.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.72 10.36 \n", - "10000000.0 10000000.0 \n", - "-6.42 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "13.27 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.95 0.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.15 9.21 \n", - "9.21 6.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.84 5.0 \n", - "10000000.0 10000000.0 \n", - "-3.44 0.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.64 0.68 \n", - "None 1.98 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.23 5.07 \n", - "-6.07 0.85 \n", - "10000000.0 10000000.0 \n", - "-3.88 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-206.92 1.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-39.44 1.6 \n", - "-0.52 0.41 \n", - "-66.24 1.66 \n", - "-11.13 5.39 \n", - "-4.05 6.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.73 6.2 \n", - "10000000.0 10000000.0 \n", - "-109.83 1.21 \n", - "10000000.0 10000000.0 \n", - "-27.02 3.12 \n", - "3.92 0.44 \n", - "-2.19 0.53 \n", - "10000000.0 10000000.0 \n", - "27.26 3.81 \n", - "-121.75 2.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-20.4 4.74 \n", - "7.8 1.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.05 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.67 0.69 \n", - "0.14 0.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.76 6.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 9.66 \n", - "10000000.0 10000000.0 \n", - "-11.99 3.5 \n", - "-0.46 1.61 \n", - "9.53 8.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.19 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 2.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "148.82 2.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-37.55 2.49 \n", - "10000000.0 10000000.0 \n", - "18.0 8.15 \n", - "-7.85 0.58 \n", - "-13.2 1.07 \n", - "-4.36 6.19 \n", - "10000000.0 10000000.0 \n", - "-0.78 0.68 \n", - "-5.03 1.27 \n", - "10000000.0 10000000.0 \n", - "-1.7 4.71 \n", - "8.37 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-36.91 2.95 \n", - "10000000.0 10000000.0 \n", - "7.45 7.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.71 0.17 \n", - "4.44 0.24 \n", - "-71.82 10.24 \n", - "291.38 0.21 \n", - "-107.66 1.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.51 1.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-52.23 2.13 \n", - "10000000.0 10000000.0 \n", - "9.59 5.93 \n", - "10000000.0 10000000.0 \n", - "3.21 5.18 \n", - "-1.66 3.21 \n", - "-2.03 0.43 \n", - "-8.44 7.97 \n", - "-23.48 1.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 6.46 \n", - "10000000.0 10000000.0 \n", - "-17.46 1.06 \n", - "10000000.0 10000000.0 \n", - "-0.17 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.45 0.11 \n", - "-119.81 1.18 \n", - "-4.44 0.24 \n", - "-71.82 10.22 \n", - "10000000.0 10000000.0 \n", - "-16.31 4.28 \n", - "10000000.0 10000000.0 \n", - "-5.44 1.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-119.84 2.64 \n", - "10000000.0 10000000.0 \n", - "6.36 6.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.67 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.32 1.01 \n", - "-20.23 2.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-91.65 4.71 \n", - "2.98 0.46 \n", - "-60.58 3.88 \n", - "10000000.0 10000000.0 \n", - "-8.88 3.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.3 0.62 \n", - "-3.99 0.33 \n", - "10000000.0 10000000.0 \n", - "-14.03 5.23 \n", - "10000000.0 10000000.0 \n", - "-4.73 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.74 0.66 \n", - "-0.18 0.36 \n", - "6.79 1.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.9 0.42 \n", - "14.28 6.29 \n", - "-6.76 0.57 \n", - "10000000.0 10000000.0 \n", - "-14.03 9.91 \n", - "-38.41 1.13 \n", - "-0.18 0.36 \n", - "-104.63 0.81 \n", - "10000000.0 10000000.0 \n", - "-3.75 1.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.42 1.89 \n", - "10000000.0 10000000.0 \n", - "None 5.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 7.58 \n", - "0.45 1.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.67 0.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.25 7.09 \n", - "3.51 0.38 \n", - "-0.09 0.72 \n", - "10000000.0 10000000.0 \n", - "-3.53 7.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 10.06 \n", - "4.7 0.66 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-78.51 1.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.78 0.69 \n", - "-5.53 0.33 \n", - "-37.02 1.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.68 0.26 \n", - "-17.46 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.03 0.74 \n", - "290.64 0.37 \n", - "-1.7 5.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.76 6.66 \n", - "10000000.0 10000000.0 \n", - "7.19 0.32 \n", - "-52.69 3.81 \n", - "-1.7 5.88 \n", - "9.53 8.91 \n", - "10000000.0 10000000.0 \n", - "-58.99 4.64 \n", - "10000000.0 10000000.0 \n", - "0.38 0.45 \n", - "None None \n", - "-69.82 6.33 \n", - "10000000.0 10000000.0 \n", - "-3.27 0.66 \n", - "-2.24 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 7.21 \n", - "-11.94 1.67 \n", - "-4.65 0.59 \n", - "10000000.0 10000000.0 \n", - "7.75 0.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.71 2.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.33 5.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.05 0.47 \n", - "10000000.0 10000000.0 \n", - "1.39 1.2 \n", - "-4.31 0.75 \n", - "-7.55 0.58 \n", - "10000000.0 10000000.0 \n", - "-8.67 0.83 \n", - "-0.74 0.53 \n", - "9.17 3.7 \n", - "10000000.0 10000000.0 \n", - "4.46 0.24 \n", - "-4.89 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.02 0.56 \n", - "-3.53 6.04 \n", - "-3.86 0.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.17 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "47.66 1.83 \n", - "2.06 0.59 \n", - "-0.06 0.78 \n", - "16.11 3.29 \n", - "-97.47 2.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-89.08 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-104.6 7.95 \n", - "-4.36 6.71 \n", - "-1.94 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 5.19 \n", - "4.57 3.97 \n", - "16.01 1.05 \n", - "10000000.0 10000000.0 \n", - "-3.62 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "170.38 0.93 \n", - "10000000.0 10000000.0 \n", - "-32.75 1.05 \n", - "-81.93 9.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.37 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.95 0.61 \n", - "10000000.0 10000000.0 \n", - "-6.71 0.69 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-183.51 2.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.96 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.18 \n", - "10000000.0 10000000.0 \n", - "-15.02 0.79 \n", - "None 2.32 \n", - "-3.8 5.42 \n", - "508.46 1.96 \n", - "1.19 0.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.1 3.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.01 0.82 \n", - "-0.01 0.72 \n", - "10000000.0 10000000.0 \n", - "-16.03 4.87 \n", - "None None \n", - "-20.81 4.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.69 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.56 0.91 \n", - "-21.47 1.95 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.77 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.0 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.27 0.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-96.54 1.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-73.98 7.84 \n", - "10000000.0 10000000.0 \n", - "-5.72 1.34 \n", - "10000000.0 10000000.0 \n", - "9.59 6.29 \n", - "-20.77 3.0 \n", - "10000000.0 10000000.0 \n", - "-0.5 10.11 \n", - "10000000.0 10000000.0 \n", - "-4.54 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-416.26 1.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-83.96 1.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.33 1.01 \n", - "10000000.0 10000000.0 \n", - "-3.59 0.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.73 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.34 4.93 \n", - "0.01 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-104.91 13.08 \n", - "-4.31 6.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.96 6.86 \n", - "-5.73 0.54 \n", - "10000000.0 10000000.0 \n", - "12.89 2.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.33 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.4 5.46 \n", - "10000000.0 10000000.0 \n", - "13.42 4.79 \n", - "-37.79 1.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.73 1.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.08 0.87 \n", - "-0.43 0.31 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.35 \n", - "-12.82 1.08 \n", - "0.44 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "1.74 1.88 \n", - "-5.98 0.49 \n", - "-4.36 6.37 \n", - "-0.58 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-25.6 4.46 \n", - "-6.02 0.56 \n", - "10000000.0 10000000.0 \n", - "-121.2 1.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.48 0.61 \n", - "10000000.0 10000000.0 \n", - "-9.72 2.11 \n", - "-4.85 0.66 \n", - "10000000.0 10000000.0 \n", - "None 14.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 10.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.04 0.42 \n", - "10000000.0 10000000.0 \n", - "3.24 0.82 \n", - "-0.42 0.31 \n", - "144.0 1.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "-1.3 0.62 \n", - "10000000.0 10000000.0 \n", - "-13.83 4.44 \n", - "4.89 0.24 \n", - "4.89 0.25 \n", - "-8.68 0.27 \n", - "10000000.0 10000000.0 \n", - "-16.03 4.87 \n", - "10000000.0 10000000.0 \n", - "-29.0 1.62 \n", - "-3.28 0.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.71 1.53 \n", - "5.22 6.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-27.76 3.44 \n", - "-9.06 0.26 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.45 \n", - "5.31 1.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.15 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.29 14.59 \n", - "10000000.0 10000000.0 \n", - "43.0 4.13 \n", - "-5.33 6.34 \n", - "-1.25 0.68 \n", - "4.44 0.24 \n", - "-12.51 9.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 11.73 \n", - "10000000.0 10000000.0 \n", - "0.67 0.33 \n", - "-96.99 1.25 \n", - "10000000.0 10000000.0 \n", - "-13.83 5.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.57 0.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-106.01 0.91 \n", - "6.47 1.0 \n", - "-1.82 0.72 \n", - "3.83 2.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.24 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.68 0.26 \n", - "2.4 2.8 \n", - "10.71 1.01 \n", - "196.31 16.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.5 11.5 \n", - "-0.49 0.41 \n", - "10000000.0 10000000.0 \n", - "-117.49 4.26 \n", - "10000000.0 10000000.0 \n", - "-11.99 3.5 \n", - "10000000.0 10000000.0 \n", - "3.49 2.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.88 0.56 \n", - "None 18.72 \n", - "-49.17 0.22 \n", - "-11.13 5.03 \n", - "-3.13 0.83 \n", - "10000000.0 10000000.0 \n", - "-0.36 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.11 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-103.08 1.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.88 0.86 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.97 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.16 1.44 \n", - "10000000.0 10000000.0 \n", - "-13.14 1.07 \n", - "10000000.0 10000000.0 \n", - "-3.11 6.88 \n", - "10000000.0 10000000.0 \n", - "-2.23 0.53 \n", - "10000000.0 10000000.0 \n", - "-3.83 0.39 \n", - "-96.89 7.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.46 1.32 \n", - "10000000.0 10000000.0 \n", - "-12.17 1.91 \n", - "9.94 0.79 \n", - "-6.17 0.81 \n", - "332.62 1.19 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.48 0.85 \n", - "10000000.0 10000000.0 \n", - "3.76 6.27 \n", - "10000000.0 10000000.0 \n", - "-2.67 4.78 \n", - "-13.03 2.14 \n", - "4.88 0.24 \n", - "10000000.0 10000000.0 \n", - "-8.35 5.48 \n", - "-1.83 1.4 \n", - "-21.52 3.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.13 5.99 \n", - "-6.97 1.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.88 0.24 \n", - "10000000.0 10000000.0 \n", - "-57.29 1.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "4.83 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-80.62 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-34.73 0.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.05 1.48 \n", - "-2.18 0.53 \n", - "-194.4 1.6 \n", - "10000000.0 10000000.0 \n", - "-118.19 0.76 \n", - "-194.4 1.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.99 1.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.79 0.88 \n", - "10000000.0 10000000.0 \n", - "None 0.82 \n", - "10000000.0 10000000.0 \n", - "40.2 11.93 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "-5.37 1.97 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.45 0.64 \n", - "-1.0 0.7 \n", - "-1.7 10.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.66 1.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.8 24.23 \n", - "-4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.5 0.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.7 0.8 \n", - "-1.7 13.32 \n", - "-3.04 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.51 8.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.34 4.81 \n", - "10000000.0 10000000.0 \n", - "-7.15 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 14.28 \n", - "-6.61 0.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.67 0.45 \n", - "10000000.0 10000000.0 \n", - "-3.38 0.51 \n", - "-5.75 6.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 4.61 \n", - "-4.36 5.65 \n", - "10000000.0 10000000.0 \n", - "-51.7 4.61 \n", - "10000000.0 10000000.0 \n", - "-17.15 0.62 \n", - "5.32 1.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.76 6.29 \n", - "1.82 0.72 \n", - "-20.64 5.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 8.77 \n", - "10000000.0 10000000.0 \n", - "-8.18 1.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.27 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-63.25 1.24 \n", - "-3.04 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.19 0.53 \n", - "None 1.0 \n", - "-8.98 3.75 \n", - "10000000.0 10000000.0 \n", - "-6.53 4.99 \n", - "-104.34 10.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.04 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "-27.02 3.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.39 1.03 \n", - "10000000.0 10000000.0 \n", - "-3.61 6.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.82 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2700.1 9.1 \n", - "-4.36 5.36 \n", - "10000000.0 10000000.0 \n", - "-2.03 0.43 \n", - "-0.13 None \n", - "-0.46 5.17 \n", - "-1.75 0.57 \n", - "-3.88 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.92 0.96 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "64.4 1.3 \n", - "10000000.0 10000000.0 \n", - "-100.02 1.53 \n", - "4.17 2.24 \n", - "-55.98 1.29 \n", - "-75.53 1.19 \n", - "-45.99 1.18 \n", - "-44.44 0.96 \n", - "-43.3 1.34 \n", - "-87.68 1.21 \n", - "-10.37 0.2 \n", - "-61.47 0.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "51.88 0.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-34.49 0.77 \n", - "10000000.0 10000000.0 \n", - "-2.17 0.97 \n", - "-82.17 2.13 \n", - "-82.17 2.13 \n", - "-72.24 1.55 \n", - "-14.93 1.42 \n", - "10000000.0 10000000.0 \n", - "-2.28 0.8 \n", - "-82.45 2.12 \n", - "-37.89 2.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.52 3.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.52 3.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-106.19 2.3 \n", - "-20.25 1.89 \n", - "-70.71 1.84 \n", - "10000000.0 10000000.0 \n", - "-9.56 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-20.64 9.81 \n", - "-165.71 14.37 \n", - "-23.57 11.5 \n", - "-7.99 8.82 \n", - "-62.83 8.9 \n", - "-8.82 8.98 \n", - "-6.86 0.6 \n", - "10000000.0 10000000.0 \n", - "30.24 6.16 \n", - "-40.72 0.31 \n", - "30.24 6.28 \n", - "-23.57 11.57 \n", - "-69.88 6.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-87.49 1.56 \n", - "-30.19 1.41 \n", - "10000000.0 10000000.0 \n", - "-2.28 0.8 \n", - "-2.28 0.8 \n", - "-87.49 1.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-30.19 1.41 \n", - "-13.0 6.55 \n", - "-93.88 2.47 \n", - "-1.4 2.11 \n", - "-30.19 1.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.2 0.13 \n", - "12.32 2.3 \n", - "10000000.0 10000000.0 \n", - "6.72 1.46 \n", - "10000000.0 10000000.0 \n", - "-14.27 0.33 \n", - "-5.91 0.96 \n", - "2.65 1.62 \n", - "-93.87 1.66 \n", - "-8.54 1.22 \n", - "-5.4 0.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.83 1.83 \n", - "-59.15 1.73 \n", - "-10.14 0.49 \n", - "-19.46 None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-126.88 4.94 \n", - "-36.25 1.41 \n", - "-72.5 2.82 \n", - "-126.88 4.94 \n", - "-90.63 3.53 \n", - "6.03 0.68 \n", - "-5.68 0.5 \n", - "0.02 0.52 \n", - "-6.2 0.45 \n", - "-6.34 0.45 \n", - "-6.21 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.41 1.4 \n", - "3.4 1.4 \n", - "-61.38 1.7 \n", - "-1.92 0.86 \n", - "-9.13 2.07 \n", - "-90.32 1.25 \n", - "-62.31 1.42 \n", - "-10.69 0.39 \n", - "-2.28 0.8 \n", - "-6.44 0.46 \n", - "2.8 0.67 \n", - "-0.1 0.42 \n", - "-0.38 0.45 \n", - "None None \n", - "-6.44 1.51 \n", - "-4.96 0.47 \n", - "-0.47 0.79 \n", - "-4.97 0.47 \n", - "10000000.0 10000000.0 \n", - "5.59 0.72 \n", - "9.96 0.97 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "11.84 3.12 \n", - "-15.02 3.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-31.89 7.2 \n", - "-101.99 1.16 \n", - "-59.89 5.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-96.99 4.36 \n", - "-3.21 5.18 \n", - "0.71 0.38 \n", - "-49.21 0.53 \n", - "-4.93 0.53 \n", - "-3.91 0.53 \n", - "56.83 0.8 \n", - "-32.0 1.07 \n", - "-25.58 1.37 \n", - "-32.71 6.13 \n", - "-0.84 0.86 \n", - "-97.02 1.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.51 5.86 \n", - "-6.93 5.8 \n", - "-30.03 2.42 \n", - "-48.62 5.64 \n", - "-17.98 6.89 \n", - "44.36 5.45 \n", - "7.08 1.09 \n", - "16.35 0.56 \n", - "56.83 0.8 \n", - "10000000.0 10000000.0 \n", - "-13.25 1.06 \n", - "-3.91 0.53 \n", - "-93.4 12.83 \n", - "10.82 0.19 \n", - "10000000.0 10000000.0 \n", - "-63.65 10.04 \n", - "-49.27 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "16.35 0.56 \n", - "16.35 0.56 \n", - "56.83 0.8 \n", - "-103.05 1.68 \n", - "3.91 3.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.08 1.34 \n", - "-8.88 2.64 \n", - "-4.35 0.59 \n", - "-7.76 1.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-103.68 7.31 \n", - "10000000.0 10000000.0 \n", - "9.19 3.93 \n", - "-0.28 0.37 \n", - "-103.68 7.3 \n", - "-83.06 1.82 \n", - "-17.58 0.93 \n", - "-17.58 0.93 \n", - "-103.68 7.3 \n", - "-11.02 5.36 \n", - "10000000.0 10000000.0 \n", - "-35.09 10.31 \n", - "-1.1 0.51 \n", - "-14.03 5.56 \n", - "-5.42 0.66 \n", - "-5.4 1.05 \n", - "-7.28 1.01 \n", - "10000000.0 10000000.0 \n", - "-189.98 12.73 \n", - "-97.2 0.8 \n", - "-104.34 8.85 \n", - "-90.27 9.84 \n", - "-90.27 9.19 \n", - "-90.27 9.19 \n", - "-5.31 7.18 \n", - "0.37 6.86 \n", - "8.04 4.9 \n", - "9.58 3.83 \n", - "9.58 3.83 \n", - "10.67 0.2 \n", - "10.7 0.2 \n", - "-71.06 9.71 \n", - "0.37 6.32 \n", - "-85.45 8.77 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-61.47 0.2 \n", - "-71.84 0.2 \n", - "-65.42 0.74 \n", - "-71.84 0.2 \n", - "-94.13 0.75 \n", - "-59.71 9.4 \n", - "0.37 5.32 \n", - "-14.03 9.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.95 0.46 \n", - "-8.12 0.28 \n", - "-10.37 0.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-93.67 1.62 \n", - "-94.13 0.75 \n", - "-94.13 0.75 \n", - "-94.13 0.75 \n", - "-10.37 0.2 \n", - "-10.37 0.2 \n", - "-61.86 0.2 \n", - "-61.86 0.2 \n", - "-61.86 0.2 \n", - "-95.07 0.74 \n", - "-94.13 0.75 \n", - "-94.13 0.75 \n", - "-94.13 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.48 0.85 \n", - "6.48 0.85 \n", - "6.48 0.85 \n", - "6.48 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-27.47 1.38 \n", - "0.89 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-121.63 13.08 \n", - "1.17 0.54 \n", - "1.17 0.54 \n", - "1.17 0.54 \n", - "5.22 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.56 1.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-23.05 1.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-101.85 2.55 \n", - "-86.3 6.23 \n", - "-104.6 7.94 \n", - "-94.39 12.23 \n", - "-94.39 12.28 \n", - "-102.35 1.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.96 0.63 \n", - "-43.91 1.77 \n", - "-34.5 4.44 \n", - "2.07 0.78 \n", - "-2.24 0.52 \n", - "-12.84 1.03 \n", - "-5.57 1.11 \n", - "-10.46 5.37 \n", - "-0.9 0.57 \n", - "6.66 1.06 \n", - "6.83 0.98 \n", - "6.59 0.98 \n", - "2.43 1.05 \n", - "2.78 0.41 \n", - "-2.84 0.54 \n", - "-8.8 0.77 \n", - "-2.66 0.8 \n", - "10000000.0 10000000.0 \n", - "48.81 2.02 \n", - "10000000.0 10000000.0 \n", - "-5.33 6.98 \n", - "4.83 0.46 \n", - "-4.18 0.32 \n", - "4.89 0.25 \n", - "-8.68 0.27 \n", - "-3.79 0.33 \n", - "-94.13 0.75 \n", - "0.77 0.79 \n", - "-0.99 0.92 \n", - "-0.68 0.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.22 0.27 \n", - "-72.69 8.54 \n", - "4.68 6.03 \n", - "-4.4 0.34 \n", - "-47.96 2.47 \n", - "-21.22 2.22 \n", - "-44.72 2.82 \n", - "3.8 0.5 \n", - "-16.82 1.56 \n", - "-73.98 0.94 \n", - "10000000.0 10000000.0 \n", - "-74.56 1.74 \n", - "-45.24 12.09 \n", - "-452.97 5.79 \n", - "-2.74 0.45 \n", - "-4.36 10.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-116.99 2.25 \n", - "-194.4 1.6 \n", - "-45.31 3.93 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "-109.79 0.86 \n", - "-189.98 12.77 \n", - "-90.63 6.26 \n", - "-83.95 6.36 \n", - "-15.4 3.63 \n", - "-90.63 6.54 \n", - "-83.95 6.64 \n", - "-15.4 4.09 \n", - "-116.04 1.19 \n", - "10000000.0 10000000.0 \n", - "-1.3 0.9 \n", - "-2.68 0.35 \n", - "10000000.0 10000000.0 \n", - "-11.31 1.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.28 0.82 \n", - "-4.71 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "-87.04 0.89 \n", - "-131.19 2.46 \n", - "-175.24 1.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-43.05 3.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-27.76 3.44 \n", - "-8.72 10.49 \n", - "-4.36 6.28 \n", - "-4.36 6.32 \n", - "10000000.0 10000000.0 \n", - "-46.16 2.48 \n", - "-57.55 3.98 \n", - "-60.52 3.78 \n", - "-7.15 0.85 \n", - "-46.99 1.58 \n", - "-46.99 1.58 \n", - "-40.69 3.32 \n", - "-4.92 0.43 \n", - "-36.19 1.56 \n", - "-58.76 2.61 \n", - "-28.06 1.57 \n", - "-50.98 2.52 \n", - "-25.34 3.31 \n", - "-61.65 3.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.61 \n", - "1.42 0.62 \n", - "1.83 0.5 \n", - "1.83 0.5 \n", - "-35.96 1.31 \n", - "-4.08 0.85 \n", - "-3.61 0.51 \n", - "-3.38 0.51 \n", - "10000000.0 10000000.0 \n", - "-22.2 1.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.91 1.09 \n", - "-14.03 6.32 \n", - "-5.81 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.46 0.54 \n", - "-3.91 1.48 \n", - "-2.46 0.54 \n", - "4.75 1.92 \n", - "-2.43 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "8.72 6.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.68 0.65 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.6 0.3 \n", - "-2.17 0.61 \n", - "-2.5 1.02 \n", - "-2.08 0.98 \n", - "2.08 0.7 \n", - "-1.52 0.4 \n", - "-14.03 4.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.64 1.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.42 \n", - "-13.08 15.1 \n", - "-2.31 0.63 \n", - "-40.99 5.86 \n", - "10000000.0 10000000.0 \n", - "-6.28 0.52 \n", - "-6.17 0.87 \n", - "-25.34 3.62 \n", - "10000000.0 10000000.0 \n", - "-39.25 1.74 \n", - "-39.25 1.74 \n", - "-39.25 1.74 \n", - "-95.39 10.03 \n", - "-76.89 10.42 \n", - "42.65 3.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.65 0.54 \n", - "5.63 1.0 \n", - "-7.02 0.87 \n", - "-15.9 0.82 \n", - "10000000.0 10000000.0 \n", - "3.71 2.4 \n", - "70.87 7.36 \n", - "97.54 10.2 \n", - "0.98 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.03 None \n", - "None None \n", - "-0.34 0.82 \n", - "-0.9 0.62 \n", - "-51.08 5.3 \n", - "-121.63 13.08 \n", - "-112.81 13.1 \n", - "-92.48 10.27 \n", - "-26.19 1.78 \n", - "-48.38 3.99 \n", - "-32.32 2.82 \n", - "10000000.0 10000000.0 \n", - "0.6 0.66 \n", - "-0.9 0.91 \n", - "10.66 0.78 \n", - "1.56 0.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.13 0.57 \n", - "-5.73 0.54 \n", - "-5.73 0.54 \n", - "-3.58 0.52 \n", - "10000000.0 10000000.0 \n", - "1.07 8.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 9.25 \n", - "-126.88 4.94 \n", - "10000000.0 10000000.0 \n", - "-4.16 0.51 \n", - "-2.08 0.98 \n", - "-2.08 0.98 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "13.11 0.65 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "124.21 13.22 \n", - "10.66 0.78 \n", - "10.66 0.78 \n", - "10.66 0.78 \n", - "-194.4 1.6 \n", - "-1.73 0.73 \n", - "1.3 2.68 \n", - "-1.7 0.83 \n", - "-3.88 0.56 \n", - "-3.83 0.39 \n", - "-0.4 0.68 \n", - "-0.78 0.68 \n", - "-0.78 0.68 \n", - "-18.59 13.93 \n", - "-36.23 10.13 \n", - "-37.41 0.17 \n", - "-11.23 11.46 \n", - "-11.23 13.0 \n", - "-4.51 0.33 \n", - "0.31 0.55 \n", - "-2.16 0.33 \n", - "-1.84 0.3 \n", - "-1.09 0.51 \n", - "None 11.37 \n", - "2.81 None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.58 0.52 \n", - "2.81 None \n", - "-87.62 0.79 \n", - "-8.68 0.26 \n", - "-109.01 2.4 \n", - "-116.31 2.29 \n", - "-91.16 1.33 \n", - "10000000.0 10000000.0 \n", - "-60.14 3.84 \n", - "-51.32 3.94 \n", - "0.38 0.45 \n", - "-4.36 5.78 \n", - "-4.36 5.66 \n", - "-13.19 4.67 \n", - "-2.66 0.8 \n", - "-3.92 0.44 \n", - "-0.06 0.35 \n", - "-76.61 4.54 \n", - "10000000.0 10000000.0 \n", - "-4.9 2.12 \n", - "-2.39 0.44 \n", - "-1.7 5.51 \n", - "-1.7 5.66 \n", - "3.45 2.4 \n", - "-15.62 0.83 \n", - "10000000.0 10000000.0 \n", - "-26.84 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-69.98 2.5 \n", - "-65.16 2.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "-109.79 0.86 \n", - "-207.0 1.57 \n", - "-108.63 1.2 \n", - "-76.98 6.59 \n", - "-9.8 7.99 \n", - "-23.57 10.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.83 0.58 \n", - "-7.85 0.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.24 0.59 \n", - "-7.15 0.85 \n", - "8.81 0.51 \n", - "-2.63 0.42 \n", - "-10.38 1.41 \n", - "-10.38 1.41 \n", - "-6.58 0.38 \n", - "10000000.0 10000000.0 \n", - "-10.6 6.01 \n", - "31.8 7.26 \n", - "-82.42 8.99 \n", - "-8.61 7.11 \n", - "-5.59 0.48 \n", - "-14.5 0.44 \n", - "-5.86 0.43 \n", - "-12.96 4.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.37 0.2 \n", - "-2.6 0.56 \n", - "0.53 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.12 0.75 \n", - "-104.34 13.18 \n", - "10000000.0 10000000.0 \n", - "-94.13 0.75 \n", - "-104.63 0.81 \n", - "-118.19 0.76 \n", - "-316.94 2.26 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "-4.36 5.71 \n", - "-4.36 5.76 \n", - "-8.72 10.16 \n", - "-5.86 0.43 \n", - "-61.65 4.06 \n", - "-8.88 4.33 \n", - "-7.49 1.31 \n", - "-6.71 0.31 \n", - "-9.31 8.63 \n", - "10000000.0 10000000.0 \n", - "-18.84 7.48 \n", - "-11.2 0.52 \n", - "10000000.0 10000000.0 \n", - "3.56 10.09 \n", - "-52.55 3.91 \n", - "-28.34 2.97 \n", - "-43.05 3.68 \n", - "10000000.0 10000000.0 \n", - "-52.55 3.91 \n", - "10000000.0 10000000.0 \n", - "-27.76 3.44 \n", - "-35.58 2.64 \n", - "-50.05 1.65 \n", - "-64.27 3.09 \n", - "-58.99 4.64 \n", - "-44.58 2.57 \n", - "-51.7 2.63 \n", - "-6.77 0.68 \n", - "10000000.0 10000000.0 \n", - "-41.93 4.06 \n", - "-41.93 4.06 \n", - "10000000.0 10000000.0 \n", - "-3.7 0.46 \n", - "-14.84 1.99 \n", - "-116.6 12.88 \n", - "-95.39 10.03 \n", - "-44.02 5.49 \n", - "-121.63 13.08 \n", - "-143.27 15.93 \n", - "10000000.0 10000000.0 \n", - "-97.0 7.45 \n", - "-29.37 1.75 \n", - "-96.33 7.51 \n", - "-112.81 13.1 \n", - "-95.39 10.03 \n", - "-94.96 10.1 \n", - "-29.12 3.6 \n", - "-187.6 0.76 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "-94.12 0.75 \n", - "-94.12 0.75 \n", - "-104.62 0.81 \n", - "-198.75 1.53 \n", - "-198.75 1.53 \n", - "-198.75 1.53 \n", - "4.89 0.25 \n", - "4.89 0.25 \n", - "4.89 0.25 \n", - "4.89 0.25 \n", - "10000000.0 10000000.0 \n", - "21.79 0.51 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "-56.95 4.65 \n", - "-57.29 4.63 \n", - "10000000.0 10000000.0 \n", - "-19.2 5.32 \n", - "-19.76 5.12 \n", - "2.46 0.53 \n", - "2.86 0.44 \n", - "2.86 0.44 \n", - "2.59 0.57 \n", - "2.87 0.44 \n", - "2.46 0.53 \n", - "2.86 0.44 \n", - "2.86 0.44 \n", - "10000000.0 10000000.0 \n", - "-0.7 0.7 \n", - "-0.7 0.7 \n", - "-0.66 0.33 \n", - "-3.0 0.7 \n", - "-2.04 1.57 \n", - "1.49 1.65 \n", - "-2.04 1.57 \n", - "1.49 1.65 \n", - "-0.61 0.4 \n", - "None None \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "0.4 0.21 \n", - "-0.28 0.37 \n", - "-0.28 0.37 \n", - "-3.15 0.75 \n", - "10000000.0 10000000.0 \n", - "0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "-6.77 0.68 \n", - "-33.35 2.77 \n", - "10000000.0 10000000.0 \n", - "-16.29 4.42 \n", - "-16.29 4.42 \n", - "-37.17 1.61 \n", - "-50.05 1.65 \n", - "-50.05 1.65 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-66.5 6.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-39.25 1.74 \n", - "-24.4 2.95 \n", - "-7.07 7.42 \n", - "None None \n", - "-13.32 1.05 \n", - "-28.26 6.33 \n", - "33.7 1.0 \n", - "-4.2 1.33 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "-0.28 0.37 \n", - "0.74 7.13 \n", - "8.9 0.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "16.6 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.45 1.21 \n", - "-5.39 0.93 \n", - "-3.93 1.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.63 4.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.88 1.41 \n", - "3.72 0.43 \n", - "10000000.0 10000000.0 \n", - "3.57 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.96 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.48 0.43 \n", - "0.48 0.43 \n", - "0.48 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-114.39 1.15 \n", - "-104.86 1.27 \n", - "10000000.0 10000000.0 \n", - "-114.39 1.15 \n", - "-28.01 1.11 \n", - "-6.06 7.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.1 0.69 \n", - "-5.1 0.69 \n", - "10000000.0 10000000.0 \n", - "-15.82 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.98 1.01 \n", - "-94.13 0.75 \n", - "-104.63 0.81 \n", - "-118.19 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.73 2.41 \n", - "-17.73 2.41 \n", - "-3.53 5.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.28 0.52 \n", - "-5.33 5.03 \n", - "10000000.0 10000000.0 \n", - "1.4 1.03 \n", - "1.4 1.03 \n", - "-5.33 4.97 \n", - "-5.33 4.97 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.59 0.56 \n", - "-3.38 1.0 \n", - "-13.21 1.07 \n", - "10000000.0 10000000.0 \n", - "0.18 0.36 \n", - "-0.02 0.26 \n", - "-2.39 0.75 \n", - "-12.79 4.51 \n", - "-16.73 10.87 \n", - "-120.27 1.5 \n", - "-7.1 0.31 \n", - "10000000.0 10000000.0 \n", - "14.83 1.53 \n", - "-2.84 0.54 \n", - "9.19 3.93 \n", - "10000000.0 10000000.0 \n", - "-3.3 0.32 \n", - "-2.6 0.3 \n", - "-3.35 0.3 \n", - "0.94 0.31 \n", - "-5.28 0.33 \n", - "-6.83 0.33 \n", - "-3.59 0.11 \n", - "-4.22 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-114.16 1.07 \n", - "-201.94 0.9 \n", - "6.53 0.88 \n", - "-10.8 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.06 7.25 \n", - "4.57 0.33 \n", - "-97.2 0.8 \n", - "-85.38 7.42 \n", - "-5.33 6.16 \n", - "-0.34 0.55 \n", - "9.11 0.92 \n", - "-52.6 1.06 \n", - "0.28 0.89 \n", - "50.23 1.04 \n", - "-5.48 0.59 \n", - "6.49 1.15 \n", - "-43.82 2.13 \n", - "3.81 0.88 \n", - "-21.4 4.1 \n", - "-24.65 5.4 \n", - "-5.59 8.16 \n", - "-5.59 8.16 \n", - "-24.04 5.51 \n", - "-0.12 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-22.93 1.05 \n", - "-19.56 1.68 \n", - "-21.33 1.47 \n", - "0.18 0.36 \n", - "-8.84 0.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-24.65 5.4 \n", - "-5.59 8.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.5 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "57.15 4.95 \n", - "23.32 0.94 \n", - "57.15 4.95 \n", - "23.32 0.94 \n", - "279.62 4.08 \n", - "110.74 2.59 \n", - "87.43 2.46 \n", - "143.71 3.08 \n", - "-18.1 2.41 \n", - "-49.26 0.53 \n", - "-1.36 0.59 \n", - "-12.31 0.75 \n", - "-37.41 0.17 \n", - "10000000.0 10000000.0 \n", - "-3.87 0.56 \n", - "-16.89 1.41 \n", - "-12.45 4.37 \n", - "-12.45 4.37 \n", - "-0.28 0.37 \n", - "-97.2 0.8 \n", - "-36.19 1.56 \n", - "4.51 0.45 \n", - "10000000.0 10000000.0 \n", - "-110.63 1.48 \n", - "-18.76 1.3 \n", - "-0.28 0.38 \n", - "-0.24 0.54 \n", - "6.62 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-38.87 1.13 \n", - "-84.12 14.62 \n", - "-120.14 4.77 \n", - "0.35 0.41 \n", - "43.9 2.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-40.99 5.86 \n", - "-40.99 5.86 \n", - "-54.24 5.78 \n", - "-54.24 5.78 \n", - "-28.5 6.21 \n", - "-45.42 5.88 \n", - "-81.88 7.0 \n", - "1.24 0.54 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "-0.09 0.55 \n", - "1.24 0.54 \n", - "-22.74 4.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-316.76 14.16 \n", - "-279.31 14.17 \n", - "95.41 1.42 \n", - "402.7 3.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-37.41 0.17 \n", - "-37.41 0.17 \n", - "-37.41 0.17 \n", - "-10.37 0.2 \n", - "-10.37 0.2 \n", - "-10.37 0.2 \n", - "-61.47 0.2 \n", - "-61.47 0.2 \n", - "-61.47 0.2 \n", - "10000000.0 10000000.0 \n", - "-8.68 0.26 \n", - "-0.34 0.34 \n", - "-2.62 0.35 \n", - "12.31 0.75 \n", - "8.76 1.96 \n", - "15.25 0.71 \n", - "-15.54 0.35 \n", - "-15.54 0.35 \n", - "-15.54 0.35 \n", - "-15.54 0.35 \n", - "-15.54 0.35 \n", - "-15.54 0.35 \n", - "None None \n", - "None None \n", - "-15.54 0.35 \n", - "-15.54 0.35 \n", - "-15.54 0.35 \n", - "-15.54 0.35 \n", - "-26.34 1.67 \n", - "-26.34 1.67 \n", - "-26.34 1.67 \n", - "-26.34 1.67 \n", - "-48.09 0.98 \n", - "-46.62 0.99 \n", - "-48.09 0.98 \n", - "-46.62 0.99 \n", - "-10.82 0.19 \n", - "-10.82 0.19 \n", - "-0.34 0.34 \n", - "-386.17 1.91 \n", - "-103.68 7.31 \n", - "-15.54 0.35 \n", - "-100.63 1.78 \n", - "10000000.0 10000000.0 \n", - "-15.54 0.35 \n", - "10000000.0 10000000.0 \n", - "-8.68 0.26 \n", - "-8.68 0.26 \n", - "206.94 6.73 \n", - "206.94 6.73 \n", - "-1.6 5.24 \n", - "-1.6 5.24 \n", - "3.76 8.01 \n", - "-5.25 7.14 \n", - "-5.75 5.05 \n", - "26.05 1.39 \n", - "-10.8 0.8 \n", - "12.19 0.77 \n", - "12.19 0.77 \n", - "389.3 1.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.9 0.8 \n", - "0.88 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.28 \n", - "None None \n", - "0.28 0.38 \n", - "-20.33 6.2 \n", - "10000000.0 10000000.0 \n", - "-3.7 0.46 \n", - "15.54 0.35 \n", - "-23.57 10.59 \n", - "None None \n", - "16.14 0.35 \n", - "43.14 4.13 \n", - "555.27 3.14 \n", - "40.48 0.31 \n", - "10000000.0 10000000.0 \n", - "-126.88 4.94 \n", - "181.04 7.8 \n", - "-141.91 0.81 \n", - "-4.85 0.53 \n", - "-6.05 0.57 \n", - "10000000.0 10000000.0 \n", - "85.14 7.08 \n", - "10000000.0 10000000.0 \n", - "-3.91 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1107.52 4.1 \n", - "1117.05 4.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-95.07 0.74 \n", - "-98.05 0.82 \n", - "-98.05 0.82 \n", - "10000000.0 10000000.0 \n", - "-120.3 13.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-121.63 13.08 \n", - "10000000.0 10000000.0 \n", - "-122.3 13.03 \n", - "0.28 0.38 \n", - "0.28 0.38 \n", - "0.28 0.38 \n", - "0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.91 0.53 \n", - "-3.91 0.53 \n", - "-3.91 0.53 \n", - "-3.91 0.53 \n", - "-3.91 0.53 \n", - "-3.91 0.53 \n", - "-3.91 0.53 \n", - "-3.91 0.53 \n", - "-3.91 0.53 \n", - "-3.91 0.53 \n", - "-3.91 0.53 \n", - "-3.91 0.53 \n", - "-3.91 0.53 \n", - "-3.91 0.53 \n", - "-3.91 0.53 \n", - "-3.91 0.53 \n", - "2.63 0.42 \n", - "-81.81 0.81 \n", - "None None \n", - "-12.8 0.49 \n", - "-22.33 1.11 \n", - "-1.17 1.12 \n", - "-1.99 0.55 \n", - "9.52 13.13 \n", - "-49.54 3.37 \n", - "-49.47 3.37 \n", - "-2.62 0.35 \n", - "1.06 0.52 \n", - "10000000.0 10000000.0 \n", - "-4.06 0.3 \n", - "-4.06 0.3 \n", - "10000000.0 10000000.0 \n", - "-50.31 3.85 \n", - "10000000.0 10000000.0 \n", - "-95.07 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.35 0.75 \n", - "1.25 0.7 \n", - "-12.31 0.36 \n", - "-12.31 0.36 \n", - "-6.11 2.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.61 7.21 \n", - "-120.41 4.05 \n", - "-122.57 1.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "31.19 0.99 \n", - "31.04 0.99 \n", - "-77.75 2.24 \n", - "-77.9 2.24 \n", - "23.38 0.94 \n", - "16.52 2.22 \n", - "-11.66 2.02 \n", - "-121.99 3.96 \n", - "-12.27 3.31 \n", - "-14.12 3.34 \n", - "-14.12 3.2 \n", - "-25.01 3.26 \n", - "-23.32 1.22 \n", - "-77.06 12.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-106.01 0.91 \n", - "-105.98 0.91 \n", - "-0.68 6.96 \n", - "-0.68 7.07 \n", - "-4.36 5.92 \n", - "36.55 4.25 \n", - "82.93 4.36 \n", - "422.3 2.1 \n", - "2.91 0.34 \n", - "-4.89 0.25 \n", - "-4.88 0.25 \n", - "-104.73 0.94 \n", - "-107.2 0.94 \n", - "-4.36 5.17 \n", - "-4.36 5.17 \n", - "-4.36 5.35 \n", - "-4.36 5.35 \n", - "-4.36 7.34 \n", - "-49.24 0.53 \n", - "-49.25 0.53 \n", - "-49.25 0.53 \n", - "-49.25 0.53 \n", - "-2.66 0.35 \n", - "-49.28 0.53 \n", - "70.95 0.52 \n", - "435.71 1.23 \n", - "-210.88 0.26 \n", - "-0.3 0.17 \n", - "-10.82 2.5 \n", - "12.01 1.82 \n", - "-7.4 1.23 \n", - "-11.45 0.74 \n", - "-0.32 0.56 \n", - "-13.29 1.2 \n", - "-36.96 5.05 \n", - "-39.48 4.94 \n", - "-40.21 5.13 \n", - "-63.18 5.47 \n", - "2.1 4.19 \n", - "-27.14 1.78 \n", - "-26.91 1.75 \n", - "-16.57 1.1 \n", - "-16.57 1.1 \n", - "-105.99 0.91 \n", - "-105.98 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.41 0.38 \n", - "-30.21 2.27 \n", - "-12.13 0.98 \n", - "-3.09 6.99 \n", - "-12.31 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "-83.06 1.82 \n", - "-96.39 0.82 \n", - "1092.32 3.83 \n", - "2.17 0.68 \n", - "-20.33 6.2 \n", - "None None \n", - "0.46 0.38 \n", - "15.72 0.35 \n", - "7.8 0.36 \n", - "-111.26 1.46 \n", - "0.2 0.74 \n", - "1.43 0.16 \n", - "10000000.0 10000000.0 \n", - "-28.4 5.42 \n", - "23.38 0.94 \n", - "-37.48 0.17 \n", - "-37.49 0.17 \n", - "23.39 0.94 \n", - "-54.55 5.03 \n", - "-30.78 5.84 \n", - "-129.47 6.05 \n", - "-98.69 5.94 \n", - "-3.91 0.53 \n", - "10000000.0 10000000.0 \n", - "-66.37 2.34 \n", - "10000000.0 10000000.0 \n", - "-126.25 8.14 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.81 \n", - "-1.7 10.48 \n", - "-3.91 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "42.45 5.48 \n", - "14.39 5.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "15.97 0.35 \n", - "-36.38 4.32 \n", - "-5.33 6.58 \n", - "-3.21 5.18 \n", - "15.97 0.35 \n", - "-49.27 0.53 \n", - "-4.86 0.53 \n", - "-35.43 0.45 \n", - "-3.51 0.79 \n", - "23.35 0.94 \n", - "-38.35 0.11 \n", - "-10.84 0.19 \n", - "-37.41 0.17 \n", - "-38.35 0.11 \n", - "-10.84 0.19 \n", - "23.36 0.94 \n", - "10.84 0.19 \n", - "-16.49 3.73 \n", - "-3.33 3.75 \n", - "-223.01 6.26 \n", - "-47.68 4.79 \n", - "-41.76 7.45 \n", - "-9.6 7.21 \n", - "23.85 0.94 \n", - "23.31 0.94 \n", - "35.88 0.45 \n", - "-90.92 2.82 \n", - "45.06 5.93 \n", - "30.93 7.15 \n", - "26.68 7.07 \n", - "-186.08 9.56 \n", - "36.06 0.45 \n", - "-2.31 0.8 \n", - "-2.5 0.8 \n", - "-55.04 2.87 \n", - "35.88 0.45 \n", - "-116.98 7.96 \n", - "-4.36 7.79 \n", - "10000000.0 10000000.0 \n", - "-3.91 0.53 \n", - "-3.91 0.53 \n", - "-19.01 4.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.55 2.21 \n", - "-55.79 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.72 0.54 \n", - "-0.75 0.86 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.38 1.37 \n", - "10000000.0 10000000.0 \n", - "0.29 0.38 \n", - "-12.8 0.49 \n", - "-12.8 0.49 \n", - "10000000.0 10000000.0 \n", - "-20.8 3.0 \n", - "60.43 2.66 \n", - "-22.19 1.11 \n", - "-5.62 2.59 \n", - "14.74 2.26 \n", - "71.74 0.83 \n", - "3.13 0.97 \n", - "10000000.0 10000000.0 \n", - "-20.33 6.33 \n", - "-32.21 1.4 \n", - "-106.52 1.03 \n", - "-116.52 1.03 \n", - "67.81 0.22 \n", - "-60.95 0.2 \n", - "10000000.0 10000000.0 \n", - "-12.12 14.06 \n", - "-7.84 0.81 \n", - "-13.15 1.06 \n", - "-4.36 6.61 \n", - "2.23 4.69 \n", - "4.21 2.4 \n", - "-4.36 6.62 \n", - "0.53 0.8 \n", - "-25.6 5.78 \n", - "-25.6 7.45 \n", - "189.69 2.44 \n", - "-49.25 0.53 \n", - "-47.77 1.07 \n", - "-88.3 1.92 \n", - "-86.82 2.07 \n", - "-14.12 1.64 \n", - "-14.12 1.64 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "-62.49 1.36 \n", - "-11.63 0.68 \n", - "-42.01 1.24 \n", - "-42.01 1.24 \n", - "10000000.0 10000000.0 \n", - "-11.91 3.41 \n", - "-3.53 5.93 \n", - "-13.39 1.07 \n", - "-0.91 0.53 \n", - "-1.88 0.58 \n", - "-88.73 1.37 \n", - "-0.71 0.53 \n", - "1.03 0.55 \n", - "-7.86 2.14 \n", - "-5.97 0.42 \n", - "-13.09 1.07 \n", - "-3.88 0.56 \n", - "-3.88 0.56 \n", - "-2.19 0.53 \n", - "-3.14 6.09 \n", - "-30.21 2.27 \n", - "-14.03 6.29 \n", - "10000000.0 10000000.0 \n", - "-3.82 0.44 \n", - "-4.5 0.62 \n", - "-3.88 0.56 \n", - "-4.45 0.51 \n", - "-4.36 6.35 \n", - "-4.36 6.38 \n", - "-0.91 0.53 \n", - "-12.99 2.11 \n", - "-13.07 1.07 \n", - "-3.83 0.39 \n", - "-0.93 0.53 \n", - "10000000.0 10000000.0 \n", - "-24.14 0.43 \n", - "-3.53 7.84 \n", - "10000000.0 10000000.0 \n", - "-3.83 0.39 \n", - "-4.11 0.51 \n", - "-13.74 1.03 \n", - "-3.83 0.39 \n", - "-4.68 0.75 \n", - "-69.88 6.61 \n", - "-13.83 6.77 \n", - "-93.05 3.0 \n", - "10000000.0 10000000.0 \n", - "-25.72 2.84 \n", - "1.94 0.63 \n", - "-214.36 0.62 \n", - "-0.89 0.92 \n", - "-95.64 1.69 \n", - "27.2 2.71 \n", - "-18.97 0.67 \n", - "4.49 0.35 \n", - "-1.6 0.39 \n", - "-0.13 0.47 \n", - "-1.8 0.54 \n", - "-3.71 0.53 \n", - "2.3 0.33 \n", - "10000000.0 10000000.0 \n", - "14.01 1.01 \n", - "10000000.0 10000000.0 \n", - "-105.96 0.91 \n", - "1.47 1.99 \n", - "-6.84 2.55 \n", - "1.46 2.43 \n", - "-16.08 0.9 \n", - "-72.32 6.31 \n", - "-10.56 6.33 \n", - "-25.11 1.73 \n", - "-19.42 5.78 \n", - "-23.09 1.01 \n", - "0.05 0.45 \n", - "-4.5 0.7 \n", - "0.4 0.66 \n", - "-53.17 0.89 \n", - "-2.66 0.8 \n", - "-13.11 5.07 \n", - "23.24 5.36 \n", - "-0.75 0.77 \n", - "-2.17 0.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "62.61 0.37 \n", - "-49.25 0.53 \n", - "-1.71 1.66 \n", - "-97.36 1.23 \n", - "-94.12 0.75 \n", - "0.36 0.45 \n", - "-89.06 0.82 \n", - "-113.31 0.76 \n", - "-97.36 1.23 \n", - "-117.6 2.35 \n", - "-95.07 0.74 \n", - "4.28 0.24 \n", - "-116.64 0.78 \n", - "-2.14 0.66 \n", - "-4.84 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.18 0.36 \n", - "24.53 1.88 \n", - "43.03 2.87 \n", - "-96.27 1.66 \n", - "2.66 0.8 \n", - "-49.24 0.53 \n", - "-9.4 0.52 \n", - "None 5.88 \n", - "-3.63 5.9 \n", - "3.22 5.93 \n", - "-12.59 5.89 \n", - "-5.25 7.68 \n", - "-82.17 2.13 \n", - "-20.25 1.89 \n", - "-86.23 1.62 \n", - "15.59 1.32 \n", - "3.12 0.49 \n", - "-8.66 0.26 \n", - "-108.62 1.19 \n", - "-94.12 0.75 \n", - "4.89 0.24 \n", - "-8.68 0.26 \n", - "-82.17 2.13 \n", - "-35.51 1.88 \n", - "-86.61 1.62 \n", - "15.6 1.32 \n", - "3.51 0.49 \n", - "-40.79 1.05 \n", - "-2.28 0.8 \n", - "-94.12 0.75 \n", - "4.89 0.24 \n", - "-8.68 0.26 \n", - "-178.53 1.26 \n", - "-82.17 2.13 \n", - "-20.25 1.89 \n", - "-86.23 1.62 \n", - "15.56 1.32 \n", - "3.11 0.49 \n", - "-8.61 0.26 \n", - "-108.63 1.19 \n", - "-82.17 2.13 \n", - "-115.53 2.15 \n", - "-108.62 1.19 \n", - "-6.31 1.33 \n", - "4.44 0.24 \n", - "0.18 0.36 \n", - "10.66 0.78 \n", - "-3.78 0.35 \n", - "-98.3 0.82 \n", - "-104.91 12.09 \n", - "-104.91 17.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-70.47 15.95 \n", - "13.38 9.01 \n", - "-61.47 0.2 \n", - "-1.42 6.63 \n", - "-40.4 1.05 \n", - "10.37 0.2 \n", - "71.84 0.2 \n", - "-28.4 1.67 \n", - "-6.34 8.12 \n", - "-20.13 8.43 \n", - "16.89 9.28 \n", - "-90.26 8.14 \n", - "-28.4 1.67 \n", - "2.41 0.55 \n", - "3.71 3.05 \n", - "-6.02 3.14 \n", - "3.71 3.1 \n", - "-6.02 3.87 \n", - "3.71 3.89 \n", - "7.97 3.83 \n", - "-1.78 1.28 \n", - "-7.55 4.94 \n", - "0.67 0.86 \n", - "3.52 0.32 \n", - "-6.18 1.17 \n", - "-5.02 0.43 \n", - "5.0 2.12 \n", - "-9.06 0.26 \n", - "10000000.0 10000000.0 \n", - "-2.53 0.68 \n", - "-7.33 1.11 \n", - "-14.38 0.55 \n", - "-0.45 1.16 \n", - "-6.44 1.51 \n", - "-36.23 5.02 \n", - "-1.05 5.09 \n", - "-28.7 4.99 \n", - "22.63 5.39 \n", - "10.84 5.31 \n", - "-4.68 5.46 \n", - "-37.45 5.29 \n", - "14.65 5.35 \n", - "4.68 5.6 \n", - "-71.06 7.15 \n", - "-71.06 7.15 \n", - "-5.31 3.93 \n", - "-5.31 3.93 \n", - "-5.31 3.93 \n", - "33.94 0.67 \n", - "33.94 0.67 \n", - "-11.72 1.01 \n", - "33.94 0.67 \n", - "-28.45 3.54 \n", - "-28.45 3.54 \n", - "-28.45 3.54 \n", - "-28.45 3.54 \n", - "0.37 3.29 \n", - "0.37 3.29 \n", - "-20.24 1.89 \n", - "-85.45 6.92 \n", - "4.43 1.96 \n", - "-49.25 0.53 \n", - "1.87 2.17 \n", - "-105.97 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "33.04 3.07 \n", - "6.48 0.85 \n", - "6.48 0.85 \n", - "-26.32 5.34 \n", - "-26.32 5.34 \n", - "6.48 0.85 \n", - "-69.98 3.1 \n", - "-10.1 3.32 \n", - "-10.1 3.32 \n", - "-94.02 0.83 \n", - "-10.1 3.32 \n", - "-10.1 3.32 \n", - "6.48 0.85 \n", - "6.48 0.85 \n", - "-94.96 0.8 \n", - "-69.98 3.1 \n", - "-101.26 1.16 \n", - "-69.98 3.1 \n", - "-101.26 1.16 \n", - "-101.26 1.16 \n", - "-101.26 1.16 \n", - "-69.98 3.1 \n", - "-94.96 0.8 \n", - "-102.63 1.15 \n", - "10000000.0 10000000.0 \n", - "-69.98 2.15 \n", - "2.21 6.44 \n", - "None None \n", - "0.28 0.38 \n", - "-65.16 2.1 \n", - "-14.84 1.99 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.31 0.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-105.88 1.21 \n", - "-96.7 1.52 \n", - "-108.5 6.26 \n", - "2.12 0.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.59 4.01 \n", - "9.17 1.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-100.02 1.53 \n", - "-101.16 1.21 \n", - "10000000.0 10000000.0 \n", - "9.17 1.44 \n", - "-13.03 2.4 \n", - "-49.24 1.29 \n", - "-18.97 6.25 \n", - "-14.39 6.27 \n", - "-5.52 0.54 \n", - "-128.56 0.76 \n", - "6.48 0.85 \n", - "6.48 0.85 \n", - "6.48 0.85 \n", - "6.48 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-45.57 1.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "33.94 0.67 \n", - "10000000.0 10000000.0 \n", - "10.37 0.2 \n", - "10000000.0 10000000.0 \n", - "6.48 0.85 \n", - "6.63 0.96 \n", - "-6.57 0.43 \n", - "-2.47 0.74 \n", - "-249.95 0.64 \n", - "-3.58 0.3 \n", - "4.22 0.71 \n", - "3.02 0.36 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "-0.28 0.38 \n", - "3.96 0.41 \n", - "-7.33 1.11 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "2.81 0.9 \n", - "4.23 0.72 \n", - "1.8 0.69 \n", - "-0.57 0.37 \n", - "-1.02 0.27 \n", - "10000000.0 10000000.0 \n", - "-5.93 0.97 \n", - "-4.58 12.88 \n", - "-25.49 1.85 \n", - "-30.56 1.15 \n", - "-8.68 0.26 \n", - "9.41 0.13 \n", - "9.41 0.15 \n", - "8.92 1.02 \n", - "15.09 13.82 \n", - "-7.35 2.51 \n", - "-31.72 1.02 \n", - "-31.73 1.02 \n", - "22.25 1.18 \n", - "2.91 11.5 \n", - "-18.11 3.81 \n", - "-1.43 16.24 \n", - "-1.43 10.59 \n", - "-101.57 1.28 \n", - "10000000.0 10000000.0 \n", - "-107.67 1.13 \n", - "-109.81 1.17 \n", - "-109.79 1.17 \n", - "-83.0 2.53 \n", - "10000000.0 10000000.0 \n", - "-15.4 3.68 \n", - "-106.57 0.91 \n", - "-101.03 1.21 \n", - "-115.73 1.59 \n", - "-113.03 1.41 \n", - "-115.73 1.59 \n", - "10000000.0 10000000.0 \n", - "-104.91 12.08 \n", - "-104.91 17.25 \n", - "-102.22 0.86 \n", - "-94.13 0.75 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "-95.07 0.74 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "-91.65 4.65 \n", - "-91.65 4.71 \n", - "-91.65 5.01 \n", - "10000000.0 10000000.0 \n", - "-104.99 2.05 \n", - "-95.25 0.85 \n", - "-95.25 0.85 \n", - "15.68 0.45 \n", - "8.71 0.8 \n", - "-28.17 1.16 \n", - "-6.06 6.35 \n", - "-3.74 0.42 \n", - "-3.78 0.6 \n", - "-5.97 0.42 \n", - "-3.74 0.42 \n", - "-3.78 0.6 \n", - "-1.7 6.37 \n", - "-1.7 6.37 \n", - "3.87 2.37 \n", - "-9.12 0.55 \n", - "-3.98 0.52 \n", - "-10.33 2.37 \n", - "-52.22 0.86 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "-1.11 4.75 \n", - "12.5 4.83 \n", - "10000000.0 10000000.0 \n", - "62.85 4.12 \n", - "9.58 4.84 \n", - "-22.74 4.57 \n", - "-53.72 5.96 \n", - "10000000.0 10000000.0 \n", - "-40.99 5.86 \n", - "0.94 0.31 \n", - "0.94 0.31 \n", - "-38.04 0.8 \n", - "-3.83 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-90.63 6.18 \n", - "-90.63 6.18 \n", - "-83.95 6.29 \n", - "-83.95 6.29 \n", - "-15.4 3.48 \n", - "-15.4 3.48 \n", - "None None \n", - "None None \n", - "-49.39 8.47 \n", - "-95.81 9.29 \n", - "-16.29 4.42 \n", - "-41.93 3.86 \n", - "-18.46 0.78 \n", - "-18.46 0.78 \n", - "-18.46 0.78 \n", - "-18.46 0.78 \n", - "-115.73 1.59 \n", - "-33.35 2.77 \n", - "-6.77 0.68 \n", - "-39.25 1.74 \n", - "4.46 0.81 \n", - "0.28 0.38 \n", - "0.28 0.38 \n", - "-4.94 0.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "54.52 2.24 \n", - "-7.11 2.06 \n", - "-3.11 7.33 \n", - "-3.11 7.33 \n", - "-13.05 0.99 \n", - "-93.93 1.58 \n", - "-10.82 0.19 \n", - "-79.81 0.75 \n", - "-79.81 0.75 \n", - "-79.81 0.75 \n", - "4.89 0.24 \n", - "-10.82 0.19 \n", - "10000000.0 10000000.0 \n", - "-10.82 0.19 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "-1.7 14.27 \n", - "-1.7 14.27 \n", - "-1.7 15.52 \n", - "-1.7 15.52 \n", - "-3.4 19.5 \n", - "-3.4 19.5 \n", - "-11.23 22.52 \n", - "-11.23 22.52 \n", - "-11.23 24.1 \n", - "-11.23 24.1 \n", - "-11.23 25.76 \n", - "-11.23 25.76 \n", - "-11.23 27.49 \n", - "-11.23 27.49 \n", - "-11.23 29.27 \n", - "-11.23 29.27 \n", - "-11.23 31.1 \n", - "-11.23 31.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.39 0.24 \n", - "-4.36 5.81 \n", - "-11.91 3.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.51 1.09 \n", - "-5.36 2.64 \n", - "10000000.0 10000000.0 \n", - "-10.46 4.93 \n", - "-13.11 5.07 \n", - "23.24 5.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 6.17 \n", - "-62.7 0.4 \n", - "1.52 1.23 \n", - "-64.95 1.44 \n", - "-4.9 2.85 \n", - "-59.01 3.21 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "43.54 2.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.74 0.51 \n", - "-0.78 0.68 \n", - "-4.29 0.8 \n", - "-0.37 0.39 \n", - "-16.57 1.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-126.78 1.67 \n", - "-126.78 1.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.17 2.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "11.78 1.79 \n", - "0.71 1.21 \n", - "10000000.0 10000000.0 \n", - "-9.54 1.46 \n", - "-5.49 1.77 \n", - "10000000.0 10000000.0 \n", - "-82.17 2.13 \n", - "-20.04 1.5 \n", - "-20.04 1.5 \n", - "-6.52 1.89 \n", - "0.62 2.34 \n", - "-57.58 2.38 \n", - "31.09 2.52 \n", - "-10.46 4.93 \n", - "-13.11 5.07 \n", - "23.24 5.36 \n", - "-4.08 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.53 0.62 \n", - "-2.96 0.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.68 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-118.59 1.24 \n", - "-4.36 6.31 \n", - "10000000.0 10000000.0 \n", - "-5.33 5.07 \n", - "-5.33 4.99 \n", - "-5.33 5.02 \n", - "-4.36 5.17 \n", - "-4.36 5.04 \n", - "-0.91 0.51 \n", - "-90.63 6.18 \n", - "-6.67 1.32 \n", - "0.75 0.93 \n", - "10000000.0 10000000.0 \n", - "-5.27 1.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.48 0.38 \n", - "1.48 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.14 0.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.53 1.46 \n", - "-3.83 0.39 \n", - "-3.83 0.39 \n", - "-3.88 0.56 \n", - "-4.36 6.39 \n", - "-1.7 5.81 \n", - "-13.17 0.99 \n", - "-5.97 0.42 \n", - "-5.97 0.42 \n", - "-13.17 0.99 \n", - "-5.97 0.42 \n", - "-19.78 1.92 \n", - "-19.78 1.92 \n", - "-16.98 11.54 \n", - "-16.98 11.54 \n", - "-2.63 0.42 \n", - "-15.54 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.44 0.78 \n", - "-18.44 0.78 \n", - "10000000.0 10000000.0 \n", - "-6.83 0.33 \n", - "-6.83 0.33 \n", - "-6.83 0.33 \n", - "-6.83 0.33 \n", - "-8.38 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-83.06 1.82 \n", - "-2.17 0.33 \n", - "-3.73 0.33 \n", - "-5.28 0.33 \n", - "0.68 7.06 \n", - "-18.52 0.78 \n", - "-18.42 0.78 \n", - "-0.68 7.22 \n", - "0.67 0.33 \n", - "0.67 0.33 \n", - "-0.88 0.33 \n", - "-2.43 0.33 \n", - "-3.99 0.33 \n", - "0.67 0.33 \n", - "-0.88 0.33 \n", - "-0.88 0.33 \n", - "-2.43 0.33 \n", - "-3.99 0.33 \n", - "4.47 1.53 \n", - "13.07 1.31 \n", - "None None \n", - "0.67 0.33 \n", - "-0.88 0.33 \n", - "-0.88 0.33 \n", - "-2.43 0.33 \n", - "-3.98 0.33 \n", - "-30.22 32.61 \n", - "0.95 0.42 \n", - "-1.07 0.42 \n", - "-30.08 3.91 \n", - "-17.35 5.42 \n", - "-17.35 5.42 \n", - "-21.39 1.41 \n", - "-1.7 8.11 \n", - "-314.94 2.6 \n", - "-10.45 1.56 \n", - "-5.64 1.15 \n", - "-5.09 1.56 \n", - "None None \n", - "-5.02 0.89 \n", - "-105.98 0.91 \n", - "-107.71 7.24 \n", - "-107.71 7.24 \n", - "-106.27 0.91 \n", - "-105.88 0.91 \n", - "-106.11 0.91 \n", - "-2.94 0.9 \n", - "-2.74 0.9 \n", - "-6.94 1.24 \n", - "10000000.0 10000000.0 \n", - "3.15 1.25 \n", - "10000000.0 10000000.0 \n", - "-21.41 0.92 \n", - "-21.41 0.92 \n", - "-39.7 6.07 \n", - "-3.63 0.41 \n", - "-108.63 1.19 \n", - "6.25 13.27 \n", - "3.92 2.53 \n", - "10.95 2.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.95 1.33 \n", - "-1.83 1.07 \n", - "-6.74 6.05 \n", - "-6.74 6.0 \n", - "10000000.0 10000000.0 \n", - "-4.24 0.71 \n", - "-40.68 3.32 \n", - "-4.36 5.59 \n", - "-1.06 6.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.71 0.53 \n", - "-105.97 0.91 \n", - "-105.97 0.91 \n", - "-105.97 0.91 \n", - "-105.97 0.91 \n", - "-4.44 0.24 \n", - "-0.68 0.53 \n", - "10000000.0 10000000.0 \n", - "-2.78 0.75 \n", - "-2.78 0.75 \n", - "3.67 0.39 \n", - "10000000.0 10000000.0 \n", - "-105.97 0.91 \n", - "-108.1 7.14 \n", - "-97.22 0.8 \n", - "-11.91 3.41 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "-13.27 0.43 \n", - "-13.27 0.43 \n", - "-13.27 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.6 0.56 \n", - "-2.6 0.56 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.7 \n", - "-1.87 0.46 \n", - "-14.49 0.33 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "4.89 0.24 \n", - "-3.02 0.72 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.97 0.42 \n", - "-14.68 1.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "55.65 10.25 \n", - "2.34 0.68 \n", - "-0.8 1.14 \n", - "-83.95 6.39 \n", - "-15.4 3.68 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.91 \n", - "-4.36 5.91 \n", - "-13.05 0.99 \n", - "-5.97 0.42 \n", - "-3.83 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "64.25 0.74 \n", - "-81.94 0.8 \n", - "-4.14 0.82 \n", - "-4.36 5.78 \n", - "-18.47 0.78 \n", - "-18.46 0.78 \n", - "-18.42 0.78 \n", - "10000000.0 10000000.0 \n", - "-3.98 1.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-25.79 2.94 \n", - "-67.41 3.65 \n", - "-67.41 3.64 \n", - "-18.53 0.78 \n", - "-18.51 0.78 \n", - "-18.51 0.78 \n", - "-18.52 0.78 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.21 \n", - "11.68 17.96 \n", - "9.52 13.15 \n", - "11.68 17.89 \n", - "-13.05 0.99 \n", - "-13.09 1.07 \n", - "-13.05 0.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.91 0.53 \n", - "10000000.0 10000000.0 \n", - "-38.02 2.73 \n", - "-18.75 0.66 \n", - "-54.4 3.35 \n", - "-30.75 1.47 \n", - "-37.94 1.71 \n", - "-2.67 0.8 \n", - "-2.67 0.8 \n", - "-2.67 0.8 \n", - "-18.75 0.66 \n", - "-6.96 4.28 \n", - "-3.61 5.41 \n", - "-30.75 1.47 \n", - "-21.47 1.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.39 11.55 \n", - "-94.39 11.55 \n", - "-94.39 11.9 \n", - "-177.08 1.65 \n", - "-177.08 1.65 \n", - "-177.08 1.65 \n", - "-177.08 1.65 \n", - "-88.54 0.82 \n", - "-88.54 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-88.54 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.59 4.48 \n", - "3.51 0.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.22 0.33 \n", - "2.22 0.33 \n", - "-9.85 0.73 \n", - "-9.85 0.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-104.91 12.08 \n", - "-104.91 12.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-104.91 17.25 \n", - "-104.91 17.25 \n", - "-1.43 16.24 \n", - "-1.43 10.59 \n", - "10000000.0 10000000.0 \n", - "-1.82 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.98 2.24 \n", - "-115.09 1.38 \n", - "-115.09 1.38 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "-3.57 0.8 \n", - "-1.7 4.94 \n", - "-13.19 0.99 \n", - "-1.7 6.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.09 1.3 \n", - "10000000.0 10000000.0 \n", - "-34.54 1.84 \n", - "10000000.0 10000000.0 \n", - "-28.4 1.67 \n", - "-62.11 1.36 \n", - "-94.13 0.75 \n", - "-104.63 0.81 \n", - "2.08 5.66 \n", - "13.87 0.31 \n", - "-8.68 0.27 \n", - "-59.05 2.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.83 0.34 \n", - "-1.02 0.51 \n", - "-1.1 0.51 \n", - "-5.42 0.66 \n", - "-5.4 1.05 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "-3.38 0.51 \n", - "-6.35 6.52 \n", - "-40.4 1.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "83.07 3.14 \n", - "-4.73 0.64 \n", - "-11.0 0.39 \n", - "0.37 0.45 \n", - "-8.72 1.32 \n", - "-8.88 1.86 \n", - "-14.0 0.53 \n", - "26.71 0.76 \n", - "10.82 0.19 \n", - "0.81 0.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.09 0.97 \n", - "1.52 0.57 \n", - "0.46 3.02 \n", - "10000000.0 10000000.0 \n", - "-21.64 0.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.91 0.53 \n", - "-13.15 0.99 \n", - "-13.19 1.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.09 1.32 \n", - "6.09 1.32 \n", - "10000000.0 10000000.0 \n", - "-0.74 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-38.89 2.2 \n", - "26.67 0.39 \n", - "-20.04 2.24 \n", - "-20.08 2.27 \n", - "-2.18 0.53 \n", - "10000000.0 10000000.0 \n", - "-3.83 0.39 \n", - "-3.83 0.39 \n", - "-3.83 0.39 \n", - "10000000.0 10000000.0 \n", - "-9.06 0.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.89 0.73 \n", - "-31.07 0.7 \n", - "-18.22 1.85 \n", - "-18.74 1.74 \n", - "None None \n", - "-94.13 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.03 0.53 \n", - "-20.19 2.24 \n", - "-20.23 2.27 \n", - "-1.02 0.53 \n", - "-12.79 0.99 \n", - "-13.54 0.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.23 4.79 \n", - "10000000.0 10000000.0 \n", - "-19.98 2.24 \n", - "-13.04 0.99 \n", - "-2.15 0.53 \n", - "-2.15 0.53 \n", - "-13.04 0.99 \n", - "-2.15 0.53 \n", - "-177.08 1.65 \n", - "-112.0 0.83 \n", - "-5.33 8.66 \n", - "-5.33 8.71 \n", - "-89.24 1.05 \n", - "-20.8 3.0 \n", - "0.07 6.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-36.3 1.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.18 \n", - "-0.87 5.49 \n", - "-0.87 5.63 \n", - "-12.97 0.99 \n", - "-13.01 1.07 \n", - "3.49 2.37 \n", - "3.45 2.4 \n", - "-1.7 5.66 \n", - "3.49 2.37 \n", - "3.45 2.4 \n", - "10000000.0 10000000.0 \n", - "3.49 2.37 \n", - "3.45 2.4 \n", - "3.49 2.37 \n", - "3.45 2.4 \n", - "10000000.0 10000000.0 \n", - "-6.45 3.03 \n", - "-6.45 3.03 \n", - "0.65 0.27 \n", - "0.65 0.27 \n", - "-1.49 0.27 \n", - "0.65 0.27 \n", - "-1.49 0.27 \n", - "-0.87 5.21 \n", - "-1.81 0.19 \n", - "0.33 0.13 \n", - "-0.98 0.4 \n", - "0.39 0.83 \n", - "-1.49 0.27 \n", - "-3.83 0.39 \n", - "-3.84 0.39 \n", - "-2.19 0.53 \n", - "0.65 0.27 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "3.3 6.42 \n", - "3.3 6.42 \n", - "3.3 6.66 \n", - "3.3 6.66 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "3.3 4.27 \n", - "3.3 4.27 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "3.3 4.39 \n", - "3.3 4.39 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-82.4 3.41 \n", - "-82.4 3.41 \n", - "4.7 2.24 \n", - "-6.27 2.07 \n", - "-2.6 2.39 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.02 5.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "42.32 0.18 \n", - "42.32 0.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-95.25 0.85 \n", - "-2.18 9.81 \n", - "-13.16 0.99 \n", - "3.87 2.37 \n", - "-0.68 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "10000000.0 10000000.0 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "10000000.0 10000000.0 \n", - "-18.53 0.78 \n", - "-18.53 0.78 \n", - "-113.8 1.42 \n", - "-113.8 1.42 \n", - "-102.93 7.48 \n", - "-122.99 2.46 \n", - "-122.99 2.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.99 0.31 \n", - "-38.35 0.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.22 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.25 0.47 \n", - "-2.25 0.47 \n", - "-2.25 0.47 \n", - "-2.25 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-64.27 3.09 \n", - "10000000.0 10000000.0 \n", - "-50.31 3.85 \n", - "-33.24 4.46 \n", - "-6.27 1.53 \n", - "-58.88 3.91 \n", - "-53.47 3.33 \n", - "-20.18 2.19 \n", - "None 6.31 \n", - "-4.2 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.2 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.09 0.84 \n", - "2.26 0.76 \n", - "-8.44 0.86 \n", - "10000000.0 10000000.0 \n", - "-5.97 0.42 \n", - "-1.7 5.27 \n", - "-109.95 2.25 \n", - "-109.95 2.25 \n", - "-13.14 0.99 \n", - "-109.98 2.25 \n", - "-109.98 2.25 \n", - "2.83 0.96 \n", - "-6.7 1.58 \n", - "-14.26 0.34 \n", - "-175.24 1.58 \n", - "10000000.0 10000000.0 \n", - "-0.35 0.51 \n", - "-5.97 0.42 \n", - "-0.74 0.51 \n", - "-5.97 0.42 \n", - "-0.74 0.51 \n", - "-5.97 0.42 \n", - "-3.83 0.39 \n", - "-1.7 5.9 \n", - "-1.7 5.9 \n", - "-13.16 0.99 \n", - "-93.39 6.2 \n", - "-0.01 None \n", - "4.87 3.48 \n", - "6.85 1.08 \n", - "-20.34 1.78 \n", - "3.71 2.4 \n", - "3.71 2.4 \n", - "-102.36 1.16 \n", - "-94.39 8.31 \n", - "-9.17 5.63 \n", - "-118.19 0.76 \n", - "-40.99 5.86 \n", - "-94.13 0.75 \n", - "-9.17 5.63 \n", - "-94.39 8.31 \n", - "-118.19 0.76 \n", - "-94.13 0.75 \n", - "-94.39 8.9 \n", - "-9.17 6.48 \n", - "-118.19 0.76 \n", - "-94.13 0.75 \n", - "-94.39 8.44 \n", - "-9.17 5.82 \n", - "-118.19 0.76 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "-96.26 8.08 \n", - "-94.39 8.04 \n", - "-9.17 5.23 \n", - "-118.58 8.03 \n", - "-94.13 0.75 \n", - "-94.39 8.4 \n", - "-9.17 5.77 \n", - "-118.19 0.76 \n", - "-35.91 4.43 \n", - "-27.33 3.53 \n", - "-44.15 2.69 \n", - "-52.97 2.82 \n", - "10000000.0 10000000.0 \n", - "-0.83 1.04 \n", - "0.85 0.65 \n", - "-22.88 1.52 \n", - "-3.8 0.27 \n", - "-5.09 0.81 \n", - "0.61 1.02 \n", - "-6.06 0.47 \n", - "-5.16 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.88 3.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.71 0.85 \n", - "-7.51 0.62 \n", - "-3.65 0.32 \n", - "-4.17 0.94 \n", - "1.17 0.61 \n", - "-3.34 0.2 \n", - "8.72 0.09 \n", - "-2.82 0.21 \n", - "4.36 0.98 \n", - "10000000.0 10000000.0 \n", - "-10.46 7.23 \n", - "-8.88 3.73 \n", - "-32.71 2.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.69 0.67 \n", - "1.52 1.34 \n", - "-1.38 0.78 \n", - "-3.89 0.58 \n", - "-4.38 1.17 \n", - "-4.95 0.97 \n", - "-33.61 6.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-23.36 1.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.42 0.49 \n", - "-20.54 1.56 \n", - "-6.8 0.72 \n", - "-6.93 0.23 \n", - "-9.47 1.75 \n", - "10000000.0 10000000.0 \n", - "-5.92 1.01 \n", - "4.95 0.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.81 0.71 \n", - "-5.9 1.18 \n", - "10000000.0 10000000.0 \n", - "-8.34 0.82 \n", - "10000000.0 10000000.0 \n", - "-0.13 0.6 \n", - "-5.85 0.61 \n", - "8.71 0.07 \n", - "-18.42 5.84 \n", - "-1.2 1.08 \n", - "-2.23 1.11 \n", - "10000000.0 10000000.0 \n", - "-3.13 1.37 \n", - "-1.75 1.36 \n", - "1.82 0.08 \n", - "5.03 0.08 \n", - "0.18 0.33 \n", - "-1.29 0.36 \n", - "-11.48 0.32 \n", - "-10.65 0.48 \n", - "7.34 1.47 \n", - "-0.99 0.81 \n", - "-9.31 1.46 \n", - "0.95 0.63 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.18 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.12 0.81 \n", - "-1.75 1.36 \n", - "10000000.0 10000000.0 \n", - "190.83 1.55 \n", - "-226.79 1.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-163.63 2.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.48 0.38 \n", - "-259.8 2.07 \n", - "-7.03 0.53 \n", - "10000000.0 10000000.0 \n", - "3.81 1.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.41 0.78 \n", - "4.75 0.65 \n", - "-5.92 1.01 \n", - "8.27 0.9 \n", - "-8.44 0.34 \n", - "4.56 0.71 \n", - "10000000.0 10000000.0 \n", - "2.01 0.36 \n", - "5.96 0.32 \n", - "-1.5 0.34 \n", - "1.86 0.82 \n", - "6.93 0.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.93 1.02 \n", - "2.04 0.28 \n", - "-1.89 0.66 \n", - "-1.3 0.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.18 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "11.27 0.87 \n", - "1.97 0.45 \n", - "17.53 0.82 \n", - "-7.54 0.79 \n", - "1.1 0.6 \n", - "1.45 0.48 \n", - "-0.06 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.38 0.78 \n", - "1.97 0.32 \n", - "2.67 0.5 \n", - "-3.14 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.69 0.67 \n", - "5.34 1.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "166.19 2.34 \n", - "167.58 6.35 \n", - "165.86 2.37 \n", - "166.48 1.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.02 0.72 \n", - "-46.34 0.68 \n", - "10000000.0 10000000.0 \n", - "-2.58 0.85 \n", - "-10.95 0.48 \n", - "-3.08 0.94 \n", - "10000000.0 10000000.0 \n", - "-4.22 1.25 \n", - "0.57 0.71 \n", - "None 6.17 \n", - "-5.9 1.12 \n", - "0.36 0.71 \n", - "-2.79 0.26 \n", - "-22.57 1.11 \n", - "10000000.0 10000000.0 \n", - "None 0.44 \n", - "None 0.44 \n", - "None 0.3 \n", - "None 0.3 \n", - "None 0.41 \n", - "None 0.41 \n", - "None 0.41 \n", - "None 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.23 \n", - "None 1.23 \n", - "None 1.23 \n", - "None 1.16 \n", - "None 1.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.56 \n", - "None 0.48 \n", - "None 0.48 \n", - "-3.44 0.61 \n", - "-9.34 0.31 \n", - "None 4.27 \n", - "None 1.44 \n", - "None 1.44 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "None 1.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-20.43 0.65 \n", - "46.17 0.24 \n", - "-20.24 0.35 \n", - "86.82 1.25 \n", - "105.88 0.52 \n", - "None 0.38 \n", - "None 0.38 \n", - "None 8.53 \n", - "None 8.53 \n", - "None 1.24 \n", - "None 1.24 \n", - "None 2.14 \n", - "None 2.14 \n", - "None 0.83 \n", - "None 0.83 \n", - "-6.16 0.07 \n", - "None 0.71 \n", - "None 4.58 \n", - "None 4.58 \n", - "0.01 5.37 \n", - "8.78 0.13 \n", - "-5.66 0.58 \n", - "-22.32 1.03 \n", - "10000000.0 10000000.0 \n", - "0.54 1.48 \n", - "-22.93 1.05 \n", - "-6.03 0.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.54 0.55 \n", - "10.75 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.01 1.14 \n", - "-18.13 0.71 \n", - "10000000.0 10000000.0 \n", - "-7.11 1.11 \n", - "-3.53 7.16 \n", - "-80.46 1.66 \n", - "-19.42 6.89 \n", - "-18.19 1.11 \n", - "-2.66 0.8 \n", - "-8.67 0.26 \n", - "-0.95 0.36 \n", - "5.6 0.74 \n", - "-5.83 1.19 \n", - "-8.27 0.9 \n", - "-7.3 0.13 \n", - "10000000.0 10000000.0 \n", - "-4.04 0.7 \n", - "-1.13 0.1 \n", - "-1.6 0.39 \n", - "-9.68 2.26 \n", - "-0.01 5.37 \n", - "10000000.0 10000000.0 \n", - "-8.68 0.26 \n", - "-8.67 0.27 \n", - "-20.14 1.86 \n", - "-2.46 0.54 \n", - "7.34 1.47 \n", - "-2.84 0.54 \n", - "-7.56 0.47 \n", - "-22.54 1.11 \n", - "10000000.0 10000000.0 \n", - "-4.01 0.86 \n", - "10000000.0 10000000.0 \n", - "0.69 0.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.35 0.71 \n", - "-2.67 0.35 \n", - "0.85 0.65 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.48 0.57 \n", - "-8.44 0.34 \n", - "1.51 0.68 \n", - "-6.45 0.71 \n", - "-0.18 0.36 \n", - "-2.44 0.61 \n", - "-2.44 0.61 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "-2.63 1.54 \n", - "10000000.0 10000000.0 \n", - "-13.94 1.55 \n", - "-6.14 0.18 \n", - "-8.07 1.19 \n", - "-0.95 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.36 0.98 \n", - "-6.76 0.73 \n", - "-4.44 0.24 \n", - "-6.93 0.67 \n", - "-1.26 0.75 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "4.62 0.58 \n", - "-0.94 1.4 \n", - "11.95 1.71 \n", - "11.95 1.71 \n", - "1.41 0.78 \n", - "1.41 0.78 \n", - "10000000.0 10000000.0 \n", - "-4.44 0.24 \n", - "-4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.27 0.73 \n", - "-9.57 0.81 \n", - "-8.38 0.33 \n", - "-5.28 0.33 \n", - "-8.79 0.73 \n", - "-3.69 0.67 \n", - "-5.52 0.3 \n", - "-1.38 0.78 \n", - "1.81 5.51 \n", - "1.81 5.07 \n", - "-4.05 1.05 \n", - "-8.47 0.78 \n", - "10.16 1.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.13 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.06 0.3 \n", - "-2.77 0.26 \n", - "-5.72 0.44 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.1 1.06 \n", - "-5.92 1.01 \n", - "10000000.0 10000000.0 \n", - "-2.79 0.26 \n", - "10000000.0 10000000.0 \n", - "-0.09 0.5 \n", - "-0.09 0.5 \n", - "-1.13 0.78 \n", - "-0.04 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.82 \n", - "None 0.82 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "None 2.8 \n", - "None 2.32 \n", - "None 2.21 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.28 0.37 \n", - "None 6.11 \n", - "-9.31 0.31 \n", - "-2.75 0.69 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.65 \n", - "None 4.65 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.26 \n", - "36.52 4.09 \n", - "38.58 4.09 \n", - "-35.4 1.67 \n", - "-9.51 1.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.47 \n", - "1.12 0.25 \n", - "None 0.49 \n", - "-0.61 0.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.15 \n", - "-31.87 1.48 \n", - "-5.98 1.16 \n", - "-11.55 1.46 \n", - "10000000.0 10000000.0 \n", - "1.52 1.23 \n", - "-2.64 1.79 \n", - "-28.53 1.54 \n", - "-75.98 3.57 \n", - "1.71 4.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.77 \n", - "None 1.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.87 \n", - "-22.87 1.22 \n", - "-29.44 1.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.12 \n", - "None 1.39 \n", - "6.15 6.55 \n", - "4.93 6.45 \n", - "5.94 6.55 \n", - "1.85 6.58 \n", - "22.2 6.84 \n", - "18.11 6.86 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.68 2.23 \n", - "10000000.0 10000000.0 \n", - "-9.68 2.26 \n", - "-1.66 0.92 \n", - "-61.44 0.32 \n", - "4.9 1.06 \n", - "4.95 0.24 \n", - "7.37 0.85 \n", - "8.78 0.39 \n", - "10000000.0 10000000.0 \n", - "-0.89 0.13 \n", - "None 1.04 \n", - "9.23 0.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-86.77 21.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.99 6.67 \n", - "-56.59 0.75 \n", - "-7.42 0.57 \n", - "-46.87 0.22 \n", - "-77.94 1.03 \n", - "10000000.0 10000000.0 \n", - "-28.8 0.74 \n", - "-28.8 0.74 \n", - "-28.86 0.78 \n", - "-16.82 1.56 \n", - "0.04 0.72 \n", - "-43.5 0.33 \n", - "10000000.0 10000000.0 \n", - "-1.72 8.61 \n", - "9.53 11.63 \n", - "10000000.0 10000000.0 \n", - "-0.98 0.07 \n", - "-1.21 0.44 \n", - "2.48 1.24 \n", - "-6.53 4.99 \n", - "-1.26 0.5 \n", - "-43.42 0.43 \n", - "-7.26 0.6 \n", - "-2.43 0.33 \n", - "-5.35 0.66 \n", - "10000000.0 10000000.0 \n", - "-45.06 4.16 \n", - "-111.57 4.97 \n", - "-47.86 1.47 \n", - "9.9 1.88 \n", - "-0.72 0.79 \n", - "2.22 0.33 \n", - "0.14 0.96 \n", - "-42.85 0.43 \n", - "-4.44 0.24 \n", - "-4.44 0.24 \n", - "-1.62 0.84 \n", - "-42.63 0.83 \n", - "-43.03 0.25 \n", - "-5.39 0.53 \n", - "8.79 0.58 \n", - "-13.43 1.51 \n", - "-7.84 1.14 \n", - "None 0.54 \n", - "0.31 0.45 \n", - "10000000.0 10000000.0 \n", - "0.44 0.71 \n", - "-13.28 2.3 \n", - "-46.96 0.68 \n", - "-2.47 0.77 \n", - "-45.1 0.48 \n", - "-3.37 0.34 \n", - "None 8.27 \n", - "10000000.0 10000000.0 \n", - "-86.98 0.38 \n", - "-7.0 1.54 \n", - "-106.64 1.69 \n", - "-8.34 0.82 \n", - "-4.01 0.86 \n", - "1.99 0.28 \n", - "0.14 0.61 \n", - "-6.94 0.95 \n", - "-51.32 1.69 \n", - "-2.51 0.68 \n", - "-66.0 7.44 \n", - "38.8 0.77 \n", - "18.49 2.63 \n", - "-1.42 0.64 \n", - "0.63 0.65 \n", - "10000000.0 10000000.0 \n", - "-43.31 1.22 \n", - "-46.14 0.21 \n", - "7.93 0.99 \n", - "0.54 1.48 \n", - "0.85 0.65 \n", - "-7.79 0.66 \n", - "-42.7 0.49 \n", - "-41.34 0.33 \n", - "10000000.0 10000000.0 \n", - "None 1.06 \n", - "None 0.71 \n", - "-8.6 0.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-2.13 0.18 \n", - "-17.48 0.57 \n", - "-43.6 0.49 \n", - "-36.24 1.08 \n", - "-18.13 0.71 \n", - "45.53 1.4 \n", - "-1.82 0.63 \n", - "-38.6 0.45 \n", - "-39.52 0.45 \n", - "-8.44 0.34 \n", - "-8.44 0.34 \n", - "-14.03 11.24 \n", - "-91.95 2.55 \n", - "-11.96 0.72 \n", - "-198.02 5.32 \n", - "-46.64 0.6 \n", - "10000000.0 10000000.0 \n", - "-1.84 0.3 \n", - "-129.98 2.86 \n", - "-13.45 5.25 \n", - "-48.05 0.48 \n", - "-6.42 1.8 \n", - "-41.81 0.64 \n", - "196.32 10.66 \n", - "-54.46 0.86 \n", - "None 1.02 \n", - "-0.82 0.07 \n", - "10000000.0 10000000.0 \n", - "-7.43 0.57 \n", - "-13.88 0.97 \n", - "-28.83 0.2 \n", - "-28.82 0.21 \n", - "-2.82 0.21 \n", - "0.99 0.75 \n", - "-27.74 1.51 \n", - "-1.57 0.57 \n", - "-51.66 0.58 \n", - "2.48 0.6 \n", - "-44.3 0.72 \n", - "-51.24 5.87 \n", - "-7.41 0.5 \n", - "-56.08 1.97 \n", - "-129.41 1.39 \n", - "-75.1 3.7 \n", - "-75.1 3.95 \n", - "-47.95 1.41 \n", - "10000000.0 10000000.0 \n", - "-43.9 0.47 \n", - "4.04 6.28 \n", - "-4.1 0.53 \n", - "-64.93 6.43 \n", - "39.2 3.56 \n", - "-42.16 0.61 \n", - "10000000.0 10000000.0 \n", - "-73.59 1.24 \n", - "21.9 0.84 \n", - "21.89 0.85 \n", - "None 0.68 \n", - "19.06 1.44 \n", - "-9.86 0.47 \n", - "-32.79 0.94 \n", - "4.15 1.31 \n", - "-139.41 1.08 \n", - "-5.2 0.53 \n", - "23.04 0.43 \n", - "23.04 0.43 \n", - "1.11 0.92 \n", - "-3.37 0.44 \n", - "-15.72 0.65 \n", - "-3.11 3.56 \n", - "-9.58 3.78 \n", - "29.22 1.94 \n", - "-22.32 1.03 \n", - "10000000.0 10000000.0 \n", - "-48.19 0.48 \n", - "10000000.0 10000000.0 \n", - "-43.54 0.82 \n", - "55.12 2.07 \n", - "-45.64 0.52 \n", - "10000000.0 10000000.0 \n", - "-38.84 0.29 \n", - "-2.23 1.11 \n", - "1.52 0.35 \n", - "0.38 0.45 \n", - "-0.73 4.44 \n", - "-58.14 1.95 \n", - "-50.23 1.12 \n", - "-3.02 0.72 \n", - "-1.38 0.78 \n", - "3.03 1.02 \n", - "-43.08 1.18 \n", - "-9.47 1.75 \n", - "9.68 2.19 \n", - "-32.71 2.06 \n", - "46.27 0.78 \n", - "4.26 0.57 \n", - "-23.36 1.11 \n", - "-20.16 1.48 \n", - "50.5 0.9 \n", - "10000000.0 10000000.0 \n", - "50.52 0.67 \n", - "-8.05 0.6 \n", - "-8.47 0.78 \n", - "23.67 0.88 \n", - "6.47 1.34 \n", - "10000000.0 10000000.0 \n", - "-46.71 0.44 \n", - "-113.12 4.99 \n", - "4.98 5.01 \n", - "-2.84 0.54 \n", - "-29.3 6.24 \n", - "4.98 5.36 \n", - "1.02 0.71 \n", - "-75.1 3.04 \n", - "-2.17 0.41 \n", - "-3.33 0.3 \n", - "-43.78 0.93 \n", - "-1.19 0.35 \n", - "-56.13 1.61 \n", - "-57.53 0.74 \n", - "-71.84 0.79 \n", - "-63.83 1.09 \n", - "6.48 0.85 \n", - "-68.43 0.9 \n", - "-68.43 0.9 \n", - "10000000.0 10000000.0 \n", - "-67.19 0.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.79 4.51 \n", - "-44.98 0.33 \n", - "-44.98 0.35 \n", - "9.58 0.8 \n", - "10.37 0.2 \n", - "-22.57 1.11 \n", - "-29.78 7.25 \n", - "-34.59 6.27 \n", - "-111.57 5.41 \n", - "-90.63 6.54 \n", - "14.41 0.79 \n", - "-37.57 6.27 \n", - "-4.6 0.65 \n", - "25.23 0.34 \n", - "25.23 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "44.83 1.11 \n", - "0.18 0.36 \n", - "-43.35 0.35 \n", - "-68.42 0.9 \n", - "-49.26 0.53 \n", - "-43.34 0.35 \n", - "-46.6 0.24 \n", - "-2.67 0.69 \n", - "-43.5 0.33 \n", - "-29.78 7.0 \n", - "-68.43 0.9 \n", - "-68.43 0.9 \n", - "10000000.0 10000000.0 \n", - "-0.37 0.56 \n", - "0.88 0.81 \n", - "0.07 0.57 \n", - "0.46 2.41 \n", - "0.46 2.56 \n", - "57.75 17.24 \n", - "7.79 2.72 \n", - "57.75 12.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.78 1.92 \n", - "-2.18 9.81 \n", - "-57.53 0.74 \n", - "-57.53 0.74 \n", - "-57.53 0.74 \n", - "-97.48 0.85 \n", - "14.27 0.34 \n", - "-52.67 0.22 \n", - "-52.67 0.22 \n", - "-52.67 0.22 \n", - "-44.31 0.33 \n", - "-44.31 0.33 \n", - "-43.89 0.33 \n", - "-43.89 0.33 \n", - "-211.84 1.56 \n", - "-3.35 0.3 \n", - "130.05 1.55 \n", - "133.54 1.53 \n", - "-37.41 0.17 \n", - "-3.36 0.57 \n", - "-3.36 0.57 \n", - "-3.35 0.3 \n", - "-29.78 7.0 \n", - "7.08 1.27 \n", - "142.53 1.46 \n", - "7.08 1.27 \n", - "7.08 1.27 \n", - "9.12 1.25 \n", - "-283.26 1.55 \n", - "10000000.0 10000000.0 \n", - "-68.43 0.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "22.11 0.44 \n", - "-2.17 0.1 \n", - "1.52 1.23 \n", - "-59.66 0.79 \n", - "-59.66 0.79 \n", - "11.19 2.22 \n", - "10000000.0 10000000.0 \n", - "-16.57 1.1 \n", - "-25.76 1.8 \n", - "-22.58 1.25 \n", - "-47.08 1.45 \n", - "-47.08 1.45 \n", - "0.52 0.47 \n", - "-46.45 0.79 \n", - "-20.04 1.5 \n", - "-7.12 2.59 \n", - "-6.52 1.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.77 1.18 \n", - "-118.58 1.24 \n", - "0.53 0.79 \n", - "-1.42 6.63 \n", - "10000000.0 10000000.0 \n", - "-2.18 9.81 \n", - "-2.63 0.42 \n", - "-57.53 0.74 \n", - "-45.52 1.82 \n", - "0.67 0.33 \n", - "0.67 0.33 \n", - "-0.88 0.33 \n", - "-2.43 0.33 \n", - "-3.99 0.33 \n", - "0.67 0.33 \n", - "-0.88 0.33 \n", - "-0.88 0.33 \n", - "-2.43 0.33 \n", - "-3.99 0.33 \n", - "-5.17 0.34 \n", - "-5.17 0.34 \n", - "0.67 0.33 \n", - "-0.88 0.33 \n", - "-0.88 0.33 \n", - "-2.43 0.33 \n", - "-3.98 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.29 0.45 \n", - "-1.34 0.82 \n", - "-97.47 2.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-68.43 0.9 \n", - "5.28 7.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-33.74 0.92 \n", - "10000000.0 10000000.0 \n", - "-121.99 3.7 \n", - "-3.02 0.72 \n", - "-57.53 0.74 \n", - "-22.86 1.16 \n", - "10000000.0 10000000.0 \n", - "-42.27 0.72 \n", - "10000000.0 10000000.0 \n", - "-40.85 8.25 \n", - "-44.4 0.78 \n", - "-44.4 0.78 \n", - "-57.53 0.74 \n", - "-47.23 11.54 \n", - "-47.23 11.54 \n", - "-47.23 11.89 \n", - "-57.75 12.08 \n", - "-57.75 17.25 \n", - "-1.43 16.24 \n", - "-1.43 10.59 \n", - "-46.92 0.51 \n", - "6.69 0.98 \n", - "44.56 2.05 \n", - "-77.93 1.04 \n", - "-79.42 1.49 \n", - "-77.94 1.03 \n", - "-40.11 1.05 \n", - "-77.94 1.03 \n", - "-77.94 1.03 \n", - "10000000.0 10000000.0 \n", - "-0.87 5.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.32 3.39 \n", - "4.7 2.24 \n", - "44.56 2.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "14.27 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-48.59 0.88 \n", - "-45.98 0.86 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "24.01 3.68 \n", - "-81.37 4.17 \n", - "-49.27 0.53 \n", - "11.82 3.81 \n", - "1.18 0.45 \n", - "10000000.0 10000000.0 \n", - "2.22 0.33 \n", - "-43.1 0.37 \n", - "-43.03 0.78 \n", - "-11.1 1.81 \n", - "10000000.0 10000000.0 \n", - "-11.88 0.27 \n", - "10000000.0 10000000.0 \n", - "-4.79 0.88 \n", - "-4.7 0.72 \n", - "-2.46 0.07 \n", - "10000000.0 10000000.0 \n", - "-1.44 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "41.78 0.55 \n", - "41.76 0.58 \n", - "40.36 0.94 \n", - "42.17 0.64 \n", - "21.87 0.43 \n", - "21.86 0.43 \n", - "-42.85 1.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-80.97 0.63 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "-8.11 0.41 \n", - "10000000.0 10000000.0 \n", - "-25.91 1.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.14 0.96 \n", - "-19.35 5.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.32 0.3 \n", - "10000000.0 10000000.0 \n", - "-5.31 0.4 \n", - "-5.31 0.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.65 0.46 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "-5.83 1.19 \n", - "6.02 0.21 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.26 0.28 \n", - "1.99 0.28 \n", - "0.14 0.61 \n", - "-11.8 1.28 \n", - "-11.8 1.28 \n", - "10000000.0 10000000.0 \n", - "14.27 0.34 \n", - "14.27 0.34 \n", - "14.27 0.34 \n", - "14.27 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.46 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-20.97 1.86 \n", - "-4.44 0.46 \n", - "-19.81 0.31 \n", - "10000000.0 10000000.0 \n", - "-3.41 1.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.76 0.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.01 0.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.22 6.14 \n", - "5.22 6.15 \n", - "-4.89 0.25 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "-4.89 0.25 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "-26.84 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.68 0.26 \n", - "-8.68 0.26 \n", - "-8.68 0.26 \n", - "-8.68 0.26 \n", - "-10.64 0.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-43.21 1.06 \n", - "-40.4 1.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.48 0.31 \n", - "-9.17 0.44 \n", - "10000000.0 10000000.0 \n", - "4.47 0.63 \n", - "4.47 0.63 \n", - "1.25 0.43 \n", - "1.25 0.43 \n", - "-1.7 5.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.28 2.3 \n", - "-13.28 2.3 \n", - "-25.44 2.52 \n", - "10000000.0 10000000.0 \n", - "4.89 0.25 \n", - "10000000.0 10000000.0 \n", - "-310.37 1.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-22.97 1.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-22.57 1.11 \n", - "10000000.0 10000000.0 \n", - "0.03 0.46 \n", - "10000000.0 10000000.0 \n", - "-10.95 0.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.36 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 8.27 \n", - "None 8.27 \n", - "10000000.0 10000000.0 \n", - "-7.54 3.31 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.01 0.3 \n", - "-0.11 0.27 \n", - "-69.98 3.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.83 1.48 \n", - "-7.0 1.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-40.11 1.05 \n", - "-41.88 1.52 \n", - "-40.4 1.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.42 1.34 \n", - "10000000.0 10000000.0 \n", - "37.57 5.33 \n", - "-6.88 0.86 \n", - "-12.98 0.87 \n", - "-9.57 0.86 \n", - "-4.01 0.86 \n", - "10000000.0 10000000.0 \n", - "-3.81 0.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "17.21 5.64 \n", - "-11.11 11.3 \n", - "-13.57 12.86 \n", - "-1.48 12.84 \n", - "-8.29 0.26 \n", - "-8.29 0.26 \n", - "-8.29 0.26 \n", - "13.57 12.85 \n", - "10000000.0 10000000.0 \n", - "-8.67 0.3 \n", - "-105.97 0.91 \n", - "2.81 0.44 \n", - "2.1 0.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.61 0.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-62.1 1.36 \n", - "-5.05 0.47 \n", - "-1.34 0.85 \n", - "0.07 0.38 \n", - "0.51 0.84 \n", - "-83.04 6.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.05 2.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.29 0.36 \n", - "-0.29 0.36 \n", - "-7.33 1.45 \n", - "0.63 0.65 \n", - "-0.28 0.38 \n", - "-46.06 1.64 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.51 0.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.27 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.43 0.44 \n", - "10000000.0 10000000.0 \n", - "-2.43 0.44 \n", - "10000000.0 10000000.0 \n", - "-5.72 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.44 1.1 \n", - "0.74 1.21 \n", - "10000000.0 10000000.0 \n", - "-66.71 1.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.6 0.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.7 1.01 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "3.25 0.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.28 0.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.68 0.72 \n", - "-7.69 0.72 \n", - "-7.68 0.72 \n", - "-7.83 0.72 \n", - "-9.06 0.26 \n", - "-13.28 1.2 \n", - "-13.28 1.2 \n", - "-13.4 1.06 \n", - "15.23 1.59 \n", - "0.85 0.65 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.68 0.79 \n", - "-0.48 2.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.71 0.52 \n", - "-3.94 0.48 \n", - "-23.57 1.12 \n", - "1.6 1.2 \n", - "-2.5 0.88 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.13 0.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.74 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.67 0.47 \n", - "3.95 0.44 \n", - "-7.2 0.46 \n", - "10000000.0 10000000.0 \n", - "7.84 0.69 \n", - "-17.37 1.76 \n", - "1.02 0.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.53 0.65 \n", - "10000000.0 10000000.0 \n", - "3.8 0.92 \n", - "10000000.0 10000000.0 \n", - "2.32 0.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.15 0.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.61 0.58 \n", - "-11.13 4.62 \n", - "-4.06 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-72.9 0.83 \n", - "-72.9 0.83 \n", - "10000000.0 10000000.0 \n", - "5.71 1.49 \n", - "14.27 0.34 \n", - "10000000.0 10000000.0 \n", - "42.69 7.71 \n", - "-0.9 0.51 \n", - "-0.9 0.51 \n", - "-6.4 0.52 \n", - "-6.4 0.52 \n", - "2.01 0.36 \n", - "-0.28 0.38 \n", - "-29.55 1.49 \n", - "-3.95 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.44 0.34 \n", - "-8.44 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.78 2.26 \n", - "0.79 0.41 \n", - "10000000.0 10000000.0 \n", - "-16.31 2.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.41 0.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 11.24 \n", - "-14.03 11.24 \n", - "10000000.0 10000000.0 \n", - "7.22 10.93 \n", - "-16.34 10.93 \n", - "-3.7 0.46 \n", - "-0.28 0.38 \n", - "0.59 0.63 \n", - "-3.42 0.46 \n", - "0.29 0.3 \n", - "4.53 0.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "-0.18 0.36 \n", - "-0.18 0.36 \n", - "-0.18 0.36 \n", - "0.25 0.71 \n", - "-0.18 0.36 \n", - "-0.91 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.37 4.36 \n", - "-5.66 0.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.8 0.55 \n", - "-1.84 0.3 \n", - "-1.84 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.13 0.71 \n", - "-18.13 0.71 \n", - "-18.13 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-58.25 2.21 \n", - "-58.25 2.21 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.33 0.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "43.97 0.35 \n", - "43.97 0.35 \n", - "-4.45 0.68 \n", - "-3.31 0.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.82 1.79 \n", - "10000000.0 10000000.0 \n", - "-18.13 0.71 \n", - "-2.81 0.3 \n", - "3.8 0.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.31 0.71 \n", - "-0.26 0.49 \n", - "0.82 0.07 \n", - "10000000.0 10000000.0 \n", - "1.55 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.04 0.39 \n", - "-0.81 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.25 0.1 \n", - "4.36 0.98 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.6 0.32 \n", - "-3.76 0.95 \n", - "10000000.0 10000000.0 \n", - "-2.28 0.35 \n", - "10000000.0 10000000.0 \n", - "0.71 1.21 \n", - "-2.41 0.57 \n", - "-2.78 0.43 \n", - "-0.01 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.5 0.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.04 0.72 \n", - "-5.17 0.59 \n", - "-5.46 0.91 \n", - "-5.46 0.91 \n", - "-5.46 0.91 \n", - "10000000.0 10000000.0 \n", - "-3.51 0.43 \n", - "-3.51 0.43 \n", - "-3.33 0.98 \n", - "-3.2 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.83 0.39 \n", - "-0.45 0.11 \n", - "4.89 0.25 \n", - "-2.37 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.78 1.0 \n", - "10000000.0 10000000.0 \n", - "8.71 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-25.53 4.45 \n", - "-2.82 0.21 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.92 0.91 \n", - "-3.34 0.2 \n", - "-3.34 0.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.7 0.19 \n", - "3.7 0.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.45 0.1 \n", - "-4.59 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.08 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.47 0.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "59.81 0.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.48 0.6 \n", - "-7.41 0.5 \n", - "-17.84 0.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.82 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 4.7 \n", - "-30.61 1.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.01 0.11 \n", - "-4.01 0.11 \n", - "-6.36 0.47 \n", - "4.04 6.28 \n", - "10000000.0 10000000.0 \n", - "-7.01 0.53 \n", - "4.85 0.24 \n", - "10000000.0 10000000.0 \n", - "-27.3 6.45 \n", - "10000000.0 10000000.0 \n", - "-10.7 1.43 \n", - "-14.68 1.32 \n", - "10000000.0 10000000.0 \n", - "-8.11 1.09 \n", - "10000000.0 10000000.0 \n", - "-9.2 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-20.34 1.79 \n", - "-20.34 1.79 \n", - "1.57 3.6 \n", - "-4.5 0.42 \n", - "10000000.0 10000000.0 \n", - "-0.06 0.45 \n", - "10000000.0 10000000.0 \n", - "-85.62 3.51 \n", - "10000000.0 10000000.0 \n", - "-14.03 9.25 \n", - "10000000.0 10000000.0 \n", - "-7.89 0.85 \n", - "10000000.0 10000000.0 \n", - "-9.86 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.75 0.95 \n", - "10000000.0 10000000.0 \n", - "-4.25 0.46 \n", - "-4.87 0.46 \n", - "-1.17 0.71 \n", - "-1.17 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.23 0.41 \n", - "1.95 0.63 \n", - "1.11 0.92 \n", - "1.11 0.92 \n", - "-106.01 0.91 \n", - "-106.01 0.91 \n", - "-4.36 5.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.9 \n", - "-11.08 0.84 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "-1.7 6.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "14.5 0.45 \n", - "14.5 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.19 0.32 \n", - "7.4 0.46 \n", - "7.19 0.32 \n", - "7.19 0.32 \n", - "7.19 0.32 \n", - "7.19 0.32 \n", - "10000000.0 10000000.0 \n", - "-7.19 0.32 \n", - "7.4 0.46 \n", - "-7.66 0.45 \n", - "-7.19 0.32 \n", - "-7.19 0.32 \n", - "-7.19 0.32 \n", - "7.19 0.32 \n", - "-0.28 0.38 \n", - "-3.8 0.45 \n", - "10000000.0 10000000.0 \n", - "-12.1 0.51 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.32 0.47 \n", - "-8.47 0.58 \n", - "-1.15 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.07 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.92 1.01 \n", - "-6.81 0.68 \n", - "-10.56 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-72.5 2.82 \n", - "-72.5 2.82 \n", - "-126.88 4.94 \n", - "-126.88 4.94 \n", - "-54.38 2.12 \n", - "-54.38 2.12 \n", - "None 1.94 \n", - "None 0.62 \n", - "None 0.59 \n", - "10000000.0 10000000.0 \n", - "None 0.48 \n", - "10000000.0 10000000.0 \n", - "None 2.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "None 7.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "-9.34 0.31 \n", - "-9.34 0.31 \n", - "-8.98 0.74 \n", - "-11.04 0.45 \n", - "-10.05 0.35 \n", - "None 0.54 \n", - "-10.28 0.36 \n", - "-10.79 0.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.12 \n", - "10000000.0 10000000.0 \n", - "None 2.18 \n", - "None None \n", - "None 1.44 \n", - "None 1.44 \n", - "None 0.72 \n", - "None 0.72 \n", - "None 0.86 \n", - "None 0.86 \n", - "None 0.54 \n", - "None 1.37 \n", - "None 2.19 \n", - "None 0.71 \n", - "None 1.94 \n", - "None 2.25 \n", - "None 1.16 \n", - "None 1.94 \n", - "None 1.85 \n", - "10000000.0 10000000.0 \n", - "None 1.15 \n", - "10000000.0 10000000.0 \n", - "None 1.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.16 \n", - "None 1.16 \n", - "None 2.38 \n", - "-6.16 0.07 \n", - "None 1.04 \n", - "None 2.35 \n", - "None 2.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.26 \n", - "None 1.94 \n", - "None 3.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.64 \n", - "10000000.0 10000000.0 \n", - "-6.81 4.9 \n", - "None 0.62 \n", - "None 0.64 \n", - "None 0.78 \n", - "10000000.0 10000000.0 \n", - "None 1.26 \n", - "10000000.0 10000000.0 \n", - "None 8.12 \n", - "None 2.21 \n", - "10000000.0 10000000.0 \n", - "None 0.35 \n", - "None 1.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.16 \n", - "None 11.54 \n", - "10000000.0 10000000.0 \n", - "None 1.9 \n", - "None 1.9 \n", - "10000000.0 10000000.0 \n", - "None 2.79 \n", - "None 4.57 \n", - "-9.32 0.31 \n", - "None 0.76 \n", - "None 1.85 \n", - "None 1.67 \n", - "None 1.95 \n", - "-6.81 4.77 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 2.14 \n", - "None 2.42 \n", - "None 2.36 \n", - "None 1.8 \n", - "None 0.34 \n", - "None 1.47 \n", - "10000000.0 10000000.0 \n", - "None 8.6 \n", - "None 3.8 \n", - "None 3.89 \n", - "None 3.95 \n", - "None 0.41 \n", - "None 0.71 \n", - "None 4.26 \n", - "10000000.0 10000000.0 \n", - "None 0.41 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.87 \n", - "None 2.96 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "None 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.75 \n", - "None 1.22 \n", - "None 1.98 \n", - "None 2.25 \n", - "None 0.25 \n", - "None 0.42 \n", - "None 4.27 \n", - "None 0.71 \n", - "None 0.69 \n", - "None 0.71 \n", - "-6.16 0.07 \n", - "None 6.08 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.69 \n", - "10000000.0 10000000.0 \n", - "None 2.14 \n", - "None 1.0 \n", - "None 1.91 \n", - "None 1.91 \n", - "None 1.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.94 \n", - "10000000.0 10000000.0 \n", - "None 1.1 \n", - "10000000.0 10000000.0 \n", - "None 4.3 \n", - "10000000.0 10000000.0 \n", - "None 4.3 \n", - "None 4.29 \n", - "None 5.37 \n", - "None 2.72 \n", - "None 2.72 \n", - "None 2.73 \n", - "None 4.21 \n", - "None 2.6 \n", - "None 2.59 \n", - "None 2.62 \n", - "None 3.8 \n", - "None 3.79 \n", - "None 2.55 \n", - "None 2.55 \n", - "None 2.56 \n", - "None 3.87 \n", - "None 3.87 \n", - "None 3.87 \n", - "None 2.5 \n", - "None 2.5 \n", - "None 2.67 \n", - "None 2.66 \n", - "None 2.69 \n", - "10000000.0 10000000.0 \n", - "None 3.9 \n", - "10000000.0 10000000.0 \n", - "None 1.24 \n", - "None 1.29 \n", - "None 2.14 \n", - "None 1.99 \n", - "None 1.9 \n", - "None 0.44 \n", - "None 0.78 \n", - "None 1.16 \n", - "None 2.5 \n", - "None 4.51 \n", - "None 1.77 \n", - "None 1.67 \n", - "None 1.46 \n", - "None 0.66 \n", - "None 1.88 \n", - "None 1.81 \n", - "None 0.35 \n", - "None 1.9 \n", - "None 1.27 \n", - "None 0.68 \n", - "10000000.0 10000000.0 \n", - "None 1.64 \n", - "None 1.47 \n", - "None 0.76 \n", - "None 1.9 \n", - "None 4.27 \n", - "None 2.18 \n", - "None 2.18 \n", - "None 0.92 \n", - "None 1.94 \n", - "None 1.94 \n", - "None 4.27 \n", - "None 6.41 \n", - "None 2.14 \n", - "10000000.0 10000000.0 \n", - "None 4.27 \n", - "None 5.84 \n", - "None 4.89 \n", - "None 4.89 \n", - "None 2.12 \n", - "None 3.92 \n", - "None 2.12 \n", - "None 6.01 \n", - "None 3.86 \n", - "None 3.92 \n", - "None 1.92 \n", - "None 1.94 \n", - "None 1.94 \n", - "None 1.94 \n", - "None 1.94 \n", - "None 1.92 \n", - "None 1.92 \n", - "None 2.01 \n", - "None 4.21 \n", - "None 2.18 \n", - "None 2.18 \n", - "None 4.27 \n", - "None 4.23 \n", - "None 4.27 \n", - "None 1.94 \n", - "None 1.13 \n", - "None 3.92 \n", - "None 1.4 \n", - "None 2.31 \n", - "None 4.27 \n", - "None 2.18 \n", - "None 4.27 \n", - "None 2.14 \n", - "None 15.0 \n", - "None 12.86 \n", - "None 17.14 \n", - "None 2.53 \n", - "None 2.67 \n", - "None 4.09 \n", - "None 1.94 \n", - "None 1.91 \n", - "None 2.79 \n", - "None 10.68 \n", - "None 6.11 \n", - "None 10.27 \n", - "None 12.4 \n", - "None 6.41 \n", - "None 6.02 \n", - "None 8.13 \n", - "None 6.02 \n", - "None 8.13 \n", - "None 1.73 \n", - "10000000.0 10000000.0 \n", - "None 3.68 \n", - "None 1.8 \n", - "None 1.87 \n", - "None 1.09 \n", - "None 1.88 \n", - "None 1.88 \n", - "None 1.88 \n", - "None 1.88 \n", - "None 1.9 \n", - "None 1.9 \n", - "None 1.88 \n", - "None 10.18 \n", - "None 1.94 \n", - "None 7.58 \n", - "None 2.4 \n", - "None 4.27 \n", - "None 2.4 \n", - "None 2.4 \n", - "None 2.55 \n", - "None 2.12 \n", - "None 2.12 \n", - "None 1.26 \n", - "None 14.95 \n", - "None 7.51 \n", - "None 2.22 \n", - "10000000.0 10000000.0 \n", - "None 2.14 \n", - "None 1.85 \n", - "None 2.18 \n", - "None 0.68 \n", - "None 2.18 \n", - "None 0.88 \n", - "None 0.74 \n", - "None 0.68 \n", - "None 1.4 \n", - "None 2.14 \n", - "None 2.18 \n", - "None 2.18 \n", - "10000000.0 10000000.0 \n", - "None 12.06 \n", - "None 1.02 \n", - "None 1.94 \n", - "None 0.91 \n", - "None 1.06 \n", - "None 1.0 \n", - "None 0.91 \n", - "10000000.0 10000000.0 \n", - "None 1.0 \n", - "None 2.31 \n", - "None 2.36 \n", - "None 1.16 \n", - "None 2.12 \n", - "None 1.02 \n", - "None 1.13 \n", - "10000000.0 10000000.0 \n", - "None 1.41 \n", - "None 1.16 \n", - "None 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.64 \n", - "None 1.47 \n", - "None 5.74 \n", - "None 1.9 \n", - "None 5.74 \n", - "None 5.74 \n", - "None 4.27 \n", - "None 2.18 \n", - "None 2.18 \n", - "None 4.27 \n", - "None 2.18 \n", - "None 0.92 \n", - "None 1.94 \n", - "None 1.92 \n", - "None 1.94 \n", - "None 7.58 \n", - "None 4.27 \n", - "None 6.41 \n", - "None 4.57 \n", - "None 2.14 \n", - "10000000.0 10000000.0 \n", - "None 4.27 \n", - "None 5.84 \n", - "None 4.89 \n", - "None 4.89 \n", - "None 2.12 \n", - "None 3.92 \n", - "None 2.12 \n", - "None 6.01 \n", - "None 3.86 \n", - "None 3.92 \n", - "None 1.92 \n", - "None 1.94 \n", - "None 1.94 \n", - "None 1.94 \n", - "None 1.94 \n", - "None 1.92 \n", - "None 1.92 \n", - "None 2.01 \n", - "None 4.21 \n", - "None 2.18 \n", - "None 2.18 \n", - "None 4.27 \n", - "None 4.23 \n", - "None 4.27 \n", - "None 1.94 \n", - "None 7.58 \n", - "None 1.4 \n", - "None 2.18 \n", - "None 1.4 \n", - "None 15.0 \n", - "None 12.86 \n", - "None 17.14 \n", - "None 2.53 \n", - "None 2.67 \n", - "None 4.09 \n", - "None 1.94 \n", - "None 1.91 \n", - "None 2.79 \n", - "None 10.68 \n", - "None 6.11 \n", - "None 10.27 \n", - "None 12.4 \n", - "None 6.41 \n", - "None 6.02 \n", - "None 8.13 \n", - "None 6.02 \n", - "None 8.13 \n", - "None 1.73 \n", - "10000000.0 10000000.0 \n", - "None 3.68 \n", - "None 1.8 \n", - "None 1.87 \n", - "None 1.09 \n", - "None 1.88 \n", - "None 1.88 \n", - "None 1.88 \n", - "None 1.88 \n", - "None 1.9 \n", - "None 1.9 \n", - "None 1.88 \n", - "None 10.18 \n", - "None 1.94 \n", - "None 7.58 \n", - "None 1.16 \n", - "None 2.4 \n", - "None 4.27 \n", - "None 2.4 \n", - "None 2.4 \n", - "None 2.55 \n", - "None 2.12 \n", - "None 1.91 \n", - "None 1.94 \n", - "None 2.12 \n", - "None 1.26 \n", - "None 14.95 \n", - "None 7.51 \n", - "None 2.22 \n", - "10000000.0 10000000.0 \n", - "None 2.14 \n", - "None 1.85 \n", - "None 2.18 \n", - "None 0.68 \n", - "None 2.18 \n", - "None 0.91 \n", - "None 0.74 \n", - "None 0.68 \n", - "None 2.18 \n", - "None 2.18 \n", - "None 0.49 \n", - "None 2.18 \n", - "None 2.18 \n", - "10000000.0 10000000.0 \n", - "None 12.06 \n", - "None 1.02 \n", - "None 1.94 \n", - "None 0.91 \n", - "None 1.06 \n", - "None 1.0 \n", - "None 0.91 \n", - "10000000.0 10000000.0 \n", - "None 1.0 \n", - "None 4.27 \n", - "None 8.53 \n", - "None 2.28 \n", - "None 2.31 \n", - "None 2.31 \n", - "None 2.19 \n", - "None 2.36 \n", - "None 2.12 \n", - "None 1.02 \n", - "10000000.0 10000000.0 \n", - "None 1.41 \n", - "None 0.74 \n", - "None 1.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 3.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.81 4.75 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.81 8.74 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 13.57 \n", - "-6.81 17.69 \n", - "-6.81 11.53 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 7.59 \n", - "None 4.3 \n", - "None 6.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 5.74 \n", - "None 5.74 \n", - "None 5.74 \n", - "None 7.58 \n", - "None 4.57 \n", - "10000000.0 10000000.0 \n", - "None 5.84 \n", - "None 7.58 \n", - "None 15.0 \n", - "None 12.86 \n", - "None 17.14 \n", - "None 10.68 \n", - "10000000.0 10000000.0 \n", - "None 7.58 \n", - "None 2.4 \n", - "None 4.27 \n", - "None 2.4 \n", - "None 2.4 \n", - "None 2.55 \n", - "None 12.06 \n", - "10000000.0 10000000.0 \n", - "None 7.58 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.3 \n", - "None 5.37 \n", - "None 2.72 \n", - "None 2.73 \n", - "None 4.21 \n", - "None 4.23 \n", - "None 2.6 \n", - "None 2.59 \n", - "None 2.62 \n", - "None 3.8 \n", - "None 3.79 \n", - "None 3.8 \n", - "None 2.55 \n", - "None 2.55 \n", - "None 2.56 \n", - "None 3.87 \n", - "None 3.89 \n", - "None 3.87 \n", - "None 2.5 \n", - "None 2.52 \n", - "None 2.67 \n", - "None 2.69 \n", - "None 2.21 \n", - "None 1.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.99 \n", - "None 3.68 \n", - "None 1.27 \n", - "10000000.0 10000000.0 \n", - "None 5.2 \n", - "10000000.0 10000000.0 \n", - "None 1.47 \n", - "10000000.0 10000000.0 \n", - "None 1.27 \n", - "None 4.47 \n", - "10000000.0 10000000.0 \n", - "None 2.91 \n", - "None 2.96 \n", - "None 5.54 \n", - "None 7.68 \n", - "None 7.65 \n", - "None 5.35 \n", - "None 6.9 \n", - "None 4.41 \n", - "None 4.26 \n", - "None 6.36 \n", - "None 4.17 \n", - "None 4.04 \n", - "None 4.14 \n", - "None 5.06 \n", - "None 5.23 \n", - "None 5.23 \n", - "None 5.23 \n", - "None 5.54 \n", - "None 4.37 \n", - "None 4.2 \n", - "None 4.41 \n", - "None 4.37 \n", - "None 4.37 \n", - "None 4.58 \n", - "None 4.89 \n", - "None 4.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.12 \n", - "0.64 0.48 \n", - "10000000.0 10000000.0 \n", - "-1.98 0.65 \n", - "-6.33 0.77 \n", - "-6.37 0.7 \n", - "-1.67 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.29 0.76 \n", - "10000000.0 10000000.0 \n", - "-90.63 6.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.32 1.06 \n", - "-6.28 0.55 \n", - "10000000.0 10000000.0 \n", - "0.03 0.34 \n", - "0.44 0.85 \n", - "-4.01 0.86 \n", - "-3.81 0.62 \n", - "-3.78 0.56 \n", - "-3.35 0.56 \n", - "-22.58 1.11 \n", - "-2.42 0.72 \n", - "-3.09 0.3 \n", - "-4.86 0.32 \n", - "-14.34 2.92 \n", - "-14.34 0.96 \n", - "-14.34 2.31 \n", - "-2.82 0.21 \n", - "-6.09 0.58 \n", - "-0.44 0.64 \n", - "97.86 0.39 \n", - "-22.57 1.11 \n", - "-22.58 1.11 \n", - "-2.46 0.07 \n", - "-2.79 0.26 \n", - "-7.08 0.97 \n", - "-2.65 0.53 \n", - "10000000.0 10000000.0 \n", - "-22.97 1.17 \n", - "-3.94 0.96 \n", - "10000000.0 10000000.0 \n", - "-5.49 0.18 \n", - "-5.3 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.26 6.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.01 0.86 \n", - "-4.43 0.87 \n", - "3.14 0.12 \n", - "-13.75 0.86 \n", - "6.3 0.96 \n", - "-7.27 0.59 \n", - "1.3 1.08 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "-0.18 0.36 \n", - "55.69 0.97 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.83 \n", - "-100.75 7.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.45 1.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-22.96 10.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.92 3.6 \n", - "10000000.0 10000000.0 \n", - "-95.83 6.54 \n", - "10000000.0 10000000.0 \n", - "None 9.31 \n", - "-72.92 13.72 \n", - "-16.97 8.27 \n", - "10000000.0 10000000.0 \n", - "-6.02 0.56 \n", - "-3.29 0.65 \n", - "10000000.0 10000000.0 \n", - "-2.79 0.3 \n", - "10000000.0 10000000.0 \n", - "-4.31 0.75 \n", - "-11.13 4.58 \n", - "-78.4 9.73 \n", - "54.28 7.88 \n", - "200.09 0.35 \n", - "10000000.0 10000000.0 \n", - "-65.98 8.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.35 5.45 \n", - "-16.76 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.24 0.86 \n", - "10000000.0 10000000.0 \n", - "-94.13 0.75 \n", - "10000000.0 10000000.0 \n", - "-40.52 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.99 8.21 \n", - "10000000.0 10000000.0 \n", - "-2.67 10.86 \n", - "9.59 5.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-95.07 0.74 \n", - "-69.98 3.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.67 0.27 \n", - "10000000.0 10000000.0 \n", - "-22.58 1.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.91 1.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 4.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-198.42 18.99 \n", - "-1.17 0.9 \n", - "10000000.0 10000000.0 \n", - "-34.54 1.84 \n", - "10000000.0 10000000.0 \n", - "-21.34 7.18 \n", - "4.39 0.24 \n", - "10000000.0 10000000.0 \n", - "-8.48 0.27 \n", - "10000000.0 10000000.0 \n", - "-13.27 4.92 \n", - "-18.75 0.66 \n", - "-0.74 9.0 \n", - "10000000.0 10000000.0 \n", - "0.14 0.76 \n", - "10000000.0 10000000.0 \n", - "2.0 0.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.3 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.42 0.55 \n", - "10000000.0 10000000.0 \n", - "-88.54 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.87 0.56 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-106.05 1.23 \n", - "10000000.0 10000000.0 \n", - "-2.0 0.53 \n", - "-29.54 8.86 \n", - "9.99 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.21 1.15 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.32 0.45 \n", - "10000000.0 10000000.0 \n", - "126.15 13.43 \n", - "-26.44 9.74 \n", - "-5.66 0.34 \n", - "10000000.0 10000000.0 \n", - "3.39 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.51 3.48 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "-94.2 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.41 0.31 \n", - "9.97 5.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "-13.48 0.98 \n", - "223.04 1.0 \n", - "-94.13 0.75 \n", - "-0.49 0.41 \n", - "-19.23 2.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-86.53 5.81 \n", - "6.48 1.0 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "-117.19 10.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.63 3.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-45.61 5.06 \n", - "10000000.0 10000000.0 \n", - "-4.36 11.1 \n", - "3.76 6.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-207.61 2.41 \n", - "-6.16 0.07 \n", - "-2.82 0.98 \n", - "3.11 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.14 0.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.72 2.11 \n", - "6.25 13.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.24 5.03 \n", - "10000000.0 10000000.0 \n", - "-21.89 1.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.14 0.76 \n", - "13.27 0.43 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 10.1 \n", - "10000000.0 10000000.0 \n", - "-4.05 7.18 \n", - "10000000.0 10000000.0 \n", - "-3.88 0.56 \n", - "-4.15 0.51 \n", - "-14.03 11.03 \n", - "116.63 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-213.4 13.01 \n", - "-2.17 0.53 \n", - "-40.05 2.16 \n", - "-26.84 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-107.56 1.33 \n", - "-4.36 6.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.22 3.07 \n", - "10000000.0 10000000.0 \n", - "-10.46 5.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.51 8.66 \n", - "-9.45 0.51 \n", - "10000000.0 10000000.0 \n", - "10.93 5.09 \n", - "-14.27 0.34 \n", - "10000000.0 10000000.0 \n", - "6.48 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "120.89 2.46 \n", - "10000000.0 10000000.0 \n", - "-17.62 0.92 \n", - "-90.63 6.26 \n", - "-1.21 0.54 \n", - "10000000.0 10000000.0 \n", - "142.02 2.84 \n", - "-4.03 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.9 0.49 \n", - "-2.79 0.79 \n", - "10000000.0 10000000.0 \n", - "-3.11 4.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.96 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.69 0.61 \n", - "-2.16 0.33 \n", - "-13.15 7.39 \n", - "10000000.0 10000000.0 \n", - "457.6 1.88 \n", - "10000000.0 10000000.0 \n", - "-18.46 1.09 \n", - "10000000.0 10000000.0 \n", - "-3.89 0.79 \n", - "None 6.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-98.05 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.32 6.94 \n", - "10000000.0 10000000.0 \n", - "-15.63 3.0 \n", - "None 2.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "19.12 6.0 \n", - "10.72 2.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-25.38 7.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.84 0.41 \n", - "10000000.0 10000000.0 \n", - "-17.46 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-44.49 2.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-91.65 4.65 \n", - "10000000.0 10000000.0 \n", - "-0.52 0.41 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.14 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.7 0.1 \n", - "10000000.0 10000000.0 \n", - "None 1.88 \n", - "10000000.0 10000000.0 \n", - "196.93 0.44 \n", - "10000000.0 10000000.0 \n", - "-90.63 6.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.13 4.71 \n", - "-3.11 14.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.02 0.56 \n", - "9.6 1.73 \n", - "10000000.0 10000000.0 \n", - "-130.02 5.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 4.89 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "-18.75 0.66 \n", - "-3.33 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.17 1.07 \n", - "-20.37 22.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.35 \n", - "10000000.0 10000000.0 \n", - "0.86 0.56 \n", - "-109.84 1.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.24 0.27 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "-3.88 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.04 0.55 \n", - "-1.7 5.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.75 1.76 \n", - "-2.18 0.53 \n", - "-14.03 6.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "14.27 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-75.36 8.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.7 \n", - "-0.05 0.55 \n", - "-4.5 6.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.81 1.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 6.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "571.22 1.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.05 0.55 \n", - "10000000.0 10000000.0 \n", - "424.49 2.63 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.61 0.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.05 6.25 \n", - "10000000.0 10000000.0 \n", - "-0.92 2.06 \n", - "-23.89 9.23 \n", - "-1.01 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.46 7.09 \n", - "4.52 1.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-114.38 1.15 \n", - "-3.76 11.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.34 11.16 \n", - "-2.78 1.11 \n", - "1.42 0.85 \n", - "10000000.0 10000000.0 \n", - "0.18 1.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.13 0.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.56 0.9 \n", - "-31.45 6.18 \n", - "-3.29 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.9 1.64 \n", - "-2.95 1.82 \n", - "10000000.0 10000000.0 \n", - "1.24 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.89 0.24 \n", - "3.68 2.4 \n", - "-4.7 0.75 \n", - "10000000.0 10000000.0 \n", - "-2.28 0.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.71 1.17 \n", - "9.59 5.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.13 1.64 \n", - "-9.87 1.85 \n", - "10000000.0 10000000.0 \n", - "-5.72 1.34 \n", - "10000000.0 10000000.0 \n", - "-2.63 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.18 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 5.56 \n", - "-0.46 7.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "44.77 1.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.51 0.46 \n", - "9.85 8.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-100.63 1.78 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-23.57 10.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.84 0.75 \n", - "-0.18 0.36 \n", - "5.2 5.26 \n", - "16.58 0.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-95.63 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-48.33 5.01 \n", - "-4.36 6.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.21 \n", - "-99.17 1.12 \n", - "10000000.0 10000000.0 \n", - "0.85 0.65 \n", - "-20.03 1.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 1.63 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "148.82 2.35 \n", - "-7.38 4.46 \n", - "-5.45 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.01 0.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-175.97 2.96 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.76 6.69 \n", - "-0.46 1.62 \n", - "-10.96 0.39 \n", - "5.14 1.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-108.28 1.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "-194.4 1.6 \n", - "-56.98 4.99 \n", - "-130.02 5.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-83.01 2.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-68.9 1.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-101.89 1.16 \n", - "-18.0 5.04 \n", - "10000000.0 10000000.0 \n", - "-1.83 1.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.34 1.38 \n", - "10000000.0 10000000.0 \n", - "-4.57 0.91 \n", - "10000000.0 10000000.0 \n", - "-11.83 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.03 0.58 \n", - "10000000.0 10000000.0 \n", - "-1.83 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.12 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-20.64 8.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.46 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.24 1.65 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.1 3.32 \n", - "10000000.0 10000000.0 \n", - "6.18 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.21 0.92 \n", - "None None \n", - "-26.9 2.96 \n", - "-4.36 7.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.15 0.94 \n", - "14.27 0.34 \n", - "-6.16 0.07 \n", - "-4.95 0.47 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.02 \n", - "-1.7 36.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.12 1.07 \n", - "21.7 1.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.88 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.13 4.82 \n", - "-76.61 4.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 3.03 \n", - "9.53 8.67 \n", - "-14.03 9.6 \n", - "14.58 4.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.93 0.53 \n", - "4.87 0.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "11.97 2.69 \n", - "-13.21 1.07 \n", - "-3.25 7.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.17 0.81 \n", - "-3.82 0.44 \n", - "-72.84 2.49 \n", - "-10.76 9.05 \n", - "-6.73 0.55 \n", - "-3.35 0.3 \n", - "10000000.0 10000000.0 \n", - "-10.74 2.38 \n", - "10000000.0 10000000.0 \n", - "-1.7 8.11 \n", - "10000000.0 10000000.0 \n", - "-194.4 1.6 \n", - "4.89 0.25 \n", - "10000000.0 10000000.0 \n", - "-8.7 0.26 \n", - "1.39 5.32 \n", - "-5.68 0.95 \n", - "10000000.0 10000000.0 \n", - "-5.5 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.37 0.76 \n", - "-88.3 1.92 \n", - "10000000.0 10000000.0 \n", - "-8.15 1.08 \n", - "-76.08 10.23 \n", - "10000000.0 10000000.0 \n", - "-48.98 8.47 \n", - "10000000.0 10000000.0 \n", - "None 1.07 \n", - "None None \n", - "-4.36 6.35 \n", - "10000000.0 10000000.0 \n", - "4.29 4.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.01 0.3 \n", - "4.52 1.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.55 7.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.61 8.95 \n", - "10000000.0 10000000.0 \n", - "-9.06 0.26 \n", - "-0.46 1.49 \n", - "-4.05 7.34 \n", - "10000000.0 10000000.0 \n", - "0.58 0.59 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "6.48 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "30.36 6.91 \n", - "10000000.0 10000000.0 \n", - "-5.84 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.48 0.39 \n", - "-0.18 0.36 \n", - "18.9 1.26 \n", - "-0.69 0.17 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.31 2.13 \n", - "10000000.0 10000000.0 \n", - "59.92 3.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-281.44 9.14 \n", - "10000000.0 10000000.0 \n", - "-2.14 2.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.53 8.39 \n", - "10000000.0 10000000.0 \n", - "4.52 1.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.43 2.31 \n", - "4.24 5.02 \n", - "-0.71 0.76 \n", - "-13.12 0.99 \n", - "10000000.0 10000000.0 \n", - "-105.51 1.72 \n", - "506.24 4.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.43 9.95 \n", - "10000000.0 10000000.0 \n", - "-3.62 0.45 \n", - "-32.05 1.14 \n", - "10000000.0 10000000.0 \n", - "-4.62 1.33 \n", - "10000000.0 10000000.0 \n", - "-0.54 0.38 \n", - "-0.37 0.55 \n", - "-3.04 0.42 \n", - "-2.94 3.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.94 0.17 \n", - "10000000.0 10000000.0 \n", - "-124.4 2.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-98.05 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.85 0.65 \n", - "10000000.0 10000000.0 \n", - "-3.11 7.33 \n", - "96.34 10.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "-4.36 6.28 \n", - "-13.15 1.07 \n", - "-19.51 1.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.6 0.3 \n", - "-0.34 1.02 \n", - "-0.57 1.12 \n", - "10000000.0 10000000.0 \n", - "-0.98 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.71 2.4 \n", - "-4.21 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.88 0.53 \n", - "10000000.0 10000000.0 \n", - "1.4 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.83 0.86 \n", - "None 11.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.33 0.3 \n", - "10000000.0 10000000.0 \n", - "-62.92 0.36 \n", - "-28.67 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-255.74 1.15 \n", - "-127.87 0.57 \n", - "112.49 0.6 \n", - "-63.23 0.34 \n", - "-161.65 0.45 \n", - "-160.81 0.38 \n", - "-373.63 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-161.84 0.37 \n", - "-126.2 0.7 \n", - "119.44 0.66 \n", - "156.78 7.34 \n", - "-166.71 0.3 \n", - "-166.51 0.36 \n", - "-64.58 0.19 \n", - "-165.9 0.57 \n", - "-184.1 1.79 \n", - "-64.18 0.33 \n", - "-379.34 0.38 \n", - "-377.25 0.63 \n", - "-379.53 0.29 \n", - "-96.24 0.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.04 0.28 \n", - "-95.43 1.24 \n", - "-166.06 0.35 \n", - "-609.34 2.43 \n", - "-181.43 0.62 \n", - "10000000.0 10000000.0 \n", - "-17.09 3.54 \n", - "10000000.0 10000000.0 \n", - "11.65 0.71 \n", - "333.88 0.31 \n", - "-16.47 1.01 \n", - "10000000.0 10000000.0 \n", - "2.24 1.84 \n", - "-284.26 0.95 \n", - "34.6 0.74 \n", - "14.04 0.24 \n", - "-141.33 0.56 \n", - "234.13 3.51 \n", - "301.66 1.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.34 0.34 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.03 0.53 \n", - "-2.18 0.53 \n", - "-20.08 2.27 \n", - "46.75 1.89 \n", - "-190.44 12.87 \n", - "10000000.0 10000000.0 \n", - "36.55 4.25 \n", - "-105.97 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "79.64 6.97 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-116.35 1.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-28.4 5.42 \n", - "-5.33 6.57 \n", - "-3.21 5.18 \n", - "11.04 4.48 \n", - "-41.76 7.45 \n", - "54.66 5.91 \n", - "109.41 7.05 \n", - "89.95 0.37 \n", - "89.75 0.37 \n", - "-5.62 2.59 \n", - "3.13 0.97 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-116.52 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-31.43 2.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.53 0.8 \n", - "10000000.0 10000000.0 \n", - "15.46 1.01 \n", - "-53.62 0.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-89.59 0.37 \n", - "-80.97 0.63 \n", - "10000000.0 10000000.0 \n", - "-11.9 5.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.45 1.04 \n", - "9.37 2.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.43 0.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-101.27 79.49 \n", - "-40.25 2.59 \n", - "-29.75 2.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-115.73 1.59 \n", - "-12.56 6.38 \n", - "-12.56 3.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "-0.28 0.37 \n", - "-4.52 1.9 \n", - "-95.07 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.54 0.35 \n", - "-95.07 0.74 \n", - "-15.54 0.35 \n", - "-4.52 1.9 \n", - "-79.81 0.75 \n", - "-15.54 0.35 \n", - "-81.94 0.8 \n", - "-15.54 0.35 \n", - "-95.07 0.74 \n", - "-95.07 0.74 \n", - "-95.07 0.74 \n", - "-97.48 0.85 \n", - "-97.48 0.85 \n", - "-97.48 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-27.25 1.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "15.54 0.35 \n", - "10000000.0 10000000.0 \n", - "-15.54 0.35 \n", - "15.54 0.35 \n", - "10000000.0 10000000.0 \n", - "-26.34 1.67 \n", - "15.54 0.35 \n", - "15.54 0.35 \n", - "-81.94 0.8 \n", - "11.92 1.1 \n", - "17.07 7.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.52 1.9 \n", - "1.63 1.66 \n", - "1.99 9.77 \n", - "-4.5 9.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.99 0.31 \n", - "1.99 9.76 \n", - "-4.5 9.72 \n", - "10.74 1.9 \n", - "-13.87 0.31 \n", - "-5.93 0.97 \n", - "30.79 0.38 \n", - "-20.22 0.96 \n", - "-8.82 9.8 \n", - "17.25 1.0 \n", - "17.25 0.43 \n", - "-22.91 1.01 \n", - "-20.64 5.57 \n", - "-14.92 1.4 \n", - "-14.92 1.4 \n", - "-20.64 5.74 \n", - "10.3 11.47 \n", - "14.27 0.34 \n", - "17.25 0.43 \n", - "19.66 0.39 \n", - "-69.79 0.78 \n", - "45.39 1.55 \n", - "45.39 1.55 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "-125.1 2.77 \n", - "1.56 1.73 \n", - "-0.38 0.45 \n", - "-0.99 0.31 \n", - "22.7 0.78 \n", - "-0.38 0.45 \n", - "46.38 1.46 \n", - "-4.36 11.25 \n", - "-0.38 0.45 \n", - "22.7 0.78 \n", - "-4.36 11.69 \n", - "-90.63 0.77 \n", - "-90.63 0.77 \n", - "-4.36 10.53 \n", - "-0.38 0.45 \n", - "-4.36 10.24 \n", - "-40.48 0.31 \n", - "-40.48 0.31 \n", - "-8.25 8.5 \n", - "14.65 8.23 \n", - "21.75 8.61 \n", - "-4.36 10.21 \n", - "-0.38 0.45 \n", - "-90.63 0.77 \n", - "-90.63 0.77 \n", - "-0.38 0.45 \n", - "-21.7 0.82 \n", - "-18.94 1.93 \n", - "-40.64 2.05 \n", - "-0.38 0.45 \n", - "-60.45 1.03 \n", - "10000000.0 10000000.0 \n", - "-60.45 1.03 \n", - "10000000.0 10000000.0 \n", - "-117.75 0.56 \n", - "-56.02 0.43 \n", - "-40.48 0.31 \n", - "15.54 0.35 \n", - "-77.26 0.42 \n", - "40.49 1.03 \n", - "-40.48 0.31 \n", - "-102.07 0.62 \n", - "-40.48 0.31 \n", - "-56.02 0.43 \n", - "-40.48 0.31 \n", - "-40.48 0.31 \n", - "-37.89 3.87 \n", - "-40.48 0.31 \n", - "-56.02 0.43 \n", - "-56.02 0.43 \n", - "-56.02 0.43 \n", - "-40.48 0.31 \n", - "-40.48 0.31 \n", - "-56.02 0.43 \n", - "-40.48 0.31 \n", - "-56.02 0.43 \n", - "-7.75 1.12 \n", - "-0.78 0.68 \n", - "-34.98 9.36 \n", - "15.54 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.05 0.32 \n", - "2.22 0.33 \n", - "2.22 0.33 \n", - "114.47 1.07 \n", - "156.79 1.22 \n", - "199.11 1.37 \n", - "1.83 0.32 \n", - "1.83 0.32 \n", - "1.83 0.32 \n", - "156.79 1.22 \n", - "199.11 1.37 \n", - "241.42 1.53 \n", - "156.79 1.22 \n", - "156.79 1.22 \n", - "156.79 1.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.72 0.82 \n", - "-2.81 4.39 \n", - "-5.98 1.06 \n", - "10000000.0 10000000.0 \n", - "-5.72 0.82 \n", - "10000000.0 10000000.0 \n", - "35.44 13.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-75.57 1.47 \n", - "-14.68 1.18 \n", - "10000000.0 10000000.0 \n", - "6.48 0.85 \n", - "-8.49 1.17 \n", - "-44.4 2.74 \n", - "-7.15 0.85 \n", - "-7.15 0.85 \n", - "2.81 0.97 \n", - "5.28 1.21 \n", - "10000000.0 10000000.0 \n", - "-7.85 7.07 \n", - "10000000.0 10000000.0 \n", - "-34.59 5.98 \n", - "10000000.0 10000000.0 \n", - "1.4 0.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-39.74 2.33 \n", - "-47.96 2.47 \n", - "-44.9 2.32 \n", - "-5.22 0.84 \n", - "-0.08 1.03 \n", - "769.66 1.99 \n", - "-2.96 0.92 \n", - "-109.25 0.25 \n", - "-58.45 0.54 \n", - "260.65 1.26 \n", - "-71.03 1.84 \n", - "-3.06 0.93 \n", - "7.82 0.58 \n", - "1.1 1.33 \n", - "9.53 8.8 \n", - "-5.94 1.33 \n", - "-53.6 3.05 \n", - "0.43 0.74 \n", - "-92.74 0.84 \n", - "-7.28 0.45 \n", - "-7.28 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.79 0.8 \n", - "-1.39 1.02 \n", - "-5.5 0.33 \n", - "-3.0 0.48 \n", - "4.03 0.35 \n", - "-9.04 1.71 \n", - "0.38 1.18 \n", - "10000000.0 10000000.0 \n", - "-4.73 0.54 \n", - "-68.24 3.55 \n", - "-68.24 3.55 \n", - "-71.21 1.84 \n", - "-58.14 0.55 \n", - "-53.6 3.57 \n", - "7.53 2.32 \n", - "-30.95 2.22 \n", - "-0.12 2.26 \n", - "-36.62 4.98 \n", - "-21.61 5.28 \n", - "-20.76 0.65 \n", - "70.5 3.45 \n", - "23.32 0.94 \n", - "-80.03 1.55 \n", - "40.34 0.61 \n", - "10000000.0 10000000.0 \n", - "-68.24 3.19 \n", - "-68.24 3.19 \n", - "-95.67 1.04 \n", - "-70.68 1.84 \n", - "-83.36 2.14 \n", - "-3.29 2.31 \n", - "-82.17 2.13 \n", - "-20.25 1.89 \n", - "10000000.0 10000000.0 \n", - "-39.8 5.33 \n", - "-18.47 1.31 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "-105.93 0.91 \n", - "-14.12 3.2 \n", - "3.51 0.49 \n", - "-96.87 12.62 \n", - "-97.22 0.8 \n", - "-11.91 3.41 \n", - "23.21 0.94 \n", - "3.95 2.4 \n", - "-0.7 0.53 \n", - "3.83 2.4 \n", - "-0.7 0.53 \n", - "23.32 0.94 \n", - "-11.91 3.3 \n", - "-3.53 5.85 \n", - "9.34 2.83 \n", - "-39.13 5.05 \n", - "10000000.0 10000000.0 \n", - "-15.88 7.42 \n", - "3.82 2.4 \n", - "-6.44 1.52 \n", - "-0.68 0.53 \n", - "103.03 0.52 \n", - "53.85 2.37 \n", - "-4.59 1.49 \n", - "-2.57 1.71 \n", - "-14.69 4.72 \n", - "14.05 3.2 \n", - "-15.13 4.29 \n", - "17.34 4.25 \n", - "-13.2 1.07 \n", - "-0.68 0.53 \n", - "103.03 0.52 \n", - "70.88 0.98 \n", - "-0.9 5.62 \n", - "-20.11 0.84 \n", - "-73.8 7.66 \n", - "-32.24 7.57 \n", - "-15.88 9.06 \n", - "-47.99 8.16 \n", - "23.32 0.94 \n", - "-32.24 7.57 \n", - "-15.88 9.06 \n", - "-13.2 1.07 \n", - "-0.68 0.53 \n", - "103.03 0.52 \n", - "70.88 0.98 \n", - "-0.93 0.53 \n", - "3.71 0.88 \n", - "-4.44 0.24 \n", - "-0.18 0.36 \n", - "-14.27 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.13 4.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-105.97 0.91 \n", - "-97.22 0.8 \n", - "-97.22 0.8 \n", - "10000000.0 10000000.0 \n", - "4.98 6.52 \n", - "10000000.0 10000000.0 \n", - "-3.1 0.54 \n", - "89.95 0.37 \n", - "-32.58 1.94 \n", - "10000000.0 10000000.0 \n", - "-95.69 1.04 \n", - "10000000.0 10000000.0 \n", - "-82.85 1.89 \n", - "10000000.0 10000000.0 \n", - "-14.03 10.97 \n", - "-14.03 11.03 \n", - "-63.75 2.98 \n", - "-30.52 3.57 \n", - "-62.48 1.36 \n", - "-11.68 0.39 \n", - "-57.69 1.86 \n", - "-32.12 3.67 \n", - "-136.02 0.35 \n", - "-136.19 0.5 \n", - "10000000.0 10000000.0 \n", - "-270.44 1.82 \n", - "-49.25 0.53 \n", - "-72.01 1.74 \n", - "-1.06 6.99 \n", - "-5.2 5.32 \n", - "10000000.0 10000000.0 \n", - "8.07 1.65 \n", - "-1.49 0.35 \n", - "-9.43 0.65 \n", - "-47.78 0.23 \n", - "-3.54 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "-16.89 8.21 \n", - "-40.48 0.31 \n", - "-40.48 0.31 \n", - "-158.48 9.45 \n", - "-154.53 0.84 \n", - "-49.61 0.85 \n", - "-53.35 1.08 \n", - "-53.35 1.08 \n", - "-34.54 1.84 \n", - "-18.94 1.93 \n", - "-36.77 1.13 \n", - "6.53 5.09 \n", - "13.87 5.18 \n", - "-34.54 1.84 \n", - "-18.94 1.93 \n", - "-18.94 1.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-96.51 0.66 \n", - "4.87 3.68 \n", - "-69.98 2.5 \n", - "4.87 3.68 \n", - "-25.44 2.52 \n", - "3.71 2.83 \n", - "-20.34 2.14 \n", - "-69.98 2.5 \n", - "-20.34 2.05 \n", - "-1.11 2.92 \n", - "None None \n", - "-1.82 0.53 \n", - "-13.09 1.07 \n", - "-13.19 1.07 \n", - "-1.91 0.53 \n", - "-3.88 0.56 \n", - "-3.88 0.56 \n", - "-3.88 0.56 \n", - "10000000.0 10000000.0 \n", - "-5.81 0.35 \n", - "-2.18 0.53 \n", - "-2.18 0.53 \n", - "7.78 2.16 \n", - "0.67 0.55 \n", - "0.56 0.55 \n", - "-21.55 6.89 \n", - "-2.3 9.28 \n", - "2.16 5.6 \n", - "3.76 8.25 \n", - "7.06 7.4 \n", - "-2.3 9.24 \n", - "2.16 5.53 \n", - "3.76 8.2 \n", - "7.06 7.35 \n", - "-2.3 9.21 \n", - "2.16 5.48 \n", - "3.76 8.16 \n", - "7.06 7.31 \n", - "-37.56 1.35 \n", - "23.36 0.94 \n", - "-5.75 5.23 \n", - "-5.97 0.42 \n", - "-44.51 2.54 \n", - "23.45 0.94 \n", - "23.25 0.94 \n", - "46.7 1.89 \n", - "10000000.0 10000000.0 \n", - "-77.69 2.24 \n", - "-0.68 0.53 \n", - "-20.02 2.27 \n", - "-13.08 1.07 \n", - "-12.83 1.07 \n", - "-13.58 1.07 \n", - "-159.34 5.24 \n", - "873.99 2.56 \n", - "-3.8 6.26 \n", - "1.47 1.12 \n", - "-6.74 6.0 \n", - "-6.74 6.16 \n", - "-6.74 6.16 \n", - "-6.74 6.0 \n", - "-13.08 1.07 \n", - "-18.21 1.27 \n", - "-36.41 2.53 \n", - "-1.97 0.53 \n", - "10000000.0 10000000.0 \n", - "-2.0 0.53 \n", - "-2.0 0.53 \n", - "-1.91 0.53 \n", - "-2.15 0.53 \n", - "-4.16 0.51 \n", - "10000000.0 10000000.0 \n", - "10.66 0.78 \n", - "-0.18 0.36 \n", - "4.44 0.24 \n", - "7.19 0.32 \n", - "-1.02 0.53 \n", - "-99.63 0.89 \n", - "-109.18 3.34 \n", - "36.24 2.8 \n", - "-11.23 2.19 \n", - "-49.69 2.16 \n", - "-2.15 0.53 \n", - "-49.24 0.53 \n", - "10000000.0 10000000.0 \n", - "13.25 2.44 \n", - "-95.3 1.99 \n", - "-91.94 1.9 \n", - "10.66 0.78 \n", - "-0.18 0.36 \n", - "4.44 0.24 \n", - "7.19 0.32 \n", - "-99.63 0.89 \n", - "-99.91 0.89 \n", - "-99.91 0.89 \n", - "-99.63 0.89 \n", - "-99.63 0.89 \n", - "-116.57 2.31 \n", - "-116.58 2.3 \n", - "-99.34 0.89 \n", - "-99.34 0.89 \n", - "-99.38 0.89 \n", - "-99.38 0.89 \n", - "-100.35 0.96 \n", - "-100.36 0.96 \n", - "-100.32 0.96 \n", - "-100.32 0.96 \n", - "-83.41 2.27 \n", - "-83.41 2.27 \n", - "-99.67 0.89 \n", - "-99.67 0.89 \n", - "-99.62 0.89 \n", - "-99.62 0.89 \n", - "-116.53 2.31 \n", - "-116.54 2.3 \n", - "-28.17 1.16 \n", - "-28.26 1.16 \n", - "-28.17 1.16 \n", - "-90.7 0.91 \n", - "-106.21 3.02 \n", - "-79.24 2.1 \n", - "-93.66 1.44 \n", - "13.97 0.96 \n", - "-4.89 0.24 \n", - "-2.4 1.03 \n", - "-42.95 3.91 \n", - "-42.88 3.91 \n", - "-42.94 3.91 \n", - "-6.6 2.23 \n", - "-6.6 2.23 \n", - "-6.6 2.23 \n", - "-109.84 1.17 \n", - "-49.24 0.53 \n", - "-23.33 1.22 \n", - "-109.84 1.17 \n", - "-110.08 3.29 \n", - "-0.47 0.38 \n", - "0.75 6.9 \n", - "-15.73 0.35 \n", - "-14.05 3.25 \n", - "-105.97 0.91 \n", - "-26.44 3.74 \n", - "22.62 0.94 \n", - "-110.1 2.25 \n", - "-158.48 3.81 \n", - "-70.85 0.98 \n", - "-109.95 2.25 \n", - "-109.98 2.25 \n", - "-117.49 4.26 \n", - "-49.28 0.53 \n", - "23.32 0.94 \n", - "-0.87 5.21 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.09 1.07 \n", - "-3.83 0.39 \n", - "-124.86 3.02 \n", - "-6.51 2.23 \n", - "-25.93 0.84 \n", - "-25.93 0.84 \n", - "10000000.0 10000000.0 \n", - "-12.8 0.49 \n", - "23.43 0.94 \n", - "10000000.0 10000000.0 \n", - "23.32 0.94 \n", - "-95.83 6.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "33.04 2.24 \n", - "-3.8 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-184.59 1.24 \n", - "98.49 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-109.81 1.17 \n", - "-12.57 1.08 \n", - "-13.19 1.1 \n", - "-15.13 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "14.98 2.36 \n", - "-6.85 0.8 \n", - "1.95 7.82 \n", - "-4.38 1.33 \n", - "-6.77 0.31 \n", - "-6.35 0.31 \n", - "-6.77 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.13 0.25 \n", - "1.99 0.41 \n", - "0.13 0.25 \n", - "-3.35 0.3 \n", - "10000000.0 10000000.0 \n", - "-3.35 0.3 \n", - "0.89 0.62 \n", - "0.89 0.62 \n", - "-0.73 4.41 \n", - "-3.78 0.6 \n", - "-1.7 5.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.35 0.3 \n", - "0.89 0.62 \n", - "-121.99 3.34 \n", - "-120.41 3.42 \n", - "4.89 0.25 \n", - "4.89 0.25 \n", - "4.89 0.25 \n", - "-8.68 0.26 \n", - "-8.68 0.26 \n", - "-21.55 6.66 \n", - "10000000.0 10000000.0 \n", - "-0.19 0.33 \n", - "-7.06 7.13 \n", - "-7.12 9.02 \n", - "2.66 5.17 \n", - "2.21 7.97 \n", - "-7.06 7.1 \n", - "-8.68 0.26 \n", - "5.82 0.35 \n", - "None None \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.4 0.86 \n", - "-3.85 1.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.47 \n", - "None 0.47 \n", - "None 0.47 \n", - "None 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 5.36 \n", - "None 4.2 \n", - "None 5.03 \n", - "None 4.17 \n", - "None 0.62 \n", - "None 0.62 \n", - "None 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.23 0.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.36 1.06 \n", - "None 1.53 \n", - "None 4.29 \n", - "None 2.72 \n", - "None 3.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-55.7 2.54 \n", - "-35.81 4.45 \n", - "-53.4 2.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.23 4.63 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-33.35 2.77 \n", - "-39.25 1.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-52.55 3.91 \n", - "-53.4 2.73 \n", - "-53.4 2.73 \n", - "-27.76 3.44 \n", - "-27.76 3.44 \n", - "-27.76 3.44 \n", - "-44.58 2.57 \n", - "-53.4 2.73 \n", - "-53.4 2.73 \n", - "-53.4 2.73 \n", - "-53.4 2.73 \n", - "-53.4 2.73 \n", - "-53.4 2.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-58.63 3.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-81.74 2.47 \n", - "-101.31 2.19 \n", - "-93.57 0.91 \n", - "-93.57 0.91 \n", - "10000000.0 10000000.0 \n", - "-16.29 4.6 \n", - "-80.71 1.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.91 0.28 \n", - "4.44 0.24 \n", - "-113.53 0.87 \n", - "-50.97 4.75 \n", - "-3.33 0.96 \n", - "-3.33 0.96 \n", - "5.03 0.45 \n", - "10000000.0 10000000.0 \n", - "-16.03 3.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-78.49 1.57 \n", - "-82.24 1.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-112.0 4.39 \n", - "0.94 7.39 \n", - "-8.04 0.71 \n", - "5.9 0.61 \n", - "-3.62 0.45 \n", - "None None \n", - "-0.94 7.39 \n", - "-8.04 0.71 \n", - "62.27 1.18 \n", - "-10.46 5.4 \n", - "-13.11 5.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-115.07 8.34 \n", - "-115.07 9.92 \n", - "-98.3 0.83 \n", - "-48.33 5.17 \n", - "-48.33 5.4 \n", - "-104.86 1.27 \n", - "-64.75 6.42 \n", - "-100.27 7.87 \n", - "-64.75 8.97 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.28 0.45 \n", - "-6.36 0.45 \n", - "-6.38 0.45 \n", - "-6.53 0.45 \n", - "-6.5 0.45 \n", - "-6.26 0.45 \n", - "-6.34 0.45 \n", - "-0.01 None \n", - "-0.02 None \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.04 0.64 \n", - "8.04 0.64 \n", - "8.04 0.64 \n", - "8.16 0.64 \n", - "8.16 0.64 \n", - "8.19 0.64 \n", - "8.16 0.64 \n", - "-105.96 0.91 \n", - "-4.36 7.67 \n", - "-97.2 0.8 \n", - "-81.39 6.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.25 0.9 \n", - "-3.43 0.48 \n", - "24.01 3.68 \n", - "-62.8 4.2 \n", - "-11.73 0.56 \n", - "11.82 3.81 \n", - "-12.68 1.02 \n", - "-29.02 1.94 \n", - "-10.37 0.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.89 0.25 \n", - "3.78 0.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.94 0.49 \n", - "-1.35 0.35 \n", - "-5.04 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.78 1.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.79 0.63 \n", - "-1.63 0.33 \n", - "-1.63 0.33 \n", - "-6.56 0.74 \n", - "-3.79 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.08 0.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.44 1.49 \n", - "-36.61 1.12 \n", - "-8.63 0.26 \n", - "-59.88 1.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.44 1.59 \n", - "-70.77 1.77 \n", - "-8.63 0.26 \n", - "-6.66 0.55 \n", - "-6.73 0.55 \n", - "-5.71 0.77 \n", - "-4.31 0.75 \n", - "-13.25 0.96 \n", - "16.38 1.02 \n", - "None None \n", - "-6.73 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.5 0.55 \n", - "10000000.0 10000000.0 \n", - "-393.65 14.47 \n", - "-279.31 14.17 \n", - "-1.58 0.37 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.09 \n", - "-3.88 0.56 \n", - "-3.83 0.39 \n", - "10.06 14.25 \n", - "-13.46 13.83 \n", - "-3.83 0.39 \n", - "-3.83 0.39 \n", - "-224.03 1.48 \n", - "-5.97 0.42 \n", - "-18.97 0.87 \n", - "-5.31 0.46 \n", - "-63.08 0.4 \n", - "-4.89 0.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "18.1 2.1 \n", - "-10.96 1.38 \n", - "-18.75 0.66 \n", - "-51.9 0.94 \n", - "-94.13 0.75 \n", - "-0.81 0.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.47 0.41 \n", - "-6.77 0.68 \n", - "-83.02 1.05 \n", - "2.54 7.43 \n", - "-4.36 5.84 \n", - "7.97 3.23 \n", - "-5.06 0.57 \n", - "10000000.0 10000000.0 \n", - "-1.22 0.57 \n", - "10000000.0 10000000.0 \n", - "-6.77 0.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.89 1.86 \n", - "-18.91 2.52 \n", - "-122.11 1.35 \n", - "None None \n", - "-15.25 0.71 \n", - "45.16 0.61 \n", - "2.94 0.36 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "-1.99 0.41 \n", - "-0.05 5.09 \n", - "5.02 5.04 \n", - "1.98 0.72 \n", - "-14.19 1.06 \n", - "0.34 0.84 \n", - "0.34 0.84 \n", - "-4.07 0.85 \n", - "-4.07 0.85 \n", - "None None \n", - "-0.62 0.69 \n", - "-11.3 2.13 \n", - "-6.74 5.12 \n", - "-29.3 1.58 \n", - "1.79 1.45 \n", - "1.79 1.45 \n", - "-13.16 0.99 \n", - "-3.77 0.51 \n", - "-3.77 0.51 \n", - "-3.88 0.56 \n", - "-0.35 0.51 \n", - "-1.7 19.13 \n", - "-2.67 19.14 \n", - "-2.67 19.87 \n", - "-1.7 19.85 \n", - "-1.7 19.16 \n", - "10000000.0 10000000.0 \n", - "-0.74 0.51 \n", - "-2.67 18.37 \n", - "-2.67 18.33 \n", - "-4.36 5.08 \n", - "-4.36 5.15 \n", - "-4.36 5.09 \n", - "-4.36 5.15 \n", - "-4.36 5.28 \n", - "2218.72 43.34 \n", - "1483.01 15.21 \n", - "1483.01 15.21 \n", - "1475.79 15.2 \n", - "-6.37 3.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-99.87 6.68 \n", - "-99.87 6.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.02 8.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.97 0.69 \n", - "-4.36 6.05 \n", - "-49.26 0.53 \n", - "-34.31 6.11 \n", - "-4.36 6.27 \n", - "24.84 5.35 \n", - "-37.41 0.17 \n", - "-37.41 0.17 \n", - "-18.54 1.17 \n", - "-37.41 0.17 \n", - "-18.54 1.17 \n", - "-18.54 1.17 \n", - "10000000.0 10000000.0 \n", - "-2.66 0.8 \n", - "25.86 2.01 \n", - "10000000.0 10000000.0 \n", - "97.8 0.85 \n", - "-95.03 1.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 3.23 \n", - "-0.46 3.24 \n", - "-39.48 2.44 \n", - "-39.48 2.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.84 4.93 \n", - "-26.84 5.11 \n", - "-13.9 6.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.79 2.24 \n", - "-49.3 0.53 \n", - "-11.93 1.02 \n", - "-11.97 1.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "31.52 2.35 \n", - "40.54 0.47 \n", - "373.11 2.66 \n", - "758.61 3.82 \n", - "-14.33 4.25 \n", - "-19.15 5.16 \n", - "-41.33 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-145.01 5.64 \n", - "-163.13 6.35 \n", - "-34.58 1.79 \n", - "None None \n", - "-11.75 0.56 \n", - "15.54 0.35 \n", - "-2.87 0.3 \n", - "-2.86 0.3 \n", - "15.54 0.35 \n", - "543.45 1.74 \n", - "-3.69 0.39 \n", - "-30.83 1.04 \n", - "10000000.0 10000000.0 \n", - "-78.37 0.97 \n", - "3.47 0.98 \n", - "-5.97 0.42 \n", - "10000000.0 10000000.0 \n", - "0.42 0.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.79 7.78 \n", - "-3.94 7.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.32 0.87 \n", - "-1.12 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.84 0.83 \n", - "1.56 0.16 \n", - "-10.81 0.19 \n", - "-4.31 0.75 \n", - "1.94 0.47 \n", - "-54.71 2.63 \n", - "-42.95 4.79 \n", - "-42.95 4.79 \n", - "-47.22 4.79 \n", - "-47.22 4.79 \n", - "-54.87 2.63 \n", - "-42.95 4.84 \n", - "-42.95 4.84 \n", - "-47.22 4.85 \n", - "-47.22 4.85 \n", - "-105.91 3.22 \n", - "-28.54 1.89 \n", - "75.8 0.89 \n", - "-0.9 0.51 \n", - "-6.4 0.52 \n", - "10.25 5.31 \n", - "7.06 7.35 \n", - "-48.76 5.31 \n", - "-39.84 1.54 \n", - "10000000.0 10000000.0 \n", - "-13.15 0.99 \n", - "-13.2 1.07 \n", - "24.42 0.69 \n", - "5.35 1.59 \n", - "10000000.0 10000000.0 \n", - "-21.41 0.92 \n", - "-20.64 8.68 \n", - "-20.64 8.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-42.35 1.01 \n", - "-5.29 6.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-20.64 7.23 \n", - "-2.66 0.8 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "-2.66 0.8 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "10000000.0 10000000.0 \n", - "-4.36 9.18 \n", - "-105.96 0.91 \n", - "10000000.0 10000000.0 \n", - "-90.7 0.91 \n", - "-105.96 0.91 \n", - "-2.14 0.53 \n", - "10000000.0 10000000.0 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "-4.36 8.3 \n", - "-4.36 8.86 \n", - "-0.1 6.05 \n", - "-2.66 0.8 \n", - "-2.66 0.8 \n", - "-105.96 0.91 \n", - "-2.66 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.64 0.33 \n", - "10000000.0 10000000.0 \n", - "-8.68 0.26 \n", - "10000000.0 10000000.0 \n", - "-15.27 0.83 \n", - "-5.76 0.35 \n", - "-5.76 0.35 \n", - "-4.36 5.09 \n", - "-49.24 0.53 \n", - "10000000.0 10000000.0 \n", - "-24.93 2.92 \n", - "10000000.0 10000000.0 \n", - "-23.14 2.72 \n", - "10000000.0 10000000.0 \n", - "-11.71 0.56 \n", - "6.8 1.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-55.13 1.27 \n", - "-2.23 0.53 \n", - "-55.13 1.27 \n", - "-20.64 9.23 \n", - "-20.64 9.8 \n", - "-20.64 10.38 \n", - "-181.26 7.05 \n", - "-20.64 10.98 \n", - "-114.04 2.3 \n", - "-3.83 0.39 \n", - "-5.33 6.44 \n", - "-0.96 5.28 \n", - "-11.13 4.36 \n", - "-11.13 4.39 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.94 \n", - "-12.96 7.05 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "15.25 0.71 \n", - "-0.28 0.37 \n", - "-83.06 1.82 \n", - "-10.55 1.0 \n", - "-10.55 1.0 \n", - "-10.55 1.0 \n", - "-83.06 1.82 \n", - "-83.06 1.82 \n", - "-33.9 5.22 \n", - "-33.9 5.22 \n", - "10000000.0 10000000.0 \n", - "-33.9 5.22 \n", - "4.44 0.24 \n", - "-0.34 0.34 \n", - "10000000.0 10000000.0 \n", - "-103.68 7.3 \n", - "10000000.0 10000000.0 \n", - "-32.35 5.27 \n", - "-32.35 5.27 \n", - "9.19 3.93 \n", - "9.19 3.93 \n", - "-83.06 1.82 \n", - "-83.06 1.82 \n", - "-17.58 0.93 \n", - "10000000.0 10000000.0 \n", - "-9.4 0.52 \n", - "4.44 0.24 \n", - "-0.34 0.34 \n", - "None 5.2 \n", - "-9.08 1.01 \n", - "-9.08 1.01 \n", - "3.99 2.37 \n", - "3.98 0.52 \n", - "-10.46 2.37 \n", - "10000000.0 10000000.0 \n", - "-83.06 1.82 \n", - "-83.06 1.82 \n", - "-9.08 1.01 \n", - "71.42 0.52 \n", - "-27.3 4.35 \n", - "7.22 4.35 \n", - "0.46 4.56 \n", - "-4.93 0.43 \n", - "10000000.0 10000000.0 \n", - "-14.2 6.93 \n", - "-8.76 7.02 \n", - "-2.38 0.44 \n", - "None 1.41 \n", - "-270.33 5.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "43.8 4.51 \n", - "10000000.0 10000000.0 \n", - "-4.58 0.53 \n", - "-10.37 0.2 \n", - "-10.37 0.2 \n", - "19.62 0.71 \n", - "None 1.92 \n", - "10000000.0 10000000.0 \n", - "-5.54 7.25 \n", - "446.51 5.01 \n", - "10000000.0 10000000.0 \n", - "-95.07 0.74 \n", - "-95.07 0.74 \n", - "-95.07 0.74 \n", - "-95.07 0.74 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-102.22 0.86 \n", - "-6.27 0.52 \n", - "-9.23 2.23 \n", - "-9.23 2.23 \n", - "-9.83 2.23 \n", - "-102.22 0.86 \n", - "-6.88 0.52 \n", - "-11.65 6.24 \n", - "-41.87 2.18 \n", - "-41.87 2.18 \n", - "27.38 6.85 \n", - "-198.06 13.85 \n", - "-198.06 13.85 \n", - "-48.79 6.6 \n", - "36.08 6.78 \n", - "-13.17 0.99 \n", - "-13.21 1.07 \n", - "-4.36 8.5 \n", - "-4.36 8.54 \n", - "-198.06 13.86 \n", - "-198.06 13.86 \n", - "-48.79 6.63 \n", - "0.64 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "-0.18 0.36 \n", - "14.27 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "18.28 2.9 \n", - "22.76 2.9 \n", - "23.41 2.87 \n", - "23.41 2.88 \n", - "-31.97 6.71 \n", - "-4.09 0.72 \n", - "-4.1 0.72 \n", - "557.35 1.8 \n", - "-4.09 0.72 \n", - "6.76 2.17 \n", - "-4.36 5.46 \n", - "6.76 2.26 \n", - "40.74 3.17 \n", - "-0.28 0.37 \n", - "11.54 0.6 \n", - "-7.43 0.38 \n", - "-3.11 7.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.34 0.55 \n", - "10000000.0 10000000.0 \n", - "-40.21 5.13 \n", - "-36.23 5.02 \n", - "-123.41 0.81 \n", - "-5.43 0.6 \n", - "-0.99 0.31 \n", - "-0.39 0.41 \n", - "-40.68 3.32 \n", - "-4.36 5.49 \n", - "-39.48 2.75 \n", - "-29.36 3.14 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-90.63 6.18 \n", - "-90.63 6.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-83.95 6.29 \n", - "-83.95 6.29 \n", - "-15.4 3.48 \n", - "-15.4 3.48 \n", - "None 4.5 \n", - "None 4.5 \n", - "-34.59 5.89 \n", - "-95.81 9.29 \n", - "-1.7 8.03 \n", - "-2.62 0.35 \n", - "3.24 0.82 \n", - "3.24 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.87 0.5 \n", - "-3.11 7.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-57.08 1.22 \n", - "-102.93 7.48 \n", - "-21.19 1.04 \n", - "-25.93 0.84 \n", - "-51.86 1.69 \n", - "-25.93 0.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.62 1.19 \n", - "-5.62 1.19 \n", - "-1.7 6.46 \n", - "3.81 2.37 \n", - "-1.7 8.04 \n", - "-3.83 0.39 \n", - "2.35 0.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-90.77 6.39 \n", - "6.74 4.7 \n", - "2.45 1.15 \n", - "-60.17 0.73 \n", - "-60.17 0.73 \n", - "1.01 0.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.77 0.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.83 0.46 \n", - "10000000.0 10000000.0 \n", - "-10.77 0.73 \n", - "-16.83 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-37.52 0.74 \n", - "-5.47 0.75 \n", - "-22.19 1.11 \n", - "-8.29 0.26 \n", - "-8.29 0.26 \n", - "10000000.0 10000000.0 \n", - "6.97 0.35 \n", - "-13.22 5.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-49.34 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.12 0.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "-6.64 0.45 \n", - "4.89 0.25 \n", - "-9.06 0.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.13 0.75 \n", - "6.48 0.85 \n", - "-94.13 0.75 \n", - "-4.36 6.36 \n", - "-4.36 6.51 \n", - "-12.6 0.54 \n", - "-108.16 1.79 \n", - "10000000.0 10000000.0 \n", - "-113.15 1.61 \n", - "-1.7 14.41 \n", - "-1.7 14.4 \n", - "-1.7 14.79 \n", - "-1.7 14.4 \n", - "-5.33 5.33 \n", - "-3.11 14.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.28 0.24 \n", - "-7.85 0.77 \n", - "-3.35 0.35 \n", - "-6.46 0.32 \n", - "14.86 0.43 \n", - "14.86 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.13 0.75 \n", - "4.89 0.24 \n", - "-8.68 0.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.18 0.45 \n", - "1.18 0.45 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "-5.66 0.74 \n", - "-5.66 0.74 \n", - "-5.48 0.61 \n", - "-6.64 0.45 \n", - "-71.1 6.4 \n", - "-11.78 6.46 \n", - "-5.16 0.9 \n", - "-107.56 1.44 \n", - "-105.97 0.91 \n", - "-2.08 1.67 \n", - "10000000.0 10000000.0 \n", - "-70.46 6.33 \n", - "-70.46 6.33 \n", - "-12.52 6.35 \n", - "-12.52 6.35 \n", - "-69.57 6.9 \n", - "10000000.0 10000000.0 \n", - "-71.1 6.42 \n", - "-11.78 6.48 \n", - "-69.88 6.67 \n", - "-13.0 6.76 \n", - "-94.76 2.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-25.38 2.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.76 1.91 \n", - "-3.2 1.15 \n", - "-1.74 1.68 \n", - "-105.95 0.91 \n", - "-107.61 1.44 \n", - "-94.76 1.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.2 1.15 \n", - "-71.1 6.32 \n", - "-11.78 6.37 \n", - "-94.12 0.75 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "-12.29 0.87 \n", - "-51.75 7.42 \n", - "-108.65 1.19 \n", - "10000000.0 10000000.0 \n", - "-108.65 1.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.83 3.19 \n", - "349.58 3.28 \n", - "-3.28 1.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-33.9 5.22 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "-17.58 0.93 \n", - "-101.03 1.21 \n", - "10000000.0 10000000.0 \n", - "-235.63 9.17 \n", - "-13.27 11.48 \n", - "-17.54 12.73 \n", - "10000000.0 10000000.0 \n", - "-49.25 0.53 \n", - "-2.77 0.75 \n", - "-15.46 14.89 \n", - "-10.55 1.0 \n", - "-64.39 0.35 \n", - "0.42 0.46 \n", - "-6.73 0.79 \n", - "-2.64 0.46 \n", - "-12.96 3.97 \n", - "-12.96 3.97 \n", - "-52.22 0.46 \n", - "-2.57 0.3 \n", - "-12.96 3.88 \n", - "-12.96 3.88 \n", - "-1.51 0.4 \n", - "-14.03 6.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.22 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-86.18 1.85 \n", - "-11.89 4.12 \n", - "-10.1 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "83.31 20.41 \n", - "83.31 20.41 \n", - "None 4.3 \n", - "10000000.0 10000000.0 \n", - "None 0.64 \n", - "-16.21 1.14 \n", - "10000000.0 10000000.0 \n", - "None 3.63 \n", - "-11.73 1.04 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "None 1.02 \n", - "None 2.6 \n", - "10000000.0 10000000.0 \n", - "None 0.35 \n", - "None 1.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-40.22 1.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.24 0.3 \n", - "10000000.0 10000000.0 \n", - "-3.54 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.54 0.77 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.54 1.48 \n", - "-6.16 0.07 \n", - "43.97 1.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "21.7 0.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-209.04 0.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.35 0.33 \n", - "0.09 0.26 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.53 0.84 \n", - "140.4 1.84 \n", - "10000000.0 10000000.0 \n", - "-2.09 1.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.35 \n", - "10000000.0 10000000.0 \n", - "16.8 1.6 \n", - "None 0.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.62 0.66 \n", - "-3.3 0.77 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.38 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "1.52 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "-65.02 1.07 \n", - "10000000.0 10000000.0 \n", - "-56.37 0.85 \n", - "-13.48 0.98 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.08 0.27 \n", - "-0.39 1.3 \n", - "-1.91 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-81.0 1.83 \n", - "None 0.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.21 0.77 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "339.61 0.3 \n", - "-1.0 1.0 \n", - "-3.6 1.12 \n", - "-9.67 1.26 \n", - "-8.26 1.43 \n", - "-68.95 1.15 \n", - "-9.7 1.31 \n", - "0.03 0.63 \n", - "1.44 0.99 \n", - "2.61 0.71 \n", - "-3.58 1.06 \n", - "-2.17 1.22 \n", - "-8.03 0.52 \n", - "-44.78 0.91 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.87 1.04 \n", - "29.47 1.17 \n", - "127.71 4.96 \n", - "89.36 0.82 \n", - "-35.44 0.84 \n", - "-36.92 0.72 \n", - "-41.0 0.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "19.0 1.98 \n", - "-6.16 0.07 \n", - "None 0.54 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-2.78 0.76 \n", - "97.86 0.39 \n", - "0.39 1.02 \n", - "10000000.0 10000000.0 \n", - "-44.06 0.64 \n", - "-44.43 0.83 \n", - "-53.51 7.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-56.71 0.73 \n", - "-24.76 1.8 \n", - "-36.43 0.75 \n", - "-38.12 0.98 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-1.04 0.83 \n", - "None 0.71 \n", - "-8.38 1.02 \n", - "-2.2 0.76 \n", - "-2.95 0.63 \n", - "4.25 0.5 \n", - "84.44 3.93 \n", - "15.6 1.8 \n", - "10000000.0 10000000.0 \n", - "-38.54 0.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "0.97 0.32 \n", - "-0.78 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.63 0.42 \n", - "-125.74 1.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-182.71 6.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-212.61 6.95 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.55 \n", - "None 0.57 \n", - "None 0.57 \n", - "None 0.49 \n", - "None 0.62 \n", - "None 0.83 \n", - "None 0.64 \n", - "10000000.0 10000000.0 \n", - "None 0.99 \n", - "None 0.65 \n", - "None 0.49 \n", - "None 1.6 \n", - "79.98 0.75 \n", - "None 1.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.12 \n", - "None 2.14 \n", - "None 1.26 \n", - "None 1.17 \n", - "None 1.15 \n", - "None 1.33 \n", - "10000000.0 10000000.0 \n", - "-8.67 0.56 \n", - "-2.78 0.75 \n", - "-2.58 0.61 \n", - "-1.17 0.9 \n", - "7.09 1.23 \n", - "-79.96 1.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.88 1.28 \n", - "-31.72 0.47 \n", - "-2.59 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.83 1.02 \n", - "None 0.71 \n", - "None 2.31 \n", - "10000000.0 10000000.0 \n", - "None 0.64 \n", - "None 1.63 \n", - "None 5.36 \n", - "None 4.2 \n", - "None 4.17 \n", - "None 2.66 \n", - "None 2.21 \n", - "None 1.16 \n", - "None 1.41 \n", - "None 0.61 \n", - "None 1.13 \n", - "-5.83 0.43 \n", - "-55.09 2.23 \n", - "10000000.0 10000000.0 \n", - "40.88 1.06 \n", - "-91.19 1.52 \n", - "10000000.0 10000000.0 \n", - "-15.13 0.33 \n", - "-2.2 0.3 \n", - "2.9 0.9 \n", - "-44.36 0.45 \n", - "7.55 1.06 \n", - "-3.88 0.56 \n", - "-74.71 0.46 \n", - "-14.12 4.63 \n", - "-10.74 1.9 \n", - "-90.82 11.68 \n", - "-39.91 0.2 \n", - "-38.35 0.11 \n", - "-40.48 0.31 \n", - "-39.91 0.2 \n", - "15.54 0.35 \n", - "-38.35 0.11 \n", - "-40.48 0.31 \n", - "0.28 0.37 \n", - "0.28 0.37 \n", - "-37.41 0.17 \n", - "-36.23 13.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "35.74 0.45 \n", - "-99.41 1.12 \n", - "-1.14 0.86 \n", - "-1.14 0.86 \n", - "-5.33 5.75 \n", - "3.96 0.84 \n", - "3.96 0.84 \n", - "-1.38 0.32 \n", - "-37.41 0.17 \n", - "-42.69 0.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.6 0.51 \n", - "-2.61 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-40.71 1.09 \n", - "-105.51 1.72 \n", - "-32.01 1.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.28 0.35 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "69.08 3.67 \n", - "-34.54 1.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.98 2.82 \n", - "-1.7 6.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.61 5.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-27.35 1.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.64 1.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.91 2.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-62.43 0.77 \n", - "10000000.0 10000000.0 \n", - "-9.31 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-104.63 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-34.54 1.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "67.52 1.3 \n", - "-40.4 1.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.45 12.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.07 2.25 \n", - "-6.02 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-112.08 2.49 \n", - "-97.2 0.8 \n", - "-69.24 7.2 \n", - "-95.07 0.74 \n", - "-105.07 0.81 \n", - "10000000.0 10000000.0 \n", - "-68.62 2.16 \n", - "-40.4 1.05 \n", - "-118.19 0.76 \n", - "-126.86 0.82 \n", - "-0.08 0.76 \n", - "133.58 1.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.55 6.73 \n", - "-21.55 6.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-99.35 7.1 \n", - "-120.27 1.5 \n", - "102.64 1.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-147.85 5.12 \n", - "-13.27 0.43 \n", - "-13.27 0.43 \n", - "-316.94 2.26 \n", - "-24.6 1.18 \n", - "41.13 0.49 \n", - "10000000.0 10000000.0 \n", - "-38.35 0.11 \n", - "-38.35 0.11 \n", - "-3.54 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.13 0.33 \n", - "-6.35 0.31 \n", - "1.99 0.41 \n", - "-3.35 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.4 7.04 \n", - "-7.82 1.27 \n", - "-15.27 0.83 \n", - "-14.03 7.09 \n", - "10000000.0 10000000.0 \n", - "-43.09 0.41 \n", - "34.96 0.71 \n", - "98.85 0.84 \n", - "-38.39 0.11 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-4.56 0.5 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-5.92 0.48 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-5.75 5.96 \n", - "-5.82 0.35 \n", - "-0.28 0.38 \n", - "-0.24 0.54 \n", - "-0.24 0.54 \n", - "3.08 1.26 \n", - "5.03 0.45 \n", - "-5.88 0.84 \n", - "-16.48 0.73 \n", - "-1.57 0.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-83.46 1.83 \n", - "-122.1 0.88 \n", - "-102.93 7.48 \n", - "8.9 0.48 \n", - "-40.01 1.05 \n", - "-67.59 2.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.0 0.47 \n", - "2.82 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-54.46 1.09 \n", - "10000000.0 10000000.0 \n", - "-1.34 0.67 \n", - "-11.93 1.11 \n", - "-4.05 0.62 \n", - "-2.81 0.47 \n", - "-5.91 0.63 \n", - "-2.78 0.3 \n", - "-2.78 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.15 6.52 \n", - "10000000.0 10000000.0 \n", - "-208.0 4.36 \n", - "-208.0 4.36 \n", - "-17.77 4.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.63 0.32 \n", - "-4.05 5.53 \n", - "-1.7 2.55 \n", - "-4.05 5.16 \n", - "24.82 2.25 \n", - "0.36 0.55 \n", - "-4.01 3.98 \n", - "-4.01 3.99 \n", - "-30.03 7.74 \n", - "-90.59 2.48 \n", - "-93.45 2.27 \n", - "14.22 7.33 \n", - "-12.71 1.03 \n", - "6.53 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-105.96 0.91 \n", - "-5.9 4.27 \n", - "-5.9 4.36 \n", - "-105.96 0.91 \n", - "-95.07 0.74 \n", - "-27.09 1.0 \n", - "-5.75 5.65 \n", - "-95.07 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.52 2.35 \n", - "-105.96 0.91 \n", - "-45.33 1.38 \n", - "-48.24 1.0 \n", - "-7.52 2.6 \n", - "-49.24 0.53 \n", - "2.91 0.86 \n", - "-0.31 0.8 \n", - "-49.25 0.53 \n", - "10000000.0 10000000.0 \n", - "-105.96 0.91 \n", - "-96.63 0.76 \n", - "46.06 1.83 \n", - "4.89 0.24 \n", - "-8.68 0.26 \n", - "97.06 1.48 \n", - "-3.25 1.05 \n", - "-10.5 0.74 \n", - "-32.46 1.18 \n", - "-80.63 7.79 \n", - "-105.96 0.91 \n", - "0.37 4.75 \n", - "-49.25 0.53 \n", - "-31.43 1.93 \n", - "-49.25 0.53 \n", - "12.37 1.6 \n", - "-26.71 1.97 \n", - "-49.24 0.53 \n", - "15.53 0.35 \n", - "-40.48 0.31 \n", - "-0.39 0.41 \n", - "-95.07 0.74 \n", - "-94.12 0.75 \n", - "-95.07 0.74 \n", - "-2.39 0.75 \n", - "-1.99 0.41 \n", - "-10.82 0.19 \n", - "-7.69 0.49 \n", - "-6.34 0.32 \n", - "-81.64 0.28 \n", - "-72.23 0.2 \n", - "-10.82 0.19 \n", - "-1.99 0.41 \n", - "-0.99 0.31 \n", - "1.18 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.9 2.87 \n", - "-27.09 1.0 \n", - "-5.9 7.93 \n", - "10000000.0 10000000.0 \n", - "-8.55 7.84 \n", - "-40.22 7.87 \n", - "-34.32 7.83 \n", - "-24.02 7.85 \n", - "-41.51 7.83 \n", - "1.26 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "389.3 1.59 \n", - "-280.46 6.2 \n", - "10000000.0 10000000.0 \n", - "413.87 2.77 \n", - "-7.15 0.85 \n", - "10000000.0 10000000.0 \n", - "-86.57 10.11 \n", - "10000000.0 10000000.0 \n", - "-338.58 10.0 \n", - "2.58 0.42 \n", - "7.31 0.74 \n", - "-7.65 1.32 \n", - "5.47 0.54 \n", - "5.47 0.54 \n", - "-40.98 1.18 \n", - "-9.26 0.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.13 0.75 \n", - "-104.91 9.49 \n", - "-97.2 0.8 \n", - "420.23 0.51 \n", - "409.87 0.52 \n", - "457.11 2.73 \n", - "420.23 0.51 \n", - "422.22 0.68 \n", - "409.87 0.52 \n", - "411.85 0.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-27.35 1.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-23.87 1.54 \n", - "10000000.0 10000000.0 \n", - "6.93 0.75 \n", - "6.77 1.15 \n", - "-11.44 1.5 \n", - "66.22 6.33 \n", - "-7.91 1.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.98 0.75 \n", - "6.74 7.19 \n", - "-78.34 3.1 \n", - "-1.72 8.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.85 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-23.06 1.5 \n", - "-51.03 4.58 \n", - "10000000.0 10000000.0 \n", - "-40.4 1.05 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.41 1.4 \n", - "-92.41 1.81 \n", - "-15.06 2.36 \n", - "10000000.0 10000000.0 \n", - "0.97 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-105.96 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.88 0.56 \n", - "10000000.0 10000000.0 \n", - "-3.7 0.46 \n", - "50.04 4.58 \n", - "-0.28 0.38 \n", - "-0.28 0.38 \n", - "-1.67 0.54 \n", - "-11.02 0.54 \n", - "4.16 0.78 \n", - "-12.59 0.54 \n", - "-6.89 0.77 \n", - "-6.35 7.32 \n", - "-4.71 0.54 \n", - "-5.55 0.55 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "-2.62 0.35 \n", - "0.82 0.41 \n", - "-6.17 0.81 \n", - "-15.54 0.35 \n", - "-5.76 0.74 \n", - "-16.37 0.89 \n", - "-9.0 1.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "12.14 3.85 \n", - "-53.01 0.89 \n", - "-14.34 0.94 \n", - "43.75 0.77 \n", - "-36.39 2.54 \n", - "0.5 2.04 \n", - "10000000.0 10000000.0 \n", - "-105.96 0.91 \n", - "-2.67 0.8 \n", - "-0.29 0.38 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "-0.9 0.51 \n", - "-14.03 10.61 \n", - "0.28 0.37 \n", - "4.52 1.9 \n", - "0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "-4.01 0.11 \n", - "-4.88 0.37 \n", - "-4.75 0.36 \n", - "0.03 0.68 \n", - "-3.55 0.64 \n", - "-195.51 2.33 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.02 1.65 \n", - "-3.8 5.36 \n", - "0.01 None \n", - "10000000.0 10000000.0 \n", - "-4.26 0.49 \n", - "-1.9 0.49 \n", - "-5.12 0.6 \n", - "-5.0 0.59 \n", - "-10.46 5.37 \n", - "-21.65 7.54 \n", - "-99.41 1.12 \n", - "-126.69 13.26 \n", - "-26.99 1.03 \n", - "5.88 0.71 \n", - "-48.33 6.68 \n", - "-3.53 6.54 \n", - "4.52 1.9 \n", - "4.52 1.9 \n", - "-18.93 2.18 \n", - "11.12 2.41 \n", - "3.1 0.42 \n", - "-13.1 1.07 \n", - "23.26 1.22 \n", - "-0.71 0.53 \n", - "-10.07 0.53 \n", - "-0.29 0.61 \n", - "-15.14 6.72 \n", - "-28.09 2.78 \n", - "-22.58 1.11 \n", - "-78.49 1.57 \n", - "-10.46 5.4 \n", - "-5.1 0.43 \n", - "2.77 1.67 \n", - "15.88 7.44 \n", - "-20.0 1.66 \n", - "-4.36 5.26 \n", - "-1.49 0.4 \n", - "3.94 1.66 \n", - "-24.49 1.1 \n", - "-1.28 0.89 \n", - "-0.13 0.67 \n", - "-2.58 0.51 \n", - "2.57 0.71 \n", - "-5.13 0.57 \n", - "-1.03 0.57 \n", - "-4.36 6.0 \n", - "-13.39 1.07 \n", - "-4.73 0.54 \n", - "10000000.0 10000000.0 \n", - "-0.86 1.31 \n", - "-0.86 1.31 \n", - "-0.76 1.2 \n", - "-2.84 0.54 \n", - "-9.8 9.66 \n", - "-8.63 0.26 \n", - "-16.73 0.8 \n", - "-22.2 1.44 \n", - "-0.28 0.37 \n", - "-0.28 0.37 \n", - "4.04 0.28 \n", - "-3.14 0.76 \n", - "10000000.0 10000000.0 \n", - "-90.71 0.91 \n", - "-13.2 1.07 \n", - "-3.57 0.8 \n", - "-1.63 6.98 \n", - "-2.64 0.35 \n", - "-1.01 0.39 \n", - "10000000.0 10000000.0 \n", - "0.42 0.46 \n", - "-82.17 2.13 \n", - "-82.17 2.13 \n", - "4.44 0.24 \n", - "-2.26 0.47 \n", - "-3.84 0.3 \n", - "-4.82 0.75 \n", - "0.55 0.41 \n", - "-9.14 3.53 \n", - "0.74 7.13 \n", - "-2.1 0.3 \n", - "4.29 0.24 \n", - "10.66 0.78 \n", - "-4.36 6.48 \n", - "-4.58 12.88 \n", - "None 4.17 \n", - "3.11 8.01 \n", - "-2.62 0.35 \n", - "14.27 0.33 \n", - "14.27 0.34 \n", - "-1.01 0.39 \n", - "-4.95 0.96 \n", - "-6.33 1.74 \n", - "-10.37 0.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.72 0.54 \n", - "-0.68 0.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.94 0.47 \n", - "-2.54 1.12 \n", - "-5.9 1.12 \n", - "-105.97 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.85 0.24 \n", - "-4.1 0.53 \n", - "-3.77 0.67 \n", - "105.36 0.93 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.91 0.41 \n", - "1.02 0.71 \n", - "-3.78 1.0 \n", - "-0.07 0.69 \n", - "-1.76 0.74 \n", - "-10.01 0.3 \n", - "-10.01 0.3 \n", - "-5.26 0.57 \n", - "-4.22 1.25 \n", - "-4.21 1.24 \n", - "-9.48 0.68 \n", - "10.77 5.02 \n", - "5.22 11.94 \n", - "-5.22 11.94 \n", - "-0.52 0.47 \n", - "3.97 5.05 \n", - "-7.31 0.74 \n", - "1.85 0.74 \n", - "1.04 0.46 \n", - "-4.44 0.24 \n", - "None None \n", - "-1.87 0.46 \n", - "-4.89 0.25 \n", - "-1.31 0.67 \n", - "-3.81 0.43 \n", - "6.48 0.85 \n", - "-16.03 3.67 \n", - "0.12 0.98 \n", - "10000000.0 10000000.0 \n", - "-6.4 0.52 \n", - "-2.11 0.69 \n", - "0.9 0.51 \n", - "-0.9 0.51 \n", - "-6.45 0.71 \n", - "-13.94 1.55 \n", - "0.98 0.5 \n", - "10000000.0 10000000.0 \n", - "-1.27 0.64 \n", - "10000000.0 10000000.0 \n", - "None 5.6 \n", - "4.0 0.49 \n", - "-1.05 0.37 \n", - "4.89 0.24 \n", - "-9.02 0.84 \n", - "-1.65 0.45 \n", - "-35.92 1.49 \n", - "-1.26 0.5 \n", - "-105.29 0.94 \n", - "-96.53 0.85 \n", - "-105.29 0.94 \n", - "-12.04 1.05 \n", - "-104.58 1.53 \n", - "1.81 5.51 \n", - "-0.78 0.68 \n", - "-7.26 0.54 \n", - "-2.84 0.54 \n", - "-78.48 1.57 \n", - "12.57 4.39 \n", - "16.72 4.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "-1.08 1.04 \n", - "10000000.0 10000000.0 \n", - "-4.36 8.55 \n", - "-4.36 8.51 \n", - "-0.28 0.38 \n", - "-0.28 0.38 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.45 0.38 \n", - "-105.97 0.91 \n", - "-136.86 1.8 \n", - "-121.63 3.62 \n", - "1.12 1.08 \n", - "2.99 0.87 \n", - "-4.36 5.41 \n", - "-2.94 0.9 \n", - "10000000.0 10000000.0 \n", - "-5.02 0.89 \n", - "-2.95 1.92 \n", - "-11.8 6.4 \n", - "-22.58 1.25 \n", - "-123.41 0.81 \n", - "-352.98 2.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.19 0.47 \n", - "-0.56 0.55 \n", - "-0.28 0.38 \n", - "-2.75 0.78 \n", - "8.91 0.78 \n", - "-0.26 0.49 \n", - "1.31 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.68 1.32 \n", - "13.27 0.43 \n", - "-82.98 1.15 \n", - "-5.64 0.81 \n", - "9.66 0.82 \n", - "0.69 0.38 \n", - "2.3 11.56 \n", - "-8.29 0.26 \n", - "-3.16 0.75 \n", - "-2.46 0.54 \n", - "None None \n", - "2.98 1.63 \n", - "4.89 0.25 \n", - "-32.0 1.07 \n", - "10000000.0 10000000.0 \n", - "-20.21 1.9 \n", - "2.82 1.78 \n", - "-10.13 1.6 \n", - "13.85 0.31 \n", - "13.86 0.31 \n", - "-6.52 0.55 \n", - "10000000.0 10000000.0 \n", - "-8.15 3.02 \n", - "-9.07 0.26 \n", - "-86.57 10.11 \n", - "10000000.0 10000000.0 \n", - "-7.35 2.51 \n", - "-90.99 1.31 \n", - "-0.58 0.54 \n", - "-61.24 1.25 \n", - "-3.78 0.35 \n", - "3.58 0.91 \n", - "5.97 1.7 \n", - "-14.4 6.78 \n", - "-14.03 6.83 \n", - "-16.31 2.64 \n", - "-16.42 1.26 \n", - "-86.18 1.85 \n", - "10000000.0 10000000.0 \n", - "-5.07 0.71 \n", - "-7.38 0.74 \n", - "2.3 11.85 \n", - "2.3 11.85 \n", - "None 10.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.14 None \n", - "-5.13 0.52 \n", - "-4.32 0.3 \n", - "-4.05 0.56 \n", - "-3.64 0.43 \n", - "-5.19 0.46 \n", - "-0.47 0.61 \n", - "-4.4 0.73 \n", - "-1.82 0.71 \n", - "-0.51 0.51 \n", - "-0.57 0.5 \n", - "-74.83 1.75 \n", - "-2.66 0.8 \n", - "-3.28 1.09 \n", - "-5.27 1.33 \n", - "13.43 1.51 \n", - "-20.53 1.89 \n", - "-70.74 1.84 \n", - "15.72 0.65 \n", - "-2.37 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.08 0.84 \n", - "4.89 0.25 \n", - "None None \n", - "-2.44 0.61 \n", - "-13.2 1.07 \n", - "-5.06 0.75 \n", - "-0.32 0.43 \n", - "-10.46 4.97 \n", - "1.12 0.58 \n", - "-0.11 0.82 \n", - "-6.03 0.68 \n", - "-0.28 0.37 \n", - "-0.28 0.37 \n", - "-83.06 1.82 \n", - "-8.29 0.26 \n", - "0.24 0.49 \n", - "-26.84 4.69 \n", - "-0.46 1.9 \n", - "-14.03 6.29 \n", - "-0.57 0.52 \n", - "11.95 1.71 \n", - "-0.56 0.52 \n", - "11.95 1.71 \n", - "8.34 1.85 \n", - "0.01 0.71 \n", - "-0.85 0.68 \n", - "48.28 4.84 \n", - "-105.96 0.91 \n", - "-8.68 0.26 \n", - "-8.68 0.27 \n", - "-72.01 1.66 \n", - "-4.36 5.08 \n", - "-103.43 1.25 \n", - "-3.79 0.86 \n", - "-0.52 1.63 \n", - "-104.99 2.05 \n", - "81.75 10.15 \n", - "2.34 0.39 \n", - "-8.07 1.19 \n", - "-2.81 0.3 \n", - "-2.81 4.39 \n", - "-4.84 0.32 \n", - "-1.84 0.88 \n", - "-1.11 0.42 \n", - "-0.06 0.39 \n", - "-11.24 1.64 \n", - "8.04 0.84 \n", - "3.76 11.5 \n", - "3.76 11.49 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "-96.19 11.48 \n", - "-3.98 0.33 \n", - "-14.34 2.29 \n", - "-7.69 0.72 \n", - "10000000.0 10000000.0 \n", - "18.19 1.11 \n", - "18.19 1.11 \n", - "18.19 1.12 \n", - "18.19 1.12 \n", - "-16.53 1.35 \n", - "-13.76 1.15 \n", - "-52.15 6.69 \n", - "-45.65 2.53 \n", - "-6.31 0.7 \n", - "-0.15 0.69 \n", - "5.34 1.04 \n", - "5.74 0.27 \n", - "-3.37 0.44 \n", - "-15.61 3.67 \n", - "-5.88 0.41 \n", - "-1.63 1.66 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.47 0.24 \n", - "-5.29 0.5 \n", - "-2.72 1.31 \n", - "-75.63 1.39 \n", - "-4.36 5.17 \n", - "-3.56 0.8 \n", - "-105.96 0.91 \n", - "2.22 0.33 \n", - "2.22 0.33 \n", - "4.44 0.24 \n", - "-0.68 0.53 \n", - "-1.45 0.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.74 0.84 \n", - "-6.41 0.83 \n", - "0.07 0.33 \n", - "-92.72 1.1 \n", - "-92.73 1.11 \n", - "-2.65 0.81 \n", - "4.77 0.76 \n", - "14.27 1.57 \n", - "12.59 7.4 \n", - "12.59 7.39 \n", - "-3.98 0.33 \n", - "-2.43 0.33 \n", - "3.4 0.6 \n", - "-0.28 0.37 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "-0.28 0.38 \n", - "4.75 6.33 \n", - "-25.44 2.52 \n", - "-122.5 0.9 \n", - "-16.31 9.76 \n", - "-14.03 10.66 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "-97.2 0.8 \n", - "-5.21 0.31 \n", - "10000000.0 10000000.0 \n", - "-0.83 0.5 \n", - "-0.97 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.43 0.33 \n", - "-5.28 0.33 \n", - "-5.28 0.33 \n", - "-0.88 0.33 \n", - "7.48 0.71 \n", - "-5.28 0.33 \n", - "-0.88 0.33 \n", - "10000000.0 10000000.0 \n", - "-82.17 2.13 \n", - "-82.18 2.13 \n", - "1.6 0.39 \n", - "0.38 0.45 \n", - "-26.89 1.23 \n", - "-8.83 3.01 \n", - "-107.68 1.13 \n", - "-104.34 8.4 \n", - "-39.93 1.55 \n", - "-4.36 6.2 \n", - "-9.86 0.47 \n", - "6.72 0.4 \n", - "-8.88 3.08 \n", - "-3.96 0.55 \n", - "2.37 2.03 \n", - "-62.1 1.36 \n", - "14.27 0.34 \n", - "3.18 4.84 \n", - "3.51 0.49 \n", - "-71.03 1.84 \n", - "-11.41 1.33 \n", - "-2.13 0.3 \n", - "-262.35 0.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.48 1.89 \n", - "-6.83 0.33 \n", - "-6.83 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.38 0.45 \n", - "-2.28 0.35 \n", - "-0.28 0.38 \n", - "-6.25 0.33 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "-6.47 0.59 \n", - "-0.94 1.4 \n", - "1.51 0.68 \n", - "-8.68 0.26 \n", - "4.89 0.24 \n", - "-18.48 1.45 \n", - "-2.28 0.32 \n", - "0.84 7.33 \n", - "-6.06 7.25 \n", - "-16.31 3.99 \n", - "-16.31 3.99 \n", - "4.44 0.24 \n", - "-16.97 3.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.61 0.3 \n", - "-9.66 0.61 \n", - "1.42 0.85 \n", - "53.52 9.09 \n", - "-7.68 0.72 \n", - "-7.83 0.72 \n", - "1.66 0.92 \n", - "-5.96 0.71 \n", - "3.05 5.07 \n", - "-82.73 2.52 \n", - "-5.66 0.58 \n", - "-5.66 0.59 \n", - "-14.87 5.08 \n", - "10000000.0 10000000.0 \n", - "-13.12 1.07 \n", - "-105.0 2.14 \n", - "-74.56 1.74 \n", - "-11.27 1.2 \n", - "-5.33 6.54 \n", - "-85.38 7.45 \n", - "-97.2 0.8 \n", - "-13.21 1.07 \n", - "-88.3 1.92 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "-5.72 0.54 \n", - "5.72 0.54 \n", - "-3.88 0.56 \n", - "-105.96 0.91 \n", - "-2.66 0.8 \n", - "-105.96 0.91 \n", - "10000000.0 10000000.0 \n", - "4.89 0.25 \n", - "-1.7 5.7 \n", - "10000000.0 10000000.0 \n", - "-1.88 0.34 \n", - "42.43 0.26 \n", - "-105.97 0.91 \n", - "-0.35 0.55 \n", - "-4.45 2.26 \n", - "4.89 0.25 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "-7.23 0.6 \n", - "-4.36 6.12 \n", - "-13.37 1.07 \n", - "-13.13 1.03 \n", - "-121.99 3.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.26 5.43 \n", - "-13.15 1.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.29 1.0 \n", - "-13.2 1.07 \n", - "10000000.0 10000000.0 \n", - "-105.96 0.91 \n", - "-97.2 0.8 \n", - "-3.19 0.5 \n", - "16.51 7.04 \n", - "-0.81 0.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.41 0.88 \n", - "4.71 0.35 \n", - "0.25 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.7 8.03 \n", - "-69.98 2.15 \n", - "-2.52 0.71 \n", - "-78.34 1.57 \n", - "-93.87 1.66 \n", - "-21.55 6.87 \n", - "-4.36 6.85 \n", - "-1.55 0.49 \n", - "-3.11 7.46 \n", - "-0.45 0.38 \n", - "-95.83 7.12 \n", - "-95.83 7.11 \n", - "-105.97 0.91 \n", - "-109.84 1.17 \n", - "3.74 7.95 \n", - "3.11 8.15 \n", - "-30.39 2.63 \n", - "-1.06 2.03 \n", - "1.62 0.36 \n", - "1.6 1.2 \n", - "-11.58 3.18 \n", - "-21.72 2.72 \n", - "-23.04 2.78 \n", - "5.86 11.76 \n", - "81.75 10.21 \n", - "10000000.0 10000000.0 \n", - "42.69 7.71 \n", - "-1.7 6.62 \n", - "-10.01 0.3 \n", - "-13.27 0.43 \n", - "-102.01 13.3 \n", - "3.52 0.32 \n", - "-18.18 1.75 \n", - "0.68 0.58 \n", - "1.33 0.72 \n", - "4.81 0.84 \n", - "1.12 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 5.31 \n", - "-13.15 6.25 \n", - "10.24 1.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "14.27 0.33 \n", - "-13.2 1.07 \n", - "10000000.0 10000000.0 \n", - "-13.57 11.59 \n", - "10000000.0 10000000.0 \n", - "-5.47 0.61 \n", - "5.66 0.74 \n", - "-6.64 0.45 \n", - "-4.36 7.05 \n", - "-48.33 5.17 \n", - "5.25 0.91 \n", - "-36.03 13.76 \n", - "-8.13 6.27 \n", - "10000000.0 10000000.0 \n", - "9.68 2.19 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.9 \n", - "9.54 1.03 \n", - "4.23 0.41 \n", - "8.84 0.67 \n", - "-13.8 6.52 \n", - "10000000.0 10000000.0 \n", - "17.73 2.41 \n", - "-7.87 2.9 \n", - "10000000.0 10000000.0 \n", - "61.95 3.21 \n", - "-0.28 0.37 \n", - "-4.36 5.31 \n", - "-4.17 0.75 \n", - "10000000.0 10000000.0 \n", - "-12.01 1.42 \n", - "-59.92 1.38 \n", - "2.3 11.94 \n", - "4.73 0.75 \n", - "4.36 0.24 \n", - "-0.31 0.31 \n", - "-10.42 7.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.83 0.3 \n", - "-14.03 9.25 \n", - "-4.73 0.54 \n", - "-10.01 0.3 \n", - "10000000.0 10000000.0 \n", - "14.27 0.34 \n", - "10.66 0.78 \n", - "7.19 0.32 \n", - "-0.52 0.41 \n", - "0.12 0.33 \n", - "-11.5 1.24 \n", - "None None \n", - "-0.39 0.5 \n", - "-1.92 8.48 \n", - "4.44 0.24 \n", - "None None \n", - "4.44 0.24 \n", - "-91.28 4.02 \n", - "6.56 0.6 \n", - "-215.89 8.18 \n", - "-37.0 1.56 \n", - "-5.05 0.47 \n", - "-5.43 6.79 \n", - "-3.11 8.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.84 1.73 \n", - "-109.96 0.98 \n", - "-109.81 1.17 \n", - "-2.8 0.3 \n", - "-3.04 0.42 \n", - "26.51 7.76 \n", - "-6.36 6.86 \n", - "-90.26 8.68 \n", - "-4.58 12.9 \n", - "-0.28 0.38 \n", - "-32.86 4.45 \n", - "-4.36 5.9 \n", - "114.32 1.15 \n", - "-4.36 6.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.3 11.42 \n", - "2.3 11.41 \n", - "14.27 0.34 \n", - "10.66 0.78 \n", - "7.73 0.73 \n", - "7.4 8.01 \n", - "-33.63 5.8 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "-94.13 0.75 \n", - "-0.49 0.57 \n", - "None None \n", - "-9.15 0.34 \n", - "21.62 0.95 \n", - "61.95 0.28 \n", - "-107.07 1.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "None 4.38 \n", - "11.26 8.26 \n", - "11.26 8.25 \n", - "-2.65 0.35 \n", - "2.55 5.03 \n", - "4.89 0.24 \n", - "-6.73 0.55 \n", - "-8.63 0.26 \n", - "-74.83 1.75 \n", - "None None \n", - "-0.89 0.92 \n", - "-2.78 0.75 \n", - "2.2 0.59 \n", - "2.34 0.68 \n", - "2.34 0.68 \n", - "-20.16 1.48 \n", - "10000000.0 10000000.0 \n", - "-5.32 0.43 \n", - "-1.86 0.42 \n", - "1.41 1.01 \n", - "8.51 1.57 \n", - "-4.88 0.25 \n", - "-7.51 0.62 \n", - "None None \n", - "-7.68 0.72 \n", - "13.83 0.43 \n", - "-0.55 0.89 \n", - "-4.36 5.4 \n", - "-5.26 1.87 \n", - "-12.09 0.51 \n", - "0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "-3.62 0.45 \n", - "-13.11 5.21 \n", - "4.89 0.24 \n", - "-14.03 7.63 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.9 0.46 \n", - "-61.34 1.25 \n", - "26.92 1.23 \n", - "23.35 0.94 \n", - "2.66 0.32 \n", - "6.84 0.46 \n", - "0.68 6.95 \n", - "5.22 8.97 \n", - "-105.96 0.91 \n", - "-0.71 0.53 \n", - "None None \n", - "0.38 0.45 \n", - "-2.53 0.32 \n", - "0.46 7.04 \n", - "-2.63 7.05 \n", - "33.52 4.95 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "0.83 0.41 \n", - "-8.71 0.8 \n", - "-16.31 6.19 \n", - "10000000.0 10000000.0 \n", - "18.83 5.64 \n", - "-14.03 11.18 \n", - "14.27 0.34 \n", - "10.66 0.78 \n", - "7.19 0.32 \n", - "7.54 2.41 \n", - "29.7 1.02 \n", - "-105.89 0.91 \n", - "-114.69 1.81 \n", - "-114.7 1.81 \n", - "-2.65 0.35 \n", - "-1.18 0.45 \n", - "4.86 0.35 \n", - "9.32 0.66 \n", - "-4.88 0.25 \n", - "-13.2 1.07 \n", - "6.29 1.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.53 5.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-22.54 1.11 \n", - "1.68 1.82 \n", - "-28.74 2.24 \n", - "-1.66 0.46 \n", - "-1.65 0.46 \n", - "-21.55 6.74 \n", - "9.47 1.75 \n", - "-10.46 5.06 \n", - "-27.3 6.45 \n", - "4.04 6.28 \n", - "-13.81 1.21 \n", - "10000000.0 10000000.0 \n", - "92.12 1.09 \n", - "24.83 7.31 \n", - "24.83 7.3 \n", - "-35.35 1.1 \n", - "6.73 0.71 \n", - "-3.57 0.81 \n", - "1.6 1.87 \n", - "-2.71 2.02 \n", - "64.73 1.86 \n", - "-0.87 0.44 \n", - "-1.49 0.35 \n", - "10000000.0 10000000.0 \n", - "-0.56 0.76 \n", - "-62.83 8.84 \n", - "-74.84 1.75 \n", - "-8.6 0.26 \n", - "-104.68 1.14 \n", - "-19.35 5.02 \n", - "26.73 0.76 \n", - "-4.36 7.0 \n", - "-17.73 2.41 \n", - "32.13 2.5 \n", - "-14.11 1.64 \n", - "-62.11 1.36 \n", - "-5.02 0.89 \n", - "10.64 0.78 \n", - "-34.59 6.27 \n", - "-54.04 6.75 \n", - "9.66 0.82 \n", - "0.69 0.38 \n", - "-0.28 0.38 \n", - "None None \n", - "2.26 0.55 \n", - "11.6 2.78 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "-13.14 1.07 \n", - "10000000.0 10000000.0 \n", - "-0.3 0.8 \n", - "-20.25 1.89 \n", - "-86.23 1.62 \n", - "-8.28 0.91 \n", - "-4.54 0.57 \n", - "-112.1 2.02 \n", - "0.18 0.36 \n", - "0.18 0.36 \n", - "-2.92 0.8 \n", - "None None \n", - "-4.68 0.75 \n", - "2.1 0.71 \n", - "0.38 0.45 \n", - "-2.28 0.35 \n", - "-0.28 0.37 \n", - "1.81 5.22 \n", - "-16.89 0.8 \n", - "11.52 0.76 \n", - "-14.03 4.79 \n", - "-6.35 4.76 \n", - "None None \n", - "-5.59 0.95 \n", - "-14.27 5.54 \n", - "-20.25 1.89 \n", - "0.65 0.71 \n", - "-13.15 2.46 \n", - "-3.18 0.71 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "0.75 11.48 \n", - "0.75 11.47 \n", - "0.45 0.11 \n", - "-12.31 0.75 \n", - "-2.58 0.3 \n", - "-4.36 6.62 \n", - "-0.18 0.36 \n", - "-1.87 0.46 \n", - "-5.07 0.75 \n", - "2.65 0.09 \n", - "-1.93 0.44 \n", - "-11.31 2.08 \n", - "42.61 4.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.45 0.24 \n", - "4.46 0.24 \n", - "-0.04 0.48 \n", - "0.11 0.47 \n", - "-20.54 1.56 \n", - "6.14 0.93 \n", - "6.15 0.94 \n", - "7.05 0.71 \n", - "7.05 0.72 \n", - "-3.58 0.52 \n", - "4.44 0.24 \n", - "-1.18 0.45 \n", - "10000000.0 10000000.0 \n", - "-1.52 0.35 \n", - "20.66 5.23 \n", - "1.07 1.04 \n", - "4.45 0.24 \n", - "-4.04 1.14 \n", - "-14.03 4.62 \n", - "14.18 1.8 \n", - "-12.96 4.02 \n", - "-0.32 0.47 \n", - "11.76 1.89 \n", - "-25.92 2.19 \n", - "-1.7 6.02 \n", - "-3.6 0.82 \n", - "1.52 0.35 \n", - "-6.04 0.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-118.06 0.77 \n", - "-119.9 0.93 \n", - "-117.79 0.93 \n", - "-1.36 0.5 \n", - "0.23 0.31 \n", - "4.47 0.24 \n", - "10000000.0 10000000.0 \n", - "5.02 0.84 \n", - "10000000.0 10000000.0 \n", - "-77.71 2.01 \n", - "-38.13 0.45 \n", - "27.39 1.1 \n", - "-62.22 0.46 \n", - "-108.84 7.17 \n", - "-94.13 0.75 \n", - "-49.25 0.53 \n", - "-95.64 1.69 \n", - "-3.4 0.86 \n", - "-4.09 0.92 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "0.28 0.38 \n", - "None None \n", - "-1.82 0.75 \n", - "-3.04 0.55 \n", - "-5.0 2.64 \n", - "10000000.0 10000000.0 \n", - "10.24 2.03 \n", - "-3.55 6.45 \n", - "-3.55 6.44 \n", - "-104.86 2.16 \n", - "-163.02 1.34 \n", - "6.22 7.12 \n", - "10000000.0 10000000.0 \n", - "39.34 0.48 \n", - "51.41 1.01 \n", - "37.0 1.12 \n", - "1.72 0.39 \n", - "-1.7 8.11 \n", - "None None \n", - "-22.58 1.11 \n", - "-4.36 5.09 \n", - "10000000.0 10000000.0 \n", - "4.88 0.24 \n", - "-17.73 2.41 \n", - "-128.98 8.61 \n", - "-0.28 0.37 \n", - "-9.49 0.43 \n", - "10000000.0 10000000.0 \n", - "-5.86 0.43 \n", - "-6.29 0.43 \n", - "-21.55 1.64 \n", - "10000000.0 10000000.0 \n", - "-300.11 3.68 \n", - "-59.15 7.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.89 0.79 \n", - "-9.17 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.89 0.24 \n", - "2.27 0.78 \n", - "2.43 1.27 \n", - "2.43 1.27 \n", - "10000000.0 10000000.0 \n", - "-5.9 0.66 \n", - "0.71 1.21 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "8.28 0.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-23.38 1.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.67 0.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-47.22 1.79 \n", - "14.13 0.8 \n", - "10000000.0 10000000.0 \n", - "18.25 1.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.86 6.54 \n", - "-19.86 6.49 \n", - "-39.72 10.63 \n", - "6.67 2.65 \n", - "10000000.0 10000000.0 \n", - "2.28 8.8 \n", - "-5.83 0.43 \n", - "-3.91 0.53 \n", - "-24.6 1.18 \n", - "0.92 0.84 \n", - "-6.58 0.38 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "-118.71 0.79 \n", - "-87.62 0.79 \n", - "10000000.0 10000000.0 \n", - "24.42 7.38 \n", - "-19.86 6.18 \n", - "-19.86 6.14 \n", - "-19.86 6.18 \n", - "-19.86 6.14 \n", - "-39.72 10.41 \n", - "1.24 0.54 \n", - "-16.13 1.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.77 2.23 \n", - "10000000.0 10000000.0 \n", - "-16.53 5.62 \n", - "26.98 7.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.04 0.71 \n", - "18.3 1.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.53 13.5 \n", - "-6.35 0.31 \n", - "5.03 2.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.15 0.85 \n", - "26.98 6.47 \n", - "2.76 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.19 0.61 \n", - "-0.9 0.51 \n", - "10000000.0 10000000.0 \n", - "-3.82 0.44 \n", - "-106.06 0.91 \n", - "-19.01 2.26 \n", - "-122.97 2.46 \n", - "-20.72 2.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "100.02 10.35 \n", - "-10.8 0.54 \n", - "-65.6 4.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-37.17 1.61 \n", - "-36.48 2.54 \n", - "-6.77 0.68 \n", - "-44.69 1.28 \n", - "None None \n", - "4.17 0.54 \n", - "-43.91 1.77 \n", - "-41.04 2.37 \n", - "-1.64 0.95 \n", - "-1.64 0.95 \n", - "-3.82 0.44 \n", - "-3.82 0.44 \n", - "-3.82 0.44 \n", - "-13.09 1.07 \n", - "10000000.0 10000000.0 \n", - "-20.02 2.27 \n", - "-12.25 1.03 \n", - "-18.88 2.26 \n", - "-13.73 1.27 \n", - "-20.66 2.38 \n", - "-7.54 0.63 \n", - "-3.92 0.53 \n", - "-13.48 0.98 \n", - "10000000.0 10000000.0 \n", - "-4.36 8.54 \n", - "4.44 0.24 \n", - "-118.74 1.28 \n", - "-94.13 0.75 \n", - "-104.63 0.81 \n", - "-118.19 0.76 \n", - "-316.94 2.26 \n", - "-95.07 0.74 \n", - "-198.06 13.86 \n", - "-105.96 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "106.13 3.44 \n", - "106.15 3.47 \n", - "-27.75 1.23 \n", - "0.92 5.45 \n", - "-2.98 5.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.77 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.46 0.78 \n", - "10000000.0 10000000.0 \n", - "11.27 2.59 \n", - "-2.63 0.42 \n", - "-17.38 1.46 \n", - "-99.41 1.12 \n", - "-95.04 11.61 \n", - "-57.84 7.43 \n", - "-24.63 12.17 \n", - "-93.51 13.8 \n", - "-96.19 12.12 \n", - "-108.03 12.13 \n", - "-104.34 13.76 \n", - "-52.88 14.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-196.14 18.62 \n", - "-39.84 13.95 \n", - "-96.19 15.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.56 0.16 \n", - "1.56 0.16 \n", - "51.88 0.84 \n", - "-6.88 0.52 \n", - "9.23 2.23 \n", - "9.83 2.23 \n", - "-6.27 0.52 \n", - "-11.65 6.24 \n", - "-26.75 13.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.83 0.72 \n", - "10000000.0 10000000.0 \n", - "-14.05 13.96 \n", - "-107.73 1.13 \n", - "-200.53 13.65 \n", - "-113.19 3.05 \n", - "-0.28 0.38 \n", - "18.15 6.16 \n", - "2.95 0.73 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.2 4.98 \n", - "-3.87 0.56 \n", - "-3.87 0.56 \n", - "-3.87 0.56 \n", - "-3.84 0.39 \n", - "-3.87 0.56 \n", - "2.95 0.73 \n", - "-3.87 0.49 \n", - "-3.88 0.56 \n", - "-14.03 5.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-97.47 2.44 \n", - "10000000.0 10000000.0 \n", - "-107.59 1.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.33 5.04 \n", - "-7.87 0.81 \n", - "-20.64 6.16 \n", - "10000000.0 10000000.0 \n", - "-16.13 1.32 \n", - "-5.37 0.78 \n", - "-20.33 6.28 \n", - "0.28 0.37 \n", - "-7.62 0.58 \n", - "-0.57 1.6 \n", - "10000000.0 10000000.0 \n", - "-17.74 4.48 \n", - "-14.03 5.34 \n", - "0.95 0.84 \n", - "-38.36 3.48 \n", - "10000000.0 10000000.0 \n", - "-57.29 1.19 \n", - "-16.95 4.69 \n", - "-90.57 1.32 \n", - "-4.36 6.47 \n", - "-0.9 0.51 \n", - "10000000.0 10000000.0 \n", - "-102.22 0.86 \n", - "-102.22 0.86 \n", - "-120.87 2.32 \n", - "-48.79 6.63 \n", - "10000000.0 10000000.0 \n", - "-3.31 0.67 \n", - "-109.11 1.49 \n", - "None None \n", - "-20.64 6.09 \n", - "-20.64 5.97 \n", - "-46.45 2.31 \n", - "-5.66 1.31 \n", - "-71.82 10.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.96 0.32 \n", - "1.56 0.16 \n", - "0.13 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-52.66 6.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.65 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-109.52 0.8 \n", - "1.33 0.47 \n", - "10000000.0 10000000.0 \n", - "-10.46 5.17 \n", - "-13.11 5.3 \n", - "10000000.0 10000000.0 \n", - "-3.44 7.02 \n", - "-108.8 1.49 \n", - "10000000.0 10000000.0 \n", - "-3.44 7.17 \n", - "-0.9 0.42 \n", - "0.63 0.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-108.8 1.49 \n", - "-97.2 0.8 \n", - "-11.04 4.48 \n", - "-109.11 1.49 \n", - "-14.03 6.97 \n", - "-14.03 7.14 \n", - "-0.88 0.86 \n", - "-4.26 0.3 \n", - "-4.09 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "-8.92 0.85 \n", - "-1.34 0.56 \n", - "10000000.0 10000000.0 \n", - "53.54 14.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-65.16 1.95 \n", - "-65.16 2.1 \n", - "-65.16 2.47 \n", - "-2.63 0.42 \n", - "-0.9 0.42 \n", - "-9.11 1.38 \n", - "-6.07 1.1 \n", - "-9.25 0.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.08 \n", - "-25.2 1.43 \n", - "-97.2 0.8 \n", - "31.97 6.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.91 1.75 \n", - "-2.65 0.35 \n", - "10000000.0 10000000.0 \n", - "-112.97 1.64 \n", - "10000000.0 10000000.0 \n", - "-4.11 0.54 \n", - "-6.02 0.56 \n", - "-15.14 1.21 \n", - "-1.7 5.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.63 0.88 \n", - "10000000.0 10000000.0 \n", - "-3.83 0.89 \n", - "-12.08 0.39 \n", - "6.11 0.46 \n", - "10000000.0 10000000.0 \n", - "1.66 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "14.92 1.4 \n", - "14.92 1.4 \n", - "10000000.0 10000000.0 \n", - "-95.07 0.74 \n", - "-193.12 1.53 \n", - "-193.12 1.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-31.09 1.08 \n", - "-32.05 1.14 \n", - "-128.98 8.6 \n", - "-1.7 8.09 \n", - "-1.7 8.65 \n", - "1.98 0.72 \n", - "2.11 1.09 \n", - "-0.07 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.13 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.22 0.69 \n", - "-90.63 7.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.29 0.38 \n", - "-26.75 2.19 \n", - "-49.28 5.13 \n", - "10000000.0 10000000.0 \n", - "-104.63 1.45 \n", - "-189.98 12.78 \n", - "-104.63 1.45 \n", - "7.8 1.0 \n", - "2.81 0.38 \n", - "None None \n", - "-5.87 0.89 \n", - "-6.05 0.57 \n", - "-12.48 1.14 \n", - "10000000.0 10000000.0 \n", - "-4.67 0.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "54.34 1.22 \n", - "-0.11 0.57 \n", - "0.28 0.57 \n", - "-4.11 0.54 \n", - "4.42 0.24 \n", - "10000000.0 10000000.0 \n", - "-6.44 0.57 \n", - "10000000.0 10000000.0 \n", - "-4.97 0.47 \n", - "3.44 1.03 \n", - "-7.59 0.58 \n", - "1.28 0.42 \n", - "-1.53 0.8 \n", - "-99.09 1.14 \n", - "1.62 0.09 \n", - "-97.17 1.01 \n", - "-3.95 0.9 \n", - "10000000.0 10000000.0 \n", - "-22.91 1.01 \n", - "-20.64 6.02 \n", - "-5.5 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.78 0.41 \n", - "4.89 0.24 \n", - "-189.16 4.65 \n", - "-74.24 0.91 \n", - "-131.13 1.91 \n", - "-107.15 1.4 \n", - "-107.45 1.2 \n", - "-105.97 0.91 \n", - "10000000.0 10000000.0 \n", - "-237.19 13.52 \n", - "-92.58 6.93 \n", - "-91.65 4.65 \n", - "5.26 0.58 \n", - "10000000.0 10000000.0 \n", - "-107.67 1.13 \n", - "-0.26 1.57 \n", - "-21.0 5.42 \n", - "-17.39 5.43 \n", - "-38.35 0.11 \n", - "-128.25 1.82 \n", - "-107.84 1.19 \n", - "10000000.0 10000000.0 \n", - "-21.39 1.41 \n", - "-38.35 0.11 \n", - "-5.32 0.43 \n", - "-5.68 0.43 \n", - "-2.32 0.3 \n", - "6.43 1.02 \n", - "None None \n", - "-14.03 5.5 \n", - "1.19 0.41 \n", - "-10.59 0.77 \n", - "-16.73 6.2 \n", - "11.19 0.7 \n", - "-48.21 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 14.36 \n", - "10000000.0 10000000.0 \n", - "-3518.78 191.84 \n", - "-1.7 14.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.3 1.35 \n", - "-1.14 0.86 \n", - "1.4 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.34 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.6 4.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.75 0.35 \n", - "-15.02 0.79 \n", - "10000000.0 10000000.0 \n", - "-2.85 0.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.13 4.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.73 0.98 \n", - "-91.61 6.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.52 0.41 \n", - "-3.3 5.78 \n", - "-60.47 1.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.9 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-70.77 1.77 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "13.27 0.43 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "18.7 7.01 \n", - "-118.4 1.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-88.72 9.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.84 1.1 \n", - "10000000.0 10000000.0 \n", - "2.26 0.57 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "14.27 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-20.64 6.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.93 0.84 \n", - "-2.8 0.8 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.34 0.3 \n", - "-127.42 1.58 \n", - "10000000.0 10000000.0 \n", - "-4.36 7.29 \n", - "430.37 2.79 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "-1.66 6.15 \n", - "6.14 0.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.74 0.53 \n", - "10000000.0 10000000.0 \n", - "-94.13 0.75 \n", - "10000000.0 10000000.0 \n", - "71.63 3.55 \n", - "-3.87 0.49 \n", - "-88.54 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-100.63 1.78 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-38.87 1.13 \n", - "-3.53 5.93 \n", - "2.94 0.46 \n", - "10000000.0 10000000.0 \n", - "-0.09 0.55 \n", - "-4.7 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.84 4.94 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.7 1.73 \n", - "-4.36 6.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-74.83 1.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.62 0.46 \n", - "3.76 6.55 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "-4.36 8.09 \n", - "10000000.0 10000000.0 \n", - "-60.14 3.84 \n", - "10000000.0 10000000.0 \n", - "-7.19 1.6 \n", - "10000000.0 10000000.0 \n", - "1.35 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.42 0.93 \n", - "-47.15 10.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.07 0.85 \n", - "10000000.0 10000000.0 \n", - "15.22 10.42 \n", - "0.38 0.45 \n", - "10000000.0 10000000.0 \n", - "-85.55 1.99 \n", - "10000000.0 10000000.0 \n", - "-2.67 10.86 \n", - "10000000.0 10000000.0 \n", - "-43.51 3.86 \n", - "10000000.0 10000000.0 \n", - "-0.59 0.75 \n", - "10000000.0 10000000.0 \n", - "-34.73 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 7.34 \n", - "-3.35 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.3 0.43 \n", - "10000000.0 10000000.0 \n", - "-81.93 6.95 \n", - "10000000.0 10000000.0 \n", - "-0.02 None \n", - "-7.72 0.39 \n", - "10000000.0 10000000.0 \n", - "0.34 5.21 \n", - "-1.55 5.07 \n", - "-96.19 8.26 \n", - "-18.98 2.28 \n", - "-95.07 0.74 \n", - "10000000.0 10000000.0 \n", - "-1.01 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "1.26 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.69 0.81 \n", - "10000000.0 10000000.0 \n", - "-88.36 7.78 \n", - "10000000.0 10000000.0 \n", - "None 2.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-34.18 1.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 4.66 \n", - "10000000.0 10000000.0 \n", - "-0.63 0.39 \n", - "10000000.0 10000000.0 \n", - "-8.62 0.48 \n", - "-3.92 0.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.99 0.55 \n", - "10000000.0 10000000.0 \n", - "-1.72 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.42 9.73 \n", - "10000000.0 10000000.0 \n", - "-2.07 0.98 \n", - "10000000.0 10000000.0 \n", - "-3.87 0.56 \n", - "-0.28 0.38 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.62 0.45 \n", - "-3.87 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.96 2.9 \n", - "-1.05 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.82 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.06 0.26 \n", - "10000000.0 10000000.0 \n", - "-3.11 7.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1533.99 11.69 \n", - "-87.79 0.79 \n", - "0.67 0.55 \n", - "10000000.0 10000000.0 \n", - "1.68 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.76 2.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.13 0.75 \n", - "-10.95 1.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.17 0.81 \n", - "10000000.0 10000000.0 \n", - "291.98 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-102.22 0.86 \n", - "10000000.0 10000000.0 \n", - "-26.49 3.62 \n", - "-5.19 6.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.26 \n", - "-1.7 5.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-55.92 1.37 \n", - "10000000.0 10000000.0 \n", - "-80.62 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.88 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-24.55 1.56 \n", - "10000000.0 10000000.0 \n", - "-6.35 4.88 \n", - "-27.7 1.21 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.76 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 5.12 \n", - "-73.81 1.72 \n", - "10000000.0 10000000.0 \n", - "-0.04 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.46 1.38 \n", - "10000000.0 10000000.0 \n", - "-271.52 16.38 \n", - "7.12 4.66 \n", - "10000000.0 10000000.0 \n", - "-15.44 5.13 \n", - "-4.36 6.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.56 4.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "14.27 0.34 \n", - "10000000.0 10000000.0 \n", - "7.19 0.32 \n", - "10000000.0 10000000.0 \n", - "1.18 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-25.03 1.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "196.31 10.54 \n", - "1.18 0.45 \n", - "0.85 0.65 \n", - "9.63 5.2 \n", - "-3.33 0.68 \n", - "-4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "7.22 1.77 \n", - "10000000.0 10000000.0 \n", - "13.44 1.92 \n", - "-1.0 0.38 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "-105.96 0.91 \n", - "-8.98 3.7 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-58.68 0.35 \n", - "10000000.0 10000000.0 \n", - "-1064.39 11.2 \n", - "-53.6 3.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.87 0.56 \n", - "4.51 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.16 5.19 \n", - "1.56 0.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.56 4.22 \n", - "-6.96 0.41 \n", - "-5.31 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.71 0.38 \n", - "10000000.0 10000000.0 \n", - "None 10.1 \n", - "-109.04 5.02 \n", - "10000000.0 10000000.0 \n", - "-4.36 7.38 \n", - "-2.66 5.73 \n", - "10000000.0 10000000.0 \n", - "-87.18 1.04 \n", - "-5.96 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.59 0.46 \n", - "4.81 2.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.74 6.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "200.95 5.06 \n", - "10000000.0 10000000.0 \n", - "-11.13 4.96 \n", - "10000000.0 10000000.0 \n", - "0.09 0.26 \n", - "-13.74 5.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.46 None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-78.4 9.73 \n", - "-3.4 12.04 \n", - "10000000.0 10000000.0 \n", - "-45.71 3.97 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 6.7 \n", - "-6.62 0.65 \n", - "-10.72 7.64 \n", - "10000000.0 10000000.0 \n", - "-109.41 6.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.41 0.5 \n", - "-30.4 2.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "14.58 4.56 \n", - "10000000.0 10000000.0 \n", - "-2.92 0.86 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.25 0.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.24 0.26 \n", - "-7.11 0.85 \n", - "-7.11 0.85 \n", - "10000000.0 10000000.0 \n", - "-23.36 7.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.35 7.16 \n", - "-11.88 0.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.72 2.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-75.64 1.39 \n", - "-75.64 1.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.65 0.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "11.47 3.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.53 8.8 \n", - "-2.81 0.56 \n", - "-3.84 0.84 \n", - "-3.75 0.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.06 4.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.41 0.41 \n", - "-4.41 0.41 \n", - "0.31 0.55 \n", - "-2.16 0.33 \n", - "-6.12 0.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 1.64 \n", - "10000000.0 10000000.0 \n", - "-1.7 12.11 \n", - "-1.7 12.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.75 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.11 0.92 \n", - "-2.46 0.07 \n", - "-2.61 0.79 \n", - "-1.7 16.66 \n", - "-1.7 16.66 \n", - "-14.03 17.62 \n", - "-14.03 17.62 \n", - "-1.7 18.72 \n", - "-1.7 18.72 \n", - "-14.03 19.45 \n", - "-14.03 19.45 \n", - "-1.7 20.25 \n", - "-1.7 22.15 \n", - "-1.7 24.08 \n", - "-154.53 27.36 \n", - "-154.53 27.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.89 0.25 \n", - "10000000.0 10000000.0 \n", - "1898.65 42.6 \n", - "-371.91 2.02 \n", - "-10.33 7.71 \n", - "-2.53 1.22 \n", - "-3.7 0.78 \n", - "-1.65 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.5 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.01 1.99 \n", - "-1.01 1.99 \n", - "-8.46 7.46 \n", - "-5.97 0.42 \n", - "-4.41 0.41 \n", - "10000000.0 10000000.0 \n", - "1.26 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 2.78 \n", - "10000000.0 10000000.0 \n", - "-2.48 0.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-25.73 1.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "None None \n", - "2.5 6.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "0.32 0.26 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "14.98 2.36 \n", - "10000000.0 10000000.0 \n", - "-2.96 0.68 \n", - "-24.11 1.28 \n", - "-18.97 14.01 \n", - "None 29.93 \n", - "15.82 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.81 0.35 \n", - "None None \n", - "0.18 0.36 \n", - "-2.63 0.42 \n", - "10000000.0 10000000.0 \n", - "-1.7 21.53 \n", - "-1.7 21.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.91 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.77 0.76 \n", - "10000000.0 10000000.0 \n", - "-2.82 0.3 \n", - "10000000.0 10000000.0 \n", - "-22.39 2.12 \n", - "-2.72 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.1 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.01 0.82 \n", - "-15.7 1.65 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.26 1.65 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.89 0.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-20.4 8.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.1 0.19 \n", - "0.4 0.61 \n", - "-2.86 0.3 \n", - "10000000.0 10000000.0 \n", - "-15.85 6.02 \n", - "10000000.0 10000000.0 \n", - "-11.73 7.23 \n", - "-8.46 7.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.54 1.03 \n", - "-8.44 0.72 \n", - "6.75 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.27 0.9 \n", - "10000000.0 10000000.0 \n", - "-11.65 1.23 \n", - "-8.92 0.61 \n", - "-8.92 0.61 \n", - "4.99 5.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.99 1.04 \n", - "9.72 1.12 \n", - "-5.97 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.38 1.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "15.68 0.45 \n", - "15.67 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 1.94 \n", - "-112.88 1.42 \n", - "-116.65 2.22 \n", - "-118.47 1.4 \n", - "11.1 1.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "-15.02 7.69 \n", - "-101.73 10.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.47 1.17 \n", - "-9.73 2.72 \n", - "10000000.0 10000000.0 \n", - "-16.89 9.28 \n", - "-0.05 1.8 \n", - "-34.54 1.84 \n", - "-34.54 1.84 \n", - "10000000.0 10000000.0 \n", - "9.67 6.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.32 3.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.87 3.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.41 2.4 \n", - "-1.7 8.01 \n", - "-1.7 8.01 \n", - "-1.7 5.54 \n", - "-1.7 5.69 \n", - "-1.7 5.38 \n", - "3.41 2.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.65 0.64 \n", - "-0.65 0.64 \n", - "-0.65 0.64 \n", - "-0.65 0.64 \n", - "-0.65 0.64 \n", - "-0.65 0.64 \n", - "None 20.87 \n", - "None 20.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.21 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-3.35 0.3 \n", - "-3.35 0.3 \n", - "-3.35 0.3 \n", - "-3.35 0.3 \n", - "-3.35 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.37 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.15 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-73.98 0.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.34 0.74 \n", - "2.34 0.74 \n", - "2.34 0.74 \n", - "2.34 0.74 \n", - "2.34 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.08 0.75 \n", - "-5.07 0.49 \n", - "-4.36 7.13 \n", - "-4.36 7.13 \n", - "10000000.0 10000000.0 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "-294.47 21.93 \n", - "-294.47 21.93 \n", - "-95.07 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.88 0.24 \n", - "-2.82 0.67 \n", - "-2.82 0.67 \n", - "4.06 0.3 \n", - "-105.96 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 5.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.85 0.5 \n", - "-15.54 0.35 \n", - "-0.4 0.71 \n", - "2.08 1.37 \n", - "-1.45 1.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.46 0.4 \n", - "10000000.0 10000000.0 \n", - "-1.0 0.52 \n", - "-5.9 0.34 \n", - "-72.76 0.79 \n", - "-72.76 0.79 \n", - "6.57 3.02 \n", - "-38.54 2.41 \n", - "-40.35 2.26 \n", - "-59.43 0.49 \n", - "-94.13 0.75 \n", - "-94.13 0.75 \n", - "-104.63 0.81 \n", - "-104.63 0.81 \n", - "-98.33 13.34 \n", - "-98.33 13.34 \n", - "-4.52 1.9 \n", - "-4.52 1.9 \n", - "10.82 0.19 \n", - "-0.18 0.36 \n", - "0.99 0.31 \n", - "-42.32 0.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "13.21 2.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 4.69 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.73 1.39 \n", - "-83.99 0.48 \n", - "10000000.0 10000000.0 \n", - "32.17 1.01 \n", - "-1.14 4.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.85 0.19 \n", - "10.85 0.19 \n", - "-213.26 1.79 \n", - "3.48 0.99 \n", - "0.28 0.38 \n", - "0.28 0.38 \n", - "-104.48 0.79 \n", - "-104.48 0.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.28 0.38 \n", - "0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.52 1.9 \n", - "4.52 1.9 \n", - "-13.27 0.43 \n", - "-21.65 7.54 \n", - "-94.13 0.75 \n", - "-94.13 0.75 \n", - "-103.56 14.88 \n", - "-103.56 14.88 \n", - "-98.33 13.36 \n", - "-98.33 13.36 \n", - "-4.52 1.9 \n", - "10000000.0 10000000.0 \n", - "-94.13 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-104.63 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-118.19 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.94 0.97 \n", - "10000000.0 10000000.0 \n", - "0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "-92.58 11.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-103.56 11.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-118.58 11.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.01 11.51 \n", - "1.01 11.52 \n", - "10000000.0 10000000.0 \n", - "0.28 0.98 \n", - "0.28 0.98 \n", - "4.52 1.9 \n", - "-8.37 0.76 \n", - "10000000.0 10000000.0 \n", - "-102.6 0.84 \n", - "-98.05 0.82 \n", - "-111.02 0.95 \n", - "-4.12 1.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.3 11.49 \n", - "-1.55 9.74 \n", - "-0.28 0.37 \n", - "None None \n", - "-98.05 0.82 \n", - "-94.13 0.75 \n", - "-97.2 0.8 \n", - "-94.13 0.75 \n", - "-97.2 0.8 \n", - "-94.13 0.75 \n", - "-104.63 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-30.57 1.39 \n", - "10000000.0 10000000.0 \n", - "-3.8 5.42 \n", - "-3.79 1.08 \n", - "2.78 0.41 \n", - "13.11 0.64 \n", - "14.37 0.55 \n", - "25.84 7.93 \n", - "7.06 7.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "10.66 0.78 \n", - "-11.48 1.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.32 4.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-68.26 1.27 \n", - "-73.78 3.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-118.58 6.66 \n", - "-39.17 2.71 \n", - "-39.84 2.51 \n", - "10000000.0 10000000.0 \n", - "-7.91 1.04 \n", - "-24.32 4.05 \n", - "-18.64 1.57 \n", - "-44.16 1.66 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.44 0.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.2 0.86 \n", - "-3.11 6.06 \n", - "-3.11 6.06 \n", - "2.59 0.57 \n", - "-2.76 0.44 \n", - "-2.93 0.84 \n", - "-7.92 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.87 0.64 \n", - "-9.14 0.51 \n", - "10000000.0 10000000.0 \n", - "4.29 0.24 \n", - "4.29 0.24 \n", - "4.29 0.24 \n", - "4.29 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.29 0.24 \n", - "4.29 0.24 \n", - "-6.86 0.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-96.26 6.71 \n", - "-105.11 6.72 \n", - "10000000.0 10000000.0 \n", - "-79.28 1.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-20.99 1.11 \n", - "-6.68 1.33 \n", - "4.62 0.29 \n", - "-78.09 0.61 \n", - "-92.02 1.91 \n", - "5.73 0.54 \n", - "-2.0 6.73 \n", - "-2.0 6.73 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "2.3 11.73 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "None None \n", - "-0.68 0.53 \n", - "-13.17 0.99 \n", - "-0.68 0.53 \n", - "-13.16 0.99 \n", - "-0.68 0.53 \n", - "-94.12 0.75 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "-1.18 0.45 \n", - "3.76 12.89 \n", - "-5.25 12.37 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "4.41 0.24 \n", - "-7.16 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.57 8.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-104.34 13.25 \n", - "-104.34 14.43 \n", - "-104.34 14.42 \n", - "-104.34 13.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.4 0.86 \n", - "-2.29 0.75 \n", - "-2.62 0.35 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "4.44 0.24 \n", - "-13.0 0.43 \n", - "None None \n", - "5.53 0.9 \n", - "5.53 0.9 \n", - "10000000.0 10000000.0 \n", - "-14.84 1.99 \n", - "-69.98 2.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-97.43 1.4 \n", - "-3.07 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-23.57 10.53 \n", - "-7.85 0.58 \n", - "10000000.0 10000000.0 \n", - "-23.57 10.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-32.0 1.07 \n", - "10000000.0 10000000.0 \n", - "-21.55 11.94 \n", - "0.06 11.21 \n", - "-2.88 12.23 \n", - "10000000.0 10000000.0 \n", - "-21.55 11.96 \n", - "-8.68 0.26 \n", - "4.89 0.24 \n", - "-94.12 0.75 \n", - "-0.28 0.37 \n", - "None None \n", - "14.87 0.86 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.83 0.58 \n", - "-7.85 0.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-40.99 5.86 \n", - "-94.12 0.75 \n", - "-8.68 0.26 \n", - "4.89 0.24 \n", - "-0.78 0.41 \n", - "-6.74 5.81 \n", - "-197.96 3.56 \n", - "-20.43 1.99 \n", - "None None \n", - "-31.23 2.21 \n", - "-34.84 1.85 \n", - "-34.84 1.85 \n", - "116.7 0.44 \n", - "36.8 0.83 \n", - "2.47 3.5 \n", - "-5.27 3.64 \n", - "-93.66 3.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.73 3.81 \n", - "-8.77 0.44 \n", - "-4.37 0.56 \n", - "-0.01 0.3 \n", - "-21.7 2.04 \n", - "0.39 0.9 \n", - "0.39 0.9 \n", - "-72.33 0.28 \n", - "10000000.0 10000000.0 \n", - "3.25 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-61.65 4.06 \n", - "-11.34 5.16 \n", - "10000000.0 10000000.0 \n", - "-95.09 1.3 \n", - "-0.06 1.06 \n", - "5.73 1.39 \n", - "-12.23 1.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.84 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-31.55 8.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-98.05 0.82 \n", - "-3.88 0.56 \n", - "-2.63 0.42 \n", - "-2.63 0.42 \n", - "-0.28 0.38 \n", - "None None \n", - "-0.28 0.38 \n", - "-0.28 0.38 \n", - "-20.33 6.2 \n", - "-0.28 0.38 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "21.19 0.61 \n", - "10000000.0 10000000.0 \n", - "-20.33 6.2 \n", - "None None \n", - "0.61 None \n", - "22.47 0.61 \n", - "28.31 1.16 \n", - "6.4 0.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.81 0.46 \n", - "10000000.0 10000000.0 \n", - "-118.63 1.24 \n", - "-8.35 5.39 \n", - "-198.75 1.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.81 0.46 \n", - "-2.62 0.35 \n", - "-13.83 5.93 \n", - "-6.77 0.68 \n", - "-6.24 0.59 \n", - "-7.15 0.85 \n", - "-7.15 0.85 \n", - "-90.63 6.29 \n", - "-83.95 6.43 \n", - "-15.4 3.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.24 0.59 \n", - "-7.15 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.24 0.59 \n", - "-7.15 0.85 \n", - "10000000.0 10000000.0 \n", - "-90.63 6.31 \n", - "-83.95 6.42 \n", - "-15.4 3.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-90.63 6.26 \n", - "-83.95 6.37 \n", - "-15.4 3.63 \n", - "-90.63 6.27 \n", - "-83.95 6.38 \n", - "-15.4 3.65 \n", - "-90.63 6.28 \n", - "-83.95 6.39 \n", - "-15.4 3.67 \n", - "-83.95 6.4 \n", - "-15.4 3.69 \n", - "-90.63 6.33 \n", - "120.23 0.59 \n", - "8.9 0.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "-97.25 10.69 \n", - "-19.02 1.47 \n", - "-0.28 0.37 \n", - "-12.75 0.66 \n", - "-13.38 0.43 \n", - "5.38 6.4 \n", - "0.95 2.01 \n", - "-9.75 2.51 \n", - "-7.58 1.67 \n", - "-43.17 1.82 \n", - "10000000.0 10000000.0 \n", - "-5.08 1.3 \n", - "-18.85 1.53 \n", - "-22.59 2.38 \n", - "10000000.0 10000000.0 \n", - "12.25 1.78 \n", - "-0.14 0.58 \n", - "5.93 1.94 \n", - "2.46 0.57 \n", - "10000000.0 10000000.0 \n", - "15.34 2.08 \n", - "-7.88 0.54 \n", - "-93.36 1.04 \n", - "10000000.0 10000000.0 \n", - "-7.36 0.77 \n", - "10000000.0 10000000.0 \n", - "-9.12 1.24 \n", - "-43.94 1.71 \n", - "-20.0 1.66 \n", - "-8.67 0.27 \n", - "-40.4 1.05 \n", - "-26.84 1.03 \n", - "-40.79 1.05 \n", - "-2.28 0.8 \n", - "10000000.0 10000000.0 \n", - "-7.1 5.7 \n", - "-0.85 5.2 \n", - "-8.58 5.07 \n", - "-5.75 5.02 \n", - "4.89 0.24 \n", - "-40.4 1.05 \n", - "0.44 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.88 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-49.33 0.53 \n", - "-49.44 0.53 \n", - "-32.3 1.94 \n", - "-32.46 1.65 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "-3.87 0.56 \n", - "-5.49 0.39 \n", - "-5.91 0.39 \n", - "-2.14 0.66 \n", - "1.16 0.47 \n", - "10000000.0 10000000.0 \n", - "-59.88 1.53 \n", - "-6.66 0.55 \n", - "10000000.0 10000000.0 \n", - "-2.63 0.42 \n", - "10000000.0 10000000.0 \n", - "-12.65 0.97 \n", - "-12.22 0.97 \n", - "None None \n", - "-37.02 1.12 \n", - "5.34 0.56 \n", - "-5.9 0.39 \n", - "1.56 0.47 \n", - "-6.31 0.39 \n", - "-3.86 0.56 \n", - "-3.87 0.56 \n", - "-106.0 0.91 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "-62.11 1.36 \n", - "-62.11 1.36 \n", - "-14.23 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.82 0.39 \n", - "-26.84 1.03 \n", - "2.23 5.73 \n", - "2.23 5.49 \n", - "-106.01 0.91 \n", - "-62.56 1.36 \n", - "-11.13 0.39 \n", - "-108.63 1.19 \n", - "-74.83 1.75 \n", - "2.36 0.47 \n", - "-0.08 0.76 \n", - "-32.0 1.07 \n", - "-3.68 2.32 \n", - "-3.68 2.32 \n", - "10000000.0 10000000.0 \n", - "-2.86 15.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.11 0.66 \n", - "-7.77 1.33 \n", - "4.32 0.41 \n", - "-3.85 0.6 \n", - "-5.47 0.3 \n", - "-4.2 0.85 \n", - "-69.98 2.5 \n", - "-3.43 0.44 \n", - "-26.84 1.03 \n", - "1.97 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-102.0 2.0 \n", - "3.76 7.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.81 0.38 \n", - "-3.8 0.44 \n", - "-35.95 7.33 \n", - "-20.33 7.24 \n", - "-19.2 7.17 \n", - "-28.81 1.09 \n", - "10000000.0 10000000.0 \n", - "-27.33 1.09 \n", - "10000000.0 10000000.0 \n", - "-10.46 7.1 \n", - "None 4.98 \n", - "-67.09 1.16 \n", - "10000000.0 10000000.0 \n", - "-67.09 1.16 \n", - "-66.63 1.84 \n", - "-67.09 1.16 \n", - "-68.34 1.21 \n", - "-67.09 1.16 \n", - "6.39 0.44 \n", - "-10.69 0.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.75 7.62 \n", - "-3.09 5.7 \n", - "4.44 0.24 \n", - "-15.9 0.82 \n", - "-5.86 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.92 0.84 \n", - "0.92 0.84 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.83 0.39 \n", - "-3.84 0.39 \n", - "-11.5 1.16 \n", - "-3.87 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "3.76 8.46 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.86 6.18 \n", - "-19.86 6.14 \n", - "-19.86 6.54 \n", - "-19.86 6.49 \n", - "-9.31 0.43 \n", - "-9.31 0.43 \n", - "-122.35 1.05 \n", - "-122.35 1.05 \n", - "-2.86 0.33 \n", - "-24.42 7.38 \n", - "10000000.0 10000000.0 \n", - "3.24 0.82 \n", - "3.24 0.82 \n", - "3.24 0.82 \n", - "3.24 0.82 \n", - "3.24 0.82 \n", - "3.24 0.82 \n", - "3.24 0.82 \n", - "3.24 0.82 \n", - "3.24 0.82 \n", - "3.24 0.82 \n", - "4.44 0.24 \n", - "3.76 8.46 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "-0.18 0.36 \n", - "-0.18 0.36 \n", - "14.27 0.34 \n", - "14.27 0.34 \n", - "14.27 0.34 \n", - "14.27 0.34 \n", - "-19.86 6.16 \n", - "-19.2 6.21 \n", - "-1.7 9.57 \n", - "-1.7 10.47 \n", - "-1.7 9.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "3.24 0.82 \n", - "3.24 0.82 \n", - "-24.6 1.18 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.48 0.53 \n", - "-0.48 0.53 \n", - "22.6 1.66 \n", - "21.79 6.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "100.02 10.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-50.05 1.65 \n", - "-40.6 5.86 \n", - "10000000.0 10000000.0 \n", - "15.65 5.85 \n", - "-105.97 0.91 \n", - "-111.93 1.28 \n", - "-105.91 1.63 \n", - "-111.93 1.28 \n", - "-105.92 1.63 \n", - "-86.18 1.85 \n", - "-86.18 1.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-197.13 1.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-194.13 1.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.9 0.92 \n", - "-10.11 0.84 \n", - "10000000.0 10000000.0 \n", - "-91.9 1.76 \n", - "10000000.0 10000000.0 \n", - "1.47 11.27 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-40.59 14.57 \n", - "-55.07 9.14 \n", - "10000000.0 10000000.0 \n", - "-0.22 0.26 \n", - "-64.85 6.42 \n", - "10000000.0 10000000.0 \n", - "-207.0 1.57 \n", - "10000000.0 10000000.0 \n", - "-50.85 3.93 \n", - "10000000.0 10000000.0 \n", - "-23.57 9.75 \n", - "10.13 9.91 \n", - "-0.33 14.65 \n", - "None 0.49 \n", - "7.09 0.07 \n", - "-43.73 4.01 \n", - "-26.32 1.97 \n", - "-57.55 3.98 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.48 0.85 \n", - "10000000.0 10000000.0 \n", - "3.74 0.59 \n", - "-0.75 0.86 \n", - "2.59 0.8 \n", - "-20.34 2.05 \n", - "-1.55 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.18 0.75 \n", - "2.18 0.75 \n", - "None 4.26 \n", - "None 4.45 \n", - "2.18 0.75 \n", - "2.18 0.75 \n", - "None 4.46 \n", - "2.18 0.75 \n", - "2.18 0.75 \n", - "None 4.64 \n", - "None 4.67 \n", - "None 4.67 \n", - "None 4.82 \n", - "None 4.82 \n", - "None 5.07 \n", - "2.18 0.75 \n", - "None 4.88 \n", - "None 5.09 \n", - "None 5.09 \n", - "None 5.09 \n", - "None 5.21 \n", - "10000000.0 10000000.0 \n", - "-22.57 1.11 \n", - "-189.98 12.91 \n", - "-34.59 6.27 \n", - "-12.78 1.18 \n", - "-119.88 1.45 \n", - "-14.4 7.04 \n", - "9.59 6.29 \n", - "-13.31 0.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-97.22 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.65 0.46 \n", - "10000000.0 10000000.0 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "-51.69 3.16 \n", - "-0.96 1.47 \n", - "-0.59 0.75 \n", - "-0.59 0.75 \n", - "None None \n", - "None None \n", - "-0.96 1.47 \n", - "-0.96 1.47 \n", - "-0.96 1.47 \n", - "-1.55 0.74 \n", - "-1.55 0.74 \n", - "-1.55 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-125.69 0.47 \n", - "-125.69 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.65 1.11 \n", - "-3.65 1.11 \n", - "-1.36 6.79 \n", - "-1.36 6.79 \n", - "-10.63 1.23 \n", - "-3.0 0.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.4 1.4 \n", - "4.44 0.24 \n", - "-5.81 0.35 \n", - "-5.81 0.35 \n", - "-7.19 0.32 \n", - "-105.98 0.91 \n", - "-5.8 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 7.69 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.89 0.25 \n", - "-9.06 0.27 \n", - "-10.93 5.66 \n", - "-39.48 5.64 \n", - "14.65 5.65 \n", - "10000000.0 10000000.0 \n", - "7.34 2.56 \n", - "-5.96 0.32 \n", - "10000000.0 10000000.0 \n", - "-189.98 12.77 \n", - "-119.88 1.45 \n", - "-14.4 6.86 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.61 7.28 \n", - "None None \n", - "0.18 0.36 \n", - "10.55 0.84 \n", - "5.29 1.76 \n", - "10.72 0.87 \n", - "-15.26 3.57 \n", - "-62.48 1.36 \n", - "-11.68 0.39 \n", - "-22.91 1.01 \n", - "-20.64 5.57 \n", - "-14.92 1.4 \n", - "-14.92 1.4 \n", - "-20.64 5.74 \n", - "-105.97 0.91 \n", - "-105.97 0.91 \n", - "4.21 0.8 \n", - "-22.91 1.01 \n", - "-20.64 8.36 \n", - "-20.64 8.36 \n", - "-34.19 0.26 \n", - "-13.9 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.65 2.03 \n", - "-0.89 0.73 \n", - "-5.96 1.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.8 0.55 \n", - "-7.56 0.81 \n", - "-8.36 0.58 \n", - "-26.84 4.92 \n", - "-26.84 5.0 \n", - "10000000.0 10000000.0 \n", - "0.37 0.56 \n", - "0.37 0.56 \n", - "-0.88 0.81 \n", - "-0.88 0.81 \n", - "-77.12 4.13 \n", - "-117.73 4.26 \n", - "-110.1 2.25 \n", - "None None \n", - "-2.14 0.18 \n", - "-3.59 0.52 \n", - "-5.73 0.54 \n", - "-5.73 0.54 \n", - "-5.4 0.55 \n", - "-3.11 4.19 \n", - "-17.63 1.07 \n", - "-49.25 0.53 \n", - "10000000.0 10000000.0 \n", - "-55.17 1.05 \n", - "-0.07 0.57 \n", - "-39.17 2.52 \n", - "-158.48 2.98 \n", - "-58.45 0.54 \n", - "-97.22 0.8 \n", - "-5.14 1.86 \n", - "-9.33 0.11 \n", - "22.25 1.18 \n", - "10000000.0 10000000.0 \n", - "-4.57 3.39 \n", - "-26.04 3.33 \n", - "-25.52 6.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.35 0.99 \n", - "-9.36 0.55 \n", - "3.87 2.37 \n", - "-9.13 0.55 \n", - "-3.97 0.52 \n", - "6.89 0.98 \n", - "-10.34 2.37 \n", - "-3.74 0.52 \n", - "-0.75 6.88 \n", - "-15.13 4.29 \n", - "-8.55 0.26 \n", - "10000000.0 10000000.0 \n", - "-105.97 0.91 \n", - "-105.97 0.91 \n", - "-105.97 0.91 \n", - "-105.97 0.91 \n", - "-105.98 0.91 \n", - "-105.98 0.91 \n", - "-100.42 1.33 \n", - "9.83 0.39 \n", - "-15.54 0.35 \n", - "13.66 1.6 \n", - "28.01 0.2 \n", - "10000000.0 10000000.0 \n", - "-4.36 9.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.16 0.99 \n", - "-9.12 0.55 \n", - "-3.98 0.52 \n", - "6.7 0.98 \n", - "10000000.0 10000000.0 \n", - "-4.5 9.73 \n", - "-19.78 1.92 \n", - "-19.78 1.92 \n", - "-0.56 9.81 \n", - "-0.56 9.81 \n", - "0.1 9.81 \n", - "0.1 9.81 \n", - "-16.98 11.54 \n", - "-16.98 11.54 \n", - "14.27 0.34 \n", - "-95.25 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.63 1.66 \n", - "21.0 10.87 \n", - "10000000.0 10000000.0 \n", - "-13.19 1.1 \n", - "-13.81 1.21 \n", - "-13.81 1.21 \n", - "-2.73 0.45 \n", - "-2.73 0.45 \n", - "-2.41 0.52 \n", - "-2.41 0.52 \n", - "-13.16 0.99 \n", - "-9.12 0.55 \n", - "-3.98 0.52 \n", - "6.7 0.98 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.88 7.42 \n", - "-104.34 8.4 \n", - "-18.46 0.78 \n", - "-18.46 0.78 \n", - "-115.73 1.59 \n", - "-113.03 1.41 \n", - "-2.41 0.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-104.34 10.2 \n", - "-208.47 2.24 \n", - "-119.88 1.45 \n", - "7.08 1.27 \n", - "7.08 1.27 \n", - "7.08 1.27 \n", - "9.12 1.25 \n", - "7.08 1.27 \n", - "7.08 1.27 \n", - "7.08 1.27 \n", - "7.08 1.27 \n", - "9.12 1.25 \n", - "-13.34 0.99 \n", - "-9.34 0.55 \n", - "-3.76 0.52 \n", - "6.88 0.98 \n", - "-3.74 0.42 \n", - "-3.78 0.6 \n", - "-3.74 0.42 \n", - "-3.78 0.6 \n", - "-5.97 0.42 \n", - "-4.08 5.59 \n", - "-4.08 5.59 \n", - "-4.08 5.59 \n", - "-4.08 5.59 \n", - "-1.7 5.59 \n", - "-3.74 0.42 \n", - "-3.78 0.6 \n", - "-3.74 0.42 \n", - "-3.78 0.6 \n", - "-3.74 0.42 \n", - "-3.78 0.6 \n", - "-3.74 0.42 \n", - "-3.78 0.6 \n", - "-3.74 0.42 \n", - "-3.78 0.6 \n", - "-3.74 0.42 \n", - "-3.78 0.6 \n", - "-3.74 0.42 \n", - "-3.78 0.6 \n", - "10000000.0 10000000.0 \n", - "-37.02 7.55 \n", - "-81.93 6.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.45 0.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.25 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "0.28 0.38 \n", - "1.57 0.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.63 0.68 \n", - "-21.34 4.64 \n", - "-1.89 0.59 \n", - "3.44 0.62 \n", - "95.52 1.97 \n", - "142.45 5.58 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "-18.81 6.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.35 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.04 1.08 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "-106.03 0.91 \n", - "4.29 4.13 \n", - "-67.14 6.81 \n", - "10000000.0 10000000.0 \n", - "2.76 7.66 \n", - "-6.4 0.52 \n", - "-5.06 1.01 \n", - "8.72 5.53 \n", - "-1.6 0.35 \n", - "10000000.0 10000000.0 \n", - "-47.65 1.66 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.68 \n", - "-8.37 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.38 1.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.81 6.28 \n", - "10000000.0 10000000.0 \n", - "-24.88 21.55 \n", - "13.16 0.72 \n", - "-6.51 1.09 \n", - "0.83 2.7 \n", - "237.59 1.08 \n", - "-2.03 0.53 \n", - "-1.58 6.09 \n", - "-97.48 1.09 \n", - "10000000.0 10000000.0 \n", - "-0.9 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.13 4.36 \n", - "5.53 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-107.68 1.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-34.58 1.79 \n", - "10000000.0 10000000.0 \n", - "-4.7 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.23 6.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "-1.64 0.95 \n", - "6.36 6.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.91 7.35 \n", - "-94.13 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-100.37 0.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.47 3.51 \n", - "10000000.0 10000000.0 \n", - "-71.84 0.2 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.56 4.47 \n", - "-27.75 1.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.65 0.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-20.55 1.4 \n", - "10000000.0 10000000.0 \n", - "-11.57 1.97 \n", - "10000000.0 10000000.0 \n", - "-31.45 5.8 \n", - "-0.37 0.55 \n", - "10.56 3.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "87.67 0.3 \n", - "-4.36 6.26 \n", - "-102.35 1.16 \n", - "-13.09 1.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-77.88 13.98 \n", - "10000000.0 10000000.0 \n", - "45.78 4.23 \n", - "-166.81 3.17 \n", - "10000000.0 10000000.0 \n", - "-1.89 1.29 \n", - "10000000.0 10000000.0 \n", - "289.1 0.21 \n", - "-5.82 0.35 \n", - "-6.02 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3091.77 13.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-29.74 1.82 \n", - "4.89 0.25 \n", - "-7.2 0.41 \n", - "2.08 0.34 \n", - "-9.06 0.26 \n", - "10000000.0 10000000.0 \n", - "21.7 3.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.98 0.42 \n", - "10000000.0 10000000.0 \n", - "30.97 2.76 \n", - "10000000.0 10000000.0 \n", - "-91.65 4.65 \n", - "10000000.0 10000000.0 \n", - "-0.1 0.24 \n", - "-10.13 1.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.61 5.1 \n", - "10000000.0 10000000.0 \n", - "-0.74 0.53 \n", - "-4.36 6.58 \n", - "10000000.0 10000000.0 \n", - "-12.96 4.25 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "-25.07 7.17 \n", - "-6.07 0.85 \n", - "7.21 0.31 \n", - "10000000.0 10000000.0 \n", - "-11.86 0.81 \n", - "-69.98 4.36 \n", - "-3.33 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "-5.29 5.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.22 2.23 \n", - "10000000.0 10000000.0 \n", - "-2.86 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 20.23 \n", - "10000000.0 10000000.0 \n", - "4.33 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.2 5.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.12 0.53 \n", - "-0.46 1.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.75 0.52 \n", - "-40.05 2.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "21.65 5.31 \n", - "-14.03 6.62 \n", - "4.81 1.37 \n", - "10000000.0 10000000.0 \n", - "-34.54 1.84 \n", - "-0.37 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "5.86 7.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.07 \n", - "10000000.0 10000000.0 \n", - "-1.35 0.33 \n", - "-42.9 2.18 \n", - "-9.77 5.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.19 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.61 7.11 \n", - "-2.97 2.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 1.65 \n", - "10000000.0 10000000.0 \n", - "-1.7 26.29 \n", - "10000000.0 10000000.0 \n", - "-1.17 13.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.72 8.82 \n", - "177.99 0.73 \n", - "-3.53 6.32 \n", - "10000000.0 10000000.0 \n", - "-1.7 5.31 \n", - "-18.82 0.66 \n", - "3.41 1.14 \n", - "11.57 5.34 \n", - "-1.92 5.04 \n", - "10000000.0 10000000.0 \n", - "4.47 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-29.5 7.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "91.84 3.34 \n", - "-87.62 0.79 \n", - "-4.17 0.32 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.34 0.54 \n", - "-21.55 6.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.99 \n", - "10000000.0 10000000.0 \n", - "23.24 5.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-113.3 0.76 \n", - "-46.66 1.67 \n", - "-7.76 4.0 \n", - "10000000.0 10000000.0 \n", - "-1.83 1.45 \n", - "-0.9 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.56 6.93 \n", - "8.5 1.07 \n", - "7.75 0.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.84 0.39 \n", - "None 3.45 \n", - "-13.11 5.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "-13.18 1.07 \n", - "3.35 0.91 \n", - "-2.51 0.65 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-107.74 1.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-32.53 5.71 \n", - "10000000.0 10000000.0 \n", - "-2.77 0.35 \n", - "10000000.0 10000000.0 \n", - "-4.18 0.32 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.63 \n", - "10000000.0 10000000.0 \n", - "-2.17 0.3 \n", - "-2.94 3.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-34.53 4.86 \n", - "10000000.0 10000000.0 \n", - "-39.72 10.41 \n", - "-2.81 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.02 0.56 \n", - "-26.84 5.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.87 0.31 \n", - "10000000.0 10000000.0 \n", - "-104.51 1.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-88.91 4.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-23.95 7.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.35 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-105.45 1.44 \n", - "-206.26 3.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.07 0.86 \n", - "-105.95 0.91 \n", - "10000000.0 10000000.0 \n", - "-3.62 0.45 \n", - "-8.76 0.66 \n", - "-12.57 0.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "14.27 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.02 0.49 \n", - "-4.36 8.33 \n", - "-0.39 0.41 \n", - "-21.55 6.6 \n", - "-52.23 2.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 5.91 \n", - "-94.96 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.03 0.34 \n", - "10000000.0 10000000.0 \n", - "-12.13 0.72 \n", - "4.89 0.24 \n", - "-0.68 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.86 2.38 \n", - "-17.62 0.92 \n", - "1.19 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "-3.17 0.58 \n", - "10000000.0 10000000.0 \n", - "-0.46 1.57 \n", - "57.67 0.41 \n", - "10000000.0 10000000.0 \n", - "-2.7 9.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.44 0.24 \n", - "-61.38 1.7 \n", - "-108.25 1.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.82 0.35 \n", - "1.78 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.69 0.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.03 0.43 \n", - "-14.03 4.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.76 0.53 \n", - "10000000.0 10000000.0 \n", - "-3.63 0.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "-3.7 0.86 \n", - "10000000.0 10000000.0 \n", - "-26.84 4.48 \n", - "10000000.0 10000000.0 \n", - "-63.79 20.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.59 1.29 \n", - "-11.71 0.91 \n", - "None 11.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.74 0.53 \n", - "-2.03 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-24.99 1.26 \n", - "-84.48 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "15.46 5.06 \n", - "-71.78 4.31 \n", - "-33.35 19.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.51 2.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "429.54 3.37 \n", - "10000000.0 10000000.0 \n", - "-1.7 8.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "-4.69 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "157.16 1.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.63 1.66 \n", - "10000000.0 10000000.0 \n", - "-26.84 5.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.46 0.05 \n", - "-3.84 0.39 \n", - "10000000.0 10000000.0 \n", - "-10.76 10.74 \n", - "10000000.0 10000000.0 \n", - "-3.59 0.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.07 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-65.16 2.1 \n", - "10000000.0 10000000.0 \n", - "-3.04 0.42 \n", - "10000000.0 10000000.0 \n", - "-20.65 1.47 \n", - "10000000.0 10000000.0 \n", - "-1.7 9.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.93 0.56 \n", - "-40.41 3.41 \n", - "-13.21 1.06 \n", - "-118.86 3.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.84 6.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-105.96 0.91 \n", - "10000000.0 10000000.0 \n", - "-1.7 10.73 \n", - "1.6 13.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.88 0.56 \n", - "-50.32 17.9 \n", - "None 2.7 \n", - "-1.59 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-119.29 30.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 3.56 \n", - "-31.45 5.38 \n", - "-0.4 1.75 \n", - "-4.36 6.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-127.44 1.94 \n", - "-11.16 0.62 \n", - "10000000.0 10000000.0 \n", - "250.26 3.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.45 1.21 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-25.07 7.2 \n", - "-6.53 5.01 \n", - "-9.21 6.24 \n", - "10000000.0 10000000.0 \n", - "-4.38 1.47 \n", - "10000000.0 10000000.0 \n", - "-0.46 5.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "290.76 0.58 \n", - "10000000.0 10000000.0 \n", - "2.9 3.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.14 0.76 \n", - "10000000.0 10000000.0 \n", - "1.23 0.72 \n", - "-69.98 4.36 \n", - "-0.9 0.81 \n", - "10000000.0 10000000.0 \n", - "-13.11 6.41 \n", - "-74.27 4.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.99 0.41 \n", - "10000000.0 10000000.0 \n", - "3.76 8.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-90.63 6.18 \n", - "1.22 2.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.56 4.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "None 1.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-43.12 2.54 \n", - "-0.87 5.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.13 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.37 0.45 \n", - "-29.23 7.46 \n", - "7.79 0.68 \n", - "-40.59 8.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.23 \n", - "None None \n", - "5.68 5.96 \n", - "-2.86 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.22 1.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.51 8.68 \n", - "10000000.0 10000000.0 \n", - "-5.1 0.3 \n", - "-6.13 0.57 \n", - "10000000.0 10000000.0 \n", - "-16.41 1.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.13 5.07 \n", - "-4.36 5.23 \n", - "-105.84 1.07 \n", - "-13.89 1.22 \n", - "10000000.0 10000000.0 \n", - "14.26 0.34 \n", - "-2.03 0.43 \n", - "10000000.0 10000000.0 \n", - "-40.05 2.16 \n", - "-6.07 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.07 0.63 \n", - "11.74 1.51 \n", - "-2.62 0.35 \n", - "-14.03 6.71 \n", - "10000000.0 10000000.0 \n", - "61.57 6.42 \n", - "10000000.0 10000000.0 \n", - "-1.26 0.57 \n", - "-12.77 0.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-198.42 18.99 \n", - "-35.12 2.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.51 8.62 \n", - "10000000.0 10000000.0 \n", - "1.27 0.82 \n", - "None None \n", - "-6.16 0.07 \n", - "-2.81 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "96.34 10.05 \n", - "10000000.0 10000000.0 \n", - "-0.8 5.26 \n", - "-13.16 4.71 \n", - "None 1.88 \n", - "10000000.0 10000000.0 \n", - "-7.39 0.65 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-20.64 5.4 \n", - "10000000.0 10000000.0 \n", - "4.62 2.12 \n", - "-1.88 5.55 \n", - "-8.63 0.26 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "-109.13 8.15 \n", - "-4.31 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.61 0.35 \n", - "-20.62 5.54 \n", - "10000000.0 10000000.0 \n", - "-6.73 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.21 \n", - "10000000.0 10000000.0 \n", - "7.19 0.32 \n", - "10000000.0 10000000.0 \n", - "-26.58 1.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 1.63 \n", - "10000000.0 10000000.0 \n", - "-15.02 0.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 6.57 \n", - "10000000.0 10000000.0 \n", - "-0.26 0.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.23 32.97 \n", - "-0.72 0.35 \n", - "-61.14 0.56 \n", - "6.48 0.85 \n", - "1.46 1.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-31.71 1.23 \n", - "10000000.0 10000000.0 \n", - "-15.02 0.79 \n", - "-18.53 0.78 \n", - "-1.11 2.92 \n", - "-101.37 1.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-49.25 0.53 \n", - "10000000.0 10000000.0 \n", - "-9.66 5.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.46 1.06 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "-4.2 0.57 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.17 3.7 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.02 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "668.78 2.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-49.25 0.53 \n", - "-6.81 5.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "72.98 1.02 \n", - "-4.95 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.92 3.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-133.18 4.01 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "-10.42 8.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.3 1.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.52 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.29 5.15 \n", - "-0.18 0.36 \n", - "113.73 1.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.88 0.56 \n", - "-0.28 0.37 \n", - "-15.02 0.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.27 1.0 \n", - "10000000.0 10000000.0 \n", - "1.26 0.28 \n", - "-4.36 7.44 \n", - "10000000.0 10000000.0 \n", - "-109.69 0.86 \n", - "-61.19 1.37 \n", - "None None \n", - "-2.55 0.35 \n", - "10000000.0 10000000.0 \n", - "-0.5 10.37 \n", - "-8.76 0.61 \n", - "10000000.0 10000000.0 \n", - "-14.03 13.67 \n", - "-2.16 0.33 \n", - "-28.55 6.04 \n", - "10000000.0 10000000.0 \n", - "196.31 11.66 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "59.91 0.49 \n", - "21.7 1.84 \n", - "-61.94 1.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-39.72 10.63 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.76 10.72 \n", - "-8.68 0.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-194.39 1.6 \n", - "5.06 6.33 \n", - "-5.73 0.54 \n", - "-2.03 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.07 0.51 \n", - "10000000.0 10000000.0 \n", - "-1.19 0.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.49 0.41 \n", - "None None \n", - "-13.2 1.07 \n", - "-13.25 1.06 \n", - "10000000.0 10000000.0 \n", - "None 0.88 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-195.87 4.47 \n", - "10000000.0 10000000.0 \n", - "-30.31 1.92 \n", - "-0.01 None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.87 3.68 \n", - "-1.98 0.61 \n", - "-0.99 0.31 \n", - "-0.99 0.31 \n", - "3.49 2.37 \n", - "10000000.0 10000000.0 \n", - "-1.7 5.51 \n", - "3.49 2.37 \n", - "10000000.0 10000000.0 \n", - "-54.19 3.53 \n", - "-57.53 0.74 \n", - "5.37 11.48 \n", - "2.32 0.73 \n", - "-56.58 0.75 \n", - "-56.59 0.75 \n", - "-29.54 0.75 \n", - "-29.55 0.76 \n", - "-118.19 0.76 \n", - "-118.19 0.76 \n", - "-56.58 0.75 \n", - "-56.59 0.75 \n", - "-29.54 0.75 \n", - "-29.55 0.76 \n", - "-118.19 0.76 \n", - "-118.19 0.76 \n", - "-61.87 1.11 \n", - "-49.02 0.35 \n", - "-56.59 0.75 \n", - "0.29 14.85 \n", - "-98.33 13.36 \n", - "-56.58 0.75 \n", - "-56.59 0.75 \n", - "-29.54 0.75 \n", - "-29.55 0.76 \n", - "-118.19 0.76 \n", - "-118.19 0.76 \n", - "-45.42 11.5 \n", - "-45.42 11.49 \n", - "0.29 11.49 \n", - "0.29 11.48 \n", - "-118.58 11.5 \n", - "-118.58 11.49 \n", - "-14.89 1.0 \n", - "-28.29 1.18 \n", - "-28.29 1.18 \n", - "10000000.0 10000000.0 \n", - "-77.35 1.25 \n", - "-77.34 1.25 \n", - "-42.68 1.23 \n", - "-5.5 0.33 \n", - "-0.44 0.64 \n", - "638.41 1.2 \n", - "-779.09 1.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.05 1.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-43.5 0.33 \n", - "-43.5 0.33 \n", - "-43.5 0.33 \n", - "-43.5 0.33 \n", - "-43.5 0.33 \n", - "-59.77 4.89 \n", - "-38.18 1.05 \n", - "-17.34 1.53 \n", - "-2.67 0.69 \n", - "-41.09 0.48 \n", - "10000000.0 10000000.0 \n", - "-17.73 2.41 \n", - "-46.99 0.24 \n", - "-46.01 0.58 \n", - "-46.01 0.58 \n", - "-3.95 0.73 \n", - "-1.9 0.45 \n", - "10000000.0 10000000.0 \n", - "None 0.4 \n", - "0.49 0.32 \n", - "-6.81 0.68 \n", - "193.72 5.32 \n", - "182.34 5.34 \n", - "1.18 0.45 \n", - "-66.95 1.29 \n", - "-66.95 1.29 \n", - "-1.98 0.65 \n", - "-1.67 0.54 \n", - "-7.29 0.76 \n", - "-15.71 0.62 \n", - "-1.54 0.44 \n", - "-41.82 0.58 \n", - "-27.53 5.1 \n", - "-44.65 1.14 \n", - "-43.44 1.21 \n", - "-7.24 0.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.65 0.53 \n", - "-5.81 0.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.42 \n", - "None 0.71 \n", - "None 0.48 \n", - "None 4.3 \n", - "None 4.3 \n", - "None 4.29 \n", - "None None \n", - "None 2.18 \n", - "None 0.71 \n", - "None 0.42 \n", - "None 0.41 \n", - "None 2.14 \n", - "None 0.44 \n", - "None 0.45 \n", - "None 0.41 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 4.27 \n", - "None 0.27 \n", - "None 0.54 \n", - "None 0.71 \n", - "None 4.3 \n", - "None 4.3 \n", - "None None \n", - "None 0.47 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 1.75 \n", - "None 0.71 \n", - "None 0.44 \n", - "None 0.71 \n", - "None 3.92 \n", - "None 0.71 \n", - "None 0.34 \n", - "None 0.44 \n", - "None 0.27 \n", - "None 0.54 \n", - "None 0.44 \n", - "None 4.3 \n", - "None 4.29 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.47 \n", - "None 0.71 \n", - "None 0.4 \n", - "None 0.68 \n", - "None 0.49 \n", - "None None \n", - "None 4.88 \n", - "10000000.0 10000000.0 \n", - "-74.63 2.18 \n", - "10000000.0 10000000.0 \n", - "-2.67 0.69 \n", - "-10.42 6.55 \n", - "6.02 0.21 \n", - "6.02 0.21 \n", - "0.07 0.13 \n", - "-9.59 4.37 \n", - "7.09 0.11 \n", - "-21.19 1.04 \n", - "-3.53 0.8 \n", - "-1.42 0.64 \n", - "-6.56 0.87 \n", - "-1.52 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.62 1.19 \n", - "2.13 0.56 \n", - "1.99 0.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.14 0.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.34 0.85 \n", - "-244.56 0.95 \n", - "-244.56 0.95 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.01 5.36 \n", - "10000000.0 10000000.0 \n", - "-0.31 0.71 \n", - "10000000.0 10000000.0 \n", - "-0.32 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.46 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "23.35 0.94 \n", - "10000000.0 10000000.0 \n", - "-6.04 0.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.35 1.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-126.88 4.94 \n", - "-23.09 1.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.51 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.14 0.96 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "50.12 0.52 \n", - "14.4 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.12 0.13 \n", - "10000000.0 10000000.0 \n", - "-40.48 0.31 \n", - "-40.48 0.31 \n", - "-40.48 0.31 \n", - "-40.48 0.31 \n", - "-40.48 0.31 \n", - "-40.48 0.31 \n", - "-40.48 0.31 \n", - "-40.48 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-43.52 8.13 \n", - "-39.84 8.05 \n", - "13.87 5.18 \n", - "873.99 2.56 \n", - "-0.4 0.31 \n", - "10000000.0 10000000.0 \n", - "None 4.29 \n", - "None 0.71 \n", - "-7.23 0.84 \n", - "-7.23 0.84 \n", - "-11.48 0.31 \n", - "-11.48 0.32 \n", - "2.94 0.49 \n", - "2.94 0.49 \n", - "1.6 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-46.06 1.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-91.54 2.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-33.26 2.13 \n", - "3.13 0.76 \n", - "60.01 0.92 \n", - "6.51 0.55 \n", - "1.11 0.92 \n", - "10000000.0 10000000.0 \n", - "-19.54 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-69.76 1.13 \n", - "10000000.0 10000000.0 \n", - "-46.53 2.0 \n", - "10.54 0.21 \n", - "-16.86 1.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-108.63 1.19 \n", - "-29.5 1.61 \n", - "8.8 1.91 \n", - "-0.84 0.58 \n", - "-1.07 1.13 \n", - "10000000.0 10000000.0 \n", - "-14.34 2.92 \n", - "-3.82 0.6 \n", - "9.5 0.95 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-120.92 2.59 \n", - "11.14 0.86 \n", - "10000000.0 10000000.0 \n", - "8.39 0.99 \n", - "363.59 254.56 \n", - "70.04 0.82 \n", - "-3.86 0.48 \n", - "-7.78 2.81 \n", - "-9.29 1.24 \n", - "577.31 3.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-22.49 1.11 \n", - "10000000.0 10000000.0 \n", - "-367.1 4.77 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.63 0.26 \n", - "4.29 0.24 \n", - "43.24 12.2 \n", - "10000000.0 10000000.0 \n", - "10.66 0.78 \n", - "10000000.0 10000000.0 \n", - "10.66 0.78 \n", - "53.36 1.62 \n", - "-2.63 7.05 \n", - "10.66 0.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "52.75 2.15 \n", - "10.77 0.89 \n", - "10.66 0.78 \n", - "22.7 0.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "61.39 2.33 \n", - "-20.18 2.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.52 0.47 \n", - "10000000.0 10000000.0 \n", - "50.98 2.73 \n", - "-89.38 1.4 \n", - "-81.94 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-292.2 26.75 \n", - "-292.2 26.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.47 0.69 \n", - "3.2 0.69 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-224.46 30.72 \n", - "10000000.0 10000000.0 \n", - "-115.53 2.15 \n", - "12.56 6.38 \n", - "-16.82 1.56 \n", - "-449.7 3.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-335.85 2.23 \n", - "10000000.0 10000000.0 \n", - "-71.47 2.4 \n", - "1096.98 36.3 \n", - "1096.98 36.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-38.35 0.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "903.43 1.05 \n", - "-90.7 0.91 \n", - "-166.35 6.42 \n", - "-288.69 38.53 \n", - "-70.77 8.88 \n", - "-550.63 64.31 \n", - "10000000.0 10000000.0 \n", - "-5.48 0.43 \n", - "10000000.0 10000000.0 \n", - "752.51 53.2 \n", - "-96.0 7.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.3 0.85 \n", - "1.01 0.19 \n", - "None 5.03 \n", - "None 0.71 \n", - "None 4.33 \n", - "None 0.41 \n", - "None 1.87 \n", - "None 0.76 \n", - "None 0.51 \n", - "None 0.66 \n", - "None 0.3 \n", - "None 0.81 \n", - "None 1.84 \n", - "None 7.59 \n", - "None 4.99 \n", - "None 0.71 \n", - "None 5.53 \n", - "None 5.06 \n", - "None 1.06 \n", - "None 5.05 \n", - "None 7.23 \n", - "None 5.43 \n", - "None 5.29 \n", - "None 5.5 \n", - "None 5.52 \n", - "None 5.4 \n", - "None 5.3 \n", - "None 5.23 \n", - "None 5.16 \n", - "None 5.09 \n", - "None 5.11 \n", - "None 5.39 \n", - "None 5.22 \n", - "None 5.15 \n", - "109.52 0.8 \n", - "18.48 0.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "576.46 3.42 \n", - "494.26 4.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 5.03 \n", - "None 5.33 \n", - "None 5.16 \n", - "None 5.09 \n", - "None 5.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "335.74 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-684.71 0.71 \n", - "-682.88 0.63 \n", - "-341.98 0.48 \n", - "-344.0 0.57 \n", - "-345.54 0.59 \n", - "-343.71 0.53 \n", - "10000000.0 10000000.0 \n", - "337.26 0.81 \n", - "-338.95 0.37 \n", - "-683.57 0.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "234.08 0.96 \n", - "-2.09 0.69 \n", - "-2.11 0.69 \n", - "337.37 0.86 \n", - "-380.44 1.09 \n", - "-342.69 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-451.57 7.02 \n", - "10000000.0 10000000.0 \n", - "-0.35 0.77 \n", - "-335.6 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-338.55 1.32 \n", - "-338.54 1.32 \n", - "-335.6 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "370.41 8.55 \n", - "337.38 0.86 \n", - "-551.95 9.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-472.92 7.12 \n", - "10000000.0 10000000.0 \n", - "-348.23 1.16 \n", - "-468.1 7.14 \n", - "234.08 0.96 \n", - "-342.65 0.46 \n", - "233.84 1.02 \n", - "930.73 1.67 \n", - "-334.32 1.52 \n", - "10000000.0 10000000.0 \n", - "338.55 0.48 \n", - "-335.52 1.93 \n", - "-326.77 1.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-340.93 0.97 \n", - "234.07 0.96 \n", - "245.91 0.81 \n", - "245.91 0.81 \n", - "-335.6 0.38 \n", - "-343.81 0.46 \n", - "338.25 1.32 \n", - "-347.37 1.15 \n", - "-39.84 8.6 \n", - "-39.84 8.56 \n", - "-338.64 0.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-552.32 7.88 \n", - "10000000.0 10000000.0 \n", - "-335.89 0.43 \n", - "268.37 1.18 \n", - "10000000.0 10000000.0 \n", - "317.13 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.07 6.54 \n", - "-14.03 5.98 \n", - "2.1 4.19 \n", - "0.07 6.54 \n", - "-1.7 8.03 \n", - "-3.01 2.69 \n", - "0.4 0.71 \n", - "10000000.0 10000000.0 \n", - "0.4 0.71 \n", - "10000000.0 10000000.0 \n", - "1.18 0.45 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "1.14 0.09 \n", - "None 0.71 \n", - "4.44 0.24 \n", - "-0.99 0.31 \n", - "10000000.0 10000000.0 \n", - "-40.98 1.18 \n", - "None 2.01 \n", - "-40.98 1.18 \n", - "-5.31 1.13 \n", - "-5.31 1.13 \n", - "-18.13 0.71 \n", - "-18.13 0.71 \n", - "None 3.44 \n", - "-0.88 0.33 \n", - "-1.98 0.47 \n", - "-22.57 1.11 \n", - "-214.79 0.39 \n", - "-23.93 0.27 \n", - "-5.31 1.13 \n", - "0.79 0.71 \n", - "None None \n", - "-5.31 1.13 \n", - "None 1.8 \n", - "-0.33 0.82 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "-6.08 1.02 \n", - "-14.12 0.57 \n", - "6.14 0.2 \n", - "10000000.0 10000000.0 \n", - "None 0.64 \n", - "-105.97 0.91 \n", - "6.36 0.98 \n", - "None None \n", - "1.4 0.94 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.89 0.62 \n", - "-39.75 1.06 \n", - "None 0.44 \n", - "-39.75 1.06 \n", - "10000000.0 10000000.0 \n", - "8.09 0.14 \n", - "10000000.0 10000000.0 \n", - "0.36 0.71 \n", - "None 5.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.66 0.8 \n", - "-2.66 0.8 \n", - "-2.82 0.67 \n", - "None 4.41 \n", - "-2.82 0.67 \n", - "-9.54 1.46 \n", - "-0.99 0.31 \n", - "10000000.0 10000000.0 \n", - "0.36 0.71 \n", - "0.36 0.71 \n", - "None 1.36 \n", - "None 1.63 \n", - "None 2.4 \n", - "None 1.36 \n", - "None 2.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.89 4.12 \n", - "None 4.37 \n", - "None 4.54 \n", - "10000000.0 10000000.0 \n", - "None 2.05 \n", - "None 4.37 \n", - "None 2.05 \n", - "None 2.05 \n", - "-3.33 0.3 \n", - "10000000.0 10000000.0 \n", - "-5.88 0.41 \n", - "-14.27 0.34 \n", - "-5.88 0.41 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "-14.27 0.34 \n", - "-3.99 0.33 \n", - "None 5.87 \n", - "None 1.99 \n", - "None 3.03 \n", - "-15.13 0.33 \n", - "0.74 0.35 \n", - "None 2.23 \n", - "None 0.69 \n", - "None 0.69 \n", - "4.73 0.71 \n", - "None 1.13 \n", - "-2.14 1.05 \n", - "-2.14 1.05 \n", - "-2.14 1.05 \n", - "None 1.13 \n", - "2.27 0.73 \n", - "-0.98 0.4 \n", - "None 1.48 \n", - "-90.63 6.54 \n", - "-0.98 0.4 \n", - "None 1.48 \n", - "0.53 0.21 \n", - "-90.63 6.54 \n", - "None 1.48 \n", - "2.27 0.73 \n", - "10000000.0 10000000.0 \n", - "-4.62 0.68 \n", - "0.08 0.43 \n", - "-8.93 1.02 \n", - "7.87 4.33 \n", - "7.87 4.33 \n", - "None 2.81 \n", - "10000000.0 10000000.0 \n", - "None 2.81 \n", - "10000000.0 10000000.0 \n", - "0.53 0.21 \n", - "-2.3 9.24 \n", - "7.87 4.33 \n", - "10000000.0 10000000.0 \n", - "-27.92 1.39 \n", - "10000000.0 10000000.0 \n", - "None 1.97 \n", - "-0.14 0.58 \n", - "2.04 0.27 \n", - "10000000.0 10000000.0 \n", - "-5.49 0.18 \n", - "9.12 1.25 \n", - "9.12 1.25 \n", - "4.89 0.24 \n", - "4.89 0.25 \n", - "4.89 0.25 \n", - "-8.47 0.57 \n", - "-9.54 1.46 \n", - "3.48 0.52 \n", - "None 5.26 \n", - "None 5.15 \n", - "3.48 0.52 \n", - "None 5.15 \n", - "-8.68 0.26 \n", - "10000000.0 10000000.0 \n", - "None 2.18 \n", - "3.54 0.43 \n", - "-26.84 1.03 \n", - "-11.74 0.56 \n", - "None 6.31 \n", - "None 10.27 \n", - "None 6.04 \n", - "10000000.0 10000000.0 \n", - "None 10.27 \n", - "-11.74 0.56 \n", - "None 6.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 5.47 \n", - "-5.85 0.61 \n", - "None 5.47 \n", - "-3.95 0.73 \n", - "-40.88 1.06 \n", - "3.54 0.43 \n", - "-40.88 1.06 \n", - "-1.89 0.66 \n", - "-1.98 0.41 \n", - "-0.98 0.4 \n", - "None 5.47 \n", - "None 3.66 \n", - "-40.88 1.06 \n", - "-2.63 1.54 \n", - "None 1.51 \n", - "-40.88 1.06 \n", - "-2.63 1.54 \n", - "4.98 5.01 \n", - "-2.04 0.72 \n", - "None 0.71 \n", - "-2.04 0.72 \n", - "None 6.97 \n", - "-5.49 0.18 \n", - "-0.68 0.53 \n", - "-5.49 0.18 \n", - "None 1.09 \n", - "-5.49 0.18 \n", - "None 5.5 \n", - "0.18 0.71 \n", - "-5.9 1.12 \n", - "0.18 0.71 \n", - "1.64 0.42 \n", - "None 5.5 \n", - "None 4.06 \n", - "-5.39 0.58 \n", - "-5.39 0.58 \n", - "1.64 0.42 \n", - "None 4.06 \n", - "-2.66 0.99 \n", - "-5.39 0.58 \n", - "None 5.22 \n", - "None 2.18 \n", - "None 5.22 \n", - "None 5.23 \n", - "-23.36 1.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.18 \n", - "24.01 3.68 \n", - "-3.37 0.34 \n", - "24.01 3.68 \n", - "None 5.47 \n", - "24.01 3.68 \n", - "10000000.0 10000000.0 \n", - "24.01 3.68 \n", - "-3.37 0.34 \n", - "None 1.6 \n", - "-3.37 0.34 \n", - "24.01 3.68 \n", - "-7.26 1.32 \n", - "None 1.6 \n", - "-7.26 1.32 \n", - "-128.56 0.76 \n", - "None 5.47 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "-3.78 0.52 \n", - "23.24 5.36 \n", - "-0.33 0.82 \n", - "10000000.0 10000000.0 \n", - "-1.88 0.46 \n", - "-7.0 1.54 \n", - "None 1.3 \n", - "-0.04 0.55 \n", - "-53.52 9.09 \n", - "None 0.71 \n", - "-22.54 1.11 \n", - "-10.46 0.64 \n", - "-53.52 9.09 \n", - "-0.04 0.55 \n", - "-22.54 1.11 \n", - "10.42 6.57 \n", - "None 8.77 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-80.98 0.81 \n", - "-29.23 7.46 \n", - "10000000.0 10000000.0 \n", - "-9.5 3.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-56.02 0.43 \n", - "-11.13 6.92 \n", - "-34.29 1.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.31 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.43 0.21 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 5.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 5.1 \n", - "29.11 5.93 \n", - "-2.79 0.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.74 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.19 0.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-110.14 1.17 \n", - "10000000.0 10000000.0 \n", - "-100.32 6.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "113.73 1.49 \n", - "10000000.0 10000000.0 \n", - "-8.44 0.72 \n", - "10000000.0 10000000.0 \n", - "-94.47 0.82 \n", - "10000000.0 10000000.0 \n", - "-94.13 0.75 \n", - "-1.36 1.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.84 0.3 \n", - "-21.33 1.4 \n", - "10000000.0 10000000.0 \n", - "-12.96 7.03 \n", - "-11.13 4.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.04 0.55 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.19 0.32 \n", - "-0.44 0.47 \n", - "10000000.0 10000000.0 \n", - "1.07 7.03 \n", - "-9.32 6.94 \n", - "-1.7 8.46 \n", - "10000000.0 10000000.0 \n", - "-94.65 0.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-71.84 0.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.04 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.88 0.56 \n", - "10000000.0 10000000.0 \n", - "-10.99 1.3 \n", - "-13.15 5.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.54 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "14.27 0.34 \n", - "-95.07 0.74 \n", - "10000000.0 10000000.0 \n", - "-18.99 2.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.23 0.93 \n", - "9.53 5.73 \n", - "-0.37 0.55 \n", - "10000000.0 10000000.0 \n", - "-3.86 0.49 \n", - "7.19 0.32 \n", - "10000000.0 10000000.0 \n", - "-0.49 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 6.46 \n", - "-5.72 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.25 7.46 \n", - "10000000.0 10000000.0 \n", - "-45.92 1.67 \n", - "-12.56 4.47 \n", - "None None \n", - "-10.06 0.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.13 4.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-36.72 3.92 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "2.54 9.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.16 1.97 \n", - "10000000.0 10000000.0 \n", - "-3.52 2.88 \n", - "-78.37 4.99 \n", - "10000000.0 10000000.0 \n", - "-27.49 5.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-40.05 2.16 \n", - "4.97 0.67 \n", - "None None \n", - "-6.9 4.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "476.46 4.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-27.66 1.31 \n", - "10000000.0 10000000.0 \n", - "-23.89 6.35 \n", - "-4.36 7.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.45 0.24 \n", - "10000000.0 10000000.0 \n", - "-8.68 0.26 \n", - "-3.09 0.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 13.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.78 1.11 \n", - "-10.33 0.52 \n", - "10000000.0 10000000.0 \n", - "-4.31 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.51 0.78 \n", - "10000000.0 10000000.0 \n", - "-4.44 0.24 \n", - "0.84 0.71 \n", - "10000000.0 10000000.0 \n", - "-26.84 4.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "122.79 0.95 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-53.5 6.81 \n", - "10000000.0 10000000.0 \n", - "-4.17 0.75 \n", - "-2.83 0.3 \n", - "-2.35 0.35 \n", - "None 17.98 \n", - "-2.66 5.33 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "101.72 0.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.04 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.13 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "55.69 0.97 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.94 0.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-105.96 0.91 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.9 0.51 \n", - "-2.77 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.77 1.28 \n", - "10000000.0 10000000.0 \n", - "18.07 0.92 \n", - "-37.55 2.49 \n", - "-124.97 5.26 \n", - "4.88 0.24 \n", - "10000000.0 10000000.0 \n", - "0.36 0.61 \n", - "-2.65 0.77 \n", - "-62.07 2.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-93.65 0.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.34 5.28 \n", - "-2.03 0.43 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.78 \n", - "-119.24 2.25 \n", - "8.37 0.76 \n", - "10000000.0 10000000.0 \n", - "-1.7 9.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.21 0.96 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-69.87 2.5 \n", - "10000000.0 10000000.0 \n", - "31.05 2.86 \n", - "10000000.0 10000000.0 \n", - "-14.2 6.36 \n", - "10000000.0 10000000.0 \n", - "-1.72 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "-4.31 0.75 \n", - "6.34 0.54 \n", - "0.85 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.22 0.41 \n", - "0.35 0.61 \n", - "10000000.0 10000000.0 \n", - "-0.09 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.48 0.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.0 10.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-71.78 7.48 \n", - "-1.19 0.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.02 4.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.82 0.44 \n", - "-13.16 1.07 \n", - "10000000.0 10000000.0 \n", - "-99.12 10.28 \n", - "10000000.0 10000000.0 \n", - "-105.99 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.63 0.61 \n", - "10000000.0 10000000.0 \n", - "-35.94 1.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.66 0.8 \n", - "1.11 6.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.13 0.61 \n", - "-0.83 0.49 \n", - "-8.68 0.26 \n", - "10000000.0 10000000.0 \n", - "2.27 0.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "18.23 5.67 \n", - "153.09 3.71 \n", - "10000000.0 10000000.0 \n", - "-577.19 7.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.26 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.43 0.14 \n", - "-105.96 0.91 \n", - "-0.17 0.72 \n", - "-10.74 2.38 \n", - "-4.36 7.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.94 7.97 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.23 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 5.04 \n", - "0.24 1.65 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-97.65 1.18 \n", - "-2.71 0.45 \n", - "17.79 3.47 \n", - "-35.94 1.01 \n", - "-2646.19 143.61 \n", - "10000000.0 10000000.0 \n", - "-10.49 0.61 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.91 6.64 \n", - "-10.17 5.83 \n", - "21.46 1.06 \n", - "10000000.0 10000000.0 \n", - "-3.53 6.12 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.86 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.86 2.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-105.9 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.65 2.02 \n", - "None 10.93 \n", - "10000000.0 10000000.0 \n", - "7.64 0.68 \n", - "-11.13 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "6.48 0.85 \n", - "-14.03 14.06 \n", - "None 2.77 \n", - "-14.03 7.87 \n", - "-94.61 6.55 \n", - "10000000.0 10000000.0 \n", - "-179.35 5.24 \n", - "4.46 0.24 \n", - "-14.03 9.97 \n", - "0.56 0.76 \n", - "6.36 6.33 \n", - "-5.13 0.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "285.64 0.21 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-84.62 1.22 \n", - "10000000.0 10000000.0 \n", - "-10.46 6.29 \n", - "-0.28 0.37 \n", - "-3.53 8.1 \n", - "-4.92 0.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-28.34 1.62 \n", - "0.18 0.36 \n", - "None 14.71 \n", - "10000000.0 10000000.0 \n", - "-95.83 7.31 \n", - "-122.06 13.02 \n", - "-20.64 5.17 \n", - "-18.46 0.78 \n", - "-14.03 5.33 \n", - "10000000.0 10000000.0 \n", - "420.84 4.02 \n", - "10000000.0 10000000.0 \n", - "-3.87 0.56 \n", - "-87.62 2.22 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-86.41 3.02 \n", - "10000000.0 10000000.0 \n", - "-2.13 0.64 \n", - "10000000.0 10000000.0 \n", - "-21.27 1.97 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.57 0.56 \n", - "3.71 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.44 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.66 0.8 \n", - "-35.35 1.1 \n", - "10000000.0 10000000.0 \n", - "-16.34 4.25 \n", - "-3.31 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.79 1.81 \n", - "10000000.0 10000000.0 \n", - "-118.19 0.76 \n", - "None 0.41 \n", - "3.76 6.39 \n", - "9.51 6.34 \n", - "6.14 0.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.03 0.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.02 2.19 \n", - "-9.23 0.14 \n", - "10000000.0 10000000.0 \n", - "-14.92 3.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 11.24 \n", - "344.32 0.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.51 0.79 \n", - "-6.53 4.97 \n", - "-1.7 13.32 \n", - "-4.41 4.05 \n", - "-0.37 0.64 \n", - "10000000.0 10000000.0 \n", - "14.27 0.34 \n", - "10000000.0 10000000.0 \n", - "-2.55 3.06 \n", - "10000000.0 10000000.0 \n", - "-118.4 1.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.84 5.3 \n", - "10000000.0 10000000.0 \n", - "-2.21 0.53 \n", - "-4.36 6.38 \n", - "10000000.0 10000000.0 \n", - "-108.34 1.21 \n", - "10000000.0 10000000.0 \n", - "-5.48 8.95 \n", - "10000000.0 10000000.0 \n", - "18.6 6.81 \n", - "-117.19 10.54 \n", - "10000000.0 10000000.0 \n", - "0.31 0.31 \n", - "10000000.0 10000000.0 \n", - "-118.57 1.24 \n", - "-0.46 4.16 \n", - "10000000.0 10000000.0 \n", - "-3.97 0.52 \n", - "-0.7 0.78 \n", - "1.83 0.5 \n", - "10000000.0 10000000.0 \n", - "-11.13 5.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "69.67 7.1 \n", - "-8.63 1.24 \n", - "2.06 0.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.59 \n", - "-4.12 0.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "155.37 23.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "67.76 0.85 \n", - "-3.88 0.56 \n", - "-3.53 6.42 \n", - "10000000.0 10000000.0 \n", - "0.3 0.93 \n", - "-14.34 0.94 \n", - "-94.65 0.89 \n", - "15.54 1.41 \n", - "-106.02 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.3 1.88 \n", - "10000000.0 10000000.0 \n", - "None 0.41 \n", - "10000000.0 10000000.0 \n", - "-1.8 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.88 4.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.92 0.63 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-28.37 31.93 \n", - "-32.05 1.14 \n", - "109.46 1.29 \n", - "-2.63 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-80.44 3.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 5.47 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "-95.07 0.74 \n", - "-1.7 9.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.88 1.4 \n", - "-4.49 0.54 \n", - "-1.01 1.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-58.07 2.15 \n", - "-10.01 0.3 \n", - "-5.02 0.56 \n", - "-11.71 5.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.35 4.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.76 6.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.65 8.38 \n", - "-2593.93 12.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.78 0.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.68 0.93 \n", - "-15.81 1.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "152.62 2.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.57 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.46 7.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-25.29 1.02 \n", - "-102.36 1.16 \n", - "-4.36 6.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.91 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.38 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.69 0.37 \n", - "-11.67 0.39 \n", - "-52.23 2.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.83 3.76 \n", - "-8.73 0.93 \n", - "0.17 1.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.35 0.3 \n", - "-7.36 1.14 \n", - "0.36 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "87.3 0.36 \n", - "-0.28 0.37 \n", - "0.18 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.86 0.8 \n", - "-1.76 0.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.89 2.15 \n", - "10000000.0 10000000.0 \n", - "-11.99 3.48 \n", - "0.53 0.84 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.47 \n", - "-120.45 4.3 \n", - "-51.7 2.63 \n", - "-20.0 1.66 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.32 0.67 \n", - "6.21 1.06 \n", - "-72.3 1.04 \n", - "-7.42 1.34 \n", - "-2.65 0.42 \n", - "-3.04 0.42 \n", - "10000000.0 10000000.0 \n", - "-18.74 0.66 \n", - "-6.35 7.16 \n", - "-0.46 5.77 \n", - "10000000.0 10000000.0 \n", - "-1.73 0.52 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.83 \n", - "3.22 2.4 \n", - "10000000.0 10000000.0 \n", - "-345.75 0.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-25.93 0.84 \n", - "-20.03 1.08 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.14 \n", - "-4.36 11.3 \n", - "12.13 11.83 \n", - "-4.36 8.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.35 4.13 \n", - "-0.46 1.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.4 0.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 20.25 \n", - "10000000.0 10000000.0 \n", - "-18.11 0.73 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "-6.4 0.52 \n", - "-0.9 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "13.02 4.56 \n", - "10000000.0 10000000.0 \n", - "6.36 6.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-34.59 5.89 \n", - "-76.35 3.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "13.27 0.43 \n", - "-3.88 0.56 \n", - "-1.35 0.38 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "35.76 0.45 \n", - "10000000.0 10000000.0 \n", - "-3.73 1.04 \n", - "-69.98 4.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.35 1.6 \n", - "-14.16 0.79 \n", - "-4.2 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "58.67 0.33 \n", - "10000000.0 10000000.0 \n", - "-11.13 4.81 \n", - "-80.05 49.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.04 0.42 \n", - "-5.21 1.06 \n", - "-67.05 1.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.76 8.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.09 0.53 \n", - "-94.86 3.98 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 9.92 \n", - "10000000.0 10000000.0 \n", - "4.52 1.9 \n", - "-5.72 1.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.98 0.7 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.88 0.56 \n", - "6.29 1.0 \n", - "-2.63 0.35 \n", - "-10.1 3.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-126.37 1.64 \n", - "-31.45 6.21 \n", - "10000000.0 10000000.0 \n", - "1.66 1.31 \n", - "-4.36 6.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 8.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.75 11.06 \n", - "10000000.0 10000000.0 \n", - "-6.95 1.13 \n", - "-0.63 0.26 \n", - "10000000.0 10000000.0 \n", - "-1.51 0.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "29.23 6.59 \n", - "0.9 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.9 0.51 \n", - "-3.11 6.84 \n", - "10000000.0 10000000.0 \n", - "-0.78 0.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-56.99 4.82 \n", - "10000000.0 10000000.0 \n", - "4.45 0.24 \n", - "10000000.0 10000000.0 \n", - "-1.52 0.54 \n", - "-13.65 1.45 \n", - "51.06 0.44 \n", - "7.96 1.42 \n", - "205.55 1.53 \n", - "64.19 0.97 \n", - "10000000.0 10000000.0 \n", - "83.17 1.1 \n", - "-34.51 1.02 \n", - "10000000.0 10000000.0 \n", - "14.64 3.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.01 0.98 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.68 0.99 \n", - "-5.07 0.71 \n", - "-50.9 0.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.98 0.65 \n", - "10000000.0 10000000.0 \n", - "-20.84 1.07 \n", - "10000000.0 10000000.0 \n", - "-13.45 5.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.5 1.25 \n", - "2.34 0.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "169.58 5.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 2.25 \n", - "None 1.98 \n", - "None 0.84 \n", - "None 0.83 \n", - "None 0.82 \n", - "None 1.09 \n", - "None 0.76 \n", - "None 0.69 \n", - "None 0.86 \n", - "None 0.66 \n", - "None 0.66 \n", - "None 0.4 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 4.27 \n", - "None 4.54 \n", - "None 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "-6.16 0.07 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "None 2.23 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "-6.16 0.07 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "208.81 0.14 \n", - "None 0.55 \n", - "None 0.38 \n", - "None 1.2 \n", - "None 0.47 \n", - "None 1.07 \n", - "None 2.28 \n", - "None 2.28 \n", - "None 0.51 \n", - "None 5.2 \n", - "None 1.99 \n", - "None 0.76 \n", - "None 2.19 \n", - "None 2.19 \n", - "None 1.94 \n", - "None 1.94 \n", - "None 0.81 \n", - "10000000.0 10000000.0 \n", - "None 0.49 \n", - "None 1.0 \n", - "None 0.72 \n", - "None 0.72 \n", - "None 3.87 \n", - "None 6.08 \n", - "None 5.8 \n", - "None 5.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 5.09 \n", - "None 5.09 \n", - "None 6.03 \n", - "None 6.03 \n", - "None 5.74 \n", - "None 5.74 \n", - "None 5.0 \n", - "None 5.0 \n", - "None 5.03 \n", - "None 5.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.3 \n", - "None 0.41 \n", - "0.4 0.31 \n", - "None 4.99 \n", - "None 4.99 \n", - "None 4.99 \n", - "-0.85 0.3 \n", - "1.82 0.08 \n", - "-10.58 0.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.03 0.11 \n", - "10000000.0 10000000.0 \n", - "-9.57 0.15 \n", - "None 6.08 \n", - "None 6.08 \n", - "None 6.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 4.88 \n", - "-8.6 0.11 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 1.98 \n", - "-7.42 1.34 \n", - "-6.42 1.8 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 2.25 \n", - "-0.95 0.32 \n", - "1.45 0.48 \n", - "228.78 1.28 \n", - "None 0.38 \n", - "-2.46 0.78 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.71 \n", - "-21.19 1.04 \n", - "-4.01 0.11 \n", - "7.82 0.41 \n", - "10000000.0 10000000.0 \n", - "5.68 0.5 \n", - "10000000.0 10000000.0 \n", - "6.43 0.11 \n", - "6.43 0.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.1 0.51 \n", - "-8.1 0.51 \n", - "7.09 0.07 \n", - "1.3 0.22 \n", - "None 6.04 \n", - "-3.9 1.06 \n", - "-0.32 0.43 \n", - "-0.32 0.43 \n", - "-2.01 0.36 \n", - "None 0.83 \n", - "-4.64 0.37 \n", - "-4.94 0.36 \n", - "1.4 0.34 \n", - "-7.41 0.5 \n", - "None 0.71 \n", - "-3.38 0.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.87 \n", - "1.04 0.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "11.27 0.87 \n", - "None 1.09 \n", - "-0.35 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.27 \n", - "None 0.68 \n", - "0.4 0.31 \n", - "2.26 0.15 \n", - "3.41 0.13 \n", - "10.54 0.21 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.17 0.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-112.28 0.77 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.4 \n", - "None 0.69 \n", - "None 0.69 \n", - "None 0.68 \n", - "None 0.49 \n", - "None 0.49 \n", - "None 4.41 \n", - "None 6.98 \n", - "None 0.74 \n", - "None 0.41 \n", - "None 5.2 \n", - "10000000.0 10000000.0 \n", - "None 0.48 \n", - "None 2.72 \n", - "None 2.73 \n", - "None 0.99 \n", - "None 0.79 \n", - "None 1.85 \n", - "10000000.0 10000000.0 \n", - "None 1.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "-6.16 0.07 \n", - "None 2.16 \n", - "None 2.25 \n", - "None 2.18 \n", - "None 0.86 \n", - "None 0.73 \n", - "10000000.0 10000000.0 \n", - "None 0.54 \n", - "None 0.54 \n", - "None 0.62 \n", - "10000000.0 10000000.0 \n", - "None 0.34 \n", - "None 1.0 \n", - "None 1.6 \n", - "None 0.64 \n", - "None 0.82 \n", - "None 0.64 \n", - "10000000.0 10000000.0 \n", - "None 2.18 \n", - "None 4.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 6.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 5.53 \n", - "None 5.02 \n", - "None 1.87 \n", - "None 0.75 \n", - "None 4.07 \n", - "10000000.0 10000000.0 \n", - "None 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.58 \n", - "None 2.23 \n", - "-6.81 4.41 \n", - "None 1.27 \n", - "None 5.15 \n", - "None 5.16 \n", - "None 2.67 \n", - "None 2.66 \n", - "None 0.62 \n", - "10000000.0 10000000.0 \n", - "None 4.19 \n", - "None 3.93 \n", - "None 7.96 \n", - "-5.56 0.33 \n", - "-11.89 4.12 \n", - "None 2.49 \n", - "None 2.21 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 5.35 \n", - "10000000.0 10000000.0 \n", - "None 3.79 \n", - "None 0.3 \n", - "None 6.98 \n", - "None 0.83 \n", - "None 0.48 \n", - "None 4.88 \n", - "-6.16 0.07 \n", - "None 0.71 \n", - "None 6.04 \n", - "None 4.54 \n", - "None 0.35 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "None 0.41 \n", - "None 0.34 \n", - "None 4.41 \n", - "None 1.22 \n", - "None 4.44 \n", - "None 5.2 \n", - "None None \n", - "None 2.4 \n", - "None 0.69 \n", - "None 0.41 \n", - "None 0.49 \n", - "None 4.19 \n", - "None 6.98 \n", - "None 0.74 \n", - "None 4.3 \n", - "None 0.89 \n", - "None 0.87 \n", - "None 0.41 \n", - "10000000.0 10000000.0 \n", - "None 0.41 \n", - "None 2.79 \n", - "None 2.69 \n", - "None 5.2 \n", - "None 6.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 5.97 \n", - "None 3.69 \n", - "None 5.38 \n", - "None 2.04 \n", - "None 3.55 \n", - "None 0.86 \n", - "None 0.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 3.87 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 1.0 \n", - "None 0.64 \n", - "None 0.64 \n", - "None 0.81 \n", - "None 4.41 \n", - "None 1.16 \n", - "None 4.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 0.73 \n", - "None 0.86 \n", - "None 0.84 \n", - "None 2.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.2 \n", - "None 0.25 \n", - "None 5.02 \n", - "10000000.0 10000000.0 \n", - "None 1.33 \n", - "None 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.64 \n", - "None 1.64 \n", - "None 4.27 \n", - "10000000.0 10000000.0 \n", - "-6.81 4.41 \n", - "None 2.67 \n", - "None 4.58 \n", - "10000000.0 10000000.0 \n", - "None 0.69 \n", - "None 4.4 \n", - "None 3.87 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.71 \n", - "-6.16 0.07 \n", - "None 2.67 \n", - "10000000.0 10000000.0 \n", - "-22.32 1.03 \n", - "-4.01 0.86 \n", - "1.17 0.61 \n", - "-6.8 0.45 \n", - "-2.34 0.39 \n", - "-2.34 0.39 \n", - "0.95 0.63 \n", - "-4.38 1.17 \n", - "-4.38 1.17 \n", - "10.46 5.37 \n", - "10000000.0 10000000.0 \n", - "-22.58 1.25 \n", - "-20.79 1.5 \n", - "-13.78 1.7 \n", - "-191.87 1.79 \n", - "109.79 0.86 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.91 1.48 \n", - "-0.91 2.03 \n", - "10000000.0 10000000.0 \n", - "-20.64 5.86 \n", - "10000000.0 10000000.0 \n", - "-4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.04 0.46 \n", - "-1.93 0.69 \n", - "-0.91 0.41 \n", - "-4.19 0.3 \n", - "2.6 0.18 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "-99.87 10.18 \n", - "-96.19 10.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.0 1.13 \n", - "-14.01 1.14 \n", - "8.74 1.8 \n", - "4.0 1.13 \n", - "10000000.0 10000000.0 \n", - "0.83 1.04 \n", - "-103.25 7.96 \n", - "10000000.0 10000000.0 \n", - "-24.02 7.85 \n", - "-105.9 7.87 \n", - "-0.31 0.8 \n", - "-202.22 2.74 \n", - "-0.3 0.8 \n", - "-11.93 1.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.25 0.71 \n", - "-0.18 0.36 \n", - "-0.18 0.36 \n", - "-0.18 0.36 \n", - "-0.18 0.36 \n", - "-0.18 0.36 \n", - "-4.96 0.36 \n", - "-4.44 0.24 \n", - "-4.44 0.24 \n", - "-4.44 0.24 \n", - "-4.44 0.24 \n", - "-4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "-7.31 0.92 \n", - "-3.8 0.45 \n", - "-0.21 0.17 \n", - "-8.78 0.6 \n", - "-0.46 0.4 \n", - "3.18 0.39 \n", - "-3.57 0.59 \n", - "-1.3 0.32 \n", - "-39.05 1.1 \n", - "-2.16 0.66 \n", - "-0.83 0.5 \n", - "-3.82 0.6 \n", - "-3.82 0.6 \n", - "-0.13 0.67 \n", - "-3.11 5.68 \n", - "-2.38 0.49 \n", - "-2.66 0.99 \n", - "-1.16 1.02 \n", - "-3.11 7.46 \n", - "-5.31 0.66 \n", - "-1.55 0.49 \n", - "-5.69 0.85 \n", - "-2.82 0.21 \n", - "-3.7 0.21 \n", - "-3.7 0.21 \n", - "8.71 0.07 \n", - "-3.34 0.2 \n", - "-3.34 0.2 \n", - "8.71 0.07 \n", - "8.72 0.09 \n", - "6.67 0.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.17 0.34 \n", - "1.6 0.39 \n", - "-3.14 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.81 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.68 0.31 \n", - "10000000.0 10000000.0 \n", - "-0.68 0.31 \n", - "-14.55 1.34 \n", - "-2.13 0.3 \n", - "-122.46 0.81 \n", - "-18.13 0.71 \n", - "-122.46 0.81 \n", - "-18.13 0.71 \n", - "-6.69 0.71 \n", - "10000000.0 10000000.0 \n", - "-3.17 0.32 \n", - "-6.26 2.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.09 0.14 \n", - "-3.51 1.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.26 0.15 \n", - "2.26 0.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.35 0.3 \n", - "10000000.0 10000000.0 \n", - "-5.49 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-24.58 0.97 \n", - "-2.28 0.32 \n", - "2.25 0.46 \n", - "2.25 0.46 \n", - "-20.31 2.54 \n", - "-3.01 2.69 \n", - "-10.53 1.07 \n", - "1.42 0.71 \n", - "1.42 0.71 \n", - "8.16 0.68 \n", - "8.16 0.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "12.98 0.65 \n", - "13.69 0.86 \n", - "-3.42 0.47 \n", - "2.56 0.46 \n", - "-8.05 0.6 \n", - "-8.05 0.6 \n", - "4.48 0.8 \n", - "4.48 0.8 \n", - "-10.46 4.97 \n", - "1.2 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.72 1.45 \n", - "4.72 1.45 \n", - "-0.94 0.18 \n", - "10000000.0 10000000.0 \n", - "-4.29 0.8 \n", - "-7.54 0.79 \n", - "4.94 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "1.04 0.4 \n", - "-3.12 0.38 \n", - "-3.12 0.38 \n", - "10000000.0 10000000.0 \n", - "-0.8 0.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.76 8.25 \n", - "-7.06 7.4 \n", - "-7.06 7.4 \n", - "-7.06 7.35 \n", - "-7.06 7.35 \n", - "-7.06 7.31 \n", - "-7.06 7.31 \n", - "3.76 8.2 \n", - "3.76 8.16 \n", - "10000000.0 10000000.0 \n", - "-2.11 0.94 \n", - "-2.28 0.75 \n", - "10000000.0 10000000.0 \n", - "-5.17 0.34 \n", - "-5.17 0.34 \n", - "-5.17 0.34 \n", - "-5.17 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.48 0.24 \n", - "-6.46 0.32 \n", - "-6.46 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-50.5 3.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.26 1.28 \n", - "-105.97 0.91 \n", - "-2.23 0.46 \n", - "-2.23 0.46 \n", - "10000000.0 10000000.0 \n", - "-2.3 11.51 \n", - "9.59 6.0 \n", - "-3.83 0.39 \n", - "-1.7 10.62 \n", - "-3.83 0.39 \n", - "-3.83 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.24 0.82 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.26 0.6 \n", - "-0.22 0.59 \n", - "10000000.0 10000000.0 \n", - "0.26 0.6 \n", - "-0.22 0.59 \n", - "12.39 0.75 \n", - "-5.31 0.66 \n", - "-5.31 0.66 \n", - "-5.31 0.66 \n", - "-5.31 0.66 \n", - "-5.31 0.66 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-39.48 5.64 \n", - "7.34 2.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.89 0.73 \n", - "2.53 0.68 \n", - "10000000.0 10000000.0 \n", - "-9.33 0.11 \n", - "10000000.0 10000000.0 \n", - "-50.13 0.35 \n", - "-8.16 0.15 \n", - "-4.77 0.97 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "-12.57 1.08 \n", - "-12.57 1.08 \n", - "-13.19 1.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-105.99 0.91 \n", - "10000000.0 10000000.0 \n", - "-5.97 0.42 \n", - "-1.7 5.59 \n", - "-5.97 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.77 0.68 \n", - "-125.33 12.65 \n", - "-105.97 0.91 \n", - "-120.41 3.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 7.33 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.3 2.73 \n", - "-17.3 2.73 \n", - "4.14 0.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.54 1.46 \n", - "-9.54 1.46 \n", - "0.52 0.47 \n", - "-8.91 0.78 \n", - "-8.91 0.78 \n", - "10000000.0 10000000.0 \n", - "2.54 0.75 \n", - "1.48 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-105.98 0.91 \n", - "-18.44 0.78 \n", - "-18.44 0.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.42 1.26 \n", - "-18.42 0.78 \n", - "-20.64 6.07 \n", - "-97.47 2.09 \n", - "-2.78 0.75 \n", - "-6.6 2.23 \n", - "-105.97 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.04 0.98 \n", - "-4.89 0.24 \n", - "-4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.89 0.24 \n", - "-4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-83.95 6.39 \n", - "-15.4 3.68 \n", - "-18.47 0.78 \n", - "-18.46 0.78 \n", - "-18.42 0.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-177.08 1.65 \n", - "-177.08 1.65 \n", - "10000000.0 10000000.0 \n", - "-0.57 0.71 \n", - "-6.73 1.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-120.41 3.57 \n", - "-1.52 0.54 \n", - "11.76 1.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "-16.89 8.21 \n", - "6.69 0.98 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "76.24 1.49 \n", - "-69.98 2.15 \n", - "-69.98 2.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.77 0.68 \n", - "10000000.0 10000000.0 \n", - "6.91 0.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "23.32 0.86 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-90.63 3.53 \n", - "-90.63 3.53 \n", - "1.18 0.45 \n", - "7.89 0.44 \n", - "165.52 1.53 \n", - "-41.34 0.33 \n", - "-38.48 1.54 \n", - "7.91 0.61 \n", - "-49.24 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "59.52 9.09 \n", - "-65.88 2.34 \n", - "40.35 2.36 \n", - "-19.7 0.39 \n", - "-49.21 0.53 \n", - "23.11 0.94 \n", - "23.28 0.94 \n", - "23.67 0.94 \n", - "23.68 0.94 \n", - "-49.19 0.53 \n", - "23.03 0.94 \n", - "-49.26 0.53 \n", - "23.73 0.94 \n", - "-49.25 0.53 \n", - "-20.12 0.84 \n", - "-25.75 0.84 \n", - "-49.2 0.53 \n", - "-19.71 0.39 \n", - "-49.15 0.53 \n", - "-49.23 0.53 \n", - "-19.68 0.39 \n", - "0.42 0.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-49.22 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-49.24 0.53 \n", - "59.4 1.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-20.07 0.84 \n", - "-20.12 0.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.39 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 7.34 \n", - "10000000.0 10000000.0 \n", - "102.76 0.75 \n", - "10000000.0 10000000.0 \n", - "-63.79 2.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-64.39 0.35 \n", - "None 2.19 \n", - "10000000.0 10000000.0 \n", - "2.22 0.33 \n", - "10000000.0 10000000.0 \n", - "0.31 0.31 \n", - "0.31 0.31 \n", - "0.31 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.49 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 5.74 \n", - "None 5.74 \n", - "None 5.74 \n", - "None 2.18 \n", - "None 2.18 \n", - "None 4.27 \n", - "None 1.92 \n", - "None 7.58 \n", - "None 6.01 \n", - "None 2.31 \n", - "None 3.8 \n", - "10000000.0 10000000.0 \n", - "None 8.13 \n", - "None 7.58 \n", - "None 1.4 \n", - "None 1.94 \n", - "None 0.91 \n", - "None 2.18 \n", - "None 2.18 \n", - "None 4.27 \n", - "None 4.27 \n", - "None 8.53 \n", - "None 6.41 \n", - "None 1.4 \n", - "None 4.27 \n", - "None 2.28 \n", - "None 2.31 \n", - "None 7.58 \n", - "None 3.92 \n", - "None 4.27 \n", - "None 1.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 6.84 \n", - "None 6.84 \n", - "10000000.0 10000000.0 \n", - "None 3.89 \n", - "10000000.0 10000000.0 \n", - "None 1.88 \n", - "10000000.0 10000000.0 \n", - "None 0.74 \n", - "None 0.71 \n", - "None 0.38 \n", - "0.36 0.56 \n", - "None 3.89 \n", - "10000000.0 10000000.0 \n", - "4.59 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "26.77 3.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.33 7.71 \n", - "None 1.63 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.24 0.54 \n", - "-0.24 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.43 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.94 0.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.61 7.11 \n", - "-8.61 7.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.45 0.95 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-24.6 1.18 \n", - "-1.98 0.61 \n", - "-1.98 0.61 \n", - "-20.13 8.43 \n", - "-194.4 1.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.73 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-22.65 0.55 \n", - "-19.86 10.94 \n", - "-21.19 0.96 \n", - "10000000.0 10000000.0 \n", - "-15.54 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-27.0 1.87 \n", - "-72.76 0.79 \n", - "10000000.0 10000000.0 \n", - "-21.65 7.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.68 0.26 \n", - "11.76 1.89 \n", - "-41.57 1.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-28.4 1.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-116.98 1.09 \n", - "10000000.0 10000000.0 \n", - "-5.5 0.33 \n", - "-0.44 0.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.96 0.32 \n", - "-5.96 0.32 \n", - "-5.96 0.32 \n", - "-5.96 0.32 \n", - "-122.3 13.03 \n", - "9.68 3.81 \n", - "9.68 3.1 \n", - "9.68 3.33 \n", - "9.68 2.87 \n", - "9.68 4.05 \n", - "9.68 3.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.88 0.69 \n", - "8.66 0.99 \n", - "4.44 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.22 0.59 \n", - "-0.22 0.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.61 4.92 \n", - "-15.5 1.25 \n", - "-4.62 0.68 \n", - "-2.67 0.69 \n", - "10000000.0 10000000.0 \n", - "0.94 0.19 \n", - "-1.03 0.42 \n", - "-1.03 0.42 \n", - "10000000.0 10000000.0 \n", - "-10.46 4.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.49 0.32 \n", - "10000000.0 10000000.0 \n", - "-1.62 0.41 \n", - "-11.16 0.62 \n", - "-3.94 0.48 \n", - "-17.2 1.16 \n", - "-10.01 0.3 \n", - "10000000.0 10000000.0 \n", - "-29.41 1.7 \n", - "-29.41 1.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.53 0.62 \n", - "10000000.0 10000000.0 \n", - "-19.84 1.97 \n", - "-19.84 1.97 \n", - "4.23 0.41 \n", - "-3.94 0.49 \n", - "10000000.0 10000000.0 \n", - "-4.3 0.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.42 0.46 \n", - "-86.57 10.11 \n", - "-86.57 10.11 \n", - "10000000.0 10000000.0 \n", - "-1.22 0.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.55 0.74 \n", - "59.08 0.45 \n", - "-1.55 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.12 0.75 \n", - "-1.7 8.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.6 6.44 \n", - "10000000.0 10000000.0 \n", - "-72.91 1.69 \n", - "2.62 0.35 \n", - "-6.0 0.82 \n", - "10000000.0 10000000.0 \n", - "-2.14 1.9 \n", - "3.52 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.7 0.53 \n", - "-5.96 0.86 \n", - "10000000.0 10000000.0 \n", - "2.06 1.38 \n", - "-7.96 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.4 0.63 \n", - "-105.96 0.91 \n", - "7.09 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.09 0.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-24.63 1.02 \n", - "-8.1 0.51 \n", - "-2.63 0.42 \n", - "-3.11 7.71 \n", - "None None \n", - "2.86 0.44 \n", - "-102.45 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.59 0.43 \n", - "3.27 0.43 \n", - "3.27 0.42 \n", - "10000000.0 10000000.0 \n", - "-3.75 0.34 \n", - "-3.75 0.34 \n", - "4.44 0.24 \n", - "3.54 0.43 \n", - "-0.45 0.11 \n", - "3.32 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "12.58 1.96 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-23.7 1.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.95 1.48 \n", - "-6.98 0.69 \n", - "-1.52 0.35 \n", - "-1.52 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.81 0.5 \n", - "10000000.0 10000000.0 \n", - "-3.28 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.38 0.6 \n", - "-37.17 1.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "11.27 1.39 \n", - "11.27 1.39 \n", - "10000000.0 10000000.0 \n", - "-14.37 1.78 \n", - "-0.61 0.4 \n", - "-94.56 1.94 \n", - "-12.59 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.14 0.6 \n", - "-8.39 0.32 \n", - "10000000.0 10000000.0 \n", - "-13.95 0.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.21 1.39 \n", - "10000000.0 10000000.0 \n", - "-14.28 2.42 \n", - "-4.07 0.85 \n", - "-4.07 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-31.87 1.48 \n", - "10000000.0 10000000.0 \n", - "-11.55 1.46 \n", - "-8.85 0.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.79 0.73 \n", - "-2.79 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.98 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.98 5.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.68 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-105.96 0.91 \n", - "-9.47 1.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.44 0.24 \n", - "4.19 0.29 \n", - "-4.44 0.24 \n", - "-4.44 0.24 \n", - "4.44 0.24 \n", - "-4.44 0.24 \n", - "4.96 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-32.71 2.06 \n", - "-8.06 0.84 \n", - "10000000.0 10000000.0 \n", - "-6.69 0.71 \n", - "10000000.0 10000000.0 \n", - "-5.45 1.01 \n", - "-1.37 1.09 \n", - "6.56 0.6 \n", - "-3.79 0.74 \n", - "-3.79 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.8 1.53 \n", - "-5.8 1.53 \n", - "-4.82 0.75 \n", - "10000000.0 10000000.0 \n", - "-6.07 2.37 \n", - "10000000.0 10000000.0 \n", - "7.47 0.19 \n", - "6.53 0.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.06 0.39 \n", - "8.09 0.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.58 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.45 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.22 1.32 \n", - "10000000.0 10000000.0 \n", - "-91.65 4.65 \n", - "-2.78 0.75 \n", - "-0.24 0.5 \n", - "2.26 0.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.42 0.11 \n", - "10000000.0 10000000.0 \n", - "0.34 0.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 4.99 \n", - "10000000.0 10000000.0 \n", - "-14.03 4.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 4.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.35 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.95 0.55 \n", - "10000000.0 10000000.0 \n", - "-2.14 4.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.57 0.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-20.16 1.48 \n", - "-20.16 1.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.82 2.03 \n", - "-5.96 0.71 \n", - "-2.27 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.18 0.48 \n", - "10000000.0 10000000.0 \n", - "-0.75 1.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 7.4 \n", - "-3.42 0.47 \n", - "2.65 0.09 \n", - "2.56 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-22.19 1.11 \n", - "-22.19 1.11 \n", - "10000000.0 10000000.0 \n", - "-2.82 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-46.89 5.54 \n", - "-46.89 5.54 \n", - "-74.83 1.75 \n", - "10000000.0 10000000.0 \n", - "-2.27 1.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.26 0.12 \n", - "-8.47 0.78 \n", - "10000000.0 10000000.0 \n", - "-100.17 3.73 \n", - "-3.11 4.62 \n", - "10000000.0 10000000.0 \n", - "-51.41 1.01 \n", - "-68.61 1.43 \n", - "5.34 1.04 \n", - "-0.38 0.45 \n", - "-1.34 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.03 1.11 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "-1.84 1.67 \n", - "-2.62 0.35 \n", - "-0.99 0.31 \n", - "0.18 0.36 \n", - "0.18 0.36 \n", - "4.44 0.24 \n", - "-96.45 0.96 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.08 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-63.69 1.63 \n", - "-14.47 0.33 \n", - "-105.96 0.91 \n", - "-29.3 6.24 \n", - "10000000.0 10000000.0 \n", - "-94.12 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.73 1.66 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-83.05 1.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-83.02 1.05 \n", - "-89.97 1.16 \n", - "10000000.0 10000000.0 \n", - "39.58 3.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.0 7.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "-97.25 10.69 \n", - "9.43 6.26 \n", - "-2.62 0.35 \n", - "-83.06 1.82 \n", - "3.21 1.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-77.71 8.0 \n", - "6.29 4.45 \n", - "-10.96 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-32.86 4.45 \n", - "10000000.0 10000000.0 \n", - "2.58 0.41 \n", - "10000000.0 10000000.0 \n", - "1.85 0.74 \n", - "0.67 0.41 \n", - "10000000.0 10000000.0 \n", - "-2.12 0.7 \n", - "-3.12 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.67 0.27 \n", - "3.95 0.44 \n", - "10000000.0 10000000.0 \n", - "-4.61 0.47 \n", - "6.24 0.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.18 4.84 \n", - "-19.18 4.84 \n", - "-5.86 0.43 \n", - "-6.58 0.38 \n", - "-14.5 0.44 \n", - "-13.94 1.55 \n", - "50.44 0.56 \n", - "-3.33 0.3 \n", - "-8.13 0.6 \n", - "15.7 1.63 \n", - "14.17 4.74 \n", - "-5.44 0.46 \n", - "-5.44 0.46 \n", - "10.96 1.85 \n", - "10.96 1.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-36.76 10.77 \n", - "10000000.0 10000000.0 \n", - "-14.03 9.25 \n", - "-15.54 1.5 \n", - "-11.35 1.54 \n", - "7.22 5.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.18 0.41 \n", - "0.18 0.41 \n", - "3.23 0.51 \n", - "-0.48 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.13 4.11 \n", - "10000000.0 10000000.0 \n", - "-11.76 0.83 \n", - "-2.76 0.85 \n", - "0.54 0.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-108.62 1.19 \n", - "-1.01 0.39 \n", - "7.19 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-69.88 6.46 \n", - "-69.88 6.46 \n", - "-69.88 6.47 \n", - "-13.0 6.55 \n", - "-13.0 6.55 \n", - "-13.0 6.57 \n", - "-93.88 2.47 \n", - "-93.88 2.53 \n", - "-1.4 2.11 \n", - "10000000.0 10000000.0 \n", - "-25.72 2.72 \n", - "10000000.0 10000000.0 \n", - "12.32 2.3 \n", - "-2.31 2.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.2 1.15 \n", - "10000000.0 10000000.0 \n", - "-105.93 0.91 \n", - "-106.02 0.91 \n", - "-105.97 0.91 \n", - "-14.03 6.74 \n", - "-14.03 6.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 5.85 \n", - "-9.67 1.21 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 6.0 \n", - "None None \n", - "-4.59 1.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.16 1.11 \n", - "-3.78 0.75 \n", - "-72.91 1.69 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.78 6.38 \n", - "10000000.0 10000000.0 \n", - "-72.03 2.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.08 0.57 \n", - "-8.71 0.93 \n", - "-9.88 0.39 \n", - "-21.02 1.08 \n", - "-12.98 1.2 \n", - "-2.65 1.91 \n", - "-8.73 0.93 \n", - "-8.73 0.93 \n", - "-26.84 4.6 \n", - "-26.84 4.61 \n", - "-10.89 1.06 \n", - "-9.24 0.43 \n", - "-7.15 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-90.71 0.91 \n", - "-8.58 1.02 \n", - "10000000.0 10000000.0 \n", - "-26.84 4.68 \n", - "0.13 0.25 \n", - "-14.03 4.6 \n", - "-0.81 0.22 \n", - "-14.03 4.59 \n", - "None None \n", - "-8.73 0.93 \n", - "-8.73 0.93 \n", - "-10.89 1.06 \n", - "-26.84 4.6 \n", - "-26.84 4.61 \n", - "-21.42 1.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.79 1.32 \n", - "-19.79 1.32 \n", - "-20.14 1.5 \n", - "-20.14 1.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-56.32 1.13 \n", - "-50.05 1.65 \n", - "10000000.0 10000000.0 \n", - "-69.42 6.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.4 1.03 \n", - "-12.69 1.03 \n", - "-0.43 0.61 \n", - "-0.64 0.61 \n", - "-93.67 1.62 \n", - "-37.19 0.32 \n", - "-37.02 0.32 \n", - "67.92 3.36 \n", - "67.63 3.36 \n", - "-14.03 9.16 \n", - "-14.03 7.69 \n", - "-12.59 1.03 \n", - "-12.59 1.03 \n", - "-0.29 0.61 \n", - "-0.29 0.61 \n", - "-0.29 0.61 \n", - "-0.29 0.61 \n", - "-13.04 1.03 \n", - "-13.04 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.41 0.92 \n", - "39.81 1.3 \n", - "-109.38 0.78 \n", - "-109.38 0.78 \n", - "-109.38 0.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.04 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.8 0.39 \n", - "-2.94 0.36 \n", - "-77.12 4.13 \n", - "-117.73 4.26 \n", - "-3.53 8.64 \n", - "-20.64 5.86 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.23 \n", - "-36.09 14.09 \n", - "-4.36 5.66 \n", - "-13.11 5.07 \n", - "23.24 5.36 \n", - "-1.58 1.0 \n", - "2.59 0.66 \n", - "-0.65 0.64 \n", - "-37.11 3.95 \n", - "15907.72 55.05 \n", - "1.24 0.54 \n", - "495.65 3.01 \n", - "506.15 3.18 \n", - "9.53 9.27 \n", - "-6.02 0.56 \n", - "-5.76 0.35 \n", - "-8.52 5.62 \n", - "2.46 0.53 \n", - "2.08 0.38 \n", - "10000000.0 10000000.0 \n", - "-18.13 0.71 \n", - "10000000.0 10000000.0 \n", - "-18.13 0.71 \n", - "11.76 1.89 \n", - "-18.46 0.78 \n", - "-18.46 0.78 \n", - "-18.75 0.66 \n", - "-8.56 1.05 \n", - "-2.25 0.46 \n", - "-2.08 0.46 \n", - "-0.99 0.34 \n", - "-3.33 0.3 \n", - "-20.06 0.5 \n", - "-14.03 11.13 \n", - "10000000.0 10000000.0 \n", - "2.68 1.63 \n", - "-5.81 0.35 \n", - "-5.82 0.35 \n", - "-5.81 0.35 \n", - "10000000.0 10000000.0 \n", - "-2.99 0.44 \n", - "-2.03 0.44 \n", - "10000000.0 10000000.0 \n", - "-6.32 1.33 \n", - "-17.69 2.07 \n", - "-13.17 1.32 \n", - "-15.16 0.76 \n", - "10000000.0 10000000.0 \n", - "-4.16 0.75 \n", - "-24.59 2.75 \n", - "-15.71 5.06 \n", - "-2.3 0.82 \n", - "-11.91 3.26 \n", - "-6.17 0.81 \n", - "-0.04 0.68 \n", - "14.4 14.8 \n", - "7.2 10.23 \n", - "-119.15 13.26 \n", - "-126.74 13.24 \n", - "-14.37 1.78 \n", - "-109.81 1.17 \n", - "-34.31 5.74 \n", - "-41.18 5.17 \n", - "-62.45 0.98 \n", - "-3.83 0.39 \n", - "-41.18 5.25 \n", - "-1.7 6.33 \n", - "-1.7 7.87 \n", - "-72.98 1.54 \n", - "2.54 7.77 \n", - "2.33 0.52 \n", - "10000000.0 10000000.0 \n", - "-6.33 7.25 \n", - "-6.33 7.24 \n", - "10000000.0 10000000.0 \n", - "-78.49 1.57 \n", - "-124.66 1.52 \n", - "-121.17 0.81 \n", - "-62.41 2.27 \n", - "-122.57 1.2 \n", - "-121.16 3.16 \n", - "-119.58 3.23 \n", - "-105.97 0.91 \n", - "-95.83 6.8 \n", - "-95.83 6.85 \n", - "10000000.0 10000000.0 \n", - "-3.53 5.81 \n", - "-10.0 0.3 \n", - "-0.17 None \n", - "-3.24 0.3 \n", - "-3.41 0.3 \n", - "2.51 0.5 \n", - "-10.46 0.64 \n", - "-25.26 1.1 \n", - "-89.24 1.05 \n", - "1.15 0.36 \n", - "-115.68 1.75 \n", - "-13.69 1.44 \n", - "7.71 1.43 \n", - "-3.65 0.75 \n", - "14.53 0.59 \n", - "-7.12 2.59 \n", - "14.53 0.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.07 0.66 \n", - "-4.94 0.57 \n", - "-22.29 1.11 \n", - "-2.62 0.35 \n", - "-8.61 0.26 \n", - "-8.61 0.27 \n", - "-3.46 0.76 \n", - "-10.05 1.03 \n", - "-97.2 0.8 \n", - "-102.48 1.26 \n", - "-81.93 6.64 \n", - "-49.26 0.53 \n", - "23.32 0.94 \n", - "-3.87 0.56 \n", - "-0.04 0.55 \n", - "4.21 0.8 \n", - "-49.27 0.53 \n", - "-9.38 0.5 \n", - "-9.38 0.5 \n", - "-72.12 1.24 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.81 4.41 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.81 5.26 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "None 2.18 \n", - "None 2.73 \n", - "None 2.69 \n", - "None 2.5 \n", - "None 3.56 \n", - "None 3.78 \n", - "None 3.55 \n", - "None 3.89 \n", - "None 2.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.48 \n", - "None 0.34 \n", - "-6.16 0.07 \n", - "None 0.83 \n", - "10000000.0 10000000.0 \n", - "None 2.23 \n", - "-6.16 0.07 \n", - "None 4.07 \n", - "None 3.08 \n", - "-10.54 0.15 \n", - "10.92 0.92 \n", - "-5.97 0.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.64 \n", - "None 0.64 \n", - "None 0.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.13 0.71 \n", - "10000000.0 10000000.0 \n", - "-114.49 5.99 \n", - "None 0.71 \n", - "-41.4 6.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.54 \n", - "10000000.0 10000000.0 \n", - "None 1.6 \n", - "None 0.58 \n", - "None 1.27 \n", - "None 2.21 \n", - "None 0.79 \n", - "None 1.17 \n", - "None 0.44 \n", - "None 1.2 \n", - "None 2.01 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 3.89 \n", - "None 4.23 \n", - "None 4.3 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.42 \n", - "None 0.27 \n", - "None 3.87 \n", - "None 1.26 \n", - "None 0.3 \n", - "None 0.41 \n", - "None 0.44 \n", - "None 4.29 \n", - "None 2.72 \n", - "None 3.87 \n", - "None 0.41 \n", - "None 2.66 \n", - "None 2.14 \n", - "None 1.16 \n", - "None 1.13 \n", - "None 0.35 \n", - "-8.87 0.64 \n", - "None 2.31 \n", - "None 2.19 \n", - "None 0.71 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "None 3.86 \n", - "None 0.54 \n", - "None 0.41 \n", - "None 0.41 \n", - "None 0.41 \n", - "None 4.29 \n", - "10000000.0 10000000.0 \n", - "None 1.94 \n", - "None 1.94 \n", - "-9.34 0.31 \n", - "None 2.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.83 \n", - "10000000.0 10000000.0 \n", - "None 0.64 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.34 0.31 \n", - "None 1.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.72 \n", - "10000000.0 10000000.0 \n", - "None 1.95 \n", - "10000000.0 10000000.0 \n", - "None 1.36 \n", - "10000000.0 10000000.0 \n", - "None 0.51 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "None 0.41 \n", - "-6.16 0.07 \n", - "None 0.71 \n", - "None 2.33 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "-10.33 0.46 \n", - "None 1.02 \n", - "None 2.56 \n", - "None 2.56 \n", - "None 0.49 \n", - "None 1.16 \n", - "None 2.18 \n", - "-10.29 0.48 \n", - "None 2.09 \n", - "-8.57 0.72 \n", - "-6.16 0.07 \n", - "None 1.26 \n", - "10000000.0 10000000.0 \n", - "None 2.18 \n", - "None 2.12 \n", - "None 0.38 \n", - "None 0.54 \n", - "None 2.77 \n", - "None 8.53 \n", - "None 0.62 \n", - "None 0.34 \n", - "-6.81 4.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.68 \n", - "None 2.12 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "None 0.35 \n", - "None 0.44 \n", - "10000000.0 10000000.0 \n", - "None 0.44 \n", - "-9.38 0.68 \n", - "-6.16 0.07 \n", - "None 2.14 \n", - "-9.58 0.4 \n", - "None 2.18 \n", - "None 4.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.16 \n", - "10000000.0 10000000.0 \n", - "-11.19 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "None 3.25 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.72 \n", - "None 3.92 \n", - "None 0.83 \n", - "None 0.25 \n", - "-6.16 0.07 \n", - "None 4.58 \n", - "10000000.0 10000000.0 \n", - "None 1.33 \n", - "None 0.47 \n", - "None 0.47 \n", - "-6.16 0.07 \n", - "None 6.01 \n", - "-6.16 0.07 \n", - "None 4.07 \n", - "None 2.12 \n", - "-9.34 0.31 \n", - "None 1.4 \n", - "None 0.44 \n", - "None 0.71 \n", - "None 1.64 \n", - "None 1.94 \n", - "None 0.4 \n", - "-8.75 0.74 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "None 2.12 \n", - "None 4.06 \n", - "None 2.23 \n", - "None 2.66 \n", - "None 0.71 \n", - "None 0.62 \n", - "None 1.94 \n", - "None 0.54 \n", - "None 2.12 \n", - "None 1.44 \n", - "None 2.14 \n", - "None 1.24 \n", - "None 2.5 \n", - "None 3.95 \n", - "None 0.83 \n", - "None 2.79 \n", - "None 0.33 \n", - "None 0.49 \n", - "None 1.13 \n", - "None 1.26 \n", - "None 0.75 \n", - "10000000.0 10000000.0 \n", - "None 1.16 \n", - "None 2.12 \n", - "None 2.12 \n", - "None 1.94 \n", - "None 8.13 \n", - "None 1.26 \n", - "None 7.58 \n", - "None 1.17 \n", - "None 1.16 \n", - "None 3.92 \n", - "None 4.27 \n", - "10000000.0 10000000.0 \n", - "None 2.21 \n", - "None 1.13 \n", - "None 0.71 \n", - "None 1.6 \n", - "None 0.52 \n", - "None 0.79 \n", - "None 0.34 \n", - "None 0.83 \n", - "None 2.14 \n", - "None 2.14 \n", - "None 0.62 \n", - "None 0.44 \n", - "10000000.0 10000000.0 \n", - "None 2.79 \n", - "None 4.21 \n", - "None 5.05 \n", - "None 4.29 \n", - "None 3.66 \n", - "None 2.73 \n", - "None 2.72 \n", - "None 0.72 \n", - "None 0.65 \n", - "None 1.9 \n", - "None 0.71 \n", - "None 2.69 \n", - "None 10.15 \n", - "14.74 0.5 \n", - "10000000.0 10000000.0 \n", - "-6.02 0.82 \n", - "-9.36 0.5 \n", - "-2.62 0.35 \n", - "-71.92 4.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.48 2.04 \n", - "-98.38 5.21 \n", - "None None \n", - "-2.9 0.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-92.72 9.67 \n", - "-92.72 9.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "53.01 1.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "11.92 0.96 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "57.67 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-64.58 0.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "44.47 0.91 \n", - "203.53 2.74 \n", - "121.74 1.25 \n", - "164.8 1.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-45.97 0.22 \n", - "-46.33 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "84.83 0.34 \n", - "10000000.0 10000000.0 \n", - "-87.53 0.33 \n", - "-228.17 1.14 \n", - "-254.33 2.79 \n", - "-165.95 1.07 \n", - "243.37 2.8 \n", - "163.52 1.16 \n", - "226.15 1.14 \n", - "10000000.0 10000000.0 \n", - "-28.87 2.14 \n", - "10000000.0 10000000.0 \n", - "57.67 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-63.43 1.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "28.1 1.28 \n", - "-8.43 0.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-64.39 0.35 \n", - "59.47 0.91 \n", - "-6.1 1.05 \n", - "2.09 1.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-23.85 10.04 \n", - "-11.97 0.5 \n", - "-64.58 0.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.89 0.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-28.95 0.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 4.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.87 1.28 \n", - "-3.19 0.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-63.94 0.29 \n", - "14.96 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.46 0.05 \n", - "-20.14 1.86 \n", - "8.27 0.9 \n", - "4.49 0.57 \n", - "-46.06 1.64 \n", - "-2.79 0.26 \n", - "62.53 0.8 \n", - "2.7 1.52 \n", - "-4.57 1.08 \n", - "7.23 0.84 \n", - "-1.36 1.32 \n", - "-3.73 0.95 \n", - "10000000.0 10000000.0 \n", - "-1.2 1.08 \n", - "-3.2 0.86 \n", - "18.48 13.84 \n", - "-6.24 0.92 \n", - "10000000.0 10000000.0 \n", - "-2.63 0.42 \n", - "2.81 0.44 \n", - "-3.48 0.38 \n", - "10000000.0 10000000.0 \n", - "-125.98 2.59 \n", - "-86.46 1.22 \n", - "-26.84 1.03 \n", - "10000000.0 10000000.0 \n", - "-103.9 3.91 \n", - "-24.58 0.97 \n", - "-2.83 0.26 \n", - "None 10.63 \n", - "-101.23 0.92 \n", - "-159.92 2.75 \n", - "-87.92 0.79 \n", - "-119.25 1.85 \n", - "-82.41 3.41 \n", - "-107.75 2.01 \n", - "-11.98 1.19 \n", - "-2.55 0.35 \n", - "-13.77 0.8 \n", - "-13.87 0.8 \n", - "-101.47 1.76 \n", - "-71.27 4.91 \n", - "1.15 0.41 \n", - "None 18.06 \n", - "-1.82 0.96 \n", - "-14.55 0.79 \n", - "-22.96 1.98 \n", - "134.22 3.45 \n", - "-118.04 4.77 \n", - "-40.01 1.05 \n", - "10000000.0 10000000.0 \n", - "-286.32 7.81 \n", - "-34.08 14.54 \n", - "-11.89 4.12 \n", - "-264.94 7.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-32.71 2.06 \n", - "-11.9 0.15 \n", - "-6.16 0.07 \n", - "-8.43 0.14 \n", - "-13.75 0.86 \n", - "1.72 0.24 \n", - "-77.79 0.79 \n", - "2.91 11.5 \n", - "48.81 2.02 \n", - "11.53 0.22 \n", - "3.7 0.21 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.85 0.79 \n", - "-8.79 0.73 \n", - "-3.14 0.71 \n", - "-3.14 0.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.08 \n", - "-77.79 0.79 \n", - "11.53 0.23 \n", - "3.7 0.19 \n", - "-1.54 1.6 \n", - "-3.02 0.72 \n", - "-3.67 5.98 \n", - "-28.02 1.04 \n", - "-70.71 1.25 \n", - "-5.74 0.08 \n", - "-14.62 0.93 \n", - "-7.85 1.99 \n", - "1.69 1.99 \n", - "-0.42 0.04 \n", - "-7.49 0.72 \n", - "-11.69 0.9 \n", - "0.57 0.71 \n", - "-7.11 1.11 \n", - "1.26 0.75 \n", - "-3.53 0.8 \n", - "10000000.0 10000000.0 \n", - "0.36 0.71 \n", - "10000000.0 10000000.0 \n", - "0.62 0.3 \n", - "-0.23 0.31 \n", - "22.97 6.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-71.01 1.18 \n", - "0.14 0.96 \n", - "6.3 0.96 \n", - "10000000.0 10000000.0 \n", - "-5.03 0.78 \n", - "-0.68 0.31 \n", - "0.25 0.31 \n", - "-1.13 0.78 \n", - "-5.48 0.31 \n", - "-5.35 0.94 \n", - "-3.08 0.94 \n", - "-2.71 0.48 \n", - "-3.45 0.48 \n", - "-7.47 4.86 \n", - "-12.61 4.92 \n", - "-5.47 0.75 \n", - "-3.05 5.12 \n", - "1.85 4.92 \n", - "-7.56 0.47 \n", - "-4.78 0.49 \n", - "-3.37 0.34 \n", - "-7.42 1.99 \n", - "-2.79 0.35 \n", - "10000000.0 10000000.0 \n", - "-18.84 7.46 \n", - "-2.59 0.75 \n", - "-3.69 0.67 \n", - "3.85 0.33 \n", - "-10.15 0.27 \n", - "8.79 0.58 \n", - "-5.45 0.69 \n", - "-3.86 0.68 \n", - "0.61 1.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.79 0.12 \n", - "6.53 0.1 \n", - "-6.69 0.5 \n", - "-6.69 0.5 \n", - "4.26 0.12 \n", - "-37.93 1.28 \n", - "-12.69 0.13 \n", - "-8.47 0.78 \n", - "-8.47 0.79 \n", - "-40.2 1.27 \n", - "4.94 0.36 \n", - "-6.46 1.44 \n", - "3.13 0.76 \n", - "5.29 1.26 \n", - "3.13 0.76 \n", - "-3.96 0.76 \n", - "-55.73 4.71 \n", - "5.33 1.04 \n", - "-6.93 0.23 \n", - "-6.8 0.72 \n", - "-4.29 0.8 \n", - "-7.3 0.13 \n", - "-4.18 0.29 \n", - "1.14 0.09 \n", - "2.26 0.15 \n", - "-3.95 0.77 \n", - "-1.13 0.1 \n", - "-10.42 6.55 \n", - "2.81 0.38 \n", - "6.02 0.21 \n", - "6.51 0.55 \n", - "5.82 0.55 \n", - "5.82 0.55 \n", - "8.71 0.07 \n", - "-10.34 0.49 \n", - "8.72 0.09 \n", - "-23.01 1.02 \n", - "-0.72 0.79 \n", - "-3.34 0.2 \n", - "13.21 1.19 \n", - "-2.82 0.21 \n", - "-6.51 0.71 \n", - "0.07 0.13 \n", - "-5.12 0.81 \n", - "0.13 0.52 \n", - "-5.69 0.85 \n", - "-1.77 0.58 \n", - "-8.47 0.49 \n", - "-6.93 0.95 \n", - "1.41 0.78 \n", - "-3.33 0.96 \n", - "-0.14 0.58 \n", - "10.04 0.79 \n", - "6.93 0.67 \n", - "-4.14 0.82 \n", - "-39.15 1.89 \n", - "-74.09 0.81 \n", - "-22.87 1.22 \n", - "52.41 1.12 \n", - "-23.36 1.11 \n", - "-27.09 1.03 \n", - "-23.14 1.15 \n", - "-4.28 0.56 \n", - "-7.08 0.97 \n", - "0.03 0.34 \n", - "None 4.41 \n", - "-15.71 0.62 \n", - "-4.01 0.11 \n", - "-1.02 0.28 \n", - "-2.59 0.51 \n", - "-31.6 1.1 \n", - "-2.15 0.11 \n", - "-4.86 0.32 \n", - "-3.44 0.61 \n", - "0.19 0.34 \n", - "10000000.0 10000000.0 \n", - "3.41 0.13 \n", - "-9.59 4.37 \n", - "-9.57 0.15 \n", - "-20.13 1.71 \n", - "-118.86 1.08 \n", - "6.1 0.16 \n", - "-5.66 0.58 \n", - "-17.71 4.36 \n", - "-10.35 1.06 \n", - "0.62 0.28 \n", - "-6.8 0.57 \n", - "-5.52 0.3 \n", - "-0.6 0.32 \n", - "10000000.0 10000000.0 \n", - "-0.64 0.29 \n", - "10000000.0 10000000.0 \n", - "-5.56 0.33 \n", - "-5.6 1.51 \n", - "-6.56 0.82 \n", - "-12.31 0.82 \n", - "-8.31 0.46 \n", - "2.57 0.76 \n", - "7.09 0.07 \n", - "7.09 0.11 \n", - "-0.94 0.18 \n", - "8.73 0.76 \n", - "5.26 0.76 \n", - "-6.28 0.52 \n", - "-1.53 0.62 \n", - "5.06 0.67 \n", - "8.6 0.11 \n", - "2.44 0.11 \n", - "0.02 0.36 \n", - "3.17 5.06 \n", - "0.69 0.13 \n", - "159.78 1.77 \n", - "-22.32 1.03 \n", - "-23.57 1.12 \n", - "-24.63 1.02 \n", - "1.3 0.12 \n", - "1.36 0.71 \n", - "10000000.0 10000000.0 \n", - "10.75 0.39 \n", - "-20.98 1.09 \n", - "-10.46 4.93 \n", - "8.39 1.11 \n", - "-1.96 0.4 \n", - "8.44 0.51 \n", - "8.44 0.51 \n", - "2.03 0.39 \n", - "1.34 0.4 \n", - "10000000.0 10000000.0 \n", - "8.78 0.13 \n", - "-3.34 0.78 \n", - "8.18 0.71 \n", - "7.76 0.86 \n", - "-0.63 0.18 \n", - "-0.01 0.25 \n", - "14.88 0.5 \n", - "-0.49 0.32 \n", - "-1.04 0.91 \n", - "-5.67 0.33 \n", - "11.27 0.87 \n", - "2.27 0.73 \n", - "2.95 0.16 \n", - "-0.67 0.87 \n", - "-7.01 0.87 \n", - "-0.81 0.71 \n", - "-0.24 0.65 \n", - "10000000.0 10000000.0 \n", - "-0.24 0.65 \n", - "-5.07 0.73 \n", - "-18.54 1.97 \n", - "-16.79 1.43 \n", - "-7.62 0.46 \n", - "-19.32 3.63 \n", - "-3.17 1.65 \n", - "7.13 0.34 \n", - "3.17 0.82 \n", - "0.11 0.11 \n", - "1.22 0.73 \n", - "-4.58 2.16 \n", - "8.65 0.57 \n", - "-24.99 1.15 \n", - "-90.63 6.19 \n", - "-111.77 1.18 \n", - "-4.39 0.91 \n", - "9.66 0.84 \n", - "10000000.0 10000000.0 \n", - "-5.7 0.53 \n", - "10000000.0 10000000.0 \n", - "-1.6 0.54 \n", - "-9.82 2.16 \n", - "None 0.71 \n", - "-1.1 0.5 \n", - "-5.96 0.86 \n", - "4.61 1.01 \n", - "10.54 0.22 \n", - "-37.75 1.3 \n", - "-2.55 0.32 \n", - "-5.9 1.18 \n", - "4.36 0.37 \n", - "8.1 0.51 \n", - "3.48 0.71 \n", - "7.02 0.95 \n", - "-21.19 1.04 \n", - "4.21 0.74 \n", - "0.6 0.66 \n", - "2.25 0.33 \n", - "4.58 0.71 \n", - "-17.2 1.16 \n", - "-2.15 0.86 \n", - "-4.43 0.87 \n", - "-7.39 1.2 \n", - "-4.01 0.86 \n", - "1.81 5.07 \n", - "-4.42 0.59 \n", - "-2.88 0.6 \n", - "-4.89 1.46 \n", - "3.14 0.12 \n", - "1.25 0.48 \n", - "10000000.0 10000000.0 \n", - "-0.44 0.64 \n", - "-6.23 0.63 \n", - "-7.12 0.66 \n", - "-11.56 0.24 \n", - "-4.54 0.62 \n", - "0.03 0.34 \n", - "-2.65 0.54 \n", - "-14.03 6.7 \n", - "0.59 0.46 \n", - "-19.97 1.38 \n", - "-2.75 1.42 \n", - "-3.41 1.42 \n", - "-3.11 0.6 \n", - "-3.34 0.67 \n", - "-0.58 0.71 \n", - "-2.82 0.67 \n", - "-5.58 0.72 \n", - "-8.0 0.56 \n", - "-2.15 0.74 \n", - "-2.22 0.74 \n", - "-4.22 1.37 \n", - "-3.53 0.8 \n", - "-0.79 1.38 \n", - "-3.9 1.06 \n", - "-6.42 1.8 \n", - "-7.21 1.39 \n", - "-6.8 1.41 \n", - "-0.64 1.05 \n", - "10000000.0 10000000.0 \n", - "11.38 0.28 \n", - "14.07 0.29 \n", - "-19.81 0.31 \n", - "-23.82 1.18 \n", - "-41.16 1.36 \n", - "-16.31 2.37 \n", - "-14.03 7.54 \n", - "-14.03 7.59 \n", - "-14.03 7.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.04 0.7 \n", - "-2.12 0.7 \n", - "-0.82 0.76 \n", - "-7.0 1.54 \n", - "-8.34 0.82 \n", - "1.8 0.13 \n", - "-5.68 1.39 \n", - "10000000.0 10000000.0 \n", - "-190.6 3.1 \n", - "-59.15 7.12 \n", - "-106.64 1.69 \n", - "7.53 0.71 \n", - "3.22 1.52 \n", - "-0.08 0.71 \n", - "-0.83 1.48 \n", - "4.63 1.27 \n", - "-6.03 0.6 \n", - "-5.89 0.56 \n", - "-0.27 0.56 \n", - "-0.13 0.6 \n", - "6.8 0.58 \n", - "-2.95 0.63 \n", - "0.79 0.7 \n", - "-1.42 0.64 \n", - "-2.75 0.54 \n", - "-7.24 0.89 \n", - "1.69 0.8 \n", - "-11.13 4.37 \n", - "9.72 0.2 \n", - "-2.46 0.07 \n", - "-1.01 0.08 \n", - "0.94 0.19 \n", - "-1.6 0.71 \n", - "-1.03 0.42 \n", - "-0.13 0.73 \n", - "-1.44 0.45 \n", - "-69.76 1.13 \n", - "10000000.0 10000000.0 \n", - "-10.51 0.47 \n", - "8.02 0.8 \n", - "-2.29 0.82 \n", - "-23.7 1.28 \n", - "-17.34 1.53 \n", - "-15.69 1.36 \n", - "-18.53 1.04 \n", - "6.36 0.98 \n", - "1.05 0.3 \n", - "-12.52 0.98 \n", - "-7.21 0.31 \n", - "-1.16 0.59 \n", - "-6.56 0.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-74.63 2.18 \n", - "-32.0 1.07 \n", - "10000000.0 10000000.0 \n", - "-120.46 1.22 \n", - "None None \n", - "-25.52 1.12 \n", - "-0.16 0.68 \n", - "-13.15 4.96 \n", - "-13.64 0.72 \n", - "-4.55 0.6 \n", - "-5.28 1.38 \n", - "-2.23 1.11 \n", - "-0.64 0.3 \n", - "-5.72 0.82 \n", - "-0.98 0.07 \n", - "7.21 0.33 \n", - "-4.1 0.89 \n", - "3.79 0.71 \n", - "-7.05 0.94 \n", - "-14.87 1.36 \n", - "-5.77 1.2 \n", - "7.4 6.23 \n", - "-1.37 1.09 \n", - "-9.44 1.27 \n", - "-1.62 0.84 \n", - "-7.26 1.32 \n", - "-5.45 1.01 \n", - "-2.31 1.18 \n", - "4.95 0.16 \n", - "-11.88 0.27 \n", - "-0.89 1.21 \n", - "-0.89 1.21 \n", - "-32.61 1.57 \n", - "-82.24 1.58 \n", - "-115.02 1.6 \n", - "-94.74 1.55 \n", - "1.3 1.31 \n", - "-10.46 5.4 \n", - "-9.6 1.21 \n", - "-8.82 1.37 \n", - "-10.07 0.96 \n", - "-21.24 4.5 \n", - "5.2 1.0 \n", - "-26.52 1.41 \n", - "-112.92 1.45 \n", - "-19.05 2.64 \n", - "-3.58 1.0 \n", - "-6.96 1.04 \n", - "-3.51 1.0 \n", - "4.2 1.0 \n", - "-0.89 0.13 \n", - "20.8 1.03 \n", - "-6.72 1.22 \n", - "-27.33 4.38 \n", - "6.43 0.11 \n", - "5.68 0.5 \n", - "-5.96 1.28 \n", - "-5.96 1.28 \n", - "-2.27 1.28 \n", - "-2.26 1.28 \n", - "1.41 0.78 \n", - "-11.48 0.31 \n", - "-11.48 0.32 \n", - "-8.47 0.57 \n", - "-8.47 0.58 \n", - "8.74 0.71 \n", - "8.74 0.72 \n", - "10.54 0.21 \n", - "-7.03 0.36 \n", - "-2.25 0.71 \n", - "0.87 0.35 \n", - "-6.81 3.97 \n", - "5.66 0.35 \n", - "-4.88 0.37 \n", - "1.7 0.82 \n", - "-1.36 0.48 \n", - "-6.32 1.06 \n", - "-22.92 1.14 \n", - "-90.63 6.28 \n", - "-102.49 1.45 \n", - "-5.36 2.64 \n", - "-5.36 2.64 \n", - "0.09 0.5 \n", - "-16.37 1.65 \n", - "-16.86 1.23 \n", - "-9.56 1.06 \n", - "-11.79 0.97 \n", - "-2.02 1.09 \n", - "-0.95 0.36 \n", - "-2.63 0.35 \n", - "-119.68 0.76 \n", - "5.03 0.11 \n", - "-18.07 1.77 \n", - "-9.47 0.64 \n", - "-8.71 0.85 \n", - "-2.94 0.42 \n", - "2.36 0.55 \n", - "5.67 0.45 \n", - "5.03 0.08 \n", - "-2.94 0.49 \n", - "-4.64 0.37 \n", - "4.41 0.52 \n", - "-2.81 0.3 \n", - "-12.71 0.58 \n", - "-1.52 0.37 \n", - "-7.26 0.6 \n", - "-1.95 0.37 \n", - "1.17 0.61 \n", - "-0.6 0.68 \n", - "-4.37 0.71 \n", - "-3.99 0.64 \n", - "-3.97 0.48 \n", - "-5.51 0.51 \n", - "1.4 0.34 \n", - "-0.21 0.17 \n", - "8.13 1.34 \n", - "-6.92 1.69 \n", - "1.21 0.41 \n", - "-14.69 1.56 \n", - "3.55 4.98 \n", - "-83.01 1.03 \n", - "-0.83 1.04 \n", - "10000000.0 10000000.0 \n", - "93.91 0.89 \n", - "93.92 0.91 \n", - "30.61 1.18 \n", - "34.51 1.02 \n", - "34.51 1.03 \n", - "10000000.0 10000000.0 \n", - "19.26 1.03 \n", - "-5.72 0.44 \n", - "-0.85 0.5 \n", - "-3.95 0.73 \n", - "-1.19 0.46 \n", - "-3.29 1.1 \n", - "-5.42 1.13 \n", - "-4.82 0.66 \n", - "-19.68 2.37 \n", - "-22.07 2.56 \n", - "-19.68 2.37 \n", - "-105.97 0.91 \n", - "-62.22 1.39 \n", - "-73.85 1.47 \n", - "-108.63 1.19 \n", - "-120.33 1.49 \n", - "-22.07 2.56 \n", - "-2.66 0.8 \n", - "-2.66 0.8 \n", - "-113.59 1.3 \n", - "-113.59 1.3 \n", - "-4.36 5.01 \n", - "10000000.0 10000000.0 \n", - "6.74 0.65 \n", - "3.81 1.01 \n", - "7.97 0.74 \n", - "-0.5 1.4 \n", - "-1.81 0.5 \n", - "3.02 0.42 \n", - "-0.95 0.32 \n", - "-4.6 0.5 \n", - "-2.31 0.47 \n", - "-4.65 0.59 \n", - "-4.65 0.59 \n", - "14.37 1.78 \n", - "-2.58 0.51 \n", - "6.14 0.18 \n", - "6.14 0.2 \n", - "7.45 0.23 \n", - "-25.58 1.03 \n", - "-3.58 0.51 \n", - "2.54 0.75 \n", - "-0.43 0.51 \n", - "-2.51 0.65 \n", - "-4.0 0.65 \n", - "-8.52 0.58 \n", - "0.52 0.41 \n", - "10000000.0 10000000.0 \n", - "29.45 1.14 \n", - "10000000.0 10000000.0 \n", - "10.11 0.87 \n", - "10000000.0 10000000.0 \n", - "-3.8 0.45 \n", - "2.56 0.44 \n", - "2.56 0.44 \n", - "4.51 0.49 \n", - "-8.78 0.6 \n", - "-3.98 0.49 \n", - "2.96 0.41 \n", - "-3.67 0.46 \n", - "-0.46 0.4 \n", - "-2.77 0.85 \n", - "-4.74 0.99 \n", - "-0.79 0.94 \n", - "-2.88 0.88 \n", - "-13.88 0.97 \n", - "0.4 0.71 \n", - "-1.55 1.6 \n", - "10000000.0 10000000.0 \n", - "-7.43 1.18 \n", - "-4.0 1.13 \n", - "-11.8 1.28 \n", - "1.77 1.18 \n", - "-13.05 1.27 \n", - "-2.14 1.05 \n", - "9.54 1.46 \n", - "-13.78 1.7 \n", - "8.09 1.65 \n", - "0.96 0.71 \n", - "-0.89 0.73 \n", - "-3.38 1.36 \n", - "-8.32 1.4 \n", - "-0.11 1.4 \n", - "-3.17 1.88 \n", - "-14.89 1.97 \n", - "3.94 4.98 \n", - "-73.51 1.49 \n", - "10000000.0 10000000.0 \n", - "92.6 4.94 \n", - "83.08 7.52 \n", - "-14.14 0.81 \n", - "3.69 0.72 \n", - "4.48 0.8 \n", - "-6.89 1.05 \n", - "-4.15 1.45 \n", - "10.53 1.07 \n", - "1.42 0.71 \n", - "-10.42 6.57 \n", - "6.98 0.69 \n", - "2.55 0.72 \n", - "-0.18 1.28 \n", - "9.57 0.81 \n", - "9.2 0.85 \n", - "382.79 2.1 \n", - "-5.02 5.04 \n", - "5.18 0.58 \n", - "-5.75 0.93 \n", - "5.18 0.57 \n", - "-5.75 0.92 \n", - "-7.8 0.95 \n", - "10000000.0 10000000.0 \n", - "-1.89 0.66 \n", - "-4.27 0.66 \n", - "2.48 0.6 \n", - "-1.81 1.19 \n", - "-2.78 0.43 \n", - "10000000.0 10000000.0 \n", - "-5.65 0.43 \n", - "1.42 0.65 \n", - "1.52 0.77 \n", - "-0.4 0.77 \n", - "None 4.9 \n", - "1.07 4.01 \n", - "-6.25 0.68 \n", - "-2.72 0.31 \n", - "10000000.0 10000000.0 \n", - "1.32 0.8 \n", - "-3.69 0.76 \n", - "-2.05 1.01 \n", - "-4.11 1.01 \n", - "-6.26 2.08 \n", - "3.32 1.06 \n", - "-3.43 1.18 \n", - "-3.5 1.06 \n", - "-8.33 1.46 \n", - "-4.97 1.07 \n", - "-4.97 0.94 \n", - "-7.27 0.59 \n", - "-31.11 1.35 \n", - "0.61 0.92 \n", - "0.61 0.92 \n", - "-20.0 4.54 \n", - "-110.93 1.05 \n", - "-2.62 0.35 \n", - "-107.59 1.89 \n", - "-14.2 5.04 \n", - "-21.94 1.79 \n", - "-24.76 1.8 \n", - "-12.1 0.51 \n", - "-7.42 1.34 \n", - "-3.96 0.81 \n", - "-2.66 0.8 \n", - "-35.36 1.3 \n", - "10000000.0 10000000.0 \n", - "-54.26 1.22 \n", - "0.8 1.14 \n", - "5.24 1.17 \n", - "-5.92 1.01 \n", - "9.9 1.88 \n", - "8.92 4.99 \n", - "-14.01 1.14 \n", - "4.44 0.41 \n", - "0.54 1.48 \n", - "-2.99 0.53 \n", - "-3.17 0.53 \n", - "-9.7 0.54 \n", - "6.69 0.44 \n", - "-1.31 0.13 \n", - "-14.0 0.46 \n", - "-27.07 1.53 \n", - "82.33 2.67 \n", - "-3.99 0.12 \n", - "-27.58 1.05 \n", - "-2.31 0.24 \n", - "-4.99 0.25 \n", - "-14.03 5.21 \n", - "-16.31 2.96 \n", - "10000000.0 10000000.0 \n", - "-14.34 2.92 \n", - "10.18 0.58 \n", - "-10.18 0.58 \n", - "-104.4 1.64 \n", - "5.73 0.44 \n", - "9.31 0.49 \n", - "5.73 0.45 \n", - "9.31 0.49 \n", - "-6.09 0.58 \n", - "-0.88 0.51 \n", - "-8.29 0.52 \n", - "-9.24 0.51 \n", - "0.19 0.49 \n", - "-2.17 0.33 \n", - "-6.42 0.49 \n", - "-0.25 0.79 \n", - "-7.7 0.44 \n", - "-5.49 0.8 \n", - "-8.05 0.6 \n", - "1.04 0.4 \n", - "-3.38 0.48 \n", - "-9.33 0.13 \n", - "-5.44 0.35 \n", - "1.25 0.1 \n", - "1.25 0.13 \n", - "3.32 0.71 \n", - "0.15 0.59 \n", - "1.6 0.57 \n", - "5.12 0.13 \n", - "4.8 0.55 \n", - "17.21 5.64 \n", - "12.98 0.65 \n", - "13.69 0.86 \n", - "-11.13 5.39 \n", - "-21.55 7.38 \n", - "-2.84 0.54 \n", - "1.07 0.53 \n", - "3.42 2.87 \n", - "-2.99 0.53 \n", - "0.65 0.2 \n", - "0.82 0.07 \n", - "2.8 0.34 \n", - "-10.11 0.84 \n", - "-2.64 1.18 \n", - "-1.53 0.77 \n", - "8.78 0.39 \n", - "-3.66 0.85 \n", - "0.07 0.38 \n", - "1.68 0.71 \n", - "-1.3 0.32 \n", - "27.91 0.52 \n", - "-2.07 0.44 \n", - "27.91 0.52 \n", - "-3.22 0.51 \n", - "-2.06 0.45 \n", - "-39.05 1.1 \n", - "-26.49 2.26 \n", - "97.86 0.39 \n", - "97.9 0.54 \n", - "-1.16 1.02 \n", - "-2.16 0.66 \n", - "10000000.0 10000000.0 \n", - "0.47 4.73 \n", - "4.18 2.07 \n", - "-0.13 0.71 \n", - "5.25 1.61 \n", - "-12.96 3.97 \n", - "10000000.0 10000000.0 \n", - "-7.82 0.97 \n", - "-1.17 0.71 \n", - "-1.29 0.45 \n", - "4.15 1.31 \n", - "-2.51 0.57 \n", - "4.75 0.95 \n", - "-4.87 0.46 \n", - "6.11 0.38 \n", - "10.46 7.23 \n", - "2.34 0.52 \n", - "0.74 0.35 \n", - "5.79 0.37 \n", - "-4.75 0.36 \n", - "-3.55 0.23 \n", - "-90.39 1.25 \n", - "-90.39 1.25 \n", - "0.17 0.95 \n", - "-13.06 1.12 \n", - "-7.56 1.69 \n", - "-0.43 0.54 \n", - "0.21 0.52 \n", - "-1.52 0.88 \n", - "-6.08 1.02 \n", - "-22.19 1.11 \n", - "-12.69 1.11 \n", - "-10.46 4.97 \n", - "-4.8 0.43 \n", - "0.82 0.47 \n", - "-2.51 0.44 \n", - "-13.43 1.51 \n", - "-1.52 0.54 \n", - "6.74 5.11 \n", - "-7.01 0.53 \n", - "-3.56 0.39 \n", - "-6.36 0.47 \n", - "-9.6 1.46 \n", - "1.17 1.45 \n", - "-6.96 0.87 \n", - "1.12 0.25 \n", - "13.11 0.64 \n", - "-1.93 0.69 \n", - "-1.93 0.69 \n", - "5.21 0.43 \n", - "9.5 0.95 \n", - "-0.07 0.8 \n", - "7.4 0.46 \n", - "-1.06 0.79 \n", - "7.94 0.59 \n", - "-0.53 0.22 \n", - "-0.99 0.34 \n", - "-0.61 0.4 \n", - "-95.68 1.96 \n", - "-5.17 0.34 \n", - "-5.17 0.34 \n", - "-5.17 0.34 \n", - "-4.36 5.28 \n", - "-4.36 5.28 \n", - "-4.36 5.28 \n", - "-4.36 5.28 \n", - "-4.53 0.61 \n", - "-14.34 2.31 \n", - "-2.38 0.49 \n", - "-2.14 0.6 \n", - "-2.34 0.63 \n", - "-8.11 0.46 \n", - "-39.83 1.11 \n", - "-5.17 0.59 \n", - "-3.59 0.68 \n", - "None 2.31 \n", - "-8.44 0.34 \n", - "-5.64 0.81 \n", - "-0.07 1.22 \n", - "9.23 0.84 \n", - "5.96 0.32 \n", - "0.51 0.84 \n", - "0.44 0.85 \n", - "4.5 1.22 \n", - "2.04 0.27 \n", - "2.04 0.28 \n", - "4.36 0.98 \n", - "-5.32 0.71 \n", - "8.93 1.02 \n", - "1.74 0.76 \n", - "2.48 1.24 \n", - "-1.34 0.82 \n", - "-4.82 0.82 \n", - "6.58 0.54 \n", - "-18.42 5.84 \n", - "-23.14 5.89 \n", - "-10.32 1.49 \n", - "-7.22 0.89 \n", - "-8.84 0.76 \n", - "-2.66 0.8 \n", - "-4.36 4.98 \n", - "-13.21 1.07 \n", - "3.68 1.38 \n", - "-16.31 1.49 \n", - "-5.3 0.39 \n", - "-1.15 0.43 \n", - "5.6 0.37 \n", - "4.72 1.45 \n", - "5.61 0.36 \n", - "4.72 1.45 \n", - "-117.0 2.28 \n", - "-7.19 1.91 \n", - "-1.53 0.87 \n", - "3.49 0.73 \n", - "5.01 1.07 \n", - "-6.53 4.99 \n", - "-1.38 0.78 \n", - "-3.8 5.3 \n", - "-5.54 1.2 \n", - "3.08 1.26 \n", - "-6.8 0.83 \n", - "-5.8 1.53 \n", - "-3.34 0.46 \n", - "14.74 0.5 \n", - "11.14 0.86 \n", - "-2.63 1.54 \n", - "1.74 0.94 \n", - "-1.14 1.36 \n", - "0.85 0.65 \n", - "-14.73 1.19 \n", - "-7.79 0.66 \n", - "11.5 0.72 \n", - "-0.1 0.53 \n", - "-8.29 0.26 \n", - "-8.29 0.27 \n", - "-105.97 0.91 \n", - "-105.96 0.91 \n", - "-108.62 1.19 \n", - "-105.96 0.91 \n", - "-108.62 1.2 \n", - "-2.89 0.35 \n", - "-5.54 0.35 \n", - "26.91 1.75 \n", - "-13.2 1.07 \n", - "-118.45 1.59 \n", - "4.6 0.98 \n", - "9.87 0.48 \n", - "-1.06 6.63 \n", - "-1.54 5.1 \n", - "1.82 0.08 \n", - "1.99 0.28 \n", - "-3.05 0.39 \n", - "-3.92 0.52 \n", - "-3.57 0.59 \n", - "-3.79 0.42 \n", - "-14.12 0.57 \n", - "-7.41 0.5 \n", - "-4.0 0.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.16 0.68 \n", - "-11.13 4.35 \n", - "0.41 0.71 \n", - "0.19 0.35 \n", - "-8.62 0.34 \n", - "-1.32 0.34 \n", - "-4.0 0.63 \n", - "2.6 0.18 \n", - "16.92 0.92 \n", - "0.25 0.82 \n", - "-3.91 1.0 \n", - "77.66 5.31 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "-117.42 1.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.66 \n", - "None 1.23 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "None 3.11 \n", - "None 1.02 \n", - "None 1.02 \n", - "-3.06 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.92 0.53 \n", - "10000000.0 10000000.0 \n", - "5.09 1.02 \n", - "None 0.49 \n", - "None 0.49 \n", - "None 0.35 \n", - "None 0.35 \n", - "None 0.71 \n", - "None 0.71 \n", - "-3.8 0.81 \n", - "-5.52 0.33 \n", - "None 2.28 \n", - "None 2.31 \n", - "-5.79 0.52 \n", - "None 2.28 \n", - "0.71 1.21 \n", - "-8.87 0.64 \n", - "None 2.31 \n", - "-5.83 1.19 \n", - "-0.76 0.79 \n", - "-3.56 0.39 \n", - "-9.05 0.5 \n", - "None 2.31 \n", - "-10.1 0.31 \n", - "None 2.36 \n", - "None 2.19 \n", - "None 2.19 \n", - "10.66 0.78 \n", - "None 28.44 \n", - "None 0.74 \n", - "None 0.74 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 3.86 \n", - "None 3.86 \n", - "0.18 0.33 \n", - "-1.29 0.36 \n", - "None 4.3 \n", - "None 4.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "12.3 0.88 \n", - "None 6.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.94 0.95 \n", - "None 0.54 \n", - "None 0.54 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "None 1.1 \n", - "None None \n", - "None 0.41 \n", - "10000000.0 10000000.0 \n", - "0.42 0.49 \n", - "None 0.41 \n", - "-11.98 0.63 \n", - "-10.3 0.94 \n", - "-6.16 0.07 \n", - "-0.45 0.11 \n", - "-6.66 1.32 \n", - "None 2.18 \n", - "None 2.79 \n", - "None 2.79 \n", - "-0.69 0.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.34 0.61 \n", - "None 8.27 \n", - "None 10.24 \n", - "-0.44 0.54 \n", - "10000000.0 10000000.0 \n", - "-20.64 8.16 \n", - "-42.75 1.12 \n", - "-40.64 1.59 \n", - "None 4.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.31 7.47 \n", - "-6.16 0.07 \n", - "None 1.94 \n", - "None 1.94 \n", - "None 1.94 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.47 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "None 3.13 \n", - "None 2.32 \n", - "None 2.21 \n", - "None 2.21 \n", - "-9.11 2.23 \n", - "None 2.14 \n", - "-6.16 0.07 \n", - "None 0.83 \n", - "None 0.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-17.35 1.57 \n", - "8.55 1.27 \n", - "-0.35 0.81 \n", - "None 0.48 \n", - "None 0.48 \n", - "10000000.0 10000000.0 \n", - "4.02 0.24 \n", - "6.16 0.07 \n", - "None 0.41 \n", - "None 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.98 5.53 \n", - "-6.16 0.07 \n", - "None 1.12 \n", - "None 0.33 \n", - "None 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "None 1.36 \n", - "-6.16 0.07 \n", - "None 2.79 \n", - "None 2.79 \n", - "None 0.81 \n", - "None 0.71 \n", - "None 12.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.72 \n", - "None 0.71 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "None 30.46 \n", - "-6.81 8.11 \n", - "1.1 6.86 \n", - "-33.65 15.6 \n", - "-33.65 14.35 \n", - "-42.92 14.24 \n", - "None 6.84 \n", - "None 6.84 \n", - "None 6.84 \n", - "-6.16 0.07 \n", - "0.24 0.33 \n", - "1.05 0.49 \n", - "None None \n", - "81.09 0.39 \n", - "-0.18 0.36 \n", - "-6.16 0.07 \n", - "1.68 0.68 \n", - "None 2.8 \n", - "None 2.8 \n", - "None 3.96 \n", - "None 3.96 \n", - "None 2.8 \n", - "None 1.95 \n", - "None 1.95 \n", - "-6.16 0.07 \n", - "-80.04 0.38 \n", - "None 2.91 \n", - "10000000.0 10000000.0 \n", - "-79.0 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.34 5.16 \n", - "None 7.09 \n", - "None 7.09 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "None 0.99 \n", - "None 0.99 \n", - "None 0.99 \n", - "-48.78 1.22 \n", - "-22.88 1.52 \n", - "None 2.73 \n", - "None 2.73 \n", - "5.19 0.78 \n", - "None 4.23 \n", - "None 4.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.41 \n", - "None 0.41 \n", - "None 4.21 \n", - "-6.16 0.07 \n", - "None 0.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.01 0.48 \n", - "None 1.02 \n", - "None 2.59 \n", - "None 2.6 \n", - "None 2.6 \n", - "None 1.26 \n", - "None 0.83 \n", - "None 0.83 \n", - "None 3.79 \n", - "None 3.8 \n", - "None 3.8 \n", - "None 0.51 \n", - "None 0.51 \n", - "10000000.0 10000000.0 \n", - "-21.41 0.92 \n", - "-29.08 1.5 \n", - "-3.18 1.19 \n", - "-18.75 1.44 \n", - "None None \n", - "None 3.8 \n", - "None 3.8 \n", - "None 3.8 \n", - "10000000.0 10000000.0 \n", - "-5.83 0.28 \n", - "-5.83 0.28 \n", - "-124.58 0.86 \n", - "-15.07 0.59 \n", - "None 0.35 \n", - "None 0.35 \n", - "-15.67 0.44 \n", - "10000000.0 10000000.0 \n", - "-54.2 1.37 \n", - "-54.2 1.37 \n", - "-48.62 1.63 \n", - "-48.62 1.63 \n", - "10000000.0 10000000.0 \n", - "None 1.09 \n", - "None 1.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.64 0.62 \n", - "None 0.44 \n", - "None 0.44 \n", - "None 2.5 \n", - "None 2.55 \n", - "None 2.55 \n", - "None 2.55 \n", - "-2.83 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 52.42 \n", - "394.5 47.75 \n", - "-3.77 0.36 \n", - "-4.16 0.36 \n", - "-1.7 27.24 \n", - "None 10.54 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 12.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.41 \n", - "None 0.41 \n", - "-6.16 0.07 \n", - "None 1.06 \n", - "None 0.71 \n", - "None 0.71 \n", - "3.65 0.62 \n", - "-3.35 0.3 \n", - "None 2.33 \n", - "None 1.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.82 0.35 \n", - "10000000.0 10000000.0 \n", - "-5.82 0.35 \n", - "-5.82 0.35 \n", - "-2.62 0.35 \n", - "-2.62 0.35 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "-2.63 1.54 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "-2.61 0.35 \n", - "-2.61 0.35 \n", - "-3.6 0.73 \n", - "-3.61 0.73 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "-35.4 1.67 \n", - "-9.51 1.39 \n", - "-71.92 4.36 \n", - "-67.45 4.38 \n", - "-71.27 4.38 \n", - "-71.92 4.36 \n", - "-69.46 4.36 \n", - "-6.16 0.07 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.71 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-45.21 2.14 \n", - "None 0.71 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "2.84 0.71 \n", - "-50.9 1.6 \n", - "-50.49 1.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.9 1.06 \n", - "10000000.0 10000000.0 \n", - "-9.58 7.19 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.71 \n", - "-8.9 1.25 \n", - "-3.32 1.54 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "None 1.9 \n", - "None 1.9 \n", - "-9.34 0.31 \n", - "-10.33 0.46 \n", - "None 1.92 \n", - "None 1.84 \n", - "None 1.84 \n", - "None 2.12 \n", - "None 2.12 \n", - "None 1.02 \n", - "None 1.02 \n", - "None 1.02 \n", - "None 2.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "None 2.91 \n", - "-25.73 1.49 \n", - "0.16 1.17 \n", - "-5.41 1.47 \n", - "-6.81 4.46 \n", - "None 0.93 \n", - "-6.16 0.07 \n", - "None 1.15 \n", - "-6.16 0.07 \n", - "None 2.32 \n", - "-6.16 0.07 \n", - "None 0.96 \n", - "None 2.56 \n", - "None 2.14 \n", - "-4.86 0.32 \n", - "None 2.14 \n", - "-6.16 0.07 \n", - "None 2.18 \n", - "4.35 0.35 \n", - "None 1.26 \n", - "None 1.26 \n", - "None 1.26 \n", - "None 1.26 \n", - "None 1.16 \n", - "None 1.16 \n", - "-0.4 0.31 \n", - "-1.7 23.69 \n", - "None 2.18 \n", - "None 2.18 \n", - "-10.29 0.48 \n", - "None 1.4 \n", - "None 2.12 \n", - "None 2.12 \n", - "None 2.53 \n", - "None 2.09 \n", - "-8.57 0.72 \n", - "None 2.14 \n", - "None 2.8 \n", - "None None \n", - "-2.83 1.5 \n", - "-4.46 0.92 \n", - "None 3.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-0.5 0.57 \n", - "-39.69 1.66 \n", - "None 1.26 \n", - "None 1.26 \n", - "10000000.0 10000000.0 \n", - "-10.54 0.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.18 \n", - "None 2.18 \n", - "10000000.0 10000000.0 \n", - "-1.7 25.64 \n", - "-1.7 27.63 \n", - "10000000.0 10000000.0 \n", - "None 2.12 \n", - "None 2.12 \n", - "-6.16 0.07 \n", - "None 0.86 \n", - "-6.16 0.07 \n", - "None 0.73 \n", - "None 0.54 \n", - "10000000.0 10000000.0 \n", - "None 0.54 \n", - "None 0.49 \n", - "None 0.49 \n", - "-6.16 0.07 \n", - "None 2.77 \n", - "None 2.77 \n", - "None 0.54 \n", - "-6.16 0.07 \n", - "None 0.89 \n", - "None 0.54 \n", - "None 0.47 \n", - "None 0.47 \n", - "-1.69 0.17 \n", - "None 0.27 \n", - "10000000.0 10000000.0 \n", - "None 0.27 \n", - "None 0.62 \n", - "-21.34 1.49 \n", - "4.56 1.18 \n", - "-1.02 1.48 \n", - "None 0.62 \n", - "-12.37 0.71 \n", - "None 0.34 \n", - "10000000.0 10000000.0 \n", - "None 0.34 \n", - "None 3.87 \n", - "0.28 0.38 \n", - "-10.36 1.54 \n", - "-14.34 0.98 \n", - "-14.34 1.12 \n", - "10000000.0 10000000.0 \n", - "None 3.89 \n", - "None 3.89 \n", - "None 4.33 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "None 2.18 \n", - "-8.88 3.99 \n", - "None 3.89 \n", - "None 3.55 \n", - "None 3.55 \n", - "None 3.55 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.71 \n", - "-199.02 1.69 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.71 \n", - "4.44 0.24 \n", - "None 1.56 \n", - "None 1.56 \n", - "-13.15 2.75 \n", - "None 1.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 15.92 \n", - "-14.03 17.66 \n", - "-2.61 0.79 \n", - "-1.7 15.34 \n", - "-1.7 17.0 \n", - "-1.7 29.86 \n", - "None 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "None 1.6 \n", - "None 1.6 \n", - "None 0.49 \n", - "None 0.49 \n", - "None 1.24 \n", - "None 1.24 \n", - "None None \n", - "None 0.54 \n", - "-1.48 0.35 \n", - "-40.3 1.63 \n", - "-14.41 1.35 \n", - "-19.98 1.62 \n", - "None 3.56 \n", - "None 3.56 \n", - "None 1.26 \n", - "None 1.26 \n", - "-6.16 0.07 \n", - "None 0.64 \n", - "None 0.64 \n", - "None 3.87 \n", - "None 2.25 \n", - "None 2.25 \n", - "10000000.0 10000000.0 \n", - "None 3.89 \n", - "None 3.89 \n", - "None 2.12 \n", - "-14.5 0.44 \n", - "-6.16 0.07 \n", - "None 1.09 \n", - "-6.16 0.07 \n", - "None 10.1 \n", - "10000000.0 10000000.0 \n", - "-4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "-7.66 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.31 0.84 \n", - "None 4.27 \n", - "None 4.27 \n", - "None 4.27 \n", - "-26.19 1.56 \n", - "-6.16 0.07 \n", - "None 0.64 \n", - "None 0.64 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "2.14 30.8 \n", - "260.84 1.92 \n", - "None 12.06 \n", - "-25.44 1.48 \n", - "0.45 1.16 \n", - "None 0.35 \n", - "None 0.35 \n", - "-5.6 0.58 \n", - "-5.6 0.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.6 0.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "None 0.79 \n", - "None 0.79 \n", - "None 0.79 \n", - "10000000.0 10000000.0 \n", - "None 1.94 \n", - "None 1.94 \n", - "10000000.0 10000000.0 \n", - "None 0.44 \n", - "None 0.44 \n", - "None 0.44 \n", - "None 0.44 \n", - "-6.16 0.07 \n", - "None 0.44 \n", - "-6.16 0.07 \n", - "None 12.81 \n", - "-6.16 0.07 \n", - "-9.38 0.68 \n", - "None 10.68 \n", - "None 4.27 \n", - "-6.16 0.07 \n", - "None 6.41 \n", - "-6.81 9.58 \n", - "None 8.53 \n", - "None 2.56 \n", - "None 2.14 \n", - "-10.1 0.31 \n", - "None 2.29 \n", - "-1.44 0.38 \n", - "-9.58 0.4 \n", - "None 2.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-24.78 1.48 \n", - "1.11 1.16 \n", - "None 4.27 \n", - "None 4.27 \n", - "None 4.27 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "None 1.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "None 2.28 \n", - "-0.46 14.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 7.71 \n", - "-3.11 9.8 \n", - "-3.04 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.33 9.79 \n", - "1.83 0.5 \n", - "10000000.0 10000000.0 \n", - "None 2.96 \n", - "None 2.96 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 0.39 \n", - "-11.19 0.53 \n", - "None 1.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-223.73 8.84 \n", - "-11.23 18.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "None 1.06 \n", - "10000000.0 10000000.0 \n", - "None 2.15 \n", - "None 2.15 \n", - "-2.0 0.44 \n", - "None 2.01 \n", - "None 2.01 \n", - "-5.98 1.16 \n", - "-31.87 1.48 \n", - "-5.98 1.16 \n", - "-11.55 1.46 \n", - "-31.87 1.48 \n", - "-11.55 1.46 \n", - "-31.88 1.48 \n", - "-5.98 1.16 \n", - "-11.56 1.46 \n", - "-6.34 0.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.84 \n", - "-5.54 1.2 \n", - "None 2.84 \n", - "None 0.71 \n", - "None 0.71 \n", - "-20.31 2.54 \n", - "0.83 1.13 \n", - "-6.09 1.45 \n", - "-2.78 0.75 \n", - "4.95 1.33 \n", - "-0.74 0.39 \n", - "10000000.0 10000000.0 \n", - "-2.79 0.87 \n", - "-0.26 0.41 \n", - "-2.99 0.87 \n", - "-0.6 0.28 \n", - "7.45 0.1 \n", - "-0.75 1.0 \n", - "7.46 0.13 \n", - "-4.93 0.87 \n", - "0.37 0.42 \n", - "4.0 0.5 \n", - "-0.65 1.16 \n", - "-5.07 0.71 \n", - "-6.69 0.71 \n", - "0.24 1.08 \n", - "-0.73 4.44 \n", - "2.69 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.92 0.65 \n", - "-105.77 1.22 \n", - "1.01 0.76 \n", - "1.01 0.76 \n", - "-7.84 1.14 \n", - "10.22 4.94 \n", - "13.43 1.51 \n", - "-8.67 0.3 \n", - "-8.66 0.3 \n", - "-11.02 0.35 \n", - "-2.62 0.35 \n", - "-16.17 4.49 \n", - "-0.27 0.55 \n", - "0.06 0.41 \n", - "8.39 0.99 \n", - "-49.25 0.53 \n", - "-3.62 0.45 \n", - "-3.62 0.46 \n", - "1.17 0.54 \n", - "3.48 0.52 \n", - "9.23 0.84 \n", - "-2.7 1.11 \n", - "-82.32 0.78 \n", - "-4.45 0.68 \n", - "-2.81 0.3 \n", - "-35.35 1.1 \n", - "-2.93 1.07 \n", - "None None \n", - "-10.65 0.48 \n", - "-0.66 0.13 \n", - "-16.31 1.05 \n", - "3.55 0.75 \n", - "0.75 0.52 \n", - "4.52 1.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-96.63 0.76 \n", - "4.52 1.9 \n", - "13.27 0.43 \n", - "-32.0 1.07 \n", - "-3.04 0.42 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "6.62 0.66 \n", - "-6.81 0.68 \n", - "2.6 0.65 \n", - "-5.41 0.78 \n", - "-24.42 1.36 \n", - "-14.34 0.96 \n", - "-1.07 0.42 \n", - "-0.02 0.21 \n", - "-1.26 0.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.77 0.45 \n", - "0.13 0.71 \n", - "-5.85 0.66 \n", - "-5.22 0.64 \n", - "-3.58 1.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.13 4.62 \n", - "-14.11 1.64 \n", - "-75.64 1.39 \n", - "-60.57 1.36 \n", - "-7.65 0.5 \n", - "-9.93 0.51 \n", - "-3.47 0.14 \n", - "4.42 0.11 \n", - "8.09 0.14 \n", - "-2.69 0.15 \n", - "-10.58 0.13 \n", - "-1.9 0.57 \n", - "5.02 0.34 \n", - "-1.0 0.09 \n", - "-6.8 0.8 \n", - "-1.43 0.41 \n", - "-1.42 0.41 \n", - "-33.15 1.09 \n", - "-5.49 0.55 \n", - "5.63 0.42 \n", - "5.64 0.42 \n", - "-6.03 0.43 \n", - "2.54 0.77 \n", - "-0.8 0.28 \n", - "0.63 0.42 \n", - "10000000.0 10000000.0 \n", - "0.91 1.09 \n", - "10000000.0 10000000.0 \n", - "-7.77 1.09 \n", - "-8.27 0.89 \n", - "-4.96 0.94 \n", - "2.7 0.9 \n", - "3.15 0.9 \n", - "-5.81 0.93 \n", - "0.07 0.35 \n", - "-3.56 0.59 \n", - "-4.84 0.92 \n", - "-1.62 0.08 \n", - "10000000.0 10000000.0 \n", - "2.42 0.49 \n", - "-0.94 0.88 \n", - "-0.69 0.44 \n", - "-4.96 0.89 \n", - "-2.2 0.94 \n", - "-5.49 0.18 \n", - "1.97 0.32 \n", - "-4.12 0.71 \n", - "-7.69 1.9 \n", - "-16.38 1.81 \n", - "-11.34 1.48 \n", - "-3.74 0.72 \n", - "-3.32 0.72 \n", - "-2.42 0.72 \n", - "1.11 0.89 \n", - "-0.95 0.77 \n", - "-5.39 0.58 \n", - "-6.62 0.61 \n", - "-6.62 0.61 \n", - "5.63 0.54 \n", - "1.27 0.18 \n", - "-4.38 0.94 \n", - "-0.22 0.7 \n", - "10000000.0 10000000.0 \n", - "-1.74 0.69 \n", - "-2.0 0.32 \n", - "10.92 1.31 \n", - "-7.0 1.03 \n", - "-0.9 1.3 \n", - "2.45 0.94 \n", - "-11.67 1.68 \n", - "10000000.0 10000000.0 \n", - "-69.98 3.1 \n", - "-69.98 3.1 \n", - "-69.98 3.1 \n", - "-69.98 3.1 \n", - "-2.51 0.49 \n", - "-2.96 0.46 \n", - "-16.31 2.37 \n", - "0.4 0.31 \n", - "-6.69 1.09 \n", - "-6.68 1.09 \n", - "5.59 0.71 \n", - "10000000.0 10000000.0 \n", - "0.42 1.07 \n", - "74.39 5.31 \n", - "10000000.0 10000000.0 \n", - "-0.61 18.03 \n", - "-40.66 3.32 \n", - "2.9 0.34 \n", - "-2.67 0.35 \n", - "-6.3 0.45 \n", - "-12.38 2.0 \n", - "-20.02 4.44 \n", - "-7.96 0.54 \n", - "-14.32 0.38 \n", - "-26.77 1.4 \n", - "-105.96 0.91 \n", - "-108.62 1.19 \n", - "-108.62 1.2 \n", - "-75.63 1.39 \n", - "-61.57 1.37 \n", - "-16.11 1.89 \n", - "-2.28 0.8 \n", - "-2.27 0.8 \n", - "-83.04 6.34 \n", - "-49.25 0.53 \n", - "-5.42 0.49 \n", - "0.35 0.57 \n", - "-0.1 0.41 \n", - "2.18 0.45 \n", - "-2.18 0.45 \n", - "1.55 0.36 \n", - "-11.99 1.04 \n", - "10000000.0 10000000.0 \n", - "-5.9 1.0 \n", - "4.05 1.05 \n", - "19.23 1.8 \n", - "-7.31 0.92 \n", - "-1.3 0.22 \n", - "-22.2 1.44 \n", - "-17.84 0.67 \n", - "-17.84 0.67 \n", - "10000000.0 10000000.0 \n", - "-8.68 0.57 \n", - "-5.85 0.61 \n", - "-3.78 0.56 \n", - "-0.57 0.71 \n", - "-2.38 0.57 \n", - "-5.59 0.72 \n", - "-9.31 0.58 \n", - "-1.0 0.77 \n", - "-11.22 0.71 \n", - "-8.88 3.73 \n", - "-0.45 0.66 \n", - "-2.53 0.67 \n", - "-16.55 8.5 \n", - "10000000.0 10000000.0 \n", - "-4.67 0.75 \n", - "9.54 1.03 \n", - "0.05 0.47 \n", - "10000000.0 10000000.0 \n", - "43.42 1.35 \n", - "7.41 0.82 \n", - "16.82 0.79 \n", - "-16.17 3.95 \n", - "5.14 0.58 \n", - "-26.58 1.17 \n", - "1.08 0.23 \n", - "-7.54 0.79 \n", - "-9.68 2.26 \n", - "-9.68 2.23 \n", - "-6.3 1.01 \n", - "-139.01 2.21 \n", - "-9.13 1.52 \n", - "-2.65 1.79 \n", - "6.33 0.5 \n", - "-21.62 2.52 \n", - "-22.86 1.25 \n", - "-25.4 1.14 \n", - "0.08 0.71 \n", - "-0.55 0.74 \n", - "-10.37 0.91 \n", - "-11.44 1.1 \n", - "-3.79 0.74 \n", - "0.23 0.41 \n", - "-2.04 0.21 \n", - "6.51 0.83 \n", - "-3.8 5.25 \n", - "-1.02 0.8 \n", - "2.58 0.84 \n", - "0.18 0.71 \n", - "-75.34 1.36 \n", - "5.16 1.04 \n", - "-3.01 2.69 \n", - "-3.01 2.69 \n", - "-2.95 0.47 \n", - "-6.53 1.15 \n", - "-85.51 1.71 \n", - "-8.41 0.61 \n", - "-6.76 0.73 \n", - "-2.46 0.78 \n", - "4.93 0.79 \n", - "4.23 0.22 \n", - "4.94 0.79 \n", - "0.63 0.76 \n", - "7.82 0.41 \n", - "7.82 0.42 \n", - "-4.47 0.16 \n", - "9.69 0.93 \n", - "9.69 0.93 \n", - "-3.08 0.83 \n", - "-12.08 0.38 \n", - "-0.33 0.4 \n", - "-3.29 0.51 \n", - "-2.66 0.52 \n", - "3.6 0.35 \n", - "3.6 0.35 \n", - "1.17 0.41 \n", - "4.87 0.29 \n", - "-2.78 0.78 \n", - "-0.24 0.5 \n", - "10000000.0 10000000.0 \n", - "3.8 0.94 \n", - "-27.92 1.39 \n", - "-0.95 0.43 \n", - "-8.11 1.09 \n", - "5.36 0.42 \n", - "5.37 0.41 \n", - "-6.11 1.15 \n", - "-6.34 1.32 \n", - "5.51 0.46 \n", - "3.57 0.41 \n", - "3.57 0.41 \n", - "2.67 0.47 \n", - "2.77 0.26 \n", - "-4.55 7.17 \n", - "-4.55 7.16 \n", - "-91.28 4.02 \n", - "13.67 0.56 \n", - "-2.64 0.46 \n", - "-3.61 5.41 \n", - "-3.61 5.41 \n", - "-3.61 5.41 \n", - "10000000.0 10000000.0 \n", - "0.98 0.55 \n", - "1.88 1.41 \n", - "3.76 7.12 \n", - "-91.28 4.43 \n", - "-91.28 4.08 \n", - "-91.28 4.1 \n", - "4.63 0.51 \n", - "2.14 0.18 \n", - "-10.51 0.53 \n", - "-17.48 0.57 \n", - "0.64 0.48 \n", - "4.62 0.68 \n", - "0.53 0.21 \n", - "0.12 0.21 \n", - "0.53 0.22 \n", - "0.12 0.22 \n", - "-94.53 0.78 \n", - "-1.1 0.49 \n", - "-40.89 0.35 \n", - "-3.49 0.69 \n", - "-3.63 0.58 \n", - "-2.67 0.69 \n", - "-3.22 0.8 \n", - "-2.82 0.75 \n", - "-4.36 0.77 \n", - "21.15 5.73 \n", - "-12.92 1.54 \n", - "-9.67 0.58 \n", - "10000000.0 10000000.0 \n", - "0.61 0.58 \n", - "5.92 0.59 \n", - "-0.75 1.28 \n", - "-2.66 0.8 \n", - "-14.82 4.59 \n", - "2.16 0.26 \n", - "2.8 0.3 \n", - "-28.93 1.06 \n", - "2.79 0.29 \n", - "-3.17 0.32 \n", - "-3.71 0.52 \n", - "-19.3 1.66 \n", - "1.3 1.08 \n", - "0.13 0.32 \n", - "-3.32 0.45 \n", - "-3.8 0.27 \n", - "-107.99 1.21 \n", - "-4.72 0.95 \n", - "3.25 0.05 \n", - "-9.41 0.09 \n", - "-8.76 5.39 \n", - "0.64 1.03 \n", - "-2.11 0.94 \n", - "-3.17 1.18 \n", - "1.81 5.07 \n", - "2.2 0.33 \n", - "-3.72 0.43 \n", - "0.79 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.84 0.51 \n", - "4.65 0.23 \n", - "-2.53 0.45 \n", - "4.75 0.65 \n", - "0.17 0.28 \n", - "-5.73 0.6 \n", - "-5.7 0.6 \n", - "7.34 0.62 \n", - "4.57 0.32 \n", - "-0.32 0.94 \n", - "-3.4 0.63 \n", - "-6.58 1.59 \n", - "-1.76 0.52 \n", - "-25.72 1.11 \n", - "4.4 0.53 \n", - "-4.91 0.7 \n", - "-139.17 1.04 \n", - "-20.79 1.5 \n", - "-2.99 0.44 \n", - "-6.35 5.35 \n", - "-0.46 3.19 \n", - "0.2 0.43 \n", - "-10.46 4.99 \n", - "6.25 0.5 \n", - "-2.69 0.63 \n", - "0.43 0.71 \n", - "-0.25 0.71 \n", - "-2.1 0.3 \n", - "4.27 0.24 \n", - "-6.02 0.56 \n", - "-14.03 4.4 \n", - "-24.51 1.0 \n", - "10000000.0 10000000.0 \n", - "-5.78 0.39 \n", - "-8.14 0.89 \n", - "1.86 0.82 \n", - "-2.58 0.85 \n", - "19.65 0.79 \n", - "19.65 0.79 \n", - "-0.17 0.71 \n", - "10000000.0 10000000.0 \n", - "-2.93 0.34 \n", - "-4.36 7.2 \n", - "-2.69 0.35 \n", - "-6.11 0.45 \n", - "-0.02 0.55 \n", - "-0.42 0.86 \n", - "-1.09 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.68 1.08 \n", - "-1.86 0.46 \n", - "-3.9 0.57 \n", - "-7.42 1.34 \n", - "-105.96 0.91 \n", - "-2.04 0.72 \n", - "-39.75 1.06 \n", - "-14.28 2.42 \n", - "-2.91 0.79 \n", - "-2.78 0.74 \n", - "-2.81 0.57 \n", - "-3.35 0.56 \n", - "3.8 0.92 \n", - "-3.54 0.71 \n", - "-19.2 5.33 \n", - "-19.2 5.33 \n", - "1.21 0.82 \n", - "4.19 0.29 \n", - "4.19 0.3 \n", - "4.3 0.88 \n", - "4.62 0.58 \n", - "-1.52 0.42 \n", - "-8.21 0.36 \n", - "0.32 0.5 \n", - "5.59 0.6 \n", - "-10.95 0.49 \n", - "4.56 0.55 \n", - "9.09 1.94 \n", - "-16.1 1.54 \n", - "-26.84 4.68 \n", - "-0.46 1.86 \n", - "-1.06 0.41 \n", - "-18.13 0.71 \n", - "10000000.0 10000000.0 \n", - "-40.23 3.83 \n", - "52.66 6.26 \n", - "368.95 1.39 \n", - "-6.17 0.87 \n", - "-46.99 1.58 \n", - "-36.19 1.56 \n", - "3.81 0.46 \n", - "3.81 0.46 \n", - "-5.31 0.4 \n", - "-10.27 0.63 \n", - "-10.46 4.94 \n", - "0.21 0.71 \n", - "5.01 0.41 \n", - "0.11 0.47 \n", - "0.04 0.48 \n", - "-5.46 0.91 \n", - "-1.84 0.91 \n", - "-0.68 0.41 \n", - "-18.13 0.71 \n", - "-39.81 1.3 \n", - "10000000.0 10000000.0 \n", - "-36.37 1.84 \n", - "-22.74 4.57 \n", - "-2.51 0.32 \n", - "-3.65 0.32 \n", - "-61.19 1.37 \n", - "-61.2 1.37 \n", - "-1.88 0.46 \n", - "-104.2 2.06 \n", - "2.22 0.51 \n", - "-5.08 0.75 \n", - "0.48 0.41 \n", - "0.48 0.43 \n", - "-4.66 0.35 \n", - "-1.01 0.39 \n", - "0.38 0.45 \n", - "1.97 0.45 \n", - "-0.18 0.44 \n", - "-3.81 0.62 \n", - "-2.35 0.62 \n", - "0.2 0.71 \n", - "-3.44 0.67 \n", - "-5.5 0.72 \n", - "0.59 0.63 \n", - "-0.66 0.71 \n", - "-6.75 0.63 \n", - "-3.41 0.78 \n", - "-4.69 1.0 \n", - "-0.04 0.31 \n", - "-3.07 0.3 \n", - "-9.1 0.61 \n", - "-10.56 0.71 \n", - "-3.09 0.3 \n", - "-5.31 1.13 \n", - "-27.53 5.1 \n", - "-37.03 1.52 \n", - "-1.7 8.5 \n", - "108.57 6.19 \n", - "-6.02 0.56 \n", - "-1.7 5.49 \n", - "-9.26 0.61 \n", - "2.58 0.41 \n", - "-40.98 1.18 \n", - "1.84 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.69 1.08 \n", - "-66.85 2.04 \n", - "11.86 1.31 \n", - "10.94 1.06 \n", - "17.1 1.06 \n", - "-5.6 0.54 \n", - "0.48 0.63 \n", - "2.96 2.87 \n", - "2.01 1.46 \n", - "5.17 0.59 \n", - "-0.54 0.83 \n", - "-6.74 5.2 \n", - "-8.88 3.98 \n", - "2.67 0.5 \n", - "-3.13 0.83 \n", - "-22.49 1.11 \n", - "-4.99 0.43 \n", - "-4.94 0.57 \n", - "-7.22 0.58 \n", - "-6.74 5.1 \n", - "-100.17 3.73 \n", - "-4.36 6.18 \n", - "-1.46 5.66 \n", - "-14.03 5.84 \n", - "-120.41 3.78 \n", - "-1.5 0.52 \n", - "-4.25 0.89 \n", - "-3.67 2.95 \n", - "-3.67 2.97 \n", - "-22.57 1.11 \n", - "-10.46 5.4 \n", - "-0.28 0.38 \n", - "-96.63 0.76 \n", - "-3.88 0.56 \n", - "10000000.0 10000000.0 \n", - "-1.64 0.42 \n", - "-2.63 0.35 \n", - "-3.61 5.5 \n", - "7.37 0.85 \n", - "-24.35 1.32 \n", - "-1.34 0.85 \n", - "1.86 1.01 \n", - "5.24 0.3 \n", - "5.24 0.29 \n", - "-19.84 1.97 \n", - "8.28 1.83 \n", - "10000000.0 10000000.0 \n", - "4.52 1.9 \n", - "10000000.0 10000000.0 \n", - "-102.22 0.86 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "-4.52 1.9 \n", - "2.92 0.34 \n", - "-1.97 0.56 \n", - "451.42 1.97 \n", - "451.42 1.97 \n", - "1.51 0.33 \n", - "-12.96 8.73 \n", - "1.55 0.33 \n", - "-7.67 0.33 \n", - "-1.92 0.36 \n", - "-84.15 1.83 \n", - "-3.12 0.44 \n", - "-28.78 1.13 \n", - "4.32 0.77 \n", - "4.33 0.76 \n", - "-3.95 0.81 \n", - "-3.31 0.87 \n", - "-3.83 0.89 \n", - "1.04 0.68 \n", - "-3.28 0.51 \n", - "5.22 6.14 \n", - "5.22 6.12 \n", - "-12.79 0.99 \n", - "-104.49 1.31 \n", - "-104.49 1.31 \n", - "-1.14 1.13 \n", - "0.69 1.32 \n", - "7.72 0.37 \n", - "7.72 0.36 \n", - "2.47 0.51 \n", - "4.44 0.36 \n", - "4.73 0.71 \n", - "4.73 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.13 3.39 \n", - "-1.98 0.41 \n", - "-4.17 0.75 \n", - "0.12 0.49 \n", - "1.98 0.16 \n", - "-2.46 0.54 \n", - "0.05 0.47 \n", - "-1.87 0.44 \n", - "-9.56 0.3 \n", - "-12.39 0.79 \n", - "8.72 0.83 \n", - "0.56 0.71 \n", - "-0.99 0.81 \n", - "-0.55 0.71 \n", - "21.38 1.65 \n", - "2.82 1.79 \n", - "1.37 0.6 \n", - "-14.18 1.82 \n", - "-4.87 0.41 \n", - "-29.55 1.49 \n", - "6.11 1.17 \n", - "-3.68 0.71 \n", - "1.24 0.74 \n", - "3.6 0.58 \n", - "2.57 0.71 \n", - "-10.89 2.96 \n", - "11.78 1.79 \n", - "-17.94 1.79 \n", - "10.04 4.53 \n", - "0.61 0.3 \n", - "10000000.0 10000000.0 \n", - "-59.61 3.21 \n", - "-45.31 3.93 \n", - "-242.37 1.84 \n", - "2.33 1.14 \n", - "-44.58 2.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.52 1.34 \n", - "1.52 1.23 \n", - "-7.68 1.23 \n", - "-6.06 0.47 \n", - "1.02 0.58 \n", - "-5.12 0.95 \n", - "-1.2 0.77 \n", - "-1.2 0.77 \n", - "-6.45 0.31 \n", - "0.29 0.3 \n", - "-4.39 0.9 \n", - "-81.83 1.55 \n", - "-90.25 1.72 \n", - "4.59 0.71 \n", - "0.89 0.62 \n", - "4.0 0.62 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "0.29 0.41 \n", - "0.39 0.26 \n", - "0.4 0.27 \n", - "-14.03 7.53 \n", - "121.58 10.2 \n", - "1.07 0.36 \n", - "1.07 0.37 \n", - "-106.63 0.94 \n", - "-106.64 0.95 \n", - "-97.88 0.83 \n", - "-13.39 1.07 \n", - "1.14 1.19 \n", - "-83.66 3.85 \n", - "-14.56 4.33 \n", - "-10.53 1.69 \n", - "4.74 0.71 \n", - "-2.89 0.54 \n", - "-5.09 0.53 \n", - "-3.84 0.67 \n", - "-3.11 0.57 \n", - "-32.0 1.07 \n", - "0.38 0.54 \n", - "-8.21 0.46 \n", - "-5.95 0.75 \n", - "0.73 1.88 \n", - "-4.36 5.35 \n", - "0.64 0.74 \n", - "-3.55 0.47 \n", - "-22.58 1.11 \n", - "-105.96 0.91 \n", - "-10.46 5.08 \n", - "-6.33 0.45 \n", - "-3.83 0.81 \n", - "-10.81 0.83 \n", - "-5.34 12.82 \n", - "-5.3 2.35 \n", - "-5.3 2.35 \n", - "-120.11 4.77 \n", - "5.61 0.41 \n", - "-0.29 0.36 \n", - "-107.91 1.18 \n", - "-4.32 0.83 \n", - "-9.06 0.26 \n", - "-1.5 0.34 \n", - "-1.5 0.34 \n", - "-0.9 0.4 \n", - "-2.37 0.49 \n", - "-1.01 0.39 \n", - "8.74 1.8 \n", - "10000000.0 10000000.0 \n", - "-2.66 0.99 \n", - "-1.22 0.75 \n", - "-5.63 0.68 \n", - "2.3 0.32 \n", - "-4.47 0.57 \n", - "-13.29 1.54 \n", - "-4.23 0.8 \n", - "-112.18 3.85 \n", - "4.52 0.71 \n", - "0.44 0.71 \n", - "1.57 2.05 \n", - "-13.28 2.3 \n", - "-13.9 4.37 \n", - "-4.1 0.59 \n", - "-4.73 0.54 \n", - "-10.01 0.3 \n", - "-2.83 0.3 \n", - "4.34 0.33 \n", - "10000000.0 10000000.0 \n", - "-2.23 0.46 \n", - "10000000.0 10000000.0 \n", - "-18.54 4.46 \n", - "-3.11 4.62 \n", - "0.67 0.41 \n", - "1.03 0.43 \n", - "-2.65 0.55 \n", - "4.77 0.35 \n", - "-105.97 0.91 \n", - "-78.28 12.69 \n", - "-109.84 1.17 \n", - "10000000.0 10000000.0 \n", - "7.54 3.31 \n", - "-42.94 3.91 \n", - "-106.03 0.91 \n", - "-5.64 0.81 \n", - "-5.54 0.61 \n", - "-5.16 0.81 \n", - "3.9 0.44 \n", - "3.77 0.44 \n", - "3.77 0.45 \n", - "-23.98 1.19 \n", - "-13.95 1.6 \n", - "1.37 0.71 \n", - "4.89 0.24 \n", - "14.27 0.34 \n", - "0.08 0.43 \n", - "-4.68 0.75 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "-94.13 0.75 \n", - "4.15 0.54 \n", - "4.56 0.71 \n", - "-8.51 0.94 \n", - "0.07 0.93 \n", - "-0.28 0.37 \n", - "-0.28 0.38 \n", - "-3.38 0.51 \n", - "10000000.0 10000000.0 \n", - "-5.33 0.43 \n", - "-5.45 0.45 \n", - "0.7 0.48 \n", - "-5.16 0.47 \n", - "-130.52 1.26 \n", - "6.88 1.2 \n", - "-2.66 0.8 \n", - "0.98 0.39 \n", - "0.98 0.39 \n", - "10000000.0 10000000.0 \n", - "-2.95 0.65 \n", - "3.21 0.66 \n", - "0.68 0.57 \n", - "0.68 0.57 \n", - "-93.72 0.79 \n", - "-2.98 0.53 \n", - "10000000.0 10000000.0 \n", - "-40.7 3.32 \n", - "-2.86 0.34 \n", - "14.55 1.34 \n", - "0.8 1.26 \n", - "-45.32 1.28 \n", - "-5.76 1.84 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "-108.67 1.04 \n", - "-62.5 1.36 \n", - "-93.42 1.04 \n", - "-131.16 1.7 \n", - "-10.01 0.3 \n", - "-4.1 0.59 \n", - "-4.73 0.54 \n", - "3.96 0.41 \n", - "-4.41 0.41 \n", - "-22.97 1.17 \n", - "5.61 0.71 \n", - "3.96 0.41 \n", - "-22.57 1.11 \n", - "-10.46 5.17 \n", - "-4.36 5.1 \n", - "-91.95 2.55 \n", - "2.26 6.24 \n", - "2.26 6.23 \n", - "-33.61 6.67 \n", - "7.34 1.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.49 0.5 \n", - "9.48 0.71 \n", - "-2.86 0.45 \n", - "3.62 0.93 \n", - "-0.28 0.38 \n", - "-10.95 0.48 \n", - "-94.12 0.77 \n", - "5.31 1.55 \n", - "5.31 1.63 \n", - "-0.28 0.37 \n", - "-83.06 1.82 \n", - "4.35 0.35 \n", - "-5.09 0.81 \n", - "2.53 0.65 \n", - "-3.11 7.4 \n", - "58.79 0.73 \n", - "55.19 1.03 \n", - "-108.64 1.19 \n", - "-108.64 1.2 \n", - "-14.03 2.86 \n", - "-14.28 2.12 \n", - "-8.29 0.26 \n", - "-8.29 0.27 \n", - "-11.89 0.76 \n", - "6.91 0.28 \n", - "2.01 0.36 \n", - "0.01 5.37 \n", - "10000000.0 10000000.0 \n", - "0.48 1.07 \n", - "-6.74 4.71 \n", - "-7.78 2.26 \n", - "-0.71 0.71 \n", - "-4.92 0.91 \n", - "6.23 0.41 \n", - "4.44 0.24 \n", - "-0.28 0.38 \n", - "-6.17 0.81 \n", - "-3.35 0.3 \n", - "-105.95 0.91 \n", - "10000000.0 10000000.0 \n", - "-14.34 2.93 \n", - "2.42 0.41 \n", - "-14.44 1.08 \n", - "7.53 1.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.18 0.36 \n", - "-3.78 0.75 \n", - "12.24 0.62 \n", - "9.31 0.43 \n", - "12.85 1.33 \n", - "-11.67 0.39 \n", - "4.52 1.9 \n", - "4.52 1.9 \n", - "4.89 0.24 \n", - "-22.57 1.11 \n", - "-3.07 0.91 \n", - "6.47 0.46 \n", - "-2.24 0.46 \n", - "-14.03 5.98 \n", - "-14.03 5.98 \n", - "1.0 0.47 \n", - "-2.52 0.88 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "-1.55 9.81 \n", - "206.04 1.44 \n", - "-23.06 1.5 \n", - "5.6 0.74 \n", - "-8.66 0.26 \n", - "-62.51 1.36 \n", - "40.38 1.05 \n", - "-2.88 0.84 \n", - "0.09 1.0 \n", - "-81.78 0.97 \n", - "10.26 0.76 \n", - "0.01 5.36 \n", - "-5.26 0.57 \n", - "-59.93 1.53 \n", - "-29.45 3.3 \n", - "-20.64 5.15 \n", - "-12.1 0.51 \n", - "-2.66 0.8 \n", - "-73.9 4.41 \n", - "-2.93 0.75 \n", - "-30.44 1.25 \n", - "10000000.0 10000000.0 \n", - "-5.49 0.8 \n", - "-8.68 0.26 \n", - "4.89 0.24 \n", - "4.89 0.25 \n", - "-64.33 1.15 \n", - "4.44 0.24 \n", - "-0.28 0.38 \n", - "-8.68 0.26 \n", - "-8.68 0.27 \n", - "-105.96 0.91 \n", - "-2.66 0.35 \n", - "-1.87 0.46 \n", - "-5.08 0.75 \n", - "-92.1 2.09 \n", - "-2.52 0.49 \n", - "3.64 0.48 \n", - "6.77 0.53 \n", - "-94.39 9.36 \n", - "-1.7 8.11 \n", - "-5.59 0.56 \n", - "-2.85 0.54 \n", - "-65.98 0.52 \n", - "-4.73 0.54 \n", - "10000000.0 10000000.0 \n", - "-2.65 0.53 \n", - "-9.66 0.61 \n", - "424.78 1.34 \n", - "-7.29 0.76 \n", - "-95.07 0.74 \n", - "3.11 0.42 \n", - "-2.3 0.4 \n", - "0.04 0.74 \n", - "-1.83 0.3 \n", - "1.1 0.6 \n", - "-1.79 0.56 \n", - "1.8 0.9 \n", - "-0.4 0.71 \n", - "-2.41 0.57 \n", - "1.45 0.48 \n", - "-5.5 1.35 \n", - "2.91 6.75 \n", - "-4.17 1.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.32 0.59 \n", - "-2.13 0.18 \n", - "0.99 0.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.03 0.68 \n", - "7.04 0.58 \n", - "10000000.0 10000000.0 \n", - "-9.06 0.26 \n", - "4.31 0.75 \n", - "-6.41 1.09 \n", - "None 0.71 \n", - "-11.96 0.72 \n", - "1.72 0.59 \n", - "-4.11 0.46 \n", - "-51.89 4.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.49 0.35 \n", - "-25.6 4.67 \n", - "10000000.0 10000000.0 \n", - "-9.13 0.43 \n", - "10000000.0 10000000.0 \n", - "-2.78 1.11 \n", - "-6.07 0.85 \n", - "-8.67 0.27 \n", - "-19.41 2.26 \n", - "0.75 6.86 \n", - "10000000.0 10000000.0 \n", - "-101.03 1.21 \n", - "-5.82 0.35 \n", - "10000000.0 10000000.0 \n", - "-17.98 6.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.98 3.43 \n", - "10000000.0 10000000.0 \n", - "-6.81 7.13 \n", - "-2717.63 13.15 \n", - "59.6 3.61 \n", - "428.93 2.83 \n", - "10000000.0 10000000.0 \n", - "-3.04 0.42 \n", - "10000000.0 10000000.0 \n", - "-25.07 7.01 \n", - "-1.83 1.43 \n", - "10000000.0 10000000.0 \n", - "-1.7 14.66 \n", - "12.13 11.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-108.89 1.4 \n", - "-0.02 None \n", - "7.19 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "11.73 8.08 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.97 0.32 \n", - "0.7 0.36 \n", - "-22.21 5.67 \n", - "-2.35 0.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 10.21 \n", - "-3.51 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.02 2.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.52 1.9 \n", - "9.16 1.03 \n", - "10000000.0 10000000.0 \n", - "-13.76 1.93 \n", - "10000000.0 10000000.0 \n", - "-3.61 10.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-34.98 9.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.73 0.79 \n", - "-27.3 4.69 \n", - "43.0 4.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "62.96 3.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-108.62 1.19 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.98 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-35.26 2.54 \n", - "10000000.0 10000000.0 \n", - "17.21 0.98 \n", - "-0.22 0.59 \n", - "-58.68 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.62 13.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.13 2.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "32.33 7.76 \n", - "-15.02 0.79 \n", - "107.07 1.82 \n", - "-13.14 7.34 \n", - "10000000.0 10000000.0 \n", - "-17.46 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.23 8.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.18 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.24 0.82 \n", - "-5.72 1.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "45.64 0.86 \n", - "4.45 0.24 \n", - "300.49 0.69 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.0 0.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.06 0.53 \n", - "10000000.0 10000000.0 \n", - "-4.36 7.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.74 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.01 0.3 \n", - "-0.48 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.88 1.29 \n", - "2.83 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "-3.59 0.3 \n", - "10000000.0 10000000.0 \n", - "-3.04 0.42 \n", - "10000000.0 10000000.0 \n", - "89.95 5.4 \n", - "-6.66 0.55 \n", - "10000000.0 10000000.0 \n", - "-17.62 0.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "15.4 1.81 \n", - "10000000.0 10000000.0 \n", - "-62.0 1.72 \n", - "-1.86 0.42 \n", - "-2.78 1.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.52 0.41 \n", - "-5.86 0.43 \n", - "10000000.0 10000000.0 \n", - "-3.88 0.56 \n", - "-230.23 1.28 \n", - "0.93 0.38 \n", - "10000000.0 10000000.0 \n", - "340.91 0.65 \n", - "-51.6 3.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.01 \n", - "10000000.0 10000000.0 \n", - "3.24 0.82 \n", - "10000000.0 10000000.0 \n", - "4.7 0.66 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.66 0.55 \n", - "4.51 1.4 \n", - "9.59 6.0 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.29 1.0 \n", - "10000000.0 10000000.0 \n", - "-16.3 1.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.57 0.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.24 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.87 8.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.22 1.56 \n", - "10000000.0 10000000.0 \n", - "-0.35 0.34 \n", - "10000000.0 10000000.0 \n", - "1.89 0.97 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.38 0.51 \n", - "-4.36 6.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.04 0.55 \n", - "10000000.0 10000000.0 \n", - "-6.02 0.56 \n", - "6.48 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.04 0.55 \n", - "-97.09 8.26 \n", - "0.14 0.76 \n", - "-3.62 0.45 \n", - "10000000.0 10000000.0 \n", - "-5.44 1.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.19 0.32 \n", - "-4.36 5.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 2.32 \n", - "10000000.0 10000000.0 \n", - "-3.8 0.81 \n", - "-1.7 5.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-32.8 5.02 \n", - "10000000.0 10000000.0 \n", - "-0.9 0.51 \n", - "-0.9 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-74.42 4.42 \n", - "1.39 5.33 \n", - "-33.79 2.12 \n", - "10000000.0 10000000.0 \n", - "-108.59 12.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.5 10.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.41 0.47 \n", - "-4.49 0.54 \n", - "-4.36 6.51 \n", - "None 2.19 \n", - "-0.05 0.55 \n", - "-0.05 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.55 0.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.03 \n", - "-277.62 2.51 \n", - "-1.7 5.56 \n", - "509.23 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "-43.86 2.15 \n", - "-86.98 4.5 \n", - "None 3.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.1 0.52 \n", - "-47.15 9.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-75.26 13.55 \n", - "10000000.0 10000000.0 \n", - "-6.35 4.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.88 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.01 None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.47 0.78 \n", - "10000000.0 10000000.0 \n", - "-0.04 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.87 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.34 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "76.63 1.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.78 1.07 \n", - "-14.75 1.07 \n", - "10000000.0 10000000.0 \n", - "3.63 1.99 \n", - "10000000.0 10000000.0 \n", - "-2.4 0.47 \n", - "10000000.0 10000000.0 \n", - "-10.01 0.3 \n", - "10000000.0 10000000.0 \n", - "-91.65 5.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-113.69 2.22 \n", - "3.24 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 7.75 \n", - "-3.87 0.56 \n", - "4.24 5.03 \n", - "2.91 0.38 \n", - "12.09 3.73 \n", - "10000000.0 10000000.0 \n", - "-118.53 1.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.24 0.82 \n", - "10000000.0 10000000.0 \n", - "-1.95 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "44.54 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.77 6.14 \n", - "-1.31 0.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.12 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.3 0.3 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.51 \n", - "-4.36 5.94 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "14.3 41.52 \n", - "-3.31 0.8 \n", - "-2.25 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.14 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.13 0.75 \n", - "10000000.0 10000000.0 \n", - "-3.77 0.35 \n", - "10000000.0 10000000.0 \n", - "-16.69 7.47 \n", - "10000000.0 10000000.0 \n", - "10.13 10.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.81 4.9 \n", - "3.28 1.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-61.47 1.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-92.12 6.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-36.12 3.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 10.73 \n", - "-2.06 4.54 \n", - "3.69 0.46 \n", - "3.41 0.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "71.86 0.77 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "435.2 3.61 \n", - "3.79 3.58 \n", - "-3.82 1.87 \n", - "10000000.0 10000000.0 \n", - "1.09 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-44.41 6.24 \n", - "-3.04 0.42 \n", - "-95.07 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.53 1.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-25.92 12.94 \n", - "-6.07 1.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "-13.83 5.13 \n", - "-0.46 1.56 \n", - "-0.02 2.94 \n", - "0.08 0.43 \n", - "10000000.0 10000000.0 \n", - "7.06 7.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.18 0.41 \n", - "-81.72 6.51 \n", - "10000000.0 10000000.0 \n", - "-2.59 0.51 \n", - "386.87 6.53 \n", - "-111.09 1.52 \n", - "-0.01 None \n", - "10000000.0 10000000.0 \n", - "-388.95 2.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 1.61 \n", - "10000000.0 10000000.0 \n", - "-14.27 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-152.59 8.9 \n", - "7.06 7.13 \n", - "-12.1 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 5.69 \n", - "10000000.0 10000000.0 \n", - "-45.13 5.91 \n", - "-3.11 5.68 \n", - "-75.62 8.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.42 1.34 \n", - "-0.85 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.12 0.75 \n", - "10000000.0 10000000.0 \n", - "-6.17 0.81 \n", - "-14.03 11.08 \n", - "None None \n", - "-95.44 6.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 4.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.62 2.12 \n", - "10000000.0 10000000.0 \n", - "-94.13 0.75 \n", - "10000000.0 10000000.0 \n", - "12.57 4.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.18 0.36 \n", - "1.51 0.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2592.49 12.48 \n", - "10000000.0 10000000.0 \n", - "-7.49 1.31 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "-2.23 0.53 \n", - "3.49 2.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 7.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.05 6.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.98 6.41 \n", - "-4.36 5.26 \n", - "9.53 11.69 \n", - "-3.75 1.62 \n", - "3.41 8.75 \n", - "-9.11 1.38 \n", - "15.15 9.45 \n", - "-3.88 0.56 \n", - "-107.28 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.29 5.01 \n", - "-1.7 10.43 \n", - "10000000.0 10000000.0 \n", - "-3.56 0.32 \n", - "-17.46 1.06 \n", - "-0.04 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.72 0.41 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "6.0 1.72 \n", - "-26.96 1.29 \n", - "-105.96 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.11 0.69 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.94 1.83 \n", - "10000000.0 10000000.0 \n", - "-14.23 0.81 \n", - "-16.03 4.87 \n", - "-3.88 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.0 5.22 \n", - "10000000.0 10000000.0 \n", - "29.11 6.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "392.62 15.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.9 4.7 \n", - "4.81 1.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 3.59 \n", - "-3.31 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.87 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.1 0.51 \n", - "10000000.0 10000000.0 \n", - "17.49 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.04 0.42 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "13.17 2.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.13 4.36 \n", - "-1.7 4.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.2 1.07 \n", - "10000000.0 10000000.0 \n", - "-4.36 7.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "-1.11 2.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-28.36 5.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.25 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.05 0.55 \n", - "-17.98 5.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.54 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-96.9 8.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.85 0.65 \n", - "-82.85 1.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-136.56 7.46 \n", - "10000000.0 10000000.0 \n", - "-0.4 0.31 \n", - "-79.48 3.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.56 1.29 \n", - "-1.7 10.33 \n", - "10000000.0 10000000.0 \n", - "2.79 3.73 \n", - "10000000.0 10000000.0 \n", - "-0.27 6.14 \n", - "10000000.0 10000000.0 \n", - "3.76 6.75 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "-0.06 0.78 \n", - "10000000.0 10000000.0 \n", - "-0.02 3.18 \n", - "9.21 0.89 \n", - "10000000.0 10000000.0 \n", - "17.5 7.58 \n", - "4.47 0.24 \n", - "10000000.0 10000000.0 \n", - "-0.73 18.69 \n", - "3.0 0.49 \n", - "10000000.0 10000000.0 \n", - "-2.63 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.82 0.44 \n", - "10000000.0 10000000.0 \n", - "-0.52 0.77 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.38 \n", - "10000000.0 10000000.0 \n", - "0.16 0.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-91.39 13.61 \n", - "-2.58 0.3 \n", - "-3.04 0.42 \n", - "6.17 1.0 \n", - "10000000.0 10000000.0 \n", - "-10.94 4.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.5 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.83 0.39 \n", - "108.99 4.83 \n", - "10000000.0 10000000.0 \n", - "-21.34 5.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.72 2.08 \n", - "-2579.51 11.1 \n", - "-0.1 4.7 \n", - "-9.17 0.71 \n", - "-11.13 4.65 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-71.92 4.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 7.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "11.88 1.69 \n", - "10000000.0 10000000.0 \n", - "-105.08 0.81 \n", - "-4.36 6.01 \n", - "10000000.0 10000000.0 \n", - "None 6.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.09 0.46 \n", - "502.54 1.65 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "-17.06 5.77 \n", - "-61.18 1.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-117.67 4.24 \n", - "10000000.0 10000000.0 \n", - "124.71 0.38 \n", - "-12.51 1.03 \n", - "-2.2 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "18.27 7.19 \n", - "10000000.0 10000000.0 \n", - "-38.35 0.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.25 1.41 \n", - "-55.35 7.83 \n", - "10000000.0 10000000.0 \n", - "422.26 3.2 \n", - "9.21 6.69 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.4 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.94 4.77 \n", - "-45.31 3.93 \n", - "-14.27 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.45 1.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.73 7.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.68 0.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "14.26 3.22 \n", - "10000000.0 10000000.0 \n", - "None 3.45 \n", - "10000000.0 10000000.0 \n", - "9.21 6.67 \n", - "10000000.0 10000000.0 \n", - "0.13 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.52 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-62.68 1.27 \n", - "10000000.0 10000000.0 \n", - "-122.88 2.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.55 5.03 \n", - "-16.87 0.62 \n", - "10000000.0 10000000.0 \n", - "31.45 6.33 \n", - "None 4.41 \n", - "-20.64 6.86 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.09 1.32 \n", - "10000000.0 10000000.0 \n", - "0.38 0.54 \n", - "10000000.0 10000000.0 \n", - "0.38 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-33.2 12.91 \n", - "2.86 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 7.58 \n", - "19.48 6.85 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "-2.63 0.42 \n", - "None None \n", - "-94.39 6.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.26 0.3 \n", - "10000000.0 10000000.0 \n", - "None 1.54 \n", - "10000000.0 10000000.0 \n", - "-35.26 2.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-61.57 1.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 8.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.09 4.32 \n", - "10000000.0 10000000.0 \n", - "0.14 0.96 \n", - "10000000.0 10000000.0 \n", - "-4.32 0.3 \n", - "-4.32 0.3 \n", - "-4.32 0.3 \n", - "10000000.0 10000000.0 \n", - "2.54 0.77 \n", - "2.54 0.77 \n", - "10000000.0 10000000.0 \n", - "2.54 0.77 \n", - "2.54 0.77 \n", - "-0.95 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.62 1.19 \n", - "-17.46 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.79 0.35 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "3.85 0.33 \n", - "10000000.0 10000000.0 \n", - "1.07 1.04 \n", - "10000000.0 10000000.0 \n", - "0.07 0.13 \n", - "0.07 0.13 \n", - "-0.01 0.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.03 0.08 \n", - "5.03 0.08 \n", - "-60.57 0.79 \n", - "-60.57 0.79 \n", - "-8.68 0.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-24.76 1.8 \n", - "-24.76 1.8 \n", - "-7.54 3.31 \n", - "10000000.0 10000000.0 \n", - "-7.24 0.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-3.45 0.69 \n", - "-1.34 0.85 \n", - "0.07 0.38 \n", - "0.51 0.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.89 0.92 \n", - "-1.42 0.64 \n", - "10000000.0 10000000.0 \n", - "57.71 0.34 \n", - "10000000.0 10000000.0 \n", - "-3.99 0.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.48 0.57 \n", - "-6.08 1.02 \n", - "10000000.0 10000000.0 \n", - "-14.11 1.64 \n", - "-14.11 1.64 \n", - "-14.11 1.64 \n", - "-14.11 1.64 \n", - "-14.11 1.64 \n", - "2.01 0.36 \n", - "1.08 0.23 \n", - "0.45 0.38 \n", - "10000000.0 10000000.0 \n", - "-29.08 1.5 \n", - "-28.93 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.59 0.95 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.34 10.93 \n", - "-0.28 0.38 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "-5.41 0.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.8 0.55 \n", - "10000000.0 10000000.0 \n", - "-18.13 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.24 5.56 \n", - "-1.7 5.69 \n", - "-18.13 0.71 \n", - "-16.92 0.92 \n", - "-16.92 0.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.25 0.1 \n", - "-13.88 0.97 \n", - "-2.41 0.57 \n", - "-0.01 0.43 \n", - "0.03 0.34 \n", - "0.5 0.13 \n", - "-0.21 0.17 \n", - "10000000.0 10000000.0 \n", - "0.56 0.71 \n", - "6.51 0.55 \n", - "6.51 0.55 \n", - "-2.69 0.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.48 0.6 \n", - "5.61 0.71 \n", - "5.61 0.71 \n", - "-23.14 5.89 \n", - "-23.14 5.89 \n", - "-17.84 0.67 \n", - "-1.98 0.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.46 0.54 \n", - "-2.46 0.54 \n", - "10000000.0 10000000.0 \n", - "-4.01 0.11 \n", - "-4.42 0.32 \n", - "-4.2 0.34 \n", - "-4.42 0.32 \n", - "1.82 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.11 1.09 \n", - "-8.11 1.09 \n", - "-8.11 1.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.57 3.6 \n", - "-3.46 0.05 \n", - "-3.46 0.05 \n", - "1.95 0.63 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 3.56 \n", - "-103.9 3.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.02 0.8 \n", - "10000000.0 10000000.0 \n", - "-14.37 1.78 \n", - "-16.14 1.75 \n", - "336.9 1.05 \n", - "10000000.0 10000000.0 \n", - "-31.87 1.48 \n", - "10000000.0 10000000.0 \n", - "-31.87 1.48 \n", - "10000000.0 10000000.0 \n", - "-8.79 0.73 \n", - "34.51 1.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.9 0.35 \n", - "-7.18 0.58 \n", - "-6.77 0.58 \n", - "-6.45 0.31 \n", - "-6.75 0.63 \n", - "-5.48 0.31 \n", - "10000000.0 10000000.0 \n", - "-5.89 0.56 \n", - "-6.9 0.35 \n", - "-7.18 0.58 \n", - "-6.77 0.58 \n", - "-6.45 0.31 \n", - "-6.75 0.63 \n", - "-5.48 0.31 \n", - "10000000.0 10000000.0 \n", - "-5.89 0.56 \n", - "-6.9 0.35 \n", - "-7.18 0.58 \n", - "-6.77 0.58 \n", - "-6.45 0.31 \n", - "-6.75 0.63 \n", - "-5.48 0.31 \n", - "10000000.0 10000000.0 \n", - "-5.89 0.56 \n", - "-6.9 0.35 \n", - "-7.18 0.58 \n", - "-6.77 0.58 \n", - "-6.45 0.31 \n", - "-6.75 0.63 \n", - "-5.48 0.31 \n", - "10000000.0 10000000.0 \n", - "-5.89 0.56 \n", - "-6.9 0.35 \n", - "-7.18 0.58 \n", - "-6.77 0.58 \n", - "-6.45 0.31 \n", - "-6.75 0.63 \n", - "-5.48 0.31 \n", - "10000000.0 10000000.0 \n", - "-5.89 0.56 \n", - "-6.9 0.35 \n", - "-7.18 0.58 \n", - "-6.77 0.58 \n", - "-6.45 0.31 \n", - "-5.56 0.33 \n", - "-6.75 0.63 \n", - "-5.48 0.31 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-5.89 0.56 \n", - "-6.9 0.35 \n", - "-7.18 0.58 \n", - "-6.77 0.58 \n", - "-6.45 0.31 \n", - "-5.56 0.33 \n", - "-6.75 0.63 \n", - "-5.48 0.31 \n", - "10000000.0 10000000.0 \n", - "-3.17 0.32 \n", - "-6.26 2.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.06 0.39 \n", - "3.51 1.0 \n", - "10000000.0 10000000.0 \n", - "4.42 0.11 \n", - "4.42 0.11 \n", - "0.34 0.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.49 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "84.83 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.19 0.49 \n", - "13.69 0.86 \n", - "6.33 0.5 \n", - "-7.54 0.79 \n", - "-2.84 0.54 \n", - "-2.84 0.54 \n", - "-1.38 0.78 \n", - "-1.38 0.78 \n", - "-0.28 0.37 \n", - "-0.28 0.37 \n", - "-0.28 0.37 \n", - "1.04 0.4 \n", - "-3.12 0.38 \n", - "-6.24 0.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.16 5.63 \n", - "-7.06 7.4 \n", - "-7.06 7.35 \n", - "-7.06 7.31 \n", - "-15.16 5.55 \n", - "-15.16 5.5 \n", - "-1.14 0.86 \n", - "-1.14 0.86 \n", - "-1.14 0.86 \n", - "-1.14 0.86 \n", - "-4.89 0.24 \n", - "-4.89 0.24 \n", - "-4.89 0.24 \n", - "-4.89 0.24 \n", - "-117.42 1.16 \n", - "-117.42 1.16 \n", - "-4.89 0.24 \n", - "-4.89 0.24 \n", - "-4.89 0.24 \n", - "-4.89 0.24 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-95.07 0.74 \n", - "-95.07 0.74 \n", - "-6.46 0.32 \n", - "0.34 0.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-36.25 1.41 \n", - "0.11 0.57 \n", - "0.5 1.05 \n", - "-3.52 0.33 \n", - "-2.81 0.3 \n", - "-95.07 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.63 1.66 \n", - "1.63 1.66 \n", - "-2.14 1.9 \n", - "10000000.0 10000000.0 \n", - "1.81 5.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.65 0.46 \n", - "-0.96 1.47 \n", - "-125.69 0.47 \n", - "-3.65 1.11 \n", - "-4.36 1.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.04 0.55 \n", - "10000000.0 10000000.0 \n", - "0.68 6.96 \n", - "0.68 8.27 \n", - "1.63 1.66 \n", - "1.63 1.66 \n", - "-5.97 0.42 \n", - "-6.02 0.56 \n", - "-5.97 0.42 \n", - "-6.02 0.56 \n", - "-1.6 0.39 \n", - "10000000.0 10000000.0 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "-1.7 14.27 \n", - "10000000.0 10000000.0 \n", - "-3.02 0.72 \n", - "-3.02 0.72 \n", - "-97.2 0.8 \n", - "0.45 0.38 \n", - "4.14 0.29 \n", - "4.14 0.29 \n", - "4.14 0.29 \n", - "-0.37 0.39 \n", - "10000000.0 10000000.0 \n", - "-118.19 0.76 \n", - "-118.19 0.76 \n", - "10000000.0 10000000.0 \n", - "-10.46 4.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.54 0.35 \n", - "-15.54 0.35 \n", - "-15.54 0.35 \n", - "-15.54 0.35 \n", - "-18.42 0.78 \n", - "-17.35 5.42 \n", - "-17.35 5.42 \n", - "-3.63 0.41 \n", - "-4.89 0.24 \n", - "-4.89 0.24 \n", - "-4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.89 0.24 \n", - "-4.89 0.24 \n", - "-4.89 0.24 \n", - "-4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "-4.89 0.24 \n", - "-4.89 0.24 \n", - "-4.89 0.24 \n", - "-4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.45 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.59 4.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-104.91 12.08 \n", - "-104.91 12.09 \n", - "10000000.0 10000000.0 \n", - "-104.91 17.25 \n", - "-104.91 17.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.87 5.49 \n", - "-0.87 5.49 \n", - "-0.87 5.63 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.91 0.28 \n", - "-50.97 4.75 \n", - "-50.97 4.75 \n", - "-50.97 4.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.34 0.84 \n", - "-18.75 0.66 \n", - "2218.72 43.34 \n", - "1483.01 15.21 \n", - "1475.79 15.2 \n", - "40.54 0.47 \n", - "0.42 0.27 \n", - "0.42 0.27 \n", - "0.42 0.27 \n", - "0.42 0.27 \n", - "-18.75 0.66 \n", - "-18.75 0.66 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.82 2.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.35 0.81 \n", - "10000000.0 10000000.0 \n", - "-0.89 0.92 \n", - "10000000.0 10000000.0 \n", - "-64.39 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.18 \n", - "None 4.27 \n", - "None 2.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-45.76 3.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.61 7.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 5.54 \n", - "-1.7 5.54 \n", - "-1.7 5.69 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.35 0.3 \n", - "-3.35 0.3 \n", - "-3.35 0.3 \n", - "-3.35 0.3 \n", - "-3.35 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.88 0.24 \n", - "-4.88 0.24 \n", - "-4.88 0.24 \n", - "0.02 0.52 \n", - "-2.1 0.3 \n", - "10000000.0 10000000.0 \n", - "-72.76 0.79 \n", - "-1.63 1.66 \n", - "-1.63 1.66 \n", - "10000000.0 10000000.0 \n", - "-21.65 7.54 \n", - "-21.65 7.55 \n", - "-99.41 1.12 \n", - "1.63 0.71 \n", - "1.63 0.71 \n", - "4.52 1.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.8 5.42 \n", - "-3.8 5.42 \n", - "-4.04 0.7 \n", - "294.32 1.02 \n", - "-3.45 0.48 \n", - "-1.76 0.52 \n", - "-27.09 1.03 \n", - "-2.95 0.65 \n", - "336.89 0.77 \n", - "-3.14 0.71 \n", - "None 4.07 \n", - "-149.31 1.14 \n", - "10000000.0 10000000.0 \n", - "-209.79 0.62 \n", - "-2.84 0.54 \n", - "-2.84 0.54 \n", - "211.92 6.08 \n", - "-1.14 0.86 \n", - "-1.14 0.86 \n", - "-0.64 1.05 \n", - "10000000.0 10000000.0 \n", - "-5.63 0.68 \n", - "-5.63 0.68 \n", - "-5.63 0.68 \n", - "-2.1 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.0 1.55 \n", - "10000000.0 10000000.0 \n", - "-17.0 1.55 \n", - "10000000.0 10000000.0 \n", - "-12.52 0.98 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 3.63 \n", - "None 2.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 1.99 \n", - "None 1.36 \n", - "10000000.0 10000000.0 \n", - "None 2.18 \n", - "None 1.92 \n", - "None 2.31 \n", - "None 2.18 \n", - "10000000.0 10000000.0 \n", - "None 1.4 \n", - "None 1.94 \n", - "None 0.91 \n", - "None 2.18 \n", - "None 2.18 \n", - "None 0.49 \n", - "None 0.62 \n", - "None 0.31 \n", - "None 1.13 \n", - "None 2.18 \n", - "None 1.4 \n", - "None 2.31 \n", - "None 1.4 \n", - "None 1.94 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 3.89 \n", - "None 3.93 \n", - "None 5.37 \n", - "None 4.16 \n", - "10000000.0 10000000.0 \n", - "None 2.91 \n", - "None 2.96 \n", - "None 5.37 \n", - "None 5.54 \n", - "None 7.68 \n", - "None 7.65 \n", - "None 4.16 \n", - "None 5.35 \n", - "None 6.9 \n", - "None 4.41 \n", - "None 4.26 \n", - "None 6.36 \n", - "None 4.17 \n", - "None 4.04 \n", - "None 4.14 \n", - "None 5.06 \n", - "None 5.23 \n", - "None 5.23 \n", - "None 5.54 \n", - "None 4.2 \n", - "None 4.37 \n", - "None 4.37 \n", - "None 4.58 \n", - "None 4.89 \n", - "None 4.5 \n", - "None 1.8 \n", - "None 2.43 \n", - "None 1.8 \n", - "None 0.79 \n", - "None 0.79 \n", - "None 0.96 \n", - "None 3.13 \n", - "None 3.13 \n", - "None 3.13 \n", - "None 3.92 \n", - "None 3.63 \n", - "None 4.47 \n", - "None 4.27 \n", - "None 4.47 \n", - "10000000.0 10000000.0 \n", - "None 1.2 \n", - "10000000.0 10000000.0 \n", - "None 6.91 \n", - "None 6.91 \n", - "None 4.06 \n", - "None 3.63 \n", - "10000000.0 10000000.0 \n", - "13.11 0.65 \n", - "14.27 0.34 \n", - "10000000.0 10000000.0 \n", - "13.11 0.65 \n", - "14.27 0.34 \n", - "-1.67 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.6 1.21 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.26 0.41 \n", - "0.04 0.39 \n", - "0.04 0.39 \n", - "None 4.41 \n", - "0.04 0.39 \n", - "None 4.41 \n", - "-4.11 1.01 \n", - "-4.11 1.01 \n", - "-3.5 1.06 \n", - "-3.5 1.06 \n", - "10000000.0 10000000.0 \n", - "3.48 0.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.64 0.3 \n", - "1.94 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-134.27 6.56 \n", - "-134.27 6.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.49 1.31 \n", - "-16.69 4.11 \n", - "-21.3 4.74 \n", - "-37.91 4.11 \n", - "-1.09 0.99 \n", - "-3.4 0.87 \n", - "10000000.0 10000000.0 \n", - "43.21 0.79 \n", - "2.89 0.73 \n", - "2.14 0.53 \n", - "-6.69 0.5 \n", - "23.94 1.15 \n", - "32.5 1.08 \n", - "31.76 0.96 \n", - "22.93 0.95 \n", - "-3.42 4.82 \n", - "-24.64 4.82 \n", - "2.46 1.44 \n", - "-29.08 1.5 \n", - "-29.08 1.5 \n", - "2.46 1.44 \n", - "2.46 1.44 \n", - "10000000.0 10000000.0 \n", - "-6.35 6.71 \n", - "-33.3 1.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.67 0.36 \n", - "-5.36 0.33 \n", - "-5.36 0.33 \n", - "-4.91 0.32 \n", - "-4.42 0.32 \n", - "-5.36 0.33 \n", - "7.46 0.13 \n", - "-22.94 1.03 \n", - "-25.52 1.12 \n", - "-20.98 1.09 \n", - "-22.94 1.03 \n", - "-22.92 1.14 \n", - "6.09 1.41 \n", - "-25.44 1.48 \n", - "-25.44 1.48 \n", - "-25.44 1.48 \n", - "6.09 1.41 \n", - "6.09 1.41 \n", - "10000000.0 10000000.0 \n", - "-31.87 1.48 \n", - "-31.87 1.48 \n", - "-31.87 1.48 \n", - "10000000.0 10000000.0 \n", - "3.8 4.12 \n", - "-17.42 4.12 \n", - "-18.13 0.71 \n", - "1.15 1.1 \n", - "-3.4 1.14 \n", - "-1.43 1.09 \n", - "-1.46 1.2 \n", - "4.72 1.45 \n", - "4.72 1.45 \n", - "0.59 0.87 \n", - "-7.0 0.72 \n", - "-7.99 0.96 \n", - "-7.0 0.72 \n", - "-7.99 0.96 \n", - "-5.03 0.54 \n", - "-6.02 0.56 \n", - "-7.0 0.72 \n", - "-6.02 0.56 \n", - "-7.0 0.72 \n", - "-3.05 0.9 \n", - "-4.04 0.68 \n", - "-5.03 0.54 \n", - "-4.04 0.68 \n", - "-5.03 0.54 \n", - "-1.08 1.44 \n", - "-2.06 1.16 \n", - "-3.05 0.9 \n", - "-2.06 1.16 \n", - "-3.05 0.9 \n", - "-5.03 0.54 \n", - "-7.0 0.72 \n", - "-6.02 0.56 \n", - "-7.0 0.72 \n", - "-4.04 0.68 \n", - "-5.03 0.54 \n", - "-5.03 0.54 \n", - "-6.02 0.56 \n", - "-4.04 0.68 \n", - "-5.03 0.54 \n", - "-6.02 0.56 \n", - "-5.03 0.54 \n", - "-6.02 0.56 \n", - "-3.05 0.9 \n", - "-4.04 0.68 \n", - "-5.03 0.54 \n", - "-4.04 0.68 \n", - "-5.03 0.54 \n", - "-4.04 0.68 \n", - "-5.03 0.54 \n", - "-6.02 0.56 \n", - "-5.03 0.54 \n", - "-6.02 0.56 \n", - "-2.06 1.16 \n", - "-3.05 0.9 \n", - "-4.04 0.68 \n", - "-3.05 0.9 \n", - "-4.04 0.68 \n", - "-3.05 0.9 \n", - "-4.04 0.68 \n", - "-5.03 0.54 \n", - "-4.04 0.68 \n", - "-5.03 0.54 \n", - "-2.06 1.16 \n", - "-3.05 0.9 \n", - "-4.04 0.68 \n", - "-3.05 0.9 \n", - "-4.04 0.68 \n", - "-7.33 1.11 \n", - "-7.33 1.11 \n", - "0.1 0.42 \n", - "0.1 0.41 \n", - "20.14 4.42 \n", - "-1.08 4.42 \n", - "-1.9 0.73 \n", - "0.35 0.91 \n", - "-1.63 0.41 \n", - "-1.9 0.73 \n", - "0.35 0.91 \n", - "-1.63 0.41 \n", - "-0.24 0.54 \n", - "-16.62 1.47 \n", - "-16.62 1.47 \n", - "-16.62 1.47 \n", - "-16.62 1.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-25.73 1.49 \n", - "-25.73 1.49 \n", - "-25.73 1.49 \n", - "-17.0 1.55 \n", - "-17.0 1.55 \n", - "-17.0 1.55 \n", - "-17.0 1.55 \n", - "-17.0 1.55 \n", - "-7.08 0.97 \n", - "-7.04 0.85 \n", - "26.07 0.24 \n", - "26.07 0.24 \n", - "2.37 0.55 \n", - "-18.94 1.93 \n", - "-18.94 1.93 \n", - "6.48 0.85 \n", - "0.13 0.25 \n", - "-34.3 0.27 \n", - "0.13 0.25 \n", - "-34.69 0.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.82 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 9.5 \n", - "-1.7 9.5 \n", - "-1.7 10.08 \n", - "-1.7 10.08 \n", - "10000000.0 10000000.0 \n", - "-11.13 4.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.05 0.43 \n", - "10000000.0 10000000.0 \n", - "-5.36 0.66 \n", - "-9.79 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-40.68 3.32 \n", - "9.52 13.16 \n", - "11.68 17.9 \n", - "-5.97 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.55 6.89 \n", - "-15.16 5.63 \n", - "-15.16 5.63 \n", - "2.16 5.6 \n", - "3.76 8.25 \n", - "-7.06 7.4 \n", - "-7.06 7.35 \n", - "-7.06 7.31 \n", - "3.76 8.2 \n", - "3.76 8.16 \n", - "2.16 5.53 \n", - "2.16 5.48 \n", - "-15.16 5.55 \n", - "-15.16 5.55 \n", - "-15.16 5.5 \n", - "-15.16 5.5 \n", - "-5.75 5.23 \n", - "-13.03 0.34 \n", - "-4.89 0.25 \n", - "-1.14 0.86 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.87 0.46 \n", - "-35.58 0.99 \n", - "-15.41 29.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "53.83 1.9 \n", - "-19.41 2.96 \n", - "-3.83 0.75 \n", - "5.68 2.19 \n", - "-10.81 34.85 \n", - "-10.18 39.82 \n", - "-10.18 39.82 \n", - "10000000.0 10000000.0 \n", - "-4.89 0.24 \n", - "-4.89 0.25 \n", - "-88.54 0.82 \n", - "10000000.0 10000000.0 \n", - "-20.79 1.5 \n", - "131.39 3.7 \n", - "10000000.0 10000000.0 \n", - "131.39 3.7 \n", - "-111.4 0.49 \n", - "1.42 0.62 \n", - "-2.84 0.54 \n", - "-2.31 0.63 \n", - "-2.46 0.54 \n", - "10000000.0 10000000.0 \n", - "-1.14 0.86 \n", - "-5.33 5.03 \n", - "6.54 0.98 \n", - "10000000.0 10000000.0 \n", - "-3.41 0.78 \n", - "-2.28 0.75 \n", - "-14.03 4.93 \n", - "-22.58 1.11 \n", - "-6.24 2.68 \n", - "-8.68 0.26 \n", - "-4.89 0.24 \n", - "-14.03 4.93 \n", - "6.66 0.98 \n", - "-1.7 4.51 \n", - "10000000.0 10000000.0 \n", - "-0.66 0.87 \n", - "-1.46 5.66 \n", - "-13.12 0.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.51 27.65 \n", - "24.42 5.13 \n", - "-53.0 1.46 \n", - "10000000.0 10000000.0 \n", - "-8.35 0.71 \n", - "10000000.0 10000000.0 \n", - "-3.51 1.0 \n", - "10000000.0 10000000.0 \n", - "0.05 0.47 \n", - "10000000.0 10000000.0 \n", - "-98.66 0.79 \n", - "0.26 0.67 \n", - "-0.87 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.58 0.42 \n", - "2.58 0.42 \n", - "16.97 6.02 \n", - "47.56 2.9 \n", - "29.69 1.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.83 1.42 \n", - "None None \n", - "1.51 0.68 \n", - "-148.49 5.98 \n", - "-9.85 0.48 \n", - "121.23 6.74 \n", - "10000000.0 10000000.0 \n", - "-14.03 11.08 \n", - "-1.87 0.46 \n", - "-4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "-14.03 11.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "28.01 0.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 11.07 \n", - "10000000.0 10000000.0 \n", - "-19.42 7.45 \n", - "-61.57 1.37 \n", - "-3.31 0.8 \n", - "-26.84 4.59 \n", - "-8.23 0.58 \n", - "-8.12 0.58 \n", - "-8.06 0.58 \n", - "-18.56 8.83 \n", - "-1.92 0.86 \n", - "-90.32 1.25 \n", - "-10.69 0.39 \n", - "4.37 0.24 \n", - "4.37 0.24 \n", - "4.37 0.24 \n", - "4.37 0.24 \n", - "-8.79 3.56 \n", - "-8.79 3.56 \n", - "-8.79 3.56 \n", - "-5.8 4.17 \n", - "-4.36 5.1 \n", - "-22.57 1.11 \n", - "-20.0 1.66 \n", - "-4.36 5.26 \n", - "-22.57 1.11 \n", - "-8.68 0.26 \n", - "-20.0 1.66 \n", - "4.89 0.24 \n", - "-44.72 2.78 \n", - "16.97 5.93 \n", - "-255.03 4.97 \n", - "-3.89 0.54 \n", - "-2.95 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.78 0.54 \n", - "-82.8 0.82 \n", - "-14.03 6.86 \n", - "-14.03 6.86 \n", - "-4.73 0.33 \n", - "-4.73 0.33 \n", - "-4.69 0.75 \n", - "-7.47 2.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.22 0.33 \n", - "2.22 0.33 \n", - "2.22 0.33 \n", - "2.22 0.33 \n", - "2.22 0.33 \n", - "2.22 0.33 \n", - "2.22 0.33 \n", - "0.67 0.33 \n", - "0.67 0.33 \n", - "-0.88 0.33 \n", - "-0.88 0.33 \n", - "10000000.0 10000000.0 \n", - "-3.73 0.33 \n", - "10000000.0 10000000.0 \n", - "-5.17 0.34 \n", - "-5.17 0.34 \n", - "-5.17 0.34 \n", - "0.67 0.33 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.43 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.1 0.31 \n", - "-4.67 1.31 \n", - "10000000.0 10000000.0 \n", - "0.94 0.31 \n", - "-1.49 1.31 \n", - "-1.49 1.31 \n", - "-1.49 1.31 \n", - "-1.49 1.31 \n", - "-4.67 1.31 \n", - "-4.67 1.31 \n", - "-7.1 0.31 \n", - "-7.1 0.31 \n", - "-1.49 1.31 \n", - "-2.44 6.37 \n", - "10000000.0 10000000.0 \n", - "-2.18 0.33 \n", - "-3.73 0.33 \n", - "-5.28 0.33 \n", - "5.81 0.35 \n", - "-8.38 0.9 \n", - "41.59 3.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-75.83 1.17 \n", - "-6.51 1.43 \n", - "-10.16 0.83 \n", - "68.99 11.69 \n", - "-6.65 1.32 \n", - "-11.81 24.93 \n", - "-7.89 0.82 \n", - "-10.48 0.83 \n", - "-92.58 7.03 \n", - "-92.58 7.03 \n", - "-55.8 3.26 \n", - "-64.01 0.28 \n", - "-75.83 1.11 \n", - "-6.51 1.43 \n", - "-9.32 0.43 \n", - "35.6 7.0 \n", - "-95.08 0.74 \n", - "-9.24 0.43 \n", - "31.41 6.89 \n", - "38.56 7.31 \n", - "-9.35 0.43 \n", - "-5.51 0.33 \n", - "-18.13 0.71 \n", - "-18.13 0.71 \n", - "-18.13 0.71 \n", - "-18.13 0.71 \n", - "10000000.0 10000000.0 \n", - "-6.42 0.31 \n", - "None 10.33 \n", - "-1.7 11.09 \n", - "-105.97 0.91 \n", - "-105.97 0.91 \n", - "-6.19 33.84 \n", - "-6.19 33.84 \n", - "4.44 0.24 \n", - "4.04 0.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.41 0.92 \n", - "-21.41 0.92 \n", - "-21.41 0.92 \n", - "-21.41 0.92 \n", - "-21.41 0.92 \n", - "-21.41 0.92 \n", - "-21.41 0.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-95.07 0.74 \n", - "-10.22 0.27 \n", - "4.68 6.03 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 5.09 \n", - "-14.03 5.01 \n", - "-1.7 4.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-251.97 53.0 \n", - "-251.97 53.0 \n", - "-2.21 0.44 \n", - "-22.57 1.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 8.73 \n", - "-61.87 1.57 \n", - "-1.7 9.67 \n", - "-7.44 1.34 \n", - "-1.7 10.84 \n", - "118.67 0.76 \n", - "1.07 7.44 \n", - "1.07 7.44 \n", - "-2.59 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-328.58 387.2 \n", - "-120.45 3.3 \n", - "-42.94 4.93 \n", - "-47.84 3.11 \n", - "13.42 3.76 \n", - "-4.5 0.42 \n", - "-25.5 62.86 \n", - "2818.03 123.38 \n", - "2818.03 123.38 \n", - "1573.52 137.75 \n", - "1158.55 257.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-95.07 0.74 \n", - "-0.9 0.57 \n", - "10000000.0 10000000.0 \n", - "-75.63 17.92 \n", - "5.63 0.42 \n", - "10000000.0 10000000.0 \n", - "-11.13 4.53 \n", - "-21.83 8.48 \n", - "-11.13 4.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.26 0.75 \n", - "-75.83 1.09 \n", - "10000000.0 10000000.0 \n", - "-6.68 1.32 \n", - "-2.63 0.42 \n", - "-0.49 0.41 \n", - "-2.63 0.42 \n", - "-0.49 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.73 1.04 \n", - "-19.84 0.86 \n", - "-2.63 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "227.14 1.18 \n", - "10000000.0 10000000.0 \n", - "-4.64 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.16 7.18 \n", - "8.13 5.3 \n", - "-0.44 5.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.05 1.83 \n", - "-16.62 2.12 \n", - "-58.77 2.72 \n", - "-159.44 5.1 \n", - "9.59 5.93 \n", - "9.59 5.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-40.15 11.35 \n", - "-39.64 10.27 \n", - "-37.17 10.27 \n", - "10000000.0 10000000.0 \n", - "-21.24 1.38 \n", - "-47.99 7.64 \n", - "-47.99 7.6 \n", - "-105.97 0.91 \n", - "-1.3 0.69 \n", - "-62.11 1.36 \n", - "-61.19 1.37 \n", - "-6.35 4.69 \n", - "42.32 0.18 \n", - "-0.41 1.91 \n", - "3.3 1.88 \n", - "40.39 0.79 \n", - "-0.81 0.22 \n", - "-10.01 2.04 \n", - "83.69 0.77 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-49.3 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-25.89 0.84 \n", - "-0.18 0.36 \n", - "3.48 0.24 \n", - "-6.46 0.32 \n", - "10000000.0 10000000.0 \n", - "49.05 1.16 \n", - "-1.71 1.66 \n", - "10000000.0 10000000.0 \n", - "-49.25 0.53 \n", - "10000000.0 10000000.0 \n", - "-43.25 0.35 \n", - "1.7 0.82 \n", - "35.49 0.84 \n", - "-21.59 2.14 \n", - "-22.07 2.14 \n", - "10000000.0 10000000.0 \n", - "-13.08 15.77 \n", - "10000000.0 10000000.0 \n", - "-4.36 8.67 \n", - "21.79 0.51 \n", - "-2.23 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.65 0.97 \n", - "-1.38 0.33 \n", - "-3.58 0.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-188.03 1.84 \n", - "-203.29 1.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.11 0.31 \n", - "-50.05 1.65 \n", - "-33.35 2.77 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-43.91 1.77 \n", - "-36.19 1.56 \n", - "10000000.0 10000000.0 \n", - "-1.7 28.8 \n", - "-94.11 1.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 20.71 \n", - "-1639.1 29.34 \n", - "-1639.1 29.34 \n", - "10.12 1.05 \n", - "2.58 0.53 \n", - "-4.05 0.3 \n", - "10000000.0 10000000.0 \n", - "202.31 2.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.34 0.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-71.08 1.28 \n", - "-94.13 0.75 \n", - "15.39 0.24 \n", - "-11.23 11.46 \n", - "-4.51 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.12 0.75 \n", - "10000000.0 10000000.0 \n", - "-4.82 0.56 \n", - "3.62 0.54 \n", - "-95.07 0.74 \n", - "10000000.0 10000000.0 \n", - "-7.72 0.41 \n", - "3.61 0.54 \n", - "-7.72 0.41 \n", - "3.62 0.54 \n", - "-4.07 0.85 \n", - "0.34 0.84 \n", - "-1.7 22.51 \n", - "-237.67 39.0 \n", - "-237.67 39.0 \n", - "-1.7 23.81 \n", - "-237.67 41.94 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "23.74 2.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.24 0.54 \n", - "-16.13 1.32 \n", - "10000000.0 10000000.0 \n", - "-18.75 0.66 \n", - "-18.75 0.66 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.1 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.01 0.3 \n", - "2.95 0.3 \n", - "-4.03 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.46 5.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-112.84 0.76 \n", - "10000000.0 10000000.0 \n", - "-10.38 1.41 \n", - "-10.38 1.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "None None \n", - "-70.75 3.19 \n", - "-70.75 3.15 \n", - "-9.06 0.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-37.49 0.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-104.73 0.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.87 0.57 \n", - "-0.87 0.57 \n", - "-0.87 0.57 \n", - "-0.87 0.57 \n", - "-0.87 0.57 \n", - "-0.87 0.57 \n", - "-0.87 0.57 \n", - "-0.46 5.41 \n", - "9.59 5.62 \n", - "9.59 5.93 \n", - "9.59 5.72 \n", - "9.59 5.73 \n", - "-107.2 0.94 \n", - "9.59 5.75 \n", - "9.59 5.76 \n", - "9.59 5.78 \n", - "9.59 5.81 \n", - "10000000.0 10000000.0 \n", - "-3.61 7.59 \n", - "-9.68 1.99 \n", - "-3.61 7.29 \n", - "-3.61 7.29 \n", - "-3.61 7.61 \n", - "-3.61 7.62 \n", - "10000000.0 10000000.0 \n", - "-54.38 2.12 \n", - "-11.22 0.43 \n", - "-1.77 0.49 \n", - "-10.92 0.33 \n", - "-87.68 0.79 \n", - "12.31 0.75 \n", - "-13.19 0.99 \n", - "-25.91 0.79 \n", - "-25.75 2.94 \n", - "-5.73 0.54 \n", - "0.28 0.38 \n", - "-0.28 0.37 \n", - "0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-90.63 3.53 \n", - "-90.63 3.53 \n", - "-163.13 6.35 \n", - "-126.88 4.94 \n", - "0.06 0.78 \n", - "1.88 0.76 \n", - "2.2 0.79 \n", - "-94.12 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.52 0.33 \n", - "1.05 0.37 \n", - "-109.85 1.64 \n", - "-117.67 1.29 \n", - "10000000.0 10000000.0 \n", - "6.74 0.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-28.17 1.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-95.07 0.74 \n", - "-95.07 0.74 \n", - "-95.07 0.74 \n", - "-112.74 0.85 \n", - "-82.22 0.88 \n", - "-83.06 1.82 \n", - "-83.06 1.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-114.38 1.15 \n", - "-49.24 0.53 \n", - "10000000.0 10000000.0 \n", - "-9.43 1.0 \n", - "10000000.0 10000000.0 \n", - "-0.63 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.33 5.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.5 0.8 \n", - "-4.23 0.75 \n", - "-5.21 0.94 \n", - "-8.82 0.43 \n", - "-4.14 1.48 \n", - "-4.13 1.48 \n", - "-22.21 5.21 \n", - "-22.21 5.21 \n", - "-478.4 2.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-22.58 1.11 \n", - "-4.36 5.09 \n", - "-14.03 4.66 \n", - "-3.79 0.91 \n", - "-1.77 0.44 \n", - "-2.79 1.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.38 1.18 \n", - "-5.5 0.33 \n", - "3.49 2.37 \n", - "3.49 2.37 \n", - "-5.96 0.32 \n", - "-15.12 0.75 \n", - "-15.12 0.75 \n", - "-15.12 0.75 \n", - "-15.12 0.75 \n", - "-15.12 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-46.07 6.27 \n", - "-8.35 1.22 \n", - "-189.98 12.78 \n", - "-189.98 12.78 \n", - "-189.98 12.79 \n", - "-189.98 12.8 \n", - "-189.98 12.81 \n", - "-100.63 7.88 \n", - "-100.63 7.9 \n", - "-100.63 7.91 \n", - "-100.63 7.92 \n", - "-100.63 7.93 \n", - "2.08 5.67 \n", - "2.08 5.69 \n", - "2.08 5.7 \n", - "2.08 5.72 \n", - "2.08 5.74 \n", - "-14.4 6.87 \n", - "-14.4 6.88 \n", - "-14.4 6.89 \n", - "-14.4 6.91 \n", - "-14.4 6.93 \n", - "-14.03 7.02 \n", - "-14.03 7.03 \n", - "-14.03 7.05 \n", - "-14.03 7.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "121.0 6.91 \n", - "10000000.0 10000000.0 \n", - "42.79 0.28 \n", - "-36.1 0.45 \n", - "-10.37 0.2 \n", - "-5.68 3.17 \n", - "-5.68 2.5 \n", - "-28.95 4.36 \n", - "9.59 6.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.14 0.86 \n", - "-1.7 10.99 \n", - "-4.5 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.73 2.41 \n", - "-13.17 0.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.11 0.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.94 0.19 \n", - "10000000.0 10000000.0 \n", - "1.74 0.94 \n", - "1.74 0.94 \n", - "-1.6 0.71 \n", - "-1.6 0.71 \n", - "2.3 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.68 2.32 \n", - "0.68 0.8 \n", - "-1.9 0.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-99.41 1.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.31 9.76 \n", - "-7.67 0.33 \n", - "-3.07 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.11 0.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.0 1.55 \n", - "10000000.0 10000000.0 \n", - "-8.47 0.57 \n", - "-5.67 0.33 \n", - "10000000.0 10000000.0 \n", - "-0.56 0.49 \n", - "-0.85 0.5 \n", - "-1.15 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "11.38 0.28 \n", - "14.07 0.29 \n", - "-78.78 4.27 \n", - "-78.78 4.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-41.16 1.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-22.87 1.22 \n", - "-22.87 1.22 \n", - "-22.87 1.22 \n", - "-22.87 1.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.12 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.83 0.43 \n", - "-14.03 9.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.17 0.33 \n", - "-48.33 6.68 \n", - "0.01 None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.82 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.15 6.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.11 0.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.18 0.45 \n", - "-58.79 0.73 \n", - "-20.64 5.86 \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-104.49 1.31 \n", - "0.48 1.95 \n", - "-9.31 0.31 \n", - "-10.1 0.44 \n", - "-9.49 0.47 \n", - "-8.57 0.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 3.9 \n", - "None 3.97 \n", - "None 3.97 \n", - "None 4.03 \n", - "None 4.43 \n", - "None 4.43 \n", - "None 0.83 \n", - "None 1.96 \n", - "None 1.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "None 0.44 \n", - "None 0.44 \n", - "None 0.49 \n", - "None 0.83 \n", - "10000000.0 10000000.0 \n", - "None 0.08 \n", - "None 2.37 \n", - "10000000.0 10000000.0 \n", - "-1.98 0.65 \n", - "-1.98 0.65 \n", - "-6.33 0.77 \n", - "10000000.0 10000000.0 \n", - "-107.68 1.13 \n", - "-1.31 0.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-91.65 5.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-91.65 4.71 \n", - "-90.63 6.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.2 \n", - "None 4.2 \n", - "-2.53 0.9 \n", - "-15.67 0.45 \n", - "-2.79 0.87 \n", - "-2.79 0.87 \n", - "10000000.0 10000000.0 \n", - "0.04 0.39 \n", - "-3.56 0.39 \n", - "-4.84 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.24 0.43 \n", - "-6.42 0.31 \n", - "-6.42 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.7 0.48 \n", - "10000000.0 10000000.0 \n", - "-27.53 5.1 \n", - "-27.53 5.1 \n", - "-5.9 1.18 \n", - "-5.9 1.18 \n", - "1.21 0.41 \n", - "-6.28 0.55 \n", - "10000000.0 10000000.0 \n", - "-8.15 3.02 \n", - "10000000.0 10000000.0 \n", - "-4.11 0.54 \n", - "-8.23 1.28 \n", - "-1.82 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 8.15 \n", - "-3.83 0.39 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "0.87 0.14 \n", - "-10.01 0.3 \n", - "-4.73 0.54 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.19 0.29 \n", - "0.48 0.43 \n", - "3.13 0.76 \n", - "6.14 0.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.13 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.64 0.81 \n", - "-8.15 0.78 \n", - "0.61 0.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.67 0.93 \n", - "10000000.0 10000000.0 \n", - "4.75 6.33 \n", - "0.35 0.57 \n", - "10000000.0 10000000.0 \n", - "-5.96 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.73 10.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "26.76 1.17 \n", - "57.71 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-36.37 1.84 \n", - "1.86 1.01 \n", - "-0.02 0.49 \n", - "10000000.0 10000000.0 \n", - "0.09 0.5 \n", - "-1.09 1.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.49 0.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.64 0.81 \n", - "-5.9 1.0 \n", - "10000000.0 10000000.0 \n", - "-1.6 0.57 \n", - "10000000.0 10000000.0 \n", - "1.02 0.71 \n", - "2.6 0.18 \n", - "-5.81 0.35 \n", - "-5.81 0.35 \n", - "4.44 0.24 \n", - "0.38 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.24 0.46 \n", - "-2.24 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.06 0.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-5.56 0.33 \n", - "10000000.0 10000000.0 \n", - "-3.05 5.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.54 0.77 \n", - "2.54 0.77 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-4.18 0.29 \n", - "1.14 0.09 \n", - "1.14 0.09 \n", - "-1.13 0.1 \n", - "-1.13 0.1 \n", - "3.41 0.13 \n", - "3.41 0.13 \n", - "4.44 0.24 \n", - "-8.27 0.9 \n", - "10000000.0 10000000.0 \n", - "-4.44 0.24 \n", - "-5.83 1.19 \n", - "-0.95 0.36 \n", - "5.6 0.74 \n", - "-1.62 0.84 \n", - "-0.99 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.79 0.35 \n", - "-4.44 0.46 \n", - "-4.44 0.46 \n", - "8.79 0.58 \n", - "-0.42 0.04 \n", - "-0.42 0.04 \n", - "2.34 0.52 \n", - "10000000.0 10000000.0 \n", - "-3.41 1.42 \n", - "10000000.0 10000000.0 \n", - "-7.84 1.14 \n", - "3.52 0.71 \n", - "2.56 0.91 \n", - "20.66 5.23 \n", - "-1.96 0.4 \n", - "-1.96 0.4 \n", - "10000000.0 10000000.0 \n", - "0.07 0.13 \n", - "0.07 0.13 \n", - "10000000.0 10000000.0 \n", - "5.03 0.08 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "1.25 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.8 0.34 \n", - "-24.76 1.8 \n", - "-11.9 0.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.86 1.6 \n", - "-2.64 1.18 \n", - "5.68 1.08 \n", - "10000000.0 10000000.0 \n", - "0.69 0.13 \n", - "0.69 0.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.87 0.41 \n", - "4.58 0.71 \n", - "-5.07 0.71 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-8.29 0.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.3 0.87 \n", - "10000000.0 10000000.0 \n", - "-1.34 0.85 \n", - "0.07 0.38 \n", - "0.51 0.84 \n", - "1.26 0.75 \n", - "1.26 0.75 \n", - "10000000.0 10000000.0 \n", - "-1.42 0.64 \n", - "-46.06 1.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.27 0.56 \n", - "-0.27 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-23.32 1.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.6 0.11 \n", - "-0.58 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.95 0.63 \n", - "-5.36 2.64 \n", - "0.21 0.52 \n", - "0.21 0.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.74 0.35 \n", - "0.74 0.35 \n", - "-0.14 None \n", - "1.02 0.58 \n", - "1.02 0.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.98 1.63 \n", - "0.61 0.58 \n", - "0.61 0.58 \n", - "-4.39 0.91 \n", - "-0.4 0.71 \n", - "14.27 0.34 \n", - "1.08 0.23 \n", - "1.08 0.23 \n", - "5.18 0.57 \n", - "-1.06 0.41 \n", - "10000000.0 10000000.0 \n", - "-28.93 1.06 \n", - "-28.93 1.06 \n", - "10000000.0 10000000.0 \n", - "6.15 0.94 \n", - "6.14 0.93 \n", - "-8.44 0.34 \n", - "-8.44 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.59 0.63 \n", - "0.59 0.63 \n", - "-0.66 0.71 \n", - "0.29 0.3 \n", - "0.29 0.3 \n", - "-9.1 0.61 \n", - "-7.67 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.8 0.55 \n", - "10000000.0 10000000.0 \n", - "-48.81 2.02 \n", - "10000000.0 10000000.0 \n", - "-13.45 5.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.35 6.28 \n", - "-6.35 6.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "14.88 0.5 \n", - "1.55 0.36 \n", - "10000000.0 10000000.0 \n", - "0.04 0.39 \n", - "10000000.0 10000000.0 \n", - "1.25 0.1 \n", - "-6.68 4.98 \n", - "-0.6 0.32 \n", - "-0.6 0.32 \n", - "10000000.0 10000000.0 \n", - "-1.69 0.17 \n", - "-2.41 0.57 \n", - "-0.01 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.72 0.09 \n", - "11.53 0.22 \n", - "11.53 0.23 \n", - "10000000.0 10000000.0 \n", - "-74.09 0.81 \n", - "-6.23 0.63 \n", - "-7.43 1.18 \n", - "10000000.0 10000000.0 \n", - "-2.69 0.15 \n", - "-25.73 1.49 \n", - "10000000.0 10000000.0 \n", - "6.14 0.2 \n", - "-12.08 0.38 \n", - "7.45 0.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.03 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.48 0.6 \n", - "10.54 0.22 \n", - "-6.35 4.76 \n", - "0.2 0.71 \n", - "-23.14 5.89 \n", - "-18.42 5.84 \n", - "-1.98 0.16 \n", - "-1.98 0.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.64 0.29 \n", - "1.82 0.71 \n", - "-4.1 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.7 1.43 \n", - "10000000.0 10000000.0 \n", - "5.37 0.41 \n", - "5.36 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "22.97 6.2 \n", - "-4.0 0.63 \n", - "0.48 0.41 \n", - "1.49 1.28 \n", - "10000000.0 10000000.0 \n", - "7.45 0.1 \n", - "4.75 0.95 \n", - "4.15 1.31 \n", - "-3.46 0.05 \n", - "-3.46 0.05 \n", - "-3.46 0.05 \n", - "-4.25 0.46 \n", - "-4.25 0.46 \n", - "1.95 0.63 \n", - "10000000.0 10000000.0 \n", - "1.11 0.92 \n", - "9.66 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.45 1.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-74.63 2.18 \n", - "-27.2 2.15 \n", - "-69.98 2.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.09 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.13 0.76 \n", - "3.13 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.95 0.77 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.26 0.76 \n", - "14.01 1.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.28 0.35 \n", - "0.38 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "39.91 0.2 \n", - "-15.26 0.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-27.39 1.97 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.96 1.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-344.88 2.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.66 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.64 0.38 \n", - "-1.64 0.39 \n", - "10000000.0 10000000.0 \n", - "-342.08 2.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-341.27 2.39 \n", - "-13.55 5.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 3.63 \n", - "None 2.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.85 0.79 \n", - "-90.7 0.91 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 0.44 \n", - "None 0.34 \n", - "None 0.81 \n", - "None 0.57 \n", - "None 0.62 \n", - "None 0.35 \n", - "None 0.71 \n", - "None 0.58 \n", - "None 0.78 \n", - "None 0.35 \n", - "None 0.89 \n", - "None 2.05 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.16 \n", - "None 2.12 \n", - "None 1.4 \n", - "10000000.0 10000000.0 \n", - "None 2.12 \n", - "-348.4 2.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.81 0.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.42 0.93 \n", - "-16.48 0.89 \n", - "0.5 0.74 \n", - "-33.13 0.56 \n", - "-9.12 0.58 \n", - "18.88 1.17 \n", - "-11.0 0.8 \n", - "10000000.0 10000000.0 \n", - "187.73 2.17 \n", - "93.68 1.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.02 \n", - "None 1.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-105.96 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.1 0.51 \n", - "10000000.0 10000000.0 \n", - "-7.68 0.72 \n", - "-3.53 7.16 \n", - "-41.05 5.14 \n", - "10000000.0 10000000.0 \n", - "None 0.45 \n", - "None 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.44 \n", - "None 1.15 \n", - "None 1.15 \n", - "None 0.68 \n", - "None 4.7 \n", - "10000000.0 10000000.0 \n", - "None 0.45 \n", - "None 0.45 \n", - "10000000.0 10000000.0 \n", - "-51.21 0.64 \n", - "None 4.55 \n", - "None 1.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.04 0.98 \n", - "-2.82 0.67 \n", - "None 0.71 \n", - "None 4.99 \n", - "10000000.0 10000000.0 \n", - "-6.4 0.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.54 \n", - "None 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.89 0.25 \n", - "None 4.29 \n", - "None 2.21 \n", - "None 0.83 \n", - "None 0.83 \n", - "None 0.72 \n", - "None 0.48 \n", - "None 0.48 \n", - "-95.24 0.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.88 \n", - "None 4.88 \n", - "None 3.85 \n", - "10000000.0 10000000.0 \n", - "None 0.55 \n", - "-12.08 0.58 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.16 \n", - "None 2.91 \n", - "None 2.32 \n", - "10000000.0 10000000.0 \n", - "None 6.51 \n", - "223.92 1.25 \n", - "None 8.53 \n", - "228.78 1.28 \n", - "-230.83 1.3 \n", - "None 0.86 \n", - "None 0.86 \n", - "None 0.54 \n", - "None 0.54 \n", - "None 0.38 \n", - "-6.16 0.07 \n", - "None 5.49 \n", - "None 0.71 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.3 \n", - "None 1.6 \n", - "None 0.82 \n", - "None 0.48 \n", - "None 0.48 \n", - "10000000.0 10000000.0 \n", - "None 0.44 \n", - "None 0.44 \n", - "None 0.64 \n", - "None 0.64 \n", - "None 0.64 \n", - "None 2.22 \n", - "None 2.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.82 \n", - "10000000.0 10000000.0 \n", - "None 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.73 \n", - "None 0.64 \n", - "None 0.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.79 \n", - "-6.83 0.33 \n", - "None 2.02 \n", - "None 2.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 6.15 \n", - "None 6.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 0.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.9 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.9 0.51 \n", - "None 1.13 \n", - "None 1.13 \n", - "10000000.0 10000000.0 \n", - "None 3.59 \n", - "None 1.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.94 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-20.81 1.48 \n", - "10000000.0 10000000.0 \n", - "None 0.75 \n", - "None 0.75 \n", - "-7.11 0.85 \n", - "10000000.0 10000000.0 \n", - "None 1.97 \n", - "None 1.64 \n", - "None 2.88 \n", - "-99.41 1.12 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "None 1.1 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 6.04 \n", - "10000000.0 10000000.0 \n", - "None 1.27 \n", - "None 1.27 \n", - "None 4.41 \n", - "-10.52 0.94 \n", - "None 3.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-27.82 10.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-54.38 2.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.85 \n", - "-35.4 1.67 \n", - "-9.51 1.39 \n", - "None 2.14 \n", - "None 2.09 \n", - "-228.69 1.3 \n", - "None 2.14 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "1.71 4.5 \n", - "-75.98 3.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "13.27 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-125.0 9.1 \n", - "-144.72 10.59 \n", - "-165.35 12.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.52 \n", - "10000000.0 10000000.0 \n", - "-230.08 1.25 \n", - "None 0.47 \n", - "-6.16 0.07 \n", - "-6.38 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-31.87 1.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-27.15 2.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.58 \n", - "-26.92 1.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.11 2.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.75 \n", - "6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.84 6.26 \n", - "-109.51 0.79 \n", - "34.78 0.84 \n", - "-0.61 0.36 \n", - "-3.21 0.75 \n", - "10000000.0 10000000.0 \n", - "None 2.19 \n", - "None 0.48 \n", - "None 4.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-108.72 1.19 \n", - "-3.83 2.65 \n", - "10000000.0 10000000.0 \n", - "4.23 0.22 \n", - "None 1.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.41 \n", - "-6.16 0.07 \n", - "-3.83 0.38 \n", - "-6.08 1.02 \n", - "0.35 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-82.17 18.33 \n", - "None 3.13 \n", - "10000000.0 10000000.0 \n", - "None 2.14 \n", - "-40.49 1.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.29 \n", - "-9.97 0.69 \n", - "10000000.0 10000000.0 \n", - "-27.8 2.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "-2.63 1.54 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-1.02 0.27 \n", - "10000000.0 10000000.0 \n", - "-6.8 0.8 \n", - "None 0.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.61 0.92 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "None 1.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-177.25 1.72 \n", - "10000000.0 10000000.0 \n", - "171.48 1.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-61.94 4.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.19 1.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.01 0.45 \n", - "7.33 1.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-318.73 14.75 \n", - "-318.73 14.75 \n", - "10000000.0 10000000.0 \n", - "-4.01 0.73 \n", - "-2.16 0.33 \n", - "10000000.0 10000000.0 \n", - "4.41 0.52 \n", - "-11.19 0.53 \n", - "-318.73 14.75 \n", - "10000000.0 10000000.0 \n", - "0.31 0.55 \n", - "10000000.0 10000000.0 \n", - "-4.01 0.73 \n", - "-2.95 0.8 \n", - "-2.16 0.33 \n", - "10000000.0 10000000.0 \n", - "4.41 0.52 \n", - "-11.19 0.53 \n", - "-318.73 14.75 \n", - "10000000.0 10000000.0 \n", - "0.31 0.55 \n", - "10000000.0 10000000.0 \n", - "-3.35 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-48.33 5.4 \n", - "-118.19 0.76 \n", - "-1.99 0.43 \n", - "-2.08 0.98 \n", - "None None \n", - "-18.13 0.71 \n", - "2.2 0.79 \n", - "10000000.0 10000000.0 \n", - "-1.7 5.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-189.98 12.78 \n", - "-1.7 5.81 \n", - "-82.42 3.41 \n", - "-130.79 1.14 \n", - "-3.83 0.51 \n", - "10000000.0 10000000.0 \n", - "0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.56 0.16 \n", - "10000000.0 10000000.0 \n", - "-15.12 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "-25.66 1.58 \n", - "10000000.0 10000000.0 \n", - "-15.12 0.75 \n", - "-189.98 12.77 \n", - "10000000.0 10000000.0 \n", - "-189.98 12.78 \n", - "10000000.0 10000000.0 \n", - "-83.06 1.82 \n", - "-1.7 7.15 \n", - "-0.37 0.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.56 0.16 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "2.16 7.32 \n", - "0.28 0.38 \n", - "38.74 1.52 \n", - "38.73 1.52 \n", - "35.82 1.55 \n", - "35.82 1.55 \n", - "30.11 7.09 \n", - "30.11 7.11 \n", - "30.99 7.1 \n", - "30.99 7.11 \n", - "31.3 7.14 \n", - "31.3 7.15 \n", - "3.9 0.48 \n", - "3.9 0.48 \n", - "55.14 8.69 \n", - "55.14 8.7 \n", - "56.02 8.7 \n", - "56.02 8.71 \n", - "56.33 8.73 \n", - "56.33 8.74 \n", - "23.13 1.62 \n", - "23.13 1.62 \n", - "24.06 1.67 \n", - "24.06 1.66 \n", - "21.14 1.76 \n", - "21.14 1.76 \n", - "55.14 8.69 \n", - "55.14 8.7 \n", - "56.02 8.7 \n", - "56.02 8.71 \n", - "56.33 8.73 \n", - "56.33 8.74 \n", - "39.77 1.35 \n", - "39.77 1.35 \n", - "40.7 1.44 \n", - "40.7 1.44 \n", - "37.78 1.47 \n", - "37.78 1.47 \n", - "36.7 1.39 \n", - "36.69 1.39 \n", - "37.63 1.44 \n", - "37.62 1.44 \n", - "34.71 1.51 \n", - "34.71 1.51 \n", - "39.77 1.35 \n", - "39.77 1.35 \n", - "40.7 1.44 \n", - "40.7 1.44 \n", - "37.78 1.47 \n", - "37.78 1.47 \n", - "6.36 0.28 \n", - "6.36 0.27 \n", - "4.84 0.46 \n", - "4.84 0.45 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "5.88 0.72 \n", - "37.81 1.42 \n", - "37.81 1.42 \n", - "38.74 1.52 \n", - "38.73 1.52 \n", - "35.82 1.55 \n", - "35.82 1.55 \n", - "23.13 1.62 \n", - "23.13 1.62 \n", - "24.06 1.67 \n", - "24.06 1.66 \n", - "21.14 1.76 \n", - "21.14 1.76 \n", - "23.13 1.62 \n", - "23.13 1.62 \n", - "24.06 1.67 \n", - "24.06 1.66 \n", - "21.14 1.76 \n", - "21.14 1.76 \n", - "65.4 1.51 \n", - "65.4 1.51 \n", - "5.95 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.41 6.55 \n", - "-26.41 6.57 \n", - "-29.74 6.6 \n", - "-29.74 6.61 \n", - "-29.74 6.6 \n", - "-29.74 6.61 \n", - "-26.94 6.53 \n", - "-26.94 6.55 \n", - "-30.27 6.58 \n", - "-30.27 6.6 \n", - "-30.27 6.58 \n", - "-30.27 6.6 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "-5.48 0.42 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "-57.05 7.45 \n", - "-57.05 7.47 \n", - "-57.05 7.45 \n", - "-57.05 7.47 \n", - "-31.31 7.79 \n", - "-31.31 7.8 \n", - "-48.23 7.52 \n", - "-48.23 7.54 \n", - "-87.11 7.3 \n", - "-87.11 7.32 \n", - "-43.8 7.51 \n", - "-43.8 7.52 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "3.9 0.48 \n", - "3.9 0.48 \n", - "3.9 0.48 \n", - "3.9 0.48 \n", - "2.91 0.76 \n", - "2.91 0.76 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "3.9 0.48 \n", - "3.9 0.48 \n", - "3.9 0.48 \n", - "3.9 0.48 \n", - "2.91 0.76 \n", - "2.91 0.76 \n", - "2.91 0.76 \n", - "2.91 0.76 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "2.91 0.76 \n", - "2.91 0.76 \n", - "3.9 0.48 \n", - "3.9 0.48 \n", - "3.9 0.48 \n", - "3.9 0.48 \n", - "67.49 7.44 \n", - "67.49 7.45 \n", - "67.49 7.44 \n", - "67.49 7.45 \n", - "41.75 7.77 \n", - "41.75 7.78 \n", - "58.67 7.51 \n", - "58.67 7.52 \n", - "97.55 7.28 \n", - "97.55 7.3 \n", - "54.24 7.49 \n", - "54.24 7.5 \n", - "6.88 0.4 \n", - "6.88 0.4 \n", - "7.81 0.93 \n", - "7.8 0.93 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "-5.48 0.43 \n", - "-5.48 0.42 \n", - "4.89 0.24 \n", - "5.82 0.62 \n", - "5.82 0.62 \n", - "2.9 0.55 \n", - "2.9 0.54 \n", - "8.17 0.76 \n", - "8.17 0.76 \n", - "9.1 0.95 \n", - "9.1 0.95 \n", - "6.19 0.94 \n", - "6.18 0.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.61 0.54 \n", - "7.61 0.54 \n", - "7.61 0.54 \n", - "7.61 0.54 \n", - "7.78 0.43 \n", - "7.78 0.43 \n", - "7.78 0.43 \n", - "7.78 0.43 \n", - "17.25 0.43 \n", - "17.24 0.43 \n", - "6.88 0.4 \n", - "6.88 0.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.54 0.86 \n", - "8.54 0.86 \n", - "8.54 0.86 \n", - "8.54 0.86 \n", - "8.71 0.78 \n", - "8.71 0.78 \n", - "8.71 0.78 \n", - "8.71 0.78 \n", - "18.18 0.99 \n", - "18.17 0.99 \n", - "7.81 0.93 \n", - "7.8 0.93 \n", - "41.32 8.25 \n", - "41.32 8.26 \n", - "41.32 8.25 \n", - "41.32 8.26 \n", - "15.58 8.55 \n", - "15.58 8.56 \n", - "32.5 8.32 \n", - "32.5 8.33 \n", - "71.38 8.12 \n", - "71.38 8.13 \n", - "28.07 8.3 \n", - "28.07 8.31 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "7.95 0.61 \n", - "7.95 0.61 \n", - "3.26 1.68 \n", - "3.26 1.67 \n", - "-24.84 8.14 \n", - "-24.84 8.15 \n", - "20.71 1.0 \n", - "20.71 1.0 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "1.83 0.59 \n", - "1.83 0.59 \n", - "6.51 1.68 \n", - "6.51 1.67 \n", - "35.28 8.14 \n", - "35.28 8.15 \n", - "-10.93 0.93 \n", - "-10.94 0.92 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "7.95 0.61 \n", - "7.95 0.61 \n", - "3.26 1.68 \n", - "3.26 1.67 \n", - "-24.84 8.14 \n", - "-24.84 8.15 \n", - "20.71 1.0 \n", - "20.71 1.0 \n", - "1.83 0.59 \n", - "1.83 0.59 \n", - "6.51 1.68 \n", - "6.51 1.67 \n", - "35.28 8.14 \n", - "35.28 8.15 \n", - "-10.93 0.93 \n", - "-10.94 0.92 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "0.2 1.76 \n", - "0.2 1.76 \n", - "-50.58 8.45 \n", - "-50.58 8.46 \n", - "17.65 1.15 \n", - "17.65 1.14 \n", - "9.58 1.77 \n", - "9.57 1.77 \n", - "61.02 8.45 \n", - "61.02 8.46 \n", - "-7.87 1.09 \n", - "-7.87 1.09 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "-33.66 8.2 \n", - "-33.66 8.21 \n", - "22.34 1.94 \n", - "22.33 1.94 \n", - "44.1 8.2 \n", - "44.1 8.21 \n", - "-12.56 1.9 \n", - "-12.56 1.9 \n", - "5.22 8.0 \n", - "5.22 8.01 \n", - "48.53 8.19 \n", - "48.53 8.2 \n", - "-38.09 8.19 \n", - "-38.09 8.2 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.63 0.67 \n", - "5.62 0.66 \n", - "5.63 0.67 \n", - "5.62 0.66 \n", - "6.38 0.36 \n", - "6.38 0.36 \n", - "-6.41 0.51 \n", - "-6.41 0.51 \n", - "5.79 0.65 \n", - "5.79 0.65 \n", - "5.79 0.65 \n", - "5.79 0.65 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "15.26 0.14 \n", - "15.26 0.13 \n", - "4.89 0.24 \n", - "4.89 0.24 \n", - "66.0 1.35 \n", - "66.0 1.35 \n", - "8.03 0.81 \n", - "4.89 0.25 \n", - "5.88 0.28 \n", - "5.87 0.28 \n", - "3.9 0.48 \n", - "3.9 0.48 \n", - "-6.41 0.51 \n", - "-6.41 0.51 \n", - "-46.51 0.85 \n", - "-46.51 0.85 \n", - "-8.68 0.27 \n", - "-4.3 1.55 \n", - "-4.3 1.55 \n", - "-13.62 1.46 \n", - "-13.62 1.46 \n", - "59.33 7.75 \n", - "59.33 7.76 \n", - "59.33 7.75 \n", - "59.33 7.76 \n", - "33.59 8.07 \n", - "33.59 8.08 \n", - "50.51 7.82 \n", - "50.51 7.83 \n", - "89.39 7.61 \n", - "89.39 7.62 \n", - "46.08 7.8 \n", - "46.08 7.81 \n", - "-13.62 1.46 \n", - "-13.62 1.46 \n", - "68.97 7.7 \n", - "68.97 7.72 \n", - "68.97 7.7 \n", - "68.97 7.72 \n", - "43.23 8.03 \n", - "43.23 8.04 \n", - "60.15 7.77 \n", - "60.15 7.78 \n", - "99.03 7.56 \n", - "99.03 7.57 \n", - "55.72 7.76 \n", - "55.72 7.77 \n", - "-8.68 0.27 \n", - "-8.68 0.26 \n", - "52.47 7.45 \n", - "52.47 7.46 \n", - "52.47 7.45 \n", - "52.47 7.46 \n", - "26.73 7.79 \n", - "26.73 7.8 \n", - "43.65 7.52 \n", - "43.65 7.53 \n", - "82.53 7.3 \n", - "82.53 7.31 \n", - "39.22 7.51 \n", - "39.22 7.52 \n", - "-12.74 1.32 \n", - "-12.74 1.32 \n", - "65.67 7.59 \n", - "65.67 7.6 \n", - "65.67 7.59 \n", - "65.67 7.6 \n", - "39.93 7.92 \n", - "39.93 7.93 \n", - "56.85 7.65 \n", - "56.85 7.67 \n", - "95.73 7.44 \n", - "95.73 7.45 \n", - "52.42 7.64 \n", - "52.42 7.65 \n", - "-10.29 0.94 \n", - "-20.61 0.81 \n", - "-20.61 0.8 \n", - "-11.76 0.81 \n", - "-11.76 0.81 \n", - "-10.24 0.84 \n", - "-10.24 0.84 \n", - "-13.1 6.15 \n", - "-13.1 6.16 \n", - "3.34 0.86 \n", - "3.33 0.86 \n", - "-7.48 0.8 \n", - "-7.48 0.79 \n", - "-7.48 0.8 \n", - "-7.48 0.79 \n", - "3.34 0.86 \n", - "3.33 0.86 \n", - "-14.6 1.76 \n", - "-14.61 1.76 \n", - "-3.2 6.48 \n", - "-3.2 6.49 \n", - "-13.61 1.46 \n", - "-13.62 1.46 \n", - "8.56 2.5 \n", - "8.56 2.5 \n", - "-9.66 0.33 \n", - "-9.67 0.33 \n", - "55.77 7.43 \n", - "55.77 7.44 \n", - "55.77 7.43 \n", - "55.77 7.44 \n", - "30.03 7.77 \n", - "30.03 7.78 \n", - "46.95 7.5 \n", - "46.95 7.51 \n", - "85.83 7.28 \n", - "85.83 7.29 \n", - "42.52 7.48 \n", - "42.52 7.5 \n", - "-10.07 0.31 \n", - "-10.07 0.31 \n", - "-40.48 1.4 \n", - "-40.49 1.4 \n", - "-40.48 1.4 \n", - "-40.49 1.4 \n", - "-41.41 1.46 \n", - "-41.41 1.46 \n", - "-38.49 1.52 \n", - "-38.5 1.52 \n", - "-15.95 1.74 \n", - "-15.95 1.74 \n", - "22.67 1.49 \n", - "22.67 1.48 \n", - "23.61 6.62 \n", - "23.61 6.63 \n", - "24.14 6.6 \n", - "24.14 6.62 \n", - "35.34 7.9 \n", - "35.34 7.91 \n", - "0.1 6.59 \n", - "0.1 6.6 \n", - "38.64 7.95 \n", - "38.64 7.96 \n", - "-9.8 6.39 \n", - "-9.8 6.41 \n", - "-3.2 6.48 \n", - "-3.2 6.49 \n", - "-6.5 6.42 \n", - "-6.5 6.43 \n", - "-12.84 6.54 \n", - "-12.84 6.55 \n", - "-12.84 6.54 \n", - "-12.84 6.55 \n", - "-12.84 6.54 \n", - "-12.84 6.55 \n", - "-9.8 6.39 \n", - "-9.8 6.41 \n", - "-6.5 6.42 \n", - "-6.5 6.43 \n", - "-6.5 6.42 \n", - "-6.5 6.43 \n", - "-3.2 6.48 \n", - "-3.2 6.49 \n", - "-9.8 6.39 \n", - "-13.1 6.41 \n", - "-9.8 6.41 \n", - "-13.1 6.42 \n", - "-8.67 0.27 \n", - "6.63 1.86 \n", - "6.63 1.86 \n", - "-7.75 0.74 \n", - "-7.75 0.74 \n", - "-7.69 0.47 \n", - "-7.69 0.47 \n", - "46.56 6.53 \n", - "46.56 6.54 \n", - "-5.24 1.12 \n", - "-5.24 1.11 \n", - "-8.68 0.27 \n", - "-8.68 0.26 \n", - "-7.69 0.47 \n", - "-7.69 0.47 \n", - "-9.66 0.33 \n", - "-9.67 0.33 \n", - "-9.66 0.33 \n", - "-9.67 0.33 \n", - "-9.17 0.45 \n", - "43.22 0.79 \n", - "43.21 0.79 \n", - "-8.41 0.61 \n", - "-9.15 0.36 \n", - "-9.16 0.36 \n", - "-17.98 0.32 \n", - "-17.98 0.31 \n", - "-7.75 0.74 \n", - "-7.75 0.74 \n", - "-8.68 0.27 \n", - "-5.76 1.07 \n", - "-5.76 1.07 \n", - "6.63 1.86 \n", - "6.63 1.86 \n", - "22.37 6.55 \n", - "22.37 6.56 \n", - "22.9 6.53 \n", - "22.9 6.54 \n", - "-8.68 0.27 \n", - "-8.68 0.27 \n", - "-7.69 0.47 \n", - "-7.69 0.47 \n", - "-7.69 0.47 \n", - "-7.69 0.47 \n", - "-6.7 0.74 \n", - "-6.7 0.74 \n", - "-8.68 0.27 \n", - "-7.69 0.47 \n", - "-7.69 0.47 \n", - "-7.69 0.47 \n", - "-7.69 0.47 \n", - "-6.7 0.74 \n", - "-6.7 0.74 \n", - "-6.7 0.74 \n", - "-6.7 0.74 \n", - "-8.68 0.27 \n", - "-8.68 0.27 \n", - "-6.7 0.74 \n", - "-6.7 0.74 \n", - "-7.69 0.47 \n", - "-7.69 0.47 \n", - "-7.69 0.47 \n", - "-7.69 0.47 \n", - "-8.68 0.27 \n", - "-8.68 0.26 \n", - "-8.68 0.27 \n", - "-8.68 0.27 \n", - "-8.68 0.26 \n", - "-11.64 0.86 \n", - "-11.64 0.86 \n", - "-12.63 1.16 \n", - "-12.63 1.16 \n", - "-10.65 0.58 \n", - "-10.65 0.58 \n", - "-10.65 0.58 \n", - "-10.65 0.58 \n", - "-10.65 0.58 \n", - "-10.65 0.58 \n", - "-10.65 0.58 \n", - "-10.65 0.58 \n", - "-8.68 0.27 \n", - "-8.68 0.26 \n", - "-10.65 0.58 \n", - "-10.65 0.58 \n", - "-8.68 0.27 \n", - "-8.68 0.26 \n", - "11.53 3.28 \n", - "11.53 3.28 \n", - "62.37 7.5 \n", - "62.37 7.51 \n", - "62.37 7.5 \n", - "62.37 7.51 \n", - "36.63 7.83 \n", - "36.63 7.84 \n", - "53.55 7.57 \n", - "53.55 7.58 \n", - "92.43 7.35 \n", - "92.43 7.36 \n", - "49.12 7.55 \n", - "49.12 7.56 \n", - "65.67 7.59 \n", - "65.67 7.6 \n", - "65.67 7.59 \n", - "65.67 7.6 \n", - "39.93 7.92 \n", - "39.93 7.93 \n", - "56.85 7.65 \n", - "56.85 7.67 \n", - "95.73 7.44 \n", - "95.73 7.45 \n", - "52.42 7.64 \n", - "52.42 7.65 \n", - "-8.68 0.27 \n", - "-7.69 0.47 \n", - "-7.69 0.47 \n", - "-6.7 0.74 \n", - "-6.7 0.74 \n", - "54.25 7.46 \n", - "54.25 7.47 \n", - "54.25 7.46 \n", - "54.25 7.47 \n", - "54.25 7.46 \n", - "54.25 7.47 \n", - "54.25 7.46 \n", - "54.25 7.47 \n", - "54.25 7.46 \n", - "54.25 7.47 \n", - "54.25 7.46 \n", - "54.25 7.47 \n", - "54.25 7.46 \n", - "54.25 7.47 \n", - "54.25 7.46 \n", - "54.25 7.47 \n", - "28.51 7.8 \n", - "28.51 7.81 \n", - "28.51 7.8 \n", - "28.51 7.81 \n", - "28.51 7.8 \n", - "28.51 7.81 \n", - "28.51 7.8 \n", - "28.51 7.81 \n", - "45.43 7.53 \n", - "45.43 7.54 \n", - "45.43 7.53 \n", - "45.43 7.54 \n", - "45.43 7.53 \n", - "45.43 7.54 \n", - "45.43 7.53 \n", - "45.43 7.54 \n", - "84.31 7.31 \n", - "84.31 7.32 \n", - "84.31 7.31 \n", - "84.31 7.32 \n", - "84.31 7.31 \n", - "84.31 7.32 \n", - "84.31 7.31 \n", - "84.31 7.32 \n", - "41.0 7.51 \n", - "41.0 7.53 \n", - "41.0 7.51 \n", - "41.0 7.53 \n", - "41.0 7.51 \n", - "41.0 7.53 \n", - "41.0 7.51 \n", - "41.0 7.53 \n", - "-8.68 0.27 \n", - "8.83 1.02 \n", - "8.82 1.02 \n", - "-9.9 0.69 \n", - "-9.9 0.69 \n", - "2.89 0.73 \n", - "2.89 0.73 \n", - "-8.68 0.27 \n", - "-7.69 0.47 \n", - "-7.69 0.47 \n", - "2.14 0.53 \n", - "2.14 0.53 \n", - "-19.47 0.45 \n", - "-19.47 0.44 \n", - "-2.18 0.83 \n", - "-1.33 0.3 \n", - "-0.28 0.38 \n", - "-0.28 0.37 \n", - "-1.51 0.4 \n", - "-1.51 0.4 \n", - "-1.51 0.4 \n", - "-1.51 0.4 \n", - "-1.51 0.4 \n", - "-1.51 0.4 \n", - "-1.51 0.4 \n", - "-1.51 0.4 \n", - "-1.51 0.4 \n", - "-7.54 3.31 \n", - "14.27 0.34 \n", - "14.27 0.33 \n", - "2.81 1.19 \n", - "-2.76 1.49 \n", - "-23.08 1.5 \n", - "-23.08 1.5 \n", - "-23.08 1.5 \n", - "2.81 1.19 \n", - "-2.76 1.49 \n", - "-23.08 1.5 \n", - "-23.08 1.5 \n", - "-23.08 1.5 \n", - "-2.11 0.69 \n", - "-3.12 0.44 \n", - "-3.4 0.14 \n", - "-2.99 0.52 \n", - "-2.66 0.4 \n", - "-1.78 0.65 \n", - "-3.24 0.66 \n", - "-2.96 0.7 \n", - "-1.7 0.64 \n", - "-3.61 5.28 \n", - "-1.76 0.52 \n", - "-3.61 5.28 \n", - "-1.76 0.52 \n", - "-2.81 0.3 \n", - "-2.81 0.3 \n", - "-3.18 1.19 \n", - "-8.76 1.49 \n", - "-29.08 1.5 \n", - "-29.08 1.5 \n", - "-3.18 1.19 \n", - "-8.76 1.49 \n", - "-29.08 1.5 \n", - "-29.08 1.5 \n", - "-29.08 1.5 \n", - "-0.3 1.26 \n", - "-5.87 1.55 \n", - "-26.19 1.56 \n", - "-26.19 1.56 \n", - "-0.3 1.26 \n", - "-5.87 1.55 \n", - "-26.19 1.56 \n", - "-26.19 1.56 \n", - "-26.19 1.56 \n", - "1.07 0.37 \n", - "1.07 0.36 \n", - "-14.03 4.92 \n", - "-14.24 5.56 \n", - "-1.7 5.69 \n", - "-6.83 0.57 \n", - "-7.21 0.57 \n", - "-6.83 0.57 \n", - "-7.21 0.57 \n", - "-6.83 0.57 \n", - "-7.21 0.57 \n", - "4.51 0.49 \n", - "-33.3 1.53 \n", - "-33.3 1.53 \n", - "-33.3 1.53 \n", - "-33.3 1.53 \n", - "-33.3 1.53 \n", - "-33.3 1.53 \n", - "-0.21 0.17 \n", - "-3.88 0.56 \n", - "-4.42 0.32 \n", - "-4.42 0.32 \n", - "-4.2 0.34 \n", - "-3.57 0.46 \n", - "-4.42 0.32 \n", - "-4.42 0.32 \n", - "-3.98 0.51 \n", - "-4.42 0.32 \n", - "-4.42 0.32 \n", - "-4.2 0.34 \n", - "-3.57 0.46 \n", - "-4.42 0.32 \n", - "-4.42 0.32 \n", - "-3.98 0.51 \n", - "4.46 0.24 \n", - "4.46 0.24 \n", - "4.45 0.24 \n", - "-0.66 0.33 \n", - "-56.1 11.35 \n", - "-119.57 0.8 \n", - "-82.5 6.28 \n", - "-2.14 3.72 \n", - "-2.14 3.72 \n", - "1.11 1.16 \n", - "-13.89 2.83 \n", - "-4.46 1.47 \n", - "-4.46 1.47 \n", - "-24.78 1.48 \n", - "-24.78 1.48 \n", - "1.11 1.16 \n", - "-13.89 2.83 \n", - "-4.46 1.47 \n", - "-4.46 1.47 \n", - "-24.78 1.48 \n", - "-24.78 1.48 \n", - "-24.78 1.48 \n", - "2.56 0.44 \n", - "2.56 0.44 \n", - "-31.87 1.48 \n", - "-31.87 1.48 \n", - "-31.87 1.48 \n", - "-31.87 1.48 \n", - "-31.87 1.48 \n", - "-31.87 1.48 \n", - "-31.87 1.48 \n", - "-19.93 1.14 \n", - "-19.92 1.14 \n", - "-25.5 1.48 \n", - "-25.5 1.48 \n", - "-5.98 1.16 \n", - "-20.98 2.83 \n", - "-20.98 2.83 \n", - "-0.34 1.41 \n", - "-0.33 1.41 \n", - "-25.5 1.48 \n", - "-25.5 1.48 \n", - "-25.5 1.48 \n", - "-25.5 1.48 \n", - "-19.93 1.14 \n", - "-19.92 1.14 \n", - "-6.3 2.12 \n", - "-6.3 2.12 \n", - "-11.56 1.46 \n", - "-11.55 1.46 \n", - "-11.56 1.46 \n", - "-11.55 1.46 \n", - "-11.56 1.46 \n", - "-11.55 1.46 \n", - "-11.56 1.46 \n", - "-11.55 1.46 \n", - "-11.56 1.46 \n", - "-11.55 1.46 \n", - "-11.56 1.46 \n", - "-11.55 1.46 \n", - "-11.56 1.46 \n", - "-11.55 1.46 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-7.97 1.22 \n", - "-7.97 1.22 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-2.4 1.36 \n", - "-2.4 1.36 \n", - "-11.56 1.46 \n", - "-11.55 1.46 \n", - "-31.87 1.48 \n", - "-31.87 1.48 \n", - "-34.79 1.77 \n", - "-34.79 1.76 \n", - "-28.96 1.78 \n", - "-28.95 1.78 \n", - "39.01 1.8 \n", - "39.01 1.8 \n", - "41.09 1.81 \n", - "41.1 1.81 \n", - "-31.88 1.48 \n", - "-31.87 1.48 \n", - "-31.88 1.48 \n", - "-31.88 1.48 \n", - "-31.88 1.48 \n", - "-31.87 1.48 \n", - "-0.34 1.41 \n", - "-0.33 1.41 \n", - "-0.34 1.41 \n", - "-0.33 1.41 \n", - "-31.88 1.48 \n", - "10000000.0 10000000.0 \n", - "-31.87 1.48 \n", - "-31.87 1.48 \n", - "-19.93 1.14 \n", - "-19.92 1.14 \n", - "-25.5 1.48 \n", - "-25.5 1.48 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-20.98 2.83 \n", - "-20.98 2.83 \n", - "-0.34 1.41 \n", - "-0.33 1.41 \n", - "-25.5 1.48 \n", - "-25.5 1.48 \n", - "-25.5 1.48 \n", - "-25.5 1.48 \n", - "-19.93 1.14 \n", - "-19.92 1.14 \n", - "-6.3 2.12 \n", - "-6.3 2.12 \n", - "-11.56 1.46 \n", - "-11.55 1.46 \n", - "-11.56 1.46 \n", - "-11.55 1.46 \n", - "-11.56 1.46 \n", - "-11.55 1.46 \n", - "-11.56 1.46 \n", - "-11.55 1.46 \n", - "-11.56 1.46 \n", - "-11.55 1.46 \n", - "-11.56 1.46 \n", - "-11.55 1.46 \n", - "-11.56 1.46 \n", - "-11.55 1.46 \n", - "-11.56 1.46 \n", - "-11.55 1.46 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-7.97 1.22 \n", - "-7.97 1.22 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-5.98 1.16 \n", - "-2.4 1.36 \n", - "-2.4 1.36 \n", - "-11.56 1.46 \n", - "-11.55 1.46 \n", - "-31.87 1.48 \n", - "-31.87 1.48 \n", - "-34.79 1.77 \n", - "-34.79 1.76 \n", - "-28.96 1.78 \n", - "-28.95 1.78 \n", - "39.01 1.8 \n", - "39.01 1.8 \n", - "41.09 1.81 \n", - "41.1 1.81 \n", - "-31.88 1.48 \n", - "-31.87 1.48 \n", - "-31.88 1.48 \n", - "-31.87 1.48 \n", - "-31.88 1.48 \n", - "-31.87 1.48 \n", - "-31.88 1.48 \n", - "-31.87 1.48 \n", - "-31.88 1.48 \n", - "-31.87 1.48 \n", - "-0.34 1.41 \n", - "-0.33 1.41 \n", - "-0.34 1.41 \n", - "-0.33 1.41 \n", - "-31.88 1.48 \n", - "10000000.0 10000000.0 \n", - "-31.87 1.48 \n", - "10000000.0 10000000.0 \n", - "-6.23 0.35 \n", - "-6.12 0.31 \n", - "-2.58 0.3 \n", - "-2.58 0.3 \n", - "7.22 4.08 \n", - "-2.58 0.3 \n", - "-2.58 0.3 \n", - "-2.58 0.3 \n", - "7.22 4.08 \n", - "-2.58 0.3 \n", - "-2.58 0.3 \n", - "-2.58 0.3 \n", - "7.22 4.08 \n", - "-2.58 0.3 \n", - "-2.58 0.3 \n", - "-2.58 0.3 \n", - "7.22 4.08 \n", - "-14.03 5.38 \n", - "-14.03 4.99 \n", - "-14.03 5.38 \n", - "-14.03 5.38 \n", - "-14.03 5.38 \n", - "-14.03 4.99 \n", - "-14.03 5.38 \n", - "-4.69 0.75 \n", - "-4.69 0.75 \n", - "-4.69 0.75 \n", - "-4.69 0.75 \n", - "-3.09 4.27 \n", - "-3.09 4.46 \n", - "-4.69 0.75 \n", - "-4.69 0.75 \n", - "-3.09 4.47 \n", - "-4.69 0.75 \n", - "-4.69 0.75 \n", - "-3.09 4.64 \n", - "-3.09 4.68 \n", - "-3.09 4.68 \n", - "-3.09 4.83 \n", - "-3.09 4.83 \n", - "-3.09 5.07 \n", - "-4.69 0.75 \n", - "-3.09 4.89 \n", - "-3.09 5.09 \n", - "-3.09 5.1 \n", - "-3.09 5.1 \n", - "-3.09 5.21 \n", - "-4.69 0.75 \n", - "-4.69 0.75 \n", - "-4.69 0.75 \n", - "-4.69 0.75 \n", - "-3.09 4.27 \n", - "-3.09 4.46 \n", - "-4.69 0.75 \n", - "-4.69 0.75 \n", - "-3.09 4.47 \n", - "-4.69 0.75 \n", - "-4.69 0.75 \n", - "-3.09 4.64 \n", - "-3.09 4.68 \n", - "-3.09 4.68 \n", - "-3.09 4.83 \n", - "-3.09 4.83 \n", - "-3.09 5.07 \n", - "-4.69 0.75 \n", - "-3.09 4.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 5.11 \n", - "-169.06 1.49 \n", - "-115.03 6.56 \n", - "-1.7 18.38 \n", - "10000000.0 10000000.0 \n", - "-6.14 0.96 \n", - "-13.11 7.92 \n", - "-53.4 2.73 \n", - "-2.0 1.79 \n", - "10000000.0 10000000.0 \n", - "-5.35 2.71 \n", - "-87.62 0.79 \n", - "10000000.0 10000000.0 \n", - "-12.72 2.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-69.98 4.36 \n", - "10000000.0 10000000.0 \n", - "-4.4 0.52 \n", - "-4.7 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "178.0 0.73 \n", - "2060.91 7.26 \n", - "None None \n", - "-114.14 1.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "-59.88 1.53 \n", - "-31.09 1.08 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-105.85 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 4.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-113.66 1.73 \n", - "-18.1 2.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.65 0.54 \n", - "-4.36 11.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.85 0.58 \n", - "-30.19 1.75 \n", - "10000000.0 10000000.0 \n", - "-0.5 10.54 \n", - "-72.34 0.88 \n", - "10000000.0 10000000.0 \n", - "17.12 1.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.89 0.24 \n", - "12.57 4.9 \n", - "10000000.0 10000000.0 \n", - "-5.51 1.58 \n", - "1.81 5.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.5 1.16 \n", - "19.12 6.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.12 0.98 \n", - "10000000.0 10000000.0 \n", - "-7.73 0.77 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.13 5.63 \n", - "10000000.0 10000000.0 \n", - "-10.22 0.27 \n", - "9.59 6.32 \n", - "128.35 1.04 \n", - "10000000.0 10000000.0 \n", - "-3.93 0.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.38 0.45 \n", - "10000000.0 10000000.0 \n", - "106.47 1.22 \n", - "-80.9 6.41 \n", - "4.52 1.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.25 1.0 \n", - "-102.22 0.86 \n", - "-0.74 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-61.48 1.42 \n", - "-1.92 4.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.54 0.51 \n", - "10000000.0 10000000.0 \n", - "-5.33 5.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.82 0.68 \n", - "10000000.0 10000000.0 \n", - "-2.26 0.44 \n", - "16.94 1.92 \n", - "10000000.0 10000000.0 \n", - "-6.02 0.56 \n", - "-0.09 0.55 \n", - "-14.27 0.34 \n", - "10000000.0 10000000.0 \n", - "7.06 8.57 \n", - "10000000.0 10000000.0 \n", - "17.22 1.65 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.16 0.62 \n", - "10000000.0 10000000.0 \n", - "None 1.92 \n", - "17.12 1.95 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "74.83 2.38 \n", - "0.17 1.29 \n", - "-3.33 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.9 0.36 \n", - "4.51 2.12 \n", - "10000000.0 10000000.0 \n", - "13.27 0.43 \n", - "10000000.0 10000000.0 \n", - "-21.89 2.16 \n", - "-9.92 1.49 \n", - "-0.19 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-126.6 1.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.18 0.45 \n", - "-102.36 1.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.33 4.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-47.35 1.44 \n", - "10000000.0 10000000.0 \n", - "-12.51 8.61 \n", - "-90.9 2.67 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.18 \n", - "10000000.0 10000000.0 \n", - "-10.46 5.4 \n", - "-3.04 0.42 \n", - "10000000.0 10000000.0 \n", - "None 1.16 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "12.09 3.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-239.77 4.96 \n", - "10000000.0 10000000.0 \n", - "5.44 0.76 \n", - "-4.36 6.1 \n", - "-4.36 6.77 \n", - "10000000.0 10000000.0 \n", - "-7.83 0.58 \n", - "-13.09 1.07 \n", - "9.59 5.93 \n", - "-3.78 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.21 0.53 \n", - "186.28 4.73 \n", - "-3.62 0.45 \n", - "-69.98 4.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-47.22 1.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "14.27 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.29 5.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.53 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "0.13 0.45 \n", - "-12.71 6.09 \n", - "10000000.0 10000000.0 \n", - "-3.28 1.14 \n", - "-21.55 7.4 \n", - "-40.51 2.05 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "-4.36 6.87 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "-3.88 0.56 \n", - "-27.82 7.29 \n", - "0.24 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.79 0.33 \n", - "-11.13 4.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "148.82 2.35 \n", - "10000000.0 10000000.0 \n", - "-6.02 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.09 0.55 \n", - "10000000.0 10000000.0 \n", - "-0.87 5.83 \n", - "-1.56 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.27 1.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.52 0.78 \n", - "-31.41 8.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.18 0.47 \n", - "10000000.0 10000000.0 \n", - "-113.71 0.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.31 0.75 \n", - "-2.24 0.42 \n", - "10000000.0 10000000.0 \n", - "-76.98 6.8 \n", - "-11.13 4.37 \n", - "-26.84 4.75 \n", - "-2.65 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.73 1.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.75 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.13 0.75 \n", - "-2.22 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.7 0.98 \n", - "10000000.0 10000000.0 \n", - "-117.27 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.89 \n", - "-8.52 0.77 \n", - "-26.84 1.03 \n", - "-84.15 5.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "22.02 3.31 \n", - "10000000.0 10000000.0 \n", - "-18.0 5.44 \n", - "10000000.0 10000000.0 \n", - "820.97 10.11 \n", - "10000000.0 10000000.0 \n", - "-16.03 4.87 \n", - "10000000.0 10000000.0 \n", - "-5.33 7.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "-3.61 9.57 \n", - "-10.55 1.0 \n", - "-87.62 0.79 \n", - "10000000.0 10000000.0 \n", - "-18.38 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.75 1.67 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.84 5.01 \n", - "3.97 0.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.68 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 7.46 \n", - "-3.88 0.56 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "9.53 7.91 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "-0.2 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-76.08 10.23 \n", - "24.54 13.06 \n", - "-0.48 4.68 \n", - "10000000.0 10000000.0 \n", - "-6.05 0.57 \n", - "-12.3 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.63 0.26 \n", - "10000000.0 10000000.0 \n", - "-0.46 9.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.61 0.43 \n", - "10000000.0 10000000.0 \n", - "-10.72 8.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.42 0.31 \n", - "1.07 0.53 \n", - "-3.84 0.39 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "-13.21 1.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "146.18 2.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 4.19 \n", - "-4.36 8.53 \n", - "10000000.0 10000000.0 \n", - "-5.21 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.54 4.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.88 \n", - "-6.02 0.56 \n", - "-7.47 2.31 \n", - "-0.21 0.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.07 3.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 5.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.66 0.27 \n", - "44.56 2.39 \n", - "-3.11 8.22 \n", - "-2.84 0.54 \n", - "11.46 0.74 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.86 \n", - "-60.94 0.74 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.56 0.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.04 0.42 \n", - "None 0.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-89.39 6.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.87 \n", - "3.41 8.27 \n", - "-0.86 0.57 \n", - "10000000.0 10000000.0 \n", - "-5.29 2.21 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.04 0.42 \n", - "-34.88 4.38 \n", - "-2.78 1.11 \n", - "-2.62 0.35 \n", - "-28.55 3.33 \n", - "1.16 5.05 \n", - "4.01 2.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.22 1.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "27.68 1.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.46 1.06 \n", - "-34.07 1.63 \n", - "3.51 0.85 \n", - "-5.33 8.18 \n", - "-79.72 2.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "492.52 0.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.11 1.87 \n", - "2.95 0.73 \n", - "-4.36 5.36 \n", - "10000000.0 10000000.0 \n", - "-6.02 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.76 7.08 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "0.39 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.58 0.38 \n", - "10000000.0 10000000.0 \n", - "0.92 5.45 \n", - "-4.36 6.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1864.66 10.65 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.19 2.85 \n", - "-33.3 1.53 \n", - "-33.3 1.53 \n", - "-33.3 1.53 \n", - "-50.36 14.18 \n", - "-36.24 2.84 \n", - "-47.13 1.49 \n", - "-47.13 1.49 \n", - "-47.13 1.49 \n", - "10000000.0 10000000.0 \n", - "-14.84 2.84 \n", - "10000000.0 10000000.0 \n", - "None 2.25 \n", - "None 3.01 \n", - "None 2.04 \n", - "None 2.4 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "None 2.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "56.78 0.76 \n", - "56.77 0.75 \n", - "36.85 7.74 \n", - "36.85 7.75 \n", - "-52.55 7.37 \n", - "-52.55 7.38 \n", - "-37.02 1.96 \n", - "-37.02 1.96 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 7.94 \n", - "-3.11 7.95 \n", - "10000000.0 10000000.0 \n", - "-115.68 1.75 \n", - "-115.68 1.75 \n", - "10000000.0 10000000.0 \n", - "-70.47 15.95 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.34 0.98 \n", - "-14.34 1.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.26 0.49 \n", - "None 0.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "29.47 1.17 \n", - "93.68 1.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.61 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "3.05 5.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.74 0.59 \n", - "10000000.0 10000000.0 \n", - "-244.74 1.51 \n", - "-25.11 1.73 \n", - "-226.68 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-255.54 1.52 \n", - "-214.72 0.77 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-214.79 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.66 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 5.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.03 \n", - "10000000.0 10000000.0 \n", - "None 1.95 \n", - "None 1.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 9.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.03 \n", - "None 4.37 \n", - "None 4.41 \n", - "None 2.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 5.2 \n", - "2.12 0.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 6.45 \n", - "None 7.18 \n", - "None 6.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.41 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.13 0.58 \n", - "-0.06 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.05 1.4 \n", - "-0.9 1.87 \n", - "10000000.0 10000000.0 \n", - "-5.03 0.79 \n", - "-3.33 0.98 \n", - "1.13 0.57 \n", - "10000000.0 10000000.0 \n", - "-0.1 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-121.03 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.87 0.3 \n", - "-40.39 1.05 \n", - "-0.23 0.32 \n", - "-26.85 1.06 \n", - "0.91 1.09 \n", - "10000000.0 10000000.0 \n", - "-9.45 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.63 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.81 5.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.68 0.77 \n", - "6.59 1.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.61 0.41 \n", - "-0.29 0.36 \n", - "-107.91 1.18 \n", - "-4.32 0.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.45 0.42 \n", - "-2.84 0.48 \n", - "-2.62 0.6 \n", - "10000000.0 10000000.0 \n", - "-4.89 0.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.1 0.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "43.75 0.77 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-195.51 2.33 \n", - "4.84 0.44 \n", - "-22.2 1.44 \n", - "-0.28 0.37 \n", - "3.64 0.5 \n", - "0.4 0.28 \n", - "10000000.0 10000000.0 \n", - "-9.42 0.7 \n", - "-9.42 0.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.64 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.97 0.63 \n", - "10000000.0 10000000.0 \n", - "-6.35 4.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.06 0.45 \n", - "-2.68 0.81 \n", - "-2.02 0.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-74.56 1.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "96.63 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.17 1.08 \n", - "-0.74 0.53 \n", - "-118.83 0.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "14.27 0.33 \n", - "14.27 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "40.81 1.05 \n", - "61.89 0.2 \n", - "-20.69 1.43 \n", - "-3.11 3.44 \n", - "None None \n", - "-5.26 1.87 \n", - "3.53 0.32 \n", - "-2.89 5.45 \n", - "10000000.0 10000000.0 \n", - "-0.34 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.39 0.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.89 0.66 \n", - "0.02 0.49 \n", - "0.05 0.47 \n", - "12.31 0.36 \n", - "12.31 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-106.33 1.43 \n", - "-0.73 0.33 \n", - "-0.68 0.51 \n", - "-94.12 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.56 0.39 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.95 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.06 \n", - "1.69 0.45 \n", - "10000000.0 10000000.0 \n", - "-5.81 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.82 0.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "-6.89 0.38 \n", - "10000000.0 10000000.0 \n", - "-106.19 0.97 \n", - "-107.57 1.44 \n", - "-98.05 0.82 \n", - "-98.05 0.82 \n", - "0.28 0.38 \n", - "6.55 1.89 \n", - "-50.72 1.03 \n", - "-2.87 0.3 \n", - "0.34 0.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.45 4.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-40.99 5.86 \n", - "-54.24 5.78 \n", - "-54.24 5.78 \n", - "-28.5 6.21 \n", - "-45.42 5.88 \n", - "10000000.0 10000000.0 \n", - "-239.47 14.16 \n", - "-94.13 0.75 \n", - "-104.63 0.81 \n", - "-8.68 0.26 \n", - "-40.16 0.43 \n", - "10000000.0 10000000.0 \n", - "-15.54 0.35 \n", - "-0.28 0.37 \n", - "-0.28 0.37 \n", - "-0.28 0.37 \n", - "-0.28 0.37 \n", - "-0.28 0.37 \n", - "-0.28 0.37 \n", - "-0.28 0.37 \n", - "-0.28 0.37 \n", - "-83.06 1.82 \n", - "-83.06 1.82 \n", - "-83.06 1.82 \n", - "-83.06 1.82 \n", - "-10.55 1.0 \n", - "-9.08 1.01 \n", - "-9.08 1.01 \n", - "-0.28 0.37 \n", - "-83.06 1.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.79 1.4 \n", - "-3.07 0.78 \n", - "-3.07 0.78 \n", - "7.83 0.58 \n", - "7.85 0.58 \n", - "0.88 0.38 \n", - "-0.28 0.37 \n", - "15.54 0.35 \n", - "-198.76 1.53 \n", - "-47.89 7.61 \n", - "10000000.0 10000000.0 \n", - "-4.88 0.53 \n", - "-4.88 0.53 \n", - "-4.88 0.53 \n", - "-40.16 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-105.97 0.91 \n", - "-20.23 2.27 \n", - "7.82 0.58 \n", - "-2.07 0.3 \n", - "10000000.0 10000000.0 \n", - "-33.42 3.27 \n", - "-27.51 1.03 \n", - "-1.79 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-82.41 5.61 \n", - "0.71 0.38 \n", - "-96.99 4.37 \n", - "0.71 0.38 \n", - "-105.99 0.91 \n", - "-0.83 0.86 \n", - "-4.36 7.85 \n", - "-95.07 0.74 \n", - "-105.09 0.81 \n", - "-94.13 0.75 \n", - "-95.07 0.74 \n", - "-105.1 0.81 \n", - "-4.36 7.86 \n", - "-63.94 3.81 \n", - "19.16 7.97 \n", - "-70.21 7.24 \n", - "-5.33 7.44 \n", - "-166.81 3.17 \n", - "-20.64 9.92 \n", - "10000000.0 10000000.0 \n", - "-54.35 0.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "38.07 0.78 \n", - "-25.6 5.74 \n", - "-66.88 12.19 \n", - "-49.48 0.65 \n", - "-49.48 0.65 \n", - "-4.36 6.06 \n", - "-1.7 5.54 \n", - "10000000.0 10000000.0 \n", - "-64.62 1.6 \n", - "-71.85 0.2 \n", - "-108.36 0.3 \n", - "-102.06 0.86 \n", - "-16.73 0.8 \n", - "-102.35 1.16 \n", - "10000000.0 10000000.0 \n", - "-3.61 7.23 \n", - "-4.36 7.22 \n", - "-10.1 3.32 \n", - "-222.81 1.53 \n", - "6.48 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-30.56 1.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.53 9.27 \n", - "2.48 0.5 \n", - "10000000.0 10000000.0 \n", - "-14.03 11.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.74 1.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "-4.36 9.55 \n", - "10000000.0 10000000.0 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "-23.07 1.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.92 13.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.15 0.85 \n", - "10000000.0 10000000.0 \n", - "31.99 2.33 \n", - "10000000.0 10000000.0 \n", - "-90.11 1.59 \n", - "-90.11 1.84 \n", - "10000000.0 10000000.0 \n", - "54.31 3.37 \n", - "2.54 7.43 \n", - "-114.37 1.15 \n", - "-0.68 8.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.48 1.04 \n", - "-79.0 2.98 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.81 5.16 \n", - "10000000.0 10000000.0 \n", - "-1.7 5.27 \n", - "-13.18 1.07 \n", - "-10.01 0.3 \n", - "10000000.0 10000000.0 \n", - "0.52 0.76 \n", - "0.52 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.54 4.38 \n", - "-5.9 0.63 \n", - "83.3 3.46 \n", - "-19.65 3.45 \n", - "-36.79 1.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.09 0.55 \n", - "1.27 0.59 \n", - "10.96 0.19 \n", - "-10.46 5.07 \n", - "-0.45 0.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.49 1.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.41 0.67 \n", - "-33.58 6.25 \n", - "70.98 0.52 \n", - "14.45 4.15 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "7.86 1.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.79 0.33 \n", - "0.35 0.61 \n", - "-69.98 1.15 \n", - "-0.64 0.33 \n", - "-0.37 0.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-126.88 4.94 \n", - "10000000.0 10000000.0 \n", - "-1.91 0.86 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-108.62 1.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.23 2.23 \n", - "0.31 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.86 1.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.57 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-316.94 2.26 \n", - "-15.4 3.48 \n", - "None 4.5 \n", - "-130.4 8.53 \n", - "-130.4 8.53 \n", - "None None \n", - "-105.96 0.91 \n", - "-105.96 0.91 \n", - "-83.06 1.82 \n", - "-97.2 0.8 \n", - "-1.87 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.55 0.51 \n", - "14.63 6.24 \n", - "10000000.0 10000000.0 \n", - "-26.41 2.13 \n", - "-191.66 12.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.39 8.31 \n", - "-9.17 5.63 \n", - "-108.28 2.38 \n", - "-16.5 2.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.87 0.66 \n", - "10000000.0 10000000.0 \n", - "-1.98 0.65 \n", - "-1.98 0.65 \n", - "-0.96 1.47 \n", - "-0.96 1.47 \n", - "-2.65 0.42 \n", - "-2.28 0.75 \n", - "2.81 0.44 \n", - "2.81 0.44 \n", - "-2.67 0.69 \n", - "-2.63 0.42 \n", - "-2.15 0.18 \n", - "-2.15 0.18 \n", - "-1.42 0.97 \n", - "-1.42 0.97 \n", - "10000000.0 10000000.0 \n", - "1.85 4.92 \n", - "-4.78 0.49 \n", - "0.61 1.02 \n", - "10000000.0 10000000.0 \n", - "8.27 0.9 \n", - "1.11 0.92 \n", - "1.11 0.92 \n", - "-1.43 0.41 \n", - "-2.99 0.48 \n", - "-2.99 0.48 \n", - "-32.0 1.07 \n", - "-32.0 1.07 \n", - "-3.2 0.46 \n", - "-4.46 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.63 0.42 \n", - "-0.21 0.17 \n", - "-6.4 0.52 \n", - "-6.4 0.52 \n", - "-6.16 0.86 \n", - "-6.16 0.86 \n", - "-8.31 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.17 0.54 \n", - "1.95 0.63 \n", - "1.95 0.63 \n", - "-3.84 0.59 \n", - "-3.84 0.59 \n", - "-3.11 0.6 \n", - "-16.31 2.37 \n", - "-0.42 0.76 \n", - "-0.42 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.44 1.27 \n", - "1.11 0.92 \n", - "1.11 0.92 \n", - "-3.52 0.58 \n", - "-3.83 0.58 \n", - "-12.71 0.58 \n", - "1.17 0.61 \n", - "-0.6 0.68 \n", - "-4.05 0.56 \n", - "-3.99 0.64 \n", - "-3.64 0.43 \n", - "-5.19 0.46 \n", - "-5.31 0.66 \n", - "-5.31 0.66 \n", - "-5.31 0.66 \n", - "4.78 0.63 \n", - "4.47 0.63 \n", - "-2.72 0.57 \n", - "-0.14 0.8 \n", - "-0.45 0.8 \n", - "-2.47 0.55 \n", - "-2.79 0.55 \n", - "-2.79 0.55 \n", - "0.93 0.67 \n", - "0.62 0.67 \n", - "-2.81 0.3 \n", - "-4.39 0.71 \n", - "-4.39 0.71 \n", - "-3.67 0.46 \n", - "-0.21 0.17 \n", - "-0.21 0.17 \n", - "-0.21 0.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.87 1.24 \n", - "-3.87 1.24 \n", - "10.7 1.02 \n", - "11.79 1.1 \n", - "-6.83 1.02 \n", - "-4.46 0.42 \n", - "1.83 0.5 \n", - "2.18 0.59 \n", - "1.93 0.83 \n", - "1.93 0.83 \n", - "-6.25 0.68 \n", - "-6.29 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.75 0.59 \n", - "-9.24 0.51 \n", - "0.19 0.49 \n", - "-2.17 0.33 \n", - "-0.25 0.79 \n", - "-7.7 0.44 \n", - "-8.05 0.6 \n", - "1.04 0.4 \n", - "-3.38 0.48 \n", - "4.8 0.55 \n", - "-8.36 0.35 \n", - "-6.6 0.58 \n", - "-1.7 0.41 \n", - "-2.95 0.37 \n", - "-3.01 0.4 \n", - "-4.26 0.59 \n", - "-2.47 0.5 \n", - "-3.72 0.33 \n", - "-3.01 0.4 \n", - "-4.27 0.59 \n", - "-3.62 0.46 \n", - "-4.87 0.59 \n", - "-2.47 0.51 \n", - "-3.72 0.34 \n", - "-39.45 1.05 \n", - "-40.71 1.14 \n", - "-26.49 2.26 \n", - "-26.49 2.26 \n", - "-2.67 0.69 \n", - "-2.16 0.52 \n", - "-2.16 0.52 \n", - "-0.76 0.87 \n", - "0.5 1.05 \n", - "-1.75 0.57 \n", - "-0.5 0.73 \n", - "-12.96 3.97 \n", - "-12.96 3.97 \n", - "-2.51 0.57 \n", - "-3.39 0.42 \n", - "-3.7 0.42 \n", - "-3.55 0.23 \n", - "-95.5 1.92 \n", - "-1.98 0.47 \n", - "-0.72 0.57 \n", - "-2.41 0.44 \n", - "-2.61 0.5 \n", - "-8.39 0.32 \n", - "-40.11 1.06 \n", - "-4.89 0.43 \n", - "-3.86 0.56 \n", - "-28.67 0.53 \n", - "-0.27 0.38 \n", - "-4.76 0.5 \n", - "5.29 1.0 \n", - "-5.54 1.2 \n", - "-10.41 0.87 \n", - "0.85 0.65 \n", - "-7.79 0.66 \n", - "-0.1 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.13 0.56 \n", - "2.13 0.56 \n", - "-2.81 0.3 \n", - "-2.81 0.3 \n", - "-3.67 0.46 \n", - "-3.67 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.16 0.52 \n", - "-3.55 0.23 \n", - "-3.55 0.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.62 0.45 \n", - "-3.62 0.45 \n", - "-3.62 0.46 \n", - "-3.62 0.46 \n", - "1.17 0.54 \n", - "1.17 0.54 \n", - "3.48 0.52 \n", - "3.48 0.52 \n", - "46.99 0.4 \n", - "46.99 0.4 \n", - "-2.81 0.3 \n", - "-2.45 0.73 \n", - "-35.35 1.1 \n", - "-34.99 1.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.53 1.22 \n", - "-2.89 0.79 \n", - "None None \n", - "0.36 0.74 \n", - "-2.63 0.42 \n", - "-2.63 0.42 \n", - "-1.43 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.94 0.27 \n", - "-0.04 0.37 \n", - "-5.68 0.55 \n", - "-5.05 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.92 0.47 \n", - "-4.38 1.07 \n", - "2.86 0.44 \n", - "-0.94 0.88 \n", - "-0.9 0.51 \n", - "-0.69 0.44 \n", - "-0.65 0.64 \n", - "-3.84 0.54 \n", - "0.35 0.57 \n", - "-4.06 0.7 \n", - "-3.86 0.48 \n", - "10000000.0 10000000.0 \n", - "-1.23 0.64 \n", - "-1.3 0.43 \n", - "-1.3 0.43 \n", - "-3.62 0.45 \n", - "-3.62 0.45 \n", - "4.57 0.34 \n", - "4.57 0.34 \n", - "4.57 0.34 \n", - "4.57 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.2 0.32 \n", - "0.2 0.32 \n", - "-46.36 0.37 \n", - "-46.36 0.37 \n", - "-4.57 0.51 \n", - "-2.65 0.46 \n", - "-3.51 0.46 \n", - "-64.18 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "13.61 0.44 \n", - "13.67 0.56 \n", - "-2.58 0.3 \n", - "-2.64 0.46 \n", - "-3.61 5.41 \n", - "-3.61 5.41 \n", - "-3.61 5.41 \n", - "-3.61 5.41 \n", - "-3.61 5.41 \n", - "-3.61 5.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.92 0.44 \n", - "0.98 0.55 \n", - "-0.21 0.17 \n", - "1.6 0.57 \n", - "-2.3 0.64 \n", - "1.81 5.07 \n", - "1.81 5.07 \n", - "10000000.0 10000000.0 \n", - "3.72 0.4 \n", - "-3.48 0.52 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "-0.14 0.61 \n", - "-0.14 0.61 \n", - "-0.72 0.53 \n", - "-0.72 0.53 \n", - "-2.04 0.72 \n", - "-39.75 1.06 \n", - "-14.28 2.42 \n", - "-2.91 0.79 \n", - "-2.78 0.74 \n", - "9.74 0.47 \n", - "-1.43 0.33 \n", - "-8.12 0.28 \n", - "-136.02 0.35 \n", - "0.41 0.26 \n", - "5.68 0.55 \n", - "-12.12 1.46 \n", - "-9.7 0.8 \n", - "-0.02 0.49 \n", - "-1.62 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 8.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "108.57 6.19 \n", - "10000000.0 10000000.0 \n", - "-3.13 0.52 \n", - "-4.16 0.87 \n", - "-6.02 1.01 \n", - "-5.7 1.01 \n", - "-3.67 2.95 \n", - "-3.67 2.97 \n", - "-211.46 0.44 \n", - "10000000.0 10000000.0 \n", - "6.38 0.36 \n", - "10000000.0 10000000.0 \n", - "-2.72 0.45 \n", - "0.69 0.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.56 0.3 \n", - "-9.56 0.3 \n", - "5.61 0.41 \n", - "-0.29 0.36 \n", - "0.35 0.74 \n", - "-107.91 1.18 \n", - "-108.54 1.28 \n", - "-4.32 0.83 \n", - "-3.68 0.96 \n", - "-13.28 2.3 \n", - "-13.28 2.3 \n", - "-3.11 4.62 \n", - "-3.11 4.62 \n", - "0.27 0.22 \n", - "0.27 0.22 \n", - "0.63 0.26 \n", - "0.63 0.26 \n", - "2.47 0.51 \n", - "-3.11 7.4 \n", - "-3.11 7.4 \n", - "6.38 0.36 \n", - "4.89 0.25 \n", - "7.93 0.99 \n", - "7.93 0.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.41 0.52 \n", - "-1.7 8.11 \n", - "3.52 0.6 \n", - "3.52 0.6 \n", - "-7.26 0.6 \n", - "-6.37 0.7 \n", - "10000000.0 10000000.0 \n", - "-0.37 0.39 \n", - "10000000.0 10000000.0 \n", - "43.75 0.77 \n", - "41.74 1.0 \n", - "0.5 2.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-195.51 2.33 \n", - "-195.51 2.33 \n", - "4.84 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-125.73 0.57 \n", - "-126.08 0.56 \n", - "23.26 1.22 \n", - "0.28 0.48 \n", - "1.53 0.71 \n", - "-0.28 0.37 \n", - "-3.54 0.82 \n", - "3.11 8.01 \n", - "3.11 8.01 \n", - "10000000.0 10000000.0 \n", - "3.59 0.5 \n", - "3.59 0.5 \n", - "10000000.0 10000000.0 \n", - "-3.28 1.09 \n", - "-0.97 0.63 \n", - "-14.55 1.34 \n", - "-1.7 6.17 \n", - "8.45 0.85 \n", - "8.45 0.85 \n", - "-5.81 0.35 \n", - "10000000.0 10000000.0 \n", - "-2.72 1.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.92 0.88 \n", - "4.01 1.06 \n", - "3.05 5.07 \n", - "10000000.0 10000000.0 \n", - "6.7 0.98 \n", - "6.7 0.98 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.15 0.47 \n", - "0.11 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.43 6.79 \n", - "-5.43 6.79 \n", - "-3.11 8.07 \n", - "-3.11 8.07 \n", - "-109.81 1.17 \n", - "-1.47 0.43 \n", - "-2.63 0.42 \n", - "-2.63 0.42 \n", - "2.55 5.03 \n", - "10000000.0 10000000.0 \n", - "-2.81 0.3 \n", - "-5.26 1.87 \n", - "-0.63 1.35 \n", - "-1.15 0.64 \n", - "-0.06 0.8 \n", - "6.7 0.98 \n", - "6.7 0.98 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-54.04 6.75 \n", - "-54.04 6.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "59.08 0.45 \n", - "59.08 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.33 0.13 \n", - "-0.33 0.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.58 0.77 \n", - "-4.58 0.77 \n", - "-1.99 0.44 \n", - "-1.99 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "-8.44 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.68 2.08 \n", - "-17.68 2.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.77 0.42 \n", - "-3.88 0.56 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "9.66 0.82 \n", - "9.66 0.82 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.92 1.11 \n", - "-11.92 1.11 \n", - "1.04 0.46 \n", - "-4.32 0.3 \n", - "-1.84 0.3 \n", - "4.44 0.24 \n", - "-1.18 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.69 0.98 \n", - "6.69 0.98 \n", - "-2.25 0.46 \n", - "-1.08 0.78 \n", - "-1.08 0.78 \n", - "4.89 0.24 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.17 1.43 \n", - "-0.79 13.23 \n", - "-0.79 13.23 \n", - "-3.11 10.14 \n", - "-3.11 10.14 \n", - "-4.36 5.7 \n", - "-2.6 0.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.82 0.5 \n", - "-10.09 1.07 \n", - "-4.15 1.26 \n", - "-0.81 0.22 \n", - "-3.11 5.68 \n", - "10000000.0 10000000.0 \n", - "56.69 0.5 \n", - "-6.26 1.71 \n", - "4.13 0.36 \n", - "4.13 0.36 \n", - "-28.95 1.1 \n", - "-28.95 1.1 \n", - "10000000.0 10000000.0 \n", - "5.36 0.85 \n", - "5.04 0.85 \n", - "-120.27 1.5 \n", - "133.58 1.37 \n", - "133.59 1.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.83 0.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.83 0.5 \n", - "1.83 0.5 \n", - "-6.25 0.68 \n", - "10000000.0 10000000.0 \n", - "-3.06 0.6 \n", - "-3.06 0.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.23 0.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.45 0.69 \n", - "-5.75 0.67 \n", - "-2.63 0.42 \n", - "-2.53 1.22 \n", - "-2.53 1.22 \n", - "-3.45 0.69 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-22.74 4.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-61.96 8.03 \n", - "-51.63 7.98 \n", - "-292.88 2.27 \n", - "-35.49 7.45 \n", - "-47.55 6.43 \n", - "-37.21 6.32 \n", - "-53.41 7.63 \n", - "-41.01 7.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.82 2.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.83 1.06 \n", - "-5.1 13.74 \n", - "-95.07 0.74 \n", - "-20.8 3.0 \n", - "71.74 0.83 \n", - "-9.18 1.43 \n", - "0.4 0.66 \n", - "-0.61 0.36 \n", - "-6.14 0.96 \n", - "0.37 3.29 \n", - "0.37 3.29 \n", - "0.37 3.29 \n", - "0.37 3.29 \n", - "-20.24 1.89 \n", - "-20.24 1.89 \n", - "-85.45 6.92 \n", - "-85.45 6.92 \n", - "10000000.0 10000000.0 \n", - "-5.31 0.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.41 0.52 \n", - "-0.89 0.89 \n", - "2.77 0.42 \n", - "2.77 0.42 \n", - "3.96 0.41 \n", - "-0.89 0.9 \n", - "-1.42 0.41 \n", - "10000000.0 10000000.0 \n", - "2.86 0.44 \n", - "2.86 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.14 1.75 \n", - "-15.82 1.75 \n", - "-109.81 1.17 \n", - "-62.45 0.98 \n", - "-72.98 1.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-121.16 3.16 \n", - "-105.97 0.91 \n", - "-2.24 0.42 \n", - "293.01 1.02 \n", - "10.3 11.47 \n", - "14.27 0.34 \n", - "-1.98 0.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.99 0.31 \n", - "-1.52 8.59 \n", - "1.99 0.41 \n", - "-16.96 1.92 \n", - "-96.19 10.57 \n", - "-34.83 8.59 \n", - "-34.83 8.57 \n", - "-96.19 10.53 \n", - "2.22 0.33 \n", - "10000000.0 10000000.0 \n", - "2.81 0.97 \n", - "2.81 0.97 \n", - "3.94 0.27 \n", - "-20.6 0.65 \n", - "-11.13 4.91 \n", - "-95.07 0.74 \n", - "-95.07 0.74 \n", - "15.54 0.35 \n", - "-15.54 0.35 \n", - "10.74 1.9 \n", - "10000000.0 10000000.0 \n", - "-96.19 10.13 \n", - "-2.14 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-43.68 3.12 \n", - "-4.16 2.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.73 0.45 \n", - "-2.73 0.45 \n", - "-0.73 4.41 \n", - "-2.73 0.45 \n", - "4.67 0.93 \n", - "4.67 1.06 \n", - "4.36 0.93 \n", - "4.36 1.06 \n", - "7.73 0.98 \n", - "6.52 0.5 \n", - "6.7 0.98 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.38 1.37 \n", - "10000000.0 10000000.0 \n", - "-0.09 0.55 \n", - "10000000.0 10000000.0 \n", - "-2.08 1.44 \n", - "25.22 2.41 \n", - "-18.98 2.28 \n", - "-18.98 2.28 \n", - "-3.62 0.45 \n", - "-4.88 0.59 \n", - "-19.42 5.36 \n", - "-0.76 0.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.7 0.96 \n", - "-15.54 1.5 \n", - "4.38 0.71 \n", - "0.64 0.48 \n", - "10000000.0 10000000.0 \n", - "140.95 1.99 \n", - "-24.71 3.95 \n", - "102.93 4.23 \n", - "0.61 None \n", - "10000000.0 10000000.0 \n", - "16.14 0.35 \n", - "-3.68 2.32 \n", - "-3.68 2.32 \n", - "-3.68 2.32 \n", - "-3.68 2.32 \n", - "-17.8 3.86 \n", - "10000000.0 10000000.0 \n", - "-71.66 1.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.01 0.48 \n", - "-34.23 1.66 \n", - "-33.91 1.66 \n", - "-2.72 0.31 \n", - "-65.09 1.52 \n", - "4.51 0.49 \n", - "7.65 1.04 \n", - "-10.37 0.2 \n", - "-10.37 0.2 \n", - "-0.18 0.36 \n", - "-2.8 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.22 8.36 \n", - "10000000.0 10000000.0 \n", - "-225.36 3.16 \n", - "-4.36 6.01 \n", - "-4.36 6.01 \n", - "-6.74 5.85 \n", - "-3.44 1.97 \n", - "-3.47 1.97 \n", - "14.42 1.07 \n", - "14.42 1.07 \n", - "14.42 1.07 \n", - "-49.25 0.53 \n", - "-49.25 0.53 \n", - "-24.83 3.7 \n", - "-24.83 3.98 \n", - "3.59 1.62 \n", - "None None \n", - "None None \n", - "3.65 1.62 \n", - "-0.38 4.17 \n", - "-2.14 0.18 \n", - "-2.14 0.18 \n", - "5.12 4.88 \n", - "5.12 4.96 \n", - "-18.4 5.33 \n", - "5.12 4.98 \n", - "-13.23 2.44 \n", - "3.68 1.62 \n", - "5.12 4.95 \n", - "-28.69 2.05 \n", - "None 10.22 \n", - "-15.54 0.35 \n", - "-38.35 0.11 \n", - "-9.69 1.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.23 0.44 \n", - "-101.7 1.13 \n", - "-21.27 0.09 \n", - "-19.11 0.66 \n", - "-52.7 0.65 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.83 0.28 \n", - "4.44 0.24 \n", - "3.74 0.81 \n", - "20.48 1.85 \n", - "47.21 1.43 \n", - "193.86 1.76 \n", - "133.32 1.51 \n", - "215.02 1.78 \n", - "215.01 1.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.19 0.78 \n", - "3.71 0.78 \n", - "-0.29 0.37 \n", - "-21.37 5.1 \n", - "-4.16 0.85 \n", - "-3.05 0.44 \n", - "-26.84 1.03 \n", - "-4.24 0.71 \n", - "-3.17 0.6 \n", - "-6.16 0.3 \n", - "-4.3 0.85 \n", - "-3.71 0.44 \n", - "-26.84 1.03 \n", - "-5.04 0.71 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.44 0.64 \n", - "None None \n", - "-0.28 0.37 \n", - "-0.28 0.37 \n", - "16.14 0.35 \n", - "70.98 0.52 \n", - "14.45 4.15 \n", - "40.48 0.31 \n", - "7.85 0.58 \n", - "-23.57 10.5 \n", - "3.42 0.46 \n", - "10000000.0 10000000.0 \n", - "-2.4 0.54 \n", - "-2.4 0.54 \n", - "1.2 1.06 \n", - "10000000.0 10000000.0 \n", - "-0.64 0.33 \n", - "-0.64 0.33 \n", - "-0.64 0.33 \n", - "-4.36 6.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.55 1.0 \n", - "-22.11 2.14 \n", - "-147.31 1.59 \n", - "69.67 2.83 \n", - "-147.42 1.59 \n", - "-4.36 8.67 \n", - "-259.16 7.11 \n", - "-2.89 1.5 \n", - "-40.48 0.31 \n", - "1.23 9.87 \n", - "30.5 0.44 \n", - "-102.93 7.48 \n", - "0.63 0.32 \n", - "-0.69 0.17 \n", - "55.65 10.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.29 1.0 \n", - "6.7 0.98 \n", - "6.7 0.98 \n", - "-18.75 0.66 \n", - "40.35 0.61 \n", - "-94.13 0.75 \n", - "-108.3 2.19 \n", - "-38.35 0.11 \n", - "-56.43 1.01 \n", - "-1.71 1.66 \n", - "-12.96 7.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "81.41 1.99 \n", - "3.85 1.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.72 1.43 \n", - "-21.63 1.5 \n", - "-21.19 1.48 \n", - "-8.21 6.24 \n", - "-8.21 6.23 \n", - "-3.09 1.69 \n", - "-3.09 1.63 \n", - "-33.22 1.68 \n", - "-3.9 0.3 \n", - "-2.23 0.46 \n", - "-2.54 0.46 \n", - "43.54 0.85 \n", - "64.47 0.38 \n", - "2107.76 7.21 \n", - "-0.47 0.41 \n", - "12.6 0.48 \n", - "-18.78 0.79 \n", - "-4.21 0.71 \n", - "26.98 6.85 \n", - "-10.33 0.91 \n", - "-2.35 0.71 \n", - "204.59 0.27 \n", - "204.27 0.51 \n", - "-38.36 0.11 \n", - "-11.12 0.19 \n", - "-45.23 0.45 \n", - "-13.88 0.8 \n", - "-2.21 0.53 \n", - "-6.73 1.05 \n", - "-37.41 0.17 \n", - "-10.37 0.2 \n", - "-61.47 0.2 \n", - "-40.99 5.86 \n", - "-37.41 0.17 \n", - "-10.37 0.2 \n", - "-61.47 0.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-40.99 5.86 \n", - "10000000.0 10000000.0 \n", - "-53.72 5.96 \n", - "-40.99 5.86 \n", - "-94.13 0.75 \n", - "-62.43 4.68 \n", - "-4.89 1.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.33 1.11 \n", - "-68.66 7.04 \n", - "-68.66 7.03 \n", - "-15.05 7.22 \n", - "-15.05 7.21 \n", - "-92.17 3.95 \n", - "10000000.0 10000000.0 \n", - "-26.06 3.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.99 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-20.03 1.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.81 1.36 \n", - "10000000.0 10000000.0 \n", - "-2.55 0.35 \n", - "-48.38 3.99 \n", - "-8.3 1.18 \n", - "-3.35 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.62 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.53 9.3 \n", - "10000000.0 10000000.0 \n", - "-4.07 0.85 \n", - "10000000.0 10000000.0 \n", - "-94.86 3.94 \n", - "None 4.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-86.72 3.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.14 1.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.14 1.0 \n", - "10000000.0 10000000.0 \n", - "3.91 2.16 \n", - "10000000.0 10000000.0 \n", - "-8.77 0.66 \n", - "10000000.0 10000000.0 \n", - "-49.17 0.53 \n", - "-20.72 2.38 \n", - "10000000.0 10000000.0 \n", - "-3.61 8.26 \n", - "-5.42 1.13 \n", - "-3.77 0.81 \n", - "10000000.0 10000000.0 \n", - "3.49 2.37 \n", - "10000000.0 10000000.0 \n", - "-0.29 0.61 \n", - "-1.7 6.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.86 1.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.13 4.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.12 0.75 \n", - "6.3 1.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-35.34 5.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.03 0.43 \n", - "-97.2 0.8 \n", - "10000000.0 10000000.0 \n", - "-109.04 5.01 \n", - "6.33 1.74 \n", - "-80.62 0.75 \n", - "10000000.0 10000000.0 \n", - "-0.99 0.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "20.58 2.37 \n", - "10000000.0 10000000.0 \n", - "4.33 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.67 4.83 \n", - "10000000.0 10000000.0 \n", - "-31.72 1.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.78 0.66 \n", - "3.77 2.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.09 1.56 \n", - "10000000.0 10000000.0 \n", - "-12.9 2.28 \n", - "13.48 0.49 \n", - "-9.69 1.99 \n", - "-3.04 0.42 \n", - "0.63 0.26 \n", - "-5.5 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.18 0.45 \n", - "-6.15 0.82 \n", - "5.82 1.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.52 1.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 28.12 \n", - "10000000.0 10000000.0 \n", - "-4.36 7.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 7.95 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.86 0.48 \n", - "10000000.0 10000000.0 \n", - "-27.02 3.12 \n", - "-4.42 1.64 \n", - "2.3 7.39 \n", - "-3.59 4.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.16 1.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-27.02 0.57 \n", - "-4.36 5.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.48 0.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.74 1.91 \n", - "-13.16 1.07 \n", - "-11.35 2.18 \n", - "-4.36 5.91 \n", - "-3.11 13.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-25.79 2.94 \n", - "10000000.0 10000000.0 \n", - "-4.52 1.9 \n", - "-5.66 0.66 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.84 1.41 \n", - "10000000.0 10000000.0 \n", - "-99.07 1.14 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "-11.13 4.7 \n", - "-0.49 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "62.28 4.19 \n", - "None 1.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-112.01 0.91 \n", - "-0.28 0.37 \n", - "-105.05 1.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.12 5.08 \n", - "None 13.85 \n", - "10000000.0 10000000.0 \n", - "-0.41 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.2 1.0 \n", - "10000000.0 10000000.0 \n", - "-29.01 2.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.17 1.3 \n", - "10000000.0 10000000.0 \n", - "-17.74 0.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 10.23 \n", - "-9.79 1.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "4.44 0.24 \n", - "27.79 5.85 \n", - "-18.46 0.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 14.05 \n", - "10000000.0 10000000.0 \n", - "-3.88 0.56 \n", - "10000000.0 10000000.0 \n", - "-25.2 1.43 \n", - "10000000.0 10000000.0 \n", - "1.04 0.89 \n", - "-6.74 5.21 \n", - "-122.97 1.24 \n", - "-31.09 1.08 \n", - "4.89 0.24 \n", - "44.56 2.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.21 5.63 \n", - "10000000.0 10000000.0 \n", - "4.63 1.27 \n", - "10000000.0 10000000.0 \n", - "None 8.29 \n", - "-0.05 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "24.2 107.18 \n", - "-14.03 6.65 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.44 4.34 \n", - "0.32 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.01 1.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-61.18 1.37 \n", - "-5.96 0.32 \n", - "10000000.0 10000000.0 \n", - "-3.34 0.74 \n", - "-101.03 1.21 \n", - "10000000.0 10000000.0 \n", - "-1.83 2.92 \n", - "10000000.0 10000000.0 \n", - "-8.12 2.13 \n", - "-4.36 6.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.87 0.46 \n", - "-1.76 2.2 \n", - "-51.7 4.72 \n", - "10000000.0 10000000.0 \n", - "None 1.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.82 2.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.13 1.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 19.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.31 0.8 \n", - "-0.49 0.41 \n", - "-13.34 1.07 \n", - "10000000.0 10000000.0 \n", - "6.34 0.54 \n", - "10000000.0 10000000.0 \n", - "-13.1 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.6 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.69 0.57 \n", - "None 1.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 11.91 \n", - "-16.61 1.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "215.42 2.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-138.57 1.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.2 1.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.77 0.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.57 0.47 \n", - "10000000.0 10000000.0 \n", - "-32.42 2.39 \n", - "-92.29 1.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-45.42 10.4 \n", - "-4.53 0.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.04 0.42 \n", - "-11.32 0.62 \n", - "-81.93 6.95 \n", - "10000000.0 10000000.0 \n", - "-5.26 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.99 0.53 \n", - "-14.2 5.66 \n", - "10000000.0 10000000.0 \n", - "-10.82 0.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.94 0.8 \n", - "-8.66 8.04 \n", - "0.38 0.45 \n", - "-1.5 0.34 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.32 0.73 \n", - "-34.78 7.44 \n", - "-21.52 3.79 \n", - "-14.03 5.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.11 0.62 \n", - "-0.46 3.3 \n", - "0.18 0.41 \n", - "-4.09 6.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.14 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.48 0.24 \n", - "1.7 0.53 \n", - "-112.12 4.87 \n", - "None 2.19 \n", - "-4.64 3.32 \n", - "10000000.0 10000000.0 \n", - "131.63 0.85 \n", - "6.37 0.77 \n", - "10000000.0 10000000.0 \n", - "-3.33 0.3 \n", - "4.9 0.51 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.81 \n", - "10000000.0 10000000.0 \n", - "-2.03 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.17 0.45 \n", - "2.35 1.4 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.81 \n", - "-8.37 0.76 \n", - "10000000.0 10000000.0 \n", - "-19.72 1.19 \n", - "10000000.0 10000000.0 \n", - "None 16.22 \n", - "-7.55 0.58 \n", - "-124.64 1.75 \n", - "-6.74 6.73 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.59 5.94 \n", - "10000000.0 10000000.0 \n", - "None 1.63 \n", - "-105.96 0.91 \n", - "10000000.0 10000000.0 \n", - "-34.54 1.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.17 0.52 \n", - "-160.47 9.01 \n", - "10000000.0 10000000.0 \n", - "9.53 8.84 \n", - "10000000.0 10000000.0 \n", - "-4.59 1.28 \n", - "-107.24 10.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-70.71 4.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.22 0.51 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "-26.84 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "572.9 4.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-23.57 10.0 \n", - "-4.36 6.1 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.04 0.55 \n", - "-9.78 1.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "461.13 0.57 \n", - "-0.46 1.81 \n", - "3.76 7.93 \n", - "-6.07 0.85 \n", - "-6.58 3.95 \n", - "-11.65 7.95 \n", - "-26.68 4.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.67 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-30.04 2.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.97 0.42 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "0.01 5.56 \n", - "10000000.0 10000000.0 \n", - "-16.19 1.41 \n", - "10000000.0 10000000.0 \n", - "4.52 1.9 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "-3.91 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 11.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.51 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.13 0.71 \n", - "639.38 7.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.81 4.05 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-116.99 2.25 \n", - "10000000.0 10000000.0 \n", - "-100.75 7.98 \n", - "-15.4 3.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-43.91 1.77 \n", - "10000000.0 10000000.0 \n", - "-1.7 10.73 \n", - "10000000.0 10000000.0 \n", - "-99.51 8.1 \n", - "10000000.0 10000000.0 \n", - "None 1.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.61 0.53 \n", - "10000000.0 10000000.0 \n", - "-14.27 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 11.82 \n", - "-1.83 1.45 \n", - "-104.62 1.45 \n", - "-6.93 5.81 \n", - "10000000.0 10000000.0 \n", - "272.17 0.62 \n", - "-203.29 1.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.47 0.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 4.4 \n", - "10000000.0 10000000.0 \n", - "1.39 5.27 \n", - "10000000.0 10000000.0 \n", - "-46.45 2.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-72.34 0.88 \n", - "-77.89 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-35.59 1.14 \n", - "0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "None 2.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "17.62 0.24 \n", - "-28.05 0.83 \n", - "4.81 1.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "17.46 4.43 \n", - "-0.9 0.42 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.25 0.42 \n", - "-14.03 6.87 \n", - "-5.97 0.42 \n", - "-3.95 0.95 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-114.38 1.15 \n", - "-2.67 11.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "-5.67 0.95 \n", - "-370.68 18.6 \n", - "10000000.0 10000000.0 \n", - "27.59 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.81 1.35 \n", - "-273.69 44.3 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 11.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.74 0.66 \n", - "10000000.0 10000000.0 \n", - "-123.88 2.46 \n", - "-9.05 1.75 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.96 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.75 8.21 \n", - "-101.64 0.94 \n", - "10000000.0 10000000.0 \n", - "-10.46 5.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "11.92 1.11 \n", - "10000000.0 10000000.0 \n", - "-1.66 2.0 \n", - "-118.19 0.76 \n", - "10000000.0 10000000.0 \n", - "7.22 2.86 \n", - "-6.83 3.39 \n", - "-4.36 6.38 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.67 4.09 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "-6.49 0.38 \n", - "10000000.0 10000000.0 \n", - "-12.71 3.5 \n", - "-2.84 0.3 \n", - "-1.7 8.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-96.19 11.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.03 \n", - "-7.42 1.34 \n", - "-1.7 5.56 \n", - "-27.02 3.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.35 5.62 \n", - "5.22 6.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.47 \n", - "10000000.0 10000000.0 \n", - "-4.11 0.54 \n", - "-4.0 0.65 \n", - "-18.89 2.26 \n", - "-13.2 1.07 \n", - "10000000.0 10000000.0 \n", - "-13.94 1.55 \n", - "10000000.0 10000000.0 \n", - "23.87 5.6 \n", - "10000000.0 10000000.0 \n", - "-2.88 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.03 0.68 \n", - "10000000.0 10000000.0 \n", - "-3.57 0.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "99.67 5.32 \n", - "10000000.0 10000000.0 \n", - "-0.64 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-32.8 7.42 \n", - "-21.03 2.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.74 5.83 \n", - "-0.74 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "67.65 1.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.39 5.76 \n", - "-4.55 2.75 \n", - "-3.57 0.3 \n", - "2.3 6.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.73 1.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-24.29 1.62 \n", - "-6.02 0.56 \n", - "10000000.0 10000000.0 \n", - "4.11 0.54 \n", - "-19.86 6.14 \n", - "5.51 8.18 \n", - "-148.13 2.64 \n", - "10000000.0 10000000.0 \n", - "-109.26 3.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-316.94 2.26 \n", - "2.58 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.52 \n", - "3.24 0.82 \n", - "-0.46 5.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.36 \n", - "None 4.55 \n", - "10000000.0 10000000.0 \n", - "-1.91 0.42 \n", - "-44.04 3.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.68 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "15.02 5.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "-3.88 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.75 7.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.32 0.97 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.81 5.08 \n", - "None 4.7 \n", - "10000000.0 10000000.0 \n", - "-4.55 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.89 1.22 \n", - "-118.86 3.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 5.41 \n", - "10000000.0 10000000.0 \n", - "-1.63 0.36 \n", - "10000000.0 10000000.0 \n", - "-4.36 1.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-88.93 6.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.36 \n", - "-4.36 5.93 \n", - "-3.11 3.44 \n", - "-15.16 5.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.41 4.47 \n", - "-50.32 12.78 \n", - "10000000.0 10000000.0 \n", - "6.25 1.0 \n", - "-1.09 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.64 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.11 \n", - "10000000.0 10000000.0 \n", - "-0.63 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.86 0.43 \n", - "-15.63 1.75 \n", - "10000000.0 10000000.0 \n", - "-113.53 0.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.44 1.32 \n", - "-6.44 1.32 \n", - "7.93 0.99 \n", - "10000000.0 10000000.0 \n", - "-15.54 0.35 \n", - "None 9.09 \n", - "-15.54 0.35 \n", - "None 1.32 \n", - "-0.99 0.31 \n", - "-17.63 1.07 \n", - "-17.63 1.07 \n", - "-1.18 0.45 \n", - "2.58 0.42 \n", - "None 2.35 \n", - "None 4.07 \n", - "-14.03 5.84 \n", - "None 3.28 \n", - "None 2.69 \n", - "None 1.33 \n", - "2.08 5.88 \n", - "-0.6 0.32 \n", - "-0.81 0.22 \n", - "None 7.04 \n", - "-0.81 0.22 \n", - "-0.81 0.22 \n", - "11.13 4.35 \n", - "None 9.66 \n", - "None 0.71 \n", - "-0.5 1.4 \n", - "None 1.3 \n", - "None 0.71 \n", - "-1.31 0.13 \n", - "2.08 5.88 \n", - "None 0.71 \n", - "-18.13 0.71 \n", - "0.28 0.98 \n", - "-18.13 0.71 \n", - "6.62 0.66 \n", - "9.9 1.88 \n", - "6.62 0.66 \n", - "None 1.3 \n", - "4.44 0.24 \n", - "4.44 0.24 \n", - "-18.13 0.71 \n", - "10000000.0 10000000.0 \n", - "15.54 0.35 \n", - "None 6.41 \n", - "None 3.97 \n", - "None 3.97 \n", - "None 3.97 \n", - "15.54 0.35 \n", - "10000000.0 10000000.0 \n", - "None 5.06 \n", - "10000000.0 10000000.0 \n", - "None 0.86 \n", - "-42.94 3.91 \n", - "-42.94 3.91 \n", - "-0.25 0.79 \n", - "-5.6 1.51 \n", - "10000000.0 10000000.0 \n", - "-42.94 3.91 \n", - "-42.94 3.91 \n", - "4.57 0.32 \n", - "0.57 0.71 \n", - "-14.74 0.5 \n", - "None 2.22 \n", - "-9.17 2.84 \n", - "None 2.22 \n", - "10000000.0 10000000.0 \n", - "-0.88 0.33 \n", - "-15.54 0.35 \n", - "-15.54 0.35 \n", - "-105.97 0.91 \n", - "-15.54 0.35 \n", - "-3.01 2.69 \n", - "-6.76 0.73 \n", - "-105.95 0.91 \n", - "10000000.0 10000000.0 \n", - "-14.74 0.5 \n", - "-6.51 0.71 \n", - "10000000.0 10000000.0 \n", - "-15.43 0.47 \n", - "-12.59 5.89 \n", - "-4.32 0.3 \n", - "10000000.0 10000000.0 \n", - "None 1.75 \n", - "-10.46 4.93 \n", - "2.44 0.11 \n", - "2.44 0.11 \n", - "-10.46 4.93 \n", - "-10.46 4.93 \n", - "-5.8 0.35 \n", - "-5.8 0.35 \n", - "1.07 1.04 \n", - "-17.1 1.06 \n", - "10000000.0 10000000.0 \n", - "None 1.46 \n", - "None 4.04 \n", - "None 2.05 \n", - "None 4.04 \n", - "-5.72 0.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.8 0.35 \n", - "-5.8 0.35 \n", - "None 6.01 \n", - "None 0.83 \n", - "None 0.71 \n", - "-7.28 0.45 \n", - "None 0.75 \n", - "-7.28 0.45 \n", - "None 0.83 \n", - "None 0.71 \n", - "None 4.33 \n", - "-6.98 0.69 \n", - "None 9.72 \n", - "None 9.72 \n", - "None 4.33 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 2.39 \n", - "None 2.39 \n", - "-11.71 0.56 \n", - "-3.08 0.94 \n", - "-8.29 0.27 \n", - "-10.95 0.49 \n", - "-10.95 0.49 \n", - "-6.77 0.31 \n", - "-1.03 0.42 \n", - "-0.43 0.54 \n", - "None 0.35 \n", - "-10.33 7.71 \n", - "None 2.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.52 \n", - "None 0.71 \n", - "6.72 0.4 \n", - "10000000.0 10000000.0 \n", - "-8.29 0.27 \n", - "-86.23 1.62 \n", - "-86.23 1.62 \n", - "-95.68 1.96 \n", - "-11.71 0.56 \n", - "2.7 1.52 \n", - "4.89 0.24 \n", - "2.7 1.52 \n", - "10000000.0 10000000.0 \n", - "-105.95 0.91 \n", - "-95.68 1.96 \n", - "None 0.38 \n", - "0.85 0.65 \n", - "None 2.12 \n", - "10000000.0 10000000.0 \n", - "-9.8 9.66 \n", - "None 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.27 0.9 \n", - "-5.46 0.91 \n", - "-3.96 0.55 \n", - "None 3.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.88 0.33 \n", - "None 3.55 \n", - "None 5.39 \n", - "-0.32 0.47 \n", - "None 5.39 \n", - "10000000.0 10000000.0 \n", - "None 3.55 \n", - "None 3.78 \n", - "None 0.83 \n", - "-11.96 0.72 \n", - "-4.11 1.01 \n", - "-11.96 0.72 \n", - "None 0.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 6.02 \n", - "None 4.27 \n", - "10000000.0 10000000.0 \n", - "None 6.02 \n", - "None 6.02 \n", - "None 4.27 \n", - "None 6.02 \n", - "-3.17 1.65 \n", - "-4.53 0.61 \n", - "-4.53 0.61 \n", - "None 6.02 \n", - "None 6.02 \n", - "10000000.0 10000000.0 \n", - "-4.53 0.61 \n", - "10000000.0 10000000.0 \n", - "-3.5 1.06 \n", - "None 0.52 \n", - "None 0.52 \n", - "None 1.57 \n", - "-5.46 0.91 \n", - "-9.8 9.66 \n", - "3.96 0.41 \n", - "-13.87 0.31 \n", - "None 5.16 \n", - "10000000.0 10000000.0 \n", - "-107.2 0.94 \n", - "-15.64 0.86 \n", - "0.53 0.22 \n", - "None 0.51 \n", - "None 1.57 \n", - "-2.17 0.33 \n", - "None 1.57 \n", - "None 1.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.75 1.42 \n", - "None 5.43 \n", - "0.89 0.62 \n", - "-3.54 0.44 \n", - "None 1.12 \n", - "1.99 0.28 \n", - "-16.92 0.92 \n", - "None 0.52 \n", - "None 1.12 \n", - "1.99 0.28 \n", - "-90.63 6.28 \n", - "10000000.0 10000000.0 \n", - "None 0.52 \n", - "None 1.12 \n", - "None 1.37 \n", - "4.17 0.54 \n", - "None 3.63 \n", - "-16.92 0.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.95 0.63 \n", - "-8.88 3.73 \n", - "-0.26 0.41 \n", - "-8.88 3.73 \n", - "-5.14 1.86 \n", - "-5.14 1.86 \n", - "None 3.86 \n", - "-8.88 3.73 \n", - "-8.88 3.73 \n", - "-82.4 3.41 \n", - "-0.26 0.41 \n", - "None 0.76 \n", - "-0.26 0.41 \n", - "-8.88 3.73 \n", - "None 5.05 \n", - "4.17 0.54 \n", - "4.17 0.54 \n", - "None 5.05 \n", - "10000000.0 10000000.0 \n", - "-5.75 5.23 \n", - "10000000.0 10000000.0 \n", - "-2.1 0.3 \n", - "None 2.26 \n", - "0.79 0.12 \n", - "-2.65 0.46 \n", - "None 2.26 \n", - "-10.51 0.47 \n", - "-10.51 0.47 \n", - "None 1.27 \n", - "-10.51 0.47 \n", - "None 1.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.75 5.23 \n", - "10000000.0 10000000.0 \n", - "None 2.35 \n", - "-0.07 0.57 \n", - "10000000.0 10000000.0 \n", - "4.59 0.71 \n", - "10000000.0 10000000.0 \n", - "-0.99 0.31 \n", - "1.82 0.71 \n", - "10000000.0 10000000.0 \n", - "-2.6 2.11 \n", - "10000000.0 10000000.0 \n", - "-2.6 2.11 \n", - "10000000.0 10000000.0 \n", - "-8.79 0.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.81 0.22 \n", - "-0.81 0.22 \n", - "-2.24 0.46 \n", - "-7.33 1.11 \n", - "None 0.79 \n", - "-16.42 1.26 \n", - "-11.44 1.1 \n", - "-0.99 0.31 \n", - "None 0.52 \n", - "-1.15 0.47 \n", - "None 6.41 \n", - "2.54 0.77 \n", - "-4.44 0.24 \n", - "None 0.71 \n", - "None 6.41 \n", - "-2.18 9.81 \n", - "None 3.01 \n", - "None 3.01 \n", - "-3.54 0.44 \n", - "10000000.0 10000000.0 \n", - "-2.17 0.33 \n", - "10000000.0 10000000.0 \n", - "-1.37 1.09 \n", - "0.64 0.48 \n", - "10000000.0 10000000.0 \n", - "0.64 0.48 \n", - "None 2.43 \n", - "-18.13 0.71 \n", - "-5.81 0.35 \n", - "-5.81 0.35 \n", - "2.54 0.77 \n", - "-3.53 0.8 \n", - "-14.27 0.34 \n", - "None 5.06 \n", - "-14.27 0.34 \n", - "-3.53 0.8 \n", - "-1.58 0.37 \n", - "None 1.34 \n", - "-5.65 0.43 \n", - "-104.49 1.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.71 0.56 \n", - "None 7.3 \n", - "-5.74 0.08 \n", - "None 7.3 \n", - "-3.41 0.78 \n", - "0.29 0.3 \n", - "None 5.15 \n", - "-104.49 1.31 \n", - "None 5.15 \n", - "None 3.04 \n", - "-74.09 0.81 \n", - "-20.31 2.54 \n", - "-11.71 0.56 \n", - "10000000.0 10000000.0 \n", - "-74.09 0.81 \n", - "-4.52 1.9 \n", - "-4.52 1.9 \n", - "-0.83 1.04 \n", - "-95.25 0.85 \n", - "-12.87 1.28 \n", - "-11.71 0.56 \n", - "-95.25 0.85 \n", - "-4.52 1.9 \n", - "None 5.25 \n", - "1.57 2.05 \n", - "0.28 0.38 \n", - "-7.19 0.32 \n", - "10000000.0 10000000.0 \n", - "-7.19 0.32 \n", - "None 5.25 \n", - "-5.17 0.59 \n", - "None 0.47 \n", - "-9.26 0.61 \n", - "None 0.71 \n", - "None 2.08 \n", - "-9.26 0.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.28 0.38 \n", - "4.87 0.41 \n", - "None 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.57 0.71 \n", - "0.61 0.58 \n", - "None 3.95 \n", - "-1.49 0.27 \n", - "-22.97 1.17 \n", - "2.34 0.68 \n", - "10000000.0 10000000.0 \n", - "0.83 1.13 \n", - "0.83 1.13 \n", - "-1.04 0.46 \n", - "-13.78 1.7 \n", - "None 1.0 \n", - "5.61 0.71 \n", - "None 0.71 \n", - "None 0.25 \n", - "-14.34 2.92 \n", - "10000000.0 10000000.0 \n", - "8.79 0.58 \n", - "-2.96 0.46 \n", - "-0.99 0.31 \n", - "-3.87 0.5 \n", - "-2.96 0.46 \n", - "-3.87 0.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "11.46 1.31 \n", - "11.46 1.31 \n", - "None 5.03 \n", - "11.46 1.31 \n", - "-5.21 0.31 \n", - "-1.14 0.86 \n", - "10000000.0 10000000.0 \n", - "-4.56 0.55 \n", - "10000000.0 10000000.0 \n", - "-4.56 0.55 \n", - "10000000.0 10000000.0 \n", - "None 1.33 \n", - "None 1.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 3.92 \n", - "10000000.0 10000000.0 \n", - "0.47 4.73 \n", - "0.54 1.48 \n", - "10000000.0 10000000.0 \n", - "0.54 1.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.44 0.64 \n", - "-8.68 0.26 \n", - "-3.87 0.5 \n", - "-8.34 0.82 \n", - "-18.18 1.75 \n", - "-5.35 0.94 \n", - "-3.02 0.72 \n", - "-2.39 0.75 \n", - "-8.34 0.82 \n", - "None 5.88 \n", - "-8.34 0.82 \n", - "-2.39 0.75 \n", - "-18.18 1.75 \n", - "-0.38 0.5 \n", - "None 4.27 \n", - "-1.19 0.46 \n", - "None 8.13 \n", - "-8.34 0.82 \n", - "-103.9 3.91 \n", - "None 8.13 \n", - "-13.43 1.51 \n", - "-13.43 1.51 \n", - "-2.39 0.75 \n", - "-0.83 0.5 \n", - "-2.43 0.33 \n", - "-0.83 0.5 \n", - "None 5.06 \n", - "-6.27 2.07 \n", - "10000000.0 10000000.0 \n", - "None 2.29 \n", - "None 2.29 \n", - "10000000.0 10000000.0 \n", - "-3.8 0.27 \n", - "None 10.17 \n", - "-103.9 3.91 \n", - "None 2.08 \n", - "-20.79 1.5 \n", - "-0.83 0.5 \n", - "-6.42 0.49 \n", - "-4.36 5.35 \n", - "-3.81 0.62 \n", - "-6.77 0.31 \n", - "None 5.05 \n", - "-3.81 0.62 \n", - "None 0.74 \n", - "-3.11 4.62 \n", - "10000000.0 10000000.0 \n", - "None 4.27 \n", - "10000000.0 10000000.0 \n", - "4.7 2.24 \n", - "None 0.71 \n", - "None 4.99 \n", - "-105.99 0.91 \n", - "-10.42 6.55 \n", - "-5.31 0.66 \n", - "-0.06 0.39 \n", - "-0.62 0.69 \n", - "-5.31 0.66 \n", - "-0.62 0.69 \n", - "11.38 0.28 \n", - "-0.62 0.69 \n", - "-0.62 0.69 \n", - "-8.67 0.26 \n", - "None 2.22 \n", - "-2.81 0.3 \n", - "-128.98 8.61 \n", - "-2.81 0.3 \n", - "-0.98 0.07 \n", - "2.54 0.77 \n", - "None 3.22 \n", - "-15.65 0.87 \n", - "1.97 0.45 \n", - "10000000.0 10000000.0 \n", - "None 2.04 \n", - "None 2.04 \n", - "None 2.04 \n", - "0.54 1.48 \n", - "None 5.03 \n", - "None 4.14 \n", - "None 1.8 \n", - "None 0.38 \n", - "None 0.38 \n", - "None 0.38 \n", - "None 4.41 \n", - "4.73 0.75 \n", - "-14.87 5.08 \n", - "4.73 0.75 \n", - "None 0.62 \n", - "-3.05 5.12 \n", - "None 0.62 \n", - "None 4.4 \n", - "None 4.4 \n", - "None 6.43 \n", - "-6.42 1.8 \n", - "10000000.0 10000000.0 \n", - "-14.87 5.08 \n", - "None 6.43 \n", - "None 4.4 \n", - "None 4.03 \n", - "None 4.03 \n", - "12.39 0.75 \n", - "2.25 0.33 \n", - "None 1.91 \n", - "2.25 0.33 \n", - "None 2.76 \n", - "5.59 0.71 \n", - "None 2.76 \n", - "10000000.0 10000000.0 \n", - "-2.67 0.35 \n", - "5.59 0.71 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 0.71 \n", - "-0.81 0.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.81 0.22 \n", - "10000000.0 10000000.0 \n", - "2.54 0.77 \n", - "-0.68 0.31 \n", - "-11.73 0.56 \n", - "-11.73 0.56 \n", - "-105.97 0.91 \n", - "-105.97 0.91 \n", - "None 4.2 \n", - "-1.97 0.56 \n", - "-8.68 0.26 \n", - "-0.21 0.17 \n", - "-8.41 0.61 \n", - "-3.11 7.46 \n", - "None 9.77 \n", - "10000000.0 10000000.0 \n", - "-2.26 1.28 \n", - "-15.54 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.69 0.98 \n", - "-7.62 0.46 \n", - "6.69 0.98 \n", - "0.87 0.35 \n", - "-0.95 0.55 \n", - "None 2.14 \n", - "0.87 0.35 \n", - "10000000.0 10000000.0 \n", - "-0.21 0.17 \n", - "-18.13 0.71 \n", - "None 0.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.63 0.42 \n", - "-4.17 0.94 \n", - "1.49 1.28 \n", - "-4.17 0.94 \n", - "10.37 0.2 \n", - "10000000.0 10000000.0 \n", - "10.37 0.2 \n", - "10.37 0.2 \n", - "10000000.0 10000000.0 \n", - "-1.84 0.3 \n", - "10.37 0.2 \n", - "-1.84 0.3 \n", - "10000000.0 10000000.0 \n", - "-9.13 1.52 \n", - "-2.6 2.2 \n", - "-1.45 0.4 \n", - "None 1.56 \n", - "-3.14 0.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.13 1.52 \n", - "None 1.32 \n", - "-0.37 0.39 \n", - "10000000.0 10000000.0 \n", - "None 1.32 \n", - "10000000.0 10000000.0 \n", - "0.48 1.07 \n", - "-107.89 6.27 \n", - "None 2.59 \n", - "10.66 0.78 \n", - "-5.12 0.81 \n", - "None 0.45 \n", - "-107.89 6.27 \n", - "9.34 2.83 \n", - "-0.21 0.17 \n", - "9.34 2.83 \n", - "-0.21 0.17 \n", - "-5.28 0.33 \n", - "-8.14 0.89 \n", - "-2.63 0.35 \n", - "-6.02 0.56 \n", - "-6.02 0.56 \n", - "-22.49 1.11 \n", - "-3.98 0.33 \n", - "None 2.18 \n", - "None 6.51 \n", - "None 1.34 \n", - "None 6.43 \n", - "-5.5 0.33 \n", - "-117.42 1.16 \n", - "-0.21 0.17 \n", - "2.08 1.37 \n", - "10000000.0 10000000.0 \n", - "-2.88 0.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "-74.63 2.18 \n", - "None 0.54 \n", - "None 0.54 \n", - "0.94 0.19 \n", - "None 0.54 \n", - "10000000.0 10000000.0 \n", - "None 1.1 \n", - "None 5.73 \n", - "None 5.73 \n", - "None 2.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.99 0.33 \n", - "2.22 0.33 \n", - "-21.65 7.55 \n", - "None 5.42 \n", - "10000000.0 10000000.0 \n", - "-68.61 1.43 \n", - "None 5.42 \n", - "-2.66 0.35 \n", - "None 0.71 \n", - "None 1.02 \n", - "1.32 0.8 \n", - "1.32 0.8 \n", - "-18.97 6.25 \n", - "None 1.02 \n", - "-3.63 5.9 \n", - "10000000.0 10000000.0 \n", - "23.24 5.36 \n", - "23.24 5.36 \n", - "23.24 5.36 \n", - "None 0.41 \n", - "-0.66 0.71 \n", - "None 9.79 \n", - "-18.13 0.71 \n", - "-6.06 0.67 \n", - "None 1.4 \n", - "None 9.79 \n", - "None 6.99 \n", - "-2.6 2.39 \n", - "-48.6 0.41 \n", - "-95.32 1.25 \n", - "-2.6 2.39 \n", - "-1.22 0.75 \n", - "-6.06 0.67 \n", - "-2.6 2.2 \n", - "-8.68 0.26 \n", - "None 0.69 \n", - "-4.36 7.2 \n", - "None 0.44 \n", - "-6.06 0.67 \n", - "-4.4 0.53 \n", - "None 6.84 \n", - "-2.6 2.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.55 0.26 \n", - "10000000.0 10000000.0 \n", - "-3.33 0.61 \n", - "-3.33 0.61 \n", - "3.11 0.49 \n", - "3.11 0.49 \n", - "-5.82 0.35 \n", - "-4.36 7.34 \n", - "-9.86 1.06 \n", - "-15.13 0.33 \n", - "-18.48 1.45 \n", - "10000000.0 10000000.0 \n", - "-1.43 0.33 \n", - "-1.2 0.77 \n", - "-1.2 0.77 \n", - "None 0.54 \n", - "None None \n", - "None 1.88 \n", - "-1.2 0.77 \n", - "-1.2 0.77 \n", - "None 1.88 \n", - "None 1.88 \n", - "None 2.21 \n", - "None 9.8 \n", - "None 9.8 \n", - "-6.27 2.07 \n", - "10000000.0 10000000.0 \n", - "-20.54 1.56 \n", - "-7.29 4.95 \n", - "-4.05 1.05 \n", - "None 2.69 \n", - "None 5.33 \n", - "-5.92 0.48 \n", - "None 2.69 \n", - "-20.54 1.56 \n", - "None 4.04 \n", - "None 2.69 \n", - "None 5.33 \n", - "-12.78 1.18 \n", - "-4.97 0.94 \n", - "10000000.0 10000000.0 \n", - "-13.4 1.06 \n", - "-4.5 9.72 \n", - "5.63 0.54 \n", - "-2.23 0.46 \n", - "-13.4 1.06 \n", - "-13.28 1.2 \n", - "None 3.65 \n", - "None 0.45 \n", - "None 8.05 \n", - "None 3.65 \n", - "None 0.45 \n", - "-13.4 1.06 \n", - "None 0.44 \n", - "3.53 0.8 \n", - "-19.86 10.91 \n", - "None 0.44 \n", - "None 0.44 \n", - "-4.32 0.3 \n", - "-1.45 1.11 \n", - "-8.35 5.5 \n", - "-1.45 1.11 \n", - "-2.83 1.5 \n", - "-0.99 0.31 \n", - "2.92 0.34 \n", - "None 5.18 \n", - "-2.65 0.53 \n", - "10000000.0 10000000.0 \n", - "None 5.18 \n", - "-1.45 1.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.62 0.69 \n", - "0.62 0.69 \n", - "-2.84 0.54 \n", - "-0.81 0.22 \n", - "-20.56 5.08 \n", - "None 6.15 \n", - "None 0.93 \n", - "-40.4 1.05 \n", - "None 4.29 \n", - "-40.4 1.05 \n", - "10000000.0 10000000.0 \n", - "None 4.29 \n", - "-20.56 5.08 \n", - "None 6.15 \n", - "-20.56 5.08 \n", - "None 6.15 \n", - "None 6.15 \n", - "-1.36 0.48 \n", - "None 6.15 \n", - "10000000.0 10000000.0 \n", - "None 6.15 \n", - "0.62 0.69 \n", - "None 4.2 \n", - "None 4.2 \n", - "10000000.0 10000000.0 \n", - "-105.97 0.91 \n", - "11.92 0.96 \n", - "11.92 0.96 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "11.92 0.96 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.81 0.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.67 \n", - "10000000.0 10000000.0 \n", - "1.41 0.78 \n", - "10000000.0 10000000.0 \n", - "None 4.67 \n", - "None 2.39 \n", - "None 2.39 \n", - "None None \n", - "None 6.17 \n", - "None 6.17 \n", - "None 5.29 \n", - "10000000.0 10000000.0 \n", - "None 5.29 \n", - "None 6.17 \n", - "10000000.0 10000000.0 \n", - "-10.34 0.49 \n", - "-10.34 0.49 \n", - "None 1.26 \n", - "-22.58 1.25 \n", - "None 1.26 \n", - "None 6.17 \n", - "None 6.17 \n", - "-2.51 0.49 \n", - "None 0.64 \n", - "None 0.64 \n", - "None 0.81 \n", - "-17.63 1.07 \n", - "-98.48 11.53 \n", - "-8.35 5.5 \n", - "-1.43 0.33 \n", - "-18.13 0.71 \n", - "None 0.81 \n", - "-1.43 0.33 \n", - "-1.43 0.33 \n", - "1.4 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "251.57 0.24 \n", - "-8.47 0.79 \n", - "-8.47 0.79 \n", - "-46.14 0.21 \n", - "252.02 0.37 \n", - "252.62 0.22 \n", - "0.82 0.07 \n", - "0.82 0.07 \n", - "0.82 0.07 \n", - "1.85 0.87 \n", - "-0.36 0.54 \n", - "10000000.0 10000000.0 \n", - "-0.51 0.51 \n", - "-1.21 0.44 \n", - "0.04 0.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.72 0.31 \n", - "-5.3 0.59 \n", - "-2.17 0.41 \n", - "-2.17 0.41 \n", - "-204.98 0.17 \n", - "-204.98 0.17 \n", - "-2.67 0.69 \n", - "10000000.0 10000000.0 \n", - "-43.78 0.93 \n", - "10000000.0 10000000.0 \n", - "-4.81 0.66 \n", - "-44.22 0.45 \n", - "-1.13 0.1 \n", - "2.25 0.33 \n", - "-8.1 0.51 \n", - "6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-208.81 0.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.43 0.14 \n", - "-434.91 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-392.76 3.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.25 0.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-58.92 0.81 \n", - "-58.92 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "383.56 1.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.54 1.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.51 0.84 \n", - "1.89 1.02 \n", - "-12.89 0.27 \n", - "2.38 0.83 \n", - "0.44 0.85 \n", - "-0.07 0.13 \n", - "-1.96 0.4 \n", - "-1.96 0.4 \n", - "-8.72 0.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.72 1.45 \n", - "10000000.0 10000000.0 \n", - "-0.69 0.13 \n", - "-0.69 0.13 \n", - "-4.01 0.86 \n", - "-44.78 0.91 \n", - "-3.34 0.2 \n", - "-3.34 0.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.8 1.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.53 0.23 \n", - "10000000.0 10000000.0 \n", - "397.52 1.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.79 0.74 \n", - "10000000.0 10000000.0 \n", - "-2.28 0.23 \n", - "10000000.0 10000000.0 \n", - "-2.48 0.6 \n", - "8.79 0.58 \n", - "-1.81 1.19 \n", - "-14.73 1.19 \n", - "-6.34 1.32 \n", - "-14.55 1.34 \n", - "0.85 0.65 \n", - "10000000.0 10000000.0 \n", - "-4.39 0.91 \n", - "-0.13 1.19 \n", - "-5.8 1.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.07 0.87 \n", - "-38.45 2.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.29 0.76 \n", - "0.19 0.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-36.16 4.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.09 0.26 \n", - "-13.15 4.94 \n", - "0.45 0.38 \n", - "-4.36 6.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-22.12 2.71 \n", - "-1.09 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.76 6.3 \n", - "10000000.0 10000000.0 \n", - "1483.01 15.21 \n", - "10000000.0 10000000.0 \n", - "-34.83 5.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.56 0.91 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "-0.78 0.68 \n", - "-2.68 0.45 \n", - "-3.11 2.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.12 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 7.42 \n", - "-2.7 2.72 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-93.25 0.99 \n", - "None 0.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.07 0.85 \n", - "-4.36 6.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.21 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.52 0.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.52 \n", - "12.92 0.57 \n", - "10000000.0 10000000.0 \n", - "-3.53 6.42 \n", - "10000000.0 10000000.0 \n", - "-3.88 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.11 0.98 \n", - "10000000.0 10000000.0 \n", - "-11.13 4.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.87 0.56 \n", - "10000000.0 10000000.0 \n", - "-121.36 15.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-68.14 10.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.51 0.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.59 0.54 \n", - "8.88 0.48 \n", - "10000000.0 10000000.0 \n", - "1.27 0.59 \n", - "1.63 1.66 \n", - "-12.96 3.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.3 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.83 1.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.66 0.95 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "24.54 13.06 \n", - "10000000.0 10000000.0 \n", - "3.25 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.39 0.42 \n", - "-49.4 2.6 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "105.79 2.12 \n", - "-9.66 5.58 \n", - "-17.34 0.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "201.94 5.08 \n", - "347.01 0.64 \n", - "10000000.0 10000000.0 \n", - "-0.24 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.9 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.11 7.88 \n", - "-3.04 0.42 \n", - "-97.37 1.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.33 \n", - "10000000.0 10000000.0 \n", - "-3.09 2.28 \n", - "10000000.0 10000000.0 \n", - "170.55 0.82 \n", - "-48.38 3.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.31 2.44 \n", - "-62.53 1.27 \n", - "-4.28 0.86 \n", - "-21.41 0.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "-3.53 6.57 \n", - "10000000.0 10000000.0 \n", - "-19.29 2.26 \n", - "-5.86 0.38 \n", - "10000000.0 10000000.0 \n", - "-13.89 7.22 \n", - "-3.47 0.39 \n", - "10000000.0 10000000.0 \n", - "7.19 0.32 \n", - "10000000.0 10000000.0 \n", - "-61.85 3.54 \n", - "10000000.0 10000000.0 \n", - "4.89 0.25 \n", - "-99.07 1.14 \n", - "10000000.0 10000000.0 \n", - "7.12 2.55 \n", - "0.95 0.84 \n", - "10000000.0 10000000.0 \n", - "-3.81 0.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.86 2.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-94.13 0.75 \n", - "-1.32 0.94 \n", - "10000000.0 10000000.0 \n", - "-4.41 0.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.59 0.64 \n", - "-4.36 5.98 \n", - "-4.36 7.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.71 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.46 2.13 \n", - "10000000.0 10000000.0 \n", - "78.7 39.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-74.54 11.69 \n", - "-9.31 3.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "150.77 0.64 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "-2.88 0.3 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "-4.36 5.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-82.1 5.5 \n", - "-4.36 6.33 \n", - "10000000.0 10000000.0 \n", - "-0.75 0.96 \n", - "None 2.05 \n", - "-6.02 0.56 \n", - "-8.78 0.66 \n", - "-3.87 0.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-80.62 0.75 \n", - "9.59 6.03 \n", - "-0.74 0.53 \n", - "1.63 1.66 \n", - "10000000.0 10000000.0 \n", - "-13.26 1.47 \n", - "10000000.0 10000000.0 \n", - "-4.31 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.74 0.3 \n", - "0.14 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.69 0.46 \n", - "10000000.0 10000000.0 \n", - "-9.79 1.34 \n", - "-1.7 7.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-92.91 1.77 \n", - "-48.38 3.99 \n", - "None 36.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-21.55 6.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-32.24 1.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.22 13.4 \n", - "-14.35 5.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.12 1.34 \n", - "-21.41 0.92 \n", - "10000000.0 10000000.0 \n", - "-8.66 8.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.82 0.35 \n", - "10000000.0 10000000.0 \n", - "-105.88 0.91 \n", - "-2.47 0.53 \n", - "10.3 11.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.22 0.5 \n", - "10000000.0 10000000.0 \n", - "5.18 0.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.47 4.87 \n", - "-0.9 0.51 \n", - "None 6.87 \n", - "-14.68 0.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.97 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.34 8.59 \n", - "-22.21 5.65 \n", - "-91.39 12.93 \n", - "4.44 0.24 \n", - "-94.13 0.75 \n", - "-96.89 1.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-104.14 1.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.18 0.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.37 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.22 4.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-20.64 5.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.3 2.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.22 0.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.75 9.62 \n", - "-1.14 0.86 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.38 0.45 \n", - "-88.93 6.31 \n", - "-0.86 0.57 \n", - "-0.05 0.55 \n", - "-5.27 1.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.71 1.53 \n", - "-24.64 1.05 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.71 \n", - "10000000.0 10000000.0 \n", - "0.32 0.53 \n", - "10000000.0 10000000.0 \n", - "-16.65 1.71 \n", - "10000000.0 10000000.0 \n", - "-1.66 2.77 \n", - "10000000.0 10000000.0 \n", - "-63.97 1.64 \n", - "-14.44 9.86 \n", - "125.2 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 52.67 \n", - "10000000.0 10000000.0 \n", - "3.69 0.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.08 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 7.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 9.26 \n", - "-81.63 0.8 \n", - "-74.14 13.97 \n", - "10000000.0 10000000.0 \n", - "0.95 0.3 \n", - "3.51 0.38 \n", - "-106.05 0.91 \n", - "-4.36 6.19 \n", - "-3.83 0.39 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "-0.37 0.49 \n", - "-9.31 4.79 \n", - "6.48 0.85 \n", - "-4.36 5.53 \n", - "10000000.0 10000000.0 \n", - "-5.75 11.29 \n", - "10000000.0 10000000.0 \n", - "345.25 1.38 \n", - "-79.05 1.96 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-25.04 2.76 \n", - "10000000.0 10000000.0 \n", - "7.22 1.36 \n", - "10000000.0 10000000.0 \n", - "6.34 0.54 \n", - "-4.36 11.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "21.7 1.69 \n", - "-36.69 2.69 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.81 \n", - "8.43 5.36 \n", - "-194.4 1.6 \n", - "10000000.0 10000000.0 \n", - "-3.4 1.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.65 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.43 2.21 \n", - "10000000.0 10000000.0 \n", - "55.69 0.97 \n", - "10000000.0 10000000.0 \n", - "7.19 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-27.02 3.12 \n", - "-3.53 0.76 \n", - "10000000.0 10000000.0 \n", - "10.72 2.07 \n", - "10000000.0 10000000.0 \n", - "-9.0 0.26 \n", - "10000000.0 10000000.0 \n", - "188.9 5.08 \n", - "10000000.0 10000000.0 \n", - "-0.37 0.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.7 0.98 \n", - "None 14.71 \n", - "10000000.0 10000000.0 \n", - "-0.46 5.14 \n", - "-39.57 1.11 \n", - "-97.44 0.8 \n", - "10000000.0 10000000.0 \n", - "-5.81 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.02 0.37 \n", - "10000000.0 10000000.0 \n", - "-11.56 1.23 \n", - "None 1.88 \n", - "-33.25 9.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.97 0.47 \n", - "-4.36 6.38 \n", - "10000000.0 10000000.0 \n", - "-1.25 1.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.32 0.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-69.98 4.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.68 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.24 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-110.23 1.25 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.02 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.86 6.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.9 1.45 \n", - "10000000.0 10000000.0 \n", - "-1.66 2.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.09 0.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-53.02 4.97 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.79 0.89 \n", - "-2.46 0.54 \n", - "-4.58 0.52 \n", - "10000000.0 10000000.0 \n", - "6.24 1.0 \n", - "-20.37 20.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "177.5 0.35 \n", - "10000000.0 10000000.0 \n", - "-95.07 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.21 0.18 \n", - "10000000.0 10000000.0 \n", - "-15.13 6.71 \n", - "452.9 1.91 \n", - "0.29 0.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.18 0.5 \n", - "-54.09 2.0 \n", - "7.56 0.6 \n", - "10000000.0 10000000.0 \n", - "2.2 0.18 \n", - "10000000.0 10000000.0 \n", - "None 1.88 \n", - "-4.36 5.95 \n", - "-0.46 2.22 \n", - "-4.36 5.87 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.31 1.07 \n", - "10000000.0 10000000.0 \n", - "-96.82 7.07 \n", - "10000000.0 10000000.0 \n", - "-5.5 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.24 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.22 14.29 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-102.36 1.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "13.26 1.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.96 3.77 \n", - "-1.7 1.19 \n", - "-0.18 0.36 \n", - "-15.14 1.21 \n", - "-4.36 7.67 \n", - "10000000.0 10000000.0 \n", - "2.89 3.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 5.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.85 4.75 \n", - "-1.7 7.81 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.66 5.24 \n", - "10000000.0 10000000.0 \n", - "-26.17 5.56 \n", - "-6.08 6.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.8 0.66 \n", - "-63.86 1.17 \n", - "-14.6 2.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-75.26 13.55 \n", - "-93.98 1.29 \n", - "None 0.44 \n", - "10000000.0 10000000.0 \n", - "-6.02 0.56 \n", - "10000000.0 10000000.0 \n", - "-14.03 10.79 \n", - "240.79 2.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-105.54 7.39 \n", - "-1.76 0.41 \n", - "0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.24 0.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-87.36 2.22 \n", - "10000000.0 10000000.0 \n", - "None 1.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-60.93 3.32 \n", - "10000000.0 10000000.0 \n", - "7.19 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-61.85 1.31 \n", - "10000000.0 10000000.0 \n", - "-9.39 2.39 \n", - "-9.39 4.52 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.18 0.36 \n", - "-2.67 11.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "-52.78 6.62 \n", - "None 4.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-67.62 2.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.89 0.25 \n", - "10000000.0 10000000.0 \n", - "-64.51 2.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-95.07 0.74 \n", - "-0.28 0.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.02 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-88.56 7.14 \n", - "-5.2 43.14 \n", - "-4.13 1.05 \n", - "-4.36 5.78 \n", - "6.48 0.85 \n", - "10000000.0 10000000.0 \n", - "-0.02 3.47 \n", - "-1.7 8.08 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "633.84 1.4 \n", - "-95.83 6.5 \n", - "-122.89 1.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.23 2.71 \n", - "1.19 0.29 \n", - "10000000.0 10000000.0 \n", - "-1.49 1.31 \n", - "55.18 1.91 \n", - "10000000.0 10000000.0 \n", - "-0.28 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.27 0.95 \n", - "10000000.0 10000000.0 \n", - "-10.46 5.18 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 3.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.66 0.8 \n", - "10000000.0 10000000.0 \n", - "0.72 0.84 \n", - "-1.41 0.33 \n", - "-71.13 4.47 \n", - "-4.36 7.88 \n", - "0.63 0.26 \n", - "10000000.0 10000000.0 \n", - "-14.03 12.88 \n", - "10000000.0 10000000.0 \n", - "1.55 0.5 \n", - "-2.03 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.79 0.33 \n", - "10000000.0 10000000.0 \n", - "-6.43 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.64 0.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.24 0.63 \n", - "10000000.0 10000000.0 \n", - "-3.98 0.33 \n", - "-29.0 1.76 \n", - "10000000.0 10000000.0 \n", - "-137.68 8.37 \n", - "10000000.0 10000000.0 \n", - "-3.91 0.53 \n", - "0.9 0.62 \n", - "10000000.0 10000000.0 \n", - "-3.82 0.44 \n", - "-0.83 1.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.8 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-13.35 1.67 \n", - "10000000.0 10000000.0 \n", - "-35.94 1.01 \n", - "10000000.0 10000000.0 \n", - "-1.98 0.56 \n", - "-3.04 0.42 \n", - "10000000.0 10000000.0 \n", - "-26.84 4.57 \n", - "-0.88 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.95 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.77 0.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.61 0.84 \n", - "10000000.0 10000000.0 \n", - "-21.18 4.7 \n", - "-23.57 10.51 \n", - "10000000.0 10000000.0 \n", - "None 2.98 \n", - "10000000.0 10000000.0 \n", - "-3.11 8.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "0.38 0.45 \n", - "-0.52 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.9 0.42 \n", - "10000000.0 10000000.0 \n", - "-0.94 0.17 \n", - "-3.04 0.42 \n", - "10000000.0 10000000.0 \n", - "-0.24 0.65 \n", - "10000000.0 10000000.0 \n", - "-11.68 0.39 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.82 0.44 \n", - "-16.87 0.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-26.84 5.69 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.67 0.4 \n", - "-2.61 0.5 \n", - "10000000.0 10000000.0 \n", - "11.68 17.95 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.37 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-34.94 1.12 \n", - "10000000.0 10000000.0 \n", - "87.3 0.36 \n", - "7.19 0.32 \n", - "14.27 0.34 \n", - "1.22 2.85 \n", - "0.48 1.95 \n", - "64.32 6.11 \n", - "0.28 0.38 \n", - "7.22 5.13 \n", - "10000000.0 10000000.0 \n", - "-60.68 3.91 \n", - "10000000.0 10000000.0 \n", - "-4.31 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "453.65 1.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-14.03 4.84 \n", - "-27.07 4.66 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.36 6.48 \n", - "-3.53 6.32 \n", - "7.75 0.68 \n", - "10000000.0 10000000.0 \n", - "-14.03 5.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-9.56 4.91 \n", - "10000000.0 10000000.0 \n", - "46.99 0.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-47.33 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-59.72 0.33 \n", - "58.87 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.47 4.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.74 0.47 \n", - "-135.93 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "11.45 2.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "208.81 0.14 \n", - "-212.82 0.16 \n", - "10000000.0 10000000.0 \n", - "-211.77 0.44 \n", - "204.39 0.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.64 0.86 \n", - "-15.65 0.87 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "21.94 0.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-269.79 0.65 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "59.81 0.4 \n", - "-191.66 12.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-12.31 0.75 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.95 4.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-56.99 4.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.02 0.28 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-125.73 0.57 \n", - "-64.18 0.33 \n", - "-58.02 0.82 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "15.88 7.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.7 1.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-214.97 0.14 \n", - "-4.36 7.37 \n", - "10000000.0 10000000.0 \n", - "-1.05 0.37 \n", - "40.53 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "55.7 8.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-30.79 0.38 \n", - "10000000.0 10000000.0 \n", - "-211.94 1.81 \n", - "130.29 0.54 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.7 6.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "121.36 1.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.11 0.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-19.86 10.91 \n", - "10000000.0 10000000.0 \n", - "-7.87 2.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.74 8.09 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.28 1.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.19 0.32 \n", - "10000000.0 10000000.0 \n", - "-32.56 2.8 \n", - "107.07 1.08 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "268.92 0.96 \n", - "10000000.0 10000000.0 \n", - "40.54 0.47 \n", - "-12.27 0.77 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "18.83 5.64 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "206.41 0.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "240.8 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "336.9 1.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "58.67 0.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "43.97 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.8 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "320.17 2.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "130.27 0.56 \n", - "10000000.0 10000000.0 \n", - "-26.13 0.96 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.41 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.99 0.8 \n", - "-2.39 0.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.42 4.94 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "71.63 3.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.77 0.53 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "44.77 1.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.44 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-10.37 0.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "22.7 0.78 \n", - "22.7 0.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.7 3.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "39.18 0.34 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-1.49 0.81 \n", - "56.08 4.97 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.44 1.35 \n", - "10000000.0 10000000.0 \n", - "-3.11 0.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.87 0.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "234.97 2.76 \n", - "-10.37 0.2 \n", - "-23.93 0.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-110.65 1.18 \n", - "10000000.0 10000000.0 \n", - "-13.2 1.07 \n", - "10000000.0 10000000.0 \n", - "433.04 1.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-11.92 3.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-107.87 1.44 \n", - "-80.62 0.75 \n", - "-94.25 0.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.6 6.38 \n", - "-8.26 9.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-89.38 1.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.29 0.8 \n", - "-75.41 0.8 \n", - "138.88 1.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-226.79 1.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-183.29 1.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-64.93 4.26 \n", - "0.46 4.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-82.17 2.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.1 2.41 \n", - "-1.36 0.59 \n", - "-12.31 0.75 \n", - "-21.34 0.25 \n", - "-283.04 1.36 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-101.72 0.27 \n", - "-236.65 1.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.93 0.56 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-371.91 2.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "9.19 3.93 \n", - "9.19 3.93 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "1.0 0.52 \n", - "10000000.0 10000000.0 \n", - "-0.46 1.22 \n", - "-6.86 1.89 \n", - "-2.16 0.97 \n", - "-2.25 0.96 \n", - "-2.03 0.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "47.13 1.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.04 1.51 \n", - "10000000.0 10000000.0 \n", - "-0.46 6.84 \n", - "0.35 0.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-50.13 0.35 \n", - "0.79 0.41 \n", - "10000000.0 10000000.0 \n", - "-70.88 0.37 \n", - "10000000.0 10000000.0 \n", - "38.0 1.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.3 0.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.27 0.66 \n", - "0.24 0.41 \n", - "10000000.0 10000000.0 \n", - "2.1 4.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.73 0.55 \n", - "10000000.0 10000000.0 \n", - "-10.38 1.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 7.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 5.78 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 6.12 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 5.96 \n", - "-6.16 0.07 \n", - "-6.81 6.12 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 6.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 6.21 \n", - "-6.81 6.42 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 6.11 \n", - "-6.81 6.11 \n", - "-6.81 6.24 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 6.25 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 6.37 \n", - "-6.81 6.57 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 6.3 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 6.44 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 6.05 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 5.02 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 5.94 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 6.97 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 7.12 \n", - "-6.81 7.12 \n", - "-6.16 0.07 \n", - "-6.81 7.22 \n", - "-6.81 7.38 \n", - "-6.81 6.38 \n", - "-6.81 6.41 \n", - "-6.81 6.41 \n", - "-6.81 6.51 \n", - "-6.81 6.51 \n", - "-6.81 6.69 \n", - "-6.16 0.07 \n", - "-6.81 6.55 \n", - "-6.81 6.56 \n", - "-6.81 6.72 \n", - "-6.81 6.72 \n", - "-6.81 6.72 \n", - "-6.81 6.81 \n", - "-6.81 6.36 \n", - "-6.81 6.31 \n", - "-6.81 6.34 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 6.54 \n", - "-6.81 6.48 \n", - "-6.81 6.5 \n", - "-6.16 0.07 \n", - "-6.81 6.71 \n", - "-6.81 6.65 \n", - "-6.81 6.66 \n", - "-6.16 0.07 \n", - "-6.81 6.82 \n", - "-6.81 6.82 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 4.92 \n", - "-6.16 0.07 \n", - "-6.81 5.93 \n", - "-6.81 5.93 \n", - "-6.16 0.07 \n", - "-6.81 6.22 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 4.8 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 4.7 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 4.74 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 24.02 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 8.05 \n", - "-6.16 0.07 \n", - "-6.81 8.78 \n", - "-6.81 9.91 \n", - "-6.81 11.85 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 11.08 \n", - "-6.81 15.91 \n", - "-6.81 6.69 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 5.04 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 7.75 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.81 5.02 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 7.53 \n", - "-6.81 7.82 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 18.47 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 7.91 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 4.76 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 8.39 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 15.88 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 4.9 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 8.05 \n", - "-6.81 9.91 \n", - "-6.81 11.85 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 7.02 \n", - "-6.81 6.94 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.81 8.01 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.81 8.94 \n", - "-6.81 8.51 \n", - "-6.16 0.07 \n", - "-6.81 7.26 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.81 7.25 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 9.14 \n", - "-6.81 8.88 \n", - "-6.16 0.07 \n", - "-6.81 12.14 \n", - "10000000.0 10000000.0 \n", - "-6.81 24.02 \n", - "-6.16 0.07 \n", - "-6.81 15.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 7.01 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 6.95 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 13.57 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 5.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.81 7.64 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 5.27 \n", - "-6.16 0.07 \n", - "-6.81 8.88 \n", - "-6.81 9.1 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.81 9.29 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.81 7.04 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.56 0.33 \n", - "-11.67 0.39 \n", - "-9.31 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.3 12.91 \n", - "1.0 0.09 \n", - "-72.91 1.9 \n", - "-9.94 1.83 \n", - "10000000.0 10000000.0 \n", - "-2.44 0.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.78 0.75 \n", - "1.21 0.82 \n", - "-3.78 0.75 \n", - "4.73 0.71 \n", - "2.95 0.3 \n", - "4.49 0.57 \n", - "4.49 0.57 \n", - "10000000.0 10000000.0 \n", - "-1.18 0.45 \n", - "-1.18 0.45 \n", - "-8.4 0.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-364.54 7.23 \n", - "-321.97 5.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-478.4 2.81 \n", - "-416.26 1.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-54.24 5.78 \n", - "10000000.0 10000000.0 \n", - "-0.07 0.69 \n", - "0.61 1.02 \n", - "-27.3 0.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.36 0.37 \n", - "-18.75 0.66 \n", - "10000000.0 10000000.0 \n", - "-17.94 1.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.37 0.34 \n", - "-3.34 0.67 \n", - "-1.34 0.82 \n", - "-1.29 0.45 \n", - "-2.05 1.01 \n", - "10000000.0 10000000.0 \n", - "-0.13 0.73 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.71 1.43 \n", - "-22.74 4.57 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "-2.64 1.79 \n", - "-2.64 1.79 \n", - "-28.53 1.54 \n", - "-28.53 1.54 \n", - "None 1.0 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-3.89 0.58 \n", - "-6.77 0.31 \n", - "-6.77 0.31 \n", - "-9.67 0.61 \n", - "-8.78 0.63 \n", - "10000000.0 10000000.0 \n", - "1.71 4.5 \n", - "-75.98 3.57 \n", - "None 67.64 \n", - "356.38 60.74 \n", - "-1.7 25.08 \n", - "-1.7 29.89 \n", - "-1.7 39.36 \n", - "1.24 0.54 \n", - "None 13.17 \n", - "-5.97 0.42 \n", - "-3.88 0.56 \n", - "-1.7 12.91 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 1.99 \n", - "10000000.0 10000000.0 \n", - "None 0.78 \n", - "-90.63 3.53 \n", - "10000000.0 10000000.0 \n", - "-20.64 7.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-41.44 6.04 \n", - "-0.67 12.28 \n", - "-41.44 5.89 \n", - "-0.67 12.21 \n", - "-6.16 0.07 \n", - "None 0.72 \n", - "None 2.19 \n", - "None 2.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.13 \n", - "None 1.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.63 0.24 \n", - "-52.68 1.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.17 \n", - "None 1.17 \n", - "-9.57 1.97 \n", - "None 0.71 \n", - "None 0.71 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.2 \n", - "-47.65 1.66 \n", - "None 0.31 \n", - "None 0.31 \n", - "10000000.0 10000000.0 \n", - "None 0.25 \n", - "-4.18 0.79 \n", - "-2.7 0.08 \n", - "-10.93 1.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.13 \n", - "None 1.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "1.11 1.62 \n", - "-6.81 4.66 \n", - "None 1.64 \n", - "None 1.33 \n", - "10000000.0 10000000.0 \n", - "None 1.33 \n", - "None 1.9 \n", - "None 1.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.41 0.7 \n", - "-6.16 0.07 \n", - "None 1.04 \n", - "None 0.75 \n", - "None 0.75 \n", - "None 0.42 \n", - "None 0.42 \n", - "8.6 6.67 \n", - "12.69 6.65 \n", - "-5.55 0.64 \n", - "0.26 0.49 \n", - "None 1.87 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "None 1.91 \n", - "None 2.12 \n", - "None 2.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.82 0.43 \n", - "-10.79 0.5 \n", - "None 1.4 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.44 \n", - "10000000.0 10000000.0 \n", - "None 0.44 \n", - "10000000.0 10000000.0 \n", - "None 1.34 \n", - "None 1.34 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.71 \n", - "-6.16 0.07 \n", - "-4.32 0.43 \n", - "-4.31 0.43 \n", - "None 1.64 \n", - "None 0.4 \n", - "None 0.4 \n", - "None 0.4 \n", - "-17.0 1.55 \n", - "None 1.09 \n", - "-8.75 0.74 \n", - "None 3.92 \n", - "-6.16 0.07 \n", - "-6.16 0.07 \n", - "None 1.06 \n", - "10000000.0 10000000.0 \n", - "None 0.75 \n", - "None 0.64 \n", - "-6.16 0.07 \n", - "None 1.1 \n", - "None 8.05 \n", - "10000000.0 10000000.0 \n", - "-5.83 0.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.08 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "None 2.5 \n", - "None 2.5 \n", - "None 3.63 \n", - "-6.16 0.07 \n", - "None 0.61 \n", - "None 0.58 \n", - "None 0.58 \n", - "10000000.0 10000000.0 \n", - "None 0.58 \n", - "None 2.12 \n", - "None 2.12 \n", - "-57.04 4.82 \n", - "-52.81 1.37 \n", - "-52.81 1.37 \n", - "-47.24 1.63 \n", - "-47.24 1.63 \n", - "None 3.07 \n", - "None 1.71 \n", - "-1.46 1.02 \n", - "-11.02 0.54 \n", - "None 4.27 \n", - "None 2.23 \n", - "None 2.23 \n", - "-6.81 4.41 \n", - "None 0.71 \n", - "None 1.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.26 \n", - "7.22 1.46 \n", - "None 1.29 \n", - "None 1.27 \n", - "None 1.27 \n", - "-6.01 0.82 \n", - "-6.24 1.14 \n", - "None 4.58 \n", - "-145.01 5.64 \n", - "None 7.88 \n", - "None 4.58 \n", - "-7.08 0.97 \n", - "None 4.41 \n", - "10000000.0 10000000.0 \n", - "None 4.37 \n", - "None 4.41 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "31.66 0.59 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.66 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 2.18 \n", - "None 2.18 \n", - "None 0.71 \n", - "None 0.71 \n", - "-22.39 2.12 \n", - "None 2.69 \n", - "None 2.69 \n", - "-6.16 0.07 \n", - "None 0.62 \n", - "None 0.62 \n", - "None 3.78 \n", - "None 3.78 \n", - "None 3.78 \n", - "None 3.93 \n", - "None 3.95 \n", - "None 3.95 \n", - "-6.16 0.07 \n", - "None 1.94 \n", - "None 1.94 \n", - "None 0.91 \n", - "None 0.91 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "3.1 0.42 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.27 0.73 \n", - "-2.33 0.38 \n", - "-20.94 1.86 \n", - "-17.0 1.55 \n", - "-51.44 2.63 \n", - "-45.62 2.57 \n", - "10000000.0 10000000.0 \n", - "-15.65 0.87 \n", - "-46.95 2.6 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-15.18 0.93 \n", - "10000000.0 10000000.0 \n", - "-15.19 1.83 \n", - "10000000.0 10000000.0 \n", - "-16.12 0.96 \n", - "10000000.0 10000000.0 \n", - "-16.1 1.55 \n", - "10000000.0 10000000.0 \n", - "-15.65 0.87 \n", - "10000000.0 10000000.0 \n", - "-15.65 0.87 \n", - "-15.65 0.87 \n", - "10000000.0 10000000.0 \n", - "-15.65 0.87 \n", - "-15.65 0.87 \n", - "10000000.0 10000000.0 \n", - "-15.65 0.87 \n", - "-2.61 0.35 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.62 0.35 \n", - "-2.62 0.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-61.4 3.25 \n", - "-60.08 3.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-17.46 1.06 \n", - "-16.98 1.12 \n", - "-17.46 1.06 \n", - "-17.46 1.06 \n", - "-17.46 1.06 \n", - "10000000.0 10000000.0 \n", - "10.92 0.92 \n", - "-1.05 0.37 \n", - "-10.34 0.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.56 0.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.77 0.58 \n", - "-6.36 0.72 \n", - "3.05 5.07 \n", - "10000000.0 10000000.0 \n", - "-28.27 1.63 \n", - "-31.87 1.48 \n", - "-31.87 1.48 \n", - "-35.4 1.67 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.16 0.07 \n", - "6.16 0.07 \n", - "6.16 0.07 \n", - "-6.11 2.69 \n", - "-8.35 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.8 0.75 \n", - "-10.4 1.02 \n", - "-9.16 0.67 \n", - "-1.38 0.46 \n", - "-29.08 1.5 \n", - "4.8 1.49 \n", - "10000000.0 10000000.0 \n", - "91.96 1.72 \n", - "-9.86 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.61 0.59 \n", - "-2.68 0.6 \n", - "-3.01 0.64 \n", - "10000000.0 10000000.0 \n", - "-113.88 10.96 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-51.63 2.72 \n", - "-52.25 2.45 \n", - "-10.74 0.59 \n", - "-21.54 0.99 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.47 \n", - "None 4.55 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 2.14 \n", - "None 9.74 \n", - "None 9.69 \n", - "10000000.0 10000000.0 \n", - "None 1.75 \n", - "None 9.8 \n", - "None 1.94 \n", - "None 1.13 \n", - "None 3.78 \n", - "None 0.71 \n", - "None 1.51 \n", - "None 4.27 \n", - "None 2.12 \n", - "None 3.63 \n", - "None 3.92 \n", - "None 2.88 \n", - "None 1.64 \n", - "None 1.4 \n", - "None 1.4 \n", - "None 1.91 \n", - "10000000.0 10000000.0 \n", - "None 4.3 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.99 \n", - "None 2.84 \n", - "None 2.96 \n", - "None 1.16 \n", - "None 4.27 \n", - "None 0.79 \n", - "10000000.0 10000000.0 \n", - "None 1.75 \n", - "None 4.33 \n", - "None 0.86 \n", - "None 2.18 \n", - "None 0.31 \n", - "None 1.92 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 9.69 \n", - "None 2.55 \n", - "None 2.52 \n", - "None 3.8 \n", - "None 3.8 \n", - "None 0.96 \n", - "None 0.99 \n", - "None 2.8 \n", - "None 2.79 \n", - "None 3.13 \n", - "-6.16 0.07 \n", - "None 1.94 \n", - "None 5.2 \n", - "None 2.69 \n", - "None 2.79 \n", - "None 0.69 \n", - "None 0.71 \n", - "None 0.79 \n", - "None 0.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 3.87 \n", - "None 0.71 \n", - "None 0.62 \n", - "None 1.27 \n", - "None 2.23 \n", - "None 0.58 \n", - "None 4.27 \n", - "None 1.09 \n", - "None 0.81 \n", - "None 0.44 \n", - "None 4.07 \n", - "None 2.09 \n", - "None 0.42 \n", - "10000000.0 10000000.0 \n", - "None 1.87 \n", - "None 1.33 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 1.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 4.3 \n", - "None 0.69 \n", - "None 2.22 \n", - "None 0.87 \n", - "None 0.72 \n", - "None 5.73 \n", - "None 0.49 \n", - "None 0.71 \n", - "None 2.84 \n", - "None 0.71 \n", - "None 4.37 \n", - "None 1.16 \n", - "None 0.83 \n", - "None 0.79 \n", - "None 2.21 \n", - "None 2.21 \n", - "None 5.11 \n", - "None 1.6 \n", - "None 0.71 \n", - "None 3.55 \n", - "None 3.89 \n", - "None 0.34 \n", - "None 0.54 \n", - "10000000.0 10000000.0 \n", - "None 0.54 \n", - "None 0.31 \n", - "-11.27 0.87 \n", - "None 0.71 \n", - "None 8.61 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 0.66 \n", - "None 0.64 \n", - "None 0.59 \n", - "None 3.93 \n", - "None 3.69 \n", - "None 4.26 \n", - "None 0.45 \n", - "None 0.35 \n", - "None 2.8 \n", - "None 4.02 \n", - "None 0.71 \n", - "None 2.72 \n", - "None 0.98 \n", - "None 1.09 \n", - "None 0.83 \n", - "None 6.08 \n", - "None 0.48 \n", - "None 0.83 \n", - "None 2.21 \n", - "None 5.2 \n", - "None 4.44 \n", - "None 3.86 \n", - "None 0.71 \n", - "None 2.88 \n", - "None 4.03 \n", - "None 0.55 \n", - "None 1.22 \n", - "None 1.26 \n", - "None 0.57 \n", - "None 1.34 \n", - "None 0.49 \n", - "None 0.52 \n", - "10000000.0 10000000.0 \n", - "None 0.57 \n", - "None 0.55 \n", - "None 0.72 \n", - "None 0.68 \n", - "None 1.27 \n", - "None 0.61 \n", - "10000000.0 10000000.0 \n", - "None 0.72 \n", - "None 0.69 \n", - "None 0.99 \n", - "None 2.66 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 0.71 \n", - "None 0.54 \n", - "None 0.86 \n", - "None 3.87 \n", - "None 2.55 \n", - "None 2.04 \n", - "None 3.8 \n", - "None 2.6 \n", - "None 4.21 \n", - "None 0.71 \n", - "None 2.72 \n", - "None 0.76 \n", - "None 1.4 \n", - "None 0.48 \n", - "None 5.2 \n", - "None 0.54 \n", - "None 4.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.27 \n", - "None 0.42 \n", - "None 0.71 \n", - "None 2.84 \n", - "None 0.71 \n", - "None 0.66 \n", - "None 1.0 \n", - "None 0.71 \n", - "None 0.38 \n", - "None 0.78 \n", - "None 2.98 \n", - "None 2.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.75 \n", - "-6.16 0.07 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None 1.51 \n", - "-6.16 0.07 \n", - "None 1.26 \n", - "None 1.02 \n", - "None 0.64 \n", - "None 2.8 \n", - "None 4.02 \n", - "None 0.71 \n", - "None 0.98 \n", - "None 0.83 \n", - "None 6.08 \n", - "None 6.07 \n", - "None 0.72 \n", - "None 0.71 \n", - "None 2.88 \n", - "None 0.57 \n", - "None 1.27 \n", - "None 4.27 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "10000000.0 10000000.0 \n", - "None 0.71 \n", - "None 2.18 \n", - "None 0.71 \n", - "-21.67 1.48 \n", - "-4.96 0.43 \n", - "-8.67 0.27 \n", - "10000000.0 10000000.0 \n", - "-19.42 5.23 \n", - "-8.44 0.34 \n", - "7.37 0.85 \n", - "-6.38 0.98 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.84 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.44 0.56 \n", - "-5.37 0.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.7 0.84 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.1 1.13 \n", - "-4.83 1.13 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.34 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.09 0.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-2.13 0.75 \n", - "-11.78 0.87 \n", - "-8.55 0.85 \n", - "3.21 0.51 \n", - "10000000.0 10000000.0 \n", - "-1.36 0.55 \n", - "-6.15 0.49 \n", - "-8.68 0.26 \n", - "10000000.0 10000000.0 \n", - "-8.68 0.26 \n", - "10000000.0 10000000.0 \n", - "-8.68 0.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.68 0.26 \n", - "-11.98 0.63 \n", - "-8.68 0.26 \n", - "-8.68 0.26 \n", - "-8.68 0.26 \n", - "10000000.0 10000000.0 \n", - "-8.68 0.26 \n", - "1.55 0.84 \n", - "10000000.0 10000000.0 \n", - "373.65 4.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "2.22 0.33 \n", - "5.09 1.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "17.95 1.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "25.58 1.03 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-22.97 1.17 \n", - "10000000.0 10000000.0 \n", - "8.44 0.51 \n", - "-2.03 0.39 \n", - "10000000.0 10000000.0 \n", - "2.36 0.55 \n", - "-6.93 0.23 \n", - "10000000.0 10000000.0 \n", - "-0.98 0.07 \n", - "1.0 0.09 \n", - "10000000.0 10000000.0 \n", - "-4.42 0.11 \n", - "-6.53 0.1 \n", - "-6.42 1.8 \n", - "1.3 0.22 \n", - "-7.41 0.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-22.49 1.11 \n", - "-3.99 0.33 \n", - "-0.88 0.33 \n", - "-14.43 2.15 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-39.55 7.46 \n", - "-18.76 1.3 \n", - "-14.73 1.19 \n", - "0.85 0.65 \n", - "10000000.0 10000000.0 \n", - "-10.7 1.43 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-5.9 1.12 \n", - "0.36 0.71 \n", - "0.14 0.96 \n", - "-6.42 1.8 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "8.13 1.34 \n", - "-10.04 0.79 \n", - "17.59 12.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.29 4.95 \n", - "-10.04 4.53 \n", - "-1.81 1.19 \n", - "-8.92 1.02 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-4.44 0.24 \n", - "-8.51 0.94 \n", - "4.56 0.71 \n", - "-2.72 0.57 \n", - "0.19 0.49 \n", - "-21.94 1.79 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.84 1.14 \n", - "-7.84 1.14 \n", - "-0.83 1.48 \n", - "-12.69 1.11 \n", - "-4.95 0.97 \n", - "-22.19 1.11 \n", - "10000000.0 10000000.0 \n", - "5.3 2.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-40.11 2.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-32.71 2.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-8.15 3.02 \n", - "9.9 1.88 \n", - "9.9 1.88 \n", - "-11.13 4.35 \n", - "-10.42 6.57 \n", - "-0.45 1.16 \n", - "14.14 0.81 \n", - "1.69 1.99 \n", - "1.72 0.24 \n", - "-5.92 0.59 \n", - "-12.38 2.0 \n", - "-10.15 0.27 \n", - "0.44 0.71 \n", - "10000000.0 10000000.0 \n", - "-13.28 2.3 \n", - "-16.57 1.1 \n", - "-18.84 7.46 \n", - "-7.85 1.99 \n", - "-5.79 0.37 \n", - "-8.84 0.76 \n", - "-18.42 5.84 \n", - "-7.13 0.34 \n", - "1.22 0.73 \n", - "2.1 4.19 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-27.53 5.1 \n", - "-5.07 0.71 \n", - "1.06 0.41 \n", - "-28.93 1.06 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-86.46 1.22 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-16.16 0.73 \n", - "1.85 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-294.7 3.27 \n", - "-8.88 3.08 \n", - "10000000.0 10000000.0 \n", - "-19.01 0.45 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-6.37 0.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10.11 0.87 \n", - "1.82 0.08 \n", - "2.57 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "None None \n", - "-20.14 1.86 \n", - "1.4 0.94 \n", - "-8.44 0.34 \n", - "-8.44 0.34 \n", - "None None \n", - "-4.44 0.24 \n", - "-4.44 0.24 \n", - "-5.92 1.01 \n", - "10000000.0 10000000.0 \n", - "-9.09 0.26 \n", - "-0.69 0.38 \n", - "-0.01 5.36 \n", - "-0.69 0.38 \n", - "1.52 0.35 \n", - "-0.38 0.45 \n", - "-5.81 0.35 \n", - "4.89 0.24 \n", - "4.44 0.24 \n", - "9.66 0.82 \n", - "-6.83 1.02 \n", - "-5.72 0.82 \n", - "-0.32 0.43 \n", - "-2.81 4.39 \n", - "-0.32 0.43 \n", - "-5.72 0.82 \n", - "-5.98 1.06 \n", - "-22.86 1.25 \n", - "-2.67 0.69 \n", - "4.04 0.28 \n", - "-64.18 0.33 \n", - "-64.18 0.33 \n", - "10000000.0 10000000.0 \n", - "-214.76 4.42 \n", - "-215.31 0.55 \n", - "-215.31 0.55 \n", - "-15.5 1.25 \n", - "3.52 0.71 \n", - "-226.68 0.57 \n", - "190.71 0.88 \n", - "None 1.47 \n", - "-6.93 0.23 \n", - "10000000.0 10000000.0 \n", - "-3.63 3.1 \n", - "-3.62 0.46 \n", - "-3.62 0.45 \n", - "-3.62 0.46 \n", - "-3.62 0.45 \n", - "-2.99 0.53 \n", - "-2.99 0.53 \n", - "-2.99 0.53 \n", - "-2.99 0.53 \n", - "-0.28 0.37 \n", - "-9.69 1.18 \n", - "-24.69 3.01 \n", - "-15.26 1.57 \n", - "-15.26 1.57 \n", - "-35.58 1.5 \n", - "-35.58 1.5 \n", - "-35.58 1.5 \n", - "-9.69 1.18 \n", - "-24.69 3.01 \n", - "-15.26 1.57 \n", - "-15.26 1.57 \n", - "-35.58 1.5 \n", - "-35.58 1.5 \n", - "-35.58 1.5 \n", - "-4.39 0.71 \n", - "-4.39 0.71 \n", - "-3.78 1.25 \n", - "-18.78 2.9 \n", - "-9.35 1.5 \n", - "-9.35 1.5 \n", - "-29.67 1.67 \n", - "-29.67 1.67 \n", - "-29.67 1.67 \n", - "-105.97 0.91 \n", - "-105.97 0.91 \n", - "-105.97 0.91 \n", - "-194.4 1.6 \n", - "-94.12 0.75 \n", - "-94.12 0.75 \n", - "-116.64 0.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-102.21 0.86 \n", - "-97.2 0.8 \n", - "-97.2 0.8 \n", - "-104.99 2.05 \n", - "-104.99 2.05 \n", - "-55.44 7.96 \n", - "-55.44 7.97 \n", - "-55.44 7.96 \n", - "-55.44 7.97 \n", - "6.93 2.3 \n", - "-23.08 5.64 \n", - "-4.22 2.9 \n", - "-4.22 2.9 \n", - "-44.86 2.95 \n", - "-44.86 2.95 \n", - "-44.86 2.95 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-22.2 4.1 \n", - "-14.64 2.65 \n", - "-20.98 6.74 \n", - "-20.98 3.97 \n", - "-18.11 6.86 \n", - "-18.11 7.48 \n", - "-18.11 8.12 \n", - "-22.2 4.1 \n", - "-14.64 2.65 \n", - "-20.98 6.74 \n", - "-20.98 3.97 \n", - "-18.11 6.86 \n", - "-18.11 7.48 \n", - "-18.11 8.12 \n", - "-3.88 0.56 \n", - "10000000.0 10000000.0 \n", - "1.79 0.71 \n", - "-1.05 0.37 \n", - "-1.01 0.44 \n", - "-1.05 0.37 \n", - "-14.03 5.29 \n", - "-14.03 5.29 \n", - "-14.03 5.29 \n", - "7.05 0.72 \n", - "7.05 0.71 \n", - "-5.9 0.57 \n", - "-8.17 1.42 \n", - "10000000.0 10000000.0 \n", - "-18.75 0.66 \n", - "-0.11 0.82 \n", - "14.98 0.45 \n", - "14.97 0.44 \n", - "-18.62 1.19 \n", - "-17.46 1.06 \n", - "-17.46 1.06 \n", - "-17.46 1.06 \n", - "-17.46 1.06 \n", - "-17.46 1.06 \n", - "-17.46 1.06 \n", - "-17.46 1.06 \n", - "-16.98 1.12 \n", - "-17.46 1.06 \n", - "-17.35 1.14 \n", - "-17.46 1.06 \n", - "-17.46 1.06 \n", - "-17.46 1.06 \n", - "-17.46 1.06 \n", - "3.52 0.71 \n", - "-7.29 0.77 \n", - "-7.29 0.77 \n", - "23.13 1.62 \n", - "23.13 1.62 \n", - "23.13 1.62 \n", - "23.13 1.62 \n", - "24.06 1.67 \n", - "24.06 1.66 \n", - "21.14 1.76 \n", - "21.14 1.76 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "-29.74 6.6 \n", - "-29.74 6.61 \n", - "-30.27 6.58 \n", - "-30.27 6.6 \n", - "4.85 0.44 \n", - "4.85 0.43 \n", - "-47.54 0.82 \n", - "-47.54 0.81 \n", - "4.89 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "5.79 0.65 \n", - "5.79 0.65 \n", - "52.05 7.13 \n", - "52.05 7.14 \n", - "5.79 0.65 \n", - "5.79 0.65 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "-29.74 6.6 \n", - "-29.74 6.61 \n", - "-30.27 6.58 \n", - "-30.27 6.6 \n", - "4.9 0.68 \n", - "4.9 0.68 \n", - "15.98 0.68 \n", - "15.97 0.67 \n", - "7.12 0.68 \n", - "7.12 0.68 \n", - "5.61 0.71 \n", - "5.6 0.71 \n", - "8.52 6.13 \n", - "8.52 6.15 \n", - "5.22 6.14 \n", - "5.22 6.15 \n", - "6.5 0.45 \n", - "6.49 0.45 \n", - "5.51 0.38 \n", - "5.51 0.38 \n", - "-5.9 0.76 \n", - "-5.9 0.76 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "25.45 1.66 \n", - "25.45 1.66 \n", - "22.53 1.71 \n", - "22.53 1.71 \n", - "-5.9 0.76 \n", - "-5.9 0.76 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "25.45 1.66 \n", - "25.45 1.66 \n", - "22.53 1.71 \n", - "22.53 1.71 \n", - "-5.9 0.76 \n", - "-5.9 0.76 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "25.45 1.66 \n", - "25.45 1.66 \n", - "22.53 1.71 \n", - "22.53 1.71 \n", - "-5.9 0.76 \n", - "-5.9 0.76 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "25.45 1.66 \n", - "25.45 1.66 \n", - "22.53 1.71 \n", - "22.53 1.71 \n", - "-5.9 0.76 \n", - "-5.9 0.76 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "25.45 1.66 \n", - "25.45 1.66 \n", - "22.53 1.71 \n", - "22.53 1.71 \n", - "-5.9 0.76 \n", - "-5.9 0.76 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "25.45 1.66 \n", - "25.45 1.66 \n", - "22.53 1.71 \n", - "22.53 1.71 \n", - "-5.9 0.76 \n", - "-5.9 0.76 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "25.45 1.66 \n", - "25.45 1.66 \n", - "22.53 1.71 \n", - "22.53 1.71 \n", - "-5.9 0.76 \n", - "-5.9 0.76 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "24.52 1.6 \n", - "25.45 1.66 \n", - "25.45 1.66 \n", - "22.53 1.71 \n", - "22.53 1.71 \n", - "9.36 0.4 \n", - "9.35 0.39 \n", - "39.77 1.35 \n", - "39.77 1.35 \n", - "39.77 1.35 \n", - "39.77 1.35 \n", - "40.7 1.44 \n", - "40.7 1.44 \n", - "37.78 1.47 \n", - "37.78 1.47 \n", - "9.36 0.4 \n", - "9.35 0.39 \n", - "39.77 1.35 \n", - "39.77 1.35 \n", - "39.77 1.35 \n", - "39.77 1.35 \n", - "40.7 1.44 \n", - "40.7 1.44 \n", - "37.78 1.47 \n", - "37.78 1.47 \n", - "9.36 0.4 \n", - "9.35 0.39 \n", - "39.77 1.35 \n", - "39.77 1.35 \n", - "39.77 1.35 \n", - "39.77 1.35 \n", - "40.7 1.44 \n", - "40.7 1.44 \n", - "37.78 1.47 \n", - "37.78 1.47 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-25.53 1.39 \n", - "-25.53 1.39 \n", - "14.33 7.13 \n", - "14.33 7.14 \n", - "7.39 0.34 \n", - "7.39 0.34 \n", - "14.33 7.13 \n", - "14.33 7.14 \n", - "39.36 8.72 \n", - "39.36 8.73 \n", - "-7.29 0.77 \n", - "-7.29 0.77 \n", - "39.36 8.72 \n", - "39.36 8.73 \n", - "9.36 0.4 \n", - "9.35 0.39 \n", - "6.28 0.26 \n", - "6.28 0.26 \n", - "9.36 0.4 \n", - "9.35 0.39 \n", - "7.39 0.34 \n", - "7.39 0.34 \n", - "-7.29 0.77 \n", - "-7.29 0.77 \n", - "-7.29 0.77 \n", - "-7.29 0.77 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-23.54 1.51 \n", - "-23.54 1.5 \n", - "-25.53 1.39 \n", - "-25.53 1.39 \n", - "-22.24 1.49 \n", - "-22.24 1.49 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-22.8 1.45 \n", - "-22.8 1.45 \n", - "-22.8 1.45 \n", - "-22.8 1.45 \n", - "-22.63 1.4 \n", - "-22.64 1.4 \n", - "-22.63 1.4 \n", - "-22.64 1.4 \n", - "-13.17 1.52 \n", - "-13.17 1.52 \n", - "-23.54 1.51 \n", - "-23.54 1.5 \n", - "-26.41 6.55 \n", - "-26.41 6.57 \n", - "-26.94 6.53 \n", - "-26.94 6.55 \n", - "8.52 6.41 \n", - "8.52 6.43 \n", - "18.64 7.26 \n", - "18.64 7.27 \n", - "18.11 7.24 \n", - "18.11 7.25 \n", - "4.89 0.24 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "5.82 0.62 \n", - "5.82 0.62 \n", - "2.9 0.55 \n", - "2.9 0.54 \n", - "30.11 7.09 \n", - "30.11 7.11 \n", - "37.81 1.42 \n", - "37.81 1.42 \n", - "30.11 7.09 \n", - "30.11 7.11 \n", - "55.14 8.69 \n", - "55.14 8.7 \n", - "23.13 1.62 \n", - "23.13 1.62 \n", - "55.14 8.69 \n", - "55.14 8.7 \n", - "39.77 1.35 \n", - "39.77 1.35 \n", - "36.7 1.39 \n", - "36.69 1.39 \n", - "39.77 1.35 \n", - "39.77 1.35 \n", - "37.81 1.42 \n", - "37.81 1.42 \n", - "23.13 1.62 \n", - "23.13 1.62 \n", - "23.13 1.62 \n", - "23.13 1.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "6.88 0.4 \n", - "6.88 0.4 \n", - "4.89 0.25 \n", - "4.89 0.24 \n", - "8.17 0.76 \n", - "8.17 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "7.61 0.54 \n", - "7.61 0.54 \n", - "7.61 0.54 \n", - "7.61 0.54 \n", - "7.78 0.43 \n", - "7.78 0.43 \n", - "7.78 0.43 \n", - "7.78 0.43 \n", - "17.25 0.43 \n", - "17.24 0.43 \n", - "6.88 0.4 \n", - "6.88 0.4 \n", - "4.89 0.24 \n", - "6.27 0.48 \n", - "6.26 0.48 \n", - "3.9 0.48 \n", - "3.9 0.48 \n", - "5.88 0.28 \n", - "5.87 0.28 \n", - "15.21 0.32 \n", - "15.21 0.32 \n", - "7.25 0.53 \n", - "7.25 0.53 \n", - "30.11 7.09 \n", - "30.11 7.11 \n", - "30.99 7.1 \n", - "30.99 7.11 \n", - "31.3 7.14 \n", - "31.3 7.15 \n", - "37.81 1.42 \n", - "37.81 1.42 \n", - "-37.54 0.18 \n", - "3.92 0.71 \n", - "301.15 1.97 \n", - "-12.55 0.71 \n", - "-12.83 0.71 \n", - "276.09 1.72 \n", - "2.95 4.67 \n", - "0.0 0.0 \n", - "-70.22 5.56 \n", - "-502.62 1.46 \n", - "10000000.0 10000000.0 \n", - "-480.68 1.14 \n", - "10000000.0 10000000.0 \n", - "-627.54 1.16 \n", - "179.11 2.26 \n", - "-418.46 1.06 \n", - "-29.44 2.33 \n", - "390.79 2.23 \n", - "-59.27 0.85 \n", - "10000000.0 10000000.0 \n", - "-87.67 0.3 \n", - "10000000.0 10000000.0 \n", - "-66.63 3.68 \n", - "10000000.0 10000000.0 \n", - "115.75 0.96 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-329.32 1.77 \n", - "10000000.0 10000000.0 \n", - "-209.06 1.06 \n", - "10000000.0 10000000.0 \n", - "-483.1 1.62 \n", - "-59.86 2.4 \n", - "-498.36 1.63 \n", - "2.67 2.26 \n", - "-113.81 2.23 \n", - "-51.01 3.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "802.68 5.13 \n", - "10000000.0 10000000.0 \n", - "801.69 5.32 \n", - "10000000.0 10000000.0 \n", - "797.51 5.21 \n", - "796.52 5.41 \n", - "830.27 5.79 \n", - "10000000.0 10000000.0 \n", - "781.1 5.85 \n", - "10000000.0 10000000.0 \n", - "731.93 5.92 \n", - "91.66 1.03 \n", - "-538.39 1.22 \n", - "33.21 1.15 \n", - "301.85 1.86 \n", - "591.86 3.81 \n", - "41.94 4.19 \n", - "-51.41 0.64 \n", - "-122.29 1.06 \n", - "-109.87 0.86 \n", - "-2.17 0.58 \n", - "-60.62 0.81 \n", - "591.86 3.81 \n", - "-68.68 1.12 \n", - "68.77 5.16 \n", - "-139.21 5.41 \n", - "-41.92 0.33 \n", - "-32.23 5.27 \n", - "-1.65 5.23 \n", - "10000000.0 10000000.0 \n", - "-6.13 2.06 \n", - "-237.5 2.34 \n", - "-429.53 1.87 \n", - "148.67 1.0 \n", - "-92.26 0.71 \n", - "236.76 1.01 \n", - "281.75 1.49 \n", - "-33.28 0.96 \n", - "-54.23 2.19 \n", - "110.02 0.7 \n", - "-236.57 3.58 \n", - "-274.69 3.94 \n", - "-548.85 0.36 \n", - "-205.23 0.75 \n", - "-464.02 0.27 \n", - "-130.8 0.29 \n", - "-904.31 3.62 \n", - "-531.87 1.84 \n", - "-105.68 2.77 \n", - "-63.36 2.89 \n", - "-692.83 4.04 \n", - "-64.35 3.01 \n", - "-64.35 3.01 \n", - "-65.34 3.16 \n", - "279.51 1.54 \n", - "63.85 4.82 \n", - "278.52 1.68 \n", - "86.21 4.91 \n", - "-87.06 2.69 \n", - "-153.0 2.21 \n", - "-218.28 1.54 \n", - "-327.76 2.95 \n", - "-313.58 3.48 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-171.54 1.14 \n", - "-100.66 1.02 \n", - "-171.53 1.14 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "343.94 1.51 \n", - "10000000.0 10000000.0 \n", - "-49.62 0.51 \n", - "-40.09 0.46 \n", - "-49.2 0.17 \n", - "-340.04 0.3 \n", - "-248.97 0.33 \n", - "-414.01 1.12 \n", - "-286.41 1.59 \n", - "-63.22 0.45 \n", - "-271.15 1.59 \n", - "-82.42 0.63 \n", - "-124.69 0.47 \n", - "-252.51 0.18 \n", - "99.77 0.75 \n", - "122.4 0.39 \n", - "-273.02 0.55 \n", - "-153.92 0.62 \n", - "-455.32 1.91 \n", - "-417.96 2.06 \n", - "-506.08 1.93 \n", - "-118.5 2.43 \n", - "-109.39 1.92 \n", - "6.89 1.56 \n", - "-76.12 1.01 \n", - "10000000.0 10000000.0 \n", - "-51.35 1.01 \n", - "10000000.0 10000000.0 \n", - "-443.56 1.86 \n", - "-129.39 6.26 \n", - "-198.43 0.81 \n", - "-190.41 0.79 \n", - "-198.43 0.81 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-30.56 4.94 \n", - "46.33 0.31 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-241.65 0.78 \n", - "-231.17 0.79 \n", - "-296.58 3.2 \n", - "-437.6 1.99 \n", - "-486.85 2.11 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-261.59 0.14 \n", - "10000000.0 10000000.0 \n", - "-111.05 0.74 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-791.47 4.15 \n", - "-20.05 2.93 \n", - "-15.1 2.94 \n", - "22.26 3.07 \n", - "27.22 3.08 \n", - "64.58 3.21 \n", - "-220.42 4.94 \n", - "-250.02 5.1 \n", - "-274.2 5.52 \n", - "-322.17 5.17 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "587.51 3.87 \n", - "607.17 4.0 \n", - "691.85 4.42 \n", - "711.5 4.55 \n", - "1004.85 6.11 \n", - "1024.51 6.23 \n", - "900.51 5.54 \n", - "920.17 5.67 \n", - "-610.68 1.27 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "732.51 4.86 \n", - "755.83 4.92 \n", - "941.17 6.01 \n", - "964.5 6.06 \n", - "836.84 5.43 \n", - "860.16 5.48 \n", - "628.17 4.29 \n", - "651.5 4.35 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "662.26 4.69 \n", - "685.57 4.84 \n", - "975.26 6.33 \n", - "998.58 6.45 \n", - "-309.74 3.08 \n", - "-99.34 2.49 \n", - "-172.61 0.32 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-440.81 1.32 \n", - "-420.59 1.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "214.62 1.62 \n", - "-45.96 2.17 \n", - "-454.6 3.56 \n", - "-55.9 3.55 \n", - "-1.16 6.64 \n", - "-1.16 6.64 \n", - "-133.77 1.77 \n", - "74.78 1.69 \n", - "286.46 1.65 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-673.08 3.7 \n", - "581.21 6.67 \n", - "-516.3 2.74 \n", - "-632.02 7.23 \n", - "-833.72 8.23 \n", - "-992.2 9.4 \n", - "909.45 6.34 \n", - "-270.74 1.36 \n", - "642.75 6.52 \n", - "10000000.0 10000000.0 \n", - "149.71 0.9 \n", - "135.47 0.83 \n", - "10000000.0 10000000.0 \n", - "72.09 1.02 \n", - "-810.91 3.7 \n", - "10000000.0 10000000.0 \n", - "-56.78 8.32 \n", - "700.9 6.38 \n", - "-1102.35 10.26 \n", - "700.9 6.38 \n", - "10000000.0 10000000.0 \n", - "-150.81 0.32 \n", - "10000000.0 10000000.0 \n", - "-123.95 0.45 \n", - "10000000.0 10000000.0 \n", - "309.01 7.32 \n", - "294.07 7.49 \n", - "-284.84 0.2 \n", - "323.95 7.18 \n", - "260.26 7.37 \n", - "233.99 7.67 \n", - "219.05 7.82 \n", - "204.1 7.99 \n", - "-58.88 0.24 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-230.92 5.21 \n", - "-92.15 0.66 \n", - "-148.06 6.71 \n", - "-39.31 2.46 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "73.12 4.19 \n", - "-193.93 4.69 \n", - "-90.41 0.36 \n", - "-101.93 0.3 \n", - "-90.41 0.36 \n", - "-100.98 0.38 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-305.06 4.77 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "757.46 4.46 \n", - "777.12 4.59 \n", - "-376.03 2.03 \n", - "10000000.0 10000000.0 \n", - "222.13 1.29 \n", - "172.89 1.57 \n", - "26.1 1.44 \n", - "-363.76 12.58 \n", - "-401.8 12.59 \n", - "10.14 0.69 \n", - "-48.31 0.88 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "34.06 9.57 \n", - "58.76 6.99 \n", - "44.2 6.88 \n", - "-803.42 2.87 \n", - "-590.92 2.92 \n", - "-73.47 0.33 \n", - "35.38 6.87 \n", - "37.37 6.91 \n", - "10000000.0 10000000.0 \n", - "51.93 6.83 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-66.21 0.5 \n", - "72.52 1.98 \n", - "105.06 2.25 \n", - "145.61 2.05 \n", - "54.54 1.7 \n", - "9.67 0.67 \n", - "-39.48 1.04 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-133.77 1.77 \n", - "79.7 3.04 \n", - "285.35 2.4 \n", - "71.88 2.09 \n", - "285.56 1.43 \n", - "240.3 1.19 \n", - "45.94 0.49 \n", - "184.12 0.85 \n", - "173.75 0.89 \n", - "112.27 0.8 \n", - "-754.69 3.65 \n", - "-275.89 2.5 \n", - "505.05 6.98 \n", - "-169.1 0.34 \n", - "631.84 6.78 \n", - "-757.74 3.61 \n", - "-741.75 3.67 \n", - "-795.78 3.61 \n", - "-789.31 3.63 \n", - "10000000.0 10000000.0 \n", - "-116.63 0.71 \n", - "10000000.0 10000000.0 \n", - "12.31 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "34.53 6.88 \n", - "-1.7 6.87 \n", - "7.78 6.87 \n", - "-44.92 6.87 \n", - "43.08 6.91 \n", - "36.52 6.92 \n", - "36.81 6.89 \n", - "0.58 6.88 \n", - "10.06 6.88 \n", - "-42.64 6.88 \n", - "45.36 6.92 \n", - "38.8 6.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-178.87 0.55 \n", - "10000000.0 10000000.0 \n", - "-122.7 0.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-0.85 6.87 \n", - "8.63 6.86 \n", - "-44.07 6.86 \n", - "43.93 6.9 \n", - "-341.56 0.76 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-7.89 0.71 \n", - "-67.15 2.67 \n", - "9.41 1.02 \n", - "171.76 1.14 \n", - "171.76 1.14 \n", - "5.4 0.3 \n", - "129.51 0.77 \n", - "-238.11 1.22 \n", - "-133.77 1.77 \n", - "840.6 5.45 \n", - "839.61 5.65 \n", - "-120.44 2.1 \n", - "805.07 5.26 \n", - "-168.87 4.1 \n", - "-60.47 6.76 \n", - "9.62 5.18 \n", - "-20.15 5.28 \n", - "-20.41 5.31 \n", - "-94.83 2.98 \n", - "44.41 0.71 \n", - "-103.65 3.82 \n", - "-430.78 1.51 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-186.06 4.11 \n", - "10000000.0 10000000.0 \n", - "688.49 4.89 \n", - "627.02 4.78 \n", - "592.47 4.44 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-219.97 1.69 \n", - "-432.73 1.74 \n", - "-181.47 1.7 \n", - "-485.78 0.51 \n", - "-458.55 0.54 \n", - "10000000.0 10000000.0 \n", - "-48.04 1.92 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-52.03 2.09 \n", - "10000000.0 10000000.0 \n", - "-28.53 2.3 \n", - "10000000.0 10000000.0 \n", - "-252.32 0.55 \n", - "10000000.0 10000000.0 \n", - "2.01 2.08 \n", - "-53.27 3.2 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-258.99 3.75 \n", - "-101.72 0.27 \n", - "-78.28 4.4 \n", - "42.72 4.98 \n", - "10000000.0 10000000.0 \n", - "51.49 5.04 \n", - "10000000.0 10000000.0 \n", - "-385.26 0.43 \n", - "-446.8 0.72 \n", - "-42.87 3.3 \n", - "10000000.0 10000000.0 \n", - "41.23 1.43 \n", - "34.71 1.37 \n", - "41.21 1.43 \n", - "54.25 3.16 \n", - "-42.87 3.3 \n", - "53.97 3.16 \n", - "47.45 2.18 \n", - "-322.41 0.19 \n", - "-673.08 3.7 \n", - "-234.43 0.74 \n", - "-317.88 1.62 \n", - "-570.7 2.0 \n", - "59.82 0.9 \n", - "-471.89 2.46 \n", - "147.8 4.22 \n", - "141.44 3.18 \n", - "141.28 3.18 \n", - "134.92 2.2 \n", - "128.41 1.46 \n", - "128.4 1.46 \n", - "121.89 1.38 \n", - "134.93 2.2 \n", - "134.76 2.2 \n", - "-734.05 4.5 \n", - "-798.47 3.78 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "90.08 0.53 \n", - "-49.75 1.65 \n", - "-77.35 1.95 \n", - "46.67 3.53 \n", - "46.67 3.53 \n", - "92.38 1.31 \n", - "20.62 3.27 \n", - "-103.4 1.42 \n", - "-19.62 0.71 \n", - "10000000.0 10000000.0 \n", - "-2.84 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-161.83 0.71 \n", - "-89.47 0.48 \n", - "-101.72 0.27 \n", - "-101.22 0.27 \n", - "-89.64 0.31 \n", - "-102.56 0.43 \n", - "-59.28 0.59 \n", - "36.54 0.38 \n", - "10000000.0 10000000.0 \n", - "-100.46 0.34 \n", - "208.49 1.5 \n", - "124.95 0.73 \n", - "41.28 0.65 \n", - "-97.3 0.27 \n", - "-108.14 0.39 \n", - "-82.56 0.18 \n", - "-73.74 0.23 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "594.18 3.34 \n", - "-2.32 12.68 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-182.49 0.42 \n", - "-174.45 0.42 \n", - "-162.25 0.33 \n", - "-135.51 0.63 \n", - "-173.06 0.3 \n", - "-31.38 0.4 \n", - "-138.23 0.25 \n", - "-200.09 0.35 \n", - "18.26 1.52 \n", - "20.67 0.71 \n", - "-762.55 3.12 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "185.36 2.06 \n", - "-13.71 10.32 \n", - "-172.19 10.58 \n", - "-36.26 7.19 \n", - "-18.43 6.89 \n", - "37.74 6.93 \n", - "-120.74 7.17 \n", - "39.36 6.93 \n", - "-119.12 7.17 \n", - "15.57 6.9 \n", - "-142.91 7.14 \n", - "17.0 6.92 \n", - "-141.48 7.16 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "4.47 0.5 \n", - "-111.43 1.47 \n", - "-149.9 1.5 \n", - "-149.92 1.5 \n", - "204.78 1.24 \n", - "166.43 1.15 \n", - "191.19 2.1 \n", - "279.51 1.54 \n", - "234.85 1.67 \n", - "234.85 1.67 \n", - "234.85 1.67 \n", - "203.79 1.28 \n", - "203.79 1.28 \n", - "203.79 1.28 \n", - "281.48 1.42 \n", - "236.83 1.61 \n", - "45.43 5.47 \n", - "10000000.0 10000000.0 \n", - "28.4 2.51 \n", - "10000000.0 10000000.0 \n", - "-28.27 0.45 \n", - "10000000.0 10000000.0 \n", - "-182.05 1.5 \n", - "-63.68 0.34 \n", - "-291.27 5.58 \n", - "-713.37 0.41 \n", - "19.05 0.26 \n", - "-296.55 5.56 \n", - "-724.3 2.75 \n", - "-108.42 0.31 \n", - "-391.86 5.69 \n", - "-124.33 0.29 \n", - "-240.82 5.67 \n", - "-28.32 5.68 \n", - "367.11 1.82 \n", - "329.7 1.8 \n", - "319.33 1.81 \n", - "257.47 1.76 \n", - "-82.56 0.49 \n", - "51.18 0.89 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "717.77 4.29 \n", - "741.09 4.34 \n", - "1030.77 6.01 \n", - "1054.09 6.06 \n", - "926.44 5.43 \n", - "949.76 5.48 \n", - "10.14 0.69 \n", - "-376.03 2.03 \n", - "-395.85 5.47 \n", - "0.0 0.0 \n", - "-510.27 1.91 \n", - "-103.84 0.65 \n", - "-491.02 2.05 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-172.46 0.9 \n", - "-64.31 0.26 \n", - "-145.08 0.36 \n", - "10000000.0 10000000.0 \n", - "-173.56 0.29 \n", - "-64.31 0.26 \n", - "-478.4 2.81 \n", - "-327.13 1.75 \n", - "-174.35 1.04 \n", - "-66.21 0.5 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-163.23 0.42 \n", - "-101.72 0.27 \n", - "22.2 5.69 \n", - "14.62 4.98 \n", - "-215.96 0.9 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "89.66 1.02 \n", - "28.19 1.02 \n", - "49.35 1.02 \n", - "10000000.0 10000000.0 \n", - "-158.93 3.75 \n", - "-87.19 1.81 \n", - "-87.19 1.81 \n", - "-119.51 1.78 \n", - "-87.19 1.81 \n", - "-82.03 1.03 \n", - "10000000.0 10000000.0 \n", - "23.69 0.71 \n", - "30.74 0.71 \n", - "10000000.0 10000000.0 \n", - "-2.94 0.71 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-160.8 0.36 \n", - "-217.42 0.82 \n", - "-48.91 0.89 \n", - "10000000.0 10000000.0 \n", - "-129.85 0.94 \n", - "10000000.0 10000000.0 \n", - "631.93 4.33 \n", - "536.38 4.36 \n", - "413.05 4.14 \n", - "777.66 5.29 \n", - "200.92 5.7 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-762.55 3.12 \n", - "-844.8 3.18 \n", - "690.55 5.16 \n", - "-159.12 6.94 \n", - "-257.46 0.71 \n", - "-637.83 3.68 \n", - "-667.43 3.77 \n", - "-624.64 3.66 \n", - "-595.95 3.74 \n", - "-625.55 3.94 \n", - "6.66 1.01 \n", - "-77.71 1.04 \n", - "-568.4 3.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-18.86 3.29 \n", - "3.24 5.0 \n", - "842.58 5.09 \n", - "10000000.0 10000000.0 \n", - "840.6 5.45 \n", - "10000000.0 10000000.0 \n", - "844.55 4.78 \n", - "952.9 5.86 \n", - "965.75 5.69 \n", - "843.56 4.93 \n", - "842.58 5.09 \n", - "-103.41 0.51 \n", - "-145.05 0.29 \n", - "841.59 5.26 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "502.85 3.02 \n", - "439.16 3.16 \n", - "499.88 3.2 \n", - "436.2 3.38 \n", - "497.91 3.45 \n", - "434.22 3.66 \n", - "501.86 3.05 \n", - "438.17 3.21 \n", - "500.87 3.11 \n", - "437.19 3.28 \n", - "499.88 3.2 \n", - "436.2 3.38 \n", - "498.9 3.32 \n", - "435.21 3.51 \n", - "498.9 3.32 \n", - "435.21 3.51 \n", - "545.17 3.19 \n", - "481.48 3.32 \n", - "544.18 3.22 \n", - "480.49 3.37 \n", - "544.18 3.22 \n", - "480.49 3.37 \n", - "543.19 3.27 \n", - "479.5 3.44 \n", - "543.19 3.27 \n", - "479.5 3.44 \n", - "542.2 3.36 \n", - "478.51 3.53 \n", - "-227.4 3.56 \n", - "521.82 3.59 \n", - "585.51 3.44 \n", - "521.82 3.59 \n", - "584.52 3.51 \n", - "520.83 3.68 \n", - "584.52 3.51 \n", - "520.83 3.68 \n", - "583.53 3.61 \n", - "519.84 3.79 \n", - "582.54 3.73 \n", - "518.86 3.92 \n", - "-10.88 2.18 \n", - "-81.75 1.93 \n", - "38.38 2.03 \n", - "20.43 0.65 \n", - "-72.42 1.83 \n", - "69.68 0.62 \n", - "10.02 0.67 \n", - "108.63 1.29 \n", - "59.3 0.62 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "206.35 2.62 \n", - "-37.54 3.57 \n", - "-302.87 3.09 \n", - "-49.38 7.19 \n", - "-42.82 7.18 \n", - "301.11 1.39 \n", - "-19.5 0.28 \n", - "236.49 1.37 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "-295.56 1.46 \n", - "-187.4 0.9 \n", - "-852.2 7.55 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "10000000.0 10000000.0 \n", - "26.17 0.44 \n", - "26.57 0.2 \n", - "-691.4 4.79 \n", - "-163.62 0.51 \n", - "10000000.0 10000000.0" - ] - }, + "data": { + "text/plain": [ + "[frozenset({'N', 'cpd00709'})]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[x for x in modelseed.find_compounds_by_inchi_key('WQZGKKKJIJFFOK-FPRJBGLDSA-N', True)]" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ { - "ename": "KeyboardInterrupt", - "evalue": "", + "data": { + "text/plain": [ + "{'IVMDWMLBSA': {frozenset({'N', 'cpd01055'})},\n", + " 'DHVFOXMCSA': {frozenset({'N', 'cpd01257'})},\n", + " 'RWOPYEJCSA': {frozenset({'N', 'cpd01490'})},\n", + " 'ZSNZIGRDSA': {frozenset({'N', 'cpd34045'})},\n", + " 'DGPNFKTASA': {frozenset({'N', 'cpd34600'})},\n", + " 'ZZWDRFIYSA': {frozenset({'N', 'cpd24421'})},\n", + " 'GASJEMHNSA': {frozenset({'N', 'cpd00027'})},\n", + " 'SVZMEOIVSA': {frozenset({'N', 'cpd00108'})},\n", + " 'QTVWNMPRSA': {frozenset({'N', 'cpd00138'})},\n", + " 'VFUOTHLCSA': {frozenset({'N', 'cpd00190'})},\n", + " 'UHFFFAOYSA': {frozenset({'N', 'cpd26824'}),\n", + " frozenset({'N', 'cpd28000'}),\n", + " frozenset({'N', 'cpd00548'})},\n", + " 'FPRJBGLDSA': {frozenset({'N', 'cpd00709'})},\n", + " 'PHYPRBDBSA': {frozenset({'N', 'cpd00724'})},\n", + " 'TVIMKVIFSA': {frozenset({'N', 'cpd31638'})},\n", + " 'KNZZERQRSA': {frozenset({'N', 'cpd11742'})},\n", + " 'URLGYRAOSA': {frozenset({'N', 'cpd26829'})},\n", + " 'UKFBFLRUSA': {frozenset({'N', 'cpd32355'})},\n", + " 'QBFJYBIGSA': {frozenset({'N', 'cpd32929'})},\n", + " 'DVKNGEFBSA': {frozenset({'N', 'cpd19001'})},\n", + " 'PQMKYFCFSA': {frozenset({'N', 'cpd19009'})},\n", + " 'YJRYQGEOSA': {frozenset({'N', 'cpd23021'})},\n", + " 'HGVZOGFYSA': {frozenset({'N', 'cpd23023'})},\n", + " 'GNFDWLABSA': {frozenset({'N', 'cpd35065'})},\n", + " 'RXRWUWDJSA': {frozenset({'N', 'cpd35150'})},\n", + " 'RDQKPOQOSA': {frozenset({'N', 'cpd35588'})},\n", + " 'QRXFDPRISA': {frozenset({'N', 'cpd14652'})},\n", + " 'UWWPDOAWSA': {frozenset({'N', 'cpd27165'})},\n", + " 'KGJVWPDLSA': {frozenset({'N', 'cpd27360'})},\n", + " 'FDROIEKHSA': {frozenset({'N', 'cpd33603'})},\n", + " 'BYIBVSMXSA': {frozenset({'N', 'cpd33694'})},\n", + " 'QZABAPFNSA': {frozenset({'N', 'cpd33806'})},\n", + " 'AIECOIEWSA': {frozenset({'N', 'cpd33917'})},\n", + " 'RSVSWTKNSA': {frozenset({'N', 'cpd03880'})},\n", + " 'CBPJZXOFSA': {frozenset({'N', 'cpd03881'})},\n", + " 'YIDFTEPTSA': {frozenset({'N', 'cpd03882'})},\n", + " 'WHZQZERISA': {frozenset({'N', 'cpd03883'})}}" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "modelseed.find_compounds_by_inchi_key('WQZGKKKJIJFFOK-FPRJBGLDSA-N', False)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'set' object is not subscriptable", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/tmp/ipykernel_2337286/3239136473.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mr\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmodelseed\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreactions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdelta_g\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdelta_g_error\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdelta_g\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m/usr/local/lib/python3.8/dist-packages/ipykernel/iostream.py\u001b[0m in \u001b[0;36mwrite\u001b[0;34m(self, string)\u001b[0m\n\u001b[1;32m 527\u001b[0m \u001b[0mis_child\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_is_master_process\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 528\u001b[0m \u001b[0;31m# only touch the buffer in the IO thread to avoid races\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 529\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpub_thread\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mschedule\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_buffer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrite\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstring\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 530\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_child\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 531\u001b[0m \u001b[0;31m# mp.Pool cannot be trusted to flush promptly (or ever),\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.8/dist-packages/ipykernel/iostream.py\u001b[0m in \u001b[0;36mschedule\u001b[0;34m(self, f)\u001b[0m\n\u001b[1;32m 212\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_events\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 213\u001b[0m \u001b[0;31m# wake event thread (message content is ignored)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 214\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_event_pipe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mb''\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 215\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/zmq/sugar/socket.py\u001b[0m in \u001b[0;36msend\u001b[0;34m(self, data, flags, copy, track, routing_id, group)\u001b[0m\n\u001b[1;32m 545\u001b[0m )\n\u001b[1;32m 546\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroup\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgroup\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 547\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mSocket\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflags\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mflags\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtrack\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtrack\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 548\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 549\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0msend_multipart\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmsg_parts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflags\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtrack\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32mzmq/backend/cython/socket.pyx\u001b[0m in \u001b[0;36mzmq.backend.cython.socket.Socket.send\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32mzmq/backend/cython/socket.pyx\u001b[0m in \u001b[0;36mzmq.backend.cython.socket.Socket.send\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32mzmq/backend/cython/socket.pyx\u001b[0m in \u001b[0;36mzmq.backend.cython.socket._send_copy\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.8/site-packages/zmq/backend/cython/checkrc.pxd\u001b[0m in \u001b[0;36mzmq.backend.cython.checkrc._check_rc\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/tmp/ipykernel_2350511/2162892026.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'N'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'cpd00709'\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'set' object is not subscriptable" ] } ], "source": [ - "for r in modelseed.reactions:\n", - " print(r.delta_g, r.delta_g_error, type(r.delta_g))" + "s = {'N', 'cpd00709'}\n", + "s[1]" ] }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, + "execution_count": null, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "import os\n", - "import json\n", - "from modelseedpy.biochem.modelseed_compound import ModelSEEDCompound2\n", - "database_path = '/home/fliu/workspace/python3/ModelSEEDDatabase'\n", - "_BIOCHEM_FOLDER = 'Biochemistry'\n", - "def load_metabolites(database_path):\n", - " metabolites = {}\n", - " contents = os.listdir(f'{database_path}/{_BIOCHEM_FOLDER}')\n", - " for f in contents:\n", - " if f.startswith('compound_') and f.endswith('.json'):\n", - " with open(f'{database_path}/{_BIOCHEM_FOLDER}/{f}', 'r') as fh:\n", - " _compounds_data = json.load(fh)\n", - " for o in _compounds_data:\n", - " if 'id' in o and o['id']:\n", - " cpd = ModelSEEDCompound2(o['id'], o.get('formula'), \n", - " o.get('name'), o.get('charge'), '',\n", - " o.get('abbreviation'), None,\n", - " o.get('mass'), o.get('deltag'), o.get('deltagerr'))\n", - " metabolites[cpd.id] = cpd\n", - " else:\n", - " print('error', o)\n", - " #print(_compounds_data[0].keys())\n", - " \n", - " return metabolites\n", - "metabolites = load_metabolites(database_path)" + "for r in modelseed.reactions:\n", + " print(r.delta_g, r.delta_g_error, type(r.delta_g), type(r.delta_g_error))\n", + " break" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 21, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'abbreviation': 'RXN-11623.v', 'abstract_reaction': None, 'aliases': ['AraCyc: RXN-11623', 'CornCyc: RXN-11623', 'KEGG: R09562', 'MetaCyc: RXN-11623', 'PlantCyc: RXN-11623', 'Name: FC lyase; FCLY; S-(2E,6E)-farnesyl-L-cysteine oxidase; farnesylcysteine lyase'], 'code': '(1) cpd00001[0] + (1) cpd00007[0] + (1) cpd20939[0] <=> (1) cpd00025[0] + (1) cpd00084[0] + (1) cpd02188[0]', 'compound_ids': 'cpd00001;cpd00007;cpd00025;cpd00084;cpd02188;cpd20939', 'definition': '(1) H2O[0] + (1) O2[0] + (1) Farnesylcysteine[0] => (1) H2O2[0] + (1) L-Cysteine[0] + (1) 2-trans,6-trans-Farnesal[0]', 'deltag': -16.82, 'deltagerr': 1.56, 'ec_numbers': ['1.8.3.5', '1.8.3.6'], 'equation': '(1) cpd00001[0] + (1) cpd00007[0] + (1) cpd20939[0] => (1) cpd00025[0] + (1) cpd00084[0] + (1) cpd02188[0]', 'id': 'rxn22000', 'is_obsolete': 1, 'is_transport': 0, 'linked_reaction': 'rxn16406', 'name': 'farnesylcysteine lyase', 'notes': ['GCC', 'EQC', 'EQU'], 'pathways': ['MetaCyc: All-Trans-Farnesyl-PP-Biosynthesis (); Cofactor-Biosynthesis (Cofactor, Prosthetic Group, Electron Carrier, and Vitamin Biosynthesis); Detoxification (Detoxification); PWY-6577 (farnesylcysteine salvage pathway); Polyprenyl-Biosynthesis (Polyprenyl Biosynthesis)', 'KEGG: rn00900 (Terpenoid backbone biosynthesis)'], 'reversibility': '>', 'source': 'Primary Database', 'status': 'OK', 'stoichiometry': [{'charge': 0, 'coefficient': -1, 'compartment': 0, 'compound': 'cpd00001', 'formula': 'H2O', 'name': 'H2O'}, {'charge': 0, 'coefficient': -1, 'compartment': 0, 'compound': 'cpd00007', 'formula': 'O2', 'name': 'O2'}, {'charge': 0, 'coefficient': -1, 'compartment': 0, 'compound': 'cpd20939', 'formula': 'C18H31NO2S', 'name': 'Farnesylcysteine'}, {'charge': 0, 'coefficient': 1, 'compartment': 0, 'compound': 'cpd00025', 'formula': 'H2O2', 'name': 'H2O2'}, {'charge': 0, 'coefficient': 1, 'compartment': 0, 'compound': 'cpd00084', 'formula': 'C3H7NO2S', 'name': 'L-Cysteine'}, {'charge': 0, 'coefficient': 1, 'compartment': 0, 'compound': 'cpd02188', 'formula': 'C15H24O', 'name': '2-trans,6-trans-Farnesal'}]}\n" - ] + "data": { + "text/plain": [ + "modelseedpy.biochem.modelseed_biochem.ModelSEEDDatabase" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "from modelseedpy.biochem.modelseed_reaction import ModelSEEDReaction2\n", - "from modelseedpy.core.msmodel import get_reaction_constraints_from_direction\n", - "def load_reactions(database_path, metabolites):\n", - " reactions = {}\n", - " contents = os.listdir(f'{database_path}/{_BIOCHEM_FOLDER}')\n", - " metabolites_indexed = {}\n", - " for f in contents:\n", - " if f.startswith('reaction_') and f.endswith('.json'):\n", - " with open(f'{database_path}/{_BIOCHEM_FOLDER}/{f}', 'r') as fh:\n", - " _reactions_data = json.load(fh)\n", - " for o in _reactions_data:\n", - " if 'id' in o and o['id']:\n", - " lower_bound, upper_bound = get_reaction_constraints_from_direction(o.get('reversibility'))\n", - " stoichiometry = o.get('stoichiometry')\n", - " reaction_metabolites = {}\n", - " for s in stoichiometry:\n", - " cmp_token = s['compartment']\n", - " value = s['coefficient']\n", - " cpd = metabolites[s['compound']]\n", - " cpd_index_id = f\"{cpd.id}_{cmp_token}\"\n", - " if cpd_index_id not in metabolites_indexed:\n", - " cpd_token = cpd.copy()\n", - " cpd_token.id = f\"{cpd.id}_{cmp_token}\"\n", - " cpd_token.base_id = cpd.id\n", - " cpd_token.compartment = cmp_token\n", - " metabolites_indexed[cpd_index_id] = cpd_token\n", - " reaction_metabolites[metabolites_indexed[cpd_index_id]] = value\n", - " rxn = ModelSEEDReaction2(o['id'], o.get('name'), '', lower_bound, upper_bound, delta_g=_reactions_data.get('deltag'), delta_g_error=_reactions_data.get(deltagerr))\n", - " rxn.add_metabolites(reaction_metabolites)\n", - " reactions[rxn.id] = rxn\n", - " else:\n", - " print('error', o)\n", - " print(_reactions_data[0])\n", - " break\n", - " return reactions\n", - "reactions = load_reactions(database_path, metabolites)" + "type(modelseed)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "template_reaction = r.to_template_reaction({0: 'c'})" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "modelseedpy.biochem.modelseed_biochem.ModelSEEDBiochem" + "{'AraCyc': {'RXN-11623'},\n", + " 'CornCyc': {'RXN-11623'},\n", + " 'KEGG': {'R09562'},\n", + " 'MetaCyc': {'RXN-11623'},\n", + " 'PlantCyc': {'RXN-11623'},\n", + " 'PoplarCyc': {'RXN-11623'},\n", + " 'SoyCyc': {'RXN-11623'},\n", + " 'metanetx.reaction': {'MNXR112981'},\n", + " 'rhea': {'30232', '30234'},\n", + " 'ec-code': {'1.8.3.5', '1.8.3.6'}}" ] }, - "execution_count": 3, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "type(modelseed)" + "template_reaction.annotation" ] }, { @@ -44860,6 +267,2420 @@ "print(template.info)" ] }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "database_path = '../../../ModelSEEDDatabase'\n", + "def _load_aliases_df(df_aliases):\n", + " aliases = {}\n", + " for i in df_aliases.itertuples():\n", + " seed_id = i[1]\n", + " alias_id = i[2]\n", + " source = i[3]\n", + " if seed_id not in aliases:\n", + " aliases[seed_id] = {}\n", + " if source not in aliases[seed_id]:\n", + " aliases[seed_id][source] = set()\n", + " aliases[seed_id][source].add(alias_id)\n", + " return aliases" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + " compound_aliases_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Compound_Aliases.txt'\n", + " reaction_aliases_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Aliases.txt'\n", + " compound_aliases = _load_aliases_df(pd.read_csv(compound_aliases_url, index_col=None, sep='\\t'))\n", + " reaction_aliases = _load_aliases_df(pd.read_csv(reaction_aliases_url, index_col=None, sep='\\t'))\n", + "\n", + " compound_names_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Compound_Names.txt'\n", + " reaction_names_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Names.txt'\n", + " compound_names = _load_aliases_df(pd.read_csv(compound_names_url, index_col=None, sep='\\t'))\n", + " reaction_names = _load_aliases_df(pd.read_csv(reaction_names_url, index_col=None, sep='\\t'))\n", + "\n", + " reaction_ecs_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_ECs.txt'\n", + " reaction_ecs = _load_aliases_df(pd.read_csv(reaction_ecs_url, index_col=None, sep='\\t'))" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Enzyme Class': {'3.6.1.1'}}" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "reaction_ecs['rxn00001']" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'rxn00001': {'3.6.1.1'},\n", + " 'rxn00002': {'3.5.1.54'},\n", + " 'rxn00003': {'2.2.1.6'},\n", + " 'rxn00004': {'4.1.3.17'},\n", + " 'rxn00006': {'1.11.1.21', '1.11.1.6'},\n", + " 'rxn00007': {'3.2.1.28'},\n", + " 'rxn00008': {'1.11.1.13'},\n", + " 'rxn00009': {'2.7.7.45'},\n", + " 'rxn00010': {'4.1.1.47'},\n", + " 'rxn00011': {'1.2.4.1', '2.2.1.6', '4.1.1.1'},\n", + " 'rxn00012': {'2.4.1.99'},\n", + " 'rxn00013': {'2.7.1.41'},\n", + " 'rxn00014': {'1.11.1.5'},\n", + " 'rxn00015': {'2.5.1.44'},\n", + " 'rxn00016': {'3.2.1.52'},\n", + " 'rxn00017': {'1.7.1.5'},\n", + " 'rxn00018': {'4.1.1.39'},\n", + " 'rxn00019': {'1.13.11.32'},\n", + " 'rxn00020': {'3.2.1.21'},\n", + " 'rxn00021': {'4.1.2.38'},\n", + " 'rxn00022': {'3.2.1.20'},\n", + " 'rxn00023': {'1.8.2.2'},\n", + " 'rxn00024': {'1.10.3.1'},\n", + " 'rxn00025': {'1.13.11.63', '1.14.99.36'},\n", + " 'rxn00026': {'1.1.3.23'},\n", + " 'rxn00027': {'4.1.99.3'},\n", + " 'rxn00028': {'1.10.3.3'},\n", + " 'rxn00029': {'4.2.1.24'},\n", + " 'rxn00030': {'4.1.2.35'},\n", + " 'rxn00031': {'2.4.1.166'},\n", + " 'rxn00032': {'1.1.3.17'},\n", + " 'rxn00033': {'1.2.3.13'},\n", + " 'rxn00034': {'1.13.11.43'},\n", + " 'rxn00035': {'1.21.3.2'},\n", + " 'rxn00036': {'1.10.3.1'},\n", + " 'rxn00037': {'1.14.99.-'},\n", + " 'rxn00038': {'3.1.1.22'},\n", + " 'rxn00039': {'2.3.1.90'},\n", + " 'rxn00040': {'3.1.1.20'},\n", + " 'rxn00041': {'3.1.1.40'},\n", + " 'rxn00042': {'1.1.3.28'},\n", + " 'rxn00043': {'1.10.3.1', '1.14.18.1'},\n", + " 'rxn00044': {'3.5.1.46'},\n", + " 'rxn00045': {'2.4.1.95'},\n", + " 'rxn00046': {'2.3.1.103'},\n", + " 'rxn00047': {'4.2.2.6'},\n", + " 'rxn00048': {'2.5.1.9'},\n", + " 'rxn00050': {'1.14.13.-'},\n", + " 'rxn00052': {'1.1.3.23'},\n", + " 'rxn00053': {'1.14.99.1'},\n", + " 'rxn00054': {'1.10.3.4'},\n", + " 'rxn00055': {'2.5.1.43'},\n", + " 'rxn00056': {'1.16.3.1'},\n", + " 'rxn00057': {'1.1.3.14', '1.10.3.1'},\n", + " 'rxn00058': {'1.7.2.1', '1.9.3.1'},\n", + " 'rxn00059': {'1.10.3.2'},\n", + " 'rxn00060': {'2.5.1.61', '4.3.1.8'},\n", + " 'rxn00061': {'3.6.1.5'},\n", + " 'rxn00062': {'3.6.1.15',\n", + " '3.6.1.3',\n", + " '3.6.1.5',\n", + " '3.6.1.8',\n", + " '3.6.3.1',\n", + " '3.6.3.10',\n", + " '3.6.3.11',\n", + " '3.6.3.12',\n", + " '3.6.3.14',\n", + " '3.6.3.15',\n", + " '3.6.3.16',\n", + " '3.6.3.17',\n", + " '3.6.3.18',\n", + " '3.6.3.19',\n", + " '3.6.3.2',\n", + " '3.6.3.20',\n", + " '3.6.3.21',\n", + " '3.6.3.22',\n", + " '3.6.3.23',\n", + " '3.6.3.24',\n", + " '3.6.3.25',\n", + " '3.6.3.26',\n", + " '3.6.3.27',\n", + " '3.6.3.28',\n", + " '3.6.3.29',\n", + " '3.6.3.3',\n", + " '3.6.3.30',\n", + " '3.6.3.31',\n", + " '3.6.3.32',\n", + " '3.6.3.33',\n", + " '3.6.3.34',\n", + " '3.6.3.35',\n", + " '3.6.3.36',\n", + " '3.6.3.37',\n", + " '3.6.3.38',\n", + " '3.6.3.39',\n", + " '3.6.3.4',\n", + " '3.6.3.40',\n", + " '3.6.3.41',\n", + " '3.6.3.42',\n", + " '3.6.3.43',\n", + " '3.6.3.44',\n", + " '3.6.3.46',\n", + " '3.6.3.47',\n", + " '3.6.3.48',\n", + " '3.6.3.49',\n", + " '3.6.3.5',\n", + " '3.6.3.50',\n", + " '3.6.3.51',\n", + " '3.6.3.52',\n", + " '3.6.3.53',\n", + " '3.6.3.54',\n", + " '3.6.3.55',\n", + " '3.6.3.6',\n", + " '3.6.3.7',\n", + " '3.6.3.8',\n", + " '3.6.3.9',\n", + " '3.6.4.1',\n", + " '3.6.4.10',\n", + " '3.6.4.11',\n", + " '3.6.4.12',\n", + " '3.6.4.13',\n", + " '3.6.4.2',\n", + " '3.6.4.3',\n", + " '3.6.4.4',\n", + " '3.6.4.5',\n", + " '3.6.4.6',\n", + " '3.6.4.7',\n", + " '3.6.4.8',\n", + " '3.6.4.9',\n", + " '5.6.1.c',\n", + " '5.6.1.d',\n", + " '5.6.1.f',\n", + " '5.6.1.g',\n", + " '7.3.2.a',\n", + " '7.3.2.f',\n", + " '7.5.2.h',\n", + " '7.5.2.j',\n", + " '7.5.2.l',\n", + " '7.6.2.c',\n", + " '7.6.2.f'},\n", + " 'rxn00063': {'3.6.1.8'},\n", + " 'rxn00064': {'3.5.4.18'},\n", + " 'rxn00065': {'4.6.1.1'},\n", + " 'rxn00066': {'1.11.1.1'},\n", + " 'rxn00067': {'1.8.1.14', '1.8.1.M1'},\n", + " 'rxn00068': {'1.16.1.7'},\n", + " 'rxn00069': {'1.4.1.14'},\n", + " 'rxn00070': {'1.8.1.7'},\n", + " 'rxn00071': {'1.6.5.4'},\n", + " 'rxn00072': {'1.16.1.3'},\n", + " 'rxn00074': {'1.16.1.4'},\n", + " 'rxn00075': {'3.2.2.5', '3.2.2.6'},\n", + " 'rxn00076': {'3.6.1.22', '3.6.1.9'},\n", + " 'rxn00077': {'2.7.1.23'},\n", + " 'rxn00078': {'2.7.1.86'},\n", + " 'rxn00079': {'1.6.2.4'},\n", + " 'rxn00080': {'1.16.1.5'},\n", + " 'rxn00082': {'1.14.13.39'},\n", + " 'rxn00083': {'1.6.1.1', '1.6.1.2', '1.6.1.3'},\n", + " 'rxn00084': {'1.11.1.2'},\n", + " 'rxn00085': {'1.4.1.13'},\n", + " 'rxn00086': {'1.6.4.2', '1.8.1.7'},\n", + " 'rxn00087': {'1.8.1.10'},\n", + " 'rxn00088': {'3.1.3.-', '3.1.3.2'},\n", + " 'rxn00089': {'3.2.2.5', '3.2.2.6'},\n", + " 'rxn00090': {'1.8.3.3'},\n", + " 'rxn00091': {'1.13.99.-'},\n", + " 'rxn00092': {'3.6.1.5'},\n", + " 'rxn00093': {'3.5.4.17', '3.5.4.7'},\n", + " 'rxn00095': {'3.6.1.41'},\n", + " 'rxn00096': {'2.7.7.53'},\n", + " 'rxn00097': {'2.7.4.3'},\n", + " 'rxn00098': {'3.6.1.14'},\n", + " 'rxn00099': {'4.2.1.93'},\n", + " 'rxn00100': {'2.7.1.24'},\n", + " 'rxn00101': {'3.5.1.5'},\n", + " 'rxn00102': {'4.2.1.1'},\n", + " 'rxn00103': {'1.17.1.10', '1.2.1.43'},\n", + " 'rxn00104': {'2.7.4.1'},\n", + " 'rxn00105': {'2.7.7.1', '2.7.7.18'},\n", + " 'rxn00106': {'3.6.1.1', '3.6.1.25'},\n", + " 'rxn00107': {'2.7.4.6'},\n", + " 'rxn00108': {'2.7.4.12'},\n", + " 'rxn00109': {'1.7.1.10', '1.7.99.1'},\n", + " 'rxn00110': {'1.14.13.35'},\n", + " 'rxn00111': {'1.14.13.35'},\n", + " 'rxn00112': {'1.13.12.-'},\n", + " 'rxn00113': {'6.3.4.16', '6.3.4.16-'},\n", + " 'rxn00114': {'2.7.2.2'},\n", + " 'rxn00116': {'3.6.1.5', '3.6.1.6'},\n", + " 'rxn00117': {'2.7.4.6'},\n", + " 'rxn00118': {'2.7.4.10'},\n", + " 'rxn00119': {'2.7.4.14', '2.7.4.22', '2.7.4.4'},\n", + " 'rxn00120': {'3.6.1.15', '3.6.1.39', '3.6.1.5'},\n", + " 'rxn00121': {'3.6.1.18', '3.6.1.9'},\n", + " 'rxn00122': {'2.7.7.2'},\n", + " 'rxn00123': {'3.1.3.74'},\n", + " 'rxn00124': {'2.7.1.35'},\n", + " 'rxn00125': {'3.3.1.2'},\n", + " 'rxn00126': {'2.5.1.6'},\n", + " 'rxn00127': {'4.1.1.50'},\n", + " 'rxn00128': {'4.4.1.14'},\n", + " 'rxn00129': {'2.5.1.4'},\n", + " 'rxn00130': {'3.5.4.17', '3.5.4.6'},\n", + " 'rxn00131': {'3.2.2.4'},\n", + " 'rxn00132': {'3.1.3.5'},\n", + " 'rxn00133': {'3.6.1.17', '3.6.1.61'},\n", + " 'rxn00134': {'2.7.1.20', '2.7.1.74'},\n", + " 'rxn00135': {'3.6.1.29'},\n", + " 'rxn00136': {'3.6.1.29'},\n", + " 'rxn00137': {'3.1.3.7'},\n", + " 'rxn00138': {'6.3.1.5', '6.3.5.1'},\n", + " 'rxn00139': {'2.4.2.7', '2.4.2.8'},\n", + " 'rxn00140': {'3.1.4.17', '3.1.4.53'},\n", + " 'rxn00141': {'3.3.1.1'},\n", + " 'rxn00142': {'3.5.4.28'},\n", + " 'rxn00143': {'3.2.2.9'},\n", + " 'rxn00144': {'4.3.1.15'},\n", + " 'rxn00145': {'1.1.2.3'},\n", + " 'rxn00146': {'1.1.2.4'},\n", + " 'rxn00147': {'2.7.9.2'},\n", + " 'rxn00148': {'2.7.1.40'},\n", + " 'rxn00149': {'1.2.1.22', '1.2.1.23', '1.2.1.3'},\n", + " 'rxn00150': {'1.2.1.49'},\n", + " 'rxn00151': {'2.7.9.1'},\n", + " 'rxn00152': {'1.2.3.3'},\n", + " 'rxn00153': {'3.1.3.60'},\n", + " 'rxn00154': {'1.2.1.-', '1.2.1.M10', '1.2.4.1', '1.8.1.4', '2.3.1.12'},\n", + " 'rxn00155': {'1.2.1.51'},\n", + " 'rxn00156': {'1.2.3.6'},\n", + " 'rxn00157': {'2.3.1.54'},\n", + " 'rxn00158': {'4.3.1.13'},\n", + " 'rxn00159': {'1.1.1.38', '1.1.1.39'},\n", + " 'rxn00160': {'1.1.1.83'},\n", + " 'rxn00161': {'1.1.1.40'},\n", + " 'rxn00162': {'1.1.1.38', '1.1.1.40', '4.1.1.112', '4.1.1.3'},\n", + " 'rxn00163': {'4.1.1.78'},\n", + " 'rxn00164': {'4.1.1.-'},\n", + " 'rxn00165': {'4.2.1.13', '4.3.1.17', '4.3.1.19'},\n", + " 'rxn00166': {'4.3.1.18'},\n", + " 'rxn00168': {'4.1.1.1'},\n", + " 'rxn00170': {'3.1.2.1'},\n", + " 'rxn00171': {'1.2.1.10'},\n", + " 'rxn00172': {'6.2.1.13'},\n", + " 'rxn00173': {'2.3.1.8'},\n", + " 'rxn00174': {'4.1.1.9'},\n", + " 'rxn00175': {'6.2.1.1'},\n", + " 'rxn00176': {'6.2.1.1'},\n", + " 'rxn00177': {'4.1.3.24', '4.1.3.25'},\n", + " 'rxn00178': {'2.3.1.9'},\n", + " 'rxn00179': {'2.7.2.11'},\n", + " 'rxn00181': {'2.7.2.13'},\n", + " 'rxn00182': {'1.4.1.2', '1.4.1.3', '1.4.1.4'},\n", + " 'rxn00183': {'1.2.1.88', '1.5.1.12'},\n", + " 'rxn00184': {'1.4.1.3', '1.4.1.4'},\n", + " 'rxn00185': {'1.4.3.11'},\n", + " 'rxn00186': {'3.5.2.9'},\n", + " 'rxn00187': {'6.3.1.2'},\n", + " 'rxn00188': {'3.5.1.87'},\n", + " 'rxn00189': {'3.5.1.2', '3.5.1.38', '6.3.5.4', '6.3.5.5'},\n", + " 'rxn00190': {'6.3.5.1'},\n", + " 'rxn00191': {'2.6.1.2'},\n", + " 'rxn00192': {'2.3.1.1'},\n", + " 'rxn00193': {'5.1.1.3'},\n", + " 'rxn00194': {'4.1.1.15'},\n", + " 'rxn00195': {'5.4.99.1'},\n", + " 'rxn00196': {'1.2.1.26', '1.2.1.3'},\n", + " 'rxn00197': {'1.2.1.52'},\n", + " 'rxn00198': {'1.1.1.42'},\n", + " 'rxn00199': {'1.1.1.42', '4.1.1.-'},\n", + " 'rxn00200': {'3.5.1.-', '3.5.1.111', '3.5.1.3'},\n", + " 'rxn00202': {'2.3.3.14', '4.1.3.21'},\n", + " 'rxn00203': {'4.1.1.71'},\n", + " 'rxn00204': {'1.2.3.4'},\n", + " 'rxn00205': {'1.11.1.9'},\n", + " 'rxn00206': {'1.15.1.1'},\n", + " 'rxn00207': {'1.2.2.4'},\n", + " 'rxn00208': {'1.4.3.5'},\n", + " 'rxn00209': {'1.4.3.5'},\n", + " 'rxn00210': {'1.4.3.15', '1.4.3.7'},\n", + " 'rxn00211': {'1.1.1.22'},\n", + " 'rxn00212': {'3.6.1.45', '3.6.1.8', '3.6.1.9'},\n", + " 'rxn00213': {'2.7.7.9'},\n", + " 'rxn00214': {'5.1.3.2'},\n", + " 'rxn00215': {'4.2.1.76'},\n", + " 'rxn00216': {'2.7.1.1', '2.7.1.2'},\n", + " 'rxn00217': {'1.1.1.118', '1.1.1.121'},\n", + " 'rxn00218': {'1.1.1.119'},\n", + " 'rxn00219': {'1.1.3.10'},\n", + " 'rxn00220': {'3.1.3.58', '3.1.3.9'},\n", + " 'rxn00221': {'3.1.3.10'},\n", + " 'rxn00222': {'3.2.1.21', '3.2.1.74'},\n", + " 'rxn00223': {'5.3.1.5'},\n", + " 'rxn00224': {'4.99.1.1'},\n", + " 'rxn00225': {'2.7.2.1', '2.7.2.15'},\n", + " 'rxn00226': {'6.2.1.1'},\n", + " 'rxn00227': {'3.6.1.7'},\n", + " 'rxn00228': {'3.11.1.2'},\n", + " 'rxn00229': {'1.13.12.4'},\n", + " 'rxn00230': {'2.7.2.12'},\n", + " 'rxn00231': {'3.5.1.4'},\n", + " 'rxn00232': {'3.6.1.20'},\n", + " 'rxn00233': {'3.7.1.6'},\n", + " 'rxn00234': {'4.1.3.22'},\n", + " 'rxn00235': {'3.1.1.33'},\n", + " 'rxn00236': {'3.6.1.42', '3.6.1.5', '3.6.1.6'},\n", + " 'rxn00237': {'2.7.4.6'},\n", + " 'rxn00238': {'2.7.4.6'},\n", + " 'rxn00239': {'2.7.4.8'},\n", + " 'rxn00240': {'2.7.4.10'},\n", + " 'rxn00241': {'3.6.1.15',\n", + " '3.6.1.5',\n", + " '3.6.5.1',\n", + " '3.6.5.2',\n", + " '3.6.5.3',\n", + " '3.6.5.4',\n", + " '3.6.5.5',\n", + " '3.6.5.6'},\n", + " 'rxn00242': {'3.1.7.2'},\n", + " 'rxn00243': {'3.2.1.42'},\n", + " 'rxn00244': {'3.7.1.1'},\n", + " 'rxn00245': {'4.2.1.32'},\n", + " 'rxn00247': {'4.1.1.49'},\n", + " 'rxn00248': {'1.1.1.299', '1.1.1.37'},\n", + " 'rxn00249': {'1.1.1.299', '1.1.1.82'},\n", + " 'rxn00250': {'6.4.1.1'},\n", + " 'rxn00251': {'4.1.1.31'},\n", + " 'rxn00252': {'4.1.1.38'},\n", + " 'rxn00253': {'4.3.1.20'},\n", + " 'rxn00254': {'3.5.1.-', '3.5.1.3'},\n", + " 'rxn00255': {'4.1.3.17'},\n", + " 'rxn00256': {'2.3.3.1', '2.3.3.16', '2.3.3.3', '4.1.3.7'},\n", + " 'rxn00257': {'2.3.3.8'},\n", + " 'rxn00258': {'2.1.3.1'},\n", + " 'rxn00259': {'4.1.3.34'},\n", + " 'rxn00260': {'2.6.1.1'},\n", + " 'rxn00261': {'1.13.11.-'},\n", + " 'rxn00262': {'1.4.3.16', '1.4.3.2'},\n", + " 'rxn00263': {'1.4.3.1', '1.4.3.15'},\n", + " 'rxn00264': {'1.1.3.3'},\n", + " 'rxn00265': {'4.1.3.6'},\n", + " 'rxn00266': {'5.3.2.2'},\n", + " 'rxn00267': {'1.4.2.1'},\n", + " 'rxn00268': {'1.4.1.1', '1.4.1.10'},\n", + " 'rxn00269': {'1.4.3.19', '1.4.3.2', '1.4.3.3'},\n", + " 'rxn00270': {'2.1.1.156', '2.1.1.162', '2.1.1.20'},\n", + " 'rxn00271': {'1.5.1.22'},\n", + " 'rxn00272': {'2.6.1.44'},\n", + " 'rxn00273': {'2.3.1.29'},\n", + " 'rxn00274': {'2.3.1.29'},\n", + " 'rxn00275': {'2.6.1.4', '2.6.1.44'},\n", + " 'rxn00276': {'2.6.1.35'},\n", + " 'rxn00278': {'1.4.1.1'},\n", + " 'rxn00279': {'4.1.1.12'},\n", + " 'rxn00280': {'1.5.1.17'},\n", + " 'rxn00281': {'2.3.1.-'},\n", + " 'rxn00282': {'2.6.1.12'},\n", + " 'rxn00283': {'5.1.1.1'},\n", + " 'rxn00284': {'1.3.1.6'},\n", + " 'rxn00285': {'6.2.1.5'},\n", + " 'rxn00286': {'2.8.3.-', '2.8.3.22'},\n", + " 'rxn00287': {'3.1.2.3'},\n", + " 'rxn00288': {'1.3.99.1'},\n", + " 'rxn00289': {'4.1.3.30'},\n", + " 'rxn00290': {'2.8.3.5'},\n", + " 'rxn00291': {'3.5.1.96'},\n", + " 'rxn00292': {'3.2.1.183', '5.1.3.14'},\n", + " 'rxn00293': {'2.7.7.23'},\n", + " 'rxn00295': {'5.1.3.2', '5.1.3.7'},\n", + " 'rxn00297': {'5.1.3.14'},\n", + " 'rxn00298': {'1.1.1.136'},\n", + " 'rxn00299': {'3.5.4.16'},\n", + " 'rxn00300': {'3.5.4.25'},\n", + " 'rxn00301': {'3.6.1.19', '3.6.1.8'},\n", + " 'rxn00302': {'3.5.4.16'},\n", + " 'rxn00303': {'2.7.6.5'},\n", + " 'rxn00304': {'2.7.1.40'},\n", + " 'rxn00305': {'4.1.1.32'},\n", + " 'rxn00306': {'6.2.1.4'},\n", + " 'rxn00307': {'4.6.1.1', '4.6.1.2'},\n", + " 'rxn00308': {'1.4.1.15'},\n", + " 'rxn00309': {'1.4.1.18'},\n", + " 'rxn00310': {'1.4.3.14'},\n", + " 'rxn00311': {'1.14.13.59'},\n", + " 'rxn00312': {'1.13.12.2'},\n", + " 'rxn00313': {'4.1.1.20'},\n", + " 'rxn00314': {'1.5.1.16'},\n", + " 'rxn00315': {'2.6.1.71'},\n", + " 'rxn00316': {'2.3.1.-'},\n", + " 'rxn00317': {'2.6.1.36'},\n", + " 'rxn00318': {'3.5.1.17'},\n", + " 'rxn00319': {'4.3.1.28'},\n", + " 'rxn00320': {'5.1.1.5', '5.1.1.9'},\n", + " 'rxn00321': {'5.4.3.2'},\n", + " 'rxn00322': {'4.1.1.18'},\n", + " 'rxn00323': {'3.5.2.11'},\n", + " 'rxn00324': {'1.1.1.26', '1.1.1.79'},\n", + " 'rxn00325': {'1.2.3.5'},\n", + " 'rxn00326': {'1.2.1.17'},\n", + " 'rxn00327': {'3.5.1.116', '3.5.3.19'},\n", + " 'rxn00328': {'4.1.3.16', '4.1.3.42'},\n", + " 'rxn00330': {'2.3.3.9', '4.1.3.2'},\n", + " 'rxn00331': {'4.1.3.24'},\n", + " 'rxn00332': {'2.2.1.5'},\n", + " 'rxn00333': {'1.1.3.15'},\n", + " 'rxn00334': {'4.1.3.13'},\n", + " 'rxn00335': {'4.1.3.14'},\n", + " 'rxn00336': {'4.1.3.1'},\n", + " 'rxn00337': {'2.7.2.4'},\n", + " 'rxn00338': {'1.4.3.16'},\n", + " 'rxn00339': {'6.3.1.4'},\n", + " 'rxn00340': {'6.3.1.1', '6.3.5.4'},\n", + " 'rxn00341': {'3.5.1.7'},\n", + " 'rxn00342': {'3.5.1.1', '3.5.1.38'},\n", + " 'rxn00343': {'3.5.5.4'},\n", + " 'rxn00344': {'2.3.1.17'},\n", + " 'rxn00345': {'3.5.1.15'},\n", + " 'rxn00346': {'4.1.1.11', '4.1.1.15'},\n", + " 'rxn00347': {'3.5.1.38', '4.3.1.1'},\n", + " 'rxn00348': {'5.1.1.13'},\n", + " 'rxn00350': {'2.3.2.2', '3.4.19.13'},\n", + " 'rxn00351': {'6.3.2.3'},\n", + " 'rxn00352': {'3.1.2.13'},\n", + " 'rxn00353': {'1.8.4.-'},\n", + " 'rxn00354': {'1.1.1.-'},\n", + " 'rxn00355': {'2.7.7.10'},\n", + " 'rxn00356': {'2.4.1.22'},\n", + " 'rxn00357': {'2.7.8.18'},\n", + " 'rxn00358': {'5.4.99.9'},\n", + " 'rxn00359': {'3.6.1.9', '3.6.2.2'},\n", + " 'rxn00360': {'3.1.3.7'},\n", + " 'rxn00361': {'2.7.1.25'},\n", + " 'rxn00362': {'3.2.2.10'},\n", + " 'rxn00363': {'3.1.3.5', '3.1.3.91'},\n", + " 'rxn00364': {'2.7.4.14', '2.7.4.25'},\n", + " 'rxn00365': {'2.7.1.-', '2.7.1.213', '2.7.1.48'},\n", + " 'rxn00366': {'3.6.1.5', '3.6.1.6'},\n", + " 'rxn00367': {'3.6.1.-', '3.6.1.65', '3.6.1.8'},\n", + " 'rxn00368': {'2.7.1.48'},\n", + " 'rxn00369': {'2.7.1.-', '2.7.1.48'},\n", + " 'rxn00370': {'2.7.2.6'},\n", + " 'rxn00371': {'1.17.1.9', '1.2.1.2'},\n", + " 'rxn00372': {'3.1.2.10'},\n", + " 'rxn00373': {'4.1.1.2'},\n", + " 'rxn00374': {'3.5.1.49'},\n", + " 'rxn00375': {'3.5.1.68'},\n", + " 'rxn00376': {'3.5.1.15', '3.5.1.8'},\n", + " 'rxn00377': {'3.1.2.12'},\n", + " 'rxn00378': {'1.8.2.1'},\n", + " 'rxn00379': {'2.7.7.4'},\n", + " 'rxn00380': {'2.7.7.5'},\n", + " 'rxn00381': {'3.6.2.1'},\n", + " 'rxn00382': {'4.3.1.10'},\n", + " 'rxn00383': {'1.8.3.1'},\n", + " 'rxn00384': {'3.1.6.3'},\n", + " 'rxn00385': {'2.8.2.15'},\n", + " 'rxn00386': {'2.8.2.15'},\n", + " 'rxn00387': {'2.8.2.15'},\n", + " 'rxn00388': {'3.5.5.1', '3.5.5.2', '3.5.5.5', '3.5.5.7'},\n", + " 'rxn00389': {'3.5.1.17'},\n", + " 'rxn00390': {'3.5.1.15'},\n", + " 'rxn00391': {'3.1.3.-', '3.1.3.102', '3.1.3.2'},\n", + " 'rxn00392': {'2.7.1.26'},\n", + " 'rxn00393': {'2.7.1.42'},\n", + " 'rxn00394': {'3.5.3.1'},\n", + " 'rxn00395': {'3.5.3.6'},\n", + " 'rxn00396': {'2.7.3.3'},\n", + " 'rxn00397': {'2.4.2.31'},\n", + " 'rxn00398': {'1.4.3.-', '1.4.3.2'},\n", + " 'rxn00399': {'1.14.13.39'},\n", + " 'rxn00400': {'1.14.13.39'},\n", + " 'rxn00401': {'1.13.12.1'},\n", + " 'rxn00402': {'1.5.1.11'},\n", + " 'rxn00403': {'1.5.1.19'},\n", + " 'rxn00404': {'2.1.4.1'},\n", + " 'rxn00405': {'4.1.1.19'},\n", + " 'rxn00406': {'5.1.1.9'},\n", + " 'rxn00407': {'3.5.4.13'},\n", + " 'rxn00408': {'3.6.1.15', '3.6.1.5'},\n", + " 'rxn00409': {'2.7.4.6'},\n", + " 'rxn00410': {'6.3.4.2'},\n", + " 'rxn00411': {'2.7.1.40'},\n", + " 'rxn00412': {'6.3.4.2'},\n", + " 'rxn00413': {'4.6.1.6'},\n", + " 'rxn00414': {'6.3.5.5'},\n", + " 'rxn00415': {'2.6.1.15'},\n", + " 'rxn00416': {'6.3.5.4'},\n", + " 'rxn00417': {'5.1.1.10'},\n", + " 'rxn00418': {'2.7.7.-'},\n", + " 'rxn00419': {'1.4.1.7'},\n", + " 'rxn00420': {'3.1.3.3'},\n", + " 'rxn00421': {'2.7.1.80'},\n", + " 'rxn00422': {'2.6.1.51'},\n", + " 'rxn00423': {'2.3.1.30'},\n", + " 'rxn00424': {'2.6.1.45'},\n", + " 'rxn00425': {'5.1.1.10', '5.1.1.18'},\n", + " 'rxn00426': {'4.3.1.17'},\n", + " 'rxn00427': {'1.11.1.21', '1.11.1.6', '1.11.1.7'},\n", + " 'rxn00428': {'4.5.1.3'},\n", + " 'rxn00429': {'1.2.1.46'},\n", + " 'rxn00430': {'1.1.1.244'},\n", + " 'rxn00431': {'1.4.99.3'},\n", + " 'rxn00432': {'1.1.3.13'},\n", + " 'rxn00433': {'1.5.3.1'},\n", + " 'rxn00434': {'1.5.3.4'},\n", + " 'rxn00435': {'1.2.98.1', '1.2.99.4'},\n", + " 'rxn00436': {'3.6.1.15'},\n", + " 'rxn00437': {'2.7.4.15', '2.7.6.2'},\n", + " 'rxn00438': {'2.7.4.16'},\n", + " 'rxn00439': {'3.6.1.28'},\n", + " 'rxn00440': {'2.7.6.2'},\n", + " 'rxn00441': {'1.2.4.2'},\n", + " 'rxn00442': {'4.1.1.71'},\n", + " 'rxn00443': {'1.3.2.3'},\n", + " 'rxn00444': {'1.11.1.11'},\n", + " 'rxn00445': {'1.3.3.12'},\n", + " 'rxn00447': {'1.14.-.-'},\n", + " 'rxn00448': {'1.13.11.13'},\n", + " 'rxn00449': {'1.1.3.8'},\n", + " 'rxn00450': {'1.4.3.2'},\n", + " 'rxn00451': {'2.1.1.12'},\n", + " 'rxn00452': {'2.1.1.10'},\n", + " 'rxn00453': {'2.5.1.49', '4.2.99.10'},\n", + " 'rxn00454': {'2.6.1.73'},\n", + " 'rxn00455': {'3.5.1.31'},\n", + " 'rxn00456': {'4.4.1.11'},\n", + " 'rxn00457': {'5.1.1.2'},\n", + " 'rxn00458': {'4.1.1.57'},\n", + " 'rxn00459': {'4.2.1.11'},\n", + " 'rxn00460': {'2.7.1.40'},\n", + " 'rxn00461': {'2.5.1.7'},\n", + " 'rxn00462': {'5.4.2.9'},\n", + " 'rxn00463': {'3.6.1.19', '3.6.1.8'},\n", + " 'rxn00464': {'2.3.1.127'},\n", + " 'rxn00465': {'3.5.1.20'},\n", + " 'rxn00466': {'1.5.1.24'},\n", + " 'rxn00467': {'2.6.1.13'},\n", + " 'rxn00468': {'2.6.1.13', '2.6.1.68'},\n", + " 'rxn00469': {'3.5.1.14', '3.5.1.16'},\n", + " 'rxn00470': {'4.1.1.17'},\n", + " 'rxn00471': {'4.3.1.12'},\n", + " 'rxn00472': {'5.1.1.10', '5.1.1.12', '5.1.1.9'},\n", + " 'rxn00473': {'4.1.99.1'},\n", + " 'rxn00474': {'4.2.1.122', '4.2.1.20'},\n", + " 'rxn00475': {'1.4.1.19'},\n", + " 'rxn00476': {'1.4.1.19'},\n", + " 'rxn00477': {'1.4.3.2'},\n", + " 'rxn00478': {'1.13.11.11', '1.13.11.52'},\n", + " 'rxn00479': {'1.13.12.3'},\n", + " 'rxn00480': {'1.13.99.3'},\n", + " 'rxn00481': {'3.5.1.57'},\n", + " 'rxn00483': {'2.6.1.27'},\n", + " 'rxn00484': {'4.1.1.105', '4.1.1.28'},\n", + " 'rxn00485': {'5.1.1.11'},\n", + " 'rxn00486': {'2.7.7.54'},\n", + " 'rxn00487': {'1.4.1.20'},\n", + " 'rxn00488': {'1.4.3.2'},\n", + " 'rxn00489': {'1.11.1.21', '1.11.1.7', '1.13.12.9'},\n", + " 'rxn00490': {'4.2.1.51', '4.2.1.91'},\n", + " 'rxn00491': {'2.6.1.58'},\n", + " 'rxn00492': {'2.3.1.53'},\n", + " 'rxn00493': {'2.6.1.1', '2.6.1.5', '2.6.1.57', '2.6.1.58', '2.6.1.9'},\n", + " 'rxn00494': {'2.6.1.70'},\n", + " 'rxn00495': {'4.3.1.24', '4.3.1.25', '4.3.1.5'},\n", + " 'rxn00496': {'1.11.1.7'},\n", + " 'rxn00497': {'4.1.1.28', '4.1.1.53'},\n", + " 'rxn00498': {'2.5.1.-', '2.5.1.103', '2.5.1.21', '2.5.1.96'},\n", + " 'rxn00499': {'1.1.1.27'},\n", + " 'rxn00500': {'1.1.1.28'},\n", + " 'rxn00501': {'1.2.1.18', '1.2.1.27'},\n", + " 'rxn00502': {'1.2.1.18'},\n", + " 'rxn00503': {'1.5.1.12'},\n", + " 'rxn00504': {'1.5.1.12'},\n", + " 'rxn00505': {'1.1.1.286', '1.1.1.41'},\n", + " 'rxn00506': {'1.2.1.3', '1.2.1.5'},\n", + " 'rxn00507': {'1.2.1.3', '1.2.1.4', '1.2.1.5'},\n", + " 'rxn00508': {'1.2.1.16', '1.2.1.24'},\n", + " 'rxn00509': {'1.2.1.16', '1.2.1.79'},\n", + " 'rxn00510': {'1.5.1.7'},\n", + " 'rxn00511': {'1.5.1.8'},\n", + " 'rxn00512': {'1.1.1.26', '1.1.1.29', '1.1.99.14'},\n", + " 'rxn00513': {'3.6.1.-', '3.6.1.15', '3.6.1.5'},\n", + " 'rxn00514': {'3.6.1.-', '3.6.1.19', '3.6.1.8'},\n", + " 'rxn00515': {'2.7.4.6'},\n", + " 'rxn00516': {'3.6.1.14'},\n", + " 'rxn00517': {'2.7.1.40'},\n", + " 'rxn00518': {'2.7.1.1'},\n", + " 'rxn00519': {'4.1.1.32'},\n", + " 'rxn00520': {'6.2.1.4'},\n", + " 'rxn00521': {'4.1.99.2'},\n", + " 'rxn00522': {'1.4.3.2'},\n", + " 'rxn00523': {'1.14.13.41'},\n", + " 'rxn00524': {'1.14.18.1'},\n", + " 'rxn00525': {'1.3.1.43', '1.3.1.79'},\n", + " 'rxn00526': {'1.3.1.78', '1.3.1.79'},\n", + " 'rxn00527': {'2.6.1.1', '2.6.1.5', '2.6.1.57', '2.6.1.9'},\n", + " 'rxn00528': {'6.3.2.24'},\n", + " 'rxn00529': {'4.1.1.25', '4.1.1.28'},\n", + " 'rxn00530': {'4.3.1.23', '4.3.1.25'},\n", + " 'rxn00531': {'5.4.3.6'},\n", + " 'rxn00532': {'1.2.1.-', '1.2.1.18', '1.2.1.75'},\n", + " 'rxn00533': {'6.4.1.2'},\n", + " 'rxn00534': {'2.8.3.3'},\n", + " 'rxn00536': {'1.1.1.2', '1.1.1.71'},\n", + " 'rxn00537': {'3.11.1.1'},\n", + " 'rxn00538': {'4.2.3.2'},\n", + " 'rxn00539': {'4.3.1.7'},\n", + " 'rxn00540': {'4.1.3.39'},\n", + " 'rxn00541': {'4.1.2.5'},\n", + " 'rxn00542': {'4.1.2.36'},\n", + " 'rxn00543': {'1.1.1.1', '1.1.1.71'},\n", + " 'rxn00544': {'4.1.1.1'},\n", + " 'rxn00545': {'2.7.1.11'},\n", + " 'rxn00546': {'1.1.1.17'},\n", + " 'rxn00547': {'2.7.1.1', '2.7.1.4'},\n", + " 'rxn00548': {'4.1.2.22'},\n", + " 'rxn00549': {'3.1.3.11'},\n", + " 'rxn00550': {'3.1.3.46'},\n", + " 'rxn00551': {'2.7.1.90'},\n", + " 'rxn00552': {'3.5.99.6'},\n", + " 'rxn00553': {'2.4.1.14'},\n", + " 'rxn00554': {'2.7.1.11'},\n", + " 'rxn00555': {'2.6.1.16'},\n", + " 'rxn00556': {'2.7.1.11'},\n", + " 'rxn00557': {'2.7.1.11'},\n", + " 'rxn00558': {'5.3.1.9'},\n", + " 'rxn00559': {'5.3.1.8'},\n", + " 'rxn00560': {'6.3.4.6'},\n", + " 'rxn00561': {'3.5.3.2'},\n", + " 'rxn00562': {'4.3.2.3'},\n", + " 'rxn00563': {'3.5.3.14'},\n", + " 'rxn00564': {'4.2.1.69'},\n", + " 'rxn00565': {'1.13.11.18'},\n", + " 'rxn00566': {'4.1.99.1', '4.4.1.1', '4.4.1.28', '4.4.1.8'},\n", + " 'rxn00567': {'1.7.2.1'},\n", + " 'rxn00568': {'1.6.6.-', '1.7.1.15', '1.7.1.4'},\n", + " 'rxn00569': {'1.7.1.4'},\n", + " 'rxn00570': {'1.7.3.4', '1.7.3.6'},\n", + " 'rxn00571': {'1.6.6.1', '1.7.1.1', '1.7.1.2'},\n", + " 'rxn00572': {'1.7.1.2', '1.7.1.3'},\n", + " 'rxn00573': {'1.7.3.1'},\n", + " 'rxn00575': {'3.2.1.10', '3.2.1.20', '3.2.1.48'},\n", + " 'rxn00577': {'2.4.1.7'},\n", + " 'rxn00578': {'3.1.3.24'},\n", + " 'rxn00579': {'2.4.1.13'},\n", + " 'rxn00580': {'1.1.99.13'},\n", + " 'rxn00581': {'2.4.1.167'},\n", + " 'rxn00582': {'5.4.99.11'},\n", + " 'rxn00583': {'1.3.1.19'},\n", + " 'rxn00584': {'1.3.1.25'},\n", + " 'rxn00585': {'1.3.1.20'},\n", + " 'rxn00586': {'1.14.13.7'},\n", + " 'rxn00587': {'1.13.11.2'},\n", + " 'rxn00588': {'1.13.11.1'},\n", + " 'rxn00589': {'1.14.13.1'},\n", + " 'rxn00590': {'1.14.12.10'},\n", + " 'rxn00591': {'1.3.1.25'},\n", + " 'rxn00592': {'4.1.1.46'},\n", + " 'rxn00593': {'4.1.1.63'},\n", + " 'rxn00594': {'1.14.12.1'},\n", + " 'rxn00595': {'1.14.12.1'},\n", + " 'rxn00596': {'2.1.1.6'},\n", + " 'rxn00597': {'1.14.13.31'},\n", + " 'rxn00598': {'2.3.1.-', '2.3.1.16', '2.3.1.174'},\n", + " 'rxn00599': {'2.3.1.37'},\n", + " 'rxn00600': {'2.3.1.37'},\n", + " 'rxn00601': {'2.3.1.109'},\n", + " 'rxn00602': {'5.4.99.2'},\n", + " 'rxn00603': {'1.1.1.200'},\n", + " 'rxn00604': {'1.1.1.363', '1.1.1.49'},\n", + " 'rxn00605': {'2.4.1.15'},\n", + " 'rxn00606': {'3.2.1.122', '3.2.1.93'},\n", + " 'rxn00607': {'3.2.1.122'},\n", + " 'rxn00608': {'3.2.1.86'},\n", + " 'rxn00610': {'3.1.3.21'},\n", + " 'rxn00611': {'1.1.1.8', '1.1.1.94'},\n", + " 'rxn00612': {'1.1.1.94'},\n", + " 'rxn00613': {'1.1.1.177'},\n", + " 'rxn00614': {'1.1.3.21'},\n", + " 'rxn00615': {'2.7.1.30'},\n", + " 'rxn00616': {'1.1.5.3', '1.1.99.5'},\n", + " 'rxn00617': {'2.7.1.142'},\n", + " 'rxn00618': {'2.4.1.137'},\n", + " 'rxn00619': {'2.4.1.96'},\n", + " 'rxn00620': {'3.6.1.16'},\n", + " 'rxn00621': {'2.7.7.39'},\n", + " 'rxn00622': {'3.1.4.46'},\n", + " 'rxn00623': {'1.8.1.2', '1.8.2.2'},\n", + " 'rxn00624': {'4.1.1.12'},\n", + " 'rxn00626': {'1.1.2.2'},\n", + " 'rxn00627': {'2.7.1.3'},\n", + " 'rxn00629': {'1.1.1.11', '1.1.1.67'},\n", + " 'rxn00630': {'1.1.1.138'},\n", + " 'rxn00631': {'1.1.1.124'},\n", + " 'rxn00632': {'3.1.3.-'},\n", + " 'rxn00633': {'1.1.99.28'},\n", + " 'rxn00634': {'1.1.1.14', '1.1.1.15'},\n", + " 'rxn00635': {'2.7.1.1'},\n", + " 'rxn00636': {'5.3.1.7'},\n", + " 'rxn00638': {'1.1.1.132'},\n", + " 'rxn00639': {'3.6.1.-', '3.6.1.21'},\n", + " 'rxn00640': {'2.7.7.22'},\n", + " 'rxn00641': {'2.7.7.13'},\n", + " 'rxn00642': {'4.2.1.47'},\n", + " 'rxn00643': {'5.1.3.18'},\n", + " 'rxn00644': {'1.8.1.6'},\n", + " 'rxn00645': {'1.13.11.20'},\n", + " 'rxn00646': {'6.3.2.2'},\n", + " 'rxn00647': {'2.6.1.1', '2.6.1.3'},\n", + " 'rxn00649': {'2.5.1.47', '2.5.1.65'},\n", + " 'rxn00650': {'3.4.11.1', '3.4.11.2', '3.4.11.23', '3.4.13.-', '3.4.13.18'},\n", + " 'rxn00651': {'4.4.1.10'},\n", + " 'rxn00652': {'5.1.1.10'},\n", + " 'rxn00653': {'1.2.1.-', '1.2.1.19', '1.2.1.3', '1.2.1.5'},\n", + " 'rxn00654': {'3.5.1.6'},\n", + " 'rxn00655': {'1.5.1.26'},\n", + " 'rxn00656': {'2.6.1.18'},\n", + " 'rxn00657': {'2.6.1.19', '2.6.1.55'},\n", + " 'rxn00658': {'3.5.1.21'},\n", + " 'rxn00659': {'6.3.2.11'},\n", + " 'rxn00660': {'3.4.13.4'},\n", + " 'rxn00661': {'6.3.2.11'},\n", + " 'rxn00662': {'3.5.3.17'},\n", + " 'rxn00667': {'2.3.1.94'},\n", + " 'rxn00668': {'1.3.1.-', '1.3.1.84'},\n", + " 'rxn00669': {'6.2.1.13'},\n", + " 'rxn00670': {'2.3.1.-', '2.3.1.222', '2.3.1.8'},\n", + " 'rxn00671': {'1.2.1.27'},\n", + " 'rxn00672': {'4.1.1.41', '4.1.1.94', '7.2.4.3'},\n", + " 'rxn00673': {'1.3.99.3'},\n", + " 'rxn00674': {'6.2.1.1', '6.2.1.17'},\n", + " 'rxn00675': {'6.2.1.1', '6.2.1.17'},\n", + " 'rxn00676': {'2.3.1.16', '2.3.1.9'},\n", + " 'rxn00677': {'2.8.3.1'},\n", + " 'rxn00678': {'2.1.3.1'},\n", + " 'rxn00679': {'2.3.3.5', '4.1.3.31'},\n", + " 'rxn00680': {'2.3.3.11'},\n", + " 'rxn00682': {'4.1.3.24'},\n", + " 'rxn00684': {'1.5.1.3'},\n", + " 'rxn00685': {'1.5.1.3'},\n", + " 'rxn00686': {'1.5.1.3'},\n", + " 'rxn00687': {'1.5.1.3'},\n", + " 'rxn00688': {'1.5.1.6'},\n", + " 'rxn00689': {'6.3.2.17'},\n", + " 'rxn00690': {'6.3.4.3'},\n", + " 'rxn00691': {'3.5.1.10'},\n", + " 'rxn00692': {'2.1.2.1'},\n", + " 'rxn00693': {'2.1.1.13'},\n", + " 'rxn00695': {'2.7.7.27'},\n", + " 'rxn00696': {'2.7.1.10'},\n", + " 'rxn00697': {'3.6.1.21'},\n", + " 'rxn00698': {'2.4.1.20'},\n", + " 'rxn00699': {'2.4.1.31'},\n", + " 'rxn00700': {'2.7.7.34'},\n", + " 'rxn00701': {'2.7.7.12'},\n", + " 'rxn00702': {'2.7.7.33'},\n", + " 'rxn00703': {'2.4.1.139'},\n", + " 'rxn00704': {'5.4.2.2', '5.4.2.5'},\n", + " 'rxn00705': {'2.7.1.41'},\n", + " 'rxn00706': {'3.6.1.5', '3.6.1.6', '3.6.1.64'},\n", + " 'rxn00707': {'2.7.1.48'},\n", + " 'rxn00708': {'3.1.3.5'},\n", + " 'rxn00709': {'2.7.1.48'},\n", + " 'rxn00710': {'4.1.1.23'},\n", + " 'rxn00711': {'2.4.2.9'},\n", + " 'rxn00712': {'2.7.1.48'},\n", + " 'rxn00713': {'2.7.1.48'},\n", + " 'rxn00714': {'3.6.1.17'},\n", + " 'rxn00715': {'2.7.1.48'},\n", + " 'rxn00716': {'4.1.1.66'},\n", + " 'rxn00717': {'3.5.4.1'},\n", + " 'rxn00718': {'1.3.3.7'},\n", + " 'rxn00719': {'1.3.1.1'},\n", + " 'rxn00720': {'1.3.1.2'},\n", + " 'rxn00721': {'2.7.7.55'},\n", + " 'rxn00722': {'1.14.13.35'},\n", + " 'rxn00723': {'6.2.1.32'},\n", + " 'rxn00724': {'1.13.11.23'},\n", + " 'rxn00725': {'2.1.1.111'},\n", + " 'rxn00726': {'4.1.3.27'},\n", + " 'rxn00727': {'4.1.3.27'},\n", + " 'rxn00728': {'3.7.1.3'},\n", + " 'rxn00729': {'3.5.1.9'},\n", + " 'rxn00730': {'2.3.1.113'},\n", + " 'rxn00731': {'4.1.1.24'},\n", + " 'rxn00735': {'1.1.1.85'},\n", + " 'rxn00736': {'4.1.1.3'},\n", + " 'rxn00737': {'4.3.1.19'},\n", + " 'rxn00738': {'3.5.99.7', '4.1.99.4-'},\n", + " 'rxn00739': {'2.3.3.6'},\n", + " 'rxn00740': {'2.5.1.48', '4.3.1.-'},\n", + " 'rxn00741': {'1.1.1.27'},\n", + " 'rxn00742': {'4.4.1.1'},\n", + " 'rxn00743': {'3.1.3.1', '3.1.3.2'},\n", + " 'rxn00744': {'2.7.1.29'},\n", + " 'rxn00745': {'2.7.1.121'},\n", + " 'rxn00746': {'4.1.2.2'},\n", + " 'rxn00747': {'5.3.1.1'},\n", + " 'rxn00748': {'4.2.3.3'},\n", + " 'rxn00749': {'1.2.99.3'},\n", + " 'rxn00751': {'2.7.1.32'},\n", + " 'rxn00752': {'1.1.3.17'},\n", + " 'rxn00753': {'2.3.1.6'},\n", + " 'rxn00754': {'3.1.1.7', '3.1.1.8'},\n", + " 'rxn00755': {'2.8.2.6'},\n", + " 'rxn00756': {'3.1.6.6'},\n", + " 'rxn00757': {'3.1.1.8'},\n", + " 'rxn00758': {'3.1.4.2', '3.1.4.46'},\n", + " 'rxn00759': {'4.5.1.2'},\n", + " 'rxn00761': {'1.14.12.13'},\n", + " 'rxn00762': {'1.1.1.6'},\n", + " 'rxn00763': {'1.1.1.-', '1.1.1.1', '1.1.1.21', '1.1.1.72'},\n", + " 'rxn00764': {'1.1.1.156'},\n", + " 'rxn00765': {'1.1.1.2', '1.1.1.21', '1.1.1.372', '1.1.1.72'},\n", + " 'rxn00766': {'3.1.3.19'},\n", + " 'rxn00767': {'2.7.1.79'},\n", + " 'rxn00768': {'4.2.1.30'},\n", + " 'rxn00769': {'4.2.1.30'},\n", + " 'rxn00770': {'2.7.6.1'},\n", + " 'rxn00771': {'2.7.1.18'},\n", + " 'rxn00772': {'2.7.1.15'},\n", + " 'rxn00773': {'2.7.7.35'},\n", + " 'rxn00774': {'6.3.4.7'},\n", + " 'rxn00775': {'3.6.1.-', '3.6.1.13', '3.6.1.21', '3.6.1.53'},\n", + " 'rxn00776': {'3.2.-.-', '4.2.1.70'},\n", + " 'rxn00777': {'5.3.1.6'},\n", + " 'rxn00778': {'5.4.2.2', '5.4.2.7'},\n", + " 'rxn00779': {'1.2.1.9'},\n", + " 'rxn00780': {'2.7.1.28'},\n", + " 'rxn00781': {'1.2.1.12', '1.2.1.59'},\n", + " 'rxn00782': {'1.2.1.13', '1.2.1.59'},\n", + " 'rxn00783': {'4.1.2.21', '4.1.2.55'},\n", + " 'rxn00784': {'4.1.2.4'},\n", + " 'rxn00785': {'2.2.1.1'},\n", + " 'rxn00786': {'4.1.2.13'},\n", + " 'rxn00787': {'4.1.2.40'},\n", + " 'rxn00789': {'2.4.2.17'},\n", + " 'rxn00790': {'2.4.2.14'},\n", + " 'rxn00791': {'2.4.2.18'},\n", + " 'rxn00792': {'6.2.1.11', '6.3.4.10', '6.3.4.11', '6.3.4.15', '6.3.4.9'},\n", + " 'rxn00793': {'6.2.1.11'},\n", + " 'rxn00794': {'3.5.1.12'},\n", + " 'rxn00795': {'3.5.1.12'},\n", + " 'rxn00797': {'3.2.2.3', '3.2.2.8'},\n", + " 'rxn00798': {'5.3.1.20'},\n", + " 'rxn00799': {'4.2.1.2'},\n", + " 'rxn00800': {'4.3.2.2'},\n", + " 'rxn00801': {'3.7.1.-', '3.7.1.20', '3.7.1.5'},\n", + " 'rxn00802': {'4.3.2.1'},\n", + " 'rxn00803': {'5.2.1.1'},\n", + " 'rxn00804': {'1.4.1.9'},\n", + " 'rxn00805': {'2.3.1.66'},\n", + " 'rxn00806': {'2.6.1.42', '2.6.1.6', '2.6.1.67'},\n", + " 'rxn00807': {'5.4.3.7'},\n", + " 'rxn00808': {'2.7.1.6'},\n", + " 'rxn00809': {'1.1.1.21'},\n", + " 'rxn00810': {'1.1.1.48'},\n", + " 'rxn00811': {'1.1.1.21'},\n", + " 'rxn00812': {'1.1.1.120', '1.1.1.359', '1.1.1.360', '1.1.1.48'},\n", + " 'rxn00813': {'1.1.1.120', '1.1.1.48'},\n", + " 'rxn00814': {'1.1.3.9'},\n", + " 'rxn00815': {'1.1.3.9'},\n", + " 'rxn00816': {'3.2.1.108', '3.2.1.23'},\n", + " 'rxn00817': {'3.2.1.22'},\n", + " 'rxn00818': {'3.2.1.22'},\n", + " 'rxn00819': {'3.2.1.22'},\n", + " 'rxn00820': {'1.7.99.4'},\n", + " 'rxn00821': {'1.8.5.1'},\n", + " 'rxn00822': {'1.8.4.4'},\n", + " 'rxn00824': {'1.8.4.3'},\n", + " 'rxn00826': {'1.8.4.4'},\n", + " 'rxn00827': {'2.7.7.43'},\n", + " 'rxn00829': {'4.1.1.33'},\n", + " 'rxn00830': {'5.3.3.2'},\n", + " 'rxn00831': {'3.1.3.5', '3.1.3.99'},\n", + " 'rxn00832': {'2.1.2.3', '3.5.4.10'},\n", + " 'rxn00833': {'3.2.2.12'},\n", + " 'rxn00834': {'1.1.1.205'},\n", + " 'rxn00835': {'2.7.1.73'},\n", + " 'rxn00836': {'2.4.2.8'},\n", + " 'rxn00837': {'1.6.6.8', '1.7.1.7'},\n", + " 'rxn00838': {'6.3.4.4'},\n", + " 'rxn00839': {'2.7.4.6'},\n", + " 'rxn00840': {'2.7.1.40'},\n", + " 'rxn00841': {'2.7.1.1'},\n", + " 'rxn00842': {'2.7.1.1'},\n", + " 'rxn00843': {'1.14.13.25'},\n", + " 'rxn00844': {'1.14.13.25'},\n", + " 'rxn00845': {'3.1.1.44'},\n", + " 'rxn00846': {'3.1.6.16'},\n", + " 'rxn00847': {'1.1.99.8'},\n", + " 'rxn00848': {'2.6.1.54'},\n", + " 'rxn00849': {'2.6.1.21'},\n", + " 'rxn00850': {'2.3.2.14'},\n", + " 'rxn00851': {'6.3.2.4'},\n", + " 'rxn00852': {'1.4.3.10', '1.4.3.22'},\n", + " 'rxn00853': {'3.5.1.53'},\n", + " 'rxn00854': {'2.1.1.53'},\n", + " 'rxn00855': {'2.3.1.57'},\n", + " 'rxn00856': {'2.6.1.29', '2.6.1.82'},\n", + " 'rxn00857': {'3.5.1.62'},\n", + " 'rxn00858': {'3.5.3.11'},\n", + " 'rxn00859': {'1.1.1.23'},\n", + " 'rxn00860': {'2.1.1.-'},\n", + " 'rxn00861': {'2.3.1.33'},\n", + " 'rxn00862': {'2.6.1.38'},\n", + " 'rxn00863': {'1.1.1.23'},\n", + " 'rxn00864': {'6.3.2.11'},\n", + " 'rxn00865': {'3.4.13.18', '3.4.13.20'},\n", + " 'rxn00866': {'4.1.1.22', '4.1.1.28'},\n", + " 'rxn00867': {'4.3.1.3'},\n", + " 'rxn00868': {'1.3.1.44', '1.3.8.1'},\n", + " 'rxn00869': {'1.2.1.10', '1.2.1.57', '1.2.1.87'},\n", + " 'rxn00870': {'1.2.1.57'},\n", + " 'rxn00871': {'2.3.1.19'},\n", + " 'rxn00872': {'1.3.3.6', '1.3.8.1', '1.3.99.-', '1.3.99.2', '1.3.99.3'},\n", + " 'rxn00873': {'6.2.1.2', '6.2.1.3'},\n", + " 'rxn00874': {'2.3.1.16', '2.3.1.9'},\n", + " 'rxn00875': {'2.8.3.8'},\n", + " 'rxn00876': {'2.3.3.7'},\n", + " 'rxn00877': {'5.4.99.13'},\n", + " 'rxn00878': {'2.7.1.64'},\n", + " 'rxn00879': {'1.1.1.18'},\n", + " 'rxn00880': {'1.13.99.1'},\n", + " 'rxn00881': {'3.1.3.25'},\n", + " 'rxn00882': {'3.1.3.25'},\n", + " 'rxn00883': {'3.1.3.25'},\n", + " 'rxn00884': {'2.1.1.40'},\n", + " 'rxn00885': {'2.1.1.39'},\n", + " 'rxn00886': {'2.1.1.129'},\n", + " 'rxn00887': {'2.1.1.129'},\n", + " 'rxn00888': {'2.4.1.123'},\n", + " 'rxn00889': {'3.1.4.44', '3.1.4.46'},\n", + " 'rxn00890': {'3.2.1.22'},\n", + " 'rxn00891': {'3.5.1.33'},\n", + " 'rxn00892': {'2.7.1.59'},\n", + " 'rxn00893': {'1.1.1.240'},\n", + " 'rxn00894': {'1.1.3.29'},\n", + " 'rxn00895': {'2.3.1.3'},\n", + " 'rxn00896': {'2.4.1.90'},\n", + " 'rxn00897': {'2.7.1.59', '5.1.3.8'},\n", + " 'rxn00898': {'4.2.1.9'},\n", + " 'rxn00899': {'1.2.1.25'},\n", + " 'rxn00900': {'1.1.1.84'},\n", + " 'rxn00901': {'1.4.1.8'},\n", + " 'rxn00902': {'2.3.3.13', '4.1.3.12'},\n", + " 'rxn00903': {'2.6.1.42', '2.6.1.6'},\n", + " 'rxn00904': {'2.6.1.66'},\n", + " 'rxn00905': {'2.1.2.11', '4.1.2.12'},\n", + " 'rxn00906': {'1.5.1.15'},\n", + " 'rxn00907': {'1.5.1.5'},\n", + " 'rxn00908': {'1.4.4.2', '1.8.1.4', '2.1.2.10'},\n", + " 'rxn00909': {'1.5.1.20', '1.7.99.5'},\n", + " 'rxn00910': {'1.5.1.20'},\n", + " 'rxn00911': {'2.1.2.7'},\n", + " 'rxn00912': {'2.1.2.11'},\n", + " 'rxn00913': {'3.1.3.5'},\n", + " 'rxn00914': {'2.7.1.73'},\n", + " 'rxn00915': {'2.4.2.22', '2.4.2.7', '2.4.2.8'},\n", + " 'rxn00916': {'6.3.4.1', '6.3.5.2'},\n", + " 'rxn00917': {'6.3.5.2'},\n", + " 'rxn00918': {'3.6.1.17'},\n", + " 'rxn00919': {'3.6.1.21'},\n", + " 'rxn00920': {'3.1.4.17', '3.1.4.35'},\n", + " 'rxn00921': {'4.1.1.61'},\n", + " 'rxn00922': {'2.1.1.25'},\n", + " 'rxn00923': {'2.4.1.35'},\n", + " 'rxn00924': {'3.1.1.2'},\n", + " 'rxn00925': {'3.1.6.1'},\n", + " 'rxn00926': {'3.5.4.2'},\n", + " 'rxn00927': {'3.2.2.1', '3.2.2.7', '3.2.2.8'},\n", + " 'rxn00928': {'1.5.1.1'},\n", + " 'rxn00929': {'1.5.1.2'},\n", + " 'rxn00930': {'1.5.1.1'},\n", + " 'rxn00931': {'1.5.1.2'},\n", + " 'rxn00932': {'1.14.11.2', '1.14.11.57'},\n", + " 'rxn00933': {'5.1.1.4'},\n", + " 'rxn00934': {'6.2.1.9'},\n", + " 'rxn00935': {'1.1.5.4'},\n", + " 'rxn00936': {'3.2.2.11'},\n", + " 'rxn00937': {'4.2.1.65'},\n", + " 'rxn00938': {'3.5.1.19', '3.5.1.4'},\n", + " 'rxn00939': {'2.1.1.1'},\n", + " 'rxn00940': {'3.2.2.14', '3.2.2.6'},\n", + " 'rxn00941': {'2.4.2.12'},\n", + " 'rxn00942': {'3.2.2.1'},\n", + " 'rxn00943': {'3.1.2.2', '3.1.2.22'},\n", + " 'rxn00944': {'1.2.1.42'},\n", + " 'rxn00945': {'1.3.1.38', '1.3.1.8'},\n", + " 'rxn00946': {'1.3.3.6', '1.3.8.9', '1.3.99.-', '1.3.99.13', '1.3.99.3'},\n", + " 'rxn00947': {'6.2.1.3'},\n", + " 'rxn00948': {'2.3.1.50'},\n", + " 'rxn00949': {'4.4.1.2'},\n", + " 'rxn00950': {'4.4.1.8'},\n", + " 'rxn00952': {'2.5.1.49', '4.2.99.10'},\n", + " 'rxn00953': {'4.2.1.22'},\n", + " 'rxn00955': {'4.4.1.21'},\n", + " 'rxn00956': {'1.8.4.1'},\n", + " 'rxn00957': {'1.2.1.28', '1.2.1.64'},\n", + " 'rxn00958': {'1.2.1.7'},\n", + " 'rxn00959': {'1.14.13.12'},\n", + " 'rxn00960': {'1.14.13.33'},\n", + " 'rxn00961': {'1.14.13.64'},\n", + " 'rxn00962': {'1.14.13.2', '1.14.13.33'},\n", + " 'rxn00963': {'1.14.13.64'},\n", + " 'rxn00964': {'6.2.1.27'},\n", + " 'rxn00965': {'3.1.2.23'},\n", + " 'rxn00966': {'4.1.3.40'},\n", + " 'rxn00967': {'2.4.1.194'},\n", + " 'rxn00968': {'1.13.11.41'},\n", + " 'rxn00969': {'3.8.1.6'},\n", + " 'rxn00971': {'6.2.1.18'},\n", + " 'rxn00972': {'2.8.3.10'},\n", + " 'rxn00973': {'4.2.1.3'},\n", + " 'rxn00974': {'4.2.1.3', '4.2.1.4'},\n", + " 'rxn00975': {'2.7.1.1', '2.7.1.7'},\n", + " 'rxn00976': {'2.7.1.1'},\n", + " 'rxn00977': {'3.2.1.22'},\n", + " 'rxn00978': {'2.7.1.1'},\n", + " 'rxn00979': {'1.2.1.21'},\n", + " 'rxn00980': {'3.1.3.18'},\n", + " 'rxn00981': {'4.2.99.12'},\n", + " 'rxn00982': {'2.1.1.15'},\n", + " 'rxn00983': {'3.1.1.23', '3.1.1.79'},\n", + " 'rxn00984': {'3.1.1.23'},\n", + " 'rxn00985': {'2.7.2.1', '2.7.2.15'},\n", + " 'rxn00986': {'6.2.1.1', '6.2.1.17'},\n", + " 'rxn00987': {'4.1.3.32'},\n", + " 'rxn00988': {'6.2.1.16'},\n", + " 'rxn00989': {'3.1.2.11'},\n", + " 'rxn00990': {'2.8.3.-', '2.8.3.8'},\n", + " 'rxn00991': {'4.1.3.4'},\n", + " 'rxn00992': {'1.1.1.30'},\n", + " 'rxn00993': {'3.7.1.2'},\n", + " 'rxn00994': {'2.8.3.9'},\n", + " 'rxn00995': {'4.1.1.4'},\n", + " 'rxn00996': {'4.2.1.27'},\n", + " 'rxn00997': {'1.1.1.222', '1.1.1.237'},\n", + " 'rxn00998': {'1.1.1.222', '1.1.1.237'},\n", + " 'rxn00999': {'1.13.11.27'},\n", + " 'rxn01000': {'4.2.1.51', '4.2.1.91'},\n", + " 'rxn01001': {'2.6.1.64'},\n", + " 'rxn01002': {'2.6.1.28'},\n", + " 'rxn01003': {'4.1.1.-', '4.1.1.43', '4.1.4.3'},\n", + " 'rxn01004': {'5.3.2.1'},\n", + " 'rxn01005': {'2.7.7.44'},\n", + " 'rxn01007': {'4.1.1.35'},\n", + " 'rxn01008': {'5.1.3.6'},\n", + " 'rxn01009': {'4.1.1.-'},\n", + " 'rxn01010': {'5.1.3.12'},\n", + " 'rxn01011': {'1.1.1.26', '1.1.1.29', '1.1.1.81'},\n", + " 'rxn01013': {'1.1.1.79', '1.1.1.81'},\n", + " 'rxn01014': {'4.1.1.40'},\n", + " 'rxn01015': {'5.3.1.22'},\n", + " 'rxn01016': {'2.7.2.2'},\n", + " 'rxn01017': {'2.1.3.8'},\n", + " 'rxn01018': {'2.1.3.2'},\n", + " 'rxn01019': {'2.1.3.3'},\n", + " 'rxn01020': {'2.1.3.6'},\n", + " 'rxn01021': {'3.2.2.16', '3.2.2.9'},\n", + " 'rxn01022': {'2.4.2.28'},\n", + " 'rxn01023': {'2.7.1.59', '4.2.1.66', '5.1.3.8'},\n", + " 'rxn01024': {'2.7.1.59', '4.2.1.66', '5.1.3.8'},\n", + " 'rxn01025': {'3.5.4.1'},\n", + " 'rxn01026': {'1.14.11.6'},\n", + " 'rxn01027': {'1.3.1.1'},\n", + " 'rxn01028': {'1.3.1.2'},\n", + " 'rxn01029': {'3.5.3.12'},\n", + " 'rxn01030': {'2.7.3.10'},\n", + " 'rxn01031': {'3.5.3.20'},\n", + " 'rxn01032': {'1.2.1.28', '1.2.1.29'},\n", + " 'rxn01033': {'1.2.1.7'},\n", + " 'rxn01034': {'3.6.1.7'},\n", + " 'rxn01035': {'6.2.1.25'},\n", + " 'rxn01036': {'3.6.1.20'},\n", + " 'rxn01037': {'3.5.1.32'},\n", + " 'rxn01038': {'3.5.1.40'},\n", + " 'rxn01041': {'1.1.1.121', '1.1.1.175'},\n", + " 'rxn01042': {'1.1.1.179'},\n", + " 'rxn01043': {'1.1.1.21', '1.1.1.307'},\n", + " 'rxn01044': {'5.3.1.5'},\n", + " 'rxn01045': {'1.4.1.-', '1.4.1.23', '1.4.1.9'},\n", + " 'rxn01046': {'4.1.1.14'},\n", + " 'rxn01048': {'2.2.1.3'},\n", + " 'rxn01049': {'2.7.1.85'},\n", + " 'rxn01050': {'1.1.99.18'},\n", + " 'rxn01051': {'3.2.1.74'},\n", + " 'rxn01052': {'5.1.3.11'},\n", + " ...}" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "{k:v['Enzyme Class'] for k, v in reaction_ecs.items()}" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'rxn00001': {'3.6.1.1'},\n", + " 'rxn00002': {'3.5.1.54'},\n", + " 'rxn00003': {'2.2.1.6'},\n", + " 'rxn00004': {'4.1.3.17'},\n", + " 'rxn00006': {'1.11.1.21', '1.11.1.6'},\n", + " 'rxn00007': {'3.2.1.28'},\n", + " 'rxn00008': {'1.11.1.13'},\n", + " 'rxn00009': {'2.7.7.45'},\n", + " 'rxn00010': {'4.1.1.47'},\n", + " 'rxn00011': {'1.2.4.1', '2.2.1.6', '4.1.1.1'},\n", + " 'rxn00012': {'2.4.1.99'},\n", + " 'rxn00013': {'2.7.1.41'},\n", + " 'rxn00014': {'1.11.1.5'},\n", + " 'rxn00015': {'2.5.1.44'},\n", + " 'rxn00016': {'3.2.1.52'},\n", + " 'rxn00017': {'1.7.1.5'},\n", + " 'rxn00018': {'4.1.1.39'},\n", + " 'rxn00019': {'1.13.11.32'},\n", + " 'rxn00020': {'3.2.1.21'},\n", + " 'rxn00021': {'4.1.2.38'},\n", + " 'rxn00022': {'3.2.1.20'},\n", + " 'rxn00023': {'1.8.2.2'},\n", + " 'rxn00024': {'1.10.3.1'},\n", + " 'rxn00025': {'1.13.11.63', '1.14.99.36'},\n", + " 'rxn00026': {'1.1.3.23'},\n", + " 'rxn00027': {'4.1.99.3'},\n", + " 'rxn00028': {'1.10.3.3'},\n", + " 'rxn00029': {'4.2.1.24'},\n", + " 'rxn00030': {'4.1.2.35'},\n", + " 'rxn00031': {'2.4.1.166'},\n", + " 'rxn00032': {'1.1.3.17'},\n", + " 'rxn00033': {'1.2.3.13'},\n", + " 'rxn00034': {'1.13.11.43'},\n", + " 'rxn00035': {'1.21.3.2'},\n", + " 'rxn00036': {'1.10.3.1'},\n", + " 'rxn00037': {'1.14.99.-'},\n", + " 'rxn00038': {'3.1.1.22'},\n", + " 'rxn00039': {'2.3.1.90'},\n", + " 'rxn00040': {'3.1.1.20'},\n", + " 'rxn00041': {'3.1.1.40'},\n", + " 'rxn00042': {'1.1.3.28'},\n", + " 'rxn00043': {'1.10.3.1', '1.14.18.1'},\n", + " 'rxn00044': {'3.5.1.46'},\n", + " 'rxn00045': {'2.4.1.95'},\n", + " 'rxn00046': {'2.3.1.103'},\n", + " 'rxn00047': {'4.2.2.6'},\n", + " 'rxn00048': {'2.5.1.9'},\n", + " 'rxn00050': {'1.14.13.-'},\n", + " 'rxn00052': {'1.1.3.23'},\n", + " 'rxn00053': {'1.14.99.1'},\n", + " 'rxn00054': {'1.10.3.4'},\n", + " 'rxn00055': {'2.5.1.43'},\n", + " 'rxn00056': {'1.16.3.1'},\n", + " 'rxn00057': {'1.1.3.14', '1.10.3.1'},\n", + " 'rxn00058': {'1.7.2.1', '1.9.3.1'},\n", + " 'rxn00059': {'1.10.3.2'},\n", + " 'rxn00060': {'2.5.1.61', '4.3.1.8'},\n", + " 'rxn00061': {'3.6.1.5'},\n", + " 'rxn00062': {'3.6.1.15',\n", + " '3.6.1.3',\n", + " '3.6.1.5',\n", + " '3.6.1.8',\n", + " '3.6.3.1',\n", + " '3.6.3.10',\n", + " '3.6.3.11',\n", + " '3.6.3.12',\n", + " '3.6.3.14',\n", + " '3.6.3.15',\n", + " '3.6.3.16',\n", + " '3.6.3.17',\n", + " '3.6.3.18',\n", + " '3.6.3.19',\n", + " '3.6.3.2',\n", + " '3.6.3.20',\n", + " '3.6.3.21',\n", + " '3.6.3.22',\n", + " '3.6.3.23',\n", + " '3.6.3.24',\n", + " '3.6.3.25',\n", + " '3.6.3.26',\n", + " '3.6.3.27',\n", + " '3.6.3.28',\n", + " '3.6.3.29',\n", + " '3.6.3.3',\n", + " '3.6.3.30',\n", + " '3.6.3.31',\n", + " '3.6.3.32',\n", + " '3.6.3.33',\n", + " '3.6.3.34',\n", + " '3.6.3.35',\n", + " '3.6.3.36',\n", + " '3.6.3.37',\n", + " '3.6.3.38',\n", + " '3.6.3.39',\n", + " '3.6.3.4',\n", + " '3.6.3.40',\n", + " '3.6.3.41',\n", + " '3.6.3.42',\n", + " '3.6.3.43',\n", + " '3.6.3.44',\n", + " '3.6.3.46',\n", + " '3.6.3.47',\n", + " '3.6.3.48',\n", + " '3.6.3.49',\n", + " '3.6.3.5',\n", + " '3.6.3.50',\n", + " '3.6.3.51',\n", + " '3.6.3.52',\n", + " '3.6.3.53',\n", + " '3.6.3.54',\n", + " '3.6.3.55',\n", + " '3.6.3.6',\n", + " '3.6.3.7',\n", + " '3.6.3.8',\n", + " '3.6.3.9',\n", + " '3.6.4.1',\n", + " '3.6.4.10',\n", + " '3.6.4.11',\n", + " '3.6.4.12',\n", + " '3.6.4.13',\n", + " '3.6.4.2',\n", + " '3.6.4.3',\n", + " '3.6.4.4',\n", + " '3.6.4.5',\n", + " '3.6.4.6',\n", + " '3.6.4.7',\n", + " '3.6.4.8',\n", + " '3.6.4.9',\n", + " '5.6.1.c',\n", + " '5.6.1.d',\n", + " '5.6.1.f',\n", + " '5.6.1.g',\n", + " '7.3.2.a',\n", + " '7.3.2.f',\n", + " '7.5.2.h',\n", + " '7.5.2.j',\n", + " '7.5.2.l',\n", + " '7.6.2.c',\n", + " '7.6.2.f'},\n", + " 'rxn00063': {'3.6.1.8'},\n", + " 'rxn00064': {'3.5.4.18'},\n", + " 'rxn00065': {'4.6.1.1'},\n", + " 'rxn00066': {'1.11.1.1'},\n", + " 'rxn00067': {'1.8.1.14', '1.8.1.M1'},\n", + " 'rxn00068': {'1.16.1.7'},\n", + " 'rxn00069': {'1.4.1.14'},\n", + " 'rxn00070': {'1.8.1.7'},\n", + " 'rxn00071': {'1.6.5.4'},\n", + " 'rxn00072': {'1.16.1.3'},\n", + " 'rxn00074': {'1.16.1.4'},\n", + " 'rxn00075': {'3.2.2.5', '3.2.2.6'},\n", + " 'rxn00076': {'3.6.1.22', '3.6.1.9'},\n", + " 'rxn00077': {'2.7.1.23'},\n", + " 'rxn00078': {'2.7.1.86'},\n", + " 'rxn00079': {'1.6.2.4'},\n", + " 'rxn00080': {'1.16.1.5'},\n", + " 'rxn00082': {'1.14.13.39'},\n", + " 'rxn00083': {'1.6.1.1', '1.6.1.2', '1.6.1.3'},\n", + " 'rxn00084': {'1.11.1.2'},\n", + " 'rxn00085': {'1.4.1.13'},\n", + " 'rxn00086': {'1.6.4.2', '1.8.1.7'},\n", + " 'rxn00087': {'1.8.1.10'},\n", + " 'rxn00088': {'3.1.3.-', '3.1.3.2'},\n", + " 'rxn00089': {'3.2.2.5', '3.2.2.6'},\n", + " 'rxn00090': {'1.8.3.3'},\n", + " 'rxn00091': {'1.13.99.-'},\n", + " 'rxn00092': {'3.6.1.5'},\n", + " 'rxn00093': {'3.5.4.17', '3.5.4.7'},\n", + " 'rxn00095': {'3.6.1.41'},\n", + " 'rxn00096': {'2.7.7.53'},\n", + " 'rxn00097': {'2.7.4.3'},\n", + " 'rxn00098': {'3.6.1.14'},\n", + " 'rxn00099': {'4.2.1.93'},\n", + " 'rxn00100': {'2.7.1.24'},\n", + " 'rxn00101': {'3.5.1.5'},\n", + " 'rxn00102': {'4.2.1.1'},\n", + " 'rxn00103': {'1.17.1.10', '1.2.1.43'},\n", + " 'rxn00104': {'2.7.4.1'},\n", + " 'rxn00105': {'2.7.7.1', '2.7.7.18'},\n", + " 'rxn00106': {'3.6.1.1', '3.6.1.25'},\n", + " 'rxn00107': {'2.7.4.6'},\n", + " 'rxn00108': {'2.7.4.12'},\n", + " 'rxn00109': {'1.7.1.10', '1.7.99.1'},\n", + " 'rxn00110': {'1.14.13.35'},\n", + " 'rxn00111': {'1.14.13.35'},\n", + " 'rxn00112': {'1.13.12.-'},\n", + " 'rxn00113': {'6.3.4.16', '6.3.4.16-'},\n", + " 'rxn00114': {'2.7.2.2'},\n", + " 'rxn00116': {'3.6.1.5', '3.6.1.6'},\n", + " 'rxn00117': {'2.7.4.6'},\n", + " 'rxn00118': {'2.7.4.10'},\n", + " 'rxn00119': {'2.7.4.14', '2.7.4.22', '2.7.4.4'},\n", + " 'rxn00120': {'3.6.1.15', '3.6.1.39', '3.6.1.5'},\n", + " 'rxn00121': {'3.6.1.18', '3.6.1.9'},\n", + " 'rxn00122': {'2.7.7.2'},\n", + " 'rxn00123': {'3.1.3.74'},\n", + " 'rxn00124': {'2.7.1.35'},\n", + " 'rxn00125': {'3.3.1.2'},\n", + " 'rxn00126': {'2.5.1.6'},\n", + " 'rxn00127': {'4.1.1.50'},\n", + " 'rxn00128': {'4.4.1.14'},\n", + " 'rxn00129': {'2.5.1.4'},\n", + " 'rxn00130': {'3.5.4.17', '3.5.4.6'},\n", + " 'rxn00131': {'3.2.2.4'},\n", + " 'rxn00132': {'3.1.3.5'},\n", + " 'rxn00133': {'3.6.1.17', '3.6.1.61'},\n", + " 'rxn00134': {'2.7.1.20', '2.7.1.74'},\n", + " 'rxn00135': {'3.6.1.29'},\n", + " 'rxn00136': {'3.6.1.29'},\n", + " 'rxn00137': {'3.1.3.7'},\n", + " 'rxn00138': {'6.3.1.5', '6.3.5.1'},\n", + " 'rxn00139': {'2.4.2.7', '2.4.2.8'},\n", + " 'rxn00140': {'3.1.4.17', '3.1.4.53'},\n", + " 'rxn00141': {'3.3.1.1'},\n", + " 'rxn00142': {'3.5.4.28'},\n", + " 'rxn00143': {'3.2.2.9'},\n", + " 'rxn00144': {'4.3.1.15'},\n", + " 'rxn00145': {'1.1.2.3'},\n", + " 'rxn00146': {'1.1.2.4'},\n", + " 'rxn00147': {'2.7.9.2'},\n", + " 'rxn00148': {'2.7.1.40'},\n", + " 'rxn00149': {'1.2.1.22', '1.2.1.23', '1.2.1.3'},\n", + " 'rxn00150': {'1.2.1.49'},\n", + " 'rxn00151': {'2.7.9.1'},\n", + " 'rxn00152': {'1.2.3.3'},\n", + " 'rxn00153': {'3.1.3.60'},\n", + " 'rxn00154': {'1.2.1.-', '1.2.1.M10', '1.2.4.1', '1.8.1.4', '2.3.1.12'},\n", + " 'rxn00155': {'1.2.1.51'},\n", + " 'rxn00156': {'1.2.3.6'},\n", + " 'rxn00157': {'2.3.1.54'},\n", + " 'rxn00158': {'4.3.1.13'},\n", + " 'rxn00159': {'1.1.1.38', '1.1.1.39'},\n", + " 'rxn00160': {'1.1.1.83'},\n", + " 'rxn00161': {'1.1.1.40'},\n", + " 'rxn00162': {'1.1.1.38', '1.1.1.40', '4.1.1.112', '4.1.1.3'},\n", + " 'rxn00163': {'4.1.1.78'},\n", + " 'rxn00164': {'4.1.1.-'},\n", + " 'rxn00165': {'4.2.1.13', '4.3.1.17', '4.3.1.19'},\n", + " 'rxn00166': {'4.3.1.18'},\n", + " 'rxn00168': {'4.1.1.1'},\n", + " 'rxn00170': {'3.1.2.1'},\n", + " 'rxn00171': {'1.2.1.10'},\n", + " 'rxn00172': {'6.2.1.13'},\n", + " 'rxn00173': {'2.3.1.8'},\n", + " 'rxn00174': {'4.1.1.9'},\n", + " 'rxn00175': {'6.2.1.1'},\n", + " 'rxn00176': {'6.2.1.1'},\n", + " 'rxn00177': {'4.1.3.24', '4.1.3.25'},\n", + " 'rxn00178': {'2.3.1.9'},\n", + " 'rxn00179': {'2.7.2.11'},\n", + " 'rxn00181': {'2.7.2.13'},\n", + " 'rxn00182': {'1.4.1.2', '1.4.1.3', '1.4.1.4'},\n", + " 'rxn00183': {'1.2.1.88', '1.5.1.12'},\n", + " 'rxn00184': {'1.4.1.3', '1.4.1.4'},\n", + " 'rxn00185': {'1.4.3.11'},\n", + " 'rxn00186': {'3.5.2.9'},\n", + " 'rxn00187': {'6.3.1.2'},\n", + " 'rxn00188': {'3.5.1.87'},\n", + " 'rxn00189': {'3.5.1.2', '3.5.1.38', '6.3.5.4', '6.3.5.5'},\n", + " 'rxn00190': {'6.3.5.1'},\n", + " 'rxn00191': {'2.6.1.2'},\n", + " 'rxn00192': {'2.3.1.1'},\n", + " 'rxn00193': {'5.1.1.3'},\n", + " 'rxn00194': {'4.1.1.15'},\n", + " 'rxn00195': {'5.4.99.1'},\n", + " 'rxn00196': {'1.2.1.26', '1.2.1.3'},\n", + " 'rxn00197': {'1.2.1.52'},\n", + " 'rxn00198': {'1.1.1.42'},\n", + " 'rxn00199': {'1.1.1.42', '4.1.1.-'},\n", + " 'rxn00200': {'3.5.1.-', '3.5.1.111', '3.5.1.3'},\n", + " 'rxn00202': {'2.3.3.14', '4.1.3.21'},\n", + " 'rxn00203': {'4.1.1.71'},\n", + " 'rxn00204': {'1.2.3.4'},\n", + " 'rxn00205': {'1.11.1.9'},\n", + " 'rxn00206': {'1.15.1.1'},\n", + " 'rxn00207': {'1.2.2.4'},\n", + " 'rxn00208': {'1.4.3.5'},\n", + " 'rxn00209': {'1.4.3.5'},\n", + " 'rxn00210': {'1.4.3.15', '1.4.3.7'},\n", + " 'rxn00211': {'1.1.1.22'},\n", + " 'rxn00212': {'3.6.1.45', '3.6.1.8', '3.6.1.9'},\n", + " 'rxn00213': {'2.7.7.9'},\n", + " 'rxn00214': {'5.1.3.2'},\n", + " 'rxn00215': {'4.2.1.76'},\n", + " 'rxn00216': {'2.7.1.1', '2.7.1.2'},\n", + " 'rxn00217': {'1.1.1.118', '1.1.1.121'},\n", + " 'rxn00218': {'1.1.1.119'},\n", + " 'rxn00219': {'1.1.3.10'},\n", + " 'rxn00220': {'3.1.3.58', '3.1.3.9'},\n", + " 'rxn00221': {'3.1.3.10'},\n", + " 'rxn00222': {'3.2.1.21', '3.2.1.74'},\n", + " 'rxn00223': {'5.3.1.5'},\n", + " 'rxn00224': {'4.99.1.1'},\n", + " 'rxn00225': {'2.7.2.1', '2.7.2.15'},\n", + " 'rxn00226': {'6.2.1.1'},\n", + " 'rxn00227': {'3.6.1.7'},\n", + " 'rxn00228': {'3.11.1.2'},\n", + " 'rxn00229': {'1.13.12.4'},\n", + " 'rxn00230': {'2.7.2.12'},\n", + " 'rxn00231': {'3.5.1.4'},\n", + " 'rxn00232': {'3.6.1.20'},\n", + " 'rxn00233': {'3.7.1.6'},\n", + " 'rxn00234': {'4.1.3.22'},\n", + " 'rxn00235': {'3.1.1.33'},\n", + " 'rxn00236': {'3.6.1.42', '3.6.1.5', '3.6.1.6'},\n", + " 'rxn00237': {'2.7.4.6'},\n", + " 'rxn00238': {'2.7.4.6'},\n", + " 'rxn00239': {'2.7.4.8'},\n", + " 'rxn00240': {'2.7.4.10'},\n", + " 'rxn00241': {'3.6.1.15',\n", + " '3.6.1.5',\n", + " '3.6.5.1',\n", + " '3.6.5.2',\n", + " '3.6.5.3',\n", + " '3.6.5.4',\n", + " '3.6.5.5',\n", + " '3.6.5.6'},\n", + " 'rxn00242': {'3.1.7.2'},\n", + " 'rxn00243': {'3.2.1.42'},\n", + " 'rxn00244': {'3.7.1.1'},\n", + " 'rxn00245': {'4.2.1.32'},\n", + " 'rxn00247': {'4.1.1.49'},\n", + " 'rxn00248': {'1.1.1.299', '1.1.1.37'},\n", + " 'rxn00249': {'1.1.1.299', '1.1.1.82'},\n", + " 'rxn00250': {'6.4.1.1'},\n", + " 'rxn00251': {'4.1.1.31'},\n", + " 'rxn00252': {'4.1.1.38'},\n", + " 'rxn00253': {'4.3.1.20'},\n", + " 'rxn00254': {'3.5.1.-', '3.5.1.3'},\n", + " 'rxn00255': {'4.1.3.17'},\n", + " 'rxn00256': {'2.3.3.1', '2.3.3.16', '2.3.3.3', '4.1.3.7'},\n", + " 'rxn00257': {'2.3.3.8'},\n", + " 'rxn00258': {'2.1.3.1'},\n", + " 'rxn00259': {'4.1.3.34'},\n", + " 'rxn00260': {'2.6.1.1'},\n", + " 'rxn00261': {'1.13.11.-'},\n", + " 'rxn00262': {'1.4.3.16', '1.4.3.2'},\n", + " 'rxn00263': {'1.4.3.1', '1.4.3.15'},\n", + " 'rxn00264': {'1.1.3.3'},\n", + " 'rxn00265': {'4.1.3.6'},\n", + " 'rxn00266': {'5.3.2.2'},\n", + " 'rxn00267': {'1.4.2.1'},\n", + " 'rxn00268': {'1.4.1.1', '1.4.1.10'},\n", + " 'rxn00269': {'1.4.3.19', '1.4.3.2', '1.4.3.3'},\n", + " 'rxn00270': {'2.1.1.156', '2.1.1.162', '2.1.1.20'},\n", + " 'rxn00271': {'1.5.1.22'},\n", + " 'rxn00272': {'2.6.1.44'},\n", + " 'rxn00273': {'2.3.1.29'},\n", + " 'rxn00274': {'2.3.1.29'},\n", + " 'rxn00275': {'2.6.1.4', '2.6.1.44'},\n", + " 'rxn00276': {'2.6.1.35'},\n", + " 'rxn00278': {'1.4.1.1'},\n", + " 'rxn00279': {'4.1.1.12'},\n", + " 'rxn00280': {'1.5.1.17'},\n", + " 'rxn00281': {'2.3.1.-'},\n", + " 'rxn00282': {'2.6.1.12'},\n", + " 'rxn00283': {'5.1.1.1'},\n", + " 'rxn00284': {'1.3.1.6'},\n", + " 'rxn00285': {'6.2.1.5'},\n", + " 'rxn00286': {'2.8.3.-', '2.8.3.22'},\n", + " 'rxn00287': {'3.1.2.3'},\n", + " 'rxn00288': {'1.3.99.1'},\n", + " 'rxn00289': {'4.1.3.30'},\n", + " 'rxn00290': {'2.8.3.5'},\n", + " 'rxn00291': {'3.5.1.96'},\n", + " 'rxn00292': {'3.2.1.183', '5.1.3.14'},\n", + " 'rxn00293': {'2.7.7.23'},\n", + " 'rxn00295': {'5.1.3.2', '5.1.3.7'},\n", + " 'rxn00297': {'5.1.3.14'},\n", + " 'rxn00298': {'1.1.1.136'},\n", + " 'rxn00299': {'3.5.4.16'},\n", + " 'rxn00300': {'3.5.4.25'},\n", + " 'rxn00301': {'3.6.1.19', '3.6.1.8'},\n", + " 'rxn00302': {'3.5.4.16'},\n", + " 'rxn00303': {'2.7.6.5'},\n", + " 'rxn00304': {'2.7.1.40'},\n", + " 'rxn00305': {'4.1.1.32'},\n", + " 'rxn00306': {'6.2.1.4'},\n", + " 'rxn00307': {'4.6.1.1', '4.6.1.2'},\n", + " 'rxn00308': {'1.4.1.15'},\n", + " 'rxn00309': {'1.4.1.18'},\n", + " 'rxn00310': {'1.4.3.14'},\n", + " 'rxn00311': {'1.14.13.59'},\n", + " 'rxn00312': {'1.13.12.2'},\n", + " 'rxn00313': {'4.1.1.20'},\n", + " 'rxn00314': {'1.5.1.16'},\n", + " 'rxn00315': {'2.6.1.71'},\n", + " 'rxn00316': {'2.3.1.-'},\n", + " 'rxn00317': {'2.6.1.36'},\n", + " 'rxn00318': {'3.5.1.17'},\n", + " 'rxn00319': {'4.3.1.28'},\n", + " 'rxn00320': {'5.1.1.5', '5.1.1.9'},\n", + " 'rxn00321': {'5.4.3.2'},\n", + " 'rxn00322': {'4.1.1.18'},\n", + " 'rxn00323': {'3.5.2.11'},\n", + " 'rxn00324': {'1.1.1.26', '1.1.1.79'},\n", + " 'rxn00325': {'1.2.3.5'},\n", + " 'rxn00326': {'1.2.1.17'},\n", + " 'rxn00327': {'3.5.1.116', '3.5.3.19'},\n", + " 'rxn00328': {'4.1.3.16', '4.1.3.42'},\n", + " 'rxn00330': {'2.3.3.9', '4.1.3.2'},\n", + " 'rxn00331': {'4.1.3.24'},\n", + " 'rxn00332': {'2.2.1.5'},\n", + " 'rxn00333': {'1.1.3.15'},\n", + " 'rxn00334': {'4.1.3.13'},\n", + " 'rxn00335': {'4.1.3.14'},\n", + " 'rxn00336': {'4.1.3.1'},\n", + " 'rxn00337': {'2.7.2.4'},\n", + " 'rxn00338': {'1.4.3.16'},\n", + " 'rxn00339': {'6.3.1.4'},\n", + " 'rxn00340': {'6.3.1.1', '6.3.5.4'},\n", + " 'rxn00341': {'3.5.1.7'},\n", + " 'rxn00342': {'3.5.1.1', '3.5.1.38'},\n", + " 'rxn00343': {'3.5.5.4'},\n", + " 'rxn00344': {'2.3.1.17'},\n", + " 'rxn00345': {'3.5.1.15'},\n", + " 'rxn00346': {'4.1.1.11', '4.1.1.15'},\n", + " 'rxn00347': {'3.5.1.38', '4.3.1.1'},\n", + " 'rxn00348': {'5.1.1.13'},\n", + " 'rxn00350': {'2.3.2.2', '3.4.19.13'},\n", + " 'rxn00351': {'6.3.2.3'},\n", + " 'rxn00352': {'3.1.2.13'},\n", + " 'rxn00353': {'1.8.4.-'},\n", + " 'rxn00354': {'1.1.1.-'},\n", + " 'rxn00355': {'2.7.7.10'},\n", + " 'rxn00356': {'2.4.1.22'},\n", + " 'rxn00357': {'2.7.8.18'},\n", + " 'rxn00358': {'5.4.99.9'},\n", + " 'rxn00359': {'3.6.1.9', '3.6.2.2'},\n", + " 'rxn00360': {'3.1.3.7'},\n", + " 'rxn00361': {'2.7.1.25'},\n", + " 'rxn00362': {'3.2.2.10'},\n", + " 'rxn00363': {'3.1.3.5', '3.1.3.91'},\n", + " 'rxn00364': {'2.7.4.14', '2.7.4.25'},\n", + " 'rxn00365': {'2.7.1.-', '2.7.1.213', '2.7.1.48'},\n", + " 'rxn00366': {'3.6.1.5', '3.6.1.6'},\n", + " 'rxn00367': {'3.6.1.-', '3.6.1.65', '3.6.1.8'},\n", + " 'rxn00368': {'2.7.1.48'},\n", + " 'rxn00369': {'2.7.1.-', '2.7.1.48'},\n", + " 'rxn00370': {'2.7.2.6'},\n", + " 'rxn00371': {'1.17.1.9', '1.2.1.2'},\n", + " 'rxn00372': {'3.1.2.10'},\n", + " 'rxn00373': {'4.1.1.2'},\n", + " 'rxn00374': {'3.5.1.49'},\n", + " 'rxn00375': {'3.5.1.68'},\n", + " 'rxn00376': {'3.5.1.15', '3.5.1.8'},\n", + " 'rxn00377': {'3.1.2.12'},\n", + " 'rxn00378': {'1.8.2.1'},\n", + " 'rxn00379': {'2.7.7.4'},\n", + " 'rxn00380': {'2.7.7.5'},\n", + " 'rxn00381': {'3.6.2.1'},\n", + " 'rxn00382': {'4.3.1.10'},\n", + " 'rxn00383': {'1.8.3.1'},\n", + " 'rxn00384': {'3.1.6.3'},\n", + " 'rxn00385': {'2.8.2.15'},\n", + " 'rxn00386': {'2.8.2.15'},\n", + " 'rxn00387': {'2.8.2.15'},\n", + " 'rxn00388': {'3.5.5.1', '3.5.5.2', '3.5.5.5', '3.5.5.7'},\n", + " 'rxn00389': {'3.5.1.17'},\n", + " 'rxn00390': {'3.5.1.15'},\n", + " 'rxn00391': {'3.1.3.-', '3.1.3.102', '3.1.3.2'},\n", + " 'rxn00392': {'2.7.1.26'},\n", + " 'rxn00393': {'2.7.1.42'},\n", + " 'rxn00394': {'3.5.3.1'},\n", + " 'rxn00395': {'3.5.3.6'},\n", + " 'rxn00396': {'2.7.3.3'},\n", + " 'rxn00397': {'2.4.2.31'},\n", + " 'rxn00398': {'1.4.3.-', '1.4.3.2'},\n", + " 'rxn00399': {'1.14.13.39'},\n", + " 'rxn00400': {'1.14.13.39'},\n", + " 'rxn00401': {'1.13.12.1'},\n", + " 'rxn00402': {'1.5.1.11'},\n", + " 'rxn00403': {'1.5.1.19'},\n", + " 'rxn00404': {'2.1.4.1'},\n", + " 'rxn00405': {'4.1.1.19'},\n", + " 'rxn00406': {'5.1.1.9'},\n", + " 'rxn00407': {'3.5.4.13'},\n", + " 'rxn00408': {'3.6.1.15', '3.6.1.5'},\n", + " 'rxn00409': {'2.7.4.6'},\n", + " 'rxn00410': {'6.3.4.2'},\n", + " 'rxn00411': {'2.7.1.40'},\n", + " 'rxn00412': {'6.3.4.2'},\n", + " 'rxn00413': {'4.6.1.6'},\n", + " 'rxn00414': {'6.3.5.5'},\n", + " 'rxn00415': {'2.6.1.15'},\n", + " 'rxn00416': {'6.3.5.4'},\n", + " 'rxn00417': {'5.1.1.10'},\n", + " 'rxn00418': {'2.7.7.-'},\n", + " 'rxn00419': {'1.4.1.7'},\n", + " 'rxn00420': {'3.1.3.3'},\n", + " 'rxn00421': {'2.7.1.80'},\n", + " 'rxn00422': {'2.6.1.51'},\n", + " 'rxn00423': {'2.3.1.30'},\n", + " 'rxn00424': {'2.6.1.45'},\n", + " 'rxn00425': {'5.1.1.10', '5.1.1.18'},\n", + " 'rxn00426': {'4.3.1.17'},\n", + " 'rxn00427': {'1.11.1.21', '1.11.1.6', '1.11.1.7'},\n", + " 'rxn00428': {'4.5.1.3'},\n", + " 'rxn00429': {'1.2.1.46'},\n", + " 'rxn00430': {'1.1.1.244'},\n", + " 'rxn00431': {'1.4.99.3'},\n", + " 'rxn00432': {'1.1.3.13'},\n", + " 'rxn00433': {'1.5.3.1'},\n", + " 'rxn00434': {'1.5.3.4'},\n", + " 'rxn00435': {'1.2.98.1', '1.2.99.4'},\n", + " 'rxn00436': {'3.6.1.15'},\n", + " 'rxn00437': {'2.7.4.15', '2.7.6.2'},\n", + " 'rxn00438': {'2.7.4.16'},\n", + " 'rxn00439': {'3.6.1.28'},\n", + " 'rxn00440': {'2.7.6.2'},\n", + " 'rxn00441': {'1.2.4.2'},\n", + " 'rxn00442': {'4.1.1.71'},\n", + " 'rxn00443': {'1.3.2.3'},\n", + " 'rxn00444': {'1.11.1.11'},\n", + " 'rxn00445': {'1.3.3.12'},\n", + " 'rxn00447': {'1.14.-.-'},\n", + " 'rxn00448': {'1.13.11.13'},\n", + " 'rxn00449': {'1.1.3.8'},\n", + " 'rxn00450': {'1.4.3.2'},\n", + " 'rxn00451': {'2.1.1.12'},\n", + " 'rxn00452': {'2.1.1.10'},\n", + " 'rxn00453': {'2.5.1.49', '4.2.99.10'},\n", + " 'rxn00454': {'2.6.1.73'},\n", + " 'rxn00455': {'3.5.1.31'},\n", + " 'rxn00456': {'4.4.1.11'},\n", + " 'rxn00457': {'5.1.1.2'},\n", + " 'rxn00458': {'4.1.1.57'},\n", + " 'rxn00459': {'4.2.1.11'},\n", + " 'rxn00460': {'2.7.1.40'},\n", + " 'rxn00461': {'2.5.1.7'},\n", + " 'rxn00462': {'5.4.2.9'},\n", + " 'rxn00463': {'3.6.1.19', '3.6.1.8'},\n", + " 'rxn00464': {'2.3.1.127'},\n", + " 'rxn00465': {'3.5.1.20'},\n", + " 'rxn00466': {'1.5.1.24'},\n", + " 'rxn00467': {'2.6.1.13'},\n", + " 'rxn00468': {'2.6.1.13', '2.6.1.68'},\n", + " 'rxn00469': {'3.5.1.14', '3.5.1.16'},\n", + " 'rxn00470': {'4.1.1.17'},\n", + " 'rxn00471': {'4.3.1.12'},\n", + " 'rxn00472': {'5.1.1.10', '5.1.1.12', '5.1.1.9'},\n", + " 'rxn00473': {'4.1.99.1'},\n", + " 'rxn00474': {'4.2.1.122', '4.2.1.20'},\n", + " 'rxn00475': {'1.4.1.19'},\n", + " 'rxn00476': {'1.4.1.19'},\n", + " 'rxn00477': {'1.4.3.2'},\n", + " 'rxn00478': {'1.13.11.11', '1.13.11.52'},\n", + " 'rxn00479': {'1.13.12.3'},\n", + " 'rxn00480': {'1.13.99.3'},\n", + " 'rxn00481': {'3.5.1.57'},\n", + " 'rxn00483': {'2.6.1.27'},\n", + " 'rxn00484': {'4.1.1.105', '4.1.1.28'},\n", + " 'rxn00485': {'5.1.1.11'},\n", + " 'rxn00486': {'2.7.7.54'},\n", + " 'rxn00487': {'1.4.1.20'},\n", + " 'rxn00488': {'1.4.3.2'},\n", + " 'rxn00489': {'1.11.1.21', '1.11.1.7', '1.13.12.9'},\n", + " 'rxn00490': {'4.2.1.51', '4.2.1.91'},\n", + " 'rxn00491': {'2.6.1.58'},\n", + " 'rxn00492': {'2.3.1.53'},\n", + " 'rxn00493': {'2.6.1.1', '2.6.1.5', '2.6.1.57', '2.6.1.58', '2.6.1.9'},\n", + " 'rxn00494': {'2.6.1.70'},\n", + " 'rxn00495': {'4.3.1.24', '4.3.1.25', '4.3.1.5'},\n", + " 'rxn00496': {'1.11.1.7'},\n", + " 'rxn00497': {'4.1.1.28', '4.1.1.53'},\n", + " 'rxn00498': {'2.5.1.-', '2.5.1.103', '2.5.1.21', '2.5.1.96'},\n", + " 'rxn00499': {'1.1.1.27'},\n", + " 'rxn00500': {'1.1.1.28'},\n", + " 'rxn00501': {'1.2.1.18', '1.2.1.27'},\n", + " 'rxn00502': {'1.2.1.18'},\n", + " 'rxn00503': {'1.5.1.12'},\n", + " 'rxn00504': {'1.5.1.12'},\n", + " 'rxn00505': {'1.1.1.286', '1.1.1.41'},\n", + " 'rxn00506': {'1.2.1.3', '1.2.1.5'},\n", + " 'rxn00507': {'1.2.1.3', '1.2.1.4', '1.2.1.5'},\n", + " 'rxn00508': {'1.2.1.16', '1.2.1.24'},\n", + " 'rxn00509': {'1.2.1.16', '1.2.1.79'},\n", + " 'rxn00510': {'1.5.1.7'},\n", + " 'rxn00511': {'1.5.1.8'},\n", + " 'rxn00512': {'1.1.1.26', '1.1.1.29', '1.1.99.14'},\n", + " 'rxn00513': {'3.6.1.-', '3.6.1.15', '3.6.1.5'},\n", + " 'rxn00514': {'3.6.1.-', '3.6.1.19', '3.6.1.8'},\n", + " 'rxn00515': {'2.7.4.6'},\n", + " 'rxn00516': {'3.6.1.14'},\n", + " 'rxn00517': {'2.7.1.40'},\n", + " 'rxn00518': {'2.7.1.1'},\n", + " 'rxn00519': {'4.1.1.32'},\n", + " 'rxn00520': {'6.2.1.4'},\n", + " 'rxn00521': {'4.1.99.2'},\n", + " 'rxn00522': {'1.4.3.2'},\n", + " 'rxn00523': {'1.14.13.41'},\n", + " 'rxn00524': {'1.14.18.1'},\n", + " 'rxn00525': {'1.3.1.43', '1.3.1.79'},\n", + " 'rxn00526': {'1.3.1.78', '1.3.1.79'},\n", + " 'rxn00527': {'2.6.1.1', '2.6.1.5', '2.6.1.57', '2.6.1.9'},\n", + " 'rxn00528': {'6.3.2.24'},\n", + " 'rxn00529': {'4.1.1.25', '4.1.1.28'},\n", + " 'rxn00530': {'4.3.1.23', '4.3.1.25'},\n", + " 'rxn00531': {'5.4.3.6'},\n", + " 'rxn00532': {'1.2.1.-', '1.2.1.18', '1.2.1.75'},\n", + " 'rxn00533': {'6.4.1.2'},\n", + " 'rxn00534': {'2.8.3.3'},\n", + " 'rxn00536': {'1.1.1.2', '1.1.1.71'},\n", + " 'rxn00537': {'3.11.1.1'},\n", + " 'rxn00538': {'4.2.3.2'},\n", + " 'rxn00539': {'4.3.1.7'},\n", + " 'rxn00540': {'4.1.3.39'},\n", + " 'rxn00541': {'4.1.2.5'},\n", + " 'rxn00542': {'4.1.2.36'},\n", + " 'rxn00543': {'1.1.1.1', '1.1.1.71'},\n", + " 'rxn00544': {'4.1.1.1'},\n", + " 'rxn00545': {'2.7.1.11'},\n", + " 'rxn00546': {'1.1.1.17'},\n", + " 'rxn00547': {'2.7.1.1', '2.7.1.4'},\n", + " 'rxn00548': {'4.1.2.22'},\n", + " 'rxn00549': {'3.1.3.11'},\n", + " 'rxn00550': {'3.1.3.46'},\n", + " 'rxn00551': {'2.7.1.90'},\n", + " 'rxn00552': {'3.5.99.6'},\n", + " 'rxn00553': {'2.4.1.14'},\n", + " 'rxn00554': {'2.7.1.11'},\n", + " 'rxn00555': {'2.6.1.16'},\n", + " 'rxn00556': {'2.7.1.11'},\n", + " 'rxn00557': {'2.7.1.11'},\n", + " 'rxn00558': {'5.3.1.9'},\n", + " 'rxn00559': {'5.3.1.8'},\n", + " 'rxn00560': {'6.3.4.6'},\n", + " 'rxn00561': {'3.5.3.2'},\n", + " 'rxn00562': {'4.3.2.3'},\n", + " 'rxn00563': {'3.5.3.14'},\n", + " 'rxn00564': {'4.2.1.69'},\n", + " 'rxn00565': {'1.13.11.18'},\n", + " 'rxn00566': {'4.1.99.1', '4.4.1.1', '4.4.1.28', '4.4.1.8'},\n", + " 'rxn00567': {'1.7.2.1'},\n", + " 'rxn00568': {'1.6.6.-', '1.7.1.15', '1.7.1.4'},\n", + " 'rxn00569': {'1.7.1.4'},\n", + " 'rxn00570': {'1.7.3.4', '1.7.3.6'},\n", + " 'rxn00571': {'1.6.6.1', '1.7.1.1', '1.7.1.2'},\n", + " 'rxn00572': {'1.7.1.2', '1.7.1.3'},\n", + " 'rxn00573': {'1.7.3.1'},\n", + " 'rxn00575': {'3.2.1.10', '3.2.1.20', '3.2.1.48'},\n", + " 'rxn00577': {'2.4.1.7'},\n", + " 'rxn00578': {'3.1.3.24'},\n", + " 'rxn00579': {'2.4.1.13'},\n", + " 'rxn00580': {'1.1.99.13'},\n", + " 'rxn00581': {'2.4.1.167'},\n", + " 'rxn00582': {'5.4.99.11'},\n", + " 'rxn00583': {'1.3.1.19'},\n", + " 'rxn00584': {'1.3.1.25'},\n", + " 'rxn00585': {'1.3.1.20'},\n", + " 'rxn00586': {'1.14.13.7'},\n", + " 'rxn00587': {'1.13.11.2'},\n", + " 'rxn00588': {'1.13.11.1'},\n", + " 'rxn00589': {'1.14.13.1'},\n", + " 'rxn00590': {'1.14.12.10'},\n", + " 'rxn00591': {'1.3.1.25'},\n", + " 'rxn00592': {'4.1.1.46'},\n", + " 'rxn00593': {'4.1.1.63'},\n", + " 'rxn00594': {'1.14.12.1'},\n", + " 'rxn00595': {'1.14.12.1'},\n", + " 'rxn00596': {'2.1.1.6'},\n", + " 'rxn00597': {'1.14.13.31'},\n", + " 'rxn00598': {'2.3.1.-', '2.3.1.16', '2.3.1.174'},\n", + " 'rxn00599': {'2.3.1.37'},\n", + " 'rxn00600': {'2.3.1.37'},\n", + " 'rxn00601': {'2.3.1.109'},\n", + " 'rxn00602': {'5.4.99.2'},\n", + " 'rxn00603': {'1.1.1.200'},\n", + " 'rxn00604': {'1.1.1.363', '1.1.1.49'},\n", + " 'rxn00605': {'2.4.1.15'},\n", + " 'rxn00606': {'3.2.1.122', '3.2.1.93'},\n", + " 'rxn00607': {'3.2.1.122'},\n", + " 'rxn00608': {'3.2.1.86'},\n", + " 'rxn00610': {'3.1.3.21'},\n", + " 'rxn00611': {'1.1.1.8', '1.1.1.94'},\n", + " 'rxn00612': {'1.1.1.94'},\n", + " 'rxn00613': {'1.1.1.177'},\n", + " 'rxn00614': {'1.1.3.21'},\n", + " 'rxn00615': {'2.7.1.30'},\n", + " 'rxn00616': {'1.1.5.3', '1.1.99.5'},\n", + " 'rxn00617': {'2.7.1.142'},\n", + " 'rxn00618': {'2.4.1.137'},\n", + " 'rxn00619': {'2.4.1.96'},\n", + " 'rxn00620': {'3.6.1.16'},\n", + " 'rxn00621': {'2.7.7.39'},\n", + " 'rxn00622': {'3.1.4.46'},\n", + " 'rxn00623': {'1.8.1.2', '1.8.2.2'},\n", + " 'rxn00624': {'4.1.1.12'},\n", + " 'rxn00626': {'1.1.2.2'},\n", + " 'rxn00627': {'2.7.1.3'},\n", + " 'rxn00629': {'1.1.1.11', '1.1.1.67'},\n", + " 'rxn00630': {'1.1.1.138'},\n", + " 'rxn00631': {'1.1.1.124'},\n", + " 'rxn00632': {'3.1.3.-'},\n", + " 'rxn00633': {'1.1.99.28'},\n", + " 'rxn00634': {'1.1.1.14', '1.1.1.15'},\n", + " 'rxn00635': {'2.7.1.1'},\n", + " 'rxn00636': {'5.3.1.7'},\n", + " 'rxn00638': {'1.1.1.132'},\n", + " 'rxn00639': {'3.6.1.-', '3.6.1.21'},\n", + " 'rxn00640': {'2.7.7.22'},\n", + " 'rxn00641': {'2.7.7.13'},\n", + " 'rxn00642': {'4.2.1.47'},\n", + " 'rxn00643': {'5.1.3.18'},\n", + " 'rxn00644': {'1.8.1.6'},\n", + " 'rxn00645': {'1.13.11.20'},\n", + " 'rxn00646': {'6.3.2.2'},\n", + " 'rxn00647': {'2.6.1.1', '2.6.1.3'},\n", + " 'rxn00649': {'2.5.1.47', '2.5.1.65'},\n", + " 'rxn00650': {'3.4.11.1', '3.4.11.2', '3.4.11.23', '3.4.13.-', '3.4.13.18'},\n", + " 'rxn00651': {'4.4.1.10'},\n", + " 'rxn00652': {'5.1.1.10'},\n", + " 'rxn00653': {'1.2.1.-', '1.2.1.19', '1.2.1.3', '1.2.1.5'},\n", + " 'rxn00654': {'3.5.1.6'},\n", + " 'rxn00655': {'1.5.1.26'},\n", + " 'rxn00656': {'2.6.1.18'},\n", + " 'rxn00657': {'2.6.1.19', '2.6.1.55'},\n", + " 'rxn00658': {'3.5.1.21'},\n", + " 'rxn00659': {'6.3.2.11'},\n", + " 'rxn00660': {'3.4.13.4'},\n", + " 'rxn00661': {'6.3.2.11'},\n", + " 'rxn00662': {'3.5.3.17'},\n", + " 'rxn00667': {'2.3.1.94'},\n", + " 'rxn00668': {'1.3.1.-', '1.3.1.84'},\n", + " 'rxn00669': {'6.2.1.13'},\n", + " 'rxn00670': {'2.3.1.-', '2.3.1.222', '2.3.1.8'},\n", + " 'rxn00671': {'1.2.1.27'},\n", + " 'rxn00672': {'4.1.1.41', '4.1.1.94', '7.2.4.3'},\n", + " 'rxn00673': {'1.3.99.3'},\n", + " 'rxn00674': {'6.2.1.1', '6.2.1.17'},\n", + " 'rxn00675': {'6.2.1.1', '6.2.1.17'},\n", + " 'rxn00676': {'2.3.1.16', '2.3.1.9'},\n", + " 'rxn00677': {'2.8.3.1'},\n", + " 'rxn00678': {'2.1.3.1'},\n", + " 'rxn00679': {'2.3.3.5', '4.1.3.31'},\n", + " 'rxn00680': {'2.3.3.11'},\n", + " 'rxn00682': {'4.1.3.24'},\n", + " 'rxn00684': {'1.5.1.3'},\n", + " 'rxn00685': {'1.5.1.3'},\n", + " 'rxn00686': {'1.5.1.3'},\n", + " 'rxn00687': {'1.5.1.3'},\n", + " 'rxn00688': {'1.5.1.6'},\n", + " 'rxn00689': {'6.3.2.17'},\n", + " 'rxn00690': {'6.3.4.3'},\n", + " 'rxn00691': {'3.5.1.10'},\n", + " 'rxn00692': {'2.1.2.1'},\n", + " 'rxn00693': {'2.1.1.13'},\n", + " 'rxn00695': {'2.7.7.27'},\n", + " 'rxn00696': {'2.7.1.10'},\n", + " 'rxn00697': {'3.6.1.21'},\n", + " 'rxn00698': {'2.4.1.20'},\n", + " 'rxn00699': {'2.4.1.31'},\n", + " 'rxn00700': {'2.7.7.34'},\n", + " 'rxn00701': {'2.7.7.12'},\n", + " 'rxn00702': {'2.7.7.33'},\n", + " 'rxn00703': {'2.4.1.139'},\n", + " 'rxn00704': {'5.4.2.2', '5.4.2.5'},\n", + " 'rxn00705': {'2.7.1.41'},\n", + " 'rxn00706': {'3.6.1.5', '3.6.1.6', '3.6.1.64'},\n", + " 'rxn00707': {'2.7.1.48'},\n", + " 'rxn00708': {'3.1.3.5'},\n", + " 'rxn00709': {'2.7.1.48'},\n", + " 'rxn00710': {'4.1.1.23'},\n", + " 'rxn00711': {'2.4.2.9'},\n", + " 'rxn00712': {'2.7.1.48'},\n", + " 'rxn00713': {'2.7.1.48'},\n", + " 'rxn00714': {'3.6.1.17'},\n", + " 'rxn00715': {'2.7.1.48'},\n", + " 'rxn00716': {'4.1.1.66'},\n", + " 'rxn00717': {'3.5.4.1'},\n", + " 'rxn00718': {'1.3.3.7'},\n", + " 'rxn00719': {'1.3.1.1'},\n", + " 'rxn00720': {'1.3.1.2'},\n", + " 'rxn00721': {'2.7.7.55'},\n", + " 'rxn00722': {'1.14.13.35'},\n", + " 'rxn00723': {'6.2.1.32'},\n", + " 'rxn00724': {'1.13.11.23'},\n", + " 'rxn00725': {'2.1.1.111'},\n", + " 'rxn00726': {'4.1.3.27'},\n", + " 'rxn00727': {'4.1.3.27'},\n", + " 'rxn00728': {'3.7.1.3'},\n", + " 'rxn00729': {'3.5.1.9'},\n", + " 'rxn00730': {'2.3.1.113'},\n", + " 'rxn00731': {'4.1.1.24'},\n", + " 'rxn00735': {'1.1.1.85'},\n", + " 'rxn00736': {'4.1.1.3'},\n", + " 'rxn00737': {'4.3.1.19'},\n", + " 'rxn00738': {'3.5.99.7', '4.1.99.4-'},\n", + " 'rxn00739': {'2.3.3.6'},\n", + " 'rxn00740': {'2.5.1.48', '4.3.1.-'},\n", + " 'rxn00741': {'1.1.1.27'},\n", + " 'rxn00742': {'4.4.1.1'},\n", + " 'rxn00743': {'3.1.3.1', '3.1.3.2'},\n", + " 'rxn00744': {'2.7.1.29'},\n", + " 'rxn00745': {'2.7.1.121'},\n", + " 'rxn00746': {'4.1.2.2'},\n", + " 'rxn00747': {'5.3.1.1'},\n", + " 'rxn00748': {'4.2.3.3'},\n", + " 'rxn00749': {'1.2.99.3'},\n", + " 'rxn00751': {'2.7.1.32'},\n", + " 'rxn00752': {'1.1.3.17'},\n", + " 'rxn00753': {'2.3.1.6'},\n", + " 'rxn00754': {'3.1.1.7', '3.1.1.8'},\n", + " 'rxn00755': {'2.8.2.6'},\n", + " 'rxn00756': {'3.1.6.6'},\n", + " 'rxn00757': {'3.1.1.8'},\n", + " 'rxn00758': {'3.1.4.2', '3.1.4.46'},\n", + " 'rxn00759': {'4.5.1.2'},\n", + " 'rxn00761': {'1.14.12.13'},\n", + " 'rxn00762': {'1.1.1.6'},\n", + " 'rxn00763': {'1.1.1.-', '1.1.1.1', '1.1.1.21', '1.1.1.72'},\n", + " 'rxn00764': {'1.1.1.156'},\n", + " 'rxn00765': {'1.1.1.2', '1.1.1.21', '1.1.1.372', '1.1.1.72'},\n", + " 'rxn00766': {'3.1.3.19'},\n", + " 'rxn00767': {'2.7.1.79'},\n", + " 'rxn00768': {'4.2.1.30'},\n", + " 'rxn00769': {'4.2.1.30'},\n", + " 'rxn00770': {'2.7.6.1'},\n", + " 'rxn00771': {'2.7.1.18'},\n", + " 'rxn00772': {'2.7.1.15'},\n", + " 'rxn00773': {'2.7.7.35'},\n", + " 'rxn00774': {'6.3.4.7'},\n", + " 'rxn00775': {'3.6.1.-', '3.6.1.13', '3.6.1.21', '3.6.1.53'},\n", + " 'rxn00776': {'3.2.-.-', '4.2.1.70'},\n", + " 'rxn00777': {'5.3.1.6'},\n", + " 'rxn00778': {'5.4.2.2', '5.4.2.7'},\n", + " 'rxn00779': {'1.2.1.9'},\n", + " 'rxn00780': {'2.7.1.28'},\n", + " 'rxn00781': {'1.2.1.12', '1.2.1.59'},\n", + " 'rxn00782': {'1.2.1.13', '1.2.1.59'},\n", + " 'rxn00783': {'4.1.2.21', '4.1.2.55'},\n", + " 'rxn00784': {'4.1.2.4'},\n", + " 'rxn00785': {'2.2.1.1'},\n", + " 'rxn00786': {'4.1.2.13'},\n", + " 'rxn00787': {'4.1.2.40'},\n", + " 'rxn00789': {'2.4.2.17'},\n", + " 'rxn00790': {'2.4.2.14'},\n", + " 'rxn00791': {'2.4.2.18'},\n", + " 'rxn00792': {'6.2.1.11', '6.3.4.10', '6.3.4.11', '6.3.4.15', '6.3.4.9'},\n", + " 'rxn00793': {'6.2.1.11'},\n", + " 'rxn00794': {'3.5.1.12'},\n", + " 'rxn00795': {'3.5.1.12'},\n", + " 'rxn00797': {'3.2.2.3', '3.2.2.8'},\n", + " 'rxn00798': {'5.3.1.20'},\n", + " 'rxn00799': {'4.2.1.2'},\n", + " 'rxn00800': {'4.3.2.2'},\n", + " 'rxn00801': {'3.7.1.-', '3.7.1.20', '3.7.1.5'},\n", + " 'rxn00802': {'4.3.2.1'},\n", + " 'rxn00803': {'5.2.1.1'},\n", + " 'rxn00804': {'1.4.1.9'},\n", + " 'rxn00805': {'2.3.1.66'},\n", + " 'rxn00806': {'2.6.1.42', '2.6.1.6', '2.6.1.67'},\n", + " 'rxn00807': {'5.4.3.7'},\n", + " 'rxn00808': {'2.7.1.6'},\n", + " 'rxn00809': {'1.1.1.21'},\n", + " 'rxn00810': {'1.1.1.48'},\n", + " 'rxn00811': {'1.1.1.21'},\n", + " 'rxn00812': {'1.1.1.120', '1.1.1.359', '1.1.1.360', '1.1.1.48'},\n", + " 'rxn00813': {'1.1.1.120', '1.1.1.48'},\n", + " 'rxn00814': {'1.1.3.9'},\n", + " 'rxn00815': {'1.1.3.9'},\n", + " 'rxn00816': {'3.2.1.108', '3.2.1.23'},\n", + " 'rxn00817': {'3.2.1.22'},\n", + " 'rxn00818': {'3.2.1.22'},\n", + " 'rxn00819': {'3.2.1.22'},\n", + " 'rxn00820': {'1.7.99.4'},\n", + " 'rxn00821': {'1.8.5.1'},\n", + " 'rxn00822': {'1.8.4.4'},\n", + " 'rxn00824': {'1.8.4.3'},\n", + " 'rxn00826': {'1.8.4.4'},\n", + " 'rxn00827': {'2.7.7.43'},\n", + " 'rxn00829': {'4.1.1.33'},\n", + " 'rxn00830': {'5.3.3.2'},\n", + " 'rxn00831': {'3.1.3.5', '3.1.3.99'},\n", + " 'rxn00832': {'2.1.2.3', '3.5.4.10'},\n", + " 'rxn00833': {'3.2.2.12'},\n", + " 'rxn00834': {'1.1.1.205'},\n", + " 'rxn00835': {'2.7.1.73'},\n", + " 'rxn00836': {'2.4.2.8'},\n", + " 'rxn00837': {'1.6.6.8', '1.7.1.7'},\n", + " 'rxn00838': {'6.3.4.4'},\n", + " 'rxn00839': {'2.7.4.6'},\n", + " 'rxn00840': {'2.7.1.40'},\n", + " 'rxn00841': {'2.7.1.1'},\n", + " 'rxn00842': {'2.7.1.1'},\n", + " 'rxn00843': {'1.14.13.25'},\n", + " 'rxn00844': {'1.14.13.25'},\n", + " 'rxn00845': {'3.1.1.44'},\n", + " 'rxn00846': {'3.1.6.16'},\n", + " 'rxn00847': {'1.1.99.8'},\n", + " 'rxn00848': {'2.6.1.54'},\n", + " 'rxn00849': {'2.6.1.21'},\n", + " 'rxn00850': {'2.3.2.14'},\n", + " 'rxn00851': {'6.3.2.4'},\n", + " 'rxn00852': {'1.4.3.10', '1.4.3.22'},\n", + " 'rxn00853': {'3.5.1.53'},\n", + " 'rxn00854': {'2.1.1.53'},\n", + " 'rxn00855': {'2.3.1.57'},\n", + " 'rxn00856': {'2.6.1.29', '2.6.1.82'},\n", + " 'rxn00857': {'3.5.1.62'},\n", + " 'rxn00858': {'3.5.3.11'},\n", + " 'rxn00859': {'1.1.1.23'},\n", + " 'rxn00860': {'2.1.1.-'},\n", + " 'rxn00861': {'2.3.1.33'},\n", + " 'rxn00862': {'2.6.1.38'},\n", + " 'rxn00863': {'1.1.1.23'},\n", + " 'rxn00864': {'6.3.2.11'},\n", + " 'rxn00865': {'3.4.13.18', '3.4.13.20'},\n", + " 'rxn00866': {'4.1.1.22', '4.1.1.28'},\n", + " 'rxn00867': {'4.3.1.3'},\n", + " 'rxn00868': {'1.3.1.44', '1.3.8.1'},\n", + " 'rxn00869': {'1.2.1.10', '1.2.1.57', '1.2.1.87'},\n", + " 'rxn00870': {'1.2.1.57'},\n", + " 'rxn00871': {'2.3.1.19'},\n", + " 'rxn00872': {'1.3.3.6', '1.3.8.1', '1.3.99.-', '1.3.99.2', '1.3.99.3'},\n", + " 'rxn00873': {'6.2.1.2', '6.2.1.3'},\n", + " 'rxn00874': {'2.3.1.16', '2.3.1.9'},\n", + " 'rxn00875': {'2.8.3.8'},\n", + " 'rxn00876': {'2.3.3.7'},\n", + " 'rxn00877': {'5.4.99.13'},\n", + " 'rxn00878': {'2.7.1.64'},\n", + " 'rxn00879': {'1.1.1.18'},\n", + " 'rxn00880': {'1.13.99.1'},\n", + " 'rxn00881': {'3.1.3.25'},\n", + " 'rxn00882': {'3.1.3.25'},\n", + " 'rxn00883': {'3.1.3.25'},\n", + " 'rxn00884': {'2.1.1.40'},\n", + " 'rxn00885': {'2.1.1.39'},\n", + " 'rxn00886': {'2.1.1.129'},\n", + " 'rxn00887': {'2.1.1.129'},\n", + " 'rxn00888': {'2.4.1.123'},\n", + " 'rxn00889': {'3.1.4.44', '3.1.4.46'},\n", + " 'rxn00890': {'3.2.1.22'},\n", + " 'rxn00891': {'3.5.1.33'},\n", + " 'rxn00892': {'2.7.1.59'},\n", + " 'rxn00893': {'1.1.1.240'},\n", + " 'rxn00894': {'1.1.3.29'},\n", + " 'rxn00895': {'2.3.1.3'},\n", + " 'rxn00896': {'2.4.1.90'},\n", + " 'rxn00897': {'2.7.1.59', '5.1.3.8'},\n", + " 'rxn00898': {'4.2.1.9'},\n", + " 'rxn00899': {'1.2.1.25'},\n", + " 'rxn00900': {'1.1.1.84'},\n", + " 'rxn00901': {'1.4.1.8'},\n", + " 'rxn00902': {'2.3.3.13', '4.1.3.12'},\n", + " 'rxn00903': {'2.6.1.42', '2.6.1.6'},\n", + " 'rxn00904': {'2.6.1.66'},\n", + " 'rxn00905': {'2.1.2.11', '4.1.2.12'},\n", + " 'rxn00906': {'1.5.1.15'},\n", + " 'rxn00907': {'1.5.1.5'},\n", + " 'rxn00908': {'1.4.4.2', '1.8.1.4', '2.1.2.10'},\n", + " 'rxn00909': {'1.5.1.20', '1.7.99.5'},\n", + " 'rxn00910': {'1.5.1.20'},\n", + " 'rxn00911': {'2.1.2.7'},\n", + " 'rxn00912': {'2.1.2.11'},\n", + " 'rxn00913': {'3.1.3.5'},\n", + " 'rxn00914': {'2.7.1.73'},\n", + " 'rxn00915': {'2.4.2.22', '2.4.2.7', '2.4.2.8'},\n", + " 'rxn00916': {'6.3.4.1', '6.3.5.2'},\n", + " 'rxn00917': {'6.3.5.2'},\n", + " 'rxn00918': {'3.6.1.17'},\n", + " 'rxn00919': {'3.6.1.21'},\n", + " 'rxn00920': {'3.1.4.17', '3.1.4.35'},\n", + " 'rxn00921': {'4.1.1.61'},\n", + " 'rxn00922': {'2.1.1.25'},\n", + " 'rxn00923': {'2.4.1.35'},\n", + " 'rxn00924': {'3.1.1.2'},\n", + " 'rxn00925': {'3.1.6.1'},\n", + " 'rxn00926': {'3.5.4.2'},\n", + " 'rxn00927': {'3.2.2.1', '3.2.2.7', '3.2.2.8'},\n", + " 'rxn00928': {'1.5.1.1'},\n", + " 'rxn00929': {'1.5.1.2'},\n", + " 'rxn00930': {'1.5.1.1'},\n", + " 'rxn00931': {'1.5.1.2'},\n", + " 'rxn00932': {'1.14.11.2', '1.14.11.57'},\n", + " 'rxn00933': {'5.1.1.4'},\n", + " 'rxn00934': {'6.2.1.9'},\n", + " 'rxn00935': {'1.1.5.4'},\n", + " 'rxn00936': {'3.2.2.11'},\n", + " 'rxn00937': {'4.2.1.65'},\n", + " 'rxn00938': {'3.5.1.19', '3.5.1.4'},\n", + " 'rxn00939': {'2.1.1.1'},\n", + " 'rxn00940': {'3.2.2.14', '3.2.2.6'},\n", + " 'rxn00941': {'2.4.2.12'},\n", + " 'rxn00942': {'3.2.2.1'},\n", + " 'rxn00943': {'3.1.2.2', '3.1.2.22'},\n", + " 'rxn00944': {'1.2.1.42'},\n", + " 'rxn00945': {'1.3.1.38', '1.3.1.8'},\n", + " 'rxn00946': {'1.3.3.6', '1.3.8.9', '1.3.99.-', '1.3.99.13', '1.3.99.3'},\n", + " 'rxn00947': {'6.2.1.3'},\n", + " 'rxn00948': {'2.3.1.50'},\n", + " 'rxn00949': {'4.4.1.2'},\n", + " 'rxn00950': {'4.4.1.8'},\n", + " 'rxn00952': {'2.5.1.49', '4.2.99.10'},\n", + " 'rxn00953': {'4.2.1.22'},\n", + " 'rxn00955': {'4.4.1.21'},\n", + " 'rxn00956': {'1.8.4.1'},\n", + " 'rxn00957': {'1.2.1.28', '1.2.1.64'},\n", + " 'rxn00958': {'1.2.1.7'},\n", + " 'rxn00959': {'1.14.13.12'},\n", + " 'rxn00960': {'1.14.13.33'},\n", + " 'rxn00961': {'1.14.13.64'},\n", + " 'rxn00962': {'1.14.13.2', '1.14.13.33'},\n", + " 'rxn00963': {'1.14.13.64'},\n", + " 'rxn00964': {'6.2.1.27'},\n", + " 'rxn00965': {'3.1.2.23'},\n", + " 'rxn00966': {'4.1.3.40'},\n", + " 'rxn00967': {'2.4.1.194'},\n", + " 'rxn00968': {'1.13.11.41'},\n", + " 'rxn00969': {'3.8.1.6'},\n", + " 'rxn00971': {'6.2.1.18'},\n", + " 'rxn00972': {'2.8.3.10'},\n", + " 'rxn00973': {'4.2.1.3'},\n", + " 'rxn00974': {'4.2.1.3', '4.2.1.4'},\n", + " 'rxn00975': {'2.7.1.1', '2.7.1.7'},\n", + " 'rxn00976': {'2.7.1.1'},\n", + " 'rxn00977': {'3.2.1.22'},\n", + " 'rxn00978': {'2.7.1.1'},\n", + " 'rxn00979': {'1.2.1.21'},\n", + " 'rxn00980': {'3.1.3.18'},\n", + " 'rxn00981': {'4.2.99.12'},\n", + " 'rxn00982': {'2.1.1.15'},\n", + " 'rxn00983': {'3.1.1.23', '3.1.1.79'},\n", + " 'rxn00984': {'3.1.1.23'},\n", + " 'rxn00985': {'2.7.2.1', '2.7.2.15'},\n", + " 'rxn00986': {'6.2.1.1', '6.2.1.17'},\n", + " 'rxn00987': {'4.1.3.32'},\n", + " 'rxn00988': {'6.2.1.16'},\n", + " 'rxn00989': {'3.1.2.11'},\n", + " 'rxn00990': {'2.8.3.-', '2.8.3.8'},\n", + " 'rxn00991': {'4.1.3.4'},\n", + " 'rxn00992': {'1.1.1.30'},\n", + " 'rxn00993': {'3.7.1.2'},\n", + " 'rxn00994': {'2.8.3.9'},\n", + " 'rxn00995': {'4.1.1.4'},\n", + " 'rxn00996': {'4.2.1.27'},\n", + " 'rxn00997': {'1.1.1.222', '1.1.1.237'},\n", + " 'rxn00998': {'1.1.1.222', '1.1.1.237'},\n", + " 'rxn00999': {'1.13.11.27'},\n", + " 'rxn01000': {'4.2.1.51', '4.2.1.91'},\n", + " 'rxn01001': {'2.6.1.64'},\n", + " 'rxn01002': {'2.6.1.28'},\n", + " 'rxn01003': {'4.1.1.-', '4.1.1.43', '4.1.4.3'},\n", + " 'rxn01004': {'5.3.2.1'},\n", + " 'rxn01005': {'2.7.7.44'},\n", + " 'rxn01007': {'4.1.1.35'},\n", + " 'rxn01008': {'5.1.3.6'},\n", + " 'rxn01009': {'4.1.1.-'},\n", + " 'rxn01010': {'5.1.3.12'},\n", + " 'rxn01011': {'1.1.1.26', '1.1.1.29', '1.1.1.81'},\n", + " 'rxn01013': {'1.1.1.79', '1.1.1.81'},\n", + " 'rxn01014': {'4.1.1.40'},\n", + " 'rxn01015': {'5.3.1.22'},\n", + " 'rxn01016': {'2.7.2.2'},\n", + " 'rxn01017': {'2.1.3.8'},\n", + " 'rxn01018': {'2.1.3.2'},\n", + " 'rxn01019': {'2.1.3.3'},\n", + " 'rxn01020': {'2.1.3.6'},\n", + " 'rxn01021': {'3.2.2.16', '3.2.2.9'},\n", + " 'rxn01022': {'2.4.2.28'},\n", + " 'rxn01023': {'2.7.1.59', '4.2.1.66', '5.1.3.8'},\n", + " 'rxn01024': {'2.7.1.59', '4.2.1.66', '5.1.3.8'},\n", + " 'rxn01025': {'3.5.4.1'},\n", + " 'rxn01026': {'1.14.11.6'},\n", + " 'rxn01027': {'1.3.1.1'},\n", + " 'rxn01028': {'1.3.1.2'},\n", + " 'rxn01029': {'3.5.3.12'},\n", + " 'rxn01030': {'2.7.3.10'},\n", + " 'rxn01031': {'3.5.3.20'},\n", + " 'rxn01032': {'1.2.1.28', '1.2.1.29'},\n", + " 'rxn01033': {'1.2.1.7'},\n", + " 'rxn01034': {'3.6.1.7'},\n", + " 'rxn01035': {'6.2.1.25'},\n", + " 'rxn01036': {'3.6.1.20'},\n", + " 'rxn01037': {'3.5.1.32'},\n", + " 'rxn01038': {'3.5.1.40'},\n", + " 'rxn01041': {'1.1.1.121', '1.1.1.175'},\n", + " 'rxn01042': {'1.1.1.179'},\n", + " 'rxn01043': {'1.1.1.21', '1.1.1.307'},\n", + " 'rxn01044': {'5.3.1.5'},\n", + " 'rxn01045': {'1.4.1.-', '1.4.1.23', '1.4.1.9'},\n", + " 'rxn01046': {'4.1.1.14'},\n", + " 'rxn01048': {'2.2.1.3'},\n", + " 'rxn01049': {'2.7.1.85'},\n", + " 'rxn01050': {'1.1.99.18'},\n", + " 'rxn01051': {'3.2.1.74'},\n", + " 'rxn01052': {'5.1.3.11'},\n", + " ...}" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "{k:v['Enzyme Class'] for k, v in reaction_ecs.items()}" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "df_reactions_aliases_url = pd.read_csv(reactions_aliases_url, index_col=None, sep='\\t')" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ModelSEED IDExternal IDSource
0rxn00001R_R00004_cAlgaGEM
1rxn00001INORGPYROPHOSPHAT-RXNAraCyc
2rxn00001R_R00004_cAraGEM
3rxn00001IPP1BiGG
4rxn00001PPABiGG
............
267247rxn48588jrxn14440janakagithub
267248rxn48589jrxn14441janakagithub
267249rxn48590psrxn00001samseaver
267250rxn48591psrxn00002samseaver
267251rxn48592psrxn00003samseaver
\n", + "

267252 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " ModelSEED ID External ID Source\n", + "0 rxn00001 R_R00004_c AlgaGEM\n", + "1 rxn00001 INORGPYROPHOSPHAT-RXN AraCyc\n", + "2 rxn00001 R_R00004_c AraGEM\n", + "3 rxn00001 IPP1 BiGG\n", + "4 rxn00001 PPA BiGG\n", + "... ... ... ...\n", + "267247 rxn48588 jrxn14440 janakagithub\n", + "267248 rxn48589 jrxn14441 janakagithub\n", + "267249 rxn48590 psrxn00001 samseaver\n", + "267250 rxn48591 psrxn00002 samseaver\n", + "267251 rxn48592 psrxn00003 samseaver\n", + "\n", + "[267252 rows x 3 columns]" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_reactions_aliases_url" + ] + }, { "cell_type": "code", "execution_count": 103, diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index 181bc2c8..1e4f3360 100644 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -179,7 +179,27 @@ def load_metabolites_from_df( return compounds -def _load_metabolites(database_path: str) -> dict: +def _load_aliases_df(df_aliases, seed_index=1, source_index=3, alias_id_index=2): + aliases = {} + for i in df_aliases.itertuples(): + seed_id = i[seed_index] + alias_id = i[alias_id_index] + source = i[source_index] + if seed_id not in aliases: + aliases[seed_id] = {} + if source not in aliases[seed_id]: + aliases[seed_id][source] = set() + aliases[seed_id][source].add(alias_id) + return aliases + + +def _load_metabolites(database_path: str, aliases=None, names=None, structures=None) -> dict: + if aliases is None: + aliases = {} + if names is None: + names = {} + if structures is None: + structures = {} metabolites = {} contents = os.listdir(f'{database_path}/{_BIOCHEM_FOLDER}') for f in contents: @@ -188,10 +208,25 @@ def _load_metabolites(database_path: str) -> dict: _compounds_data = json.load(fh) for o in _compounds_data: if 'id' in o and o['id']: + cpd_names = set() + if o['id'] in names: + cpd_names |= names[o['id']] cpd = ModelSEEDCompound2(o['id'], o.get('formula'), o.get('name'), o.get('charge'), '', - o.get('abbreviation'), None, - o.get('mass'), o.get('deltag'), o.get('deltagerr')) + o.get('abbreviation'), cpd_names, + o.get('mass'), o.get('deltag'), o.get('deltagerr'), + o.get('is_core'), o.get('is_obsolete'), None, + o.get('pka'), o.get('pkb'), + o.get('source')) + if cpd.id in aliases: + cpd.annotation.update(aliases[cpd.id]) + if cpd.id in structures: + for alias_type in structures[cpd.id]: + v = structures[cpd.id][alias_type] + if len(v) == 1: + cpd.annotation[alias_type] = list(v)[0] + else: + logger.warning(f'multiple {alias_type} structures found for {cpd.id}') metabolites[cpd.id] = cpd else: print('error', o) @@ -199,7 +234,13 @@ def _load_metabolites(database_path: str) -> dict: return metabolites -def _load_reactions(database_path: str, metabolites: dict) -> (dict, dict): +def _load_reactions(database_path: str, metabolites: dict, aliases=None, names=None, ec_numbers=None) -> (dict, dict): + if aliases is None: + aliases = {} + if names is None: + names = {} + if ec_numbers is None: + ec_numbers = {} reactions = {} contents = os.listdir(f'{database_path}/{_BIOCHEM_FOLDER}') metabolites_indexed = {} @@ -209,6 +250,9 @@ def _load_reactions(database_path: str, metabolites: dict) -> (dict, dict): _reactions_data = json.load(fh) for o in _reactions_data: if 'id' in o and o['id']: + rxn_names = set() + if o['id'] in names: + rxn_names |= names[o['id']] lower_bound, upper_bound = get_reaction_constraints_from_direction(o.get('reversibility')) stoichiometry = o.get('stoichiometry') reaction_metabolites = {} @@ -225,9 +269,16 @@ def _load_reactions(database_path: str, metabolites: dict) -> (dict, dict): metabolites_indexed[cpd_index_id] = cpd_token reaction_metabolites[metabolites_indexed[cpd_index_id]] = value rxn = ModelSEEDReaction2(o['id'], o.get('name'), '', lower_bound, upper_bound, - delta_g=o.get('deltag'), - delta_g_error=o.get('deltagerr')) + '', rxn_names, + o.get('deltag'), o.get('deltagerr'), + o.get('is_obsolete'), None, + o.get('status'), o.get('source')) rxn.add_metabolites(reaction_metabolites) + if rxn.id in aliases: + rxn.annotation.update(aliases[rxn.id]) + if rxn.id in ec_numbers: + rxn.annotation['ec-code'] = ec_numbers[rxn.id] + metabolites[cpd.id] = cpd reactions[rxn.id] = rxn else: logger.error(f'failed to read reaction record {o}') @@ -339,9 +390,24 @@ def __init__(self, compounds: list, reactions: list, compound_tokens: list): self.compounds += compounds self.reactions += reactions self.reactions += compound_tokens + self.inchi_key_lookup = {} self.metabolite_reactions = {} + self._index_inchi() + + def _index_inchi(self): + for m in self.compounds: + if m.inchi_key: + f, s, p = m.inchi_key.split('-') + if f not in self.inchi_key_lookup: + self.inchi_key_lookup[f] = {} + if s not in self.inchi_key_lookup[f]: + self.inchi_key_lookup[f][s] = set() + proton_pair = (m.id , p) + if proton_pair not in self.inchi_key_lookup[f][s]: + self.inchi_key_lookup[f][s].add(proton_pair) + def compounds_by_alias(self, alias, value): pass @@ -349,9 +415,27 @@ def reactions_by_alias(self, alias, value): pass def find_compounds_by_inchi_key(self, inchi_key, exact=True): - pass + f, s, p = inchi_key.split('-') + if exact and f in self.inchi_key_lookup and s in self.inchi_key_lookup[f]: + # x is tuple (cpd.id, protonation) + return [self.compounds.get_by_id(x[0]) for x in self.inchi_key_lookup[f][s]] + elif f in self.inchi_key_lookup and not exact: + seed_ids = set() + for s in self.inchi_key_lookup[f]: + # x is tuple (cpd.id, protonation) + seed_ids |= {x[0] for x in self.inchi_key_lookup[f][s]} + + return [self.compounds.get_by_id(seed_id) for seed_id in seed_ids] + else: + return [] + + def find_reactions_by_compounds(self, compounds, or_instead_of_and=False): + """ - def find_reactions_by_compounds(self, compounds): + @param compounds: list of seed compound ids + @param or_instead_of_and: use OR logic instead of AND (default) + @return: + """ pass def add_compound(self, cpd): @@ -679,8 +763,32 @@ def from_local_old(path): def from_local(database_path: str): - metabolites = _load_metabolites(database_path) - reactions, metabolite_tokens = _load_reactions(database_path, metabolites) + compound_aliases_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Compound_Aliases.txt' + reaction_aliases_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Aliases.txt' + compound_aliases = _load_aliases_df(pd.read_csv(compound_aliases_url, index_col=None, sep='\t')) + reaction_aliases = _load_aliases_df(pd.read_csv(reaction_aliases_url, index_col=None, sep='\t')) + + compound_structures_url = f'{database_path}/Biochemistry/Structures/Unique_ModelSEED_Structures.txt' + compound_structures = _load_aliases_df(pd.read_csv(compound_structures_url, index_col=None, sep='\t'), + source_index=2, alias_id_index=6) + + compound_names_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Compound_Names.txt' + reaction_names_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Names.txt' + compound_names = _load_aliases_df(pd.read_csv(compound_names_url, index_col=None, sep='\t')) + reaction_names = _load_aliases_df(pd.read_csv(reaction_names_url, index_col=None, sep='\t')) + + reaction_ecs_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_ECs.txt' + reaction_ecs = _load_aliases_df(pd.read_csv(reaction_ecs_url, index_col=None, sep='\t')) + + # build metabolites unpack names + metabolites = _load_metabolites(database_path, compound_aliases, + {k:v['name'] for k, v in compound_names.items()}, + compound_structures) + + # build reactions unpack names, ecs + reactions, metabolite_tokens = _load_reactions(database_path, metabolites, reaction_aliases, + {k:v['name'] for k, v in reaction_names.items()}, + {k:v['Enzyme Class'] for k, v in reaction_ecs.items()}) database = ModelSEEDDatabase(metabolites.values(), reactions.values(), metabolite_tokens.values()) return database diff --git a/modelseedpy/biochem/modelseed_compound.py b/modelseedpy/biochem/modelseed_compound.py index fdb54065..ede08555 100644 --- a/modelseedpy/biochem/modelseed_compound.py +++ b/modelseedpy/biochem/modelseed_compound.py @@ -4,8 +4,14 @@ from cobra.core import Metabolite import pandas as pd +_SMILE_ALIAS = 'SMILE' +_INCHI_ALIAS = 'InChI' +_INCHI_KEY_ALIAS = 'InChIKey' class ModelSEEDCompound2(Metabolite): + + + def __init__( self, cpd_id=None, @@ -18,9 +24,6 @@ def __init__( mass=None, delta_g=None, delta_g_error=None, - smiles=None, - inchi_key=None, - inchi=None, is_core=False, is_obsolete=False, is_cofactor=False, @@ -48,10 +51,6 @@ def __init__( self.delta_g = delta_g self.delta_g_error = delta_g_error - self.smiles = smiles - self.inchi_key = inchi_key - self.inchi = inchi - self.linked_compound = None self.pka = pka self.pkb = pkb @@ -63,8 +62,21 @@ def to_template_compartment_compound(self, compartment): res = self.copy() res.id = f"{self.seed_id}_{compartment}" res.compartment = compartment + res.annotation.update(self.annotation) return res + @property + def smiles(self): + return None if _SMILE_ALIAS not in self.annotation else self.annotation[_SMILE_ALIAS] + + @property + def inchi_key(self): + return None if _INCHI_KEY_ALIAS not in self.annotation else self.annotation[_INCHI_KEY_ALIAS] + + @property + def inchi(self): + return None if _INCHI_ALIAS not in self.annotation else self.annotation[_INCHI_ALIAS] + class ModelSEEDCompound(ModelSEEDObject): @property diff --git a/modelseedpy/biochem/modelseed_reaction.py b/modelseedpy/biochem/modelseed_reaction.py index af5711fb..fca195b6 100644 --- a/modelseedpy/biochem/modelseed_reaction.py +++ b/modelseedpy/biochem/modelseed_reaction.py @@ -145,6 +145,10 @@ def __init__( self.status = status self.is_obsolete = is_obsolete + if self.is_obsolete: + self.is_obsolete = True + else: + self.is_obsolete = False self.is_abstract = is_abstract self.delta_g = float(delta_g) if delta_g else None @@ -188,6 +192,7 @@ def to_template_reaction(self, compartment_setup=None): rxn_id, name, self.subsystem, self.lower_bound, self.upper_bound ) reaction.add_metabolites(metabolites) + reaction.annotation.update(self.annotation) return reaction @property From c5147176cb7b805de6b28ae9a964d5d9407f7893 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Fri, 21 Oct 2022 13:51:57 -0500 Subject: [PATCH 035/298] jupyter --- examples/Others/Biochem.ipynb | 94 +++++++++++++++++------------------ 1 file changed, 46 insertions(+), 48 deletions(-) diff --git a/examples/Others/Biochem.ipynb b/examples/Others/Biochem.ipynb index 1f494e6e..534b0901 100644 --- a/examples/Others/Biochem.ipynb +++ b/examples/Others/Biochem.ipynb @@ -20,7 +20,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -72,59 +72,57 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 15, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "{'IVMDWMLBSA': {frozenset({'N', 'cpd01055'})},\n", - " 'DHVFOXMCSA': {frozenset({'N', 'cpd01257'})},\n", - " 'RWOPYEJCSA': {frozenset({'N', 'cpd01490'})},\n", - " 'ZSNZIGRDSA': {frozenset({'N', 'cpd34045'})},\n", - " 'DGPNFKTASA': {frozenset({'N', 'cpd34600'})},\n", - " 'ZZWDRFIYSA': {frozenset({'N', 'cpd24421'})},\n", - " 'GASJEMHNSA': {frozenset({'N', 'cpd00027'})},\n", - " 'SVZMEOIVSA': {frozenset({'N', 'cpd00108'})},\n", - " 'QTVWNMPRSA': {frozenset({'N', 'cpd00138'})},\n", - " 'VFUOTHLCSA': {frozenset({'N', 'cpd00190'})},\n", - " 'UHFFFAOYSA': {frozenset({'N', 'cpd26824'}),\n", - " frozenset({'N', 'cpd28000'}),\n", - " frozenset({'N', 'cpd00548'})},\n", - " 'FPRJBGLDSA': {frozenset({'N', 'cpd00709'})},\n", - " 'PHYPRBDBSA': {frozenset({'N', 'cpd00724'})},\n", - " 'TVIMKVIFSA': {frozenset({'N', 'cpd31638'})},\n", - " 'KNZZERQRSA': {frozenset({'N', 'cpd11742'})},\n", - " 'URLGYRAOSA': {frozenset({'N', 'cpd26829'})},\n", - " 'UKFBFLRUSA': {frozenset({'N', 'cpd32355'})},\n", - " 'QBFJYBIGSA': {frozenset({'N', 'cpd32929'})},\n", - " 'DVKNGEFBSA': {frozenset({'N', 'cpd19001'})},\n", - " 'PQMKYFCFSA': {frozenset({'N', 'cpd19009'})},\n", - " 'YJRYQGEOSA': {frozenset({'N', 'cpd23021'})},\n", - " 'HGVZOGFYSA': {frozenset({'N', 'cpd23023'})},\n", - " 'GNFDWLABSA': {frozenset({'N', 'cpd35065'})},\n", - " 'RXRWUWDJSA': {frozenset({'N', 'cpd35150'})},\n", - " 'RDQKPOQOSA': {frozenset({'N', 'cpd35588'})},\n", - " 'QRXFDPRISA': {frozenset({'N', 'cpd14652'})},\n", - " 'UWWPDOAWSA': {frozenset({'N', 'cpd27165'})},\n", - " 'KGJVWPDLSA': {frozenset({'N', 'cpd27360'})},\n", - " 'FDROIEKHSA': {frozenset({'N', 'cpd33603'})},\n", - " 'BYIBVSMXSA': {frozenset({'N', 'cpd33694'})},\n", - " 'QZABAPFNSA': {frozenset({'N', 'cpd33806'})},\n", - " 'AIECOIEWSA': {frozenset({'N', 'cpd33917'})},\n", - " 'RSVSWTKNSA': {frozenset({'N', 'cpd03880'})},\n", - " 'CBPJZXOFSA': {frozenset({'N', 'cpd03881'})},\n", - " 'YIDFTEPTSA': {frozenset({'N', 'cpd03882'})},\n", - " 'WHZQZERISA': {frozenset({'N', 'cpd03883'})}}" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "{'AraCyc': {'CPD4FS-6'}, 'BrachyCyc': {'CPD4FS-6'}, 'KEGG': {'C15923'}, 'MetaCyc': {'CPD4FS-6', 'L-gulopyranose'}, 'PlantCyc': {'CPD4FS-6'}, 'TS_Athaliana': {'met717_c'}, 'metanetx.chemical': {'MNXM12054'}, 'SMILE': 'OC[C@@H]1OC(O)[C@@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-QRXFDPRISA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5-,6?/m0/s1'}\n", + "{'MetaCyc': {'CPD-15627'}, 'metanetx.chemical': {'MNXM40987'}, 'SMILE': 'OC[C@H]1O[C@H](O)[C@H](O)[C@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-UKFBFLRUSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4-,5-,6+/m1/s1'}\n", + "{'MetaCyc': {'CPD-18461'}, 'metanetx.chemical': {'MNXM152769'}, 'SMILE': 'OC[C@@H]1O[C@H](O)[C@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-ZSNZIGRDSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5+,6-/m0/s1'}\n", + "{'AlgaGEM': {'S_D_45_Mannose_c'}, 'AraGEM': {'S_D_45_Mannose_c'}, 'BiGG': {'man'}, 'BiGG1': {'man'}, 'DF_Athaliana': {'MANNOSE'}, 'JP_Creinhardtii_MSB': {'M_man_h', 'M_man_c'}, 'KEGG': {'C00159'}, 'Maize_C4GEM': {'S_D_45_Mannose_c'}, 'MetaCyc': {'CPD-15373', 'D-mannopyranose'}, 'TS_Athaliana': {'met963_m', 'met963_v', 'met963_c', 'met963_p'}, 'iAF1260': {'man'}, 'iAG612': {'cbs_306', 'cbs_466'}, 'iAO358': {'cll_327'}, 'iGT196': {'man'}, 'iIN800': {'man'}, 'iJR904': {'man'}, 'iMA945': {'man'}, 'iMEO21': {'man'}, 'iMM904': {'man'}, 'iMO1053-PAO1': {'man'}, 'iMO1056': {'man'}, 'iND750': {'man'}, 'iNJ661': {'man'}, 'iPS189': {'man'}, 'iRR1083': {'man'}, 'iRS1563': {'M_C00159_c'}, 'iRS1597': {'C00159_c'}, 'iSB619': {'man'}, 'iYO844': {'man'}, 'metanetx.chemical': {'MNXM2097', 'MNXM722792', 'MNXM182'}, 'SMILE': 'OC[C@H]1OC(O)[C@@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-QTVWNMPRSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4+,5+,6?/m1/s1'}\n", + "{'BrachyCyc': {'GULOSE'}, 'KEGG': {'C06465'}, 'MetaCyc': {'GULOSE'}, 'metanetx.chemical': {'MNXM48520'}, 'SMILE': 'OC[C@H]1OC(O)[C@H](O)[C@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-CBPJZXOFSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5-,6?/m1/s1'}\n", + "{'MetaCyc': {'CPD-15761'}, 'metanetx.chemical': {'MNXM491851'}, 'SMILE': 'OC[C@H]1O[C@@H](O)[C@@H](O)[C@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-DGPNFKTASA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4-,5+,6-/m1/s1'}\n", + "{'BrachyCyc': {'IDOSE'}, 'KEGG': {'C06466'}, 'MetaCyc': {'IDOSE'}, 'metanetx.chemical': {'MNXM48535', 'MNXM57103'}, 'SMILE': 'OC[C@H]1OC(O)[C@@H](O)[C@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-YIDFTEPTSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5+,6?/m1/s1'}\n", + "{'AlgaGEM': {'S_beta_45_D_45_Glucose_c'}, 'AraCyc': {'GLC'}, 'AraGEM': {'S_beta_45_D_45_Glucose_c'}, 'BiGG1': {'glc-D-B'}, 'BrachyCyc': {'GLC'}, 'ChlamyCyc': {'GLC'}, 'CornCyc': {'GLC'}, 'DF_Athaliana': {'GLC', 'GLC_e'}, 'EcoCyc': {'GLC'}, 'JP_Creinhardtii_MSB': {'M_glc_DASH_B_h', 'M_glc_DASH_B_c'}, 'JP_Creinhardtii_NMeth': {'M_glc_B_c', 'M_glc_B_h'}, 'KEGG': {'C00221'}, 'MaizeCyc': {'GLC'}, 'Maize_C4GEM': {'S_beta_45_D_45_Glucose_c'}, 'MetaCyc': {'GLC', 'B-XGLC-HEX-1:5_6:A'}, 'PlantCyc': {'GLC'}, 'PoplarCyc': {'GLC'}, 'RiceCyc': {'GLC'}, 'SorghumCyc': {'GLC'}, 'SoyCyc': {'GLC'}, 'TS_Athaliana': {'met846_c', 'met846_m', 'met846_p', 'met846_r', 'met846_v'}, 'iAO358': {'cll_92'}, 'iAbaylyiv4': {'GLC'}, 'iIN800': {'glc-D-B'}, 'iRS1563': {'M_C00221_c'}, 'iRS1597': {'C00221_c'}, 'metanetx.chemical': {'MNXM105'}, 'SMILE': 'OC[C@H]1O[C@@H](O)[C@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-VFUOTHLCSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4+,5-,6-/m1/s1'}\n", + "{'KEGG': {'C06467'}, 'MetaCyc': {'D-talopyranoses'}, 'metanetx.chemical': {'MNXM11294', 'MNXM48621'}, 'SMILE': 'OC[C@H]1OC(O)[C@@H](O)[C@@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-WHZQZERISA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4+,5+,6?/m1/s1'}\n", + "{'AlgaGEM': {'S_beta_45_D_45_Galactose_c'}, 'AraCyc': {'GALACTOSE'}, 'AraGEM': {'S_beta_45_D_45_Galactose_c'}, 'BiGG': {'gal_bD'}, 'BiGG1': {'gal-bD'}, 'BrachyCyc': {'GALACTOSE'}, 'ChlamyCyc': {'GALACTOSE'}, 'CornCyc': {'GALACTOSE'}, 'EcoCyc': {'GALACTOSE'}, 'KEGG': {'C00962'}, 'MaizeCyc': {'GALACTOSE'}, 'Maize_C4GEM': {'S_beta_45_D_45_Galactose_c'}, 'MetaCyc': {'GALACTOSE'}, 'PlantCyc': {'GALACTOSE'}, 'PoplarCyc': {'GALACTOSE'}, 'RiceCyc': {'GALACTOSE'}, 'SorghumCyc': {'GALACTOSE'}, 'SoyCyc': {'GALACTOSE'}, 'TS_Athaliana': {'met832_p', 'met832_c', 'met832_v'}, 'iAF1260': {'gal-bD'}, 'iAO358': {'cll_199'}, 'iMA945': {'gal-bD'}, 'iRS1597': {'C00962_c'}, 'metanetx.chemical': {'MNXM112'}, 'SMILE': 'OC[C@H]1O[C@@H](O)[C@H](O)[C@@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-FPRJBGLDSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4+,5-,6-/m1/s1'}\n", + "{'BrachyCyc': {'CPD-11611'}, 'MetaCyc': {'CPD-11611'}, 'metanetx.chemical': {'MNXM44134'}, 'SMILE': 'OC[C@@H]1O[C@H](O)[C@H](O)[C@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-YJRYQGEOSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4+,5+,6-/m0/s1'}\n", + "{'BrachyCyc': {'D-TALOSE'}, 'MetaCyc': {'Alpha-D-Talose', 'D-TALOSE'}, 'metanetx.chemical': {'MNXM57097'}, 'SMILE': 'OC[C@H]1O[C@H](O)[C@@H](O)[C@@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-URLGYRAOSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4+,5+,6+/m1/s1'}\n", + "{'KEGG': {'C00737'}, 'metanetx.chemical': {'MNXM48382'}, 'SMILE': 'OC[C@H]1OC(O)C(O)C(O)C1O', 'InChIKey': 'WQZGKKKJIJFFOK-KNZZERQRSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3?,4?,5?,6?/m1/s1'}\n", + "{'MetaCyc': {'CPD-15622'}, 'metanetx.chemical': {'MNXM44034'}, 'SMILE': 'OC[C@H]1O[C@@H](O)[C@H](O)[C@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-AIECOIEWSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5-,6-/m1/s1'}\n", + "{'MetaCyc': {'CPD-15758'}, 'metanetx.chemical': {'MNXM17118'}, 'SMILE': 'OC[C@H]1O[C@H](O)[C@@H](O)[C@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-RDQKPOQOSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5+,6+/m1/s1'}\n", + "{'AlgaGEM': {'S_Glucose_p', 'S_D_45_Glucose_c', 'S_Glucose_c', 'S_Glucose_ext_b'}, 'AraGEM': {'S_D_45_Glucose_c'}, 'BiGG': {'glc__D'}, 'BiGG1': {'glc_D', 'glc-D'}, 'JM_Creinhardtii': {'GLC'}, 'JP_Creinhardtii_NMeth': {'M_glc_D_h', 'M_glc_D_c'}, 'KEGG': {'C00031', 'C00293'}, 'Maize_C4GEM': {'S_D_45_Glucose_c', 'S_Glucose_ext'}, 'MetaCyc': {'Glucopyranose'}, 'TS_Athaliana': {'met735_c', 'met735_p', 'met735_r', 'met735_v'}, 'iAF1260': {'glc-D'}, 'iAF692': {'glc-D'}, 'iAG612': {'cbs_47', 'cbs_40', 'cbs_346'}, 'iAO358': {'cll_276', 'cll_28'}, 'iGT196': {'glc-D'}, 'iIN800': {'glc-D'}, 'iIT341': {'glc_D'}, 'iJN746': {'glc-D'}, 'iJR904': {'glc-D'}, 'iMA945': {'glc-D'}, 'iMEO21': {'glc_D'}, 'iMM904': {'glc-D'}, 'iMO1053-PAO1': {'glc-D'}, 'iMO1056': {'glc-D'}, 'iND750': {'glc-D'}, 'iNJ661': {'glc-D'}, 'iPS189': {'glc-D'}, 'iRR1083': {'glc-D'}, 'iRS1563': {'M_C00293_c', 'M_C00293_p'}, 'iSB619': {'glc-D'}, 'iSO783': {'glc-D'}, 'iYO844': {'glc-D'}, 'metanetx.chemical': {'MNXM41', 'MNXM55158'}, 'SMILE': 'OC[C@H]1OC(O)[C@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-GASJEMHNSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4+,5-,6?/m1/s1'}\n", + "{'BrachyCyc': {'CPD-11613'}, 'MetaCyc': {'CPD-11613'}, 'metanetx.chemical': {'MNXM41427'}, 'SMILE': 'OC[C@@H]1O[C@@H](O)[C@H](O)[C@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-HGVZOGFYSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4+,5+,6+/m0/s1'}\n", + "{'MetaCyc': {'Pyranoses'}, 'SMILE': 'OCC1OC(O)C(O)C(O)C1O', 'InChIKey': 'WQZGKKKJIJFFOK-UHFFFAOYSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2'}\n", + "{'AraCyc': {'CPD-13559'}, 'CornCyc': {'CPD-13559'}, 'KEGG': {'C00936'}, 'MetaCyc': {'CPD-13559'}, 'metanetx.chemical': {'MNXM919'}, 'SMILE': 'OC[C@H]1O[C@H](O)[C@@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-PQMKYFCFSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4+,5+,6+/m1/s1'}\n", + "{'MetaCyc': {'CPD-15625'}, 'metanetx.chemical': {'MNXM44131'}, 'SMILE': 'OC[C@@H]1O[C@H](O)[C@@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-GNFDWLABSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5-,6-/m0/s1'}\n", + "{'KEGG': {'C02209'}, 'MaizeCyc': {'CPD-12601'}, 'MetaCyc': {'CPD-12601'}, 'metanetx.chemical': {'MNXM7967'}, 'SMILE': 'OC[C@H]1O[C@@H](O)[C@@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-RWOPYEJCSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4+,5+,6-/m1/s1'}\n", + "{'MetaCyc': {'CPD-15628'}, 'metanetx.chemical': {'MNXM7114'}, 'SMILE': 'OC[C@H]1O[C@@H](O)[C@H](O)[C@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-QZABAPFNSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4-,5-,6-/m1/s1'}\n", + "{'AraCyc': {'D-Hexoses'}, 'BrachyCyc': {'D-Hexoses'}, 'ChlamyCyc': {'D-Hexoses'}, 'CornCyc': {'D-Hexoses'}, 'MaizeCyc': {'D-Hexoses'}, 'MetaCyc': {'D-Hexoses'}, 'PoplarCyc': {'D-Hexoses'}, 'RiceCyc': {'D-Hexoses'}, 'SorghumCyc': {'D-Hexoses'}, 'SoyCyc': {'D-Hexoses'}, 'SMILE': 'OCC1OC(O)C(O)C(O)C1O', 'InChIKey': 'WQZGKKKJIJFFOK-UHFFFAOYSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2'}\n", + "{'AlgaGEM': {'S_L_45_Galactose_c'}, 'AraGEM': {'S_L_45_Galactose_c'}, 'DF_Athaliana': {'L-GALACTOSE'}, 'KEGG': {'C01825'}, 'MetaCyc': {'L-Galactopyranose', 'CPD-13428'}, 'TS_Athaliana': {'met933_p', 'met933_c'}, 'iRS1563': {'M_C01825_c'}, 'iRS1597': {'C01825_c'}, 'metanetx.chemical': {'MNXM4459', 'MNXM4637'}, 'SMILE': 'OC[C@@H]1OC(O)[C@@H](O)[C@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-DHVFOXMCSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4+,5-,6?/m0/s1'}\n", + "{'AlgaGEM': {'S_alpha_45_D_45_Galactose_c'}, 'AraCyc': {'ALPHA-D-GALACTOSE'}, 'AraGEM': {'S_alpha_45_D_45_Galactose_c'}, 'BrachyCyc': {'ALPHA-D-GALACTOSE'}, 'ChlamyCyc': {'ALPHA-D-GALACTOSE'}, 'CornCyc': {'ALPHA-D-GALACTOSE'}, 'DF_Athaliana': {'ALPHA-D-GALACTOSE'}, 'EcoCyc': {'ALPHA-D-GALACTOSE'}, 'KEGG': {'C00984'}, 'MaizeCyc': {'ALPHA-D-GALACTOSE'}, 'Maize_C4GEM': {'S_alpha_45_D_45_Galactose_c'}, 'MetaCyc': {'ALPHA-D-GALACTOSE'}, 'PlantCyc': {'ALPHA-D-GALACTOSE'}, 'PoplarCyc': {'ALPHA-D-GALACTOSE'}, 'RiceCyc': {'ALPHA-D-GALACTOSE'}, 'SorghumCyc': {'ALPHA-D-GALACTOSE'}, 'SoyCyc': {'ALPHA-D-GALACTOSE'}, 'TS_Athaliana': {'met121_c'}, 'iRS1563': {'M_C00984_c'}, 'iRS1597': {'C00984_c'}, 'SMILE': 'OC[C@H]1O[C@H](O)[C@H](O)[C@@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-PHYPRBDBSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4+,5-,6+/m1/s1'}\n", + "{'KEGG': {'C00738'}, 'MetaCyc': {'Aldopyranoses'}, 'metanetx.chemical': {'MNXM146261', 'MNXM1274'}, 'SMILE': 'OCC1OC(O)C(O)C(O)C1O', 'InChIKey': 'WQZGKKKJIJFFOK-UHFFFAOYSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2'}\n", + "{'BiGG': {'all__D'}, 'BiGG1': {'all-D'}, 'BrachyCyc': {'ALLOSE'}, 'EcoCyc': {'ALLOSE'}, 'KEGG': {'C01487'}, 'MetaCyc': {'D-Allopyranose', 'CPD-15629', 'ALLOSE'}, 'iAF1260': {'all-D'}, 'iMA945': {'all-D'}, 'metanetx.chemical': {'MNXM1919', 'MNXM40570'}, 'SMILE': 'OC[C@H]1OC(O)[C@H](O)[C@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-IVMDWMLBSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4-,5-,6?/m1/s1'}\n", + "{'MetaCyc': {'CPD-15621'}, 'metanetx.chemical': {'MNXM41182'}, 'SMILE': 'OC[C@H]1O[C@H](O)[C@H](O)[C@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-RXRWUWDJSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5-,6+/m1/s1'}\n", + "{'AlgaGEM': {'S_alpha_45_D_45_Glucose_c', 'S_alpha_45_D_45_Glucose_p'}, 'AraCyc': {'ALPHA-GLUCOSE'}, 'AraGEM': {'S_alpha_45_D_45_Glucose_p', 'S_Glucose_c', 'S_Glucose_ext_b', 'S_Glucose_p', 'S_alpha_45_D_45_Glucose_c'}, 'BrachyCyc': {'ALPHA-GLUCOSE'}, 'ChlamyCyc': {'ALPHA-GLUCOSE'}, 'CornCyc': {'ALPHA-GLUCOSE'}, 'DF_Athaliana': {'ALPHA-GLUCOSE'}, 'EcoCyc': {'ALPHA-GLUCOSE'}, 'JP_Creinhardtii_MSB': {'M_glc_DASH_A_h', 'M_glc_DASH_A_c'}, 'KEGG': {'C00267'}, 'MaizeCyc': {'ALPHA-GLUCOSE'}, 'Maize_C4GEM': {'S_Glucose_p', 'S_alpha_45_D_45_Glucose_c', 'S_Glucose_c', 'S_alpha_45_D_45_Glucose_p'}, 'MetaCyc': {'ALPHA-GLUCOSE'}, 'PlantCyc': {'ALPHA-GLUCOSE'}, 'PoplarCyc': {'ALPHA-GLUCOSE'}, 'RiceCyc': {'ALPHA-GLUCOSE'}, 'SorghumCyc': {'ALPHA-GLUCOSE'}, 'SoyCyc': {'ALPHA-GLUCOSE'}, 'TS_Athaliana': {'met123_p', 'met123_m', 'met123_c', 'met123_r', 'met123_v'}, 'iRS1563': {'M_C00031_c', 'M_C00267_p', 'M_C00267_c'}, 'iRS1597': {'C00267_e', 'C00031_c', 'C00267_c', 'C00267_p'}, 'metanetx.chemical': {'MNXM99'}, 'SMILE': 'OC[C@H]1O[C@H](O)[C@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-DVKNGEFBSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4+,5-,6+/m1/s1'}\n", + "{'AraCyc': {'Glucose'}, 'CornCyc': {'Glucose'}, 'MetaCyc': {'Glucose'}, 'PlantCyc': {'Glucose'}, 'PoplarCyc': {'Glucose'}, 'SoyCyc': {'Glucose'}, 'metanetx.chemical': {'MNXM7381'}, 'SMILE': 'OCC1OC(O)[C@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-UWWPDOAWSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2?,3-,4+,5-,6?/m1/s1'}\n", + "{'AraCyc': {'CPD-3607'}, 'BrachyCyc': {'CPD-3607'}, 'EcoCyc': {'CPD-3607'}, 'MetaCyc': {'CPD-3607'}, 'PlantCyc': {'CPD-3607'}, 'metanetx.chemical': {'MNXM18905'}, 'SMILE': 'OC[C@@H]1OC(O)[C@@H](O)[C@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-ZZWDRFIYSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4+,5-,6?/m0/s1'}\n", + "{'MetaCyc': {'CPD-15624'}, 'metanetx.chemical': {'MNXM41423'}, 'SMILE': 'OC[C@@H]1O[C@@H](O)[C@@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-BYIBVSMXSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5-,6+/m0/s1'}\n", + "{'BrachyCyc': {'ALTROSE'}, 'EcoCyc': {'ALTROSE'}, 'KEGG': {'C06464'}, 'MetaCyc': {'ALTROSE', 'D-altropyranoses'}, 'metanetx.chemical': {'MNXM48393', 'MNXM17055'}, 'SMILE': 'OC[C@H]1OC(O)[C@@H](O)[C@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-RSVSWTKNSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4-,5+,6?/m1/s1'}\n", + "{'MetaCyc': {'CPD-15762'}, 'metanetx.chemical': {'MNXM491238'}, 'SMILE': 'OC[C@H]1O[C@H](O)[C@@H](O)[C@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-TVIMKVIFSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4-,5+,6+/m1/s1'}\n", + "{'AraCyc': {'L-GALACTOSE'}, 'BrachyCyc': {'L-GALACTOSE'}, 'ChlamyCyc': {'L-GALACTOSE'}, 'CornCyc': {'L-GALACTOSE'}, 'EcoCyc': {'L-GALACTOSE'}, 'MaizeCyc': {'L-GALACTOSE'}, 'MetaCyc': {'L-GALACTOSE'}, 'PlantCyc': {'L-GALACTOSE'}, 'PoplarCyc': {'L-GALACTOSE'}, 'RiceCyc': {'L-GALACTOSE'}, 'SorghumCyc': {'L-GALACTOSE'}, 'SoyCyc': {'L-GALACTOSE'}, 'metanetx.chemical': {'MNXM7129'}, 'SMILE': 'OC[C@@H]1O[C@H](O)[C@@H](O)[C@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-KGJVWPDLSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4+,5-,6-/m0/s1'}\n", + "{'AlgaGEM': {'S_D_45_Galactose_c'}, 'AraGEM': {'S_D_45_Galactose_c'}, 'BiGG': {'gal'}, 'BiGG1': {'gal'}, 'DF_Athaliana': {'D-Galactose'}, 'JP_Creinhardtii_MSB': {'M_gal_c', 'M_gal_h', 'M_gal_n'}, 'KEGG': {'C00124'}, 'Maize_C4GEM': {'S_D_45_Galactose_c'}, 'MetaCyc': {'CPD-15590', 'D-galactopyranose'}, 'iAF1260': {'gal'}, 'iAG612': {'cbs_292'}, 'iAO358': {'cll_457', 'cll_197'}, 'iGT196': {'gal'}, 'iIN800': {'gal'}, 'iIT341': {'gal'}, 'iJR904': {'gal'}, 'iMA945': {'gal'}, 'iMEO21': {'gal'}, 'iMM904': {'gal'}, 'iND750': {'gal'}, 'iNJ661': {'gal'}, 'iPS189': {'gal'}, 'iRR1083': {'gal'}, 'iRS1563': {'M_C00124_c', 'M_C00124_p'}, 'iRS1597': {'C00124_c'}, 'iSO783': {'gal'}, 'iYO844': {'gal'}, 'metanetx.chemical': {'MNXM162496', 'MNXM390'}, 'SMILE': 'OC[C@H]1OC(O)[C@H](O)[C@@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-SVZMEOIVSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4+,5-,6?/m1/s1'}\n", + "{'MetaCyc': {'CPD-15757'}, 'metanetx.chemical': {'MNXM491959'}, 'SMILE': 'OC[C@H]1O[C@@H](O)[C@@H](O)[C@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-FDROIEKHSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5+,6-/m1/s1'}\n", + "{'MetaCyc': {'CPD-15759'}, 'metanetx.chemical': {'MNXM491967'}, 'SMILE': 'OC[C@H]1O[C@@H](O)[C@@H](O)[C@@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-QBFJYBIGSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4+,5+,6-/m1/s1'}\n" + ] } ], "source": [ - "modelseed.find_compounds_by_inchi_key('WQZGKKKJIJFFOK-FPRJBGLDSA-N', False)" + "for cpd in modelseed.find_compounds_by_inchi_key('WQZGKKKJIJFFOK-FPRJBGLDSG-K', True):\n", + " print(cpd.annotation)" ] }, { From 3ee4a40cc663641898ccec71eca074ec27aa7de2 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Fri, 21 Oct 2022 14:06:12 -0500 Subject: [PATCH 036/298] biochem notebook --- examples/Others/Biochem.ipynb | 3024 ++------------------------------- 1 file changed, 111 insertions(+), 2913 deletions(-) diff --git a/examples/Others/Biochem.ipynb b/examples/Others/Biochem.ipynb index 534b0901..7db3aecb 100644 --- a/examples/Others/Biochem.ipynb +++ b/examples/Others/Biochem.ipynb @@ -4,18 +4,16 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "cobrakbase 0.2.8\n" - ] - } - ], + "outputs": [], + "source": [ + "import modelseedpy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, "source": [ - "import modelseedpy\n", - "import cobrakbase" + "### Load the database object from local github repository" ] }, { @@ -29,2916 +27,216 @@ ] }, { - "cell_type": "code", - "execution_count": 8, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'LCTONWCANYUPML-UHFFFAOYSA-M'" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "modelseed.compounds.cpd00020.inchi_key" + "# Compounds" ] }, { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[frozenset({'N', 'cpd00709'})]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], + "cell_type": "markdown", + "metadata": {}, "source": [ - "[x for x in modelseed.find_compounds_by_inchi_key('WQZGKKKJIJFFOK-FPRJBGLDSA-N', True)]" + "### Fetch compounds" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{'AraCyc': {'CPD4FS-6'}, 'BrachyCyc': {'CPD4FS-6'}, 'KEGG': {'C15923'}, 'MetaCyc': {'CPD4FS-6', 'L-gulopyranose'}, 'PlantCyc': {'CPD4FS-6'}, 'TS_Athaliana': {'met717_c'}, 'metanetx.chemical': {'MNXM12054'}, 'SMILE': 'OC[C@@H]1OC(O)[C@@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-QRXFDPRISA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5-,6?/m0/s1'}\n", - "{'MetaCyc': {'CPD-15627'}, 'metanetx.chemical': {'MNXM40987'}, 'SMILE': 'OC[C@H]1O[C@H](O)[C@H](O)[C@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-UKFBFLRUSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4-,5-,6+/m1/s1'}\n", - "{'MetaCyc': {'CPD-18461'}, 'metanetx.chemical': {'MNXM152769'}, 'SMILE': 'OC[C@@H]1O[C@H](O)[C@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-ZSNZIGRDSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5+,6-/m0/s1'}\n", - "{'AlgaGEM': {'S_D_45_Mannose_c'}, 'AraGEM': {'S_D_45_Mannose_c'}, 'BiGG': {'man'}, 'BiGG1': {'man'}, 'DF_Athaliana': {'MANNOSE'}, 'JP_Creinhardtii_MSB': {'M_man_h', 'M_man_c'}, 'KEGG': {'C00159'}, 'Maize_C4GEM': {'S_D_45_Mannose_c'}, 'MetaCyc': {'CPD-15373', 'D-mannopyranose'}, 'TS_Athaliana': {'met963_m', 'met963_v', 'met963_c', 'met963_p'}, 'iAF1260': {'man'}, 'iAG612': {'cbs_306', 'cbs_466'}, 'iAO358': {'cll_327'}, 'iGT196': {'man'}, 'iIN800': {'man'}, 'iJR904': {'man'}, 'iMA945': {'man'}, 'iMEO21': {'man'}, 'iMM904': {'man'}, 'iMO1053-PAO1': {'man'}, 'iMO1056': {'man'}, 'iND750': {'man'}, 'iNJ661': {'man'}, 'iPS189': {'man'}, 'iRR1083': {'man'}, 'iRS1563': {'M_C00159_c'}, 'iRS1597': {'C00159_c'}, 'iSB619': {'man'}, 'iYO844': {'man'}, 'metanetx.chemical': {'MNXM2097', 'MNXM722792', 'MNXM182'}, 'SMILE': 'OC[C@H]1OC(O)[C@@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-QTVWNMPRSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4+,5+,6?/m1/s1'}\n", - "{'BrachyCyc': {'GULOSE'}, 'KEGG': {'C06465'}, 'MetaCyc': {'GULOSE'}, 'metanetx.chemical': {'MNXM48520'}, 'SMILE': 'OC[C@H]1OC(O)[C@H](O)[C@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-CBPJZXOFSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5-,6?/m1/s1'}\n", - "{'MetaCyc': {'CPD-15761'}, 'metanetx.chemical': {'MNXM491851'}, 'SMILE': 'OC[C@H]1O[C@@H](O)[C@@H](O)[C@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-DGPNFKTASA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4-,5+,6-/m1/s1'}\n", - "{'BrachyCyc': {'IDOSE'}, 'KEGG': {'C06466'}, 'MetaCyc': {'IDOSE'}, 'metanetx.chemical': {'MNXM48535', 'MNXM57103'}, 'SMILE': 'OC[C@H]1OC(O)[C@@H](O)[C@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-YIDFTEPTSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5+,6?/m1/s1'}\n", - "{'AlgaGEM': {'S_beta_45_D_45_Glucose_c'}, 'AraCyc': {'GLC'}, 'AraGEM': {'S_beta_45_D_45_Glucose_c'}, 'BiGG1': {'glc-D-B'}, 'BrachyCyc': {'GLC'}, 'ChlamyCyc': {'GLC'}, 'CornCyc': {'GLC'}, 'DF_Athaliana': {'GLC', 'GLC_e'}, 'EcoCyc': {'GLC'}, 'JP_Creinhardtii_MSB': {'M_glc_DASH_B_h', 'M_glc_DASH_B_c'}, 'JP_Creinhardtii_NMeth': {'M_glc_B_c', 'M_glc_B_h'}, 'KEGG': {'C00221'}, 'MaizeCyc': {'GLC'}, 'Maize_C4GEM': {'S_beta_45_D_45_Glucose_c'}, 'MetaCyc': {'GLC', 'B-XGLC-HEX-1:5_6:A'}, 'PlantCyc': {'GLC'}, 'PoplarCyc': {'GLC'}, 'RiceCyc': {'GLC'}, 'SorghumCyc': {'GLC'}, 'SoyCyc': {'GLC'}, 'TS_Athaliana': {'met846_c', 'met846_m', 'met846_p', 'met846_r', 'met846_v'}, 'iAO358': {'cll_92'}, 'iAbaylyiv4': {'GLC'}, 'iIN800': {'glc-D-B'}, 'iRS1563': {'M_C00221_c'}, 'iRS1597': {'C00221_c'}, 'metanetx.chemical': {'MNXM105'}, 'SMILE': 'OC[C@H]1O[C@@H](O)[C@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-VFUOTHLCSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4+,5-,6-/m1/s1'}\n", - "{'KEGG': {'C06467'}, 'MetaCyc': {'D-talopyranoses'}, 'metanetx.chemical': {'MNXM11294', 'MNXM48621'}, 'SMILE': 'OC[C@H]1OC(O)[C@@H](O)[C@@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-WHZQZERISA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4+,5+,6?/m1/s1'}\n", - "{'AlgaGEM': {'S_beta_45_D_45_Galactose_c'}, 'AraCyc': {'GALACTOSE'}, 'AraGEM': {'S_beta_45_D_45_Galactose_c'}, 'BiGG': {'gal_bD'}, 'BiGG1': {'gal-bD'}, 'BrachyCyc': {'GALACTOSE'}, 'ChlamyCyc': {'GALACTOSE'}, 'CornCyc': {'GALACTOSE'}, 'EcoCyc': {'GALACTOSE'}, 'KEGG': {'C00962'}, 'MaizeCyc': {'GALACTOSE'}, 'Maize_C4GEM': {'S_beta_45_D_45_Galactose_c'}, 'MetaCyc': {'GALACTOSE'}, 'PlantCyc': {'GALACTOSE'}, 'PoplarCyc': {'GALACTOSE'}, 'RiceCyc': {'GALACTOSE'}, 'SorghumCyc': {'GALACTOSE'}, 'SoyCyc': {'GALACTOSE'}, 'TS_Athaliana': {'met832_p', 'met832_c', 'met832_v'}, 'iAF1260': {'gal-bD'}, 'iAO358': {'cll_199'}, 'iMA945': {'gal-bD'}, 'iRS1597': {'C00962_c'}, 'metanetx.chemical': {'MNXM112'}, 'SMILE': 'OC[C@H]1O[C@@H](O)[C@H](O)[C@@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-FPRJBGLDSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4+,5-,6-/m1/s1'}\n", - "{'BrachyCyc': {'CPD-11611'}, 'MetaCyc': {'CPD-11611'}, 'metanetx.chemical': {'MNXM44134'}, 'SMILE': 'OC[C@@H]1O[C@H](O)[C@H](O)[C@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-YJRYQGEOSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4+,5+,6-/m0/s1'}\n", - "{'BrachyCyc': {'D-TALOSE'}, 'MetaCyc': {'Alpha-D-Talose', 'D-TALOSE'}, 'metanetx.chemical': {'MNXM57097'}, 'SMILE': 'OC[C@H]1O[C@H](O)[C@@H](O)[C@@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-URLGYRAOSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4+,5+,6+/m1/s1'}\n", - "{'KEGG': {'C00737'}, 'metanetx.chemical': {'MNXM48382'}, 'SMILE': 'OC[C@H]1OC(O)C(O)C(O)C1O', 'InChIKey': 'WQZGKKKJIJFFOK-KNZZERQRSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3?,4?,5?,6?/m1/s1'}\n", - "{'MetaCyc': {'CPD-15622'}, 'metanetx.chemical': {'MNXM44034'}, 'SMILE': 'OC[C@H]1O[C@@H](O)[C@H](O)[C@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-AIECOIEWSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5-,6-/m1/s1'}\n", - "{'MetaCyc': {'CPD-15758'}, 'metanetx.chemical': {'MNXM17118'}, 'SMILE': 'OC[C@H]1O[C@H](O)[C@@H](O)[C@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-RDQKPOQOSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5+,6+/m1/s1'}\n", - "{'AlgaGEM': {'S_Glucose_p', 'S_D_45_Glucose_c', 'S_Glucose_c', 'S_Glucose_ext_b'}, 'AraGEM': {'S_D_45_Glucose_c'}, 'BiGG': {'glc__D'}, 'BiGG1': {'glc_D', 'glc-D'}, 'JM_Creinhardtii': {'GLC'}, 'JP_Creinhardtii_NMeth': {'M_glc_D_h', 'M_glc_D_c'}, 'KEGG': {'C00031', 'C00293'}, 'Maize_C4GEM': {'S_D_45_Glucose_c', 'S_Glucose_ext'}, 'MetaCyc': {'Glucopyranose'}, 'TS_Athaliana': {'met735_c', 'met735_p', 'met735_r', 'met735_v'}, 'iAF1260': {'glc-D'}, 'iAF692': {'glc-D'}, 'iAG612': {'cbs_47', 'cbs_40', 'cbs_346'}, 'iAO358': {'cll_276', 'cll_28'}, 'iGT196': {'glc-D'}, 'iIN800': {'glc-D'}, 'iIT341': {'glc_D'}, 'iJN746': {'glc-D'}, 'iJR904': {'glc-D'}, 'iMA945': {'glc-D'}, 'iMEO21': {'glc_D'}, 'iMM904': {'glc-D'}, 'iMO1053-PAO1': {'glc-D'}, 'iMO1056': {'glc-D'}, 'iND750': {'glc-D'}, 'iNJ661': {'glc-D'}, 'iPS189': {'glc-D'}, 'iRR1083': {'glc-D'}, 'iRS1563': {'M_C00293_c', 'M_C00293_p'}, 'iSB619': {'glc-D'}, 'iSO783': {'glc-D'}, 'iYO844': {'glc-D'}, 'metanetx.chemical': {'MNXM41', 'MNXM55158'}, 'SMILE': 'OC[C@H]1OC(O)[C@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-GASJEMHNSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4+,5-,6?/m1/s1'}\n", - "{'BrachyCyc': {'CPD-11613'}, 'MetaCyc': {'CPD-11613'}, 'metanetx.chemical': {'MNXM41427'}, 'SMILE': 'OC[C@@H]1O[C@@H](O)[C@H](O)[C@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-HGVZOGFYSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4+,5+,6+/m0/s1'}\n", - "{'MetaCyc': {'Pyranoses'}, 'SMILE': 'OCC1OC(O)C(O)C(O)C1O', 'InChIKey': 'WQZGKKKJIJFFOK-UHFFFAOYSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2'}\n", - "{'AraCyc': {'CPD-13559'}, 'CornCyc': {'CPD-13559'}, 'KEGG': {'C00936'}, 'MetaCyc': {'CPD-13559'}, 'metanetx.chemical': {'MNXM919'}, 'SMILE': 'OC[C@H]1O[C@H](O)[C@@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-PQMKYFCFSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4+,5+,6+/m1/s1'}\n", - "{'MetaCyc': {'CPD-15625'}, 'metanetx.chemical': {'MNXM44131'}, 'SMILE': 'OC[C@@H]1O[C@H](O)[C@@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-GNFDWLABSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5-,6-/m0/s1'}\n", - "{'KEGG': {'C02209'}, 'MaizeCyc': {'CPD-12601'}, 'MetaCyc': {'CPD-12601'}, 'metanetx.chemical': {'MNXM7967'}, 'SMILE': 'OC[C@H]1O[C@@H](O)[C@@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-RWOPYEJCSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4+,5+,6-/m1/s1'}\n", - "{'MetaCyc': {'CPD-15628'}, 'metanetx.chemical': {'MNXM7114'}, 'SMILE': 'OC[C@H]1O[C@@H](O)[C@H](O)[C@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-QZABAPFNSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4-,5-,6-/m1/s1'}\n", - "{'AraCyc': {'D-Hexoses'}, 'BrachyCyc': {'D-Hexoses'}, 'ChlamyCyc': {'D-Hexoses'}, 'CornCyc': {'D-Hexoses'}, 'MaizeCyc': {'D-Hexoses'}, 'MetaCyc': {'D-Hexoses'}, 'PoplarCyc': {'D-Hexoses'}, 'RiceCyc': {'D-Hexoses'}, 'SorghumCyc': {'D-Hexoses'}, 'SoyCyc': {'D-Hexoses'}, 'SMILE': 'OCC1OC(O)C(O)C(O)C1O', 'InChIKey': 'WQZGKKKJIJFFOK-UHFFFAOYSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2'}\n", - "{'AlgaGEM': {'S_L_45_Galactose_c'}, 'AraGEM': {'S_L_45_Galactose_c'}, 'DF_Athaliana': {'L-GALACTOSE'}, 'KEGG': {'C01825'}, 'MetaCyc': {'L-Galactopyranose', 'CPD-13428'}, 'TS_Athaliana': {'met933_p', 'met933_c'}, 'iRS1563': {'M_C01825_c'}, 'iRS1597': {'C01825_c'}, 'metanetx.chemical': {'MNXM4459', 'MNXM4637'}, 'SMILE': 'OC[C@@H]1OC(O)[C@@H](O)[C@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-DHVFOXMCSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4+,5-,6?/m0/s1'}\n", - "{'AlgaGEM': {'S_alpha_45_D_45_Galactose_c'}, 'AraCyc': {'ALPHA-D-GALACTOSE'}, 'AraGEM': {'S_alpha_45_D_45_Galactose_c'}, 'BrachyCyc': {'ALPHA-D-GALACTOSE'}, 'ChlamyCyc': {'ALPHA-D-GALACTOSE'}, 'CornCyc': {'ALPHA-D-GALACTOSE'}, 'DF_Athaliana': {'ALPHA-D-GALACTOSE'}, 'EcoCyc': {'ALPHA-D-GALACTOSE'}, 'KEGG': {'C00984'}, 'MaizeCyc': {'ALPHA-D-GALACTOSE'}, 'Maize_C4GEM': {'S_alpha_45_D_45_Galactose_c'}, 'MetaCyc': {'ALPHA-D-GALACTOSE'}, 'PlantCyc': {'ALPHA-D-GALACTOSE'}, 'PoplarCyc': {'ALPHA-D-GALACTOSE'}, 'RiceCyc': {'ALPHA-D-GALACTOSE'}, 'SorghumCyc': {'ALPHA-D-GALACTOSE'}, 'SoyCyc': {'ALPHA-D-GALACTOSE'}, 'TS_Athaliana': {'met121_c'}, 'iRS1563': {'M_C00984_c'}, 'iRS1597': {'C00984_c'}, 'SMILE': 'OC[C@H]1O[C@H](O)[C@H](O)[C@@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-PHYPRBDBSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4+,5-,6+/m1/s1'}\n", - "{'KEGG': {'C00738'}, 'MetaCyc': {'Aldopyranoses'}, 'metanetx.chemical': {'MNXM146261', 'MNXM1274'}, 'SMILE': 'OCC1OC(O)C(O)C(O)C1O', 'InChIKey': 'WQZGKKKJIJFFOK-UHFFFAOYSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2'}\n", - "{'BiGG': {'all__D'}, 'BiGG1': {'all-D'}, 'BrachyCyc': {'ALLOSE'}, 'EcoCyc': {'ALLOSE'}, 'KEGG': {'C01487'}, 'MetaCyc': {'D-Allopyranose', 'CPD-15629', 'ALLOSE'}, 'iAF1260': {'all-D'}, 'iMA945': {'all-D'}, 'metanetx.chemical': {'MNXM1919', 'MNXM40570'}, 'SMILE': 'OC[C@H]1OC(O)[C@H](O)[C@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-IVMDWMLBSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4-,5-,6?/m1/s1'}\n", - "{'MetaCyc': {'CPD-15621'}, 'metanetx.chemical': {'MNXM41182'}, 'SMILE': 'OC[C@H]1O[C@H](O)[C@H](O)[C@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-RXRWUWDJSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5-,6+/m1/s1'}\n", - "{'AlgaGEM': {'S_alpha_45_D_45_Glucose_c', 'S_alpha_45_D_45_Glucose_p'}, 'AraCyc': {'ALPHA-GLUCOSE'}, 'AraGEM': {'S_alpha_45_D_45_Glucose_p', 'S_Glucose_c', 'S_Glucose_ext_b', 'S_Glucose_p', 'S_alpha_45_D_45_Glucose_c'}, 'BrachyCyc': {'ALPHA-GLUCOSE'}, 'ChlamyCyc': {'ALPHA-GLUCOSE'}, 'CornCyc': {'ALPHA-GLUCOSE'}, 'DF_Athaliana': {'ALPHA-GLUCOSE'}, 'EcoCyc': {'ALPHA-GLUCOSE'}, 'JP_Creinhardtii_MSB': {'M_glc_DASH_A_h', 'M_glc_DASH_A_c'}, 'KEGG': {'C00267'}, 'MaizeCyc': {'ALPHA-GLUCOSE'}, 'Maize_C4GEM': {'S_Glucose_p', 'S_alpha_45_D_45_Glucose_c', 'S_Glucose_c', 'S_alpha_45_D_45_Glucose_p'}, 'MetaCyc': {'ALPHA-GLUCOSE'}, 'PlantCyc': {'ALPHA-GLUCOSE'}, 'PoplarCyc': {'ALPHA-GLUCOSE'}, 'RiceCyc': {'ALPHA-GLUCOSE'}, 'SorghumCyc': {'ALPHA-GLUCOSE'}, 'SoyCyc': {'ALPHA-GLUCOSE'}, 'TS_Athaliana': {'met123_p', 'met123_m', 'met123_c', 'met123_r', 'met123_v'}, 'iRS1563': {'M_C00031_c', 'M_C00267_p', 'M_C00267_c'}, 'iRS1597': {'C00267_e', 'C00031_c', 'C00267_c', 'C00267_p'}, 'metanetx.chemical': {'MNXM99'}, 'SMILE': 'OC[C@H]1O[C@H](O)[C@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-DVKNGEFBSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4+,5-,6+/m1/s1'}\n", - "{'AraCyc': {'Glucose'}, 'CornCyc': {'Glucose'}, 'MetaCyc': {'Glucose'}, 'PlantCyc': {'Glucose'}, 'PoplarCyc': {'Glucose'}, 'SoyCyc': {'Glucose'}, 'metanetx.chemical': {'MNXM7381'}, 'SMILE': 'OCC1OC(O)[C@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-UWWPDOAWSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2?,3-,4+,5-,6?/m1/s1'}\n", - "{'AraCyc': {'CPD-3607'}, 'BrachyCyc': {'CPD-3607'}, 'EcoCyc': {'CPD-3607'}, 'MetaCyc': {'CPD-3607'}, 'PlantCyc': {'CPD-3607'}, 'metanetx.chemical': {'MNXM18905'}, 'SMILE': 'OC[C@@H]1OC(O)[C@@H](O)[C@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-ZZWDRFIYSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4+,5-,6?/m0/s1'}\n", - "{'MetaCyc': {'CPD-15624'}, 'metanetx.chemical': {'MNXM41423'}, 'SMILE': 'OC[C@@H]1O[C@@H](O)[C@@H](O)[C@@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-BYIBVSMXSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5-,6+/m0/s1'}\n", - "{'BrachyCyc': {'ALTROSE'}, 'EcoCyc': {'ALTROSE'}, 'KEGG': {'C06464'}, 'MetaCyc': {'ALTROSE', 'D-altropyranoses'}, 'metanetx.chemical': {'MNXM48393', 'MNXM17055'}, 'SMILE': 'OC[C@H]1OC(O)[C@@H](O)[C@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-RSVSWTKNSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4-,5+,6?/m1/s1'}\n", - "{'MetaCyc': {'CPD-15762'}, 'metanetx.chemical': {'MNXM491238'}, 'SMILE': 'OC[C@H]1O[C@H](O)[C@@H](O)[C@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-TVIMKVIFSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3-,4-,5+,6+/m1/s1'}\n", - "{'AraCyc': {'L-GALACTOSE'}, 'BrachyCyc': {'L-GALACTOSE'}, 'ChlamyCyc': {'L-GALACTOSE'}, 'CornCyc': {'L-GALACTOSE'}, 'EcoCyc': {'L-GALACTOSE'}, 'MaizeCyc': {'L-GALACTOSE'}, 'MetaCyc': {'L-GALACTOSE'}, 'PlantCyc': {'L-GALACTOSE'}, 'PoplarCyc': {'L-GALACTOSE'}, 'RiceCyc': {'L-GALACTOSE'}, 'SorghumCyc': {'L-GALACTOSE'}, 'SoyCyc': {'L-GALACTOSE'}, 'metanetx.chemical': {'MNXM7129'}, 'SMILE': 'OC[C@@H]1O[C@H](O)[C@@H](O)[C@H](O)[C@@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-KGJVWPDLSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4+,5-,6-/m0/s1'}\n", - "{'AlgaGEM': {'S_D_45_Galactose_c'}, 'AraGEM': {'S_D_45_Galactose_c'}, 'BiGG': {'gal'}, 'BiGG1': {'gal'}, 'DF_Athaliana': {'D-Galactose'}, 'JP_Creinhardtii_MSB': {'M_gal_c', 'M_gal_h', 'M_gal_n'}, 'KEGG': {'C00124'}, 'Maize_C4GEM': {'S_D_45_Galactose_c'}, 'MetaCyc': {'CPD-15590', 'D-galactopyranose'}, 'iAF1260': {'gal'}, 'iAG612': {'cbs_292'}, 'iAO358': {'cll_457', 'cll_197'}, 'iGT196': {'gal'}, 'iIN800': {'gal'}, 'iIT341': {'gal'}, 'iJR904': {'gal'}, 'iMA945': {'gal'}, 'iMEO21': {'gal'}, 'iMM904': {'gal'}, 'iND750': {'gal'}, 'iNJ661': {'gal'}, 'iPS189': {'gal'}, 'iRR1083': {'gal'}, 'iRS1563': {'M_C00124_c', 'M_C00124_p'}, 'iRS1597': {'C00124_c'}, 'iSO783': {'gal'}, 'iYO844': {'gal'}, 'metanetx.chemical': {'MNXM162496', 'MNXM390'}, 'SMILE': 'OC[C@H]1OC(O)[C@H](O)[C@@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-SVZMEOIVSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4+,5-,6?/m1/s1'}\n", - "{'MetaCyc': {'CPD-15757'}, 'metanetx.chemical': {'MNXM491959'}, 'SMILE': 'OC[C@H]1O[C@@H](O)[C@@H](O)[C@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-FDROIEKHSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4-,5+,6-/m1/s1'}\n", - "{'MetaCyc': {'CPD-15759'}, 'metanetx.chemical': {'MNXM491967'}, 'SMILE': 'OC[C@H]1O[C@@H](O)[C@@H](O)[C@@H](O)[C@H]1O', 'InChIKey': 'WQZGKKKJIJFFOK-QBFJYBIGSA-N', 'InChI': 'InChI=1S/C6H12O6/c7-1-2-3(8)4(9)5(10)6(11)12-2/h2-11H,1H2/t2-,3+,4+,5+,6-/m1/s1'}\n" + "Pyruvate\n", + "L-Lactate\n" ] } ], "source": [ - "for cpd in modelseed.find_compounds_by_inchi_key('WQZGKKKJIJFFOK-FPRJBGLDSG-K', True):\n", - " print(cpd.annotation)" + "cpd_pyruvate = modelseed.compounds.cpd00020\n", + "print(cpd_pyruvate.name)\n", + "cpd_lactate = modelseed.compounds.get_by_id('cpd00159')\n", + "print(cpd_lactate.name)" ] }, { - "cell_type": "code", - "execution_count": 18, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'set' object is not subscriptable", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/tmp/ipykernel_2350511/2162892026.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'N'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'cpd00709'\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: 'set' object is not subscriptable" - ] - } - ], "source": [ - "s = {'N', 'cpd00709'}\n", - "s[1]" + "### Read Aliases" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "for r in modelseed.reactions:\n", - " print(r.delta_g, r.delta_g_error, type(r.delta_g), type(r.delta_g_error))\n", - " break" - ] - }, - { - "cell_type": "code", - "execution_count": 21, + "execution_count": 4, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "modelseedpy.biochem.modelseed_biochem.ModelSEEDDatabase" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "Aliases dict_keys(['AlgaGEM', 'AraCyc', 'AraGEM', 'BiGG', 'BiGG1', 'BrachyCyc', 'ChlamyCyc', 'CornCyc', 'DF_Athaliana', 'EcoCyc', 'JM_Creinhardtii', 'JP_Creinhardtii_MSB', 'JP_Creinhardtii_NMeth', 'KEGG', 'MaizeCyc', 'Maize_C4GEM', 'MetaCyc', 'PlantCyc', 'PoplarCyc', 'RiceCyc', 'SorghumCyc', 'SoyCyc', 'TS_Athaliana', 'iAF1260', 'iAF692', 'iAG612', 'iAO358', 'iAbaylyiv4', 'iGT196', 'iIN800', 'iIT341', 'iJN746', 'iJR904', 'iMA945', 'iMEO21', 'iMM904', 'iMO1053-PAO1', 'iMO1056', 'iND750', 'iNJ661', 'iPS189', 'iRR1083', 'iRS1563', 'iRS1597', 'iSB619', 'iSO783', 'iYO844', 'metanetx.chemical', 'SMILE', 'InChIKey', 'InChI'])\n", + "KEGG {'C00022'}\n" + ] } ], "source": [ - "type(modelseed)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "template_reaction = r.to_template_reaction({0: 'c'})" + "print('Aliases', cpd_pyruvate.annotation.keys())\n", + "print('KEGG', cpd_pyruvate.annotation['KEGG'])" ] }, { - "cell_type": "code", - "execution_count": 6, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'AraCyc': {'RXN-11623'},\n", - " 'CornCyc': {'RXN-11623'},\n", - " 'KEGG': {'R09562'},\n", - " 'MetaCyc': {'RXN-11623'},\n", - " 'PlantCyc': {'RXN-11623'},\n", - " 'PoplarCyc': {'RXN-11623'},\n", - " 'SoyCyc': {'RXN-11623'},\n", - " 'metanetx.reaction': {'MNXR112981'},\n", - " 'rhea': {'30232', '30234'},\n", - " 'ec-code': {'1.8.3.5', '1.8.3.6'}}" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "template_reaction.annotation" + "### Read Structures" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'C00001', 'C01328'}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "modelseed.compound_aliases['cpd00001']['KEGG']" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "kbase = cobrakbase.KBaseAPI()" - ] - }, - { - "cell_type": "code", - "execution_count": 102, - "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "12218/444/1\n" + "SMILES C[C@H](O)C(=O)[O-]\n", + "InChI InChI=1S/C3H6O3/c1-2(4)3(5)6/h2,4H,1H3,(H,5,6)/p-1/t2-/m0/s1\n", + "InChI Key JVTAAEKCZFNVCJ-REOHCLBHSA-M\n" ] } ], "source": [ - "template = kbase.get_from_ws('CoreBacteria_updated', 12218)\n", - "print(template.info)" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "database_path = '../../../ModelSEEDDatabase'\n", - "def _load_aliases_df(df_aliases):\n", - " aliases = {}\n", - " for i in df_aliases.itertuples():\n", - " seed_id = i[1]\n", - " alias_id = i[2]\n", - " source = i[3]\n", - " if seed_id not in aliases:\n", - " aliases[seed_id] = {}\n", - " if source not in aliases[seed_id]:\n", - " aliases[seed_id][source] = set()\n", - " aliases[seed_id][source].add(alias_id)\n", - " return aliases" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - " compound_aliases_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Compound_Aliases.txt'\n", - " reaction_aliases_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Aliases.txt'\n", - " compound_aliases = _load_aliases_df(pd.read_csv(compound_aliases_url, index_col=None, sep='\\t'))\n", - " reaction_aliases = _load_aliases_df(pd.read_csv(reaction_aliases_url, index_col=None, sep='\\t'))\n", - "\n", - " compound_names_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Compound_Names.txt'\n", - " reaction_names_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Names.txt'\n", - " compound_names = _load_aliases_df(pd.read_csv(compound_names_url, index_col=None, sep='\\t'))\n", - " reaction_names = _load_aliases_df(pd.read_csv(reaction_names_url, index_col=None, sep='\\t'))\n", - "\n", - " reaction_ecs_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_ECs.txt'\n", - " reaction_ecs = _load_aliases_df(pd.read_csv(reaction_ecs_url, index_col=None, sep='\\t'))" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'Enzyme Class': {'3.6.1.1'}}" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "reaction_ecs['rxn00001']" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'rxn00001': {'3.6.1.1'},\n", - " 'rxn00002': {'3.5.1.54'},\n", - " 'rxn00003': {'2.2.1.6'},\n", - " 'rxn00004': {'4.1.3.17'},\n", - " 'rxn00006': {'1.11.1.21', '1.11.1.6'},\n", - " 'rxn00007': {'3.2.1.28'},\n", - " 'rxn00008': {'1.11.1.13'},\n", - " 'rxn00009': {'2.7.7.45'},\n", - " 'rxn00010': {'4.1.1.47'},\n", - " 'rxn00011': {'1.2.4.1', '2.2.1.6', '4.1.1.1'},\n", - " 'rxn00012': {'2.4.1.99'},\n", - " 'rxn00013': {'2.7.1.41'},\n", - " 'rxn00014': {'1.11.1.5'},\n", - " 'rxn00015': {'2.5.1.44'},\n", - " 'rxn00016': {'3.2.1.52'},\n", - " 'rxn00017': {'1.7.1.5'},\n", - " 'rxn00018': {'4.1.1.39'},\n", - " 'rxn00019': {'1.13.11.32'},\n", - " 'rxn00020': {'3.2.1.21'},\n", - " 'rxn00021': {'4.1.2.38'},\n", - " 'rxn00022': {'3.2.1.20'},\n", - " 'rxn00023': {'1.8.2.2'},\n", - " 'rxn00024': {'1.10.3.1'},\n", - " 'rxn00025': {'1.13.11.63', '1.14.99.36'},\n", - " 'rxn00026': {'1.1.3.23'},\n", - " 'rxn00027': {'4.1.99.3'},\n", - " 'rxn00028': {'1.10.3.3'},\n", - " 'rxn00029': {'4.2.1.24'},\n", - " 'rxn00030': {'4.1.2.35'},\n", - " 'rxn00031': {'2.4.1.166'},\n", - " 'rxn00032': {'1.1.3.17'},\n", - " 'rxn00033': {'1.2.3.13'},\n", - " 'rxn00034': {'1.13.11.43'},\n", - " 'rxn00035': {'1.21.3.2'},\n", - " 'rxn00036': {'1.10.3.1'},\n", - " 'rxn00037': {'1.14.99.-'},\n", - " 'rxn00038': {'3.1.1.22'},\n", - " 'rxn00039': {'2.3.1.90'},\n", - " 'rxn00040': {'3.1.1.20'},\n", - " 'rxn00041': {'3.1.1.40'},\n", - " 'rxn00042': {'1.1.3.28'},\n", - " 'rxn00043': {'1.10.3.1', '1.14.18.1'},\n", - " 'rxn00044': {'3.5.1.46'},\n", - " 'rxn00045': {'2.4.1.95'},\n", - " 'rxn00046': {'2.3.1.103'},\n", - " 'rxn00047': {'4.2.2.6'},\n", - " 'rxn00048': {'2.5.1.9'},\n", - " 'rxn00050': {'1.14.13.-'},\n", - " 'rxn00052': {'1.1.3.23'},\n", - " 'rxn00053': {'1.14.99.1'},\n", - " 'rxn00054': {'1.10.3.4'},\n", - " 'rxn00055': {'2.5.1.43'},\n", - " 'rxn00056': {'1.16.3.1'},\n", - " 'rxn00057': {'1.1.3.14', '1.10.3.1'},\n", - " 'rxn00058': {'1.7.2.1', '1.9.3.1'},\n", - " 'rxn00059': {'1.10.3.2'},\n", - " 'rxn00060': {'2.5.1.61', '4.3.1.8'},\n", - " 'rxn00061': {'3.6.1.5'},\n", - " 'rxn00062': {'3.6.1.15',\n", - " '3.6.1.3',\n", - " '3.6.1.5',\n", - " '3.6.1.8',\n", - " '3.6.3.1',\n", - " '3.6.3.10',\n", - " '3.6.3.11',\n", - " '3.6.3.12',\n", - " '3.6.3.14',\n", - " '3.6.3.15',\n", - " '3.6.3.16',\n", - " '3.6.3.17',\n", - " '3.6.3.18',\n", - " '3.6.3.19',\n", - " '3.6.3.2',\n", - " '3.6.3.20',\n", - " '3.6.3.21',\n", - " '3.6.3.22',\n", - " '3.6.3.23',\n", - " '3.6.3.24',\n", - " '3.6.3.25',\n", - " '3.6.3.26',\n", - " '3.6.3.27',\n", - " '3.6.3.28',\n", - " '3.6.3.29',\n", - " '3.6.3.3',\n", - " '3.6.3.30',\n", - " '3.6.3.31',\n", - " '3.6.3.32',\n", - " '3.6.3.33',\n", - " '3.6.3.34',\n", - " '3.6.3.35',\n", - " '3.6.3.36',\n", - " '3.6.3.37',\n", - " '3.6.3.38',\n", - " '3.6.3.39',\n", - " '3.6.3.4',\n", - " '3.6.3.40',\n", - " '3.6.3.41',\n", - " '3.6.3.42',\n", - " '3.6.3.43',\n", - " '3.6.3.44',\n", - " '3.6.3.46',\n", - " '3.6.3.47',\n", - " '3.6.3.48',\n", - " '3.6.3.49',\n", - " '3.6.3.5',\n", - " '3.6.3.50',\n", - " '3.6.3.51',\n", - " '3.6.3.52',\n", - " '3.6.3.53',\n", - " '3.6.3.54',\n", - " '3.6.3.55',\n", - " '3.6.3.6',\n", - " '3.6.3.7',\n", - " '3.6.3.8',\n", - " '3.6.3.9',\n", - " '3.6.4.1',\n", - " '3.6.4.10',\n", - " '3.6.4.11',\n", - " '3.6.4.12',\n", - " '3.6.4.13',\n", - " '3.6.4.2',\n", - " '3.6.4.3',\n", - " '3.6.4.4',\n", - " '3.6.4.5',\n", - " '3.6.4.6',\n", - " '3.6.4.7',\n", - " '3.6.4.8',\n", - " '3.6.4.9',\n", - " '5.6.1.c',\n", - " '5.6.1.d',\n", - " '5.6.1.f',\n", - " '5.6.1.g',\n", - " '7.3.2.a',\n", - " '7.3.2.f',\n", - " '7.5.2.h',\n", - " '7.5.2.j',\n", - " '7.5.2.l',\n", - " '7.6.2.c',\n", - " '7.6.2.f'},\n", - " 'rxn00063': {'3.6.1.8'},\n", - " 'rxn00064': {'3.5.4.18'},\n", - " 'rxn00065': {'4.6.1.1'},\n", - " 'rxn00066': {'1.11.1.1'},\n", - " 'rxn00067': {'1.8.1.14', '1.8.1.M1'},\n", - " 'rxn00068': {'1.16.1.7'},\n", - " 'rxn00069': {'1.4.1.14'},\n", - " 'rxn00070': {'1.8.1.7'},\n", - " 'rxn00071': {'1.6.5.4'},\n", - " 'rxn00072': {'1.16.1.3'},\n", - " 'rxn00074': {'1.16.1.4'},\n", - " 'rxn00075': {'3.2.2.5', '3.2.2.6'},\n", - " 'rxn00076': {'3.6.1.22', '3.6.1.9'},\n", - " 'rxn00077': {'2.7.1.23'},\n", - " 'rxn00078': {'2.7.1.86'},\n", - " 'rxn00079': {'1.6.2.4'},\n", - " 'rxn00080': {'1.16.1.5'},\n", - " 'rxn00082': {'1.14.13.39'},\n", - " 'rxn00083': {'1.6.1.1', '1.6.1.2', '1.6.1.3'},\n", - " 'rxn00084': {'1.11.1.2'},\n", - " 'rxn00085': {'1.4.1.13'},\n", - " 'rxn00086': {'1.6.4.2', '1.8.1.7'},\n", - " 'rxn00087': {'1.8.1.10'},\n", - " 'rxn00088': {'3.1.3.-', '3.1.3.2'},\n", - " 'rxn00089': {'3.2.2.5', '3.2.2.6'},\n", - " 'rxn00090': {'1.8.3.3'},\n", - " 'rxn00091': {'1.13.99.-'},\n", - " 'rxn00092': {'3.6.1.5'},\n", - " 'rxn00093': {'3.5.4.17', '3.5.4.7'},\n", - " 'rxn00095': {'3.6.1.41'},\n", - " 'rxn00096': {'2.7.7.53'},\n", - " 'rxn00097': {'2.7.4.3'},\n", - " 'rxn00098': {'3.6.1.14'},\n", - " 'rxn00099': {'4.2.1.93'},\n", - " 'rxn00100': {'2.7.1.24'},\n", - " 'rxn00101': {'3.5.1.5'},\n", - " 'rxn00102': {'4.2.1.1'},\n", - " 'rxn00103': {'1.17.1.10', '1.2.1.43'},\n", - " 'rxn00104': {'2.7.4.1'},\n", - " 'rxn00105': {'2.7.7.1', '2.7.7.18'},\n", - " 'rxn00106': {'3.6.1.1', '3.6.1.25'},\n", - " 'rxn00107': {'2.7.4.6'},\n", - " 'rxn00108': {'2.7.4.12'},\n", - " 'rxn00109': {'1.7.1.10', '1.7.99.1'},\n", - " 'rxn00110': {'1.14.13.35'},\n", - " 'rxn00111': {'1.14.13.35'},\n", - " 'rxn00112': {'1.13.12.-'},\n", - " 'rxn00113': {'6.3.4.16', '6.3.4.16-'},\n", - " 'rxn00114': {'2.7.2.2'},\n", - " 'rxn00116': {'3.6.1.5', '3.6.1.6'},\n", - " 'rxn00117': {'2.7.4.6'},\n", - " 'rxn00118': {'2.7.4.10'},\n", - " 'rxn00119': {'2.7.4.14', '2.7.4.22', '2.7.4.4'},\n", - " 'rxn00120': {'3.6.1.15', '3.6.1.39', '3.6.1.5'},\n", - " 'rxn00121': {'3.6.1.18', '3.6.1.9'},\n", - " 'rxn00122': {'2.7.7.2'},\n", - " 'rxn00123': {'3.1.3.74'},\n", - " 'rxn00124': {'2.7.1.35'},\n", - " 'rxn00125': {'3.3.1.2'},\n", - " 'rxn00126': {'2.5.1.6'},\n", - " 'rxn00127': {'4.1.1.50'},\n", - " 'rxn00128': {'4.4.1.14'},\n", - " 'rxn00129': {'2.5.1.4'},\n", - " 'rxn00130': {'3.5.4.17', '3.5.4.6'},\n", - " 'rxn00131': {'3.2.2.4'},\n", - " 'rxn00132': {'3.1.3.5'},\n", - " 'rxn00133': {'3.6.1.17', '3.6.1.61'},\n", - " 'rxn00134': {'2.7.1.20', '2.7.1.74'},\n", - " 'rxn00135': {'3.6.1.29'},\n", - " 'rxn00136': {'3.6.1.29'},\n", - " 'rxn00137': {'3.1.3.7'},\n", - " 'rxn00138': {'6.3.1.5', '6.3.5.1'},\n", - " 'rxn00139': {'2.4.2.7', '2.4.2.8'},\n", - " 'rxn00140': {'3.1.4.17', '3.1.4.53'},\n", - " 'rxn00141': {'3.3.1.1'},\n", - " 'rxn00142': {'3.5.4.28'},\n", - " 'rxn00143': {'3.2.2.9'},\n", - " 'rxn00144': {'4.3.1.15'},\n", - " 'rxn00145': {'1.1.2.3'},\n", - " 'rxn00146': {'1.1.2.4'},\n", - " 'rxn00147': {'2.7.9.2'},\n", - " 'rxn00148': {'2.7.1.40'},\n", - " 'rxn00149': {'1.2.1.22', '1.2.1.23', '1.2.1.3'},\n", - " 'rxn00150': {'1.2.1.49'},\n", - " 'rxn00151': {'2.7.9.1'},\n", - " 'rxn00152': {'1.2.3.3'},\n", - " 'rxn00153': {'3.1.3.60'},\n", - " 'rxn00154': {'1.2.1.-', '1.2.1.M10', '1.2.4.1', '1.8.1.4', '2.3.1.12'},\n", - " 'rxn00155': {'1.2.1.51'},\n", - " 'rxn00156': {'1.2.3.6'},\n", - " 'rxn00157': {'2.3.1.54'},\n", - " 'rxn00158': {'4.3.1.13'},\n", - " 'rxn00159': {'1.1.1.38', '1.1.1.39'},\n", - " 'rxn00160': {'1.1.1.83'},\n", - " 'rxn00161': {'1.1.1.40'},\n", - " 'rxn00162': {'1.1.1.38', '1.1.1.40', '4.1.1.112', '4.1.1.3'},\n", - " 'rxn00163': {'4.1.1.78'},\n", - " 'rxn00164': {'4.1.1.-'},\n", - " 'rxn00165': {'4.2.1.13', '4.3.1.17', '4.3.1.19'},\n", - " 'rxn00166': {'4.3.1.18'},\n", - " 'rxn00168': {'4.1.1.1'},\n", - " 'rxn00170': {'3.1.2.1'},\n", - " 'rxn00171': {'1.2.1.10'},\n", - " 'rxn00172': {'6.2.1.13'},\n", - " 'rxn00173': {'2.3.1.8'},\n", - " 'rxn00174': {'4.1.1.9'},\n", - " 'rxn00175': {'6.2.1.1'},\n", - " 'rxn00176': {'6.2.1.1'},\n", - " 'rxn00177': {'4.1.3.24', '4.1.3.25'},\n", - " 'rxn00178': {'2.3.1.9'},\n", - " 'rxn00179': {'2.7.2.11'},\n", - " 'rxn00181': {'2.7.2.13'},\n", - " 'rxn00182': {'1.4.1.2', '1.4.1.3', '1.4.1.4'},\n", - " 'rxn00183': {'1.2.1.88', '1.5.1.12'},\n", - " 'rxn00184': {'1.4.1.3', '1.4.1.4'},\n", - " 'rxn00185': {'1.4.3.11'},\n", - " 'rxn00186': {'3.5.2.9'},\n", - " 'rxn00187': {'6.3.1.2'},\n", - " 'rxn00188': {'3.5.1.87'},\n", - " 'rxn00189': {'3.5.1.2', '3.5.1.38', '6.3.5.4', '6.3.5.5'},\n", - " 'rxn00190': {'6.3.5.1'},\n", - " 'rxn00191': {'2.6.1.2'},\n", - " 'rxn00192': {'2.3.1.1'},\n", - " 'rxn00193': {'5.1.1.3'},\n", - " 'rxn00194': {'4.1.1.15'},\n", - " 'rxn00195': {'5.4.99.1'},\n", - " 'rxn00196': {'1.2.1.26', '1.2.1.3'},\n", - " 'rxn00197': {'1.2.1.52'},\n", - " 'rxn00198': {'1.1.1.42'},\n", - " 'rxn00199': {'1.1.1.42', '4.1.1.-'},\n", - " 'rxn00200': {'3.5.1.-', '3.5.1.111', '3.5.1.3'},\n", - " 'rxn00202': {'2.3.3.14', '4.1.3.21'},\n", - " 'rxn00203': {'4.1.1.71'},\n", - " 'rxn00204': {'1.2.3.4'},\n", - " 'rxn00205': {'1.11.1.9'},\n", - " 'rxn00206': {'1.15.1.1'},\n", - " 'rxn00207': {'1.2.2.4'},\n", - " 'rxn00208': {'1.4.3.5'},\n", - " 'rxn00209': {'1.4.3.5'},\n", - " 'rxn00210': {'1.4.3.15', '1.4.3.7'},\n", - " 'rxn00211': {'1.1.1.22'},\n", - " 'rxn00212': {'3.6.1.45', '3.6.1.8', '3.6.1.9'},\n", - " 'rxn00213': {'2.7.7.9'},\n", - " 'rxn00214': {'5.1.3.2'},\n", - " 'rxn00215': {'4.2.1.76'},\n", - " 'rxn00216': {'2.7.1.1', '2.7.1.2'},\n", - " 'rxn00217': {'1.1.1.118', '1.1.1.121'},\n", - " 'rxn00218': {'1.1.1.119'},\n", - " 'rxn00219': {'1.1.3.10'},\n", - " 'rxn00220': {'3.1.3.58', '3.1.3.9'},\n", - " 'rxn00221': {'3.1.3.10'},\n", - " 'rxn00222': {'3.2.1.21', '3.2.1.74'},\n", - " 'rxn00223': {'5.3.1.5'},\n", - " 'rxn00224': {'4.99.1.1'},\n", - " 'rxn00225': {'2.7.2.1', '2.7.2.15'},\n", - " 'rxn00226': {'6.2.1.1'},\n", - " 'rxn00227': {'3.6.1.7'},\n", - " 'rxn00228': {'3.11.1.2'},\n", - " 'rxn00229': {'1.13.12.4'},\n", - " 'rxn00230': {'2.7.2.12'},\n", - " 'rxn00231': {'3.5.1.4'},\n", - " 'rxn00232': {'3.6.1.20'},\n", - " 'rxn00233': {'3.7.1.6'},\n", - " 'rxn00234': {'4.1.3.22'},\n", - " 'rxn00235': {'3.1.1.33'},\n", - " 'rxn00236': {'3.6.1.42', '3.6.1.5', '3.6.1.6'},\n", - " 'rxn00237': {'2.7.4.6'},\n", - " 'rxn00238': {'2.7.4.6'},\n", - " 'rxn00239': {'2.7.4.8'},\n", - " 'rxn00240': {'2.7.4.10'},\n", - " 'rxn00241': {'3.6.1.15',\n", - " '3.6.1.5',\n", - " '3.6.5.1',\n", - " '3.6.5.2',\n", - " '3.6.5.3',\n", - " '3.6.5.4',\n", - " '3.6.5.5',\n", - " '3.6.5.6'},\n", - " 'rxn00242': {'3.1.7.2'},\n", - " 'rxn00243': {'3.2.1.42'},\n", - " 'rxn00244': {'3.7.1.1'},\n", - " 'rxn00245': {'4.2.1.32'},\n", - " 'rxn00247': {'4.1.1.49'},\n", - " 'rxn00248': {'1.1.1.299', '1.1.1.37'},\n", - " 'rxn00249': {'1.1.1.299', '1.1.1.82'},\n", - " 'rxn00250': {'6.4.1.1'},\n", - " 'rxn00251': {'4.1.1.31'},\n", - " 'rxn00252': {'4.1.1.38'},\n", - " 'rxn00253': {'4.3.1.20'},\n", - " 'rxn00254': {'3.5.1.-', '3.5.1.3'},\n", - " 'rxn00255': {'4.1.3.17'},\n", - " 'rxn00256': {'2.3.3.1', '2.3.3.16', '2.3.3.3', '4.1.3.7'},\n", - " 'rxn00257': {'2.3.3.8'},\n", - " 'rxn00258': {'2.1.3.1'},\n", - " 'rxn00259': {'4.1.3.34'},\n", - " 'rxn00260': {'2.6.1.1'},\n", - " 'rxn00261': {'1.13.11.-'},\n", - " 'rxn00262': {'1.4.3.16', '1.4.3.2'},\n", - " 'rxn00263': {'1.4.3.1', '1.4.3.15'},\n", - " 'rxn00264': {'1.1.3.3'},\n", - " 'rxn00265': {'4.1.3.6'},\n", - " 'rxn00266': {'5.3.2.2'},\n", - " 'rxn00267': {'1.4.2.1'},\n", - " 'rxn00268': {'1.4.1.1', '1.4.1.10'},\n", - " 'rxn00269': {'1.4.3.19', '1.4.3.2', '1.4.3.3'},\n", - " 'rxn00270': {'2.1.1.156', '2.1.1.162', '2.1.1.20'},\n", - " 'rxn00271': {'1.5.1.22'},\n", - " 'rxn00272': {'2.6.1.44'},\n", - " 'rxn00273': {'2.3.1.29'},\n", - " 'rxn00274': {'2.3.1.29'},\n", - " 'rxn00275': {'2.6.1.4', '2.6.1.44'},\n", - " 'rxn00276': {'2.6.1.35'},\n", - " 'rxn00278': {'1.4.1.1'},\n", - " 'rxn00279': {'4.1.1.12'},\n", - " 'rxn00280': {'1.5.1.17'},\n", - " 'rxn00281': {'2.3.1.-'},\n", - " 'rxn00282': {'2.6.1.12'},\n", - " 'rxn00283': {'5.1.1.1'},\n", - " 'rxn00284': {'1.3.1.6'},\n", - " 'rxn00285': {'6.2.1.5'},\n", - " 'rxn00286': {'2.8.3.-', '2.8.3.22'},\n", - " 'rxn00287': {'3.1.2.3'},\n", - " 'rxn00288': {'1.3.99.1'},\n", - " 'rxn00289': {'4.1.3.30'},\n", - " 'rxn00290': {'2.8.3.5'},\n", - " 'rxn00291': {'3.5.1.96'},\n", - " 'rxn00292': {'3.2.1.183', '5.1.3.14'},\n", - " 'rxn00293': {'2.7.7.23'},\n", - " 'rxn00295': {'5.1.3.2', '5.1.3.7'},\n", - " 'rxn00297': {'5.1.3.14'},\n", - " 'rxn00298': {'1.1.1.136'},\n", - " 'rxn00299': {'3.5.4.16'},\n", - " 'rxn00300': {'3.5.4.25'},\n", - " 'rxn00301': {'3.6.1.19', '3.6.1.8'},\n", - " 'rxn00302': {'3.5.4.16'},\n", - " 'rxn00303': {'2.7.6.5'},\n", - " 'rxn00304': {'2.7.1.40'},\n", - " 'rxn00305': {'4.1.1.32'},\n", - " 'rxn00306': {'6.2.1.4'},\n", - " 'rxn00307': {'4.6.1.1', '4.6.1.2'},\n", - " 'rxn00308': {'1.4.1.15'},\n", - " 'rxn00309': {'1.4.1.18'},\n", - " 'rxn00310': {'1.4.3.14'},\n", - " 'rxn00311': {'1.14.13.59'},\n", - " 'rxn00312': {'1.13.12.2'},\n", - " 'rxn00313': {'4.1.1.20'},\n", - " 'rxn00314': {'1.5.1.16'},\n", - " 'rxn00315': {'2.6.1.71'},\n", - " 'rxn00316': {'2.3.1.-'},\n", - " 'rxn00317': {'2.6.1.36'},\n", - " 'rxn00318': {'3.5.1.17'},\n", - " 'rxn00319': {'4.3.1.28'},\n", - " 'rxn00320': {'5.1.1.5', '5.1.1.9'},\n", - " 'rxn00321': {'5.4.3.2'},\n", - " 'rxn00322': {'4.1.1.18'},\n", - " 'rxn00323': {'3.5.2.11'},\n", - " 'rxn00324': {'1.1.1.26', '1.1.1.79'},\n", - " 'rxn00325': {'1.2.3.5'},\n", - " 'rxn00326': {'1.2.1.17'},\n", - " 'rxn00327': {'3.5.1.116', '3.5.3.19'},\n", - " 'rxn00328': {'4.1.3.16', '4.1.3.42'},\n", - " 'rxn00330': {'2.3.3.9', '4.1.3.2'},\n", - " 'rxn00331': {'4.1.3.24'},\n", - " 'rxn00332': {'2.2.1.5'},\n", - " 'rxn00333': {'1.1.3.15'},\n", - " 'rxn00334': {'4.1.3.13'},\n", - " 'rxn00335': {'4.1.3.14'},\n", - " 'rxn00336': {'4.1.3.1'},\n", - " 'rxn00337': {'2.7.2.4'},\n", - " 'rxn00338': {'1.4.3.16'},\n", - " 'rxn00339': {'6.3.1.4'},\n", - " 'rxn00340': {'6.3.1.1', '6.3.5.4'},\n", - " 'rxn00341': {'3.5.1.7'},\n", - " 'rxn00342': {'3.5.1.1', '3.5.1.38'},\n", - " 'rxn00343': {'3.5.5.4'},\n", - " 'rxn00344': {'2.3.1.17'},\n", - " 'rxn00345': {'3.5.1.15'},\n", - " 'rxn00346': {'4.1.1.11', '4.1.1.15'},\n", - " 'rxn00347': {'3.5.1.38', '4.3.1.1'},\n", - " 'rxn00348': {'5.1.1.13'},\n", - " 'rxn00350': {'2.3.2.2', '3.4.19.13'},\n", - " 'rxn00351': {'6.3.2.3'},\n", - " 'rxn00352': {'3.1.2.13'},\n", - " 'rxn00353': {'1.8.4.-'},\n", - " 'rxn00354': {'1.1.1.-'},\n", - " 'rxn00355': {'2.7.7.10'},\n", - " 'rxn00356': {'2.4.1.22'},\n", - " 'rxn00357': {'2.7.8.18'},\n", - " 'rxn00358': {'5.4.99.9'},\n", - " 'rxn00359': {'3.6.1.9', '3.6.2.2'},\n", - " 'rxn00360': {'3.1.3.7'},\n", - " 'rxn00361': {'2.7.1.25'},\n", - " 'rxn00362': {'3.2.2.10'},\n", - " 'rxn00363': {'3.1.3.5', '3.1.3.91'},\n", - " 'rxn00364': {'2.7.4.14', '2.7.4.25'},\n", - " 'rxn00365': {'2.7.1.-', '2.7.1.213', '2.7.1.48'},\n", - " 'rxn00366': {'3.6.1.5', '3.6.1.6'},\n", - " 'rxn00367': {'3.6.1.-', '3.6.1.65', '3.6.1.8'},\n", - " 'rxn00368': {'2.7.1.48'},\n", - " 'rxn00369': {'2.7.1.-', '2.7.1.48'},\n", - " 'rxn00370': {'2.7.2.6'},\n", - " 'rxn00371': {'1.17.1.9', '1.2.1.2'},\n", - " 'rxn00372': {'3.1.2.10'},\n", - " 'rxn00373': {'4.1.1.2'},\n", - " 'rxn00374': {'3.5.1.49'},\n", - " 'rxn00375': {'3.5.1.68'},\n", - " 'rxn00376': {'3.5.1.15', '3.5.1.8'},\n", - " 'rxn00377': {'3.1.2.12'},\n", - " 'rxn00378': {'1.8.2.1'},\n", - " 'rxn00379': {'2.7.7.4'},\n", - " 'rxn00380': {'2.7.7.5'},\n", - " 'rxn00381': {'3.6.2.1'},\n", - " 'rxn00382': {'4.3.1.10'},\n", - " 'rxn00383': {'1.8.3.1'},\n", - " 'rxn00384': {'3.1.6.3'},\n", - " 'rxn00385': {'2.8.2.15'},\n", - " 'rxn00386': {'2.8.2.15'},\n", - " 'rxn00387': {'2.8.2.15'},\n", - " 'rxn00388': {'3.5.5.1', '3.5.5.2', '3.5.5.5', '3.5.5.7'},\n", - " 'rxn00389': {'3.5.1.17'},\n", - " 'rxn00390': {'3.5.1.15'},\n", - " 'rxn00391': {'3.1.3.-', '3.1.3.102', '3.1.3.2'},\n", - " 'rxn00392': {'2.7.1.26'},\n", - " 'rxn00393': {'2.7.1.42'},\n", - " 'rxn00394': {'3.5.3.1'},\n", - " 'rxn00395': {'3.5.3.6'},\n", - " 'rxn00396': {'2.7.3.3'},\n", - " 'rxn00397': {'2.4.2.31'},\n", - " 'rxn00398': {'1.4.3.-', '1.4.3.2'},\n", - " 'rxn00399': {'1.14.13.39'},\n", - " 'rxn00400': {'1.14.13.39'},\n", - " 'rxn00401': {'1.13.12.1'},\n", - " 'rxn00402': {'1.5.1.11'},\n", - " 'rxn00403': {'1.5.1.19'},\n", - " 'rxn00404': {'2.1.4.1'},\n", - " 'rxn00405': {'4.1.1.19'},\n", - " 'rxn00406': {'5.1.1.9'},\n", - " 'rxn00407': {'3.5.4.13'},\n", - " 'rxn00408': {'3.6.1.15', '3.6.1.5'},\n", - " 'rxn00409': {'2.7.4.6'},\n", - " 'rxn00410': {'6.3.4.2'},\n", - " 'rxn00411': {'2.7.1.40'},\n", - " 'rxn00412': {'6.3.4.2'},\n", - " 'rxn00413': {'4.6.1.6'},\n", - " 'rxn00414': {'6.3.5.5'},\n", - " 'rxn00415': {'2.6.1.15'},\n", - " 'rxn00416': {'6.3.5.4'},\n", - " 'rxn00417': {'5.1.1.10'},\n", - " 'rxn00418': {'2.7.7.-'},\n", - " 'rxn00419': {'1.4.1.7'},\n", - " 'rxn00420': {'3.1.3.3'},\n", - " 'rxn00421': {'2.7.1.80'},\n", - " 'rxn00422': {'2.6.1.51'},\n", - " 'rxn00423': {'2.3.1.30'},\n", - " 'rxn00424': {'2.6.1.45'},\n", - " 'rxn00425': {'5.1.1.10', '5.1.1.18'},\n", - " 'rxn00426': {'4.3.1.17'},\n", - " 'rxn00427': {'1.11.1.21', '1.11.1.6', '1.11.1.7'},\n", - " 'rxn00428': {'4.5.1.3'},\n", - " 'rxn00429': {'1.2.1.46'},\n", - " 'rxn00430': {'1.1.1.244'},\n", - " 'rxn00431': {'1.4.99.3'},\n", - " 'rxn00432': {'1.1.3.13'},\n", - " 'rxn00433': {'1.5.3.1'},\n", - " 'rxn00434': {'1.5.3.4'},\n", - " 'rxn00435': {'1.2.98.1', '1.2.99.4'},\n", - " 'rxn00436': {'3.6.1.15'},\n", - " 'rxn00437': {'2.7.4.15', '2.7.6.2'},\n", - " 'rxn00438': {'2.7.4.16'},\n", - " 'rxn00439': {'3.6.1.28'},\n", - " 'rxn00440': {'2.7.6.2'},\n", - " 'rxn00441': {'1.2.4.2'},\n", - " 'rxn00442': {'4.1.1.71'},\n", - " 'rxn00443': {'1.3.2.3'},\n", - " 'rxn00444': {'1.11.1.11'},\n", - " 'rxn00445': {'1.3.3.12'},\n", - " 'rxn00447': {'1.14.-.-'},\n", - " 'rxn00448': {'1.13.11.13'},\n", - " 'rxn00449': {'1.1.3.8'},\n", - " 'rxn00450': {'1.4.3.2'},\n", - " 'rxn00451': {'2.1.1.12'},\n", - " 'rxn00452': {'2.1.1.10'},\n", - " 'rxn00453': {'2.5.1.49', '4.2.99.10'},\n", - " 'rxn00454': {'2.6.1.73'},\n", - " 'rxn00455': {'3.5.1.31'},\n", - " 'rxn00456': {'4.4.1.11'},\n", - " 'rxn00457': {'5.1.1.2'},\n", - " 'rxn00458': {'4.1.1.57'},\n", - " 'rxn00459': {'4.2.1.11'},\n", - " 'rxn00460': {'2.7.1.40'},\n", - " 'rxn00461': {'2.5.1.7'},\n", - " 'rxn00462': {'5.4.2.9'},\n", - " 'rxn00463': {'3.6.1.19', '3.6.1.8'},\n", - " 'rxn00464': {'2.3.1.127'},\n", - " 'rxn00465': {'3.5.1.20'},\n", - " 'rxn00466': {'1.5.1.24'},\n", - " 'rxn00467': {'2.6.1.13'},\n", - " 'rxn00468': {'2.6.1.13', '2.6.1.68'},\n", - " 'rxn00469': {'3.5.1.14', '3.5.1.16'},\n", - " 'rxn00470': {'4.1.1.17'},\n", - " 'rxn00471': {'4.3.1.12'},\n", - " 'rxn00472': {'5.1.1.10', '5.1.1.12', '5.1.1.9'},\n", - " 'rxn00473': {'4.1.99.1'},\n", - " 'rxn00474': {'4.2.1.122', '4.2.1.20'},\n", - " 'rxn00475': {'1.4.1.19'},\n", - " 'rxn00476': {'1.4.1.19'},\n", - " 'rxn00477': {'1.4.3.2'},\n", - " 'rxn00478': {'1.13.11.11', '1.13.11.52'},\n", - " 'rxn00479': {'1.13.12.3'},\n", - " 'rxn00480': {'1.13.99.3'},\n", - " 'rxn00481': {'3.5.1.57'},\n", - " 'rxn00483': {'2.6.1.27'},\n", - " 'rxn00484': {'4.1.1.105', '4.1.1.28'},\n", - " 'rxn00485': {'5.1.1.11'},\n", - " 'rxn00486': {'2.7.7.54'},\n", - " 'rxn00487': {'1.4.1.20'},\n", - " 'rxn00488': {'1.4.3.2'},\n", - " 'rxn00489': {'1.11.1.21', '1.11.1.7', '1.13.12.9'},\n", - " 'rxn00490': {'4.2.1.51', '4.2.1.91'},\n", - " 'rxn00491': {'2.6.1.58'},\n", - " 'rxn00492': {'2.3.1.53'},\n", - " 'rxn00493': {'2.6.1.1', '2.6.1.5', '2.6.1.57', '2.6.1.58', '2.6.1.9'},\n", - " 'rxn00494': {'2.6.1.70'},\n", - " 'rxn00495': {'4.3.1.24', '4.3.1.25', '4.3.1.5'},\n", - " 'rxn00496': {'1.11.1.7'},\n", - " 'rxn00497': {'4.1.1.28', '4.1.1.53'},\n", - " 'rxn00498': {'2.5.1.-', '2.5.1.103', '2.5.1.21', '2.5.1.96'},\n", - " 'rxn00499': {'1.1.1.27'},\n", - " 'rxn00500': {'1.1.1.28'},\n", - " 'rxn00501': {'1.2.1.18', '1.2.1.27'},\n", - " 'rxn00502': {'1.2.1.18'},\n", - " 'rxn00503': {'1.5.1.12'},\n", - " 'rxn00504': {'1.5.1.12'},\n", - " 'rxn00505': {'1.1.1.286', '1.1.1.41'},\n", - " 'rxn00506': {'1.2.1.3', '1.2.1.5'},\n", - " 'rxn00507': {'1.2.1.3', '1.2.1.4', '1.2.1.5'},\n", - " 'rxn00508': {'1.2.1.16', '1.2.1.24'},\n", - " 'rxn00509': {'1.2.1.16', '1.2.1.79'},\n", - " 'rxn00510': {'1.5.1.7'},\n", - " 'rxn00511': {'1.5.1.8'},\n", - " 'rxn00512': {'1.1.1.26', '1.1.1.29', '1.1.99.14'},\n", - " 'rxn00513': {'3.6.1.-', '3.6.1.15', '3.6.1.5'},\n", - " 'rxn00514': {'3.6.1.-', '3.6.1.19', '3.6.1.8'},\n", - " 'rxn00515': {'2.7.4.6'},\n", - " 'rxn00516': {'3.6.1.14'},\n", - " 'rxn00517': {'2.7.1.40'},\n", - " 'rxn00518': {'2.7.1.1'},\n", - " 'rxn00519': {'4.1.1.32'},\n", - " 'rxn00520': {'6.2.1.4'},\n", - " 'rxn00521': {'4.1.99.2'},\n", - " 'rxn00522': {'1.4.3.2'},\n", - " 'rxn00523': {'1.14.13.41'},\n", - " 'rxn00524': {'1.14.18.1'},\n", - " 'rxn00525': {'1.3.1.43', '1.3.1.79'},\n", - " 'rxn00526': {'1.3.1.78', '1.3.1.79'},\n", - " 'rxn00527': {'2.6.1.1', '2.6.1.5', '2.6.1.57', '2.6.1.9'},\n", - " 'rxn00528': {'6.3.2.24'},\n", - " 'rxn00529': {'4.1.1.25', '4.1.1.28'},\n", - " 'rxn00530': {'4.3.1.23', '4.3.1.25'},\n", - " 'rxn00531': {'5.4.3.6'},\n", - " 'rxn00532': {'1.2.1.-', '1.2.1.18', '1.2.1.75'},\n", - " 'rxn00533': {'6.4.1.2'},\n", - " 'rxn00534': {'2.8.3.3'},\n", - " 'rxn00536': {'1.1.1.2', '1.1.1.71'},\n", - " 'rxn00537': {'3.11.1.1'},\n", - " 'rxn00538': {'4.2.3.2'},\n", - " 'rxn00539': {'4.3.1.7'},\n", - " 'rxn00540': {'4.1.3.39'},\n", - " 'rxn00541': {'4.1.2.5'},\n", - " 'rxn00542': {'4.1.2.36'},\n", - " 'rxn00543': {'1.1.1.1', '1.1.1.71'},\n", - " 'rxn00544': {'4.1.1.1'},\n", - " 'rxn00545': {'2.7.1.11'},\n", - " 'rxn00546': {'1.1.1.17'},\n", - " 'rxn00547': {'2.7.1.1', '2.7.1.4'},\n", - " 'rxn00548': {'4.1.2.22'},\n", - " 'rxn00549': {'3.1.3.11'},\n", - " 'rxn00550': {'3.1.3.46'},\n", - " 'rxn00551': {'2.7.1.90'},\n", - " 'rxn00552': {'3.5.99.6'},\n", - " 'rxn00553': {'2.4.1.14'},\n", - " 'rxn00554': {'2.7.1.11'},\n", - " 'rxn00555': {'2.6.1.16'},\n", - " 'rxn00556': {'2.7.1.11'},\n", - " 'rxn00557': {'2.7.1.11'},\n", - " 'rxn00558': {'5.3.1.9'},\n", - " 'rxn00559': {'5.3.1.8'},\n", - " 'rxn00560': {'6.3.4.6'},\n", - " 'rxn00561': {'3.5.3.2'},\n", - " 'rxn00562': {'4.3.2.3'},\n", - " 'rxn00563': {'3.5.3.14'},\n", - " 'rxn00564': {'4.2.1.69'},\n", - " 'rxn00565': {'1.13.11.18'},\n", - " 'rxn00566': {'4.1.99.1', '4.4.1.1', '4.4.1.28', '4.4.1.8'},\n", - " 'rxn00567': {'1.7.2.1'},\n", - " 'rxn00568': {'1.6.6.-', '1.7.1.15', '1.7.1.4'},\n", - " 'rxn00569': {'1.7.1.4'},\n", - " 'rxn00570': {'1.7.3.4', '1.7.3.6'},\n", - " 'rxn00571': {'1.6.6.1', '1.7.1.1', '1.7.1.2'},\n", - " 'rxn00572': {'1.7.1.2', '1.7.1.3'},\n", - " 'rxn00573': {'1.7.3.1'},\n", - " 'rxn00575': {'3.2.1.10', '3.2.1.20', '3.2.1.48'},\n", - " 'rxn00577': {'2.4.1.7'},\n", - " 'rxn00578': {'3.1.3.24'},\n", - " 'rxn00579': {'2.4.1.13'},\n", - " 'rxn00580': {'1.1.99.13'},\n", - " 'rxn00581': {'2.4.1.167'},\n", - " 'rxn00582': {'5.4.99.11'},\n", - " 'rxn00583': {'1.3.1.19'},\n", - " 'rxn00584': {'1.3.1.25'},\n", - " 'rxn00585': {'1.3.1.20'},\n", - " 'rxn00586': {'1.14.13.7'},\n", - " 'rxn00587': {'1.13.11.2'},\n", - " 'rxn00588': {'1.13.11.1'},\n", - " 'rxn00589': {'1.14.13.1'},\n", - " 'rxn00590': {'1.14.12.10'},\n", - " 'rxn00591': {'1.3.1.25'},\n", - " 'rxn00592': {'4.1.1.46'},\n", - " 'rxn00593': {'4.1.1.63'},\n", - " 'rxn00594': {'1.14.12.1'},\n", - " 'rxn00595': {'1.14.12.1'},\n", - " 'rxn00596': {'2.1.1.6'},\n", - " 'rxn00597': {'1.14.13.31'},\n", - " 'rxn00598': {'2.3.1.-', '2.3.1.16', '2.3.1.174'},\n", - " 'rxn00599': {'2.3.1.37'},\n", - " 'rxn00600': {'2.3.1.37'},\n", - " 'rxn00601': {'2.3.1.109'},\n", - " 'rxn00602': {'5.4.99.2'},\n", - " 'rxn00603': {'1.1.1.200'},\n", - " 'rxn00604': {'1.1.1.363', '1.1.1.49'},\n", - " 'rxn00605': {'2.4.1.15'},\n", - " 'rxn00606': {'3.2.1.122', '3.2.1.93'},\n", - " 'rxn00607': {'3.2.1.122'},\n", - " 'rxn00608': {'3.2.1.86'},\n", - " 'rxn00610': {'3.1.3.21'},\n", - " 'rxn00611': {'1.1.1.8', '1.1.1.94'},\n", - " 'rxn00612': {'1.1.1.94'},\n", - " 'rxn00613': {'1.1.1.177'},\n", - " 'rxn00614': {'1.1.3.21'},\n", - " 'rxn00615': {'2.7.1.30'},\n", - " 'rxn00616': {'1.1.5.3', '1.1.99.5'},\n", - " 'rxn00617': {'2.7.1.142'},\n", - " 'rxn00618': {'2.4.1.137'},\n", - " 'rxn00619': {'2.4.1.96'},\n", - " 'rxn00620': {'3.6.1.16'},\n", - " 'rxn00621': {'2.7.7.39'},\n", - " 'rxn00622': {'3.1.4.46'},\n", - " 'rxn00623': {'1.8.1.2', '1.8.2.2'},\n", - " 'rxn00624': {'4.1.1.12'},\n", - " 'rxn00626': {'1.1.2.2'},\n", - " 'rxn00627': {'2.7.1.3'},\n", - " 'rxn00629': {'1.1.1.11', '1.1.1.67'},\n", - " 'rxn00630': {'1.1.1.138'},\n", - " 'rxn00631': {'1.1.1.124'},\n", - " 'rxn00632': {'3.1.3.-'},\n", - " 'rxn00633': {'1.1.99.28'},\n", - " 'rxn00634': {'1.1.1.14', '1.1.1.15'},\n", - " 'rxn00635': {'2.7.1.1'},\n", - " 'rxn00636': {'5.3.1.7'},\n", - " 'rxn00638': {'1.1.1.132'},\n", - " 'rxn00639': {'3.6.1.-', '3.6.1.21'},\n", - " 'rxn00640': {'2.7.7.22'},\n", - " 'rxn00641': {'2.7.7.13'},\n", - " 'rxn00642': {'4.2.1.47'},\n", - " 'rxn00643': {'5.1.3.18'},\n", - " 'rxn00644': {'1.8.1.6'},\n", - " 'rxn00645': {'1.13.11.20'},\n", - " 'rxn00646': {'6.3.2.2'},\n", - " 'rxn00647': {'2.6.1.1', '2.6.1.3'},\n", - " 'rxn00649': {'2.5.1.47', '2.5.1.65'},\n", - " 'rxn00650': {'3.4.11.1', '3.4.11.2', '3.4.11.23', '3.4.13.-', '3.4.13.18'},\n", - " 'rxn00651': {'4.4.1.10'},\n", - " 'rxn00652': {'5.1.1.10'},\n", - " 'rxn00653': {'1.2.1.-', '1.2.1.19', '1.2.1.3', '1.2.1.5'},\n", - " 'rxn00654': {'3.5.1.6'},\n", - " 'rxn00655': {'1.5.1.26'},\n", - " 'rxn00656': {'2.6.1.18'},\n", - " 'rxn00657': {'2.6.1.19', '2.6.1.55'},\n", - " 'rxn00658': {'3.5.1.21'},\n", - " 'rxn00659': {'6.3.2.11'},\n", - " 'rxn00660': {'3.4.13.4'},\n", - " 'rxn00661': {'6.3.2.11'},\n", - " 'rxn00662': {'3.5.3.17'},\n", - " 'rxn00667': {'2.3.1.94'},\n", - " 'rxn00668': {'1.3.1.-', '1.3.1.84'},\n", - " 'rxn00669': {'6.2.1.13'},\n", - " 'rxn00670': {'2.3.1.-', '2.3.1.222', '2.3.1.8'},\n", - " 'rxn00671': {'1.2.1.27'},\n", - " 'rxn00672': {'4.1.1.41', '4.1.1.94', '7.2.4.3'},\n", - " 'rxn00673': {'1.3.99.3'},\n", - " 'rxn00674': {'6.2.1.1', '6.2.1.17'},\n", - " 'rxn00675': {'6.2.1.1', '6.2.1.17'},\n", - " 'rxn00676': {'2.3.1.16', '2.3.1.9'},\n", - " 'rxn00677': {'2.8.3.1'},\n", - " 'rxn00678': {'2.1.3.1'},\n", - " 'rxn00679': {'2.3.3.5', '4.1.3.31'},\n", - " 'rxn00680': {'2.3.3.11'},\n", - " 'rxn00682': {'4.1.3.24'},\n", - " 'rxn00684': {'1.5.1.3'},\n", - " 'rxn00685': {'1.5.1.3'},\n", - " 'rxn00686': {'1.5.1.3'},\n", - " 'rxn00687': {'1.5.1.3'},\n", - " 'rxn00688': {'1.5.1.6'},\n", - " 'rxn00689': {'6.3.2.17'},\n", - " 'rxn00690': {'6.3.4.3'},\n", - " 'rxn00691': {'3.5.1.10'},\n", - " 'rxn00692': {'2.1.2.1'},\n", - " 'rxn00693': {'2.1.1.13'},\n", - " 'rxn00695': {'2.7.7.27'},\n", - " 'rxn00696': {'2.7.1.10'},\n", - " 'rxn00697': {'3.6.1.21'},\n", - " 'rxn00698': {'2.4.1.20'},\n", - " 'rxn00699': {'2.4.1.31'},\n", - " 'rxn00700': {'2.7.7.34'},\n", - " 'rxn00701': {'2.7.7.12'},\n", - " 'rxn00702': {'2.7.7.33'},\n", - " 'rxn00703': {'2.4.1.139'},\n", - " 'rxn00704': {'5.4.2.2', '5.4.2.5'},\n", - " 'rxn00705': {'2.7.1.41'},\n", - " 'rxn00706': {'3.6.1.5', '3.6.1.6', '3.6.1.64'},\n", - " 'rxn00707': {'2.7.1.48'},\n", - " 'rxn00708': {'3.1.3.5'},\n", - " 'rxn00709': {'2.7.1.48'},\n", - " 'rxn00710': {'4.1.1.23'},\n", - " 'rxn00711': {'2.4.2.9'},\n", - " 'rxn00712': {'2.7.1.48'},\n", - " 'rxn00713': {'2.7.1.48'},\n", - " 'rxn00714': {'3.6.1.17'},\n", - " 'rxn00715': {'2.7.1.48'},\n", - " 'rxn00716': {'4.1.1.66'},\n", - " 'rxn00717': {'3.5.4.1'},\n", - " 'rxn00718': {'1.3.3.7'},\n", - " 'rxn00719': {'1.3.1.1'},\n", - " 'rxn00720': {'1.3.1.2'},\n", - " 'rxn00721': {'2.7.7.55'},\n", - " 'rxn00722': {'1.14.13.35'},\n", - " 'rxn00723': {'6.2.1.32'},\n", - " 'rxn00724': {'1.13.11.23'},\n", - " 'rxn00725': {'2.1.1.111'},\n", - " 'rxn00726': {'4.1.3.27'},\n", - " 'rxn00727': {'4.1.3.27'},\n", - " 'rxn00728': {'3.7.1.3'},\n", - " 'rxn00729': {'3.5.1.9'},\n", - " 'rxn00730': {'2.3.1.113'},\n", - " 'rxn00731': {'4.1.1.24'},\n", - " 'rxn00735': {'1.1.1.85'},\n", - " 'rxn00736': {'4.1.1.3'},\n", - " 'rxn00737': {'4.3.1.19'},\n", - " 'rxn00738': {'3.5.99.7', '4.1.99.4-'},\n", - " 'rxn00739': {'2.3.3.6'},\n", - " 'rxn00740': {'2.5.1.48', '4.3.1.-'},\n", - " 'rxn00741': {'1.1.1.27'},\n", - " 'rxn00742': {'4.4.1.1'},\n", - " 'rxn00743': {'3.1.3.1', '3.1.3.2'},\n", - " 'rxn00744': {'2.7.1.29'},\n", - " 'rxn00745': {'2.7.1.121'},\n", - " 'rxn00746': {'4.1.2.2'},\n", - " 'rxn00747': {'5.3.1.1'},\n", - " 'rxn00748': {'4.2.3.3'},\n", - " 'rxn00749': {'1.2.99.3'},\n", - " 'rxn00751': {'2.7.1.32'},\n", - " 'rxn00752': {'1.1.3.17'},\n", - " 'rxn00753': {'2.3.1.6'},\n", - " 'rxn00754': {'3.1.1.7', '3.1.1.8'},\n", - " 'rxn00755': {'2.8.2.6'},\n", - " 'rxn00756': {'3.1.6.6'},\n", - " 'rxn00757': {'3.1.1.8'},\n", - " 'rxn00758': {'3.1.4.2', '3.1.4.46'},\n", - " 'rxn00759': {'4.5.1.2'},\n", - " 'rxn00761': {'1.14.12.13'},\n", - " 'rxn00762': {'1.1.1.6'},\n", - " 'rxn00763': {'1.1.1.-', '1.1.1.1', '1.1.1.21', '1.1.1.72'},\n", - " 'rxn00764': {'1.1.1.156'},\n", - " 'rxn00765': {'1.1.1.2', '1.1.1.21', '1.1.1.372', '1.1.1.72'},\n", - " 'rxn00766': {'3.1.3.19'},\n", - " 'rxn00767': {'2.7.1.79'},\n", - " 'rxn00768': {'4.2.1.30'},\n", - " 'rxn00769': {'4.2.1.30'},\n", - " 'rxn00770': {'2.7.6.1'},\n", - " 'rxn00771': {'2.7.1.18'},\n", - " 'rxn00772': {'2.7.1.15'},\n", - " 'rxn00773': {'2.7.7.35'},\n", - " 'rxn00774': {'6.3.4.7'},\n", - " 'rxn00775': {'3.6.1.-', '3.6.1.13', '3.6.1.21', '3.6.1.53'},\n", - " 'rxn00776': {'3.2.-.-', '4.2.1.70'},\n", - " 'rxn00777': {'5.3.1.6'},\n", - " 'rxn00778': {'5.4.2.2', '5.4.2.7'},\n", - " 'rxn00779': {'1.2.1.9'},\n", - " 'rxn00780': {'2.7.1.28'},\n", - " 'rxn00781': {'1.2.1.12', '1.2.1.59'},\n", - " 'rxn00782': {'1.2.1.13', '1.2.1.59'},\n", - " 'rxn00783': {'4.1.2.21', '4.1.2.55'},\n", - " 'rxn00784': {'4.1.2.4'},\n", - " 'rxn00785': {'2.2.1.1'},\n", - " 'rxn00786': {'4.1.2.13'},\n", - " 'rxn00787': {'4.1.2.40'},\n", - " 'rxn00789': {'2.4.2.17'},\n", - " 'rxn00790': {'2.4.2.14'},\n", - " 'rxn00791': {'2.4.2.18'},\n", - " 'rxn00792': {'6.2.1.11', '6.3.4.10', '6.3.4.11', '6.3.4.15', '6.3.4.9'},\n", - " 'rxn00793': {'6.2.1.11'},\n", - " 'rxn00794': {'3.5.1.12'},\n", - " 'rxn00795': {'3.5.1.12'},\n", - " 'rxn00797': {'3.2.2.3', '3.2.2.8'},\n", - " 'rxn00798': {'5.3.1.20'},\n", - " 'rxn00799': {'4.2.1.2'},\n", - " 'rxn00800': {'4.3.2.2'},\n", - " 'rxn00801': {'3.7.1.-', '3.7.1.20', '3.7.1.5'},\n", - " 'rxn00802': {'4.3.2.1'},\n", - " 'rxn00803': {'5.2.1.1'},\n", - " 'rxn00804': {'1.4.1.9'},\n", - " 'rxn00805': {'2.3.1.66'},\n", - " 'rxn00806': {'2.6.1.42', '2.6.1.6', '2.6.1.67'},\n", - " 'rxn00807': {'5.4.3.7'},\n", - " 'rxn00808': {'2.7.1.6'},\n", - " 'rxn00809': {'1.1.1.21'},\n", - " 'rxn00810': {'1.1.1.48'},\n", - " 'rxn00811': {'1.1.1.21'},\n", - " 'rxn00812': {'1.1.1.120', '1.1.1.359', '1.1.1.360', '1.1.1.48'},\n", - " 'rxn00813': {'1.1.1.120', '1.1.1.48'},\n", - " 'rxn00814': {'1.1.3.9'},\n", - " 'rxn00815': {'1.1.3.9'},\n", - " 'rxn00816': {'3.2.1.108', '3.2.1.23'},\n", - " 'rxn00817': {'3.2.1.22'},\n", - " 'rxn00818': {'3.2.1.22'},\n", - " 'rxn00819': {'3.2.1.22'},\n", - " 'rxn00820': {'1.7.99.4'},\n", - " 'rxn00821': {'1.8.5.1'},\n", - " 'rxn00822': {'1.8.4.4'},\n", - " 'rxn00824': {'1.8.4.3'},\n", - " 'rxn00826': {'1.8.4.4'},\n", - " 'rxn00827': {'2.7.7.43'},\n", - " 'rxn00829': {'4.1.1.33'},\n", - " 'rxn00830': {'5.3.3.2'},\n", - " 'rxn00831': {'3.1.3.5', '3.1.3.99'},\n", - " 'rxn00832': {'2.1.2.3', '3.5.4.10'},\n", - " 'rxn00833': {'3.2.2.12'},\n", - " 'rxn00834': {'1.1.1.205'},\n", - " 'rxn00835': {'2.7.1.73'},\n", - " 'rxn00836': {'2.4.2.8'},\n", - " 'rxn00837': {'1.6.6.8', '1.7.1.7'},\n", - " 'rxn00838': {'6.3.4.4'},\n", - " 'rxn00839': {'2.7.4.6'},\n", - " 'rxn00840': {'2.7.1.40'},\n", - " 'rxn00841': {'2.7.1.1'},\n", - " 'rxn00842': {'2.7.1.1'},\n", - " 'rxn00843': {'1.14.13.25'},\n", - " 'rxn00844': {'1.14.13.25'},\n", - " 'rxn00845': {'3.1.1.44'},\n", - " 'rxn00846': {'3.1.6.16'},\n", - " 'rxn00847': {'1.1.99.8'},\n", - " 'rxn00848': {'2.6.1.54'},\n", - " 'rxn00849': {'2.6.1.21'},\n", - " 'rxn00850': {'2.3.2.14'},\n", - " 'rxn00851': {'6.3.2.4'},\n", - " 'rxn00852': {'1.4.3.10', '1.4.3.22'},\n", - " 'rxn00853': {'3.5.1.53'},\n", - " 'rxn00854': {'2.1.1.53'},\n", - " 'rxn00855': {'2.3.1.57'},\n", - " 'rxn00856': {'2.6.1.29', '2.6.1.82'},\n", - " 'rxn00857': {'3.5.1.62'},\n", - " 'rxn00858': {'3.5.3.11'},\n", - " 'rxn00859': {'1.1.1.23'},\n", - " 'rxn00860': {'2.1.1.-'},\n", - " 'rxn00861': {'2.3.1.33'},\n", - " 'rxn00862': {'2.6.1.38'},\n", - " 'rxn00863': {'1.1.1.23'},\n", - " 'rxn00864': {'6.3.2.11'},\n", - " 'rxn00865': {'3.4.13.18', '3.4.13.20'},\n", - " 'rxn00866': {'4.1.1.22', '4.1.1.28'},\n", - " 'rxn00867': {'4.3.1.3'},\n", - " 'rxn00868': {'1.3.1.44', '1.3.8.1'},\n", - " 'rxn00869': {'1.2.1.10', '1.2.1.57', '1.2.1.87'},\n", - " 'rxn00870': {'1.2.1.57'},\n", - " 'rxn00871': {'2.3.1.19'},\n", - " 'rxn00872': {'1.3.3.6', '1.3.8.1', '1.3.99.-', '1.3.99.2', '1.3.99.3'},\n", - " 'rxn00873': {'6.2.1.2', '6.2.1.3'},\n", - " 'rxn00874': {'2.3.1.16', '2.3.1.9'},\n", - " 'rxn00875': {'2.8.3.8'},\n", - " 'rxn00876': {'2.3.3.7'},\n", - " 'rxn00877': {'5.4.99.13'},\n", - " 'rxn00878': {'2.7.1.64'},\n", - " 'rxn00879': {'1.1.1.18'},\n", - " 'rxn00880': {'1.13.99.1'},\n", - " 'rxn00881': {'3.1.3.25'},\n", - " 'rxn00882': {'3.1.3.25'},\n", - " 'rxn00883': {'3.1.3.25'},\n", - " 'rxn00884': {'2.1.1.40'},\n", - " 'rxn00885': {'2.1.1.39'},\n", - " 'rxn00886': {'2.1.1.129'},\n", - " 'rxn00887': {'2.1.1.129'},\n", - " 'rxn00888': {'2.4.1.123'},\n", - " 'rxn00889': {'3.1.4.44', '3.1.4.46'},\n", - " 'rxn00890': {'3.2.1.22'},\n", - " 'rxn00891': {'3.5.1.33'},\n", - " 'rxn00892': {'2.7.1.59'},\n", - " 'rxn00893': {'1.1.1.240'},\n", - " 'rxn00894': {'1.1.3.29'},\n", - " 'rxn00895': {'2.3.1.3'},\n", - " 'rxn00896': {'2.4.1.90'},\n", - " 'rxn00897': {'2.7.1.59', '5.1.3.8'},\n", - " 'rxn00898': {'4.2.1.9'},\n", - " 'rxn00899': {'1.2.1.25'},\n", - " 'rxn00900': {'1.1.1.84'},\n", - " 'rxn00901': {'1.4.1.8'},\n", - " 'rxn00902': {'2.3.3.13', '4.1.3.12'},\n", - " 'rxn00903': {'2.6.1.42', '2.6.1.6'},\n", - " 'rxn00904': {'2.6.1.66'},\n", - " 'rxn00905': {'2.1.2.11', '4.1.2.12'},\n", - " 'rxn00906': {'1.5.1.15'},\n", - " 'rxn00907': {'1.5.1.5'},\n", - " 'rxn00908': {'1.4.4.2', '1.8.1.4', '2.1.2.10'},\n", - " 'rxn00909': {'1.5.1.20', '1.7.99.5'},\n", - " 'rxn00910': {'1.5.1.20'},\n", - " 'rxn00911': {'2.1.2.7'},\n", - " 'rxn00912': {'2.1.2.11'},\n", - " 'rxn00913': {'3.1.3.5'},\n", - " 'rxn00914': {'2.7.1.73'},\n", - " 'rxn00915': {'2.4.2.22', '2.4.2.7', '2.4.2.8'},\n", - " 'rxn00916': {'6.3.4.1', '6.3.5.2'},\n", - " 'rxn00917': {'6.3.5.2'},\n", - " 'rxn00918': {'3.6.1.17'},\n", - " 'rxn00919': {'3.6.1.21'},\n", - " 'rxn00920': {'3.1.4.17', '3.1.4.35'},\n", - " 'rxn00921': {'4.1.1.61'},\n", - " 'rxn00922': {'2.1.1.25'},\n", - " 'rxn00923': {'2.4.1.35'},\n", - " 'rxn00924': {'3.1.1.2'},\n", - " 'rxn00925': {'3.1.6.1'},\n", - " 'rxn00926': {'3.5.4.2'},\n", - " 'rxn00927': {'3.2.2.1', '3.2.2.7', '3.2.2.8'},\n", - " 'rxn00928': {'1.5.1.1'},\n", - " 'rxn00929': {'1.5.1.2'},\n", - " 'rxn00930': {'1.5.1.1'},\n", - " 'rxn00931': {'1.5.1.2'},\n", - " 'rxn00932': {'1.14.11.2', '1.14.11.57'},\n", - " 'rxn00933': {'5.1.1.4'},\n", - " 'rxn00934': {'6.2.1.9'},\n", - " 'rxn00935': {'1.1.5.4'},\n", - " 'rxn00936': {'3.2.2.11'},\n", - " 'rxn00937': {'4.2.1.65'},\n", - " 'rxn00938': {'3.5.1.19', '3.5.1.4'},\n", - " 'rxn00939': {'2.1.1.1'},\n", - " 'rxn00940': {'3.2.2.14', '3.2.2.6'},\n", - " 'rxn00941': {'2.4.2.12'},\n", - " 'rxn00942': {'3.2.2.1'},\n", - " 'rxn00943': {'3.1.2.2', '3.1.2.22'},\n", - " 'rxn00944': {'1.2.1.42'},\n", - " 'rxn00945': {'1.3.1.38', '1.3.1.8'},\n", - " 'rxn00946': {'1.3.3.6', '1.3.8.9', '1.3.99.-', '1.3.99.13', '1.3.99.3'},\n", - " 'rxn00947': {'6.2.1.3'},\n", - " 'rxn00948': {'2.3.1.50'},\n", - " 'rxn00949': {'4.4.1.2'},\n", - " 'rxn00950': {'4.4.1.8'},\n", - " 'rxn00952': {'2.5.1.49', '4.2.99.10'},\n", - " 'rxn00953': {'4.2.1.22'},\n", - " 'rxn00955': {'4.4.1.21'},\n", - " 'rxn00956': {'1.8.4.1'},\n", - " 'rxn00957': {'1.2.1.28', '1.2.1.64'},\n", - " 'rxn00958': {'1.2.1.7'},\n", - " 'rxn00959': {'1.14.13.12'},\n", - " 'rxn00960': {'1.14.13.33'},\n", - " 'rxn00961': {'1.14.13.64'},\n", - " 'rxn00962': {'1.14.13.2', '1.14.13.33'},\n", - " 'rxn00963': {'1.14.13.64'},\n", - " 'rxn00964': {'6.2.1.27'},\n", - " 'rxn00965': {'3.1.2.23'},\n", - " 'rxn00966': {'4.1.3.40'},\n", - " 'rxn00967': {'2.4.1.194'},\n", - " 'rxn00968': {'1.13.11.41'},\n", - " 'rxn00969': {'3.8.1.6'},\n", - " 'rxn00971': {'6.2.1.18'},\n", - " 'rxn00972': {'2.8.3.10'},\n", - " 'rxn00973': {'4.2.1.3'},\n", - " 'rxn00974': {'4.2.1.3', '4.2.1.4'},\n", - " 'rxn00975': {'2.7.1.1', '2.7.1.7'},\n", - " 'rxn00976': {'2.7.1.1'},\n", - " 'rxn00977': {'3.2.1.22'},\n", - " 'rxn00978': {'2.7.1.1'},\n", - " 'rxn00979': {'1.2.1.21'},\n", - " 'rxn00980': {'3.1.3.18'},\n", - " 'rxn00981': {'4.2.99.12'},\n", - " 'rxn00982': {'2.1.1.15'},\n", - " 'rxn00983': {'3.1.1.23', '3.1.1.79'},\n", - " 'rxn00984': {'3.1.1.23'},\n", - " 'rxn00985': {'2.7.2.1', '2.7.2.15'},\n", - " 'rxn00986': {'6.2.1.1', '6.2.1.17'},\n", - " 'rxn00987': {'4.1.3.32'},\n", - " 'rxn00988': {'6.2.1.16'},\n", - " 'rxn00989': {'3.1.2.11'},\n", - " 'rxn00990': {'2.8.3.-', '2.8.3.8'},\n", - " 'rxn00991': {'4.1.3.4'},\n", - " 'rxn00992': {'1.1.1.30'},\n", - " 'rxn00993': {'3.7.1.2'},\n", - " 'rxn00994': {'2.8.3.9'},\n", - " 'rxn00995': {'4.1.1.4'},\n", - " 'rxn00996': {'4.2.1.27'},\n", - " 'rxn00997': {'1.1.1.222', '1.1.1.237'},\n", - " 'rxn00998': {'1.1.1.222', '1.1.1.237'},\n", - " 'rxn00999': {'1.13.11.27'},\n", - " 'rxn01000': {'4.2.1.51', '4.2.1.91'},\n", - " 'rxn01001': {'2.6.1.64'},\n", - " 'rxn01002': {'2.6.1.28'},\n", - " 'rxn01003': {'4.1.1.-', '4.1.1.43', '4.1.4.3'},\n", - " 'rxn01004': {'5.3.2.1'},\n", - " 'rxn01005': {'2.7.7.44'},\n", - " 'rxn01007': {'4.1.1.35'},\n", - " 'rxn01008': {'5.1.3.6'},\n", - " 'rxn01009': {'4.1.1.-'},\n", - " 'rxn01010': {'5.1.3.12'},\n", - " 'rxn01011': {'1.1.1.26', '1.1.1.29', '1.1.1.81'},\n", - " 'rxn01013': {'1.1.1.79', '1.1.1.81'},\n", - " 'rxn01014': {'4.1.1.40'},\n", - " 'rxn01015': {'5.3.1.22'},\n", - " 'rxn01016': {'2.7.2.2'},\n", - " 'rxn01017': {'2.1.3.8'},\n", - " 'rxn01018': {'2.1.3.2'},\n", - " 'rxn01019': {'2.1.3.3'},\n", - " 'rxn01020': {'2.1.3.6'},\n", - " 'rxn01021': {'3.2.2.16', '3.2.2.9'},\n", - " 'rxn01022': {'2.4.2.28'},\n", - " 'rxn01023': {'2.7.1.59', '4.2.1.66', '5.1.3.8'},\n", - " 'rxn01024': {'2.7.1.59', '4.2.1.66', '5.1.3.8'},\n", - " 'rxn01025': {'3.5.4.1'},\n", - " 'rxn01026': {'1.14.11.6'},\n", - " 'rxn01027': {'1.3.1.1'},\n", - " 'rxn01028': {'1.3.1.2'},\n", - " 'rxn01029': {'3.5.3.12'},\n", - " 'rxn01030': {'2.7.3.10'},\n", - " 'rxn01031': {'3.5.3.20'},\n", - " 'rxn01032': {'1.2.1.28', '1.2.1.29'},\n", - " 'rxn01033': {'1.2.1.7'},\n", - " 'rxn01034': {'3.6.1.7'},\n", - " 'rxn01035': {'6.2.1.25'},\n", - " 'rxn01036': {'3.6.1.20'},\n", - " 'rxn01037': {'3.5.1.32'},\n", - " 'rxn01038': {'3.5.1.40'},\n", - " 'rxn01041': {'1.1.1.121', '1.1.1.175'},\n", - " 'rxn01042': {'1.1.1.179'},\n", - " 'rxn01043': {'1.1.1.21', '1.1.1.307'},\n", - " 'rxn01044': {'5.3.1.5'},\n", - " 'rxn01045': {'1.4.1.-', '1.4.1.23', '1.4.1.9'},\n", - " 'rxn01046': {'4.1.1.14'},\n", - " 'rxn01048': {'2.2.1.3'},\n", - " 'rxn01049': {'2.7.1.85'},\n", - " 'rxn01050': {'1.1.99.18'},\n", - " 'rxn01051': {'3.2.1.74'},\n", - " 'rxn01052': {'5.1.3.11'},\n", - " ...}" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "{k:v['Enzyme Class'] for k, v in reaction_ecs.items()}" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'rxn00001': {'3.6.1.1'},\n", - " 'rxn00002': {'3.5.1.54'},\n", - " 'rxn00003': {'2.2.1.6'},\n", - " 'rxn00004': {'4.1.3.17'},\n", - " 'rxn00006': {'1.11.1.21', '1.11.1.6'},\n", - " 'rxn00007': {'3.2.1.28'},\n", - " 'rxn00008': {'1.11.1.13'},\n", - " 'rxn00009': {'2.7.7.45'},\n", - " 'rxn00010': {'4.1.1.47'},\n", - " 'rxn00011': {'1.2.4.1', '2.2.1.6', '4.1.1.1'},\n", - " 'rxn00012': {'2.4.1.99'},\n", - " 'rxn00013': {'2.7.1.41'},\n", - " 'rxn00014': {'1.11.1.5'},\n", - " 'rxn00015': {'2.5.1.44'},\n", - " 'rxn00016': {'3.2.1.52'},\n", - " 'rxn00017': {'1.7.1.5'},\n", - " 'rxn00018': {'4.1.1.39'},\n", - " 'rxn00019': {'1.13.11.32'},\n", - " 'rxn00020': {'3.2.1.21'},\n", - " 'rxn00021': {'4.1.2.38'},\n", - " 'rxn00022': {'3.2.1.20'},\n", - " 'rxn00023': {'1.8.2.2'},\n", - " 'rxn00024': {'1.10.3.1'},\n", - " 'rxn00025': {'1.13.11.63', '1.14.99.36'},\n", - " 'rxn00026': {'1.1.3.23'},\n", - " 'rxn00027': {'4.1.99.3'},\n", - " 'rxn00028': {'1.10.3.3'},\n", - " 'rxn00029': {'4.2.1.24'},\n", - " 'rxn00030': {'4.1.2.35'},\n", - " 'rxn00031': {'2.4.1.166'},\n", - " 'rxn00032': {'1.1.3.17'},\n", - " 'rxn00033': {'1.2.3.13'},\n", - " 'rxn00034': {'1.13.11.43'},\n", - " 'rxn00035': {'1.21.3.2'},\n", - " 'rxn00036': {'1.10.3.1'},\n", - " 'rxn00037': {'1.14.99.-'},\n", - " 'rxn00038': {'3.1.1.22'},\n", - " 'rxn00039': {'2.3.1.90'},\n", - " 'rxn00040': {'3.1.1.20'},\n", - " 'rxn00041': {'3.1.1.40'},\n", - " 'rxn00042': {'1.1.3.28'},\n", - " 'rxn00043': {'1.10.3.1', '1.14.18.1'},\n", - " 'rxn00044': {'3.5.1.46'},\n", - " 'rxn00045': {'2.4.1.95'},\n", - " 'rxn00046': {'2.3.1.103'},\n", - " 'rxn00047': {'4.2.2.6'},\n", - " 'rxn00048': {'2.5.1.9'},\n", - " 'rxn00050': {'1.14.13.-'},\n", - " 'rxn00052': {'1.1.3.23'},\n", - " 'rxn00053': {'1.14.99.1'},\n", - " 'rxn00054': {'1.10.3.4'},\n", - " 'rxn00055': {'2.5.1.43'},\n", - " 'rxn00056': {'1.16.3.1'},\n", - " 'rxn00057': {'1.1.3.14', '1.10.3.1'},\n", - " 'rxn00058': {'1.7.2.1', '1.9.3.1'},\n", - " 'rxn00059': {'1.10.3.2'},\n", - " 'rxn00060': {'2.5.1.61', '4.3.1.8'},\n", - " 'rxn00061': {'3.6.1.5'},\n", - " 'rxn00062': {'3.6.1.15',\n", - " '3.6.1.3',\n", - " '3.6.1.5',\n", - " '3.6.1.8',\n", - " '3.6.3.1',\n", - " '3.6.3.10',\n", - " '3.6.3.11',\n", - " '3.6.3.12',\n", - " '3.6.3.14',\n", - " '3.6.3.15',\n", - " '3.6.3.16',\n", - " '3.6.3.17',\n", - " '3.6.3.18',\n", - " '3.6.3.19',\n", - " '3.6.3.2',\n", - " '3.6.3.20',\n", - " '3.6.3.21',\n", - " '3.6.3.22',\n", - " '3.6.3.23',\n", - " '3.6.3.24',\n", - " '3.6.3.25',\n", - " '3.6.3.26',\n", - " '3.6.3.27',\n", - " '3.6.3.28',\n", - " '3.6.3.29',\n", - " '3.6.3.3',\n", - " '3.6.3.30',\n", - " '3.6.3.31',\n", - " '3.6.3.32',\n", - " '3.6.3.33',\n", - " '3.6.3.34',\n", - " '3.6.3.35',\n", - " '3.6.3.36',\n", - " '3.6.3.37',\n", - " '3.6.3.38',\n", - " '3.6.3.39',\n", - " '3.6.3.4',\n", - " '3.6.3.40',\n", - " '3.6.3.41',\n", - " '3.6.3.42',\n", - " '3.6.3.43',\n", - " '3.6.3.44',\n", - " '3.6.3.46',\n", - " '3.6.3.47',\n", - " '3.6.3.48',\n", - " '3.6.3.49',\n", - " '3.6.3.5',\n", - " '3.6.3.50',\n", - " '3.6.3.51',\n", - " '3.6.3.52',\n", - " '3.6.3.53',\n", - " '3.6.3.54',\n", - " '3.6.3.55',\n", - " '3.6.3.6',\n", - " '3.6.3.7',\n", - " '3.6.3.8',\n", - " '3.6.3.9',\n", - " '3.6.4.1',\n", - " '3.6.4.10',\n", - " '3.6.4.11',\n", - " '3.6.4.12',\n", - " '3.6.4.13',\n", - " '3.6.4.2',\n", - " '3.6.4.3',\n", - " '3.6.4.4',\n", - " '3.6.4.5',\n", - " '3.6.4.6',\n", - " '3.6.4.7',\n", - " '3.6.4.8',\n", - " '3.6.4.9',\n", - " '5.6.1.c',\n", - " '5.6.1.d',\n", - " '5.6.1.f',\n", - " '5.6.1.g',\n", - " '7.3.2.a',\n", - " '7.3.2.f',\n", - " '7.5.2.h',\n", - " '7.5.2.j',\n", - " '7.5.2.l',\n", - " '7.6.2.c',\n", - " '7.6.2.f'},\n", - " 'rxn00063': {'3.6.1.8'},\n", - " 'rxn00064': {'3.5.4.18'},\n", - " 'rxn00065': {'4.6.1.1'},\n", - " 'rxn00066': {'1.11.1.1'},\n", - " 'rxn00067': {'1.8.1.14', '1.8.1.M1'},\n", - " 'rxn00068': {'1.16.1.7'},\n", - " 'rxn00069': {'1.4.1.14'},\n", - " 'rxn00070': {'1.8.1.7'},\n", - " 'rxn00071': {'1.6.5.4'},\n", - " 'rxn00072': {'1.16.1.3'},\n", - " 'rxn00074': {'1.16.1.4'},\n", - " 'rxn00075': {'3.2.2.5', '3.2.2.6'},\n", - " 'rxn00076': {'3.6.1.22', '3.6.1.9'},\n", - " 'rxn00077': {'2.7.1.23'},\n", - " 'rxn00078': {'2.7.1.86'},\n", - " 'rxn00079': {'1.6.2.4'},\n", - " 'rxn00080': {'1.16.1.5'},\n", - " 'rxn00082': {'1.14.13.39'},\n", - " 'rxn00083': {'1.6.1.1', '1.6.1.2', '1.6.1.3'},\n", - " 'rxn00084': {'1.11.1.2'},\n", - " 'rxn00085': {'1.4.1.13'},\n", - " 'rxn00086': {'1.6.4.2', '1.8.1.7'},\n", - " 'rxn00087': {'1.8.1.10'},\n", - " 'rxn00088': {'3.1.3.-', '3.1.3.2'},\n", - " 'rxn00089': {'3.2.2.5', '3.2.2.6'},\n", - " 'rxn00090': {'1.8.3.3'},\n", - " 'rxn00091': {'1.13.99.-'},\n", - " 'rxn00092': {'3.6.1.5'},\n", - " 'rxn00093': {'3.5.4.17', '3.5.4.7'},\n", - " 'rxn00095': {'3.6.1.41'},\n", - " 'rxn00096': {'2.7.7.53'},\n", - " 'rxn00097': {'2.7.4.3'},\n", - " 'rxn00098': {'3.6.1.14'},\n", - " 'rxn00099': {'4.2.1.93'},\n", - " 'rxn00100': {'2.7.1.24'},\n", - " 'rxn00101': {'3.5.1.5'},\n", - " 'rxn00102': {'4.2.1.1'},\n", - " 'rxn00103': {'1.17.1.10', '1.2.1.43'},\n", - " 'rxn00104': {'2.7.4.1'},\n", - " 'rxn00105': {'2.7.7.1', '2.7.7.18'},\n", - " 'rxn00106': {'3.6.1.1', '3.6.1.25'},\n", - " 'rxn00107': {'2.7.4.6'},\n", - " 'rxn00108': {'2.7.4.12'},\n", - " 'rxn00109': {'1.7.1.10', '1.7.99.1'},\n", - " 'rxn00110': {'1.14.13.35'},\n", - " 'rxn00111': {'1.14.13.35'},\n", - " 'rxn00112': {'1.13.12.-'},\n", - " 'rxn00113': {'6.3.4.16', '6.3.4.16-'},\n", - " 'rxn00114': {'2.7.2.2'},\n", - " 'rxn00116': {'3.6.1.5', '3.6.1.6'},\n", - " 'rxn00117': {'2.7.4.6'},\n", - " 'rxn00118': {'2.7.4.10'},\n", - " 'rxn00119': {'2.7.4.14', '2.7.4.22', '2.7.4.4'},\n", - " 'rxn00120': {'3.6.1.15', '3.6.1.39', '3.6.1.5'},\n", - " 'rxn00121': {'3.6.1.18', '3.6.1.9'},\n", - " 'rxn00122': {'2.7.7.2'},\n", - " 'rxn00123': {'3.1.3.74'},\n", - " 'rxn00124': {'2.7.1.35'},\n", - " 'rxn00125': {'3.3.1.2'},\n", - " 'rxn00126': {'2.5.1.6'},\n", - " 'rxn00127': {'4.1.1.50'},\n", - " 'rxn00128': {'4.4.1.14'},\n", - " 'rxn00129': {'2.5.1.4'},\n", - " 'rxn00130': {'3.5.4.17', '3.5.4.6'},\n", - " 'rxn00131': {'3.2.2.4'},\n", - " 'rxn00132': {'3.1.3.5'},\n", - " 'rxn00133': {'3.6.1.17', '3.6.1.61'},\n", - " 'rxn00134': {'2.7.1.20', '2.7.1.74'},\n", - " 'rxn00135': {'3.6.1.29'},\n", - " 'rxn00136': {'3.6.1.29'},\n", - " 'rxn00137': {'3.1.3.7'},\n", - " 'rxn00138': {'6.3.1.5', '6.3.5.1'},\n", - " 'rxn00139': {'2.4.2.7', '2.4.2.8'},\n", - " 'rxn00140': {'3.1.4.17', '3.1.4.53'},\n", - " 'rxn00141': {'3.3.1.1'},\n", - " 'rxn00142': {'3.5.4.28'},\n", - " 'rxn00143': {'3.2.2.9'},\n", - " 'rxn00144': {'4.3.1.15'},\n", - " 'rxn00145': {'1.1.2.3'},\n", - " 'rxn00146': {'1.1.2.4'},\n", - " 'rxn00147': {'2.7.9.2'},\n", - " 'rxn00148': {'2.7.1.40'},\n", - " 'rxn00149': {'1.2.1.22', '1.2.1.23', '1.2.1.3'},\n", - " 'rxn00150': {'1.2.1.49'},\n", - " 'rxn00151': {'2.7.9.1'},\n", - " 'rxn00152': {'1.2.3.3'},\n", - " 'rxn00153': {'3.1.3.60'},\n", - " 'rxn00154': {'1.2.1.-', '1.2.1.M10', '1.2.4.1', '1.8.1.4', '2.3.1.12'},\n", - " 'rxn00155': {'1.2.1.51'},\n", - " 'rxn00156': {'1.2.3.6'},\n", - " 'rxn00157': {'2.3.1.54'},\n", - " 'rxn00158': {'4.3.1.13'},\n", - " 'rxn00159': {'1.1.1.38', '1.1.1.39'},\n", - " 'rxn00160': {'1.1.1.83'},\n", - " 'rxn00161': {'1.1.1.40'},\n", - " 'rxn00162': {'1.1.1.38', '1.1.1.40', '4.1.1.112', '4.1.1.3'},\n", - " 'rxn00163': {'4.1.1.78'},\n", - " 'rxn00164': {'4.1.1.-'},\n", - " 'rxn00165': {'4.2.1.13', '4.3.1.17', '4.3.1.19'},\n", - " 'rxn00166': {'4.3.1.18'},\n", - " 'rxn00168': {'4.1.1.1'},\n", - " 'rxn00170': {'3.1.2.1'},\n", - " 'rxn00171': {'1.2.1.10'},\n", - " 'rxn00172': {'6.2.1.13'},\n", - " 'rxn00173': {'2.3.1.8'},\n", - " 'rxn00174': {'4.1.1.9'},\n", - " 'rxn00175': {'6.2.1.1'},\n", - " 'rxn00176': {'6.2.1.1'},\n", - " 'rxn00177': {'4.1.3.24', '4.1.3.25'},\n", - " 'rxn00178': {'2.3.1.9'},\n", - " 'rxn00179': {'2.7.2.11'},\n", - " 'rxn00181': {'2.7.2.13'},\n", - " 'rxn00182': {'1.4.1.2', '1.4.1.3', '1.4.1.4'},\n", - " 'rxn00183': {'1.2.1.88', '1.5.1.12'},\n", - " 'rxn00184': {'1.4.1.3', '1.4.1.4'},\n", - " 'rxn00185': {'1.4.3.11'},\n", - " 'rxn00186': {'3.5.2.9'},\n", - " 'rxn00187': {'6.3.1.2'},\n", - " 'rxn00188': {'3.5.1.87'},\n", - " 'rxn00189': {'3.5.1.2', '3.5.1.38', '6.3.5.4', '6.3.5.5'},\n", - " 'rxn00190': {'6.3.5.1'},\n", - " 'rxn00191': {'2.6.1.2'},\n", - " 'rxn00192': {'2.3.1.1'},\n", - " 'rxn00193': {'5.1.1.3'},\n", - " 'rxn00194': {'4.1.1.15'},\n", - " 'rxn00195': {'5.4.99.1'},\n", - " 'rxn00196': {'1.2.1.26', '1.2.1.3'},\n", - " 'rxn00197': {'1.2.1.52'},\n", - " 'rxn00198': {'1.1.1.42'},\n", - " 'rxn00199': {'1.1.1.42', '4.1.1.-'},\n", - " 'rxn00200': {'3.5.1.-', '3.5.1.111', '3.5.1.3'},\n", - " 'rxn00202': {'2.3.3.14', '4.1.3.21'},\n", - " 'rxn00203': {'4.1.1.71'},\n", - " 'rxn00204': {'1.2.3.4'},\n", - " 'rxn00205': {'1.11.1.9'},\n", - " 'rxn00206': {'1.15.1.1'},\n", - " 'rxn00207': {'1.2.2.4'},\n", - " 'rxn00208': {'1.4.3.5'},\n", - " 'rxn00209': {'1.4.3.5'},\n", - " 'rxn00210': {'1.4.3.15', '1.4.3.7'},\n", - " 'rxn00211': {'1.1.1.22'},\n", - " 'rxn00212': {'3.6.1.45', '3.6.1.8', '3.6.1.9'},\n", - " 'rxn00213': {'2.7.7.9'},\n", - " 'rxn00214': {'5.1.3.2'},\n", - " 'rxn00215': {'4.2.1.76'},\n", - " 'rxn00216': {'2.7.1.1', '2.7.1.2'},\n", - " 'rxn00217': {'1.1.1.118', '1.1.1.121'},\n", - " 'rxn00218': {'1.1.1.119'},\n", - " 'rxn00219': {'1.1.3.10'},\n", - " 'rxn00220': {'3.1.3.58', '3.1.3.9'},\n", - " 'rxn00221': {'3.1.3.10'},\n", - " 'rxn00222': {'3.2.1.21', '3.2.1.74'},\n", - " 'rxn00223': {'5.3.1.5'},\n", - " 'rxn00224': {'4.99.1.1'},\n", - " 'rxn00225': {'2.7.2.1', '2.7.2.15'},\n", - " 'rxn00226': {'6.2.1.1'},\n", - " 'rxn00227': {'3.6.1.7'},\n", - " 'rxn00228': {'3.11.1.2'},\n", - " 'rxn00229': {'1.13.12.4'},\n", - " 'rxn00230': {'2.7.2.12'},\n", - " 'rxn00231': {'3.5.1.4'},\n", - " 'rxn00232': {'3.6.1.20'},\n", - " 'rxn00233': {'3.7.1.6'},\n", - " 'rxn00234': {'4.1.3.22'},\n", - " 'rxn00235': {'3.1.1.33'},\n", - " 'rxn00236': {'3.6.1.42', '3.6.1.5', '3.6.1.6'},\n", - " 'rxn00237': {'2.7.4.6'},\n", - " 'rxn00238': {'2.7.4.6'},\n", - " 'rxn00239': {'2.7.4.8'},\n", - " 'rxn00240': {'2.7.4.10'},\n", - " 'rxn00241': {'3.6.1.15',\n", - " '3.6.1.5',\n", - " '3.6.5.1',\n", - " '3.6.5.2',\n", - " '3.6.5.3',\n", - " '3.6.5.4',\n", - " '3.6.5.5',\n", - " '3.6.5.6'},\n", - " 'rxn00242': {'3.1.7.2'},\n", - " 'rxn00243': {'3.2.1.42'},\n", - " 'rxn00244': {'3.7.1.1'},\n", - " 'rxn00245': {'4.2.1.32'},\n", - " 'rxn00247': {'4.1.1.49'},\n", - " 'rxn00248': {'1.1.1.299', '1.1.1.37'},\n", - " 'rxn00249': {'1.1.1.299', '1.1.1.82'},\n", - " 'rxn00250': {'6.4.1.1'},\n", - " 'rxn00251': {'4.1.1.31'},\n", - " 'rxn00252': {'4.1.1.38'},\n", - " 'rxn00253': {'4.3.1.20'},\n", - " 'rxn00254': {'3.5.1.-', '3.5.1.3'},\n", - " 'rxn00255': {'4.1.3.17'},\n", - " 'rxn00256': {'2.3.3.1', '2.3.3.16', '2.3.3.3', '4.1.3.7'},\n", - " 'rxn00257': {'2.3.3.8'},\n", - " 'rxn00258': {'2.1.3.1'},\n", - " 'rxn00259': {'4.1.3.34'},\n", - " 'rxn00260': {'2.6.1.1'},\n", - " 'rxn00261': {'1.13.11.-'},\n", - " 'rxn00262': {'1.4.3.16', '1.4.3.2'},\n", - " 'rxn00263': {'1.4.3.1', '1.4.3.15'},\n", - " 'rxn00264': {'1.1.3.3'},\n", - " 'rxn00265': {'4.1.3.6'},\n", - " 'rxn00266': {'5.3.2.2'},\n", - " 'rxn00267': {'1.4.2.1'},\n", - " 'rxn00268': {'1.4.1.1', '1.4.1.10'},\n", - " 'rxn00269': {'1.4.3.19', '1.4.3.2', '1.4.3.3'},\n", - " 'rxn00270': {'2.1.1.156', '2.1.1.162', '2.1.1.20'},\n", - " 'rxn00271': {'1.5.1.22'},\n", - " 'rxn00272': {'2.6.1.44'},\n", - " 'rxn00273': {'2.3.1.29'},\n", - " 'rxn00274': {'2.3.1.29'},\n", - " 'rxn00275': {'2.6.1.4', '2.6.1.44'},\n", - " 'rxn00276': {'2.6.1.35'},\n", - " 'rxn00278': {'1.4.1.1'},\n", - " 'rxn00279': {'4.1.1.12'},\n", - " 'rxn00280': {'1.5.1.17'},\n", - " 'rxn00281': {'2.3.1.-'},\n", - " 'rxn00282': {'2.6.1.12'},\n", - " 'rxn00283': {'5.1.1.1'},\n", - " 'rxn00284': {'1.3.1.6'},\n", - " 'rxn00285': {'6.2.1.5'},\n", - " 'rxn00286': {'2.8.3.-', '2.8.3.22'},\n", - " 'rxn00287': {'3.1.2.3'},\n", - " 'rxn00288': {'1.3.99.1'},\n", - " 'rxn00289': {'4.1.3.30'},\n", - " 'rxn00290': {'2.8.3.5'},\n", - " 'rxn00291': {'3.5.1.96'},\n", - " 'rxn00292': {'3.2.1.183', '5.1.3.14'},\n", - " 'rxn00293': {'2.7.7.23'},\n", - " 'rxn00295': {'5.1.3.2', '5.1.3.7'},\n", - " 'rxn00297': {'5.1.3.14'},\n", - " 'rxn00298': {'1.1.1.136'},\n", - " 'rxn00299': {'3.5.4.16'},\n", - " 'rxn00300': {'3.5.4.25'},\n", - " 'rxn00301': {'3.6.1.19', '3.6.1.8'},\n", - " 'rxn00302': {'3.5.4.16'},\n", - " 'rxn00303': {'2.7.6.5'},\n", - " 'rxn00304': {'2.7.1.40'},\n", - " 'rxn00305': {'4.1.1.32'},\n", - " 'rxn00306': {'6.2.1.4'},\n", - " 'rxn00307': {'4.6.1.1', '4.6.1.2'},\n", - " 'rxn00308': {'1.4.1.15'},\n", - " 'rxn00309': {'1.4.1.18'},\n", - " 'rxn00310': {'1.4.3.14'},\n", - " 'rxn00311': {'1.14.13.59'},\n", - " 'rxn00312': {'1.13.12.2'},\n", - " 'rxn00313': {'4.1.1.20'},\n", - " 'rxn00314': {'1.5.1.16'},\n", - " 'rxn00315': {'2.6.1.71'},\n", - " 'rxn00316': {'2.3.1.-'},\n", - " 'rxn00317': {'2.6.1.36'},\n", - " 'rxn00318': {'3.5.1.17'},\n", - " 'rxn00319': {'4.3.1.28'},\n", - " 'rxn00320': {'5.1.1.5', '5.1.1.9'},\n", - " 'rxn00321': {'5.4.3.2'},\n", - " 'rxn00322': {'4.1.1.18'},\n", - " 'rxn00323': {'3.5.2.11'},\n", - " 'rxn00324': {'1.1.1.26', '1.1.1.79'},\n", - " 'rxn00325': {'1.2.3.5'},\n", - " 'rxn00326': {'1.2.1.17'},\n", - " 'rxn00327': {'3.5.1.116', '3.5.3.19'},\n", - " 'rxn00328': {'4.1.3.16', '4.1.3.42'},\n", - " 'rxn00330': {'2.3.3.9', '4.1.3.2'},\n", - " 'rxn00331': {'4.1.3.24'},\n", - " 'rxn00332': {'2.2.1.5'},\n", - " 'rxn00333': {'1.1.3.15'},\n", - " 'rxn00334': {'4.1.3.13'},\n", - " 'rxn00335': {'4.1.3.14'},\n", - " 'rxn00336': {'4.1.3.1'},\n", - " 'rxn00337': {'2.7.2.4'},\n", - " 'rxn00338': {'1.4.3.16'},\n", - " 'rxn00339': {'6.3.1.4'},\n", - " 'rxn00340': {'6.3.1.1', '6.3.5.4'},\n", - " 'rxn00341': {'3.5.1.7'},\n", - " 'rxn00342': {'3.5.1.1', '3.5.1.38'},\n", - " 'rxn00343': {'3.5.5.4'},\n", - " 'rxn00344': {'2.3.1.17'},\n", - " 'rxn00345': {'3.5.1.15'},\n", - " 'rxn00346': {'4.1.1.11', '4.1.1.15'},\n", - " 'rxn00347': {'3.5.1.38', '4.3.1.1'},\n", - " 'rxn00348': {'5.1.1.13'},\n", - " 'rxn00350': {'2.3.2.2', '3.4.19.13'},\n", - " 'rxn00351': {'6.3.2.3'},\n", - " 'rxn00352': {'3.1.2.13'},\n", - " 'rxn00353': {'1.8.4.-'},\n", - " 'rxn00354': {'1.1.1.-'},\n", - " 'rxn00355': {'2.7.7.10'},\n", - " 'rxn00356': {'2.4.1.22'},\n", - " 'rxn00357': {'2.7.8.18'},\n", - " 'rxn00358': {'5.4.99.9'},\n", - " 'rxn00359': {'3.6.1.9', '3.6.2.2'},\n", - " 'rxn00360': {'3.1.3.7'},\n", - " 'rxn00361': {'2.7.1.25'},\n", - " 'rxn00362': {'3.2.2.10'},\n", - " 'rxn00363': {'3.1.3.5', '3.1.3.91'},\n", - " 'rxn00364': {'2.7.4.14', '2.7.4.25'},\n", - " 'rxn00365': {'2.7.1.-', '2.7.1.213', '2.7.1.48'},\n", - " 'rxn00366': {'3.6.1.5', '3.6.1.6'},\n", - " 'rxn00367': {'3.6.1.-', '3.6.1.65', '3.6.1.8'},\n", - " 'rxn00368': {'2.7.1.48'},\n", - " 'rxn00369': {'2.7.1.-', '2.7.1.48'},\n", - " 'rxn00370': {'2.7.2.6'},\n", - " 'rxn00371': {'1.17.1.9', '1.2.1.2'},\n", - " 'rxn00372': {'3.1.2.10'},\n", - " 'rxn00373': {'4.1.1.2'},\n", - " 'rxn00374': {'3.5.1.49'},\n", - " 'rxn00375': {'3.5.1.68'},\n", - " 'rxn00376': {'3.5.1.15', '3.5.1.8'},\n", - " 'rxn00377': {'3.1.2.12'},\n", - " 'rxn00378': {'1.8.2.1'},\n", - " 'rxn00379': {'2.7.7.4'},\n", - " 'rxn00380': {'2.7.7.5'},\n", - " 'rxn00381': {'3.6.2.1'},\n", - " 'rxn00382': {'4.3.1.10'},\n", - " 'rxn00383': {'1.8.3.1'},\n", - " 'rxn00384': {'3.1.6.3'},\n", - " 'rxn00385': {'2.8.2.15'},\n", - " 'rxn00386': {'2.8.2.15'},\n", - " 'rxn00387': {'2.8.2.15'},\n", - " 'rxn00388': {'3.5.5.1', '3.5.5.2', '3.5.5.5', '3.5.5.7'},\n", - " 'rxn00389': {'3.5.1.17'},\n", - " 'rxn00390': {'3.5.1.15'},\n", - " 'rxn00391': {'3.1.3.-', '3.1.3.102', '3.1.3.2'},\n", - " 'rxn00392': {'2.7.1.26'},\n", - " 'rxn00393': {'2.7.1.42'},\n", - " 'rxn00394': {'3.5.3.1'},\n", - " 'rxn00395': {'3.5.3.6'},\n", - " 'rxn00396': {'2.7.3.3'},\n", - " 'rxn00397': {'2.4.2.31'},\n", - " 'rxn00398': {'1.4.3.-', '1.4.3.2'},\n", - " 'rxn00399': {'1.14.13.39'},\n", - " 'rxn00400': {'1.14.13.39'},\n", - " 'rxn00401': {'1.13.12.1'},\n", - " 'rxn00402': {'1.5.1.11'},\n", - " 'rxn00403': {'1.5.1.19'},\n", - " 'rxn00404': {'2.1.4.1'},\n", - " 'rxn00405': {'4.1.1.19'},\n", - " 'rxn00406': {'5.1.1.9'},\n", - " 'rxn00407': {'3.5.4.13'},\n", - " 'rxn00408': {'3.6.1.15', '3.6.1.5'},\n", - " 'rxn00409': {'2.7.4.6'},\n", - " 'rxn00410': {'6.3.4.2'},\n", - " 'rxn00411': {'2.7.1.40'},\n", - " 'rxn00412': {'6.3.4.2'},\n", - " 'rxn00413': {'4.6.1.6'},\n", - " 'rxn00414': {'6.3.5.5'},\n", - " 'rxn00415': {'2.6.1.15'},\n", - " 'rxn00416': {'6.3.5.4'},\n", - " 'rxn00417': {'5.1.1.10'},\n", - " 'rxn00418': {'2.7.7.-'},\n", - " 'rxn00419': {'1.4.1.7'},\n", - " 'rxn00420': {'3.1.3.3'},\n", - " 'rxn00421': {'2.7.1.80'},\n", - " 'rxn00422': {'2.6.1.51'},\n", - " 'rxn00423': {'2.3.1.30'},\n", - " 'rxn00424': {'2.6.1.45'},\n", - " 'rxn00425': {'5.1.1.10', '5.1.1.18'},\n", - " 'rxn00426': {'4.3.1.17'},\n", - " 'rxn00427': {'1.11.1.21', '1.11.1.6', '1.11.1.7'},\n", - " 'rxn00428': {'4.5.1.3'},\n", - " 'rxn00429': {'1.2.1.46'},\n", - " 'rxn00430': {'1.1.1.244'},\n", - " 'rxn00431': {'1.4.99.3'},\n", - " 'rxn00432': {'1.1.3.13'},\n", - " 'rxn00433': {'1.5.3.1'},\n", - " 'rxn00434': {'1.5.3.4'},\n", - " 'rxn00435': {'1.2.98.1', '1.2.99.4'},\n", - " 'rxn00436': {'3.6.1.15'},\n", - " 'rxn00437': {'2.7.4.15', '2.7.6.2'},\n", - " 'rxn00438': {'2.7.4.16'},\n", - " 'rxn00439': {'3.6.1.28'},\n", - " 'rxn00440': {'2.7.6.2'},\n", - " 'rxn00441': {'1.2.4.2'},\n", - " 'rxn00442': {'4.1.1.71'},\n", - " 'rxn00443': {'1.3.2.3'},\n", - " 'rxn00444': {'1.11.1.11'},\n", - " 'rxn00445': {'1.3.3.12'},\n", - " 'rxn00447': {'1.14.-.-'},\n", - " 'rxn00448': {'1.13.11.13'},\n", - " 'rxn00449': {'1.1.3.8'},\n", - " 'rxn00450': {'1.4.3.2'},\n", - " 'rxn00451': {'2.1.1.12'},\n", - " 'rxn00452': {'2.1.1.10'},\n", - " 'rxn00453': {'2.5.1.49', '4.2.99.10'},\n", - " 'rxn00454': {'2.6.1.73'},\n", - " 'rxn00455': {'3.5.1.31'},\n", - " 'rxn00456': {'4.4.1.11'},\n", - " 'rxn00457': {'5.1.1.2'},\n", - " 'rxn00458': {'4.1.1.57'},\n", - " 'rxn00459': {'4.2.1.11'},\n", - " 'rxn00460': {'2.7.1.40'},\n", - " 'rxn00461': {'2.5.1.7'},\n", - " 'rxn00462': {'5.4.2.9'},\n", - " 'rxn00463': {'3.6.1.19', '3.6.1.8'},\n", - " 'rxn00464': {'2.3.1.127'},\n", - " 'rxn00465': {'3.5.1.20'},\n", - " 'rxn00466': {'1.5.1.24'},\n", - " 'rxn00467': {'2.6.1.13'},\n", - " 'rxn00468': {'2.6.1.13', '2.6.1.68'},\n", - " 'rxn00469': {'3.5.1.14', '3.5.1.16'},\n", - " 'rxn00470': {'4.1.1.17'},\n", - " 'rxn00471': {'4.3.1.12'},\n", - " 'rxn00472': {'5.1.1.10', '5.1.1.12', '5.1.1.9'},\n", - " 'rxn00473': {'4.1.99.1'},\n", - " 'rxn00474': {'4.2.1.122', '4.2.1.20'},\n", - " 'rxn00475': {'1.4.1.19'},\n", - " 'rxn00476': {'1.4.1.19'},\n", - " 'rxn00477': {'1.4.3.2'},\n", - " 'rxn00478': {'1.13.11.11', '1.13.11.52'},\n", - " 'rxn00479': {'1.13.12.3'},\n", - " 'rxn00480': {'1.13.99.3'},\n", - " 'rxn00481': {'3.5.1.57'},\n", - " 'rxn00483': {'2.6.1.27'},\n", - " 'rxn00484': {'4.1.1.105', '4.1.1.28'},\n", - " 'rxn00485': {'5.1.1.11'},\n", - " 'rxn00486': {'2.7.7.54'},\n", - " 'rxn00487': {'1.4.1.20'},\n", - " 'rxn00488': {'1.4.3.2'},\n", - " 'rxn00489': {'1.11.1.21', '1.11.1.7', '1.13.12.9'},\n", - " 'rxn00490': {'4.2.1.51', '4.2.1.91'},\n", - " 'rxn00491': {'2.6.1.58'},\n", - " 'rxn00492': {'2.3.1.53'},\n", - " 'rxn00493': {'2.6.1.1', '2.6.1.5', '2.6.1.57', '2.6.1.58', '2.6.1.9'},\n", - " 'rxn00494': {'2.6.1.70'},\n", - " 'rxn00495': {'4.3.1.24', '4.3.1.25', '4.3.1.5'},\n", - " 'rxn00496': {'1.11.1.7'},\n", - " 'rxn00497': {'4.1.1.28', '4.1.1.53'},\n", - " 'rxn00498': {'2.5.1.-', '2.5.1.103', '2.5.1.21', '2.5.1.96'},\n", - " 'rxn00499': {'1.1.1.27'},\n", - " 'rxn00500': {'1.1.1.28'},\n", - " 'rxn00501': {'1.2.1.18', '1.2.1.27'},\n", - " 'rxn00502': {'1.2.1.18'},\n", - " 'rxn00503': {'1.5.1.12'},\n", - " 'rxn00504': {'1.5.1.12'},\n", - " 'rxn00505': {'1.1.1.286', '1.1.1.41'},\n", - " 'rxn00506': {'1.2.1.3', '1.2.1.5'},\n", - " 'rxn00507': {'1.2.1.3', '1.2.1.4', '1.2.1.5'},\n", - " 'rxn00508': {'1.2.1.16', '1.2.1.24'},\n", - " 'rxn00509': {'1.2.1.16', '1.2.1.79'},\n", - " 'rxn00510': {'1.5.1.7'},\n", - " 'rxn00511': {'1.5.1.8'},\n", - " 'rxn00512': {'1.1.1.26', '1.1.1.29', '1.1.99.14'},\n", - " 'rxn00513': {'3.6.1.-', '3.6.1.15', '3.6.1.5'},\n", - " 'rxn00514': {'3.6.1.-', '3.6.1.19', '3.6.1.8'},\n", - " 'rxn00515': {'2.7.4.6'},\n", - " 'rxn00516': {'3.6.1.14'},\n", - " 'rxn00517': {'2.7.1.40'},\n", - " 'rxn00518': {'2.7.1.1'},\n", - " 'rxn00519': {'4.1.1.32'},\n", - " 'rxn00520': {'6.2.1.4'},\n", - " 'rxn00521': {'4.1.99.2'},\n", - " 'rxn00522': {'1.4.3.2'},\n", - " 'rxn00523': {'1.14.13.41'},\n", - " 'rxn00524': {'1.14.18.1'},\n", - " 'rxn00525': {'1.3.1.43', '1.3.1.79'},\n", - " 'rxn00526': {'1.3.1.78', '1.3.1.79'},\n", - " 'rxn00527': {'2.6.1.1', '2.6.1.5', '2.6.1.57', '2.6.1.9'},\n", - " 'rxn00528': {'6.3.2.24'},\n", - " 'rxn00529': {'4.1.1.25', '4.1.1.28'},\n", - " 'rxn00530': {'4.3.1.23', '4.3.1.25'},\n", - " 'rxn00531': {'5.4.3.6'},\n", - " 'rxn00532': {'1.2.1.-', '1.2.1.18', '1.2.1.75'},\n", - " 'rxn00533': {'6.4.1.2'},\n", - " 'rxn00534': {'2.8.3.3'},\n", - " 'rxn00536': {'1.1.1.2', '1.1.1.71'},\n", - " 'rxn00537': {'3.11.1.1'},\n", - " 'rxn00538': {'4.2.3.2'},\n", - " 'rxn00539': {'4.3.1.7'},\n", - " 'rxn00540': {'4.1.3.39'},\n", - " 'rxn00541': {'4.1.2.5'},\n", - " 'rxn00542': {'4.1.2.36'},\n", - " 'rxn00543': {'1.1.1.1', '1.1.1.71'},\n", - " 'rxn00544': {'4.1.1.1'},\n", - " 'rxn00545': {'2.7.1.11'},\n", - " 'rxn00546': {'1.1.1.17'},\n", - " 'rxn00547': {'2.7.1.1', '2.7.1.4'},\n", - " 'rxn00548': {'4.1.2.22'},\n", - " 'rxn00549': {'3.1.3.11'},\n", - " 'rxn00550': {'3.1.3.46'},\n", - " 'rxn00551': {'2.7.1.90'},\n", - " 'rxn00552': {'3.5.99.6'},\n", - " 'rxn00553': {'2.4.1.14'},\n", - " 'rxn00554': {'2.7.1.11'},\n", - " 'rxn00555': {'2.6.1.16'},\n", - " 'rxn00556': {'2.7.1.11'},\n", - " 'rxn00557': {'2.7.1.11'},\n", - " 'rxn00558': {'5.3.1.9'},\n", - " 'rxn00559': {'5.3.1.8'},\n", - " 'rxn00560': {'6.3.4.6'},\n", - " 'rxn00561': {'3.5.3.2'},\n", - " 'rxn00562': {'4.3.2.3'},\n", - " 'rxn00563': {'3.5.3.14'},\n", - " 'rxn00564': {'4.2.1.69'},\n", - " 'rxn00565': {'1.13.11.18'},\n", - " 'rxn00566': {'4.1.99.1', '4.4.1.1', '4.4.1.28', '4.4.1.8'},\n", - " 'rxn00567': {'1.7.2.1'},\n", - " 'rxn00568': {'1.6.6.-', '1.7.1.15', '1.7.1.4'},\n", - " 'rxn00569': {'1.7.1.4'},\n", - " 'rxn00570': {'1.7.3.4', '1.7.3.6'},\n", - " 'rxn00571': {'1.6.6.1', '1.7.1.1', '1.7.1.2'},\n", - " 'rxn00572': {'1.7.1.2', '1.7.1.3'},\n", - " 'rxn00573': {'1.7.3.1'},\n", - " 'rxn00575': {'3.2.1.10', '3.2.1.20', '3.2.1.48'},\n", - " 'rxn00577': {'2.4.1.7'},\n", - " 'rxn00578': {'3.1.3.24'},\n", - " 'rxn00579': {'2.4.1.13'},\n", - " 'rxn00580': {'1.1.99.13'},\n", - " 'rxn00581': {'2.4.1.167'},\n", - " 'rxn00582': {'5.4.99.11'},\n", - " 'rxn00583': {'1.3.1.19'},\n", - " 'rxn00584': {'1.3.1.25'},\n", - " 'rxn00585': {'1.3.1.20'},\n", - " 'rxn00586': {'1.14.13.7'},\n", - " 'rxn00587': {'1.13.11.2'},\n", - " 'rxn00588': {'1.13.11.1'},\n", - " 'rxn00589': {'1.14.13.1'},\n", - " 'rxn00590': {'1.14.12.10'},\n", - " 'rxn00591': {'1.3.1.25'},\n", - " 'rxn00592': {'4.1.1.46'},\n", - " 'rxn00593': {'4.1.1.63'},\n", - " 'rxn00594': {'1.14.12.1'},\n", - " 'rxn00595': {'1.14.12.1'},\n", - " 'rxn00596': {'2.1.1.6'},\n", - " 'rxn00597': {'1.14.13.31'},\n", - " 'rxn00598': {'2.3.1.-', '2.3.1.16', '2.3.1.174'},\n", - " 'rxn00599': {'2.3.1.37'},\n", - " 'rxn00600': {'2.3.1.37'},\n", - " 'rxn00601': {'2.3.1.109'},\n", - " 'rxn00602': {'5.4.99.2'},\n", - " 'rxn00603': {'1.1.1.200'},\n", - " 'rxn00604': {'1.1.1.363', '1.1.1.49'},\n", - " 'rxn00605': {'2.4.1.15'},\n", - " 'rxn00606': {'3.2.1.122', '3.2.1.93'},\n", - " 'rxn00607': {'3.2.1.122'},\n", - " 'rxn00608': {'3.2.1.86'},\n", - " 'rxn00610': {'3.1.3.21'},\n", - " 'rxn00611': {'1.1.1.8', '1.1.1.94'},\n", - " 'rxn00612': {'1.1.1.94'},\n", - " 'rxn00613': {'1.1.1.177'},\n", - " 'rxn00614': {'1.1.3.21'},\n", - " 'rxn00615': {'2.7.1.30'},\n", - " 'rxn00616': {'1.1.5.3', '1.1.99.5'},\n", - " 'rxn00617': {'2.7.1.142'},\n", - " 'rxn00618': {'2.4.1.137'},\n", - " 'rxn00619': {'2.4.1.96'},\n", - " 'rxn00620': {'3.6.1.16'},\n", - " 'rxn00621': {'2.7.7.39'},\n", - " 'rxn00622': {'3.1.4.46'},\n", - " 'rxn00623': {'1.8.1.2', '1.8.2.2'},\n", - " 'rxn00624': {'4.1.1.12'},\n", - " 'rxn00626': {'1.1.2.2'},\n", - " 'rxn00627': {'2.7.1.3'},\n", - " 'rxn00629': {'1.1.1.11', '1.1.1.67'},\n", - " 'rxn00630': {'1.1.1.138'},\n", - " 'rxn00631': {'1.1.1.124'},\n", - " 'rxn00632': {'3.1.3.-'},\n", - " 'rxn00633': {'1.1.99.28'},\n", - " 'rxn00634': {'1.1.1.14', '1.1.1.15'},\n", - " 'rxn00635': {'2.7.1.1'},\n", - " 'rxn00636': {'5.3.1.7'},\n", - " 'rxn00638': {'1.1.1.132'},\n", - " 'rxn00639': {'3.6.1.-', '3.6.1.21'},\n", - " 'rxn00640': {'2.7.7.22'},\n", - " 'rxn00641': {'2.7.7.13'},\n", - " 'rxn00642': {'4.2.1.47'},\n", - " 'rxn00643': {'5.1.3.18'},\n", - " 'rxn00644': {'1.8.1.6'},\n", - " 'rxn00645': {'1.13.11.20'},\n", - " 'rxn00646': {'6.3.2.2'},\n", - " 'rxn00647': {'2.6.1.1', '2.6.1.3'},\n", - " 'rxn00649': {'2.5.1.47', '2.5.1.65'},\n", - " 'rxn00650': {'3.4.11.1', '3.4.11.2', '3.4.11.23', '3.4.13.-', '3.4.13.18'},\n", - " 'rxn00651': {'4.4.1.10'},\n", - " 'rxn00652': {'5.1.1.10'},\n", - " 'rxn00653': {'1.2.1.-', '1.2.1.19', '1.2.1.3', '1.2.1.5'},\n", - " 'rxn00654': {'3.5.1.6'},\n", - " 'rxn00655': {'1.5.1.26'},\n", - " 'rxn00656': {'2.6.1.18'},\n", - " 'rxn00657': {'2.6.1.19', '2.6.1.55'},\n", - " 'rxn00658': {'3.5.1.21'},\n", - " 'rxn00659': {'6.3.2.11'},\n", - " 'rxn00660': {'3.4.13.4'},\n", - " 'rxn00661': {'6.3.2.11'},\n", - " 'rxn00662': {'3.5.3.17'},\n", - " 'rxn00667': {'2.3.1.94'},\n", - " 'rxn00668': {'1.3.1.-', '1.3.1.84'},\n", - " 'rxn00669': {'6.2.1.13'},\n", - " 'rxn00670': {'2.3.1.-', '2.3.1.222', '2.3.1.8'},\n", - " 'rxn00671': {'1.2.1.27'},\n", - " 'rxn00672': {'4.1.1.41', '4.1.1.94', '7.2.4.3'},\n", - " 'rxn00673': {'1.3.99.3'},\n", - " 'rxn00674': {'6.2.1.1', '6.2.1.17'},\n", - " 'rxn00675': {'6.2.1.1', '6.2.1.17'},\n", - " 'rxn00676': {'2.3.1.16', '2.3.1.9'},\n", - " 'rxn00677': {'2.8.3.1'},\n", - " 'rxn00678': {'2.1.3.1'},\n", - " 'rxn00679': {'2.3.3.5', '4.1.3.31'},\n", - " 'rxn00680': {'2.3.3.11'},\n", - " 'rxn00682': {'4.1.3.24'},\n", - " 'rxn00684': {'1.5.1.3'},\n", - " 'rxn00685': {'1.5.1.3'},\n", - " 'rxn00686': {'1.5.1.3'},\n", - " 'rxn00687': {'1.5.1.3'},\n", - " 'rxn00688': {'1.5.1.6'},\n", - " 'rxn00689': {'6.3.2.17'},\n", - " 'rxn00690': {'6.3.4.3'},\n", - " 'rxn00691': {'3.5.1.10'},\n", - " 'rxn00692': {'2.1.2.1'},\n", - " 'rxn00693': {'2.1.1.13'},\n", - " 'rxn00695': {'2.7.7.27'},\n", - " 'rxn00696': {'2.7.1.10'},\n", - " 'rxn00697': {'3.6.1.21'},\n", - " 'rxn00698': {'2.4.1.20'},\n", - " 'rxn00699': {'2.4.1.31'},\n", - " 'rxn00700': {'2.7.7.34'},\n", - " 'rxn00701': {'2.7.7.12'},\n", - " 'rxn00702': {'2.7.7.33'},\n", - " 'rxn00703': {'2.4.1.139'},\n", - " 'rxn00704': {'5.4.2.2', '5.4.2.5'},\n", - " 'rxn00705': {'2.7.1.41'},\n", - " 'rxn00706': {'3.6.1.5', '3.6.1.6', '3.6.1.64'},\n", - " 'rxn00707': {'2.7.1.48'},\n", - " 'rxn00708': {'3.1.3.5'},\n", - " 'rxn00709': {'2.7.1.48'},\n", - " 'rxn00710': {'4.1.1.23'},\n", - " 'rxn00711': {'2.4.2.9'},\n", - " 'rxn00712': {'2.7.1.48'},\n", - " 'rxn00713': {'2.7.1.48'},\n", - " 'rxn00714': {'3.6.1.17'},\n", - " 'rxn00715': {'2.7.1.48'},\n", - " 'rxn00716': {'4.1.1.66'},\n", - " 'rxn00717': {'3.5.4.1'},\n", - " 'rxn00718': {'1.3.3.7'},\n", - " 'rxn00719': {'1.3.1.1'},\n", - " 'rxn00720': {'1.3.1.2'},\n", - " 'rxn00721': {'2.7.7.55'},\n", - " 'rxn00722': {'1.14.13.35'},\n", - " 'rxn00723': {'6.2.1.32'},\n", - " 'rxn00724': {'1.13.11.23'},\n", - " 'rxn00725': {'2.1.1.111'},\n", - " 'rxn00726': {'4.1.3.27'},\n", - " 'rxn00727': {'4.1.3.27'},\n", - " 'rxn00728': {'3.7.1.3'},\n", - " 'rxn00729': {'3.5.1.9'},\n", - " 'rxn00730': {'2.3.1.113'},\n", - " 'rxn00731': {'4.1.1.24'},\n", - " 'rxn00735': {'1.1.1.85'},\n", - " 'rxn00736': {'4.1.1.3'},\n", - " 'rxn00737': {'4.3.1.19'},\n", - " 'rxn00738': {'3.5.99.7', '4.1.99.4-'},\n", - " 'rxn00739': {'2.3.3.6'},\n", - " 'rxn00740': {'2.5.1.48', '4.3.1.-'},\n", - " 'rxn00741': {'1.1.1.27'},\n", - " 'rxn00742': {'4.4.1.1'},\n", - " 'rxn00743': {'3.1.3.1', '3.1.3.2'},\n", - " 'rxn00744': {'2.7.1.29'},\n", - " 'rxn00745': {'2.7.1.121'},\n", - " 'rxn00746': {'4.1.2.2'},\n", - " 'rxn00747': {'5.3.1.1'},\n", - " 'rxn00748': {'4.2.3.3'},\n", - " 'rxn00749': {'1.2.99.3'},\n", - " 'rxn00751': {'2.7.1.32'},\n", - " 'rxn00752': {'1.1.3.17'},\n", - " 'rxn00753': {'2.3.1.6'},\n", - " 'rxn00754': {'3.1.1.7', '3.1.1.8'},\n", - " 'rxn00755': {'2.8.2.6'},\n", - " 'rxn00756': {'3.1.6.6'},\n", - " 'rxn00757': {'3.1.1.8'},\n", - " 'rxn00758': {'3.1.4.2', '3.1.4.46'},\n", - " 'rxn00759': {'4.5.1.2'},\n", - " 'rxn00761': {'1.14.12.13'},\n", - " 'rxn00762': {'1.1.1.6'},\n", - " 'rxn00763': {'1.1.1.-', '1.1.1.1', '1.1.1.21', '1.1.1.72'},\n", - " 'rxn00764': {'1.1.1.156'},\n", - " 'rxn00765': {'1.1.1.2', '1.1.1.21', '1.1.1.372', '1.1.1.72'},\n", - " 'rxn00766': {'3.1.3.19'},\n", - " 'rxn00767': {'2.7.1.79'},\n", - " 'rxn00768': {'4.2.1.30'},\n", - " 'rxn00769': {'4.2.1.30'},\n", - " 'rxn00770': {'2.7.6.1'},\n", - " 'rxn00771': {'2.7.1.18'},\n", - " 'rxn00772': {'2.7.1.15'},\n", - " 'rxn00773': {'2.7.7.35'},\n", - " 'rxn00774': {'6.3.4.7'},\n", - " 'rxn00775': {'3.6.1.-', '3.6.1.13', '3.6.1.21', '3.6.1.53'},\n", - " 'rxn00776': {'3.2.-.-', '4.2.1.70'},\n", - " 'rxn00777': {'5.3.1.6'},\n", - " 'rxn00778': {'5.4.2.2', '5.4.2.7'},\n", - " 'rxn00779': {'1.2.1.9'},\n", - " 'rxn00780': {'2.7.1.28'},\n", - " 'rxn00781': {'1.2.1.12', '1.2.1.59'},\n", - " 'rxn00782': {'1.2.1.13', '1.2.1.59'},\n", - " 'rxn00783': {'4.1.2.21', '4.1.2.55'},\n", - " 'rxn00784': {'4.1.2.4'},\n", - " 'rxn00785': {'2.2.1.1'},\n", - " 'rxn00786': {'4.1.2.13'},\n", - " 'rxn00787': {'4.1.2.40'},\n", - " 'rxn00789': {'2.4.2.17'},\n", - " 'rxn00790': {'2.4.2.14'},\n", - " 'rxn00791': {'2.4.2.18'},\n", - " 'rxn00792': {'6.2.1.11', '6.3.4.10', '6.3.4.11', '6.3.4.15', '6.3.4.9'},\n", - " 'rxn00793': {'6.2.1.11'},\n", - " 'rxn00794': {'3.5.1.12'},\n", - " 'rxn00795': {'3.5.1.12'},\n", - " 'rxn00797': {'3.2.2.3', '3.2.2.8'},\n", - " 'rxn00798': {'5.3.1.20'},\n", - " 'rxn00799': {'4.2.1.2'},\n", - " 'rxn00800': {'4.3.2.2'},\n", - " 'rxn00801': {'3.7.1.-', '3.7.1.20', '3.7.1.5'},\n", - " 'rxn00802': {'4.3.2.1'},\n", - " 'rxn00803': {'5.2.1.1'},\n", - " 'rxn00804': {'1.4.1.9'},\n", - " 'rxn00805': {'2.3.1.66'},\n", - " 'rxn00806': {'2.6.1.42', '2.6.1.6', '2.6.1.67'},\n", - " 'rxn00807': {'5.4.3.7'},\n", - " 'rxn00808': {'2.7.1.6'},\n", - " 'rxn00809': {'1.1.1.21'},\n", - " 'rxn00810': {'1.1.1.48'},\n", - " 'rxn00811': {'1.1.1.21'},\n", - " 'rxn00812': {'1.1.1.120', '1.1.1.359', '1.1.1.360', '1.1.1.48'},\n", - " 'rxn00813': {'1.1.1.120', '1.1.1.48'},\n", - " 'rxn00814': {'1.1.3.9'},\n", - " 'rxn00815': {'1.1.3.9'},\n", - " 'rxn00816': {'3.2.1.108', '3.2.1.23'},\n", - " 'rxn00817': {'3.2.1.22'},\n", - " 'rxn00818': {'3.2.1.22'},\n", - " 'rxn00819': {'3.2.1.22'},\n", - " 'rxn00820': {'1.7.99.4'},\n", - " 'rxn00821': {'1.8.5.1'},\n", - " 'rxn00822': {'1.8.4.4'},\n", - " 'rxn00824': {'1.8.4.3'},\n", - " 'rxn00826': {'1.8.4.4'},\n", - " 'rxn00827': {'2.7.7.43'},\n", - " 'rxn00829': {'4.1.1.33'},\n", - " 'rxn00830': {'5.3.3.2'},\n", - " 'rxn00831': {'3.1.3.5', '3.1.3.99'},\n", - " 'rxn00832': {'2.1.2.3', '3.5.4.10'},\n", - " 'rxn00833': {'3.2.2.12'},\n", - " 'rxn00834': {'1.1.1.205'},\n", - " 'rxn00835': {'2.7.1.73'},\n", - " 'rxn00836': {'2.4.2.8'},\n", - " 'rxn00837': {'1.6.6.8', '1.7.1.7'},\n", - " 'rxn00838': {'6.3.4.4'},\n", - " 'rxn00839': {'2.7.4.6'},\n", - " 'rxn00840': {'2.7.1.40'},\n", - " 'rxn00841': {'2.7.1.1'},\n", - " 'rxn00842': {'2.7.1.1'},\n", - " 'rxn00843': {'1.14.13.25'},\n", - " 'rxn00844': {'1.14.13.25'},\n", - " 'rxn00845': {'3.1.1.44'},\n", - " 'rxn00846': {'3.1.6.16'},\n", - " 'rxn00847': {'1.1.99.8'},\n", - " 'rxn00848': {'2.6.1.54'},\n", - " 'rxn00849': {'2.6.1.21'},\n", - " 'rxn00850': {'2.3.2.14'},\n", - " 'rxn00851': {'6.3.2.4'},\n", - " 'rxn00852': {'1.4.3.10', '1.4.3.22'},\n", - " 'rxn00853': {'3.5.1.53'},\n", - " 'rxn00854': {'2.1.1.53'},\n", - " 'rxn00855': {'2.3.1.57'},\n", - " 'rxn00856': {'2.6.1.29', '2.6.1.82'},\n", - " 'rxn00857': {'3.5.1.62'},\n", - " 'rxn00858': {'3.5.3.11'},\n", - " 'rxn00859': {'1.1.1.23'},\n", - " 'rxn00860': {'2.1.1.-'},\n", - " 'rxn00861': {'2.3.1.33'},\n", - " 'rxn00862': {'2.6.1.38'},\n", - " 'rxn00863': {'1.1.1.23'},\n", - " 'rxn00864': {'6.3.2.11'},\n", - " 'rxn00865': {'3.4.13.18', '3.4.13.20'},\n", - " 'rxn00866': {'4.1.1.22', '4.1.1.28'},\n", - " 'rxn00867': {'4.3.1.3'},\n", - " 'rxn00868': {'1.3.1.44', '1.3.8.1'},\n", - " 'rxn00869': {'1.2.1.10', '1.2.1.57', '1.2.1.87'},\n", - " 'rxn00870': {'1.2.1.57'},\n", - " 'rxn00871': {'2.3.1.19'},\n", - " 'rxn00872': {'1.3.3.6', '1.3.8.1', '1.3.99.-', '1.3.99.2', '1.3.99.3'},\n", - " 'rxn00873': {'6.2.1.2', '6.2.1.3'},\n", - " 'rxn00874': {'2.3.1.16', '2.3.1.9'},\n", - " 'rxn00875': {'2.8.3.8'},\n", - " 'rxn00876': {'2.3.3.7'},\n", - " 'rxn00877': {'5.4.99.13'},\n", - " 'rxn00878': {'2.7.1.64'},\n", - " 'rxn00879': {'1.1.1.18'},\n", - " 'rxn00880': {'1.13.99.1'},\n", - " 'rxn00881': {'3.1.3.25'},\n", - " 'rxn00882': {'3.1.3.25'},\n", - " 'rxn00883': {'3.1.3.25'},\n", - " 'rxn00884': {'2.1.1.40'},\n", - " 'rxn00885': {'2.1.1.39'},\n", - " 'rxn00886': {'2.1.1.129'},\n", - " 'rxn00887': {'2.1.1.129'},\n", - " 'rxn00888': {'2.4.1.123'},\n", - " 'rxn00889': {'3.1.4.44', '3.1.4.46'},\n", - " 'rxn00890': {'3.2.1.22'},\n", - " 'rxn00891': {'3.5.1.33'},\n", - " 'rxn00892': {'2.7.1.59'},\n", - " 'rxn00893': {'1.1.1.240'},\n", - " 'rxn00894': {'1.1.3.29'},\n", - " 'rxn00895': {'2.3.1.3'},\n", - " 'rxn00896': {'2.4.1.90'},\n", - " 'rxn00897': {'2.7.1.59', '5.1.3.8'},\n", - " 'rxn00898': {'4.2.1.9'},\n", - " 'rxn00899': {'1.2.1.25'},\n", - " 'rxn00900': {'1.1.1.84'},\n", - " 'rxn00901': {'1.4.1.8'},\n", - " 'rxn00902': {'2.3.3.13', '4.1.3.12'},\n", - " 'rxn00903': {'2.6.1.42', '2.6.1.6'},\n", - " 'rxn00904': {'2.6.1.66'},\n", - " 'rxn00905': {'2.1.2.11', '4.1.2.12'},\n", - " 'rxn00906': {'1.5.1.15'},\n", - " 'rxn00907': {'1.5.1.5'},\n", - " 'rxn00908': {'1.4.4.2', '1.8.1.4', '2.1.2.10'},\n", - " 'rxn00909': {'1.5.1.20', '1.7.99.5'},\n", - " 'rxn00910': {'1.5.1.20'},\n", - " 'rxn00911': {'2.1.2.7'},\n", - " 'rxn00912': {'2.1.2.11'},\n", - " 'rxn00913': {'3.1.3.5'},\n", - " 'rxn00914': {'2.7.1.73'},\n", - " 'rxn00915': {'2.4.2.22', '2.4.2.7', '2.4.2.8'},\n", - " 'rxn00916': {'6.3.4.1', '6.3.5.2'},\n", - " 'rxn00917': {'6.3.5.2'},\n", - " 'rxn00918': {'3.6.1.17'},\n", - " 'rxn00919': {'3.6.1.21'},\n", - " 'rxn00920': {'3.1.4.17', '3.1.4.35'},\n", - " 'rxn00921': {'4.1.1.61'},\n", - " 'rxn00922': {'2.1.1.25'},\n", - " 'rxn00923': {'2.4.1.35'},\n", - " 'rxn00924': {'3.1.1.2'},\n", - " 'rxn00925': {'3.1.6.1'},\n", - " 'rxn00926': {'3.5.4.2'},\n", - " 'rxn00927': {'3.2.2.1', '3.2.2.7', '3.2.2.8'},\n", - " 'rxn00928': {'1.5.1.1'},\n", - " 'rxn00929': {'1.5.1.2'},\n", - " 'rxn00930': {'1.5.1.1'},\n", - " 'rxn00931': {'1.5.1.2'},\n", - " 'rxn00932': {'1.14.11.2', '1.14.11.57'},\n", - " 'rxn00933': {'5.1.1.4'},\n", - " 'rxn00934': {'6.2.1.9'},\n", - " 'rxn00935': {'1.1.5.4'},\n", - " 'rxn00936': {'3.2.2.11'},\n", - " 'rxn00937': {'4.2.1.65'},\n", - " 'rxn00938': {'3.5.1.19', '3.5.1.4'},\n", - " 'rxn00939': {'2.1.1.1'},\n", - " 'rxn00940': {'3.2.2.14', '3.2.2.6'},\n", - " 'rxn00941': {'2.4.2.12'},\n", - " 'rxn00942': {'3.2.2.1'},\n", - " 'rxn00943': {'3.1.2.2', '3.1.2.22'},\n", - " 'rxn00944': {'1.2.1.42'},\n", - " 'rxn00945': {'1.3.1.38', '1.3.1.8'},\n", - " 'rxn00946': {'1.3.3.6', '1.3.8.9', '1.3.99.-', '1.3.99.13', '1.3.99.3'},\n", - " 'rxn00947': {'6.2.1.3'},\n", - " 'rxn00948': {'2.3.1.50'},\n", - " 'rxn00949': {'4.4.1.2'},\n", - " 'rxn00950': {'4.4.1.8'},\n", - " 'rxn00952': {'2.5.1.49', '4.2.99.10'},\n", - " 'rxn00953': {'4.2.1.22'},\n", - " 'rxn00955': {'4.4.1.21'},\n", - " 'rxn00956': {'1.8.4.1'},\n", - " 'rxn00957': {'1.2.1.28', '1.2.1.64'},\n", - " 'rxn00958': {'1.2.1.7'},\n", - " 'rxn00959': {'1.14.13.12'},\n", - " 'rxn00960': {'1.14.13.33'},\n", - " 'rxn00961': {'1.14.13.64'},\n", - " 'rxn00962': {'1.14.13.2', '1.14.13.33'},\n", - " 'rxn00963': {'1.14.13.64'},\n", - " 'rxn00964': {'6.2.1.27'},\n", - " 'rxn00965': {'3.1.2.23'},\n", - " 'rxn00966': {'4.1.3.40'},\n", - " 'rxn00967': {'2.4.1.194'},\n", - " 'rxn00968': {'1.13.11.41'},\n", - " 'rxn00969': {'3.8.1.6'},\n", - " 'rxn00971': {'6.2.1.18'},\n", - " 'rxn00972': {'2.8.3.10'},\n", - " 'rxn00973': {'4.2.1.3'},\n", - " 'rxn00974': {'4.2.1.3', '4.2.1.4'},\n", - " 'rxn00975': {'2.7.1.1', '2.7.1.7'},\n", - " 'rxn00976': {'2.7.1.1'},\n", - " 'rxn00977': {'3.2.1.22'},\n", - " 'rxn00978': {'2.7.1.1'},\n", - " 'rxn00979': {'1.2.1.21'},\n", - " 'rxn00980': {'3.1.3.18'},\n", - " 'rxn00981': {'4.2.99.12'},\n", - " 'rxn00982': {'2.1.1.15'},\n", - " 'rxn00983': {'3.1.1.23', '3.1.1.79'},\n", - " 'rxn00984': {'3.1.1.23'},\n", - " 'rxn00985': {'2.7.2.1', '2.7.2.15'},\n", - " 'rxn00986': {'6.2.1.1', '6.2.1.17'},\n", - " 'rxn00987': {'4.1.3.32'},\n", - " 'rxn00988': {'6.2.1.16'},\n", - " 'rxn00989': {'3.1.2.11'},\n", - " 'rxn00990': {'2.8.3.-', '2.8.3.8'},\n", - " 'rxn00991': {'4.1.3.4'},\n", - " 'rxn00992': {'1.1.1.30'},\n", - " 'rxn00993': {'3.7.1.2'},\n", - " 'rxn00994': {'2.8.3.9'},\n", - " 'rxn00995': {'4.1.1.4'},\n", - " 'rxn00996': {'4.2.1.27'},\n", - " 'rxn00997': {'1.1.1.222', '1.1.1.237'},\n", - " 'rxn00998': {'1.1.1.222', '1.1.1.237'},\n", - " 'rxn00999': {'1.13.11.27'},\n", - " 'rxn01000': {'4.2.1.51', '4.2.1.91'},\n", - " 'rxn01001': {'2.6.1.64'},\n", - " 'rxn01002': {'2.6.1.28'},\n", - " 'rxn01003': {'4.1.1.-', '4.1.1.43', '4.1.4.3'},\n", - " 'rxn01004': {'5.3.2.1'},\n", - " 'rxn01005': {'2.7.7.44'},\n", - " 'rxn01007': {'4.1.1.35'},\n", - " 'rxn01008': {'5.1.3.6'},\n", - " 'rxn01009': {'4.1.1.-'},\n", - " 'rxn01010': {'5.1.3.12'},\n", - " 'rxn01011': {'1.1.1.26', '1.1.1.29', '1.1.1.81'},\n", - " 'rxn01013': {'1.1.1.79', '1.1.1.81'},\n", - " 'rxn01014': {'4.1.1.40'},\n", - " 'rxn01015': {'5.3.1.22'},\n", - " 'rxn01016': {'2.7.2.2'},\n", - " 'rxn01017': {'2.1.3.8'},\n", - " 'rxn01018': {'2.1.3.2'},\n", - " 'rxn01019': {'2.1.3.3'},\n", - " 'rxn01020': {'2.1.3.6'},\n", - " 'rxn01021': {'3.2.2.16', '3.2.2.9'},\n", - " 'rxn01022': {'2.4.2.28'},\n", - " 'rxn01023': {'2.7.1.59', '4.2.1.66', '5.1.3.8'},\n", - " 'rxn01024': {'2.7.1.59', '4.2.1.66', '5.1.3.8'},\n", - " 'rxn01025': {'3.5.4.1'},\n", - " 'rxn01026': {'1.14.11.6'},\n", - " 'rxn01027': {'1.3.1.1'},\n", - " 'rxn01028': {'1.3.1.2'},\n", - " 'rxn01029': {'3.5.3.12'},\n", - " 'rxn01030': {'2.7.3.10'},\n", - " 'rxn01031': {'3.5.3.20'},\n", - " 'rxn01032': {'1.2.1.28', '1.2.1.29'},\n", - " 'rxn01033': {'1.2.1.7'},\n", - " 'rxn01034': {'3.6.1.7'},\n", - " 'rxn01035': {'6.2.1.25'},\n", - " 'rxn01036': {'3.6.1.20'},\n", - " 'rxn01037': {'3.5.1.32'},\n", - " 'rxn01038': {'3.5.1.40'},\n", - " 'rxn01041': {'1.1.1.121', '1.1.1.175'},\n", - " 'rxn01042': {'1.1.1.179'},\n", - " 'rxn01043': {'1.1.1.21', '1.1.1.307'},\n", - " 'rxn01044': {'5.3.1.5'},\n", - " 'rxn01045': {'1.4.1.-', '1.4.1.23', '1.4.1.9'},\n", - " 'rxn01046': {'4.1.1.14'},\n", - " 'rxn01048': {'2.2.1.3'},\n", - " 'rxn01049': {'2.7.1.85'},\n", - " 'rxn01050': {'1.1.99.18'},\n", - " 'rxn01051': {'3.2.1.74'},\n", - " 'rxn01052': {'5.1.3.11'},\n", - " ...}" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "{k:v['Enzyme Class'] for k, v in reaction_ecs.items()}" + "print('SMILES', cpd_lactate.smiles)\n", + "print('InChI', cpd_lactate.inchi)\n", + "print('InChI Key', cpd_lactate.inchi_key)" ] }, { - "cell_type": "code", - "execution_count": 13, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "import pandas as pd\n", - "df_reactions_aliases_url = pd.read_csv(reactions_aliases_url, index_col=None, sep='\\t')" + "### Fetch by inchi key\n", + "`find_compounds_by_inchi_key(inchi_key, exact=True)` exact forces first and second key match `exact=False` searches by first inchi hash only" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 6, "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
ModelSEED IDExternal IDSource
0rxn00001R_R00004_cAlgaGEM
1rxn00001INORGPYROPHOSPHAT-RXNAraCyc
2rxn00001R_R00004_cAraGEM
3rxn00001IPP1BiGG
4rxn00001PPABiGG
............
267247rxn48588jrxn14440janakagithub
267248rxn48589jrxn14441janakagithub
267249rxn48590psrxn00001samseaver
267250rxn48591psrxn00002samseaver
267251rxn48592psrxn00003samseaver
\n", - "

267252 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " ModelSEED ID External ID Source\n", - "0 rxn00001 R_R00004_c AlgaGEM\n", - "1 rxn00001 INORGPYROPHOSPHAT-RXN AraCyc\n", - "2 rxn00001 R_R00004_c AraGEM\n", - "3 rxn00001 IPP1 BiGG\n", - "4 rxn00001 PPA BiGG\n", - "... ... ... ...\n", - "267247 rxn48588 jrxn14440 janakagithub\n", - "267248 rxn48589 jrxn14441 janakagithub\n", - "267249 rxn48590 psrxn00001 samseaver\n", - "267250 rxn48591 psrxn00002 samseaver\n", - "267251 rxn48592 psrxn00003 samseaver\n", - "\n", - "[267252 rows x 3 columns]" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "cpd00159 L-Lactate JVTAAEKCZFNVCJ-REOHCLBHSA-M\n" + ] } ], "source": [ - "df_reactions_aliases_url" - ] - }, - { - "cell_type": "code", - "execution_count": 103, - "metadata": {}, - "outputs": [], - "source": [ - "from cobrakbase.core.kbasefba.newmodeltemplate_metabolite import NewModelTemplateCompound\n", - "compounds = {}\n", - "for cc in template.compcompounds:\n", - " if cc.compound is None:\n", - " cpd = modelseed.get_seed_compound(cc.id[:-2])\n", - " if cpd.id not in compounds:\n", - " template_compound = NewModelTemplateCompound(cpd.id, cpd.formula, cpd.name)\n", - " compounds[template_compound.id] = NewModelTemplateCompound(cpd.id, cpd.formula, cpd.name)\n", - " print(cpd)" + "for cpd in modelseed.find_compounds_by_inchi_key('JVTAAEKCZFNVCJ-REOHCLBHSA-M', True):\n", + " print(cpd, cpd.name, cpd.inchi_key)" ] }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 7, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 101, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "cpd00221 D-Lactate JVTAAEKCZFNVCJ-UWTATZPHSA-M\n", + "cpd00159 L-Lactate JVTAAEKCZFNVCJ-REOHCLBHSA-M\n", + "cpd01022 Lactate JVTAAEKCZFNVCJ-UHFFFAOYSA-M\n" + ] } ], "source": [ - "kbase.save_object('CoreBacteria_updated', 12218, template.info.type, template)" + "for cpd in modelseed.find_compounds_by_inchi_key('JVTAAEKCZFNVCJ-REOHCLBHSA-M', False):\n", + " print(cpd, cpd.name, cpd.inchi_key)" ] }, { - "cell_type": "code", - "execution_count": 100, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "template.add_compounds(list(compounds.values()))" + "# Reactions" ] }, { - "cell_type": "code", - "execution_count": 91, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Compound identifiercpd26984
NameDsrC-disulfide-form
Memory address0x07fc27bc0b710
FormulaC6H9N2O2R3S2
In 0 species\n", - "
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 91, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "\n", - "template_compound" + "### Fetch Reactions" ] }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 8, "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Compound identifiercpd26984
NameDsrC-disulfide-form
Memory address0x07fc27bb9ea50
FormulaC6H9N2O2R3S2
In 0 species\n", - "
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 90, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "rxn00148: cpd00002_0 + cpd00020_0 <=> cpd00008_0 + cpd00061_0 + cpd00067_0\n", + "ATP + Pyruvate <=> ADP + Phosphoenolpyruvate + H+\n" + ] } ], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 104, - "metadata": {}, - "outputs": [], "source": [ - "template_reaction = template.reactions.rxa45615_c" + "reaction_PYK = modelseed.reactions.rxn00148\n", + "print(reaction_PYK)\n", + "print(reaction_PYK.build_reaction_string(True))" ] }, { - "cell_type": "code", - "execution_count": 17, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'id': 'rxa45615_c',\n", - " 'name': 'rxa45615_c',\n", - " 'GapfillDirection': '=',\n", - " 'base_cost': 1000,\n", - " 'reverse_penalty': 1000,\n", - " 'forward_penalty': 1000,\n", - " 'upper_bound': 1000,\n", - " 'lower_bound': -1000,\n", - " 'direction': '=',\n", - " 'maxforflux': 1000,\n", - " 'maxrevflux': 1000.0,\n", - " 'reaction_ref': 'kbase/default/reactions/id/rxa45615',\n", - " 'templateReactionReagents': [{'coefficient': -2,\n", - " 'templatecompcompound_ref': '~/compcompounds/id/cpd00067_c'},\n", - " {'coefficient': -3,\n", - " 'templatecompcompound_ref': '~/compcompounds/id/cpd00971_c'},\n", - " {'coefficient': -2,\n", - " 'templatecompcompound_ref': '~/compcompounds/id/cpd11620_c'},\n", - " {'coefficient': -1,\n", - " 'templatecompcompound_ref': '~/compcompounds/id/cpd08701_c'},\n", - " {'coefficient': 2,\n", - " 'templatecompcompound_ref': '~/compcompounds/id/cpd00067_e'},\n", - " {'coefficient': 3,\n", - " 'templatecompcompound_ref': '~/compcompounds/id/cpd00971_e'},\n", - " {'coefficient': 2,\n", - " 'templatecompcompound_ref': '~/compcompounds/id/cpd11621_c'},\n", - " {'coefficient': 1,\n", - " 'templatecompcompound_ref': '~/compcompounds/id/cpd08702_c'}],\n", - " 'templatecompartment_ref': '~/compartments/id/c',\n", - " 'templatecomplex_refs': [],\n", - " 'type': 'spontaneous'}" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "template_reaction.get_data()" + "### Read Aliases" ] }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " 140472454487120 cpd00067_c cpd00067:H+ H+\n", - " 140472433862480 cpd00971_c cpd00971:Na+ Na+\n", - " 140472454486480 cpd11620_c cpd11620:Reducedferredoxin Reducedferredoxin\n", - " 140472433931728 cpd08701_c cpd08701:Methanophenazine Methanophenazine\n", - " 140472433821840 cpd00067_e cpd00067:H+ H+\n", - " 140472433861840 cpd00971_e cpd00971:Na+ Na+\n", - " 140472433893520 cpd11621_c cpd11621:Oxidizedferredoxin Oxidizedferredoxin\n", - " 140472433931856 cpd08702_c cpd08702:Dihydromethanophenazine Dihydromethanophenazine\n" + "Aliases dict_keys(['AlgaGEM', 'AraCyc', 'AraGEM', 'BiGG', 'BrachyCyc', 'ChlamyCyc', 'CornCyc', 'DF_Athaliana', 'EcoCyc', 'JM_Creinhardtii', 'JP_Creinhardtii_MSB', 'JP_Creinhardtii_NMeth', 'KEGG', 'MaizeCyc', 'Maize_C4GEM', 'MetaCyc', 'PlantCyc', 'PoplarCyc', 'RiceCyc', 'SorghumCyc', 'SoyCyc', 'TS_Athaliana', 'iAF1260', 'iAF692', 'iAG612', 'iAO358', 'iGT196', 'iIN800', 'iJN746', 'iJR904', 'iMA945', 'iMEO21', 'iMM904', 'iMO1053-PAO1', 'iMO1056', 'iND750', 'iNJ661', 'iPS189', 'iRR1083', 'iRS1563', 'iRS1597', 'iSB619', 'iSO783', 'iYO844', 'metanetx.reaction', 'rhea', 'ec-code'])\n", + "KEGG {'R00200'}\n", + "ec-code {'2.7.1.40'}\n" ] } ], "source": [ - "for o in template_reaction.metabolites:\n", - " print(type(o), id(o), o.id, o.compound, o.name)" + "print('Aliases', reaction_PYK.annotation.keys())\n", + "print('KEGG', reaction_PYK.annotation['KEGG'])\n", + "print('ec-code', reaction_PYK.annotation['ec-code'])" ] }, { - "cell_type": "code", - "execution_count": 65, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'charge': 0,\n", - " 'id': 'cpd08701_c',\n", - " 'maxuptake': 0,\n", - " 'templatecompartment_ref': '~/compartments/id/c',\n", - " 'templatecompound_ref': '~/compounds/id/cpd08701'}" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "template.compcompounds.cpd08701_c.get_data()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "140472724747984" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "id(template.compcompounds.cpd08701_c.cpd08701_c)" + "### Instantiate reaction \n", + "Instantiate database reaction to a template reaction with cytosol `c` assigned to token `0`" ] }, { "cell_type": "code", - "execution_count": 61, - "metadata": {}, + "execution_count": 10, + "metadata": { + "tags": [] + }, "outputs": [ { "data": { @@ -2946,70 +244,47 @@ "\n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", - "
Metabolite identifiercpd08701_cReaction identifierrxn00148_c
NameNameATP:pyruvate 2-O-phosphotransferase
Memory address0x07fc25936bb900x7f5eb42f82e0
Stoichiometry\n", + "

cpd00002_c + cpd00020_c <=> cpd00008_c + cpd00061_c + cpd00067_c

\n", + "

ATP + Pyruvate <=> ADP + Phosphoenolpyruvate + H+

\n", + "
FormulaGPR
CompartmentcLower bound-1000
In 3 reaction(s)\n", - " rxn03126_c, rxa45615_c, rxn15961_cUpper bound1000
" + " \n", + " " ], "text/plain": [ - "" + "" ] }, - "execution_count": 61, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "template.compcompounds.cpd08701_c" + "template_PYK_cytosol = reaction_PYK.to_template_reaction({0: 'c'})\n", + "template_PYK_cytosol" ] }, { - "cell_type": "code", - "execution_count": 134, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(1) cpd00001[0] + (1) cpd00012[0] <=> (2) cpd00009[0] = >\n", - "(1) cpd00001[0] + (1) cpd00742[0] <=> (2) cpd00011[0] + (2) cpd00013[0] > >\n", - "(1) cpd00011[0] + (1) cpd00668[0] <=> (2) cpd00020[0] < <\n", - "(1) cpd02570[0] <=> (2) cpd00020[0] = =\n", - "(2) cpd00025[0] <=> (2) cpd00001[0] + (1) cpd00007[0] > >\n", - "(1) cpd00001[0] + (1) cpd00794[0] <=> (2) cpd00027[0] > =\n", - "(2) cpd00001[0] <=> (1) cpd00025[0] = <\n", - "(2) cpd00038[0] <=> (1) cpd00012[0] + (1) cpd00925[0] > =\n", - "(2) cpd00040[0] <=> (1) cpd00011[0] + (1) cpd00843[0] > =\n", - "(1) cpd00011[0] + (1) cpd03049[0] <=> (1) cpd00020[0] + (1) cpd00056[0] > <\n", - "(2) cpd00076[0] <=> (1) cpd00027[0] + (1) cpd02298[0] = =\n" - ] - } - ], "source": [ - "i =0 \n", - "for r in modelseed.reactions:\n", - " print(modelseed.reactions[r]['code'], modelseed.reactions[r]['direction'], modelseed.reactions[r]['reversibility'])\n", - " #print(modelseed.reactions[r]['code'])\n", - " #print(modelseed.reactions[r]['stoichiometry'])\n", - " #print(modelseed.reactions[r]['definition'])\n", - " \n", - " \n", - " i+= 1\n", - " if i > 10:\n", - " break" + "# Random debug stuff ignore for now" ] }, { @@ -3117,83 +392,6 @@ "with open('/Users/fliu/workspace/jupyter/python3/annotation-server/data/extra_reactions.json', 'w') as fh:\n", " fh.write(json.dumps(extra_reactions))\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "modelseed.reactions.update" - ] - }, - { - "cell_type": "code", - "execution_count": 156, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "rxn45615: cpd00003 [0] + cpd00067 [0] + cpd00971 [0] + 2.0 cpd28082 [0] <=> cpd00004 [0] + cpd00971 [1] + 2.0 cpd27757 [0]\n" - ] - } - ], - "source": [ - "rxn = modelseed.get_seed_reaction('rxn45615')\n", - "print(type(rxn))\n", - "print(rxn)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'id': 'rxn45615',\n", - " 'abbreviation': nan,\n", - " 'name': nan,\n", - " 'code': '(1) cpd00003[0] + (1) cpd00971[0] + (2) cpd28082[0] <=> (1) cpd00004[0] + (1) cpd00971[1] + (2) cpd27757[0]',\n", - " 'stoichiometry': '-1:cpd00003:0:0:NAD;-1:cpd00067:0:0:H+;-1:cpd00971:0:0:Na+;-2:cpd28082:0:0:Reduced-ferredoxins;1:cpd00004:0:0:NADH;1:cpd00971:1:0:Na+;2:cpd27757:0:0:Oxidized-ferredoxins',\n", - " 'is_transport': 1,\n", - " 'equation': '(1) cpd00003[0] + (1) cpd00067[0] + (1) cpd00971[0] + (2) cpd28082[0] <=> (1) cpd00004[0] + (1) cpd00971[1] + (2) cpd27757[0]',\n", - " 'definition': '(1) NAD[0] + (1) H+[0] + (1) Na+[0] + (2) Reduced-ferredoxins[0] <=> (1) NADH[0] + (1) Na+[1] + (2) Oxidized-ferredoxins[0]',\n", - " 'reversibility': '?',\n", - " 'direction': '=',\n", - " 'abstract_reaction': nan,\n", - " 'pathways': nan,\n", - " 'aliases': 'MetaCyc: TRANS-RXN-276',\n", - " 'ec_numbers': '7.2.1.2',\n", - " 'deltag': 10000000.0,\n", - " 'deltagerr': 10000000.0,\n", - " 'compound_ids': 'cpd00003;cpd00004;cpd00067;cpd00971;cpd27757;cpd28082',\n", - " 'status': 'OK',\n", - " 'is_obsolete': 0,\n", - " 'linked_reaction': nan,\n", - " 'notes': 'GCP|EQP',\n", - " 'source': 'Primary Database'}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "modelseed.reactions['rxn45615']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From 76ce3ee8281c80636cafb4fd210ecf0d81070f99 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Fri, 21 Oct 2022 14:17:55 -0500 Subject: [PATCH 037/298] added detection for compatibility with old repo --- modelseedpy/biochem/modelseed_biochem.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index 1e4f3360..7c957696 100644 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -139,10 +139,13 @@ def load_metabolites_from_df( if cpd_id in structures: if "SMILE" in structures[cpd_id]: smiles = structures[cpd_id]["SMILE"] + aliases_annotation['SMILE'] = smiles if "InChI" in structures[cpd_id]: inchi = structures[cpd_id]["InChI"] + aliases_annotation['InChI'] = inchi if "InChIKey" in structures[cpd_id]: inchi_key = structures[cpd_id]["InChIKey"] + aliases_annotation['InChIKey'] = inchi_key inchi_key = None if pd.isna(inchi_key) or len(inchi_key) == 0 else inchi_key other_names = set() if cpd_id in names: @@ -158,9 +161,6 @@ def load_metabolites_from_df( mass, delta_g, delta_g_err, - smiles, - inchi_key, - inchi, is_core, is_obsolete, is_cofactor, @@ -763,6 +763,10 @@ def from_local_old(path): def from_local(database_path: str): + contents = os.listdir(f'{database_path}/Biochemistry/') + if 'compounds.tsv' in contents: + return from_local_old(database_path) + compound_aliases_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Compound_Aliases.txt' reaction_aliases_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Aliases.txt' compound_aliases = _load_aliases_df(pd.read_csv(compound_aliases_url, index_col=None, sep='\t')) From 48cc866850b8942db4060f3d948f43b4edaac69c Mon Sep 17 00:00:00 2001 From: David ML Brown Jr Date: Mon, 24 Oct 2022 14:35:59 -0700 Subject: [PATCH 038/298] Add Tox Testing and Coverage This adds GitHub Actions and tox with coverage reporting to run the tests. Signed-off-by: David ML Brown Jr --- .github/workflows/tox.yml | 28 +++++++++++++++++++++++ setup.py | 2 +- tests/core/test_msatpcorreption.py | 25 ++++++++++++++++++--- tests/core/test_msgapfill.py | 15 +++++++++++-- tox.ini | 36 ++++++++++++++++++++++++++++++ 5 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/tox.yml create mode 100644 tox.ini diff --git a/.github/workflows/tox.yml b/.github/workflows/tox.yml new file mode 100644 index 00000000..9ce47285 --- /dev/null +++ b/.github/workflows/tox.yml @@ -0,0 +1,28 @@ +name: Run Tox + +on: + pull_request: {} + push: + branches: [main] + +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + python-version: ['3.8', '3.9', '3.10'] + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip setuptools wheel build + python -m pip install tox tox-gh-actions + - name: Test with tox + run: | + tox + python -m build . diff --git a/setup.py b/setup.py index 775d60a4..415dcd3b 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ install_requires=[ "networkx >= 2.4", "cobra >= 0.17.1", - "scikit-learn == 0.23.2", # too support KBase pickle models + "scikit-learn == 0.24.2", # too support KBase pickle models "scipy >= 1.5.4", "chemicals >= 1.0.13", "chemw >= 0.3.2", diff --git a/tests/core/test_msatpcorreption.py b/tests/core/test_msatpcorreption.py index 13acf3c3..87090be0 100644 --- a/tests/core/test_msatpcorreption.py +++ b/tests/core/test_msatpcorreption.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +import os import pytest import json import cobra @@ -8,13 +9,26 @@ @pytest.fixture def template(): - with open("./tests/test_data/template_core_bigg.json", "r") as fh: + with open( + os.path.join( + os.path.dirname(__file__), "..", "test_data", "template_core_bigg.json" + ), + "r", + ) as fh: return MSTemplateBuilder.from_dict(json.load(fh)).build() @pytest.fixture def template_genome_scale(): - with open("./tests/test_data/template_genome_scale_bigg.json", "r") as fh: + with open( + os.path.join( + os.path.dirname(__file__), + "..", + "test_data", + "template_genome_scale_bigg.json", + ), + "r", + ) as fh: return MSTemplateBuilder.from_dict(json.load(fh)).build() @@ -23,7 +37,12 @@ def get_model(): def _method(ko=None, added_compounds=None, added_reactions=None): if ko is None: ko = [] - with open("./tests/test_data/e_coli_core.json", "r") as fh: + with open( + os.path.join( + os.path.dirname(__file__), "..", "test_data", "e_coli_core.json" + ), + "r", + ) as fh: model_json = json.load(fh) model_json["compartments"] = { k + "0": v for (k, v) in model_json["compartments"].items() diff --git a/tests/core/test_msgapfill.py b/tests/core/test_msgapfill.py index 77238f59..1ee694bd 100644 --- a/tests/core/test_msgapfill.py +++ b/tests/core/test_msgapfill.py @@ -49,6 +49,7 @@ def test_run_gapfilling_and_integrate_gapfill_solution(): def test_gapfill(): pass """ +import os import pytest import json import cobra @@ -58,7 +59,12 @@ def test_gapfill(): @pytest.fixture def template(): - with open("./tests/test_data/template_core_bigg.json", "r") as fh: + with open( + os.path.join( + os.path.dirname(__file__), "..", "test_data", "template_core_bigg.json" + ), + "r", + ) as fh: return MSTemplateBuilder.from_dict(json.load(fh)).build() @@ -67,7 +73,12 @@ def get_model(): def _method(ko=None): if ko is None: ko = [] - with open("./tests/test_data/e_coli_core.json", "r") as fh: + with open( + os.path.join( + os.path.dirname(__file__), "..", "test_data", "e_coli_core.json" + ), + "r", + ) as fh: model_json = json.load(fh) model_json["compartments"] = { k + "0": v for (k, v) in model_json["compartments"].items() diff --git a/tox.ini b/tox.ini new file mode 100644 index 00000000..d5ff7ef9 --- /dev/null +++ b/tox.ini @@ -0,0 +1,36 @@ +[tox] +envlist = py38,py39,py310 + +[gh-actions] +python = + 3.8: py38 + 3.9: py39 + 3.10: py310 + +[testenv] +setenv = ARCHIVEINTERFACE_CPCONFIG = {toxinidir}/server.conf +deps = + build + coverage + mock + pre-commit + pytest + pytest-cov + recommonmark + setuptools +commands = pytest --cov --cov-append --cov-report=term-missing +changedir = tests + +[testenv:report] +deps = coverage +skip_install = true +commands = + coverage report -m + coverage html +changedir = tests + +[testenv:clean] +deps = coverage +skip_install = true +commands = coverage erase +changedir = tests From c55bfdb0a3759f0c7ac0d79428ca366dacb51760 Mon Sep 17 00:00:00 2001 From: David ML Brown Jr Date: Tue, 25 Oct 2022 09:26:10 -0700 Subject: [PATCH 039/298] Fix Pre-Commit This fixes pre-commit for code I didn't touch... Signed-off-by: David ML Brown Jr --- modelseedpy/biochem/modelseed_biochem.py | 201 +++++++++++++++------- modelseedpy/biochem/modelseed_compound.py | 28 ++- modelseedpy/core/msgenome.py | 10 +- modelseedpy/core/msmodel.py | 1 - modelseedpy/fbapkg/gapfillingpkg.py | 8 +- 5 files changed, 165 insertions(+), 83 deletions(-) diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index 7c957696..b3cde27e 100644 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -10,7 +10,7 @@ logger = logging.getLogger(__name__) -_BIOCHEM_FOLDER = 'Biochemistry' +_BIOCHEM_FOLDER = "Biochemistry" ALIAS_CPD_IDENTIFIERS_ORG = { "BiGG": "bigg.metabolite", @@ -139,13 +139,13 @@ def load_metabolites_from_df( if cpd_id in structures: if "SMILE" in structures[cpd_id]: smiles = structures[cpd_id]["SMILE"] - aliases_annotation['SMILE'] = smiles + aliases_annotation["SMILE"] = smiles if "InChI" in structures[cpd_id]: inchi = structures[cpd_id]["InChI"] - aliases_annotation['InChI'] = inchi + aliases_annotation["InChI"] = inchi if "InChIKey" in structures[cpd_id]: inchi_key = structures[cpd_id]["InChIKey"] - aliases_annotation['InChIKey'] = inchi_key + aliases_annotation["InChIKey"] = inchi_key inchi_key = None if pd.isna(inchi_key) or len(inchi_key) == 0 else inchi_key other_names = set() if cpd_id in names: @@ -193,7 +193,9 @@ def _load_aliases_df(df_aliases, seed_index=1, source_index=3, alias_id_index=2) return aliases -def _load_metabolites(database_path: str, aliases=None, names=None, structures=None) -> dict: +def _load_metabolites( + database_path: str, aliases=None, names=None, structures=None +) -> dict: if aliases is None: aliases = {} if names is None: @@ -201,23 +203,34 @@ def _load_metabolites(database_path: str, aliases=None, names=None, structures=N if structures is None: structures = {} metabolites = {} - contents = os.listdir(f'{database_path}/{_BIOCHEM_FOLDER}') + contents = os.listdir(f"{database_path}/{_BIOCHEM_FOLDER}") for f in contents: - if f.startswith('compound_') and f.endswith('.json'): - with open(f'{database_path}/{_BIOCHEM_FOLDER}/{f}', 'r') as fh: + if f.startswith("compound_") and f.endswith(".json"): + with open(f"{database_path}/{_BIOCHEM_FOLDER}/{f}", "r") as fh: _compounds_data = json.load(fh) for o in _compounds_data: - if 'id' in o and o['id']: + if "id" in o and o["id"]: cpd_names = set() - if o['id'] in names: - cpd_names |= names[o['id']] - cpd = ModelSEEDCompound2(o['id'], o.get('formula'), - o.get('name'), o.get('charge'), '', - o.get('abbreviation'), cpd_names, - o.get('mass'), o.get('deltag'), o.get('deltagerr'), - o.get('is_core'), o.get('is_obsolete'), None, - o.get('pka'), o.get('pkb'), - o.get('source')) + if o["id"] in names: + cpd_names |= names[o["id"]] + cpd = ModelSEEDCompound2( + o["id"], + o.get("formula"), + o.get("name"), + o.get("charge"), + "", + o.get("abbreviation"), + cpd_names, + o.get("mass"), + o.get("deltag"), + o.get("deltagerr"), + o.get("is_core"), + o.get("is_obsolete"), + None, + o.get("pka"), + o.get("pkb"), + o.get("source"), + ) if cpd.id in aliases: cpd.annotation.update(aliases[cpd.id]) if cpd.id in structures: @@ -226,15 +239,19 @@ def _load_metabolites(database_path: str, aliases=None, names=None, structures=N if len(v) == 1: cpd.annotation[alias_type] = list(v)[0] else: - logger.warning(f'multiple {alias_type} structures found for {cpd.id}') + logger.warning( + f"multiple {alias_type} structures found for {cpd.id}" + ) metabolites[cpd.id] = cpd else: - print('error', o) - #print(_compounds_data[0].keys()) + print("error", o) + # print(_compounds_data[0].keys()) return metabolites -def _load_reactions(database_path: str, metabolites: dict, aliases=None, names=None, ec_numbers=None) -> (dict, dict): +def _load_reactions( + database_path: str, metabolites: dict, aliases=None, names=None, ec_numbers=None +) -> (dict, dict): if aliases is None: aliases = {} if names is None: @@ -242,24 +259,29 @@ def _load_reactions(database_path: str, metabolites: dict, aliases=None, names=N if ec_numbers is None: ec_numbers = {} reactions = {} - contents = os.listdir(f'{database_path}/{_BIOCHEM_FOLDER}') + contents = os.listdir(f"{database_path}/{_BIOCHEM_FOLDER}") metabolites_indexed = {} for f in contents: - if f.startswith('reaction_') and f.endswith('.json'): - with open(f'{database_path}/{_BIOCHEM_FOLDER}/{f}', 'r') as fh: + if f.startswith("reaction_") and f.endswith(".json"): + with open(f"{database_path}/{_BIOCHEM_FOLDER}/{f}", "r") as fh: _reactions_data = json.load(fh) for o in _reactions_data: - if 'id' in o and o['id']: + if "id" in o and o["id"]: rxn_names = set() - if o['id'] in names: - rxn_names |= names[o['id']] - lower_bound, upper_bound = get_reaction_constraints_from_direction(o.get('reversibility')) - stoichiometry = o.get('stoichiometry') + if o["id"] in names: + rxn_names |= names[o["id"]] + ( + lower_bound, + upper_bound, + ) = get_reaction_constraints_from_direction( + o.get("reversibility") + ) + stoichiometry = o.get("stoichiometry") reaction_metabolites = {} for s in stoichiometry: - cmp_token = s['compartment'] - value = s['coefficient'] - cpd = metabolites[s['compound']] + cmp_token = s["compartment"] + value = s["coefficient"] + cpd = metabolites[s["compound"]] cpd_index_id = f"{cpd.id}_{cmp_token}" if cpd_index_id not in metabolites_indexed: cpd_token = cpd.copy() @@ -267,21 +289,33 @@ def _load_reactions(database_path: str, metabolites: dict, aliases=None, names=N cpd_token.base_id = cpd.id cpd_token.compartment = cmp_token metabolites_indexed[cpd_index_id] = cpd_token - reaction_metabolites[metabolites_indexed[cpd_index_id]] = value - rxn = ModelSEEDReaction2(o['id'], o.get('name'), '', lower_bound, upper_bound, - '', rxn_names, - o.get('deltag'), o.get('deltagerr'), - o.get('is_obsolete'), None, - o.get('status'), o.get('source')) + reaction_metabolites[ + metabolites_indexed[cpd_index_id] + ] = value + rxn = ModelSEEDReaction2( + o["id"], + o.get("name"), + "", + lower_bound, + upper_bound, + "", + rxn_names, + o.get("deltag"), + o.get("deltagerr"), + o.get("is_obsolete"), + None, + o.get("status"), + o.get("source"), + ) rxn.add_metabolites(reaction_metabolites) if rxn.id in aliases: rxn.annotation.update(aliases[rxn.id]) if rxn.id in ec_numbers: - rxn.annotation['ec-code'] = ec_numbers[rxn.id] + rxn.annotation["ec-code"] = ec_numbers[rxn.id] metabolites[cpd.id] = cpd reactions[rxn.id] = rxn else: - logger.error(f'failed to read reaction record {o}') + logger.error(f"failed to read reaction record {o}") return reactions, metabolites_indexed @@ -399,12 +433,12 @@ def __init__(self, compounds: list, reactions: list, compound_tokens: list): def _index_inchi(self): for m in self.compounds: if m.inchi_key: - f, s, p = m.inchi_key.split('-') + f, s, p = m.inchi_key.split("-") if f not in self.inchi_key_lookup: self.inchi_key_lookup[f] = {} if s not in self.inchi_key_lookup[f]: self.inchi_key_lookup[f][s] = set() - proton_pair = (m.id , p) + proton_pair = (m.id, p) if proton_pair not in self.inchi_key_lookup[f][s]: self.inchi_key_lookup[f][s].add(proton_pair) @@ -415,7 +449,7 @@ def reactions_by_alias(self, alias, value): pass def find_compounds_by_inchi_key(self, inchi_key, exact=True): - f, s, p = inchi_key.split('-') + f, s, p = inchi_key.split("-") if exact and f in self.inchi_key_lookup and s in self.inchi_key_lookup[f]: # x is tuple (cpd.id, protonation) return [self.compounds.get_by_id(x[0]) for x in self.inchi_key_lookup[f][s]] @@ -763,40 +797,75 @@ def from_local_old(path): def from_local(database_path: str): - contents = os.listdir(f'{database_path}/Biochemistry/') - if 'compounds.tsv' in contents: + contents = os.listdir(f"{database_path}/Biochemistry/") + if "compounds.tsv" in contents: return from_local_old(database_path) - compound_aliases_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Compound_Aliases.txt' - reaction_aliases_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Aliases.txt' - compound_aliases = _load_aliases_df(pd.read_csv(compound_aliases_url, index_col=None, sep='\t')) - reaction_aliases = _load_aliases_df(pd.read_csv(reaction_aliases_url, index_col=None, sep='\t')) + compound_aliases_url = ( + f"{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Compound_Aliases.txt" + ) + reaction_aliases_url = ( + f"{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Aliases.txt" + ) + compound_aliases = _load_aliases_df( + pd.read_csv(compound_aliases_url, index_col=None, sep="\t") + ) + reaction_aliases = _load_aliases_df( + pd.read_csv(reaction_aliases_url, index_col=None, sep="\t") + ) - compound_structures_url = f'{database_path}/Biochemistry/Structures/Unique_ModelSEED_Structures.txt' - compound_structures = _load_aliases_df(pd.read_csv(compound_structures_url, index_col=None, sep='\t'), - source_index=2, alias_id_index=6) + compound_structures_url = ( + f"{database_path}/Biochemistry/Structures/Unique_ModelSEED_Structures.txt" + ) + compound_structures = _load_aliases_df( + pd.read_csv(compound_structures_url, index_col=None, sep="\t"), + source_index=2, + alias_id_index=6, + ) - compound_names_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Compound_Names.txt' - reaction_names_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Names.txt' - compound_names = _load_aliases_df(pd.read_csv(compound_names_url, index_col=None, sep='\t')) - reaction_names = _load_aliases_df(pd.read_csv(reaction_names_url, index_col=None, sep='\t')) + compound_names_url = ( + f"{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Compound_Names.txt" + ) + reaction_names_url = ( + f"{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Names.txt" + ) + compound_names = _load_aliases_df( + pd.read_csv(compound_names_url, index_col=None, sep="\t") + ) + reaction_names = _load_aliases_df( + pd.read_csv(reaction_names_url, index_col=None, sep="\t") + ) - reaction_ecs_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_ECs.txt' - reaction_ecs = _load_aliases_df(pd.read_csv(reaction_ecs_url, index_col=None, sep='\t')) + reaction_ecs_url = ( + f"{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_ECs.txt" + ) + reaction_ecs = _load_aliases_df( + pd.read_csv(reaction_ecs_url, index_col=None, sep="\t") + ) # build metabolites unpack names - metabolites = _load_metabolites(database_path, compound_aliases, - {k:v['name'] for k, v in compound_names.items()}, - compound_structures) + metabolites = _load_metabolites( + database_path, + compound_aliases, + {k: v["name"] for k, v in compound_names.items()}, + compound_structures, + ) # build reactions unpack names, ecs - reactions, metabolite_tokens = _load_reactions(database_path, metabolites, reaction_aliases, - {k:v['name'] for k, v in reaction_names.items()}, - {k:v['Enzyme Class'] for k, v in reaction_ecs.items()}) - database = ModelSEEDDatabase(metabolites.values(), reactions.values(), metabolite_tokens.values()) + reactions, metabolite_tokens = _load_reactions( + database_path, + metabolites, + reaction_aliases, + {k: v["name"] for k, v in reaction_names.items()}, + {k: v["Enzyme Class"] for k, v in reaction_ecs.items()}, + ) + database = ModelSEEDDatabase( + metabolites.values(), reactions.values(), metabolite_tokens.values() + ) return database + def get_names_from_df(df): names = {} for t in df.itertuples(): diff --git a/modelseedpy/biochem/modelseed_compound.py b/modelseedpy/biochem/modelseed_compound.py index ede08555..5bfbbfeb 100644 --- a/modelseedpy/biochem/modelseed_compound.py +++ b/modelseedpy/biochem/modelseed_compound.py @@ -4,14 +4,12 @@ from cobra.core import Metabolite import pandas as pd -_SMILE_ALIAS = 'SMILE' -_INCHI_ALIAS = 'InChI' -_INCHI_KEY_ALIAS = 'InChIKey' - -class ModelSEEDCompound2(Metabolite): - +_SMILE_ALIAS = "SMILE" +_INCHI_ALIAS = "InChI" +_INCHI_KEY_ALIAS = "InChIKey" +class ModelSEEDCompound2(Metabolite): def __init__( self, cpd_id=None, @@ -67,15 +65,27 @@ def to_template_compartment_compound(self, compartment): @property def smiles(self): - return None if _SMILE_ALIAS not in self.annotation else self.annotation[_SMILE_ALIAS] + return ( + None + if _SMILE_ALIAS not in self.annotation + else self.annotation[_SMILE_ALIAS] + ) @property def inchi_key(self): - return None if _INCHI_KEY_ALIAS not in self.annotation else self.annotation[_INCHI_KEY_ALIAS] + return ( + None + if _INCHI_KEY_ALIAS not in self.annotation + else self.annotation[_INCHI_KEY_ALIAS] + ) @property def inchi(self): - return None if _INCHI_ALIAS not in self.annotation else self.annotation[_INCHI_ALIAS] + return ( + None + if _INCHI_ALIAS not in self.annotation + else self.annotation[_INCHI_ALIAS] + ) class ModelSEEDCompound(ModelSEEDObject): diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index 7404e486..999e464d 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -48,7 +48,6 @@ def parse_fasta_str(faa_str, split=DEFAULT_SPLIT, h_func=None): class MSFeature: - def __init__(self, feature_id, sequence, description=None): """ @@ -77,7 +76,6 @@ def add_ontology_term(self, ontology_term, value): class MSGenome: - def __init__(self): self.features = DictList() @@ -107,13 +105,15 @@ def from_fasta( return genome def to_fasta(self, filename, l=80, fn_header=None): - with open(filename, 'w') as fh: + with open(filename, "w") as fh: for feature in self.features: - h = f'>{feature.id}\n' + h = f">{feature.id}\n" if fn_header: h = fn_header(feature) fh.write(h) - lines = [feature.seq[i:i + l] + '\n' for i in range(0, len(feature.seq), l)] + lines = [ + feature.seq[i : i + l] + "\n" for i in range(0, len(feature.seq), l) + ] for line in lines: fh.write(line) return filename diff --git a/modelseedpy/core/msmodel.py b/modelseedpy/core/msmodel.py index 9cebbfac..2e3f1e08 100644 --- a/modelseedpy/core/msmodel.py +++ b/modelseedpy/core/msmodel.py @@ -116,7 +116,6 @@ def get_set_set(expr_str): # !!! this currently returns dictionaries, not sets? class MSModel(Model): - def __init__(self, id_or_model=None, genome=None, template=None): """ Class representation for a ModelSEED model. diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index 27960276..1ccc98f3 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -437,7 +437,9 @@ def build_package(self, parameters): if indexhash[index] > 10: if index == "none": for template in self.parameters["default_gapfill_templates"]: - new_penalties = self.extend_model_with_template_for_gapfilling(template, index) + new_penalties = self.extend_model_with_template_for_gapfilling( + template, index + ) self.gapfilling_penalties.update(new_penalties) for gfmdl in self.parameters["default_gapfill_models"]: new_penalties = self.extend_model_with_model_for_gapfilling( @@ -466,7 +468,9 @@ def build_package(self, parameters): self.gapfilling_penalties.update(new_penalties) if self.parameters["gapfill_all_indecies_with_default_models"]: for gfmdl in self.parameters["default_gapfill_models"]: - new_penalties = self.extend_model_with_model_for_gapfilling(gfmdl, index) + new_penalties = self.extend_model_with_model_for_gapfilling( + gfmdl, index + ) self.gapfilling_penalties.update(new_penalties) # Rescaling penalties by reaction scores and saving genes for reaction in self.gapfilling_penalties: From 89287a8ff37c14a62da27727b7dc2e82928f668c Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Mon, 7 Nov 2022 22:15:33 -0600 Subject: [PATCH 040/298] template_compound fix --- examples/Others/Biochem.ipynb | 3 ++- modelseedpy/biochem/modelseed_compound.py | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/Others/Biochem.ipynb b/examples/Others/Biochem.ipynb index 7db3aecb..00b845b8 100644 --- a/examples/Others/Biochem.ipynb +++ b/examples/Others/Biochem.ipynb @@ -13,7 +13,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Load the database object from local github repository" + "### Load the database object from local github repository\n", + "https://github.com/ModelSEED/ModelSEEDDatabase" ] }, { diff --git a/modelseedpy/biochem/modelseed_compound.py b/modelseedpy/biochem/modelseed_compound.py index ede08555..776fc809 100644 --- a/modelseedpy/biochem/modelseed_compound.py +++ b/modelseedpy/biochem/modelseed_compound.py @@ -59,9 +59,8 @@ def __init__( self.flags |= set(flags) def to_template_compartment_compound(self, compartment): - res = self.copy() - res.id = f"{self.seed_id}_{compartment}" - res.compartment = compartment + cpd_id = f"{self.seed_id}_{compartment}" + res = MSTemplateSpecies(cpd_id, self.charge, compartment, self.id) res.annotation.update(self.annotation) return res From 173d34d12056e6277013cf30bb4912b5c82aa74c Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Mon, 7 Nov 2022 22:28:40 -0600 Subject: [PATCH 041/298] fix to_reaction --- modelseedpy/biochem/modelseed_reaction.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modelseedpy/biochem/modelseed_reaction.py b/modelseedpy/biochem/modelseed_reaction.py index fca195b6..04ad7f2d 100644 --- a/modelseedpy/biochem/modelseed_reaction.py +++ b/modelseedpy/biochem/modelseed_reaction.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import math from modelseedpy.biochem.seed_object import ModelSEEDObject -from cobra.core import Reaction +from modelseedpy.core.mstemplate import MSTemplateReaction def to_str2(rxn, cmp_replace=None, cpd_replace={}): @@ -188,8 +188,8 @@ def to_template_reaction(self, compartment_setup=None): # if len(str(index)) > 0: # name = f'{self.name} [{compartment}]' - reaction = Reaction( - rxn_id, name, self.subsystem, self.lower_bound, self.upper_bound + reaction = MSTemplateReaction( + rxn_id, self.id, name, self.subsystem, self.lower_bound, self.upper_bound ) reaction.add_metabolites(metabolites) reaction.annotation.update(self.annotation) From da4f0e8a7319b4cf7cdd41da5a55ee7d0ed30371 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Mon, 7 Nov 2022 22:31:20 -0600 Subject: [PATCH 042/298] import bug --- modelseedpy/biochem/modelseed_reaction.py | 1 + 1 file changed, 1 insertion(+) diff --git a/modelseedpy/biochem/modelseed_reaction.py b/modelseedpy/biochem/modelseed_reaction.py index 04ad7f2d..b43430ce 100644 --- a/modelseedpy/biochem/modelseed_reaction.py +++ b/modelseedpy/biochem/modelseed_reaction.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import math from modelseedpy.biochem.seed_object import ModelSEEDObject +from cobra.core import Reaction from modelseedpy.core.mstemplate import MSTemplateReaction From b37e570eb94d40216c6957a15b8e36336e3edbae Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Sun, 20 Nov 2022 05:51:25 -0600 Subject: [PATCH 043/298] ms model fix --- modelseedpy/biochem/modelseed_biochem.py | 2 +- modelseedpy/core/msmodel.py | 2 +- modelseedpy/core/mstemplate.py | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index 7c957696..a4244f35 100644 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -389,7 +389,7 @@ def __init__(self, compounds: list, reactions: list, compound_tokens: list): self.reactions = DictList() self.compounds += compounds self.reactions += reactions - self.reactions += compound_tokens + self.compound_tokens += compound_tokens self.inchi_key_lookup = {} self.metabolite_reactions = {} diff --git a/modelseedpy/core/msmodel.py b/modelseedpy/core/msmodel.py index 9cebbfac..9b1d180c 100644 --- a/modelseedpy/core/msmodel.py +++ b/modelseedpy/core/msmodel.py @@ -121,7 +121,7 @@ def __init__(self, id_or_model=None, genome=None, template=None): """ Class representation for a ModelSEED model. """ - super().__init__(self, id_or_model) + super().__init__(id_or_model) if genome: self._genome = genome if template: diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index b1bb1975..7a874abd 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -1078,3 +1078,4 @@ def build(self): ) # TODO: biomass object return template + From 45b65a4e96f945b5610d3a5edd2772778ac260ab Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 24 Nov 2022 10:48:03 -0500 Subject: [PATCH 044/298] Checking in biochemistry config support, addition of ModelSEED reactions, and more model utl functions --- modelseedpy/biochem/modelseed_biochem.py | 11 ++- modelseedpy/config.cfg | 4 +- modelseedpy/core/msmodelutl.py | 91 +++++++++++++++++++++++- modelseedpy/fbapkg/gapfillingpkg.py | 2 +- 4 files changed, 101 insertions(+), 7 deletions(-) diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index 48cb6779..e7ce9ac9 100755 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -3,6 +3,7 @@ from cobra.core.dictlist import DictList from modelseedpy.biochem.modelseed_compound import ModelSEEDCompound, ModelSEEDCompound2 from modelseedpy.biochem.modelseed_reaction import ModelSEEDReaction, ModelSEEDReaction2 +from modelseedpy.helpers import config logger = logging.getLogger(__name__) @@ -197,11 +198,10 @@ def load_reactions_from_df(df: pd.DataFrame, database_metabolites: dict, names: return reactions, list(metabolites_indexed.values()) -class ModelSEEDDatabase: +class ModelSEEDDatabase: """ ModelSEED database instance. """ - def __init__(self, compounds, reactions, compound_tokens): self.compounds = DictList() self.compound_tokens = DictList() @@ -241,6 +241,13 @@ def add_reaction(self, rxn): class ModelSEEDBiochem: + default_biochemistry = None + + @staticmethod + def get(create_if_missing = True): + if not ModelSEEDBiochem.default_biochemistry: + ModelSEEDBiochem.default_biochemistry = from_local(config.get("biochem","path")) + return ModelSEEDBiochem.default_biochemistry def __init__(self, compounds, reactions, compound_aliases=None, diff --git a/modelseedpy/config.cfg b/modelseedpy/config.cfg index 267031dc..bf4fa440 100755 --- a/modelseedpy/config.cfg +++ b/modelseedpy/config.cfg @@ -6,4 +6,6 @@ media_folder = data/media log_file = no filename = modelseedpy.log console_level = warning -file_level = info \ No newline at end of file +file_level = info +[biochem] +path = /Users/chenry/code/ModelSEEDDatabase \ No newline at end of file diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index f1e0bd09..99e2e075 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -5,6 +5,8 @@ import sys from cobra import Model, Reaction, Metabolite from modelseedpy.fbapkg.mspackagemanager import MSPackageManager +from modelseedpy.biochem.modelseed_biochem import ModelSEEDBiochem +from modelseedpy.core.fbahelper import FBAHelper logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) @@ -131,14 +133,26 @@ def add_name_to_metabolite_hash(self,name,met): self.search_metabolite_hash[sname] = [] self.search_metabolite_hash[sname].append(met) - def find_met(self,name): + def find_met(self,name,compartment=None): if self.metabolite_hash == None: self.build_metabolite_hash() if name in self.metabolite_hash: - return self.metabolite_hash[name] + if not compartment: + return self.metabolite_hash[name] + for met in self.metabolite_hash[name]: + array = met.id.split("_") + if array[1] == compartment or met.compartment == compartment: + return [met] + return None sname = MSModelUtil.search_name(name) if sname in self.search_metabolite_hash: - return self.search_metabolite_hash[sname] + if not compartment: + return self.search_metabolite_hash[sname] + for met in self.search_metabolite_hash[sname]: + array = met.id.split("_") + if array[1] == compartment or met.compartment == compartment: + return [met] + return None logger.info(name+" not found in model!") return [] @@ -238,6 +252,74 @@ def add_exchanges_for_metabolites(self,cpds,uptake=0,excretion=0,prefix='EX_', p def reaction_scores(self): return {} + ################################################################################# + #Functions related to editing the model + ################################################################################# + def add_ms_reaction(self,rxn_dict,compartment_trans=["c0","e0"]): + modelseed = ModelSEEDBiochem.get() + output = [] + for rxnid, compartment in rxn_dict.items(): + fullid = rxnid+"_"+compartment + modelseed_reaction = modelseed.get_seed_reaction(rxnid) + reaction_stoich = modelseed_reaction.cstoichiometry + cobra_reaction = Reaction(fullid) + output.append(cobra_reaction) + cobra_reaction.name = modelseed_reaction.data['name']+"_"+compartment + metabolites_to_add = {} + for metabolite, stoich in reaction_stoich.items(): + id = metabolite[0] + compound = modelseed.get_seed_compound(id).data + compartment_number = int(metabolite[1]) + if compartment_number > len(compartment_trans): + logger.critical("Compartment index "+str(compartment_number)+" out of range") + compartment_string = compartment_trans[compartment_number] + output = self.find_met(id,compartment_string) + cobramet = None + if output: + cobramet = output[0] + else: + cobramet = Metabolite(id+"_"+compartment_string, name = compound['name']+"_"+compartment_string, compartment = compartment_string) + metabolites_to_add[cobramet] = stoich + cobra_reaction.add_metabolites(metabolites_to_add) + cobra_reaction.reaction + self.model.add_reactions(output) + return output + + ################################################################################# + #Functions related to managing biomass reactions + ################################################################################# + def evaluate_biomass_reaction_mass(self,biomass_rxn_id,normalize=False): + biorxn = self.model.reactions.get_by_id(biomass_rxn_id) + #First computing energy biosynthesis coefficients + atp = None + atp_compounds = {"cpd00002":-1,"cpd00001":-1,"cpd00008":1,"cpd00009":1,"cpd00067":1} + mass_compounds = {'cpd11463':1,'cpd11461':1,'cpd11462':1} + process_compounds = {'cpd17041':1,'cpd17042':1,'cpd17043':1} + for met in biorxn.metabolites: + msid = self.metabolite_msid(met) + if msid == "cpd00008": + atp = abs(biorxn.metabolites[met]) + #Computing non ATP total mass + total = 0 + for met in biorxn.metabolites: + msid = self.metabolite_msid(met) + if msid == "cpd11416": + continue + coef = biorxn.metabolites[met] + if msid in mass_compounds: + total += coef + elif msid in process_compounds: + total += 0 + else: + mw = FBAHelper.metabolite_mw(met) + if msid in atp_compounds: + if coef < 0: + coef += atp + else: + coef += -1*atp + total += mw*coef/1000 + return {"ATP":atp,"Total":total} + #Required this function to add gapfilled compounds to a KBase model for saving gapfilled model def convert_cobra_compound_to_kbcompound(self,cpd,kbmodel,add_to_model = 1): refid = "cpd00000" @@ -444,6 +526,9 @@ def create_kb_gapfilling_data(self,kbmodel,atpmedia_ws = "94026"): "0" : [gf["reversed"][rxn],1,[]] } + ################################################################################# + #Functions related to applying, running, and expanding with test conditions + ################################################################################# def apply_test_condition(self,condition,model = None): """Applies constraints and objective of specified condition to model diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index c23a39c0..2c0a4c56 100755 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -12,7 +12,7 @@ logger = logging.getLogger(__name__) -default_blacklist = ["rxn12985", "rxn00238", "rxn07058", "rxn05305", "rxn00154", "rxn09037", "rxn10643", +default_blacklist = ["rxn12985", "rxn00238", "rxn07058", "rxn05305", "rxn09037", "rxn10643", "rxn11317", "rxn05254", "rxn05257", "rxn05258", "rxn05259", "rxn05264", "rxn05268", "rxn05269", "rxn05270", "rxn05271", "rxn05272", "rxn05273", "rxn05274", "rxn05275", "rxn05276", "rxn05277", "rxn05278", "rxn05279", "rxn05280", "rxn05281", "rxn05282", From ca6802555979517af29363ca117b55365fd83bde Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Sat, 3 Dec 2022 00:31:44 -0600 Subject: [PATCH 045/298] removed support for python3.6 added 3.9 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e72cfaff..20911611 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,8 @@ language: python python: - - 3.6 - 3.7 - 3.8 + - 3.9 before_install: - python --version - pip install -U pip From 29afcdd6cd2befcb315b916ba9947168fa51a837 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Sat, 3 Dec 2022 00:38:43 -0600 Subject: [PATCH 046/298] black format --- modelseedpy/biochem/modelseed_biochem.py | 201 +++++++++++++++------- modelseedpy/biochem/modelseed_compound.py | 28 ++- modelseedpy/core/msgenome.py | 10 +- modelseedpy/core/msmodel.py | 1 - modelseedpy/core/mstemplate.py | 1 - modelseedpy/fbapkg/gapfillingpkg.py | 8 +- 6 files changed, 165 insertions(+), 84 deletions(-) diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index a4244f35..508e519d 100644 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -10,7 +10,7 @@ logger = logging.getLogger(__name__) -_BIOCHEM_FOLDER = 'Biochemistry' +_BIOCHEM_FOLDER = "Biochemistry" ALIAS_CPD_IDENTIFIERS_ORG = { "BiGG": "bigg.metabolite", @@ -139,13 +139,13 @@ def load_metabolites_from_df( if cpd_id in structures: if "SMILE" in structures[cpd_id]: smiles = structures[cpd_id]["SMILE"] - aliases_annotation['SMILE'] = smiles + aliases_annotation["SMILE"] = smiles if "InChI" in structures[cpd_id]: inchi = structures[cpd_id]["InChI"] - aliases_annotation['InChI'] = inchi + aliases_annotation["InChI"] = inchi if "InChIKey" in structures[cpd_id]: inchi_key = structures[cpd_id]["InChIKey"] - aliases_annotation['InChIKey'] = inchi_key + aliases_annotation["InChIKey"] = inchi_key inchi_key = None if pd.isna(inchi_key) or len(inchi_key) == 0 else inchi_key other_names = set() if cpd_id in names: @@ -193,7 +193,9 @@ def _load_aliases_df(df_aliases, seed_index=1, source_index=3, alias_id_index=2) return aliases -def _load_metabolites(database_path: str, aliases=None, names=None, structures=None) -> dict: +def _load_metabolites( + database_path: str, aliases=None, names=None, structures=None +) -> dict: if aliases is None: aliases = {} if names is None: @@ -201,23 +203,34 @@ def _load_metabolites(database_path: str, aliases=None, names=None, structures=N if structures is None: structures = {} metabolites = {} - contents = os.listdir(f'{database_path}/{_BIOCHEM_FOLDER}') + contents = os.listdir(f"{database_path}/{_BIOCHEM_FOLDER}") for f in contents: - if f.startswith('compound_') and f.endswith('.json'): - with open(f'{database_path}/{_BIOCHEM_FOLDER}/{f}', 'r') as fh: + if f.startswith("compound_") and f.endswith(".json"): + with open(f"{database_path}/{_BIOCHEM_FOLDER}/{f}", "r") as fh: _compounds_data = json.load(fh) for o in _compounds_data: - if 'id' in o and o['id']: + if "id" in o and o["id"]: cpd_names = set() - if o['id'] in names: - cpd_names |= names[o['id']] - cpd = ModelSEEDCompound2(o['id'], o.get('formula'), - o.get('name'), o.get('charge'), '', - o.get('abbreviation'), cpd_names, - o.get('mass'), o.get('deltag'), o.get('deltagerr'), - o.get('is_core'), o.get('is_obsolete'), None, - o.get('pka'), o.get('pkb'), - o.get('source')) + if o["id"] in names: + cpd_names |= names[o["id"]] + cpd = ModelSEEDCompound2( + o["id"], + o.get("formula"), + o.get("name"), + o.get("charge"), + "", + o.get("abbreviation"), + cpd_names, + o.get("mass"), + o.get("deltag"), + o.get("deltagerr"), + o.get("is_core"), + o.get("is_obsolete"), + None, + o.get("pka"), + o.get("pkb"), + o.get("source"), + ) if cpd.id in aliases: cpd.annotation.update(aliases[cpd.id]) if cpd.id in structures: @@ -226,15 +239,19 @@ def _load_metabolites(database_path: str, aliases=None, names=None, structures=N if len(v) == 1: cpd.annotation[alias_type] = list(v)[0] else: - logger.warning(f'multiple {alias_type} structures found for {cpd.id}') + logger.warning( + f"multiple {alias_type} structures found for {cpd.id}" + ) metabolites[cpd.id] = cpd else: - print('error', o) - #print(_compounds_data[0].keys()) + print("error", o) + # print(_compounds_data[0].keys()) return metabolites -def _load_reactions(database_path: str, metabolites: dict, aliases=None, names=None, ec_numbers=None) -> (dict, dict): +def _load_reactions( + database_path: str, metabolites: dict, aliases=None, names=None, ec_numbers=None +) -> (dict, dict): if aliases is None: aliases = {} if names is None: @@ -242,24 +259,29 @@ def _load_reactions(database_path: str, metabolites: dict, aliases=None, names=N if ec_numbers is None: ec_numbers = {} reactions = {} - contents = os.listdir(f'{database_path}/{_BIOCHEM_FOLDER}') + contents = os.listdir(f"{database_path}/{_BIOCHEM_FOLDER}") metabolites_indexed = {} for f in contents: - if f.startswith('reaction_') and f.endswith('.json'): - with open(f'{database_path}/{_BIOCHEM_FOLDER}/{f}', 'r') as fh: + if f.startswith("reaction_") and f.endswith(".json"): + with open(f"{database_path}/{_BIOCHEM_FOLDER}/{f}", "r") as fh: _reactions_data = json.load(fh) for o in _reactions_data: - if 'id' in o and o['id']: + if "id" in o and o["id"]: rxn_names = set() - if o['id'] in names: - rxn_names |= names[o['id']] - lower_bound, upper_bound = get_reaction_constraints_from_direction(o.get('reversibility')) - stoichiometry = o.get('stoichiometry') + if o["id"] in names: + rxn_names |= names[o["id"]] + ( + lower_bound, + upper_bound, + ) = get_reaction_constraints_from_direction( + o.get("reversibility") + ) + stoichiometry = o.get("stoichiometry") reaction_metabolites = {} for s in stoichiometry: - cmp_token = s['compartment'] - value = s['coefficient'] - cpd = metabolites[s['compound']] + cmp_token = s["compartment"] + value = s["coefficient"] + cpd = metabolites[s["compound"]] cpd_index_id = f"{cpd.id}_{cmp_token}" if cpd_index_id not in metabolites_indexed: cpd_token = cpd.copy() @@ -267,21 +289,33 @@ def _load_reactions(database_path: str, metabolites: dict, aliases=None, names=N cpd_token.base_id = cpd.id cpd_token.compartment = cmp_token metabolites_indexed[cpd_index_id] = cpd_token - reaction_metabolites[metabolites_indexed[cpd_index_id]] = value - rxn = ModelSEEDReaction2(o['id'], o.get('name'), '', lower_bound, upper_bound, - '', rxn_names, - o.get('deltag'), o.get('deltagerr'), - o.get('is_obsolete'), None, - o.get('status'), o.get('source')) + reaction_metabolites[ + metabolites_indexed[cpd_index_id] + ] = value + rxn = ModelSEEDReaction2( + o["id"], + o.get("name"), + "", + lower_bound, + upper_bound, + "", + rxn_names, + o.get("deltag"), + o.get("deltagerr"), + o.get("is_obsolete"), + None, + o.get("status"), + o.get("source"), + ) rxn.add_metabolites(reaction_metabolites) if rxn.id in aliases: rxn.annotation.update(aliases[rxn.id]) if rxn.id in ec_numbers: - rxn.annotation['ec-code'] = ec_numbers[rxn.id] + rxn.annotation["ec-code"] = ec_numbers[rxn.id] metabolites[cpd.id] = cpd reactions[rxn.id] = rxn else: - logger.error(f'failed to read reaction record {o}') + logger.error(f"failed to read reaction record {o}") return reactions, metabolites_indexed @@ -399,12 +433,12 @@ def __init__(self, compounds: list, reactions: list, compound_tokens: list): def _index_inchi(self): for m in self.compounds: if m.inchi_key: - f, s, p = m.inchi_key.split('-') + f, s, p = m.inchi_key.split("-") if f not in self.inchi_key_lookup: self.inchi_key_lookup[f] = {} if s not in self.inchi_key_lookup[f]: self.inchi_key_lookup[f][s] = set() - proton_pair = (m.id , p) + proton_pair = (m.id, p) if proton_pair not in self.inchi_key_lookup[f][s]: self.inchi_key_lookup[f][s].add(proton_pair) @@ -415,7 +449,7 @@ def reactions_by_alias(self, alias, value): pass def find_compounds_by_inchi_key(self, inchi_key, exact=True): - f, s, p = inchi_key.split('-') + f, s, p = inchi_key.split("-") if exact and f in self.inchi_key_lookup and s in self.inchi_key_lookup[f]: # x is tuple (cpd.id, protonation) return [self.compounds.get_by_id(x[0]) for x in self.inchi_key_lookup[f][s]] @@ -763,40 +797,75 @@ def from_local_old(path): def from_local(database_path: str): - contents = os.listdir(f'{database_path}/Biochemistry/') - if 'compounds.tsv' in contents: + contents = os.listdir(f"{database_path}/Biochemistry/") + if "compounds.tsv" in contents: return from_local_old(database_path) - compound_aliases_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Compound_Aliases.txt' - reaction_aliases_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Aliases.txt' - compound_aliases = _load_aliases_df(pd.read_csv(compound_aliases_url, index_col=None, sep='\t')) - reaction_aliases = _load_aliases_df(pd.read_csv(reaction_aliases_url, index_col=None, sep='\t')) + compound_aliases_url = ( + f"{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Compound_Aliases.txt" + ) + reaction_aliases_url = ( + f"{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Aliases.txt" + ) + compound_aliases = _load_aliases_df( + pd.read_csv(compound_aliases_url, index_col=None, sep="\t") + ) + reaction_aliases = _load_aliases_df( + pd.read_csv(reaction_aliases_url, index_col=None, sep="\t") + ) - compound_structures_url = f'{database_path}/Biochemistry/Structures/Unique_ModelSEED_Structures.txt' - compound_structures = _load_aliases_df(pd.read_csv(compound_structures_url, index_col=None, sep='\t'), - source_index=2, alias_id_index=6) + compound_structures_url = ( + f"{database_path}/Biochemistry/Structures/Unique_ModelSEED_Structures.txt" + ) + compound_structures = _load_aliases_df( + pd.read_csv(compound_structures_url, index_col=None, sep="\t"), + source_index=2, + alias_id_index=6, + ) - compound_names_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Compound_Names.txt' - reaction_names_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Names.txt' - compound_names = _load_aliases_df(pd.read_csv(compound_names_url, index_col=None, sep='\t')) - reaction_names = _load_aliases_df(pd.read_csv(reaction_names_url, index_col=None, sep='\t')) + compound_names_url = ( + f"{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Compound_Names.txt" + ) + reaction_names_url = ( + f"{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Names.txt" + ) + compound_names = _load_aliases_df( + pd.read_csv(compound_names_url, index_col=None, sep="\t") + ) + reaction_names = _load_aliases_df( + pd.read_csv(reaction_names_url, index_col=None, sep="\t") + ) - reaction_ecs_url = f'{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_ECs.txt' - reaction_ecs = _load_aliases_df(pd.read_csv(reaction_ecs_url, index_col=None, sep='\t')) + reaction_ecs_url = ( + f"{database_path}/Biochemistry/Aliases/Unique_ModelSEED_Reaction_ECs.txt" + ) + reaction_ecs = _load_aliases_df( + pd.read_csv(reaction_ecs_url, index_col=None, sep="\t") + ) # build metabolites unpack names - metabolites = _load_metabolites(database_path, compound_aliases, - {k:v['name'] for k, v in compound_names.items()}, - compound_structures) + metabolites = _load_metabolites( + database_path, + compound_aliases, + {k: v["name"] for k, v in compound_names.items()}, + compound_structures, + ) # build reactions unpack names, ecs - reactions, metabolite_tokens = _load_reactions(database_path, metabolites, reaction_aliases, - {k:v['name'] for k, v in reaction_names.items()}, - {k:v['Enzyme Class'] for k, v in reaction_ecs.items()}) - database = ModelSEEDDatabase(metabolites.values(), reactions.values(), metabolite_tokens.values()) + reactions, metabolite_tokens = _load_reactions( + database_path, + metabolites, + reaction_aliases, + {k: v["name"] for k, v in reaction_names.items()}, + {k: v["Enzyme Class"] for k, v in reaction_ecs.items()}, + ) + database = ModelSEEDDatabase( + metabolites.values(), reactions.values(), metabolite_tokens.values() + ) return database + def get_names_from_df(df): names = {} for t in df.itertuples(): diff --git a/modelseedpy/biochem/modelseed_compound.py b/modelseedpy/biochem/modelseed_compound.py index 776fc809..89c4d5f5 100644 --- a/modelseedpy/biochem/modelseed_compound.py +++ b/modelseedpy/biochem/modelseed_compound.py @@ -4,14 +4,12 @@ from cobra.core import Metabolite import pandas as pd -_SMILE_ALIAS = 'SMILE' -_INCHI_ALIAS = 'InChI' -_INCHI_KEY_ALIAS = 'InChIKey' - -class ModelSEEDCompound2(Metabolite): - +_SMILE_ALIAS = "SMILE" +_INCHI_ALIAS = "InChI" +_INCHI_KEY_ALIAS = "InChIKey" +class ModelSEEDCompound2(Metabolite): def __init__( self, cpd_id=None, @@ -66,15 +64,27 @@ def to_template_compartment_compound(self, compartment): @property def smiles(self): - return None if _SMILE_ALIAS not in self.annotation else self.annotation[_SMILE_ALIAS] + return ( + None + if _SMILE_ALIAS not in self.annotation + else self.annotation[_SMILE_ALIAS] + ) @property def inchi_key(self): - return None if _INCHI_KEY_ALIAS not in self.annotation else self.annotation[_INCHI_KEY_ALIAS] + return ( + None + if _INCHI_KEY_ALIAS not in self.annotation + else self.annotation[_INCHI_KEY_ALIAS] + ) @property def inchi(self): - return None if _INCHI_ALIAS not in self.annotation else self.annotation[_INCHI_ALIAS] + return ( + None + if _INCHI_ALIAS not in self.annotation + else self.annotation[_INCHI_ALIAS] + ) class ModelSEEDCompound(ModelSEEDObject): diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index 7404e486..999e464d 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -48,7 +48,6 @@ def parse_fasta_str(faa_str, split=DEFAULT_SPLIT, h_func=None): class MSFeature: - def __init__(self, feature_id, sequence, description=None): """ @@ -77,7 +76,6 @@ def add_ontology_term(self, ontology_term, value): class MSGenome: - def __init__(self): self.features = DictList() @@ -107,13 +105,15 @@ def from_fasta( return genome def to_fasta(self, filename, l=80, fn_header=None): - with open(filename, 'w') as fh: + with open(filename, "w") as fh: for feature in self.features: - h = f'>{feature.id}\n' + h = f">{feature.id}\n" if fn_header: h = fn_header(feature) fh.write(h) - lines = [feature.seq[i:i + l] + '\n' for i in range(0, len(feature.seq), l)] + lines = [ + feature.seq[i : i + l] + "\n" for i in range(0, len(feature.seq), l) + ] for line in lines: fh.write(line) return filename diff --git a/modelseedpy/core/msmodel.py b/modelseedpy/core/msmodel.py index 9b1d180c..d34fc9e6 100644 --- a/modelseedpy/core/msmodel.py +++ b/modelseedpy/core/msmodel.py @@ -116,7 +116,6 @@ def get_set_set(expr_str): # !!! this currently returns dictionaries, not sets? class MSModel(Model): - def __init__(self, id_or_model=None, genome=None, template=None): """ Class representation for a ModelSEED model. diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 7a874abd..b1bb1975 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -1078,4 +1078,3 @@ def build(self): ) # TODO: biomass object return template - diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index 27960276..1ccc98f3 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -437,7 +437,9 @@ def build_package(self, parameters): if indexhash[index] > 10: if index == "none": for template in self.parameters["default_gapfill_templates"]: - new_penalties = self.extend_model_with_template_for_gapfilling(template, index) + new_penalties = self.extend_model_with_template_for_gapfilling( + template, index + ) self.gapfilling_penalties.update(new_penalties) for gfmdl in self.parameters["default_gapfill_models"]: new_penalties = self.extend_model_with_model_for_gapfilling( @@ -466,7 +468,9 @@ def build_package(self, parameters): self.gapfilling_penalties.update(new_penalties) if self.parameters["gapfill_all_indecies_with_default_models"]: for gfmdl in self.parameters["default_gapfill_models"]: - new_penalties = self.extend_model_with_model_for_gapfilling(gfmdl, index) + new_penalties = self.extend_model_with_model_for_gapfilling( + gfmdl, index + ) self.gapfilling_penalties.update(new_penalties) # Rescaling penalties by reaction scores and saving genes for reaction in self.gapfilling_penalties: From b11ceb228d185cb1919eae1250f86158fb8e7ae0 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Wed, 7 Dec 2022 11:38:06 -0600 Subject: [PATCH 047/298] black --- modelseedpy/core/exceptions.py | 6 + modelseedpy/core/msbuilder.py | 837 +++++++++++++++++++++------------ modelseedpy/core/mstemplate.py | 34 +- pyproject.toml | 27 ++ setup.py | 13 +- 5 files changed, 627 insertions(+), 290 deletions(-) create mode 100644 pyproject.toml diff --git a/modelseedpy/core/exceptions.py b/modelseedpy/core/exceptions.py index ce708956..cb72f36c 100644 --- a/modelseedpy/core/exceptions.py +++ b/modelseedpy/core/exceptions.py @@ -1,6 +1,12 @@ # -*- coding: utf-8 -*- # Adding a few exception classes to handle different types of errors in a central file +class ModelSEEDError(Exception): + """Error in ModelSEED execution logic""" + + pass + + class FeasibilityError(Exception): """Error in FBA formulation""" diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index ad752f17..3c855ca0 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -2,13 +2,14 @@ import logging import itertools import cobra +from modelseedpy.core.exceptions import ModelSEEDError from modelseedpy.core.rast_client import RastClient from modelseedpy.core.msgenome import normalize_role from modelseedpy.core.msmodel import ( get_gpr_string, get_reaction_constraints_from_direction, ) -from cobra.core import Gene, Metabolite, Reaction +from cobra.core import Gene, Metabolite, Reaction, Group from modelseedpy.core.msmodel import MSModel from modelseedpy.core import FBAHelper from modelseedpy.fbapkg.mspackagemanager import MSPackageManager @@ -19,221 +20,221 @@ ### temp stuff ### core_biomass = { - "cpd00032_c0": -1.7867, - "cpd00005_c0": -1.8225, - "cpd00169_c0": -1.496, - "cpd11416_c0": 1, - "cpd00003_c0": -3.547, - "cpd00008_c0": 41.257, - "cpd00024_c0": -1.0789, - "cpd00009_c0": 41.257, - "cpd00102_c0": -0.129, - "cpd00101_c0": -0.8977, - "cpd00236_c0": -0.8977, - "cpd00002_c0": -41.257, - "cpd00022_c0": -3.7478, - "cpd00020_c0": -2.8328, - "cpd00006_c0": 1.8225, - "cpd00001_c0": -41.257, - "cpd00072_c0": -0.0709, - "cpd00010_c0": 3.7478, - "cpd00004_c0": 3.547, - "cpd00061_c0": -0.5191, - "cpd00067_c0": 46.6265, - "cpd00079_c0": -0.205, + "cpd00032_c": -1.7867, + "cpd00005_c": -1.8225, + "cpd00169_c": -1.496, + "cpd11416_c": 1, + "cpd00003_c": -3.547, + "cpd00008_c": 41.257, + "cpd00024_c": -1.0789, + "cpd00009_c": 41.257, + "cpd00102_c": -0.129, + "cpd00101_c": -0.8977, + "cpd00236_c": -0.8977, + "cpd00002_c": -41.257, + "cpd00022_c": -3.7478, + "cpd00020_c": -2.8328, + "cpd00006_c": 1.8225, + "cpd00001_c": -41.257, + "cpd00072_c": -0.0709, + "cpd00010_c": 3.7478, + "cpd00004_c": 3.547, + "cpd00061_c": -0.5191, + "cpd00067_c": 46.6265, + "cpd00079_c": -0.205, } core_atp2 = { - "cpd00067_c0": 46.6265, - "cpd00002_c0": -41.257, - "cpd00008_c0": 41.257, - "cpd00001_c0": -41.257, - "cpd00009_c0": 41.257, + "cpd00067_c": 46.6265, + "cpd00002_c": -41.257, + "cpd00008_c": 41.257, + "cpd00001_c": -41.257, + "cpd00009_c": 41.257, } core_atp = { - "cpd00067_c0": 1, - "cpd00002_c0": -1, - "cpd00008_c0": 1, - "cpd00001_c0": -1, - "cpd00009_c0": 1, + "cpd00067_c": 1, + "cpd00002_c": -1, + "cpd00008_c": 1, + "cpd00001_c": -1, + "cpd00009_c": 1, } gramneg = { - "cpd00166_c0": -0.00280615915959131, - "cpd00087_c0": -0.00280615915959131, - "cpd15560_c0": -0.00280615915959131, - "cpd00028_c0": -0.00280615915959131, - "cpd10515_c0": -0.00280615915959131, - "cpd15665_c0": -0.0250105977108944, - "cpd12370_c0": 0.00280615915959131, - "cpd15500_c0": -0.00280615915959131, - "cpd00220_c0": -0.00280615915959131, - "cpd00003_c0": -0.00280615915959131, - "cpd00557_c0": -0.00280615915959131, - "cpd00002_c0": -40.1101757365074, - "cpd00023_c0": -0.219088153012743, - "cpd00062_c0": -0.0908319049068452, - "cpd00050_c0": -0.00280615915959131, - "cpd00008_c0": 40, - "cpd00264_c0": -0.00280615915959131, - "cpd00010_c0": -0.00280615915959131, - "cpd15533_c0": -0.0311453449430676, - "cpd11416_c0": 1, - "cpd15540_c0": -0.0311453449430676, - "cpd00048_c0": -0.00280615915959131, - "cpd00035_c0": -0.427934380173264, - "cpd17042_c0": -1, - "cpd00030_c0": -0.00280615915959131, - "cpd00034_c0": -0.00280615915959131, - "cpd00161_c0": -0.211072732780569, - "cpd00201_c0": -0.00280615915959131, - "cpd00016_c0": -0.00280615915959131, - "cpd00104_c0": -0.00280615915959131, - "cpd00067_c0": 40, - "cpd11493_c0": -0.00280615915959131, - "cpd00051_c0": -0.246696822701341, - "cpd00017_c0": -0.00280615915959131, - "cpd00357_c0": -0.0157642107352084, - "cpd17041_c0": -1, - "cpd00038_c0": -0.135406821203723, - "cpd00107_c0": -0.375388847540127, - "cpd00042_c0": -0.00280615915959131, - "cpd00149_c0": -0.00280615915959131, - "cpd00058_c0": -0.00280615915959131, - "cpd00041_c0": -0.200830806928348, - "cpd00129_c0": -0.184354665339991, - "cpd15432_c0": -0.0250105977108944, - "cpd00052_c0": -0.0841036156544863, - "cpd00012_c0": 0.484600235732628, - "cpd15352_c0": -0.00280615915959131, - "cpd00322_c0": -0.241798510337235, - "cpd00053_c0": -0.219088153012743, - "cpd00006_c0": -0.00280615915959131, - "cpd00345_c0": -0.00280615915959131, - "cpd00063_c0": -0.00280615915959131, - "cpd00033_c0": -0.509869786991038, - "cpd00066_c0": -0.154519490031345, - "cpd17043_c0": -1, - "cpd00118_c0": -0.00280615915959131, - "cpd00009_c0": 39.9971938408404, - "cpd15793_c0": -0.0311453449430676, - "cpd00356_c0": -0.01627686799489, - "cpd01997_c0": 0.00280615915959131, - "cpd00132_c0": -0.200830806928348, - "cpd00060_c0": -0.127801422590767, - "cpd00037_c0": -0.00280615915959131, - "cpd00115_c0": -0.0157642107352084, - "cpd00099_c0": -0.00280615915959131, - "cpd00156_c0": -0.352233189091625, - "cpd02229_c0": -0.0250105977108944, - "cpd00069_c0": -0.120676604606612, - "cpd00065_c0": -0.0472019191450218, - "cpd00241_c0": -0.01627686799489, - "cpd15666_c0": 0.0250105977108944, - "cpd10516_c0": -0.00280615915959131, - "cpd00084_c0": -0.0761464922056484, - "cpd00056_c0": -0.00280615915959131, - "cpd00119_c0": -0.0792636000737159, - "cpd00001_c0": -35.5403092430435, - "cpd03422_c0": 0.00280615915959131, - "cpd00015_c0": -0.00280615915959131, - "cpd00054_c0": -0.179456352975885, - "cpd00205_c0": -0.00280615915959131, - "cpd00039_c0": -0.285438020490179, - "cpd00254_c0": -0.00280615915959131, + "cpd00166_c": -0.00280615915959131, + "cpd00087_c": -0.00280615915959131, + "cpd15560_c": -0.00280615915959131, + "cpd00028_c": -0.00280615915959131, + "cpd10515_c": -0.00280615915959131, + "cpd15665_c": -0.0250105977108944, + "cpd12370_c": 0.00280615915959131, + "cpd15500_c": -0.00280615915959131, + "cpd00220_c": -0.00280615915959131, + "cpd00003_c": -0.00280615915959131, + "cpd00557_c": -0.00280615915959131, + "cpd00002_c": -40.1101757365074, + "cpd00023_c": -0.219088153012743, + "cpd00062_c": -0.0908319049068452, + "cpd00050_c": -0.00280615915959131, + "cpd00008_c": 40, + "cpd00264_c": -0.00280615915959131, + "cpd00010_c": -0.00280615915959131, + "cpd15533_c": -0.0311453449430676, + "cpd11416_c": 1, + "cpd15540_c": -0.0311453449430676, + "cpd00048_c": -0.00280615915959131, + "cpd00035_c": -0.427934380173264, + "cpd17042_c": -1, + "cpd00030_c": -0.00280615915959131, + "cpd00034_c": -0.00280615915959131, + "cpd00161_c": -0.211072732780569, + "cpd00201_c": -0.00280615915959131, + "cpd00016_c": -0.00280615915959131, + "cpd00104_c": -0.00280615915959131, + "cpd00067_c": 40, + "cpd11493_c": -0.00280615915959131, + "cpd00051_c": -0.246696822701341, + "cpd00017_c": -0.00280615915959131, + "cpd00357_c": -0.0157642107352084, + "cpd17041_c": -1, + "cpd00038_c": -0.135406821203723, + "cpd00107_c": -0.375388847540127, + "cpd00042_c": -0.00280615915959131, + "cpd00149_c": -0.00280615915959131, + "cpd00058_c": -0.00280615915959131, + "cpd00041_c": -0.200830806928348, + "cpd00129_c": -0.184354665339991, + "cpd15432_c": -0.0250105977108944, + "cpd00052_c": -0.0841036156544863, + "cpd00012_c": 0.484600235732628, + "cpd15352_c": -0.00280615915959131, + "cpd00322_c": -0.241798510337235, + "cpd00053_c": -0.219088153012743, + "cpd00006_c": -0.00280615915959131, + "cpd00345_c": -0.00280615915959131, + "cpd00063_c": -0.00280615915959131, + "cpd00033_c": -0.509869786991038, + "cpd00066_c": -0.154519490031345, + "cpd17043_c": -1, + "cpd00118_c": -0.00280615915959131, + "cpd00009_c": 39.9971938408404, + "cpd15793_c": -0.0311453449430676, + "cpd00356_c": -0.01627686799489, + "cpd01997_c": 0.00280615915959131, + "cpd00132_c": -0.200830806928348, + "cpd00060_c": -0.127801422590767, + "cpd00037_c": -0.00280615915959131, + "cpd00115_c": -0.0157642107352084, + "cpd00099_c": -0.00280615915959131, + "cpd00156_c": -0.352233189091625, + "cpd02229_c": -0.0250105977108944, + "cpd00069_c": -0.120676604606612, + "cpd00065_c": -0.0472019191450218, + "cpd00241_c": -0.01627686799489, + "cpd15666_c": 0.0250105977108944, + "cpd10516_c": -0.00280615915959131, + "cpd00084_c": -0.0761464922056484, + "cpd00056_c": -0.00280615915959131, + "cpd00119_c": -0.0792636000737159, + "cpd00001_c": -35.5403092430435, + "cpd03422_c": 0.00280615915959131, + "cpd00015_c": -0.00280615915959131, + "cpd00054_c": -0.179456352975885, + "cpd00205_c": -0.00280615915959131, + "cpd00039_c": -0.285438020490179, + "cpd00254_c": -0.00280615915959131, } grampos = { - "cpd00241_c0": -0.0116907079028565, - "cpd00017_c0": -0.00719527989638797, - "cpd00033_c0": -0.409331301687739, - "cpd00066_c0": -0.176188648374102, - "cpd17043_c0": -1, - "cpd03422_c0": 0.00719527989638797, - "cpd17041_c0": -1, - "cpd00557_c0": -0.00719527989638797, - "cpd00129_c0": -0.161028229793075, - "cpd00166_c0": -0.00719527989638797, - "cpd00030_c0": -0.00719527989638797, - "cpd00087_c0": -0.00719527989638797, - "cpd00015_c0": -0.00719527989638797, - "cpd00065_c0": -0.0544955586831525, - "cpd00357_c0": -0.0151844826784228, - "cpd00009_c0": 41.2498047201036, - "cpd00038_c0": -0.0424026391792249, - "cpd15667_c0": -0.00309563020839783, - "cpd00069_c0": -0.111039822579957, - "cpd15540_c0": -0.0251172136637642, - "cpd00161_c0": -0.186841915485094, - "cpd15748_c0": -0.00309563020839783, - "cpd00035_c0": -0.267560900902997, - "cpd00048_c0": -0.00719527989638797, - "cpd12370_c0": 0.00719527989638797, - "cpd00052_c0": -0.0261242266150642, - "cpd15757_c0": -0.00309563020839783, - "cpd00053_c0": -0.261005044219309, - "cpd15533_c0": -0.0251172136637642, - "cpd00002_c0": -41.2913947104178, - "cpd00006_c0": -0.00719527989638797, - "cpd00084_c0": -0.0569540049395353, - "cpd10515_c0": -0.00719527989638797, - "cpd00104_c0": -0.00719527989638797, - "cpd00051_c0": -0.193397772168782, - "cpd00028_c0": -0.00719527989638797, - "cpd00118_c0": -0.00719527989638797, - "cpd00107_c0": -0.347460404235438, - "cpd00037_c0": -0.00719527989638797, - "cpd15793_c0": -0.0251172136637642, - "cpd00010_c0": -0.00719527989638797, - "cpd11493_c0": -0.00719527989638797, - "cpd00264_c0": -0.00719527989638797, - "cpd15766_c0": -0.00309563020839783, - "cpd00041_c0": -0.14832625746843, - "cpd00056_c0": -0.00719527989638797, - "cpd01997_c0": 0.00719527989638797, - "cpd15668_c0": -0.00309563020839783, - "cpd00254_c0": -0.00719527989638797, - "cpd11416_c0": 1, - "cpd02229_c0": -0.00309563020839783, - "cpd00003_c0": -0.00719527989638797, - "cpd00008_c0": 41.257, - "cpd17042_c0": -1, - "cpd00023_c0": -0.261005044219309, - "cpd15665_c0": -0.00309563020839783, - "cpd11459_c0": -0.00309563020839783, - "cpd15666_c0": 0.0123825208335913, - "cpd00115_c0": -0.0151844826784228, - "cpd00050_c0": -0.00719527989638797, - "cpd00063_c0": -0.00719527989638797, - "cpd00205_c0": -0.00719527989638797, - "cpd00054_c0": -0.216753011604418, - "cpd00042_c0": -0.00719527989638797, - "cpd00034_c0": -0.00719527989638797, - "cpd15500_c0": -0.00719527989638797, - "cpd00156_c0": -0.307715523090583, - "cpd00132_c0": -0.14832625746843, - "cpd00067_c0": -41.257, - "cpd15775_c0": -0.00309563020839783, - "cpd00119_c0": -0.0819482085460939, - "cpd00060_c0": -0.11349826883634, - "cpd00001_c0": 45.354000686262, - "cpd00099_c0": -0.00719527989638797, - "cpd00356_c0": -0.0116907079028565, - "cpd00220_c0": -0.00719527989638797, - "cpd00322_c0": -0.27042908820211, - "cpd00062_c0": -0.0282246669459237, - "cpd00345_c0": -0.00719527989638797, - "cpd00012_c0": 0.184896624320595, - "cpd10516_c0": -0.00719527989638797, - "cpd00039_c0": -0.323695423757071, - "cpd00201_c0": -0.00719527989638797, - "cpd15669_c0": -0.00309563020839783, - "cpd15560_c0": -0.00719527989638797, - "cpd00149_c0": -0.00719527989638797, - "cpd00058_c0": -0.00719527989638797, - "cpd00016_c0": -0.00719527989638797, - "cpd15352_c0": -0.00719527989638797, + "cpd00241_c": -0.0116907079028565, + "cpd00017_c": -0.00719527989638797, + "cpd00033_c": -0.409331301687739, + "cpd00066_c": -0.176188648374102, + "cpd17043_c": -1, + "cpd03422_c": 0.00719527989638797, + "cpd17041_c": -1, + "cpd00557_c": -0.00719527989638797, + "cpd00129_c": -0.161028229793075, + "cpd00166_c": -0.00719527989638797, + "cpd00030_c": -0.00719527989638797, + "cpd00087_c": -0.00719527989638797, + "cpd00015_c": -0.00719527989638797, + "cpd00065_c": -0.0544955586831525, + "cpd00357_c": -0.0151844826784228, + "cpd00009_c": 41.2498047201036, + "cpd00038_c": -0.0424026391792249, + "cpd15667_c": -0.00309563020839783, + "cpd00069_c": -0.111039822579957, + "cpd15540_c": -0.0251172136637642, + "cpd00161_c": -0.186841915485094, + "cpd15748_c": -0.00309563020839783, + "cpd00035_c": -0.267560900902997, + "cpd00048_c": -0.00719527989638797, + "cpd12370_c": 0.00719527989638797, + "cpd00052_c": -0.0261242266150642, + "cpd15757_c": -0.00309563020839783, + "cpd00053_c": -0.261005044219309, + "cpd15533_c": -0.0251172136637642, + "cpd00002_c": -41.2913947104178, + "cpd00006_c": -0.00719527989638797, + "cpd00084_c": -0.0569540049395353, + "cpd10515_c": -0.00719527989638797, + "cpd00104_c": -0.00719527989638797, + "cpd00051_c": -0.193397772168782, + "cpd00028_c": -0.00719527989638797, + "cpd00118_c": -0.00719527989638797, + "cpd00107_c": -0.347460404235438, + "cpd00037_c": -0.00719527989638797, + "cpd15793_c": -0.0251172136637642, + "cpd00010_c": -0.00719527989638797, + "cpd11493_c": -0.00719527989638797, + "cpd00264_c": -0.00719527989638797, + "cpd15766_c": -0.00309563020839783, + "cpd00041_c": -0.14832625746843, + "cpd00056_c": -0.00719527989638797, + "cpd01997_c": 0.00719527989638797, + "cpd15668_c": -0.00309563020839783, + "cpd00254_c": -0.00719527989638797, + "cpd11416_c": 1, + "cpd02229_c": -0.00309563020839783, + "cpd00003_c": -0.00719527989638797, + "cpd00008_c": 41.257, + "cpd17042_c": -1, + "cpd00023_c": -0.261005044219309, + "cpd15665_c": -0.00309563020839783, + "cpd11459_c": -0.00309563020839783, + "cpd15666_c": 0.0123825208335913, + "cpd00115_c": -0.0151844826784228, + "cpd00050_c": -0.00719527989638797, + "cpd00063_c": -0.00719527989638797, + "cpd00205_c": -0.00719527989638797, + "cpd00054_c": -0.216753011604418, + "cpd00042_c": -0.00719527989638797, + "cpd00034_c": -0.00719527989638797, + "cpd15500_c": -0.00719527989638797, + "cpd00156_c": -0.307715523090583, + "cpd00132_c": -0.14832625746843, + "cpd00067_c": -41.257, + "cpd15775_c": -0.00309563020839783, + "cpd00119_c": -0.0819482085460939, + "cpd00060_c": -0.11349826883634, + "cpd00001_c": 45.354000686262, + "cpd00099_c": -0.00719527989638797, + "cpd00356_c": -0.0116907079028565, + "cpd00220_c": -0.00719527989638797, + "cpd00322_c": -0.27042908820211, + "cpd00062_c": -0.0282246669459237, + "cpd00345_c": -0.00719527989638797, + "cpd00012_c": 0.184896624320595, + "cpd10516_c": -0.00719527989638797, + "cpd00039_c": -0.323695423757071, + "cpd00201_c": -0.00719527989638797, + "cpd15669_c": -0.00309563020839783, + "cpd15560_c": -0.00719527989638797, + "cpd00149_c": -0.00719527989638797, + "cpd00058_c": -0.00719527989638797, + "cpd00016_c": -0.00719527989638797, + "cpd15352_c": -0.00719527989638797, } @@ -327,13 +328,130 @@ def build_gpr(cpx_gene_role): class MSBuilder: - def __init__(self, genome, template=None): + + DEFAULT_SINKS = {"cpd02701_c": 1000, "cpd11416_c": 1000, "cpd15302_c": 1000} + + def __init__( + self, genome, template=None, name=None, ontology_term="RAST", index="0" + ): """ - for future methods with better customization + + @param genome: MSGenome + @param template: MSTemplate + @param name: + @param ontology_term: """ + if index is None or type(index) != str: + raise TypeError("index must be str") + if ontology_term is None or type(ontology_term) != str: + raise TypeError("ontology_term must be str") + self.name = name self.genome = genome self.template = template - self.search_name_to_genes, self.search_name_to_original = _aaaa(genome, "RAST") + self.search_name_to_genes, self.search_name_to_original = _aaaa( + genome, ontology_term + ) + self.template_species_to_model_species = None + self.reaction_to_complex_sets = None + self.compartments = None + self.base_model = None + self.index = index + + def build_drains(self): + if self.template_species_to_model_species is None: + logger.warning("cannot build model drains without generating model species") + return None + if self.template.drains: + sinks = self.build_sinks() + demands = self.build_demands() + return sinks + demands + else: + # template without drain specification we build only default sinks + return self.build_sinks() + + def build_sinks(self): + if self.template_species_to_model_species is None: + logger.warning("cannot build model sinks without generating model species") + return None + if self.template.drains: + sinks = { + x.id: t[1] + for x, t in self.template.drains.items() + if t[1] > 0 and x.id in self.template_species_to_model_species + } + return [self.build_sink_reaction(x, v) for x, v in sinks.items()] + else: + # template without drain specification we build only default sinks + in_model = { + k: v + for k, v in MSBuilder.DEFAULT_SINKS.items() + if k in self.template_species_to_model_species + } + return [self.build_sink_reaction(x, v) for x, v in in_model.items()] + + def build_demands(self): + if self.template_species_to_model_species is None: + logger.warning("cannot build model sinks without generating model species") + return None + if self.template.drains: + demands = { + x.id: t[0] + for x, t in self.template.drains.items() + if t[0] < 0 and x.id in self.template_species_to_model_species + } + return [self.build_demand_reaction(x, v) for x, v in demands.items()] + else: + return [] + + def build_drain_reaction( + self, + template_cpd_id, + prefix="EX_", + name_prefix="Exchange for ", + subsystem="exchanges", + lower_bound=0, + upper_bound=1000, + ): + """ + SK_ for sink (SBO_0000632) DM_ for demand (SBO_0000628) EX_ for exchange (SBO_0000627) + @param template_cpd_id: + @param prefix: + @param name_prefix: + @param subsystem: + @param lower_bound: + @param upper_bound: + @return: + """ + + if self.template_species_to_model_species is None: + logger.warning("cannot build model drains without generating model species") + return None + else: + m = self.template_species_to_model_species[template_cpd_id] + drain = Reaction( + f"{prefix}{m.id}", + f"{name_prefix}{m.name}", + subsystem, + lower_bound, + upper_bound, + ) + drain.add_metabolites({m: -1}) + drain.annotation[SBO_ANNOTATION] = "SBO:0000627" + return drain + + def build_sink_reaction(self, template_cpd_id, upper_bound): + if upper_bound <= 0: + raise ModelSEEDError("Sink reactions must have upper bound > 0") + return self.build_drain_reaction( + template_cpd_id, "SK_", "Sink for ", "exchanges", 0, upper_bound + ) + + def build_demand_reaction(self, template_cpd_id, lower_bound): + if lower_bound >= 0: + raise ModelSEEDError("Demand reactions must have lower bound < 0") + return self.build_drain_reaction( + template_cpd_id, "DM_", "Demand for ", "exchanges", lower_bound, 0 + ) def _get_template_reaction_complexes(self, template_reaction): """ @@ -435,40 +553,7 @@ def get_gpr_from_template_reaction( return gpr_set @staticmethod - def _build_reaction(reaction_id, gpr_set, template, index="0", sbo=None): - template_reaction = template.reactions.get_by_id(reaction_id) - - reaction_compartment = template_reaction.compartment - metabolites = {} - - for cpd, value in template_reaction.metabolites.items(): - compartment = f"{cpd.compartment}{index}" - name = f"{cpd.name}_{compartment}" - cpd = Metabolite( - cpd.id + str(index), cpd.formula, name, cpd.charge, compartment - ) - metabolites[cpd] = value - - reaction = Reaction( - "{}{}".format(template_reaction.id, index), - "{}_{}{}".format(template_reaction.name, reaction_compartment, index), - "", - template_reaction.lower_bound, - template_reaction.upper_bound, - ) - - gpr_str = build_gpr2(gpr_set) if gpr_set else "" - reaction.add_metabolites(metabolites) - if gpr_str and len(gpr_str) > 0: - reaction.gene_reaction_rule = gpr_str # get_gpr_string(gpr_ll) - - reaction.annotation["seed.reaction"] = template_reaction.reference_id - if sbo: - reaction.annotation[SBO_ANNOTATION] = sbo - return reaction - - @staticmethod - def build_exchanges(model, extra_cell="e0"): + def add_exchanges_to_model(model, extra_cell="e0"): """ Build exchange reactions for the "extra_cell" compartment :param model: Cobra Model @@ -494,16 +579,15 @@ def build_exchanges(model, extra_cell="e0"): return reactions_exchanges - @staticmethod - def build_biomasses(model, template, index): + def build_static_biomasses(self, model, template): res = [] if template.name.startswith("CoreModel"): - res.append(build_biomass("bio1", model, template, core_biomass, index)) - res.append(build_biomass("bio2", model, template, core_atp, index)) + res.append(self.build_biomass("bio1", model, template, core_biomass)) + res.append(self.build_biomass("bio2", model, template, core_atp)) if template.name.startswith("GramNeg"): - res.append(build_biomass("bio1", model, template, gramneg, index)) + res.append(self.build_biomass("bio1", model, template, gramneg)) if template.name.startswith("GramPos"): - res.append(build_biomass("bio1", model, template, grampos, index)) + res.append(self.build_biomass("bio1", model, template, grampos)) return res def auto_select_template(self): @@ -542,57 +626,211 @@ def auto_select_template(self): return genome_class - def build_metabolic_reactions(self, index="0", allow_incomplete_complexes=True): - metabolic_reactions = {} + def generate_reaction_complex_sets(self, allow_incomplete_complexes=True): + self.reaction_to_complex_sets = {} for template_reaction in self.template.reactions: gpr_set = self.get_gpr_from_template_reaction( template_reaction, allow_incomplete_complexes ) if gpr_set: - metabolic_reactions[template_reaction.id] = gpr_set + self.reaction_to_complex_sets[template_reaction.id] = gpr_set logger.debug("[%s] gpr set: %s", template_reaction.id, gpr_set) - reactions = list( - map( - lambda x: self._build_reaction( - x[0], x[1], self.template, index, "SBO:0000176" - ), - metabolic_reactions.items(), + return self.reaction_to_complex_sets + + """ + def _build_reaction(self, reaction_id, gpr_set, template, index="0", sbo=None): + template_reaction = template.reactions.get_by_id(reaction_id) + + reaction_compartment = template_reaction.compartment + metabolites = {} + + for cpd, value in template_reaction.metabolites.items(): + compartment = f"{cpd.compartment}{index}" + name = f"{cpd.name}_{compartment}" + cpd = Metabolite( + cpd.id + str(index), cpd.formula, name, cpd.charge, compartment ) + metabolites[cpd] = value + + reaction = Reaction( + "{}{}".format(template_reaction.id, index), + "{}_{}{}".format(template_reaction.name, reaction_compartment, index), + "", + template_reaction.lower_bound, + template_reaction.upper_bound, ) + gpr_str = build_gpr2(gpr_set) if gpr_set else "" + reaction.add_metabolites(metabolites) + if gpr_str and len(gpr_str) > 0: + reaction.gene_reaction_rule = gpr_str # get_gpr_string(gpr_ll) + + reaction.annotation["seed.reaction"] = template_reaction.reference_id + if sbo: + reaction.annotation[SBO_ANNOTATION] = sbo + return reaction + """ + + def build_complex_groups(self, complex_sets): + """ + Builds complex Group from complex sets computed from template and genome + Example: {'cpx00700': {'ftr01608': {'b3177'}}, 'cpx01370': {'ftr01607': {'b0142'}}} + @param complex_sets: + @return: + """ + group_complexes = {} + for complex_set in complex_sets: + for complex_id in complex_set: + if complex_id not in group_complexes: + cpx = self.template.complexes.get_by_id(complex_id) + g = Group(complex_id) + g.notes["complex_source"] = cpx.source + for role, (t, o) in cpx.roles.items(): + if role.id in complex_set[complex_id]: + g.notes[f"complex_subunit_note_{role.id}"] = role.name + g.notes[f"complex_subunit_optional_{role.id}"] = ( + 1 if o else 0 + ) + g.notes[f"complex_subunit_triggering_{role.id}"] = ( + 1 if t else 0 + ) + g.notes[f"complex_subunit_features_{role.id}"] = ";".join( + sorted(list(complex_set[complex_id][role.id])) + ) + group_complexes[g.id] = g + + return group_complexes + + def build_metabolic_reactions(self): + if self.base_model is None: + raise ModelSEEDError( + "unable to generate metabolic reactions without base model" + ) + if self.reaction_to_complex_sets is None: + raise ModelSEEDError( + "unable to generate metabolic reactions without generate complex sets" + ) + + if self.template_species_to_model_species is None: + self.template_species_to_model_species = {} + if self.compartments is None: + self.compartments = {} + + reactions = [] + for rxn_id, complex_set in self.reaction_to_complex_sets.items(): + template_reaction = self.template.reactions.get_by_id(rxn_id) + for m in template_reaction.metabolites: + if m.compartment not in self.compartments: + self.compartments[ + m.compartment + ] = self.template.compartments.get_by_id(m.compartment) + if m.id not in self.template_species_to_model_species: + model_metabolite = m.to_metabolite(self.index) + self.template_species_to_model_species[m.id] = model_metabolite + self.base_model.add_metabolites([model_metabolite]) + reaction = template_reaction.to_reaction(self.base_model, self.index) + gpr_str = build_gpr2(complex_set) if complex_set else "" + if gpr_str and len(gpr_str) > 0: + reaction.gene_reaction_rule = gpr_str + reaction.annotation[SBO_ANNOTATION] = "SBO:0000176" + reaction.notes["modelseed_complex"] = ";".join(sorted(list(complex_set))) + reactions.append(reaction) + return reactions def build_non_metabolite_reactions( - self, cobra_model, index="0", allow_all_non_grp_reactions=False + self, cobra_model, allow_all_non_grp_reactions=False ): - reactions_no_gpr = [] - reactions_in_model = set(map(lambda x: x.id, cobra_model.reactions)) - metabolites_in_model = set(map(lambda x: x.id, cobra_model.metabolites)) - for rxn in self.template.reactions: - if rxn.type == "universal" or rxn.type == "spontaneous": - reaction = self._build_reaction( - rxn.id, {}, self.template, index, "SBO:0000176" - ) - reaction_metabolite_ids = set( - map(lambda x: x.id, set(reaction.metabolites)) - ) + if self.base_model is None: + raise ModelSEEDError( + "unable to generate metabolic reactions without base model" + ) + if self.reaction_to_complex_sets is None: + raise ModelSEEDError( + "unable to generate metabolic reactions without generate complex sets" + ) + + if self.template_species_to_model_species is None: + self.template_species_to_model_species = {} + if self.compartments is None: + self.compartments = {} + + reactions = [] + for template_reaction in self.template.reactions: + if ( + template_reaction.type == "universal" + or template_reaction.type == "spontaneous" + ): + reaction_metabolite_ids = {m.id for m in template_reaction.metabolites} if ( - len(metabolites_in_model & reaction_metabolite_ids) > 0 + len( + set(self.template_species_to_model_species) + & reaction_metabolite_ids + ) + > 0 or allow_all_non_grp_reactions - ) and reaction.id not in reactions_in_model: - reaction.annotation["seed.reaction"] = rxn.id - reactions_no_gpr.append(reaction) + ): + for m in template_reaction.metabolites: + if m.compartment not in self.compartments: + self.compartments[ + m.compartment + ] = self.template.compartments.get_by_id(m.compartment) + if m.id not in self.template_species_to_model_species: + model_metabolite = m.to_metabolite(self.index) + self.template_species_to_model_species[ + m.id + ] = model_metabolite + self.base_model.add_metabolites([model_metabolite]) + + reaction = template_reaction.to_reaction( + self.base_model, self.index + ) + reaction.annotation[SBO_ANNOTATION] = "SBO:0000672" + # if template_reaction.type == "spontaneous": + # reaction.annotation[SBO_ANNOTATION] = "SBO:0000176" + + if reaction.id not in cobra_model.reactions: + reactions.append(reaction) + + return reactions - return reactions_no_gpr + def build_biomass(self, rxn_id, cobra_model, template, biomass_compounds): + bio_rxn = Reaction(rxn_id, "biomass", "", 0, 1000) + metabolites = {} + for template_cpd_id in biomass_compounds: + if template_cpd_id in self.template_species_to_model_species: + model_species_id = self.template_species_to_model_species[ + template_cpd_id + ].id + cpd = cobra_model.metabolites.get_by_id(model_species_id) + metabolites[cpd] = biomass_compounds[template_cpd_id] + else: + template_cpd = template.compcompounds.get_by_id(template_cpd_id) + m = template_cpd.to_metabolite(self.index) + metabolites[m] = biomass_compounds[template_cpd_id] + self.template_species_to_model_species[template_cpd_id] = m + cobra_model.add_metabolites([m]) + bio_rxn.add_metabolites(metabolites) + bio_rxn.annotation[SBO_ANNOTATION] = "SBO:0000629" + return bio_rxn def build( self, - model_id, + model_id_or_id, index="0", allow_all_non_grp_reactions=False, annotate_with_rast=True, ): + """ + + @param model_id_or_id: a string ID to build from cobra.core.Model otherwise a type of cobra.core.Model + as Base Model + @param index: + @param allow_all_non_grp_reactions: + @param annotate_with_rast: + @return: + """ if annotate_with_rast: rast = RastClient() @@ -605,14 +843,26 @@ def build( if self.template is None: self.auto_select_template() - cobra_model = MSModel(model_id, genome=self.genome, template=self.template) - cobra_model.add_reactions(self.build_metabolic_reactions(index=index)) - cobra_model.add_reactions( - self.build_non_metabolite_reactions( - cobra_model, index, allow_all_non_grp_reactions - ) + cobra_model = model_id_or_id + if type(model_id_or_id) == str: + from cobra.core import Model + + cobra_model = Model(model_id_or_id) + self.base_model = cobra_model + + self.generate_reaction_complex_sets() + complex_groups = self.build_complex_groups( + self.reaction_to_complex_sets.values() + ) + + metabolic_reactions = self.build_metabolic_reactions() + cobra_model.add_reactions(metabolic_reactions) + non_metabolic_reactions = self.build_non_metabolite_reactions( + cobra_model, allow_all_non_grp_reactions ) - self.build_exchanges(cobra_model) + cobra_model.add_reactions(non_metabolic_reactions) + cobra_model.add_groups(list(complex_groups.values())) + self.add_exchanges_to_model(cobra_model) if ( self.template.name.startswith("CoreModel") @@ -620,11 +870,24 @@ def build( or self.template.name.startswith("GramPos") ): cobra_model.add_reactions( - self.build_biomasses(cobra_model, self.template, index) + self.build_static_biomasses(cobra_model, self.template) ) cobra_model.objective = "bio1" - reactions_sinks = [] + reactions_sinks = self.build_drains() + cobra_model.add_reactions(reactions_sinks) + + for cmp_id, data in self.compartments.items(): + cmp_index_id = f"{cmp_id}{self.index}" + kbase_compartment_data_key = f"kbase_compartment_data_{cmp_index_id}" + kbase_compartment_data = { + "pH": data.ph, + "potential": 0, + "compartmentIndex": self.index, + } + cobra_model.notes[kbase_compartment_data_key] = kbase_compartment_data + + """ for cpd_id in ["cpd02701_c0", "cpd11416_c0", "cpd15302_c0"]: if cpd_id in cobra_model.metabolites: m = cobra_model.metabolites.get_by_id(cpd_id) @@ -634,7 +897,7 @@ def build( rxn_exchange.add_metabolites({m: -1}) rxn_exchange.annotation[SBO_ANNOTATION] = "SBO:0000627" reactions_sinks.append(rxn_exchange) - cobra_model.add_reactions(reactions_sinks) + """ return cobra_model @@ -650,13 +913,11 @@ def build_full_template_model(template, model_id=None, index="0"): model = MSModel(model_id if model_id else template.id, template=template) all_reactions = [] for rxn in template.reactions: - reaction = MSBuilder._build_reaction( - rxn.id, {}, template, index, "SBO:0000176" - ) + reaction = rxn.to_reaction(model, index) reaction.annotation["seed.reaction"] = rxn.id all_reactions.append(reaction) model.add_reactions(all_reactions) - model.add_reactions(MSBuilder.build_exchanges(model)) + MSBuilder.add_exchanges_to_model(model) if template.name.startswith("CoreModel"): bio_rxn1 = build_biomass("bio1", model, template, core_biomass, index) diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index b1bb1975..ef2f887a 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -295,6 +295,7 @@ def to_reaction(self, model=None, index="0"): rxn_id, name, self.subsystem, self.lower_bound, self.upper_bound ) reaction.add_metabolites(metabolites) + reaction.annotation["seed.reaction"] = self.reference_id return reaction @staticmethod @@ -655,6 +656,27 @@ def __init__( self.complexes = DictList() self.pathways = DictList() self.subsystems = DictList() + self.drains = None + + def add_drain(self, compound_id, lower_bound, upper_bound): + if compound_id not in self.compcompounds: + raise ValueError(f"{compound_id} not in template") + if lower_bound > upper_bound: + raise ValueError( + f"lower_bound: {lower_bound} must not be > than upper_bound: {upper_bound}" + ) + if self.drains is None: + self.drains = {} + self.drains[self.compcompounds.get_by_id(compound_id)] = ( + lower_bound, + upper_bound, + ) + + def add_sink(self, compound_id, default_upper_bound=1000): + self.add_drain(compound_id, 0, default_upper_bound) + + def add_demand(self, compound_id, default_lower_bound=-1000): + self.add_drain(compound_id, default_lower_bound, 0) def add_compartments(self, compartments: list): """ @@ -858,7 +880,7 @@ def get_data(self): } NewModelTemplate; """ - return { + d = { "__VERSION__": self.__VERSION__, "id": self.id, "name": self.name, @@ -876,6 +898,11 @@ def get_data(self): "subsystems": [], } + if self.drains is not None: + d["drain_list"] = {c.id: t for c, t in self.drains.items()} + + return d + def _repr_html_(self): """ taken from cobra.core.Model :) @@ -948,6 +975,7 @@ def __init__( self.reactions = [] self.info = info self.biochemistry_ref = None + self.drains = {} @staticmethod def from_dict(d, info=None, args=None): @@ -969,6 +997,7 @@ def from_dict(d, info=None, args=None): builder.reactions = d["reactions"] builder.biochemistry_ref = d["biochemistry_ref"] builder.biomasses = d["biomasses"] + return builder @staticmethod @@ -1077,4 +1106,7 @@ def build(self): map(lambda x: AttrDict(x), self.biomasses) ) # TODO: biomass object + for compound_id, (lb, ub) in self.drains.items(): + template.add_drain(compound_id, lb, ub) + return template diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..0c5f87f7 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,27 @@ +[build-system] +requires = [ + 'setuptools>=40.6.0', + 'wheel' +] +build-backend = "setuptools.build_meta" + +[tool.black] +line-length = 88 +python-version = ['py36'] +include = '\.pyi?$' +exclude = ''' +( + /( + \.eggs # exclude a few common directories in the + | \.git # root of the project + | \.hg + | \.mypy_cache + | \.tox + | \.venv + | _build + | buck-out + | build + | dist + )/ +) +''' \ No newline at end of file diff --git a/setup.py b/setup.py index 775d60a4..08eeba1c 100644 --- a/setup.py +++ b/setup.py @@ -10,8 +10,9 @@ setup( name="ModelSEEDpy", - version="0.2.2", + version="0.3.1", description="Python package for building and analyzing models using ModelSEED", + long_description_content_type="text/x-rst", long_description=readme, author="Christopher Henry", author_email="chenry@anl.gov", @@ -21,6 +22,16 @@ package_data={ "modelseedpy": ["config.cfg"], }, + classifiers=[ + "Development Status :: 3 - Alpha", + "Topic :: Scientific/Engineering :: Bio-Informatics", + "Intended Audience :: Science/Research", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Natural Language :: English", + ], install_requires=[ "networkx >= 2.4", "cobra >= 0.17.1", From e3bcbf8cbb85093feb70d5d9c260753b22bf5df4 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Wed, 7 Dec 2022 11:59:12 -0600 Subject: [PATCH 048/298] CRLF --- pyproject.toml | 52 +++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 0c5f87f7..41fd528b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,27 +1,27 @@ -[build-system] -requires = [ - 'setuptools>=40.6.0', - 'wheel' -] -build-backend = "setuptools.build_meta" - -[tool.black] -line-length = 88 -python-version = ['py36'] -include = '\.pyi?$' -exclude = ''' -( - /( - \.eggs # exclude a few common directories in the - | \.git # root of the project - | \.hg - | \.mypy_cache - | \.tox - | \.venv - | _build - | buck-out - | build - | dist - )/ -) +[build-system] +requires = [ + 'setuptools>=40.6.0', + 'wheel' +] +build-backend = "setuptools.build_meta" + +[tool.black] +line-length = 88 +python-version = ['py36'] +include = '\.pyi?$' +exclude = ''' +( + /( + \.eggs # exclude a few common directories in the + | \.git # root of the project + | \.hg + | \.mypy_cache + | \.tox + | \.venv + | _build + | buck-out + | build + | dist + )/ +) ''' \ No newline at end of file From 79ffd58ea823e7877849624504d3713551f44e03 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Wed, 7 Dec 2022 12:01:36 -0600 Subject: [PATCH 049/298] trim --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 41fd528b..0741eca0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ exclude = ''' ( /( \.eggs # exclude a few common directories in the - | \.git # root of the project + | \.git # root of the project | \.hg | \.mypy_cache | \.tox From 8f4a5dbf75a31cb99c0cb356d89e9cdaa8b13cac Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Wed, 7 Dec 2022 12:14:19 -0600 Subject: [PATCH 050/298] end line --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 0741eca0..0ed58542 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,4 +24,4 @@ exclude = ''' | dist )/ ) -''' \ No newline at end of file +''' From 7bab220174e2c57d6737d8d41ee2a0322f54aa45 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Thu, 8 Dec 2022 01:03:43 -0600 Subject: [PATCH 051/298] drain list --- modelseedpy/core/msbuilder.py | 37 ++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 3c855ca0..eddb44dd 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -16,6 +16,14 @@ SBO_ANNOTATION = "sbo" +DEFAULT_SINKS = { + "cpd02701_c": 1000, # S-Adenosyl-4-methylthio-2-oxobutanoate + "cpd11416_c": 1000, # Biomass + "cpd15302_c": 1000, # glycogen(n-1) + "cpd03091_c": 1000, # 5'-Deoxyadenosine + "cpd01042_c": 1000, # p-Cresol +} + logger = logging.getLogger(__name__) ### temp stuff ### @@ -328,9 +336,6 @@ def build_gpr(cpx_gene_role): class MSBuilder: - - DEFAULT_SINKS = {"cpd02701_c": 1000, "cpd11416_c": 1000, "cpd15302_c": 1000} - def __init__( self, genome, template=None, name=None, ontology_term="RAST", index="0" ): @@ -384,7 +389,7 @@ def build_sinks(self): # template without drain specification we build only default sinks in_model = { k: v - for k, v in MSBuilder.DEFAULT_SINKS.items() + for k, v in DEFAULT_SINKS.items() if k in self.template_species_to_model_species } return [self.build_sink_reaction(x, v) for x, v in in_model.items()] @@ -411,6 +416,7 @@ def build_drain_reaction( subsystem="exchanges", lower_bound=0, upper_bound=1000, + sbo_term="SBO:0000627", ): """ SK_ for sink (SBO_0000632) DM_ for demand (SBO_0000628) EX_ for exchange (SBO_0000627) @@ -420,6 +426,7 @@ def build_drain_reaction( @param subsystem: @param lower_bound: @param upper_bound: + @param sbo_term: @return: """ @@ -436,21 +443,33 @@ def build_drain_reaction( upper_bound, ) drain.add_metabolites({m: -1}) - drain.annotation[SBO_ANNOTATION] = "SBO:0000627" + drain.annotation[SBO_ANNOTATION] = sbo_term return drain def build_sink_reaction(self, template_cpd_id, upper_bound): if upper_bound <= 0: raise ModelSEEDError("Sink reactions must have upper bound > 0") return self.build_drain_reaction( - template_cpd_id, "SK_", "Sink for ", "exchanges", 0, upper_bound + template_cpd_id, + "SK_", + "Sink for ", + "exchanges", + 0, + upper_bound, + "SBO:0000632", ) def build_demand_reaction(self, template_cpd_id, lower_bound): if lower_bound >= 0: raise ModelSEEDError("Demand reactions must have lower bound < 0") return self.build_drain_reaction( - template_cpd_id, "DM_", "Demand for ", "exchanges", lower_bound, 0 + template_cpd_id, + "DM_", + "Demand for ", + "exchanges", + lower_bound, + 0, + "SBO:0000628", ) def _get_template_reaction_complexes(self, template_reaction): @@ -877,8 +896,10 @@ def build( reactions_sinks = self.build_drains() cobra_model.add_reactions(reactions_sinks) + compartment_data = {} for cmp_id, data in self.compartments.items(): cmp_index_id = f"{cmp_id}{self.index}" + compartment_data[cmp_index_id] = data.name kbase_compartment_data_key = f"kbase_compartment_data_{cmp_index_id}" kbase_compartment_data = { "pH": data.ph, @@ -887,6 +908,8 @@ def build( } cobra_model.notes[kbase_compartment_data_key] = kbase_compartment_data + cobra_model.compartments = compartment_data + """ for cpd_id in ["cpd02701_c0", "cpd11416_c0", "cpd15302_c0"]: if cpd_id in cobra_model.metabolites: From c8eca4165a8c5d05d66aacbe19984fd56c543f9f Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 8 Dec 2022 10:18:34 -0600 Subject: [PATCH 052/298] Checking in changes from black --- docs/conf.py | 136 +-- docs/source/conf.py | 12 +- modelseedpy/__init__.py | 66 +- modelseedpy/biochem/hierarchical_ontology.py | 183 +-- modelseedpy/biochem/modelseed_biochem.py | 544 ++++++--- modelseedpy/biochem/modelseed_builder.py | 64 +- modelseedpy/biochem/modelseed_compound.py | 72 +- modelseedpy/biochem/modelseed_reaction.py | 100 +- modelseedpy/biochem/modelseed_to_cobra.py | 78 +- modelseedpy/biochem/seed_object.py | 5 +- modelseedpy/biochem/stoich_integration.py | 267 +++-- modelseedpy/biochem/transporters.py | 111 +- modelseedpy/biochem/utils.py | 17 +- modelseedpy/community/__init__.py | 1 + modelseedpy/community/commkineticpkg.py | 39 +- modelseedpy/community/dfbapkg.py | 662 +++++++---- modelseedpy/community/mscommunity.py | 638 ++++++---- modelseedpy/community/mscompatibility.py | 531 +++++---- modelseedpy/core/__init__.py | 2 +- modelseedpy/core/biolog.py | 16 +- modelseedpy/core/exceptions.py | 12 +- modelseedpy/core/fbahelper.py | 225 ++-- modelseedpy/core/gapfillinghelper.py | 1114 +++++++++++++----- modelseedpy/core/msatpcorrection.py | 259 ++-- modelseedpy/core/msbuilder.py | 737 +++++++----- modelseedpy/core/mseditorapi.py | 204 ++-- modelseedpy/core/msgapfill.py | 250 ++-- modelseedpy/core/msgenome.py | 30 +- modelseedpy/core/msgenomeclassifier.py | 22 +- modelseedpy/core/msgrowthphenotypes.py | 207 ++-- modelseedpy/core/msmedia.py | 17 +- modelseedpy/core/msmodel.py | 69 +- modelseedpy/core/msmodelutl.py | 571 +++++---- modelseedpy/core/mstemplate.py | 611 ++++++---- modelseedpy/core/rast_client.py | 72 +- modelseedpy/core/rpcclient.py | 74 +- modelseedpy/core/template.py | 46 +- modelseedpy/fbapkg/__init__.py | 2 +- modelseedpy/fbapkg/basefbapkg.py | 88 +- modelseedpy/fbapkg/bilevelpkg.py | 214 ++-- modelseedpy/fbapkg/changeoptpkg.py | 55 +- modelseedpy/fbapkg/drainfluxpkg.py | 97 +- modelseedpy/fbapkg/elementuptakepkg.py | 38 +- modelseedpy/fbapkg/flexiblebiomasspkg.py | 294 +++-- modelseedpy/fbapkg/fluxfittingpkg.py | 71 +- modelseedpy/fbapkg/fullthermopkg.py | 232 ++-- modelseedpy/fbapkg/gapfillingpkg.py | 809 +++++++++---- modelseedpy/fbapkg/kbasemediapkg.py | 65 +- modelseedpy/fbapkg/metabofbapkg.py | 69 +- modelseedpy/fbapkg/mspackagemanager.py | 32 +- modelseedpy/fbapkg/objconstpkg.py | 24 +- modelseedpy/fbapkg/problemreplicationpkg.py | 37 +- modelseedpy/fbapkg/proteomefittingpkg.py | 194 +-- modelseedpy/fbapkg/reactionusepkg.py | 129 +- modelseedpy/fbapkg/revbinpkg.py | 48 +- modelseedpy/fbapkg/simplethermopkg.py | 132 ++- modelseedpy/fbapkg/totalfluxpkg.py | 33 +- modelseedpy/helpers.py | 31 +- modelseedpy/ml/build_classifier.py | 106 +- modelseedpy/ml/predict_phenotype.py | 28 +- modelseedpy/multiomics/msexpression.py | 126 +- setup.py | 30 +- tests/__init__.py | 1 - tests/biochem/test_modelseed_biochem.py | 3 +- tests/community/test_DynamicFBA.py | 32 +- tests/community/test_dfbapy.py | 10 +- tests/community/test_mscommunity.py | 3 +- tests/context.py | 3 +- tests/core/test_fbahelper.py | 60 +- tests/core/test_msatpcorreption.py | 229 ++-- tests/core/test_msbuilder.py | 40 +- tests/core/test_mseditorapi.py | 62 +- tests/core/test_msgapfill.py | 91 +- tests/core/test_msgenome.py | 31 +- tests/core/test_rast_client.py | 2 +- tests/fbapkg/test_revbin_core_model.py | 16 +- tests/mseditorapi_testing.py | 70 +- tests/test_advanced.py | 6 +- tests/test_basic.py | 6 +- tests/test_data/mock_data.py | 620 +++++----- 80 files changed, 7782 insertions(+), 4551 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index ac03bd09..10d28103 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -16,209 +16,203 @@ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) +# sys.path.insert(0, os.path.abspath('.')) # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' +# needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix of source filenames. -source_suffix = '.rst' +source_suffix = ".rst" # The encoding of source files. -#source_encoding = 'utf-8-sig' +# source_encoding = 'utf-8-sig' # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. -project = u'sample' -copyright = u'2012, Kenneth Reitz' +project = "sample" +copyright = "2012, Kenneth Reitz" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. -version = 'v0.0.1' +version = "v0.0.1" # The full version, including alpha/beta/rc tags. -release = 'v0.0.1' +release = "v0.0.1" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. -#language = None +# language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: -#today = '' +# today = '' # Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' +# today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. -exclude_patterns = ['_build'] +exclude_patterns = ["_build"] # The reST default role (used for this markup: `text`) to use for all documents. -#default_role = None +# default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True +# add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). -#add_module_names = True +# add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. -#show_authors = False +# show_authors = False # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] +# modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'default' +html_theme = "default" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -#html_theme_options = {} +# html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] +# html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". -#html_title = None +# html_title = None # A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None +# html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. -#html_logo = None +# html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. -#html_favicon = None +# html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' +# html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. -#html_use_smartypants = True +# html_use_smartypants = True # Custom sidebar templates, maps document names to template names. -#html_sidebars = {} +# html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. -#html_additional_pages = {} +# html_additional_pages = {} # If false, no module index is generated. -#html_domain_indices = True +# html_domain_indices = True # If false, no index is generated. -#html_use_index = True +# html_use_index = True # If true, the index is split into individual pages for each letter. -#html_split_index = False +# html_split_index = False # If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True +# html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True +# html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True +# html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. -#html_use_opensearch = '' +# html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None +# html_file_suffix = None # Output file base name for HTML help builder. -htmlhelp_basename = 'sampledoc' +htmlhelp_basename = "sampledoc" # -- Options for LaTeX output -------------------------------------------------- latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', + # The paper size ('letterpaper' or 'a4paper'). + #'papersize': 'letterpaper', + # The font size ('10pt', '11pt' or '12pt'). + #'pointsize': '10pt', + # Additional stuff for the LaTeX preamble. + #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ - ('index', 'sample.tex', u'sample Documentation', - u'Kenneth Reitz', 'manual'), + ("index", "sample.tex", "sample Documentation", "Kenneth Reitz", "manual"), ] # The name of an image file (relative to this directory) to place at the top of # the title page. -#latex_logo = None +# latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. -#latex_use_parts = False +# latex_use_parts = False # If true, show page references after internal links. -#latex_show_pagerefs = False +# latex_show_pagerefs = False # If true, show URL addresses after external links. -#latex_show_urls = False +# latex_show_urls = False # Documents to append as an appendix to all manuals. -#latex_appendices = [] +# latex_appendices = [] # If false, no module index is generated. -#latex_domain_indices = True +# latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). -man_pages = [ - ('index', 'sample', u'sample Documentation', - [u'Kenneth Reitz'], 1) -] +man_pages = [("index", "sample", "sample Documentation", ["Kenneth Reitz"], 1)] # If true, show URL addresses after external links. -#man_show_urls = False +# man_show_urls = False # -- Options for Texinfo output ------------------------------------------------ @@ -227,16 +221,22 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - ('index', 'sample', u'sample Documentation', - u'Kenneth Reitz', 'sample', 'One line description of project.', - 'Miscellaneous'), + ( + "index", + "sample", + "sample Documentation", + "Kenneth Reitz", + "sample", + "One line description of project.", + "Miscellaneous", + ), ] # Documents to append as an appendix to all manuals. -#texinfo_appendices = [] +# texinfo_appendices = [] # If false, no module index is generated. -#texinfo_domain_indices = True +# texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' +# texinfo_show_urls = 'footnote' diff --git a/docs/source/conf.py b/docs/source/conf.py index ebba0225..114cd280 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -1,7 +1,7 @@ -project = 'ModelSEEDpy' -copyright = '2022, DOE KBase' -author = 'Filipe Liu, Andrew P. Freiburger, Chris Henry' +project = "ModelSEEDpy" +copyright = "2022, DOE KBase" +author = "Filipe Liu, Andrew P. Freiburger, Chris Henry" -master_doc = 'index' -release = '1' -version = '0.0.1' \ No newline at end of file +master_doc = "index" +release = "1" +version = "0.0.1" diff --git a/modelseedpy/__init__.py b/modelseedpy/__init__.py index 78b0e892..7f135055 100755 --- a/modelseedpy/__init__.py +++ b/modelseedpy/__init__.py @@ -12,46 +12,72 @@ from modelseedpy.helpers import config logging_hash = { - "debug":logging.DEBUG, - "critical":logging.CRITICAL, - "error":logging.ERROR, - "warning":logging.WARNING, - "info":logging.INFO + "debug": logging.DEBUG, + "critical": logging.CRITICAL, + "error": logging.ERROR, + "warning": logging.WARNING, + "info": logging.INFO, } -#Configuing modelseedpy logger +# Configuing modelseedpy logger logger = logging.getLogger(__name__) c_handler = logging.StreamHandler() -c_handler.setLevel(logging_hash[config.get("logging","console_level")]) -c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s') +c_handler.setLevel(logging_hash[config.get("logging", "console_level")]) +c_format = logging.Formatter("%(name)s - %(levelname)s - %(message)s") c_handler.setFormatter(c_format) logger.addHandler(c_handler) -if config.get("logging","log_file") == "yes": - f_handler = logging.FileHandler(config.get("logging","filename"), mode="a") - f_handler.setLevel(logging_hash[config.get("logging","file_level")]) - f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +if config.get("logging", "log_file") == "yes": + f_handler = logging.FileHandler(config.get("logging", "filename"), mode="a") + f_handler.setLevel(logging_hash[config.get("logging", "file_level")]) + f_format = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") f_handler.setFormatter(f_format) logger.addHandler(f_handler) if sys.version_info[0] == 2: - logger.warning("Python 2 is reaching end of life (see " + logger.warning( + "Python 2 is reaching end of life (see " "https://www.python.org/dev/peps/pep-0373/) and many cobra " "dependencies have already dropped support. At the moment it *should* " - "still work but we will no longer actively maintain Python 2 support.") + "still work but we will no longer actively maintain Python 2 support." + ) import modelseedpy from modelseedpy.core import ( - RastClient, MSGenome, MSBuilder, MSMedia, MSGrowthPhenotypes,MSModelUtil, - FBAHelper, MSEditorAPI, MSATPCorrection, MSGapfill, MSEquation + RastClient, + MSGenome, + MSBuilder, + MSMedia, + MSGrowthPhenotypes, + MSModelUtil, + FBAHelper, + MSEditorAPI, + MSATPCorrection, + MSGapfill, + MSEquation, ) from modelseedpy.core.exceptions import * -from modelseedpy.community import (MSCommunity, MSCompatibility, CommKineticPkg) +from modelseedpy.community import MSCommunity, MSCompatibility, CommKineticPkg from modelseedpy.fbapkg import ( - BaseFBAPkg, RevBinPkg, ReactionUsePkg, SimpleThermoPkg, TotalFluxPkg, BilevelPkg, - KBaseMediaPkg, FluxFittingPkg, ProteomeFittingPkg, GapfillingPkg, MetaboFBAPkg, FlexibleBiomassPkg, - ProblemReplicationPkg, FullThermoPkg, MSPackageManager, ObjConstPkg, ChangeOptPkg, ElementUptakePkg + BaseFBAPkg, + RevBinPkg, + ReactionUsePkg, + SimpleThermoPkg, + TotalFluxPkg, + BilevelPkg, + KBaseMediaPkg, + FluxFittingPkg, + ProteomeFittingPkg, + GapfillingPkg, + MetaboFBAPkg, + FlexibleBiomassPkg, + ProblemReplicationPkg, + FullThermoPkg, + MSPackageManager, + ObjConstPkg, + ChangeOptPkg, + ElementUptakePkg, ) from modelseedpy.multiomics import MSExpression diff --git a/modelseedpy/biochem/hierarchical_ontology.py b/modelseedpy/biochem/hierarchical_ontology.py index 9794638c..8cd7c861 100644 --- a/modelseedpy/biochem/hierarchical_ontology.py +++ b/modelseedpy/biochem/hierarchical_ontology.py @@ -6,51 +6,57 @@ def build_graph_from_dict(dict_data, modelseed_local): g = nx.DiGraph() - + for k in dict_data: cpd1 = modelseed_local.get_seed_compound(k) for v in dict_data[k]: cpd2 = modelseed_local.get_seed_compound(v) g.add_edge(k, v) - #g.add_edge(k + " " + cpd1.name, v + " " + cpd2.name) + # g.add_edge(k + " " + cpd1.name, v + " " + cpd2.name) return g + class HierarchicalOntology: - def __init__(self, g, hlib, ontology=None, universal_cpds=None): self.g_compounds = set() - if g==None: - #old stuff using alias instead of modelseed DO NOT USE THIS always provide graph G + if g == None: + # old stuff using alias instead of modelseed DO NOT USE THIS always provide graph G self.ontology = ontology self.g = HierarchicalOntology.build_ograph(ontology) - self.g_bridge, self.bridges = HierarchicalOntology.generate_bridge_edges(self.g) - self.t_map = HierarchicalOntology.build_translate_map(self.g_bridge, universal_cpds, 'seed.compound') + self.g_bridge, self.bridges = HierarchicalOntology.generate_bridge_edges( + self.g + ) + self.t_map = HierarchicalOntology.build_translate_map( + self.g_bridge, universal_cpds, "seed.compound" + ) else: self.g = g - self.g_bridge, self.bridges = HierarchicalOntology.generate_bridge_edges(self.g) + self.g_bridge, self.bridges = HierarchicalOntology.generate_bridge_edges( + self.g + ) self.t_map = {} for e in self.g_bridge.edges: if not e[0] in self.t_map: self.t_map[e[0]] = set() self.t_map[e[0]].add(e[1]) - + for e in self.g: self.g_compounds.add(e[0]) self.g_compounds.add(e[1]) self.hlib = hlib self.child_to_parent = HierarchicalOntology.reverse_child_to_parent(self.t_map) self.rxn_g = None - - def from_csv(f, sep='\t'): + + def from_csv(f, sep="\t"): df = pd.read_csv(f, sep) pairs = set() for row_id, d in df.iterrows(): - node_from = d['from'] - node_to = d['to'] + node_from = d["from"] + node_to = d["to"] pairs.add((node_from, node_to)) g = HierarchicalOntology.build_ograph(pairs) return HierarchicalOntology(g=g) - + @property def compounds(self): res = set() @@ -58,21 +64,21 @@ def compounds(self): res.add(e[0]) res.add(e[1]) return res - + @staticmethod def build_translate_map(g, universal_cpds, database): t_map = {} alias_to_id = {} for row_id, d in universal_cpds.iterrows(): - alias = d['u_alias'] + alias = d["u_alias"] cpd_ids = d[database] if not pd.isna(cpd_ids): - alias_to_id[alias] = set(cpd_ids.split('#')) + alias_to_id[alias] = set(cpd_ids.split("#")) for src, dst in g.edges: - #src = p[0] - #dst = p[1] + # src = p[0] + # dst = p[1] if src in alias_to_id and dst in alias_to_id: for from_id in alias_to_id[src]: for target_id in alias_to_id[dst]: @@ -81,7 +87,7 @@ def build_translate_map(g, universal_cpds, database): t_map[from_id].add(target_id) return t_map - + @staticmethod def reverse_child_to_parent(t_map): result = {} @@ -99,62 +105,64 @@ def build_ograph(data): for p in data: g.add_edge(p[0], p[1]) return g - + @staticmethod def generate_bridge_edges(g): bridge = {} g_bridge = g.copy() for n in g.nodes: - #print(n) + # print(n) t = nx.algorithms.dfs_tree(g, n) for k in t.nodes: if not k == n and not g_bridge.has_edge(n, k): bridge[(n, k)] = True g_bridge.add_edge(n, k) - nx.set_edge_attributes(g_bridge, name='bridge', values=bridge) + nx.set_edge_attributes(g_bridge, name="bridge", values=bridge) return g_bridge, bridge - + def get_dot_graph(self): dot = HierarchicalOntology.translate_dot(self.g_bridge, self.bridges) return dot - - def generate_reaction_ontology(self, cstoichiometry, test_single_swaps = True): - result = {} - single_rep = [] - replacements = [] - for p in cstoichiometry: - replace_set = [] - cpd_id = p[0] - if cpd_id in self.child_to_parent: - for other_id in self.child_to_parent[cpd_id]: - #print(cpd_id, other_id) - replace_set.append((cpd_id, other_id)) - single_rep.append((cpd_id, other_id)) - if len(replace_set) > 0: - replacements.append(replace_set) - - if len(replacements) > 0: - replacements = list(itertools.product(*replacements)) - if test_single_swaps: - for swap in single_rep: - replacements.append([swap]) - - for swaps in replacements: - #print('***', swaps) - smap = {x:y for x, y in swaps} - #print('smap', smap) - stoich_swap = copy.deepcopy(cstoichiometry) - stoich_swap = { - (x if not x in smap else smap[x], c):y - for (x, c), y in stoich_swap.items() - } - - match = self.hlib.match(stoich_swap) - for match_id in match: - result[match_id] = smap - return result - - def generate_reaction_ontology_old(self, rxn, hash_f, all_hashes, test_single_swaps = True): + + def generate_reaction_ontology(self, cstoichiometry, test_single_swaps=True): + result = {} + single_rep = [] + replacements = [] + for p in cstoichiometry: + replace_set = [] + cpd_id = p[0] + if cpd_id in self.child_to_parent: + for other_id in self.child_to_parent[cpd_id]: + # print(cpd_id, other_id) + replace_set.append((cpd_id, other_id)) + single_rep.append((cpd_id, other_id)) + if len(replace_set) > 0: + replacements.append(replace_set) + + if len(replacements) > 0: + replacements = list(itertools.product(*replacements)) + if test_single_swaps: + for swap in single_rep: + replacements.append([swap]) + + for swaps in replacements: + # print('***', swaps) + smap = {x: y for x, y in swaps} + # print('smap', smap) + stoich_swap = copy.deepcopy(cstoichiometry) + stoich_swap = { + (x if not x in smap else smap[x], c): y + for (x, c), y in stoich_swap.items() + } + + match = self.hlib.match(stoich_swap) + for match_id in match: + result[match_id] = smap + return result + + def generate_reaction_ontology_old( + self, rxn, hash_f, all_hashes, test_single_swaps=True + ): result = {} stoich = rxn.cstoichiometry single_rep = [] @@ -164,7 +172,7 @@ def generate_reaction_ontology_old(self, rxn, hash_f, all_hashes, test_single_sw cpd_id = p[0] if cpd_id in self.child_to_parent: for other_id in self.child_to_parent[cpd_id]: - #print(cpd_id, other_id) + # print(cpd_id, other_id) replace_set.append((cpd_id, other_id)) single_rep.append((cpd_id, other_id)) if len(replace_set) > 0: @@ -177,61 +185,60 @@ def generate_reaction_ontology_old(self, rxn, hash_f, all_hashes, test_single_sw replacements.append([swap]) for swaps in replacements: - #print('***', swaps) - smap = {x:y for x, y in swaps} - #print('smap', smap) + # print('***', swaps) + smap = {x: y for x, y in swaps} + # print('smap', smap) stoich_swap = copy.deepcopy(stoich) stoich_swap = { - (x if not x in smap else smap[x], c):y + (x if not x in smap else smap[x], c): y for (x, c), y in stoich_swap.items() } - #hash + # hash hashes = hash_f(stoich_swap) - #detect + # detect for h in hashes: h_val = hashes[h] - #print(h, h_val) + # print(h, h_val) for h_ in all_hashes: if h_val in all_hashes[h_]: for other_id in all_hashes[h_][h_val]: if not other_id in result: result[other_id] = smap return result - + def generate_reaction_ontology_from_modelseed(self, ms): matches = {} for seed_id in ms.reactions: rxn = ms.get_seed_reaction(seed_id) match = self.generate_reaction_ontology(rxn.cstoichiometry) - #match = decorate_match(match, modelseed_local) + # match = decorate_match(match, modelseed_local) if len(match) > 0: - #seed_id = decorate_id(seed_id, modelseed_local) + # seed_id = decorate_id(seed_id, modelseed_local) matches[seed_id] = match - + self.rxn_g = nx.DiGraph() for rxn_id in matches: for parent_id in matches[rxn_id]: a = parent_id b = rxn_id - if '@' in a: - a = a.split('@')[0] - if '@' in b: - b = b.split('@')[0] + if "@" in a: + a = a.split("@")[0] + if "@" in b: + b = b.split("@")[0] rxn1 = ms.get_seed_reaction(a) rxn2 = ms.get_seed_reaction(b) if not rxn1.is_obsolete and not rxn2.is_obsolete: self.rxn_g.add_edge(a, b) - + return self.rxn_g - - + @staticmethod - def translate_dot(g, bridges = []): + def translate_dot(g, bridges=[]): dot = nx.nx_pydot.to_pydot(g) for n in dot.get_nodes(): - #print(n.get_name()) - #n.set_label(f'yay!\n{n}') - n.set_label(f'{n}') + # print(n.get_name()) + # n.set_label(f'yay!\n{n}') + n.set_label(f"{n}") n.set_color("blue") n.set_style("filled") n.set_fillcolor("white") @@ -244,6 +251,6 @@ def translate_dot(g, bridges = []): if dst[0] == '"' and dst[-1] == '"': dst = dst[1:-1] if (src, dst) in bridges: - #e.set_label('!') - e.set_style('dashed') - return dot \ No newline at end of file + # e.set_label('!') + e.set_style("dashed") + return dot diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index e7ce9ac9..3af80cf4 100755 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -8,24 +8,50 @@ logger = logging.getLogger(__name__) ALIAS_CPD_IDENTIFIERS_ORG = { - 'BiGG': 'bigg.metabolite', - 'KEGG': 'kegg.compound', - 'MetaCyc': 'metacyc.compound', - 'metanetx.chemical': 'metanetx.chemical' + "BiGG": "bigg.metabolite", + "KEGG": "kegg.compound", + "MetaCyc": "metacyc.compound", + "metanetx.chemical": "metanetx.chemical", } ALIAS_RXN_IDENTIFIERS_ORG = { - 'KEGG': 'kegg.reaction', - 'MetaCyc': 'metacyc.reaction', - 'metanetx.reaction': 'metanetx.reaction', - 'BiGG': 'bigg.reaction', - 'rhea': 'rhea' + "KEGG": "kegg.reaction", + "MetaCyc": "metacyc.reaction", + "metanetx.reaction": "metanetx.reaction", + "BiGG": "bigg.reaction", + "rhea": "rhea", } ALIAS_MODELS = { - 'iAF1260', 'iAF692', 'iAG612', 'iAO358', 'iAbaylyiv4', 'iGT196', 'iIN800', - 'iIT341', 'iJN746', 'iJR904', 'iMA945', 'iMEO21', 'iMM904', 'iMO1053-PAO1', - 'iMO1056', 'iND750', 'iNJ661', 'iPS189', 'iRR1083', 'iRS1563', 'iRS1597', - 'iSB619', 'iSO783', 'iYO844', 'Maize_C4GEM', 'AlgaGEM', 'AraGEM', - 'JP_Creinhardtii_MSB', 'JP_Creinhardtii_NMeth', 'JM_Creinhardtii', 'TS_Athaliana' + "iAF1260", + "iAF692", + "iAG612", + "iAO358", + "iAbaylyiv4", + "iGT196", + "iIN800", + "iIT341", + "iJN746", + "iJR904", + "iMA945", + "iMEO21", + "iMM904", + "iMO1053-PAO1", + "iMO1056", + "iND750", + "iNJ661", + "iPS189", + "iRR1083", + "iRS1563", + "iRS1597", + "iSB619", + "iSO783", + "iYO844", + "Maize_C4GEM", + "AlgaGEM", + "AraGEM", + "JP_Creinhardtii_MSB", + "JP_Creinhardtii_NMeth", + "JM_Creinhardtii", + "TS_Athaliana", } @@ -42,10 +68,10 @@ def get_low(ids): def make_alias_dict(compound_aliases): compound_alias = {} for row_id, d in compound_aliases.iterrows(): - alias = d['External ID'] - seed_id = d['ModelSEED ID'] + alias = d["External ID"] + seed_id = d["ModelSEED ID"] if alias not in compound_alias: - compound_alias[alias] = {'seed_id': seed_id} + compound_alias[alias] = {"seed_id": seed_id} return compound_alias @@ -63,7 +89,9 @@ def process_aliases(aliases, alias_mapper, model_ids): return annotation, genome_scale_models, others -def load_metabolites_from_df(df: pd.DataFrame, names: dict, aliases: dict, structures: dict): +def load_metabolites_from_df( + df: pd.DataFrame, names: dict, aliases: dict, structures: dict +): compounds = [] for t in df.itertuples(): try: @@ -71,7 +99,7 @@ def load_metabolites_from_df(df: pd.DataFrame, names: dict, aliases: dict, struc abbr = t[2] name = t[3] formula = t[4] - mass = None if t[5] == 'None' or pd.isna(t[5]) else float(t[5]) + mass = None if t[5] == "None" or pd.isna(t[5]) else float(t[5]) source = None if pd.isna(t[6]) else t[6] inchi_key = t[7] charge = t[8] @@ -93,45 +121,69 @@ def load_metabolites_from_df(df: pd.DataFrame, names: dict, aliases: dict, struc flags = t[21] inchi = None if flags and not pd.isna(flags): - flags = flags.split('|') + flags = flags.split("|") elif pd.isna(flags): flags = set() aliases_annotation = {} aliases_models = {} aliases_others = {} if cpd_id in aliases: - aliases_annotation, aliases_models, aliases_others = process_aliases(aliases[cpd_id], - ALIAS_CPD_IDENTIFIERS_ORG, - ALIAS_MODELS) + aliases_annotation, aliases_models, aliases_others = process_aliases( + aliases[cpd_id], ALIAS_CPD_IDENTIFIERS_ORG, ALIAS_MODELS + ) if cpd_id in structures: - if 'SMILE' in structures[cpd_id]: - smiles = structures[cpd_id]['SMILE'] - if 'InChI' in structures[cpd_id]: - inchi = structures[cpd_id]['InChI'] - if 'InChIKey' in structures[cpd_id]: - inchi_key = structures[cpd_id]['InChIKey'] + if "SMILE" in structures[cpd_id]: + smiles = structures[cpd_id]["SMILE"] + if "InChI" in structures[cpd_id]: + inchi = structures[cpd_id]["InChI"] + if "InChIKey" in structures[cpd_id]: + inchi_key = structures[cpd_id]["InChIKey"] inchi_key = None if pd.isna(inchi_key) or len(inchi_key) == 0 else inchi_key other_names = set() if cpd_id in names: other_names = set(names[cpd_id]) - cpd = ModelSEEDCompound2(cpd_id, formula, name, charge, 'z', - abbr, other_names, - mass, delta_g, delta_g_err, - smiles, inchi_key, inchi, - is_core, is_obsolete, is_cofactor, is_abstract, - pka, pkb, source, flags) + cpd = ModelSEEDCompound2( + cpd_id, + formula, + name, + charge, + "z", + abbr, + other_names, + mass, + delta_g, + delta_g_err, + smiles, + inchi_key, + inchi, + is_core, + is_obsolete, + is_cofactor, + is_abstract, + pka, + pkb, + source, + flags, + ) cpd.annotation.update(aliases_annotation) - cpd.notes['models'] = aliases_models - cpd.notes['other_aliases'] = aliases_others + cpd.notes["models"] = aliases_models + cpd.notes["other_aliases"] = aliases_others compounds.append(cpd) except Exception as e: - logger.error('failed to read compound at Index: %s. %s', t[0], e) + logger.error("failed to read compound at Index: %s. %s", t[0], e) return compounds -def load_reactions_from_df(df: pd.DataFrame, database_metabolites: dict, names: dict, aliases: dict, reaction_ecs: dict): +def load_reactions_from_df( + df: pd.DataFrame, + database_metabolites: dict, + names: dict, + aliases: dict, + reaction_ecs: dict, +): from modelseedpy.core.msmodel import get_reaction_constraints_from_direction from modelseedpy.biochem.modelseed_reaction import get_cstoichiometry + reactions = [] metabolites_indexed = {} for t in df.itertuples(): @@ -150,7 +202,9 @@ def load_reactions_from_df(df: pd.DataFrame, database_metabolites: dict, names: linked_reactions = t[20] flags = t[21] source = t[22] - lower_bound, upper_bound = get_reaction_constraints_from_direction(reversibility) + lower_bound, upper_bound = get_reaction_constraints_from_direction( + reversibility + ) stoichiometry = None if pd.isna(stoichiometry) else stoichiometry is_abstract = False if pd.isna(is_abstract) else True is_abstract = True if is_abstract else False @@ -159,49 +213,64 @@ def load_reactions_from_df(df: pd.DataFrame, database_metabolites: dict, names: metabolites = {} for (cpd_id, cmp_token), value in c_stoichiometry.items(): cpd = database_metabolites[cpd_id] - cpd_index_id = f'{cpd.id}_{cmp_token}' + cpd_index_id = f"{cpd.id}_{cmp_token}" if cpd_index_id not in metabolites_indexed: cpd_token = cpd.copy() - cpd_token.id = f'{cpd.id}_{cmp_token}' + cpd_token.id = f"{cpd.id}_{cmp_token}" cpd_token.base_id = cpd.id cpd_token.compartment = cmp_token metabolites_indexed[cpd_index_id] = cpd_token metabolites[metabolites_indexed[cpd_index_id]] = value if flags and not pd.isna(flags): - flags = flags.split('|') + flags = flags.split("|") elif pd.isna(flags): flags = set() other_names = set() if rxn_id in names: other_names = set(names[rxn_id]) - rxn = ModelSEEDReaction2(rxn_id, name, '', lower_bound, upper_bound, abbr, other_names, delta_g, - delta_g_err, is_obsolete, is_abstract, status, source, flags) + rxn = ModelSEEDReaction2( + rxn_id, + name, + "", + lower_bound, + upper_bound, + abbr, + other_names, + delta_g, + delta_g_err, + is_obsolete, + is_abstract, + status, + source, + flags, + ) annotation = {} - if rxn_id in reaction_ecs and 'Enzyme Class' in reaction_ecs[rxn_id]: - annotation['ec-code'] = reaction_ecs[rxn_id]['Enzyme Class'] + if rxn_id in reaction_ecs and "Enzyme Class" in reaction_ecs[rxn_id]: + annotation["ec-code"] = reaction_ecs[rxn_id]["Enzyme Class"] if rxn_id in aliases: - aliases_annotation, aliases_models, aliases_others = process_aliases(aliases[rxn_id], - ALIAS_RXN_IDENTIFIERS_ORG, - ALIAS_MODELS) + aliases_annotation, aliases_models, aliases_others = process_aliases( + aliases[rxn_id], ALIAS_RXN_IDENTIFIERS_ORG, ALIAS_MODELS + ) annotation.update(aliases_annotation) - rxn.notes['models'] = aliases_models - rxn.notes['other_aliases'] = aliases_others + rxn.notes["models"] = aliases_models + rxn.notes["other_aliases"] = aliases_others rxn.annotation.update(annotation) rxn.add_metabolites(metabolites) reactions.append(rxn) except Exception as e: - logger.error('failed to read reaction at Index: %s. %s', t[0], e) + logger.error("failed to read reaction at Index: %s. %s", t[0], e) return reactions, list(metabolites_indexed.values()) -class ModelSEEDDatabase: +class ModelSEEDDatabase: """ ModelSEED database instance. """ + def __init__(self, compounds, reactions, compound_tokens): self.compounds = DictList() self.compound_tokens = DictList() @@ -226,7 +295,7 @@ def find_reactions_by_compounds(self, compounds): def add_compound(self, cpd): if cpd.inchi_key: - a, b, p = cpd.inchi_key.split('-') + a, b, p = cpd.inchi_key.split("-") if a not in self.inchi_key_lookup: self.inchi_key_lookup[a] = {} if b not in self.inchi_key_lookup[a]: @@ -242,18 +311,24 @@ def add_reaction(self, rxn): class ModelSEEDBiochem: default_biochemistry = None - + @staticmethod - def get(create_if_missing = True): + def get(create_if_missing=True): if not ModelSEEDBiochem.default_biochemistry: - ModelSEEDBiochem.default_biochemistry = from_local(config.get("biochem","path")) + ModelSEEDBiochem.default_biochemistry = from_local( + config.get("biochem", "path") + ) return ModelSEEDBiochem.default_biochemistry - - def __init__(self, compounds, reactions, - compound_aliases=None, - reaction_aliases=None, - compound_structures=None, - reaction_ecs=None): + + def __init__( + self, + compounds, + reactions, + compound_aliases=None, + reaction_aliases=None, + compound_structures=None, + reaction_ecs=None, + ): if reaction_ecs is None: reaction_ecs = {} if compound_structures is None: @@ -272,13 +347,13 @@ def __init__(self, compounds, reactions, def summary(self): print("cpds:", len(self.compounds), "rxns:", len(self.reactions)) - print('structures', len(self.compound_structures)) - + print("structures", len(self.compound_structures)) + def get_formula(self, seed_id): - return self.get_attribute('formula', seed_id) - + return self.get_attribute("formula", seed_id) + def get_name(self, seed_id): - return self.get_attribute('name', seed_id) + return self.get_attribute("name", seed_id) def get_attribute(self, attr, seed_id): seed = self.get_seed_compound(seed_id) @@ -286,13 +361,13 @@ def get_attribute(self, attr, seed_id): return None if attr in seed.data: value = seed.data[attr] - if not value == 'null': + if not value == "null": return seed.data[attr] return None - + def get_non_obsolete(self, seed_reaction): - if seed_reaction.is_obsolete and 'linked_reaction' in seed_reaction.data: - for id in seed_reaction.data['linked_reaction'].split(';'): + if seed_reaction.is_obsolete and "linked_reaction" in seed_reaction.data: + for id in seed_reaction.data["linked_reaction"].split(";"): other = self.get_seed_reaction(id) if not other == None: if not other.is_obsolete: @@ -304,26 +379,28 @@ def get_seed_compound(self, seed_id): if seed_id in self.compounds: return ModelSEEDCompound(self.compounds[seed_id], self) return None - + def get_seed_reaction(self, seed_id): if seed_id in self.reactions: return ModelSEEDReaction(self.reactions[seed_id], self) return None - + def get_seed_compound_by_alias(self, database, cpd_id): o = None for o_id in self.compounds: - aliases_str = self.compounds[o_id]['aliases'] - alias = dict((a.split(':')[0], a.split(':')[1]) for a in aliases_str.split(';')) - if database in alias and cpd_id in alias[database].split('|'): + aliases_str = self.compounds[o_id]["aliases"] + alias = dict( + (a.split(":")[0], a.split(":")[1]) for a in aliases_str.split(";") + ) + if database in alias and cpd_id in alias[database].split("|"): o = self.compounds[o_id] break return o - + def get_seed_reaction_by_alias(self, id): o = None for o_id in self.reactions: - if id in self.reactions[o_id]['aliases']: + if id in self.reactions[o_id]["aliases"]: o = self.reactions[o_id] break return o @@ -361,60 +438,122 @@ def get_aliases_from_df(df: pd.DataFrame): return aliases -def from_github(commit, database_repo='https://raw.githubusercontent.com/ModelSEED/ModelSEEDDatabase'): - reactions_url = database_repo + '/%s/Biochemistry/reactions.tsv' % commit - compounds_url = database_repo + '/%s/Biochemistry/compounds.tsv' % commit - reactions_aliases_url = database_repo + '/%s/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Aliases.txt' % commit - compounds_aliases_url = database_repo + '/%s/Biochemistry/Aliases/Unique_ModelSEED_Compound_Aliases.txt' % commit - compounds_structures_url = database_repo + '/%s/Biochemistry/Structures/Unique_ModelSEED_Structures.txt' % commit - reactions_ec_url = database_repo + '/%s/Biochemistry/Aliases/Unique_ModelSEED_Reaction_ECs.txt' % commit - reactions_names_url = database_repo + '/%s/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Names.txt' % commit - compounds_names_url = database_repo + '/%s/Biochemistry/Aliases/Unique_ModelSEED_Compound_Names.txt' % commit - - return load_database(compounds_url, reactions_url, - compounds_names_url, compounds_aliases_url, compounds_structures_url, - reactions_names_url, reactions_aliases_url, reactions_ec_url) +def from_github( + commit, + database_repo="https://raw.githubusercontent.com/ModelSEED/ModelSEEDDatabase", +): + reactions_url = database_repo + "/%s/Biochemistry/reactions.tsv" % commit + compounds_url = database_repo + "/%s/Biochemistry/compounds.tsv" % commit + reactions_aliases_url = ( + database_repo + + "/%s/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Aliases.txt" % commit + ) + compounds_aliases_url = ( + database_repo + + "/%s/Biochemistry/Aliases/Unique_ModelSEED_Compound_Aliases.txt" % commit + ) + compounds_structures_url = ( + database_repo + + "/%s/Biochemistry/Structures/Unique_ModelSEED_Structures.txt" % commit + ) + reactions_ec_url = ( + database_repo + + "/%s/Biochemistry/Aliases/Unique_ModelSEED_Reaction_ECs.txt" % commit + ) + reactions_names_url = ( + database_repo + + "/%s/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Names.txt" % commit + ) + compounds_names_url = ( + database_repo + + "/%s/Biochemistry/Aliases/Unique_ModelSEED_Compound_Names.txt" % commit + ) + + return load_database( + compounds_url, + reactions_url, + compounds_names_url, + compounds_aliases_url, + compounds_structures_url, + reactions_names_url, + reactions_aliases_url, + reactions_ec_url, + ) def from_local2(path): - reactions_url = path + '/Biochemistry/reactions.tsv' - compounds_url = path + '/Biochemistry/compounds.tsv' - reactions_aliases_url = path + '/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Aliases.txt' - compounds_aliases_url = path + '/Biochemistry/Aliases/Unique_ModelSEED_Compound_Aliases.txt' - reactions_names_url = path + '/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Names.txt' - compounds_names_url = path + '/Biochemistry/Aliases/Unique_ModelSEED_Compound_Names.txt' - compounds_structures_url = path + '/Biochemistry/Structures/Unique_ModelSEED_Structures.txt' - reactions_ec_url = path + '/Biochemistry/Aliases/Unique_ModelSEED_Reaction_ECs.txt' - return load_database(compounds_url, reactions_url, - compounds_names_url, compounds_aliases_url, compounds_structures_url, - reactions_names_url, reactions_aliases_url, reactions_ec_url) - - -def load_database(compounds_url, reactions_url, - compounds_names_url, compounds_aliases_url, compounds_structures_url, - reactions_names_url, reactions_aliases_url, reactions_ec_url): + reactions_url = path + "/Biochemistry/reactions.tsv" + compounds_url = path + "/Biochemistry/compounds.tsv" + reactions_aliases_url = ( + path + "/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Aliases.txt" + ) + compounds_aliases_url = ( + path + "/Biochemistry/Aliases/Unique_ModelSEED_Compound_Aliases.txt" + ) + reactions_names_url = ( + path + "/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Names.txt" + ) + compounds_names_url = ( + path + "/Biochemistry/Aliases/Unique_ModelSEED_Compound_Names.txt" + ) + compounds_structures_url = ( + path + "/Biochemistry/Structures/Unique_ModelSEED_Structures.txt" + ) + reactions_ec_url = path + "/Biochemistry/Aliases/Unique_ModelSEED_Reaction_ECs.txt" + return load_database( + compounds_url, + reactions_url, + compounds_names_url, + compounds_aliases_url, + compounds_structures_url, + reactions_names_url, + reactions_aliases_url, + reactions_ec_url, + ) + + +def load_database( + compounds_url, + reactions_url, + compounds_names_url, + compounds_aliases_url, + compounds_structures_url, + reactions_names_url, + reactions_aliases_url, + reactions_ec_url, +): logger.info("load: %s", compounds_structures_url) - compound_structures = get_structures_from_df(pd.read_csv(compounds_structures_url, sep='\t')) + compound_structures = get_structures_from_df( + pd.read_csv(compounds_structures_url, sep="\t") + ) logger.info("load: %s", compounds_names_url) - compound_names = get_names_from_df(pd.read_csv(compounds_names_url, sep='\t')) + compound_names = get_names_from_df(pd.read_csv(compounds_names_url, sep="\t")) logger.info("load: %s", compounds_aliases_url) - compound_aliases = get_aliases_from_df(pd.read_csv(compounds_aliases_url, sep='\t')) + compound_aliases = get_aliases_from_df(pd.read_csv(compounds_aliases_url, sep="\t")) logger.info("load: %s", compounds_url) - df_compounds = pd.read_csv(compounds_url, sep='\t', low_memory=False) # Columns (10,14,15) have mixed types. - compounds = load_metabolites_from_df(df_compounds, compound_names, compound_aliases, compound_structures) + df_compounds = pd.read_csv( + compounds_url, sep="\t", low_memory=False + ) # Columns (10,14,15) have mixed types. + compounds = load_metabolites_from_df( + df_compounds, compound_names, compound_aliases, compound_structures + ) logger.info("load: %s", reactions_names_url) - reaction_names = get_names_from_df(pd.read_csv(reactions_names_url, sep='\t')) + reaction_names = get_names_from_df(pd.read_csv(reactions_names_url, sep="\t")) logger.info("load: %s", reactions_aliases_url) - reaction_aliases = get_aliases_from_df(pd.read_csv(reactions_aliases_url, sep='\t')) + reaction_aliases = get_aliases_from_df(pd.read_csv(reactions_aliases_url, sep="\t")) logger.info("load: %s", reactions_ec_url) - reaction_ecs = get_aliases_from_df(pd.read_csv(reactions_ec_url, sep='\t')) + reaction_ecs = get_aliases_from_df(pd.read_csv(reactions_ec_url, sep="\t")) - df_reactions = pd.read_csv(reactions_url, sep='\t', low_memory=False) + df_reactions = pd.read_csv(reactions_url, sep="\t", low_memory=False) reactions, metabolites_indexed = load_reactions_from_df( - df_reactions, dict(map(lambda x: (x.id, x), compounds)), reaction_names, - reaction_aliases, reaction_ecs) + df_reactions, + dict(map(lambda x: (x.id, x), compounds)), + reaction_names, + reaction_aliases, + reaction_ecs, + ) database = ModelSEEDDatabase(compounds, reactions, metabolites_indexed) return database @@ -422,48 +561,69 @@ def load_database(compounds_url, reactions_url, def from_local(path): database_repo = path - reactions_url = database_repo + '/Biochemistry/reactions.tsv' - compounds_url = database_repo + '/Biochemistry/compounds.tsv' - reactions_aliases_url = database_repo + '/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Aliases.txt' - compounds_aliases_url = database_repo + '/Biochemistry/Aliases/Unique_ModelSEED_Compound_Aliases.txt' - reactions_names_url = database_repo + '/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Names.txt' - compounds_names_url = database_repo + '/Biochemistry/Aliases/Unique_ModelSEED_Compound_Names.txt' - compounds_structures_url = database_repo + '/Biochemistry/Structures/Unique_ModelSEED_Structures.txt' - reactions_ec_url = database_repo + '/Biochemistry/Aliases/Unique_ModelSEED_Reaction_ECs.txt' - + reactions_url = database_repo + "/Biochemistry/reactions.tsv" + compounds_url = database_repo + "/Biochemistry/compounds.tsv" + reactions_aliases_url = ( + database_repo + "/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Aliases.txt" + ) + compounds_aliases_url = ( + database_repo + "/Biochemistry/Aliases/Unique_ModelSEED_Compound_Aliases.txt" + ) + reactions_names_url = ( + database_repo + "/Biochemistry/Aliases/Unique_ModelSEED_Reaction_Names.txt" + ) + compounds_names_url = ( + database_repo + "/Biochemistry/Aliases/Unique_ModelSEED_Compound_Names.txt" + ) + compounds_structures_url = ( + database_repo + "/Biochemistry/Structures/Unique_ModelSEED_Structures.txt" + ) + reactions_ec_url = ( + database_repo + "/Biochemistry/Aliases/Unique_ModelSEED_Reaction_ECs.txt" + ) + compounds = {} reactions = {} logger.info("load: %s", reactions_url) - seed_reactions = pd.read_csv(reactions_url, sep='\t', low_memory=False) + seed_reactions = pd.read_csv(reactions_url, sep="\t", low_memory=False) logger.info("load: %s", compounds_url) - seed_compounds = pd.read_csv(compounds_url, sep='\t', low_memory=False) # Columns (10,14,15) have mixed types. - + seed_compounds = pd.read_csv( + compounds_url, sep="\t", low_memory=False + ) # Columns (10,14,15) have mixed types. + for row_id, d in seed_reactions.iterrows(): seed_reaction = build_reaction(d) - reactions[seed_reaction['id']] = seed_reaction + reactions[seed_reaction["id"]] = seed_reaction for row_id, d in seed_compounds.iterrows(): seed_compound = build_compound(d) - compounds[seed_compound['id']] = seed_compound + compounds[seed_compound["id"]] = seed_compound logger.info("load: %s", compounds_structures_url) - df_structures = pd.read_csv(compounds_structures_url, sep='\t') + df_structures = pd.read_csv(compounds_structures_url, sep="\t") compound_structures = get_structures(df_structures) logger.info("load: %s", compounds_aliases_url) - df_compound_aliases = pd.read_csv(compounds_aliases_url, sep='\t') + df_compound_aliases = pd.read_csv(compounds_aliases_url, sep="\t") logger.info("load: %s", reactions_aliases_url) - df_reaction_aliases = pd.read_csv(reactions_aliases_url, sep='\t') + df_reaction_aliases = pd.read_csv(reactions_aliases_url, sep="\t") logger.info("load: %s", reactions_ec_url) - df_reaction_ecs = pd.read_csv(reactions_ec_url, sep='\t') - + df_reaction_ecs = pd.read_csv(reactions_ec_url, sep="\t") + compound_aliases = get_aliases_from_df(df_compound_aliases) reaction_aliases = get_aliases_from_df(df_reaction_aliases) reaction_ecs = get_aliases_from_df(df_reaction_ecs) - - modelseed = ModelSEEDBiochem(compounds, reactions, compound_aliases, reaction_aliases, compound_structures, reaction_ecs) - + + modelseed = ModelSEEDBiochem( + compounds, + reactions, + compound_aliases, + reaction_aliases, + compound_structures, + reaction_ecs, + ) + return modelseed @@ -488,7 +648,9 @@ def get_structures_from_df(df: pd.DataFrame): if seed_id not in compound_structures: compound_structures[seed_id] = {} if structure_type in compound_structures[seed_id]: - logger.warning('warning duplicate structure: %s (%s)', structure_type, seed_id) + logger.warning( + "warning duplicate structure: %s (%s)", structure_type, seed_id + ) compound_structures[seed_id][structure_type] = value return compound_structures @@ -496,69 +658,69 @@ def get_structures_from_df(df: pd.DataFrame): def get_structures(seed_structures): compound_structures = {} - + for row_id, d in seed_structures.iterrows(): - seed_id = d['ID'] - t = d['Type'] - value = d['Structure'] + seed_id = d["ID"] + t = d["Type"] + value = d["Structure"] if seed_id not in compound_structures: compound_structures[seed_id] = {} if t in compound_structures[seed_id]: - print('warning duplicate structure:', t, seed_id) + print("warning duplicate structure:", t, seed_id) compound_structures[seed_id][t] = value - + return compound_structures def build_compound(d): seed_compound = { - 'id': d['id'], - 'abbreviation': d['abbreviation'], - 'name': d['name'], - 'formula': d['formula'], - 'mass': d['mass'], - 'source': d['source'], - 'inchikey': d['inchikey'], - 'charge': d['charge'], - 'is_core': d['is_core'], - 'is_obsolete': d['is_obsolete'], - 'linked_compound': d['linked_compound'], - 'is_cofactor': d['is_cofactor'], - 'deltag': d['deltag'], - 'deltagerr': d['deltagerr'], - 'pka': d['pka'], - 'pkb': d['pkb'], - 'abstract_compound': d['abstract_compound'], - 'comprised_of': d['comprised_of'], - 'aliases': d['aliases'], - 'smiles': d['smiles'] + "id": d["id"], + "abbreviation": d["abbreviation"], + "name": d["name"], + "formula": d["formula"], + "mass": d["mass"], + "source": d["source"], + "inchikey": d["inchikey"], + "charge": d["charge"], + "is_core": d["is_core"], + "is_obsolete": d["is_obsolete"], + "linked_compound": d["linked_compound"], + "is_cofactor": d["is_cofactor"], + "deltag": d["deltag"], + "deltagerr": d["deltagerr"], + "pka": d["pka"], + "pkb": d["pkb"], + "abstract_compound": d["abstract_compound"], + "comprised_of": d["comprised_of"], + "aliases": d["aliases"], + "smiles": d["smiles"], } return seed_compound def build_reaction(d): seed_reaction = { - 'id': d['id'], - 'abbreviation': d['abbreviation'], - 'name': d['name'], - 'code': d['code'], - 'stoichiometry': d['stoichiometry'], - 'is_transport': d['is_transport'], - 'equation': d['equation'], - 'definition': d['definition'], - 'reversibility': d['reversibility'], - 'direction': d['direction'], - 'abstract_reaction': d['abstract_reaction'], - 'pathways': d['pathways'], - 'aliases': d['aliases'], - 'ec_numbers': d['ec_numbers'], - 'deltag': d['deltag'], - 'deltagerr': d['deltagerr'], - 'compound_ids': d['compound_ids'], - 'status': d['status'], - 'is_obsolete': d['is_obsolete'], - 'linked_reaction': d['linked_reaction'], - 'notes': d['notes'], - 'source': d['source'] + "id": d["id"], + "abbreviation": d["abbreviation"], + "name": d["name"], + "code": d["code"], + "stoichiometry": d["stoichiometry"], + "is_transport": d["is_transport"], + "equation": d["equation"], + "definition": d["definition"], + "reversibility": d["reversibility"], + "direction": d["direction"], + "abstract_reaction": d["abstract_reaction"], + "pathways": d["pathways"], + "aliases": d["aliases"], + "ec_numbers": d["ec_numbers"], + "deltag": d["deltag"], + "deltagerr": d["deltagerr"], + "compound_ids": d["compound_ids"], + "status": d["status"], + "is_obsolete": d["is_obsolete"], + "linked_reaction": d["linked_reaction"], + "notes": d["notes"], + "source": d["source"], } return seed_reaction diff --git a/modelseedpy/biochem/modelseed_builder.py b/modelseedpy/biochem/modelseed_builder.py index 04ec6485..3e921e1c 100644 --- a/modelseedpy/biochem/modelseed_builder.py +++ b/modelseedpy/biochem/modelseed_builder.py @@ -1,48 +1,52 @@ - class ModelSeedBuilder: - def __init__(self, fbamodel, modelseed): self.fbamodel = fbamodel self.modelseed = modelseed - - def configure_reaction(self, seed_reaction, direction, compartment_config, model_reaction_proteins): + + def configure_reaction( + self, seed_reaction, direction, compartment_config, model_reaction_proteins + ): maxforflux = 1000 maxrevflux = 1000 - if direction == '>': + if direction == ">": maxrevflux = 0 - elif direction == '<': + elif direction == "<": maxforflux = 0 - if not seed_reaction['is_obsolete'] == 0: - print('warning obsolete reaction', seed_id) + if not seed_reaction["is_obsolete"] == 0: + print("warning obsolete reaction", seed_id) model_reaction_reagents = configure_stoichiometry( - seed_reaction, - compartment_config) + seed_reaction, compartment_config + ) - compartment = cobrakbase.core.utils.get_reaction_compartment2(compartment_config) + compartment = cobrakbase.core.utils.get_reaction_compartment2( + compartment_config + ) if len(compartment) > 1: compartment = compartment[0] modelreaction = { - 'aliases': [], - 'dblinks': {}, - 'direction': direction, - 'edits': {}, - 'gapfill_data': {}, - 'id': "{}_{}".format(seed_reaction['id'], compartment), - 'maxforflux': maxforflux, - 'maxrevflux': maxrevflux, - 'modelReactionProteins': model_reaction_proteins, - 'modelReactionReagents': model_reaction_reagents, - 'modelcompartment_ref': '~/modelcompartments/id/c0', - 'name': seed_reaction['name'], - 'numerical_attributes': {}, - 'probability': 0, - 'protons': 0, - 'reaction_ref': '~/template/reactions/id/{}_{}'.format(seed_reaction['id'], compartment), - 'string_attributes': {} + "aliases": [], + "dblinks": {}, + "direction": direction, + "edits": {}, + "gapfill_data": {}, + "id": "{}_{}".format(seed_reaction["id"], compartment), + "maxforflux": maxforflux, + "maxrevflux": maxrevflux, + "modelReactionProteins": model_reaction_proteins, + "modelReactionReagents": model_reaction_reagents, + "modelcompartment_ref": "~/modelcompartments/id/c0", + "name": seed_reaction["name"], + "numerical_attributes": {}, + "probability": 0, + "protons": 0, + "reaction_ref": "~/template/reactions/id/{}_{}".format( + seed_reaction["id"], compartment + ), + "string_attributes": {}, } - - return modelreaction \ No newline at end of file + + return modelreaction diff --git a/modelseedpy/biochem/modelseed_compound.py b/modelseedpy/biochem/modelseed_compound.py index 6d7e5de3..a964143f 100755 --- a/modelseedpy/biochem/modelseed_compound.py +++ b/modelseedpy/biochem/modelseed_compound.py @@ -5,13 +5,30 @@ class ModelSEEDCompound2(Metabolite): - - def __init__(self, cpd_id=None, formula=None, name="", charge=None, compartment=None, - abbr=None, names=None, - mass=None, delta_g=None, delta_g_error=None, - smiles=None, inchi_key=None, inchi=None, - is_core=False, is_obsolete=False, is_cofactor=False, is_abstract=False, - pka=None, pkb=None, source=None, flags=None): + def __init__( + self, + cpd_id=None, + formula=None, + name="", + charge=None, + compartment=None, + abbr=None, + names=None, + mass=None, + delta_g=None, + delta_g_error=None, + smiles=None, + inchi_key=None, + inchi=None, + is_core=False, + is_obsolete=False, + is_cofactor=False, + is_abstract=False, + pka=None, + pkb=None, + source=None, + flags=None, + ): super().__init__(cpd_id, formula, name, charge, compartment) self.seed_id = cpd_id @@ -43,16 +60,15 @@ def __init__(self, cpd_id=None, formula=None, name="", charge=None, compartment= def to_template_compartment_compound(self, compartment): res = self.copy() - res.id = f'{self.seed_id}_{compartment}' + res.id = f"{self.seed_id}_{compartment}" res.compartment = compartment return res class ModelSEEDCompound(ModelSEEDObject): - @property def formula(self): - return self.data['formula'] + return self.data["formula"] @property def database(self): @@ -61,27 +77,36 @@ def database(self): @property def inchi(self): if self.api is not None: - if self.id in self.api.compound_structures and 'InChI' in self.api.compound_structures[self.id]: - return self.api.compound_structures[self.id]['InChI'] + if ( + self.id in self.api.compound_structures + and "InChI" in self.api.compound_structures[self.id] + ): + return self.api.compound_structures[self.id]["InChI"] return None @property def inchikey(self): if self.api is not None: - if self.id in self.api.compound_structures and 'InChIKey' in self.api.compound_structures[self.id]: - return self.api.compound_structures[self.id]['InChIKey'] - if pd.isna(self.data['inchikey']): + if ( + self.id in self.api.compound_structures + and "InChIKey" in self.api.compound_structures[self.id] + ): + return self.api.compound_structures[self.id]["InChIKey"] + if pd.isna(self.data["inchikey"]): return None - return self.data['inchikey'] + return self.data["inchikey"] @property def smiles(self): if self.api is not None: - if self.id in self.api.compound_structures and 'SMILE' in self.api.compound_structures[self.id]: - return self.api.compound_structures[self.id]['SMILE'] - if pd.isna(self.data['smiles']): + if ( + self.id in self.api.compound_structures + and "SMILE" in self.api.compound_structures[self.id] + ): + return self.api.compound_structures[self.id]["SMILE"] + if pd.isna(self.data["smiles"]): return None - return self.data['smiles'] + return self.data["smiles"] @property def aliases(self): @@ -92,15 +117,14 @@ def aliases(self): @property def deltag(self): - return self.data['deltag'] + return self.data["deltag"] @property def is_obsolete(self): - if 'is_obsolete' in self.data: - is_obsolete = self.data['is_obsolete'] + if "is_obsolete" in self.data: + is_obsolete = self.data["is_obsolete"] if is_obsolete == 0: return False else: return True return False - diff --git a/modelseedpy/biochem/modelseed_reaction.py b/modelseedpy/biochem/modelseed_reaction.py index a3dc0269..d930141d 100755 --- a/modelseedpy/biochem/modelseed_reaction.py +++ b/modelseedpy/biochem/modelseed_reaction.py @@ -4,24 +4,24 @@ def to_str2(rxn, cmp_replace=None, cpd_replace={}): - direction = rxn.data['direction'] - op = '' - if direction == '=': - op = '<=>' - elif direction == '>': - op = '-->' - elif direction == '<': - op = '<--' + direction = rxn.data["direction"] + op = "" + if direction == "=": + op = "<=>" + elif direction == ">": + op = "-->" + elif direction == "<": + op = "<--" else: - op = '' + op = "" cstoichiometry = rxn.cstoichiometry l = [] r = [] for o in cstoichiometry: if cstoichiometry[o] > 0: - r.append((o[0],o[1], math.fabs(cstoichiometry[o]))) + r.append((o[0], o[1], math.fabs(cstoichiometry[o]))) else: - l.append((o[0],o[1], math.fabs(cstoichiometry[o]))) + l.append((o[0], o[1], math.fabs(cstoichiometry[o]))) l_str = print_stoich_block(l, cmp_replace, cpd_replace) r_str = print_stoich_block(r, cmp_replace, cpd_replace) return "{} {} {}".format(l_str, op, r_str) @@ -43,16 +43,16 @@ def print_stoich_block(b, cmp_replace=None, cpd_replace={}): l_text.append(v_text) # print(l_text, r_text) - return ' + '.join(l_text) + return " + ".join(l_text) def get_lhs_rhs(seed_reaction, eval_func): result = {} result_no_zero = {} - stoichiometry = seed_reaction['stoichiometry'] + stoichiometry = seed_reaction["stoichiometry"] if type(stoichiometry) == str: - for reagent_str in stoichiometry.split(';'): - reagent_data = reagent_str.split(':') + for reagent_str in stoichiometry.split(";"): + reagent_data = reagent_str.split(":") cpd_id = reagent_data[1] value = float(reagent_data[0]) if eval_func(value): @@ -60,7 +60,7 @@ def get_lhs_rhs(seed_reaction, eval_func): result[cpd_id] = 0 result[reagent_data[1]] += value elif value == 0: - raise Exception('zero value stoich: ' + stoichiometry) + raise Exception("zero value stoich: " + stoichiometry) for cpd_id in result: if result[cpd_id] == 0: @@ -73,10 +73,10 @@ def get_lhs_rhs(seed_reaction, eval_func): def get_stoichiometry(seed_reaction): result = {} result_no_zero = {} - stoichiometry = seed_reaction['stoichiometry'] + stoichiometry = seed_reaction["stoichiometry"] if type(stoichiometry) == str: - for reagent_str in stoichiometry.split(';'): - reagent_data = reagent_str.split(':') + for reagent_str in stoichiometry.split(";"): + reagent_data = reagent_str.split(":") cpd_id = reagent_data[1] if not cpd_id in result: result[cpd_id] = 0 @@ -96,8 +96,8 @@ def get_cstoichiometry(stoichiometry): result = {} result_no_zero = {} # print(stoichiometry) - for reagent_str in stoichiometry.split(';'): - reagent_data = reagent_str.split(':') + for reagent_str in stoichiometry.split(";"): + reagent_data = reagent_str.split(":") value = reagent_data[0] cpd_id = reagent_data[1] cmp_index = reagent_data[2] @@ -116,11 +116,23 @@ class ModelSEEDReaction2(Reaction): Reaction instance from ModelSEED database. """ - def __init__(self, rxn_id, name='', subsystem='', lower_bound=0.0, upper_bound=None, - abbr=None, names=None, - delta_g=None, delta_g_error=None, - is_obsolete=False, is_abstract=False, - status=None, source=None, flags=None): + def __init__( + self, + rxn_id, + name="", + subsystem="", + lower_bound=0.0, + upper_bound=None, + abbr=None, + names=None, + delta_g=None, + delta_g_error=None, + is_obsolete=False, + is_abstract=False, + status=None, + source=None, + flags=None, + ): super().__init__(rxn_id, name, subsystem, lower_bound, upper_bound) self.abbr = abbr @@ -147,22 +159,27 @@ def compound_ids(self): def to_template_reaction(self, compartment_setup=None): if compartment_setup is None: - raise ValueError('invalid compartment setup') + raise ValueError("invalid compartment setup") from modelseedpy.core.msmodel import get_cmp_token + reaction_compartment = get_cmp_token(compartment_setup.values()) - rxn_id = f'{self.id}_{reaction_compartment}' - name = f'{self.name}' + rxn_id = f"{self.id}_{reaction_compartment}" + name = f"{self.name}" metabolites = {} for m, v in self.metabolites.items(): if m.compartment not in compartment_setup: - raise ValueError(f'invalid compartment setup missing key [{m.compartment}] in {compartment_setup}') + raise ValueError( + f"invalid compartment setup missing key [{m.compartment}] in {compartment_setup}" + ) cpd = m.to_template_compartment_compound(compartment_setup[m.compartment]) metabolites[cpd] = v # print(m.id, m.compartment, cpd, v) # if len(str(index)) > 0: # name = f'{self.name} [{compartment}]' - reaction = Reaction(rxn_id, name, self.subsystem, self.lower_bound, self.upper_bound) + reaction = Reaction( + rxn_id, name, self.subsystem, self.lower_bound, self.upper_bound + ) reaction.add_metabolites(metabolites) return reaction @@ -176,7 +193,7 @@ def is_translocation(self): @property def ec_numbers(self): - return self.annotation['ec-code'] if 'ec-code' in self.annotation else [] + return self.annotation["ec-code"] if "ec-code" in self.annotation else [] @property def aliases(self): @@ -197,7 +214,7 @@ def stoichiometry(self): @property def cstoichiometry(self): - return get_cstoichiometry(self.data['stoichiometry']) + return get_cstoichiometry(self.data["stoichiometry"]) @property def ec_numbers(self): @@ -220,8 +237,8 @@ def rhs(self): @property def is_transport(self): - if 'is_transport' in self.data: - is_transport = self.data['is_transport'] + if "is_transport" in self.data: + is_transport = self.data["is_transport"] if is_transport == 1: return True @@ -239,15 +256,17 @@ def aliases(self): @property def is_obsolete(self): - if 'is_obsolete' in self.data: - is_obsolete = self.data['is_obsolete'] + if "is_obsolete" in self.data: + is_obsolete = self.data["is_obsolete"] if is_obsolete == 0: return False else: return True return False - def build_reaction_string(self, use_metabolite_names=False, use_compartment_names=None): + def build_reaction_string( + self, use_metabolite_names=False, use_compartment_names=None + ): cpd_name_replace = {} if use_metabolite_names: if self.api: @@ -255,9 +274,10 @@ def build_reaction_string(self, use_metabolite_names=False, use_compartment_name cpd = self.api.get_seed_compound(cpd_id) cpd_name_replace[cpd_id] = cpd.name else: - return self.data['definition'] + return self.data["definition"] return to_str2(self, use_compartment_names, cpd_name_replace) def __str__(self): return "{id}: {stoichiometry}".format( - id=self.id, stoichiometry=self.build_reaction_string()) + id=self.id, stoichiometry=self.build_reaction_string() + ) diff --git a/modelseedpy/biochem/modelseed_to_cobra.py b/modelseedpy/biochem/modelseed_to_cobra.py index ddaaa0b2..b567cf49 100644 --- a/modelseedpy/biochem/modelseed_to_cobra.py +++ b/modelseedpy/biochem/modelseed_to_cobra.py @@ -1,48 +1,54 @@ import math import copy import logging + logger = logging.getLogger(__name__) cobra_metabolite = { - 'id': '13dpg_c', - 'name': 'compound', - 'compartment': 'c', - 'charge': 0, - 'formula': '', - 'annotation': {} + "id": "13dpg_c", + "name": "compound", + "compartment": "c", + "charge": 0, + "formula": "", + "annotation": {}, } cobra_reaction = { - 'id': 'ACALD', - 'name': 'Acetaldehyde dehydrogenase (acetylating)', - 'metabolites': - { - 'acald_c': -1.0, - 'accoa_c': 1.0, - 'coa_c': -1.0, - 'h_c': 1.0, - 'nad_c': -1.0, - 'nadh_c': 1.0 - }, - 'lower_bound': -1000.0, - 'upper_bound': 1000.0, - 'gene_reaction_rule': '', - 'annotation': {} + "id": "ACALD", + "name": "Acetaldehyde dehydrogenase (acetylating)", + "metabolites": { + "acald_c": -1.0, + "accoa_c": 1.0, + "coa_c": -1.0, + "h_c": 1.0, + "nad_c": -1.0, + "nadh_c": 1.0, + }, + "lower_bound": -1000.0, + "upper_bound": 1000.0, + "gene_reaction_rule": "", + "annotation": {}, } -def modelseed_to_cobra_reaction(rxn, compartment=None, rxn_cmp_suffix='c', - lb=None, ub=None, rev='direction', - cs_override=None): +def modelseed_to_cobra_reaction( + rxn, + compartment=None, + rxn_cmp_suffix="c", + lb=None, + ub=None, + rev="direction", + cs_override=None, +): if compartment is None: - compartment = {'0': None} + compartment = {"0": None} crxn = copy.deepcopy(cobra_reaction) if rxn_cmp_suffix is not None and not len(rxn_cmp_suffix.strip()) == 0: - crxn['id'] = rxn.id + '_' + rxn_cmp_suffix + crxn["id"] = rxn.id + "_" + rxn_cmp_suffix else: - crxn['id'] = rxn.id - crxn['name'] = "{} [{}]".format(rxn.id, rxn_cmp_suffix) + crxn["id"] = rxn.id + crxn["name"] = "{} [{}]".format(rxn.id, rxn_cmp_suffix) metabolites = {} cpd_cmp = {} @@ -61,16 +67,16 @@ def modelseed_to_cobra_reaction(rxn, compartment=None, rxn_cmp_suffix='c', print(rxn.data) cmp = compartment[p[1]] if cmp is not None and not len(cmp.strip()) == 0: - met_id += '_' + cmp.strip() + met_id += "_" + cmp.strip() else: - cmp = 'z' + cmp = "z" if met_id not in metabolites: metabolites[met_id] = value if not p[0] in cpd_cmp: cpd_cmp[p[0]] = set() cpd_cmp[p[0]].add(cmp) else: - print('!', rxn.id) + print("!", rxn.id) rev = rxn.data[rev] # direction if lb is None and ub is None: @@ -78,13 +84,13 @@ def modelseed_to_cobra_reaction(rxn, compartment=None, rxn_cmp_suffix='c', lb = -1000 ub = 1000 # print('reversibility', rxn.data['reversibility'], 'direction', rxn.data['direction']) - if rev == '>': + if rev == ">": lb = 0 - elif rev == '<': + elif rev == "<": ub = 0 - crxn['lower_bound'] = lb - crxn['upper_bound'] = ub - crxn['metabolites'] = metabolites + crxn["lower_bound"] = lb + crxn["upper_bound"] = ub + crxn["metabolites"] = metabolites logger.debug("%s: %s", rxn.id, metabolites) diff --git a/modelseedpy/biochem/seed_object.py b/modelseedpy/biochem/seed_object.py index 139cc4f3..1b921870 100644 --- a/modelseedpy/biochem/seed_object.py +++ b/modelseedpy/biochem/seed_object.py @@ -1,13 +1,12 @@ class ModelSEEDObject: - def __init__(self, data, api=None): self.data = data self.api = api @property def id(self): - return self.data['id'] + return self.data["id"] @property def name(self): - return self.data['name'] + return self.data["name"] diff --git a/modelseedpy/biochem/stoich_integration.py b/modelseedpy/biochem/stoich_integration.py index 692e52f1..ec702f51 100755 --- a/modelseedpy/biochem/stoich_integration.py +++ b/modelseedpy/biochem/stoich_integration.py @@ -8,17 +8,16 @@ def get_permutations(n): - perm = permutations(range(n), n) + perm = permutations(range(n), n) return list(perm) class StoichiometryHashLibrary: - def __init__(self, func_hash): self.func_hash = func_hash self.all_hashes = {} self.rxn_to_hash = {} - + def hash_stoichiometry(self, rxn_id, stoich): hashes = self.func_hash(stoich) self.rxn_to_hash[rxn_id] = hashes @@ -29,7 +28,7 @@ def hash_stoichiometry(self, rxn_id, stoich): if not hash_val in self.all_hashes[h]: self.all_hashes[h][hash_val] = set() self.all_hashes[h][hash_val].add(rxn_id) - + def match(self, stoichiometry): match = {} s_hash = self.func_hash(stoichiometry) @@ -45,22 +44,26 @@ def match(self, stoichiometry): class CStoichiometryHashLibrary(StoichiometryHashLibrary): - def match(self, cstoichiometry): match = {} - cmps = list(set(map(lambda x : x[1], cstoichiometry))) + cmps = list(set(map(lambda x: x[1], cstoichiometry))) index_tests = get_permutations(len(cmps)) - + for t in index_tests: replace = {} for i in range(len(cmps)): replace[cmps[i]] = str(t[i]) - + tstoichiometry = copy.deepcopy(cstoichiometry) - tstoichiometry = dict(map(lambda x : ((x[0][0], replace[x[0][1]]), x[1]), tstoichiometry.items())) - + tstoichiometry = dict( + map( + lambda x: ((x[0][0], replace[x[0][1]]), x[1]), + tstoichiometry.items(), + ) + ) + s_hash = self.func_hash(tstoichiometry) - + for hash_type in s_hash: hash_val = s_hash[hash_type] for hash_type_lib in self.all_hashes: @@ -68,23 +71,34 @@ def match(self, cstoichiometry): for rxn_id_match in self.all_hashes[hash_type_lib][hash_val]: if not rxn_id_match in match: match[rxn_id_match] = set() - replace_str = ';'.join(map(lambda x : "{}:{}".format(x[0], x[1]), replace.items())) - match[rxn_id_match].add((hash_type, hash_type_lib, hash_val, replace_str)) - + replace_str = ";".join( + map( + lambda x: "{}:{}".format(x[0], x[1]), + replace.items(), + ) + ) + match[rxn_id_match].add( + (hash_type, hash_type_lib, hash_val, replace_str) + ) + return match def multi_hasher(stoichiometry, exclude=[]): s = copy.deepcopy(stoichiometry) s_rev = dict(map(lambda x: (x[0], -1 * x[1]), s.items())) # reverse values - s_x = dict(filter(lambda x: x[0][0] not in exclude, s.items())) # exclude compounds in exclude - s_rev_x = dict(map(lambda x: (x[0], -1 * x[1]), s_x.items())) # reverse exclude stoichiometry + s_x = dict( + filter(lambda x: x[0][0] not in exclude, s.items()) + ) # exclude compounds in exclude + s_rev_x = dict( + map(lambda x: (x[0], -1 * x[1]), s_x.items()) + ) # reverse exclude stoichiometry hashes = { - 'std': hash(frozenset(s.items())), - 'rev': hash(frozenset(s_rev.items())), - 'x_std': hash(frozenset(s_x.items())), - 'x_rev': hash(frozenset(s_rev_x.items())), + "std": hash(frozenset(s.items())), + "rev": hash(frozenset(s_rev.items())), + "x_std": hash(frozenset(s_x.items())), + "x_rev": hash(frozenset(s_rev_x.items())), } return hashes @@ -92,7 +106,7 @@ def multi_hasher(stoichiometry, exclude=[]): def single_hasher(stoichiometry, ex1=[]): s_copy = copy.deepcopy(stoichiometry) - #print(s_copy) + # print(s_copy) std = hash(frozenset(s_copy.items())) for a in s_copy: s_copy[a] = -1 * s_copy[a] @@ -104,29 +118,24 @@ def single_hasher(stoichiometry, ex1=[]): for p in s_copy: if o == p: delete.append(p) - - #print(f'delete: {delete}') + + # print(f'delete: {delete}') for p in delete: del s_copy[p] - - #print(s_copy) + + # print(s_copy) h_std = hash(frozenset(s_copy.items())) for a in s_copy: s_copy[a] = -1 * s_copy[a] h_rev = hash(frozenset(s_copy.items())) - - hashes = { - 'std' : std, - 'rev' : rev, - 'no_h_std' : h_std, - 'no_h_rev' : h_rev - } + + hashes = {"std": std, "rev": rev, "no_h_std": h_std, "no_h_rev": h_rev} return hashes -def single_hasher2(s, ex1 = []): +def single_hasher2(s, ex1=[]): s_copy = copy.deepcopy(s) - #print(s_copy) + # print(s_copy) std = hash(frozenset(s_copy.items())) for a in s_copy: s_copy[a] = -1 * s_copy[a] @@ -138,37 +147,41 @@ def single_hasher2(s, ex1 = []): for p in s_copy: if o == p: delete.append(p) - - #print(f'delete: {delete} -> {ex1}') + + # print(f'delete: {delete} -> {ex1}') for p in delete: del s_copy[p] - - #print(s_copy) + + # print(s_copy) h_std = hash(frozenset(s_copy.items())) for a in s_copy: s_copy[a] = -1 * s_copy[a] h_rev = hash(frozenset(s_copy.items())) - - remove_stoich_val_std = dict(map(lambda x : (x[0], x[1] / math.fabs(x[1])), s_copy.items())) - remove_stoich_val_rev = dict(map(lambda x : (x[0], -1 * x[1]), remove_stoich_val_std.items())) - #print(remove_stoich_val, remove_stoich_val_rev) + + remove_stoich_val_std = dict( + map(lambda x: (x[0], x[1] / math.fabs(x[1])), s_copy.items()) + ) + remove_stoich_val_rev = dict( + map(lambda x: (x[0], -1 * x[1]), remove_stoich_val_std.items()) + ) + # print(remove_stoich_val, remove_stoich_val_rev) hashes = { - 'std' : std, - 'rev' : rev, - 'no_h_std' : h_std, - 'no_h_rev' : h_rev, - 'no_s_std' : hash(frozenset(remove_stoich_val_std.items())), - 'no_s_rev' : hash(frozenset(remove_stoich_val_rev.items())) + "std": std, + "rev": rev, + "no_h_std": h_std, + "no_h_rev": h_rev, + "no_s_std": hash(frozenset(remove_stoich_val_std.items())), + "no_s_rev": hash(frozenset(remove_stoich_val_rev.items())), } return hashes - + def filter_hash(ccs): clusters = [] for cc in ccs: ids = set() for id in cc: - if not id.endswith('@HASH'): + if not id.endswith("@HASH"): ids.add(id) if len(ids) > 1: clusters.append(ids) @@ -185,7 +198,7 @@ def replace_keys(s, replace_map): if i in replace_map: s_[replace_map[i]] = s[i] else: - #print('not found', i) + # print('not found', i) s_[i] = s[i] return s_ @@ -197,16 +210,16 @@ def replace_pkeys(s, replace_map): if i in replace_map: s_[(replace_map[i], p[1])] = s[p] else: - #print('not found', i) + # print('not found', i) s_[p] = s[p] return s_ -def hash_it(rxns, hasher, stoich_f = lambda x : x): +def hash_it(rxns, hasher, stoich_f=lambda x: x): rxn_to_hash = {} all_hashes = {} for rxn in rxns: - rxn_id = '{}@{}'.format(rxn.id, rxn.database) + rxn_id = "{}@{}".format(rxn.id, rxn.database) hashes = hasher(stoich_f(rxn.cstoichiometry)) rxn_to_hash[rxn_id] = hashes for h in hashes: @@ -219,9 +232,9 @@ def hash_it(rxns, hasher, stoich_f = lambda x : x): return rxn_to_hash, all_hashes -def hasher(s, ex1 = []): +def hasher(s, ex1=[]): s_copy = copy.deepcopy(s) - #print(s_copy) + # print(s_copy) std = hash(frozenset(s_copy.items())) for a in s_copy: s_copy[a] = -1 * s_copy[a] @@ -231,90 +244,83 @@ def hasher(s, ex1 = []): delete = [] for o in ex1: for p in s_copy: - #print(f'{o} == {p[0]}') + # print(f'{o} == {p[0]}') if o == p[0]: delete.append(p) - - #print(f'delete: {delete}') + + # print(f'delete: {delete}') for p in delete: del s_copy[p] - - #print(s_copy) + + # print(s_copy) h_std = hash(frozenset(s_copy.items())) for a in s_copy: s_copy[a] = -1 * s_copy[a] h_rev = hash(frozenset(s_copy.items())) - - hashes = { - 'std' : std, - 'rev' : rev, - 'h_std' : h_std, - 'h_rev' : h_rev - } + + hashes = {"std": std, "rev": rev, "h_std": h_std, "h_rev": h_rev} return hashes -def cluster_reactions(rxns, hasher = hasher, stoich_f = lambda x : x): +def cluster_reactions(rxns, hasher=hasher, stoich_f=lambda x: x): rxn_to_hash, all_hashes = hash_it(rxns, hasher, stoich_f) g = nx.Graph() for h in all_hashes: for h_val in all_hashes[h]: - #print(h, h_val, all_hashes[h][h_val]) + # print(h, h_val, all_hashes[h][h_val]) for i in all_hashes[h][h_val]: - g.add_edge(str(h_val) + '@HASH', i) - #print(prev, i) - #break + g.add_edge(str(h_val) + "@HASH", i) + # print(prev, i) + # break ccs = nx.algorithms.connected_components(g) ccs = [cc for cc in ccs] ccs = filter_hash(ccs) - print('clusters:', len(ccs)) - + print("clusters:", len(ccs)) + return ccs class ExternalReference: - def __init__(self, id, namespace): self.id = id self.namespace = namespace - + def __str__(self): return "{}@{}".format(self.id, self.namespace) - + def __repr__(self): return "{}@{}".format(self.id, self.namespace) - + def __eq__(self, o): return self.id == o.id and self.namespace == o.namespace - + def __hash__(self): return hash(self.id) * 7 + hash(self.namespace) class MapValidator: - def __init__(self): self.mapping = {} self.valid_identifiers = {} - + def load(self, mapping): pass - + def add_valid_identifiers(self, id, ns): if not ns in self.valid_identifiers: self.valid_identifiers[ns] = set() self.valid_identifiers[ns].add(id) - + def add_annotation(self, e, annotation_id, ns, ns_id): if not type(e) == ExternalReference: - logger.warning('Entity must be type of ExternalReference') + logger.warning("Entity must be type of ExternalReference") return None if e.namespace in self.valid_identifiers: if not e.id in self.valid_identifiers[e.namespace]: - logger.warning('Invalid identifier for [%s]: %s', e.namespace, e.id) + logger.warning("Invalid identifier for [%s]: %s", e.namespace, e.id) return None if not e in self.mapping: self.mapping[e] = {} @@ -323,11 +329,11 @@ def add_annotation(self, e, annotation_id, ns, ns_id): if not ns in self.mapping[e][annotation_id]: self.mapping[e][annotation_id][ns] = set() self.mapping[e][annotation_id][ns].add(ns_id) - + @staticmethod def add_map_annotation(a, b): - #print(a) - #print(b) + # print(a) + # print(b) for ns in b: if not ns in a: a[ns] = set() @@ -336,50 +342,46 @@ def add_map_annotation(a, b): def expand(self, annotation_id1, annotation_id2, namespace): for e in self.mapping: - if annotation_id1 in self.mapping[e] and \ - namespace in self.mapping[e][annotation_id1]: + if ( + annotation_id1 in self.mapping[e] + and namespace in self.mapping[e][annotation_id1] + ): for i in self.mapping[e][annotation_id1][namespace]: iref = ExternalReference(i, namespace) - if iref in self.mapping and \ - annotation_id2 in self.mapping[iref]: + if iref in self.mapping and annotation_id2 in self.mapping[iref]: target = self.mapping[e][annotation_id1] transfer = self.mapping[iref][annotation_id2] MapValidator.add_map_annotation(target, transfer) - #print(e, validator.mapping[e]) - #break - + # print(e, validator.mapping[e]) + # break + @staticmethod def matcher(a, b): if a == b: - return { - 'value' : 'MATCH', - 'data' : set(a) - } - return { - 'value' : 'FAIL', - 'data' : (set(a), set(b)) - } - - def compare(self, annotation_id1, annotation_id2, namespace, matcher = None): + return {"value": "MATCH", "data": set(a)} + return {"value": "FAIL", "data": (set(a), set(b))} + + def compare(self, annotation_id1, annotation_id2, namespace, matcher=None): if matcher == None: matcher = MapValidator.matcher result = {} for e in self.mapping: - if annotation_id1 in self.mapping[e] and \ - annotation_id2 in self.mapping[e] and \ - namespace in self.mapping[e][annotation_id1] and \ - namespace in self.mapping[e][annotation_id2]: + if ( + annotation_id1 in self.mapping[e] + and annotation_id2 in self.mapping[e] + and namespace in self.mapping[e][annotation_id1] + and namespace in self.mapping[e][annotation_id2] + ): actual = self.mapping[e][annotation_id1][namespace] expected = self.mapping[e][annotation_id2][namespace] result[str(e)] = matcher(actual, expected) return result - - + + class ModelSEEDMapper: - def __init__(self, ms, s_hash, m_hash, cpd_to_seed): self.s_hlib = StoichiometryHashLibrary(s_hash) self.m_hlib = CStoichiometryHashLibrary(m_hash) @@ -387,17 +389,19 @@ def __init__(self, ms, s_hash, m_hash, cpd_to_seed): for rxn_id in ms.reactions: rxn = ms.get_seed_reaction(rxn_id) cstoichiometry = rxn.cstoichiometry - cmps = set(map(lambda x : x[1], cstoichiometry)) + cmps = set(map(lambda x: x[1], cstoichiometry)) if not rxn.is_obsolete and not rxn.is_transport: if len(cmps) == 1: - stoichiometry = dict(map(lambda x : (x[0][0], x[1]), cstoichiometry.items())) + stoichiometry = dict( + map(lambda x: (x[0][0], x[1]), cstoichiometry.items()) + ) self.s_hlib.hash_stoichiometry(rxn_id, stoichiometry) elif not rxn.is_obsolete: if len(cmps) > 1: self.m_hlib.hash_stoichiometry(rxn_id, cstoichiometry) - - logger.info('Single Compartment Reactions: %d', len(self.s_hlib.rxn_to_hash)) - logger.info('Multi Compartment Reactions: %d', len(self.m_hlib.rxn_to_hash)) + + logger.info("Single Compartment Reactions: %d", len(self.s_hlib.rxn_to_hash)) + logger.info("Multi Compartment Reactions: %d", len(self.m_hlib.rxn_to_hash)) @staticmethod def get_cstoichiometry_model(rxn): @@ -406,27 +410,34 @@ def get_cstoichiometry_model(rxn): for m in metabolites: cstoichiometry[(m.id, m.compartment)] = metabolites[m] return cstoichiometry - + def remap_compound(self, id): if id in self.cpd_to_seed: return self.cpd_to_seed[id] return id - + def match(self, model_rxn): - + cstoichiometry = ModelSEEDMapper.get_cstoichiometry_model(model_rxn) - cmps = list(set(map(lambda x : x[1], cstoichiometry))) + cmps = list(set(map(lambda x: x[1], cstoichiometry))) match = {} - + logger.debug("[%s] %s %s", model_rxn.id, model_rxn, cmps) if len(cmps) == 1: - stoichiometry = dict(map(lambda x : (x[0][0], x[1]), cstoichiometry.items())) - stoichiometry = dict(map(lambda x : (self.remap_compound(x[0]), x[1]), stoichiometry.items())) + stoichiometry = dict(map(lambda x: (x[0][0], x[1]), cstoichiometry.items())) + stoichiometry = dict( + map(lambda x: (self.remap_compound(x[0]), x[1]), stoichiometry.items()) + ) logger.debug("[%s] %s", model_rxn.id, stoichiometry) match = self.s_hlib.match(stoichiometry) elif len(cmps) > 1: - cstoichiometry = dict(map(lambda x : ((self.remap_compound(x[0][0]), x[0][1]), x[1]), cstoichiometry.items())) + cstoichiometry = dict( + map( + lambda x: ((self.remap_compound(x[0][0]), x[0][1]), x[1]), + cstoichiometry.items(), + ) + ) logger.debug("[%s] %s", model_rxn.id, cstoichiometry) match = self.m_hlib.match(cstoichiometry) - - return match \ No newline at end of file + + return match diff --git a/modelseedpy/biochem/transporters.py b/modelseedpy/biochem/transporters.py index 456bcd9f..8fe71ec7 100644 --- a/modelseedpy/biochem/transporters.py +++ b/modelseedpy/biochem/transporters.py @@ -12,35 +12,35 @@ def is_transport_pts(rxn): if not o[1] in parts: parts[o[1]] = {} parts[o[1]][o[0]] = cstoichiometry[o] - if o[0] == 'cpd00061': + if o[0] == "cpd00061": pep = True - elif o[0] == 'cpd00020': + elif o[0] == "cpd00020": pyr = True else: other = True if not len(parts) == 2: return (False, None, None, None, None) - #print(rxn.data['definition']) + # print(rxn.data['definition']) inside = None outside = None for o in parts: compounds = set(parts[o]) - #print(compounds) - if 'cpd00061' in compounds and 'cpd00020' in compounds: + # print(compounds) + if "cpd00061" in compounds and "cpd00020" in compounds: if inside == None: inside = o else: - print('multiple match') + print("multiple match") else: outside = o - #print(inside, outside) + # print(inside, outside) if inside == None or outside == None: return (False, None, None, None, None) - - outside_compounds = set(filter(lambda x : not x == 'cpd00067', set(parts[outside]))) + + outside_compounds = set(filter(lambda x: not x == "cpd00067", set(parts[outside]))) transport_compound = set(parts[outside]).pop() - t = 'import' # if parts[inside][transport_compound] < 0 else 'import' - #print(transport_compound) + t = "import" # if parts[inside][transport_compound] < 0 else 'import' + # print(transport_compound) if len(outside_compounds) == 1: return True, inside, outside, t, transport_compound else: @@ -59,42 +59,50 @@ def is_transport_abc(rxn): if not o[1] in parts: parts[o[1]] = {} parts[o[1]][o[0]] = cstoichiometry[o] - if o[0] == 'cpd00001': + if o[0] == "cpd00001": h2o = True - elif o[0] == 'cpd00002': + elif o[0] == "cpd00002": atp = True - elif o[0] == 'cpd00008': + elif o[0] == "cpd00008": adp = True - elif o[0] == 'cpd00009': + elif o[0] == "cpd00009": pi = True else: pass - #print(parts) + # print(parts) if not len(parts) == 2: return (False, None, None, None, None) inside = None outside = None for o in parts: compounds = set(parts[o]) - #print(compounds) - if 'cpd00002' in compounds and 'cpd00008' in compounds and 'cpd00009' in compounds: + # print(compounds) + if ( + "cpd00002" in compounds + and "cpd00008" in compounds + and "cpd00009" in compounds + ): if inside == None: inside = o else: - print('multiple match') + print("multiple match") else: outside = o - #print(inside, outside) + # print(inside, outside) if inside == None or outside == None: - return (False, None, None, None, None) - #print(parts) - outside_compounds = set(filter(lambda x : not x == 'cpd00067', set(parts[outside]))) + return (False, None, None, None, None) + # print(parts) + outside_compounds = set(filter(lambda x: not x == "cpd00067", set(parts[outside]))) transport_compound = set(parts[outside]).pop() - #print(transport_compound, parts[outside], parts[inside]) - if transport_compound == None or not transport_compound in parts[outside] or not transport_compound in parts[inside]: + # print(transport_compound, parts[outside], parts[inside]) + if ( + transport_compound == None + or not transport_compound in parts[outside] + or not transport_compound in parts[inside] + ): return (False, None, None, None, None) - t = 'export' if parts[inside][transport_compound] < 0 else 'import' + t = "export" if parts[inside][transport_compound] < 0 else "import" if len(outside_compounds) == 1: return atp and adp and h2o and pi, inside, outside, t, transport_compound else: @@ -102,7 +110,6 @@ def is_transport_abc(rxn): class TransportersPipeline: - def __init__(self, modelseed_database, annotation_api): self.db = modelseed_database self.annotation_api = annotation_api @@ -111,14 +118,14 @@ def __init__(self, modelseed_database, annotation_api): self.t_abc = {} self.t_others = {} self.t_abc, self.t_pts, self.t_permeases, self.t_others = self.get_t_class() - + def get_cpd_alias(self): cpd_alias = {} for cpd_id in self.db.compounds: cpd = self.db.get_seed_compound(cpd_id) cpd_alias[cpd.id] = cpd.name return cpd_alias - + def collect_roles(self, query): """ WHERE n.key CONTAINS 'symporter' @@ -130,12 +137,12 @@ def collect_roles(self, query): loop = True page = 0 while loop: - a, b = self.annotation_api.page_nodes2('Function', page, 10, query) + a, b = self.annotation_api.page_nodes2("Function", page, 10, query) if a is None: loop = False else: for o in a: - nfunction = self.annotation_api.get_function_by_uid(o['n'].id) + nfunction = self.annotation_api.get_function_by_uid(o["n"].id) subfunctions = nfunction.sub_functions if len(subfunctions) > 0: for subfunction in subfunctions: @@ -143,9 +150,9 @@ def collect_roles(self, query): role_sn = normalize_role(role_str) if role_sn not in abc_roles: abc_roles[role_sn] = set() - abc_roles[role_sn].add(role_str) + abc_roles[role_sn].add(role_str) else: - role_str = o['n']['key'] + role_str = o["n"]["key"] role_sn = normalize_role(role_str) if role_sn not in abc_roles: abc_roles[role_sn] = set() @@ -179,43 +186,47 @@ def get_compounds_to_reaction(self, t_abc, ban, is_transport_function): rxn = t_abc[rxn_id] is_transport, inside, outside, t, cpd_id = is_transport_function(rxn) # print(rxn_id, b, inside, outside, t, cpd_id) - if is_transport and t == 'import': + if is_transport and t == "import": if cpd_id not in compounds_to_reaction: compounds_to_reaction[cpd_id] = (rxn, inside, outside) else: - print('!', rxn_id, cpd_id, compounds_to_reaction[cpd_id][0].id) + print("!", rxn_id, cpd_id, compounds_to_reaction[cpd_id][0].id) return compounds_to_reaction - + def f1(self, df_abc, t_abc, ban, is_transport_function): - compounds_to_reaction = self.get_compounds_to_reaction(t_abc, ban, is_transport_function) + compounds_to_reaction = self.get_compounds_to_reaction( + t_abc, ban, is_transport_function + ) missing_abc_reaction = set() reaction_roles = {} role_reactions = {} for row_id, d in df_abc.iterrows(): - if not pd.isna(d['compound']): - for cpd_id in d['compound'].split('/'): - if not d['roles'] in role_reactions: - role_reactions[d['roles']] = {} + if not pd.isna(d["compound"]): + for cpd_id in d["compound"].split("/"): + if not d["roles"] in role_reactions: + role_reactions[d["roles"]] = {} if cpd_id in compounds_to_reaction: rxn, inside, outside = compounds_to_reaction[cpd_id] if not rxn.id in reaction_roles: reaction_roles[rxn.id] = set() - reaction_roles[rxn.id].add(d['roles']) - role_reactions[d['roles']][cpd_id] = compounds_to_reaction[cpd_id] + reaction_roles[rxn.id].add(d["roles"]) + role_reactions[d["roles"]][cpd_id] = compounds_to_reaction[ + cpd_id + ] else: - role_reactions[d['roles']][cpd_id] = None + role_reactions[d["roles"]][cpd_id] = None missing_abc_reaction.add(cpd_id) return missing_abc_reaction, reaction_roles, role_reactions - + def report(self, role_reactions): for role_str in role_reactions: print(role_str) for cpd_id in role_reactions[role_str]: - print('\t', cpd_id) + print("\t", cpd_id) if role_reactions[role_str][cpd_id] == None: - print('\t', 'missing reaction') + print("\t", "missing reaction") else: rxn, inside, outside = role_reactions[role_str][cpd_id] - cmp_alias = {inside : 'in', outside : 'out'} - #print('\t', rxn.id, ':', to_str2(rxn, cmp_alias, cpd_alias)) - print('\t', rxn.id, ':', rxn.build_reaction_string(True, cmp_alias)) + cmp_alias = {inside: "in", outside: "out"} + # print('\t', rxn.id, ':', to_str2(rxn, cmp_alias, cpd_alias)) + print("\t", rxn.id, ":", rxn.build_reaction_string(True, cmp_alias)) diff --git a/modelseedpy/biochem/utils.py b/modelseedpy/biochem/utils.py index 12f7645a..e23b6043 100644 --- a/modelseedpy/biochem/utils.py +++ b/modelseedpy/biochem/utils.py @@ -7,9 +7,9 @@ def get_mapping(df, valid_databases, pd): mapping = {} for id, row in df.iterrows(): mapping[id] = {} - #print(dir(row)) + # print(dir(row)) for db in df.keys(): - #print(db) + # print(db) if db in valid_databases: value = row[db] if not pd.isna(value): @@ -23,12 +23,14 @@ def atom_count(formula): chem_mw.mass(formula) return chem_mw.proportions except ValueError: - warn(f'The {formula} formula is invalid') + warn(f"The {formula} formula is invalid") return None def is_valid_formula(f, pt): - warn('The "utils.is_valid_formula" is deprecated in favor of "utils.molecular_weight(formula)"') + warn( + 'The "utils.is_valid_formula" is deprecated in favor of "utils.molecular_weight(formula)"' + ) return molecular_weight(f) @@ -37,15 +39,14 @@ def molecular_weight(formula): try: return chem_mw.mass(formula) except ValueError: - warn(f'The {formula} formula is invalid') + warn(f"The {formula} formula is invalid") return None class PeriodicTable: - def __init__(self): - self.elements_v = {ele.symbol:ele.protons for ele in periodic_table} - self.elements = {ele.symbol:ele.name for ele in periodic_table} + self.elements_v = {ele.symbol: ele.protons for ele in periodic_table} + self.elements = {ele.symbol: ele.name for ele in periodic_table} def get_element_name(self, e): if e in self.elements: diff --git a/modelseedpy/community/__init__.py b/modelseedpy/community/__init__.py index 7b94ceaa..ebf07888 100644 --- a/modelseedpy/community/__init__.py +++ b/modelseedpy/community/__init__.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import + # import pyximport; pyximport.install(language_level=3) # improve computational speed from modelseedpy.community.mscommunity import * diff --git a/modelseedpy/community/commkineticpkg.py b/modelseedpy/community/commkineticpkg.py index 9d47f9e5..81e1479e 100644 --- a/modelseedpy/community/commkineticpkg.py +++ b/modelseedpy/community/commkineticpkg.py @@ -7,23 +7,38 @@ from modelseedpy.community.mscommunity import MSCommunity from modelseedpy.core.fbahelper import FBAHelper -#Base class for FBA packages +# Base class for FBA packages class CommKineticPkg(BaseFBAPkg): - def __init__(self,model): - BaseFBAPkg.__init__(self,model,"community kinetics",{},{"commkin":"string"}) + def __init__(self, model): + BaseFBAPkg.__init__( + self, model, "community kinetics", {}, {"commkin": "string"} + ) - def build_package(self,kinetic_coef,community_model=None): - self.validate_parameters({},[],{ - "kinetic_coef":kinetic_coef, - "community":community_model if community_model else MSCommunity(self.model) - }) + def build_package(self, kinetic_coef, community_model=None): + self.validate_parameters( + {}, + [], + { + "kinetic_coef": kinetic_coef, + "community": community_model + if community_model + else MSCommunity(self.model), + }, + ) for species in self.parameters["community"].species: self.build_constraint(species) - def build_constraint(self,species): - coef = {species.biomasses[0].forward_variable:-1*self.parameters["kinetic_coef"]} + def build_constraint(self, species): + coef = { + species.biomasses[0].forward_variable: -1 * self.parameters["kinetic_coef"] + } for reaction in self.model.reactions: - if int(FBAHelper.rxn_compartment(reaction)[1:]) == species.index and reaction != species.biomasses[0]: + if ( + int(FBAHelper.rxn_compartment(reaction)[1:]) == species.index + and reaction != species.biomasses[0] + ): coef[reaction.forward_variable] = 1 coef[reaction.reverse_variable] = 1 - return BaseFBAPkg.build_constraint(self,"commkin",None,0,coef,"Species"+str(species.index)) \ No newline at end of file + return BaseFBAPkg.build_constraint( + self, "commkin", None, 0, coef, "Species" + str(species.index) + ) diff --git a/modelseedpy/community/dfbapkg.py b/modelseedpy/community/dfbapkg.py index 8dcc5819..5a53a38c 100644 --- a/modelseedpy/community/dfbapkg.py +++ b/modelseedpy/community/dfbapkg.py @@ -2,6 +2,7 @@ from scipy.constants import milli, hour, minute, day, femto from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg + # from modelseedpy.core.fbahelper import FBAHelper from collections import OrderedDict from optlang.symbolics import Zero @@ -10,39 +11,50 @@ from matplotlib import pyplot from pprint import pprint from datetime import date -from math import inf +from math import inf import pandas + # import cython import json, re, os - + def isnumber(string): try: float(string) - remainder = re.sub('([0-9.\-eE])', '', str(string)) + remainder = re.sub("([0-9.\-eE])", "", str(string)) except: try: int(string) - remainder = re.sub('[0-9.-eE])', '', str(string)) + remainder = re.sub("[0-9.-eE])", "", str(string)) except: return False - if remainder == '': + if remainder == "": return True + class dFBAPkg(BaseFBAPkg): - def __init__(self, - model, # Cobrakbase model - modelseed_db_path: str, # local path to the ModelSEED Database - solver: str = 'glpk', # specifies the LP solver - warnings: bool = True, verbose: bool = False, printing: bool = False, jupyter: bool = False - ): + def __init__( + self, + model, # Cobrakbase model + modelseed_db_path: str, # local path to the ModelSEED Database + solver: str = "glpk", # specifies the LP solver + warnings: bool = True, + verbose: bool = False, + printing: bool = False, + jupyter: bool = False, + ): # define the parameter and variable dictionaries - BaseFBAPkg.__init__(self, model, "BasedFBA", {"met": "metabolite"}, {"conc": 'metabolite'}) + BaseFBAPkg.__init__( + self, model, "BasedFBA", {"met": "metabolite"}, {"conc": "metabolite"} + ) self.pkgmgr.addpkgs(["FullThermoPkg"]) # self.parameters["modelseed_api"] = FBAHelper.get_modelseed_db_api(self.parameters["modelseed_db_path"]) - + # define simulation conditions - self.warnings: bool = warnings; self.verbose: bool = verbose; self.printing: bool = printing; self.jupyter: bool = jupyter + self.warnings: bool = warnings + self.verbose: bool = verbose + self.printing: bool = printing + self.jupyter: bool = jupyter self.model = model self.model.solver = solver @@ -51,52 +63,66 @@ def __init__(self, for met in self.model.metabolites: self.met_ids[met.id] = met.name self.met_names.append(met.name) - + # user functions def print_lp(self, filename=None): - BaseFBAPkg.print_lp(self, filename.removesuffix('.lp')) - - def simulate(self, - kinetics_path: str = None, # the path of the kinetics data JSON file - initial_concentrations_M: dict = {}, # a dictionary of the initial metabolic concentrations , which supplants concentrations from the defined kinetics data - total_time: float = 200, timestep: float = 20, # total simulation time and the simulation timestep in minutes - export_name: str = None, export_directory: str = None, # the location to which simulation content will be exported - chemostat_L: float = None, feed_profile: dict = {}, # the volume (l) and feed profile for a chemostat simulation, where None ignores a chemostat - exchange_rate: float = None, # the flow rate (Molar/Liter) of addition to and removal from the chemostat system - thermo_constraints: bool = False, # specifies whether thermodynamic constraints will be layered with the kinetic constraints - kinetics_data: dict = {}, # A dictionary of custom kinetics data - temperature: float = 25, p_h: float = 7, # simulation conditions - cellular_dry_mass_fg: float = 222, # mass of the simulated cell in femtograms - cellular_fL: float = 1, # volume of the simulated cell in femtoliters - figure_title: str = 'Metabolic perturbation', # title of the concentrations figure - included_metabolites: list = [], # A list of the metabolites that will be graphically displayed - labeled_plots: bool = True, # specifies whether plots will be individually labeled - visualize: bool = True, export: bool = True # specifies whether simulation content will be visualized or exported, respectively - ): + BaseFBAPkg.print_lp(self, filename.removesuffix(".lp")) + + def simulate( + self, + kinetics_path: str = None, # the path of the kinetics data JSON file + initial_concentrations_M: dict = {}, # a dictionary of the initial metabolic concentrations , which supplants concentrations from the defined kinetics data + total_time: float = 200, + timestep: float = 20, # total simulation time and the simulation timestep in minutes + export_name: str = None, + export_directory: str = None, # the location to which simulation content will be exported + chemostat_L: float = None, + feed_profile: dict = {}, # the volume (l) and feed profile for a chemostat simulation, where None ignores a chemostat + exchange_rate: float = None, # the flow rate (Molar/Liter) of addition to and removal from the chemostat system + thermo_constraints: bool = False, # specifies whether thermodynamic constraints will be layered with the kinetic constraints + kinetics_data: dict = {}, # A dictionary of custom kinetics data + temperature: float = 25, + p_h: float = 7, # simulation conditions + cellular_dry_mass_fg: float = 222, # mass of the simulated cell in femtograms + cellular_fL: float = 1, # volume of the simulated cell in femtoliters + figure_title: str = "Metabolic perturbation", # title of the concentrations figure + included_metabolites: list = [], # A list of the metabolites that will be graphically displayed + labeled_plots: bool = True, # specifies whether plots will be individually labeled + visualize: bool = True, + export: bool = True, # specifies whether simulation content will be visualized or exported, respectively + ): # define the dataframe for the time series content - self.cellular_dry_mass_fg: float = cellular_dry_mass_fg*femto; self.cellular_fL: float = cellular_fL*femto - self.parameters['timesteps'] = int(total_time/timestep) - self.timestep_value: float = timestep; self.total_time: float = total_time + self.cellular_dry_mass_fg: float = cellular_dry_mass_fg * femto + self.cellular_fL: float = cellular_fL * femto + self.parameters["timesteps"] = int(total_time / timestep) + self.timestep_value: float = timestep + self.total_time: float = total_time self.constrained = OrderedDict() self.solutions = [] self.minimum = inf - + # define experimental conditions - self.parameters['pH'], self.parameters['temperature'] = p_h, temperature - self.variables['elapsed_time'] = 0 - + self.parameters["pH"], self.parameters["temperature"] = p_h, temperature + self.variables["elapsed_time"] = 0 + # define initial concentrations self.initial_concentrations_M = initial_concentrations_M self._initial_concentrations(kinetics_path, kinetics_data) - + # apply constraints and system specifications - chemostat_requirements = [isnumber(chemostat_L), feed_profile != {}, isnumber(exchange_rate)] + chemostat_requirements = [ + isnumber(chemostat_L), + feed_profile != {}, + isnumber(exchange_rate), + ] if any(chemostat_requirements) and not all(chemostat_requirements): - warn(f'The chemostat_L ({chemostat_L}), feed_profile ({feed_profile}), and exchange_rate ({exchange_rate}) parameters must all be defined to simulate a chemostat.') + warn( + f"The chemostat_L ({chemostat_L}), feed_profile ({feed_profile}), and exchange_rate ({exchange_rate}) parameters must all be defined to simulate a chemostat." + ) if thermo_constraints: self.pkgmgr.addpkgs(["FullThermoPkg"]) self.pkgmgr.getpkg("FullThermoPkg").build_package() - + # determine the reactions for which kinetics are predefined self.defined_reactions = {} for rxn in self.model.reactions: @@ -104,228 +130,310 @@ def simulate(self, self.defined_reactions[rxn.name] = rxn # execute FBA for each timestep - for self.timestep in range(1,self.parameters['timesteps']+1): + for self.timestep in range(1, self.parameters["timesteps"] + 1): # calculate custom fluxes, constrain the model, and update concentrations self._define_timestep() self._build_constraints() - self._calculate_kinetics() + self._calculate_kinetics() self._execute_cobra() self._update_concentrations() if all(chemostat_requirements): - self.chemical_moles[self.col] = self.concentrations[self.col]*milli * chemostat_L + self.chemical_moles[self.col] = ( + self.concentrations[self.col] * milli * chemostat_L + ) self._chemostat(feed_profile, exchange_rate, chemostat_L) - - self.variables['elapsed_time'] += self.timestep + + self.variables["elapsed_time"] += self.timestep if self.printing: - print(f'\nobjective value for timestep {self.timestep}: ', self.solutions[-1].objective_value) - + print( + f"\nobjective value for timestep {self.timestep}: ", + self.solutions[-1].objective_value, + ) + # identify the chemicals that dynamically changed in concentrations self.changed, self.unchanged = set(), set() for met_name in self.met_names: - first = self.concentrations.at[met_name, '0 min'] + first = self.concentrations.at[met_name, "0 min"] final = self.concentrations.at[met_name, self.col] if first != final: self.changed.add(met_name) if first == final: self.unchanged.add(met_name) - + # visualize concentration changes over time if visualize: - self._visualize(figure_title,included_metabolites,labeled_plots) + self._visualize(figure_title, included_metabolites, labeled_plots) if export: self._export(export_name, export_directory) - + # view calculations and results if self.verbose: - print('\n\n', 'Changed metabolite concentrations\n', '='*2*len('changed metabolites'), '\n', self.changed) - print('\nConstrained reactions:', self.constrained.keys()) + print( + "\n\n", + "Changed metabolite concentrations\n", + "=" * 2 * len("changed metabolites"), + "\n", + self.changed, + ) + print("\nConstrained reactions:", self.constrained.keys()) elif self.printing: if self.jupyter: - pandas.set_option('max_rows', None) + pandas.set_option("max_rows", None) display(self.concentrations) display(self.fluxes) if self.unchanged == set(): - print('\nAll of the metabolites changed concentration over the simulation') + print( + "\nAll of the metabolites changed concentration over the simulation" + ) else: - print('\n\nUnchanged metabolite concentrations', '\n', '='*2*len('unchanged metabolites'), '\n', self.unchanged) - + print( + "\n\nUnchanged metabolite concentrations", + "\n", + "=" * 2 * len("unchanged metabolites"), + "\n", + self.unchanged, + ) + return self.concentrations, self.fluxes - - #utility functions - def _initial_concentrations(self, - kinetics_path: str = None, # the absolute path to a JSON file of kinetics data - kinetics_data: dict = {}, # a dictionary of kinetics data, which supplants imported data from the kinetics_path - ): + + # utility functions + def _initial_concentrations( + self, + kinetics_path: str = None, # the absolute path to a JSON file of kinetics data + kinetics_data: dict = {}, # a dictionary of kinetics data, which supplants imported data from the kinetics_path + ): # define kinetics of the system self.kinetics_data = {} if kinetics_path: if not os.path.exists(kinetics_path): - raise ValueError('The path {kinetics_data} is not a valid path') + raise ValueError("The path {kinetics_data} is not a valid path") with open(kinetics_path) as data: self.kinetics_data = json.load(data) if kinetics_data != {}: for reaction in kinetics_data: self.kinetics_data[reaction] = kinetics_data[reaction] if self.kinetics_data == {}: - raise ValueError('Kinetics data must be defined.') - + raise ValueError("Kinetics data must be defined.") + # define the DataFrames - self.col = '0 min' - self.concentrations = pandas.DataFrame(index=set(self.met_names), columns=[self.col]) - self.chemical_moles = pandas.DataFrame(index=set(self.met_names), columns=[self.col]) - self.concentrations.index.name = self.chemical_moles.index.name = 'metabolite (\u0394mM)' - - self.fluxes = pandas.DataFrame(index = set(rxn.name for rxn in self.model.reactions), columns = [self.col]) - self.fluxes.index.name = 'reactions (mmol/g_(dw)/hr)' - - # parse the kinetics data + self.col = "0 min" + self.concentrations = pandas.DataFrame( + index=set(self.met_names), columns=[self.col] + ) + self.chemical_moles = pandas.DataFrame( + index=set(self.met_names), columns=[self.col] + ) + self.concentrations.index.name = ( + self.chemical_moles.index.name + ) = "metabolite (\u0394mM)" + + self.fluxes = pandas.DataFrame( + index=set(rxn.name for rxn in self.model.reactions), columns=[self.col] + ) + self.fluxes.index.name = "reactions (mmol/g_(dw)/hr)" + + # parse the kinetics data initial_concentrations = {} for met in self.met_names: self.concentrations.at[str(met), self.col] = float(0) for reaction_name in self.kinetics_data: for condition, datum in self.kinetics_data[reaction_name].items(): - for var in datum['initial_concentrations_M']: - met_id = datum['met_id'][var] + for var in datum["initial_concentrations_M"]: + met_id = datum["met_id"][var] if met_id in self.met_ids: name = self.met_ids[met_id] - if name in self.met_names: - self.concentrations.at[name, self.col] += datum['initial_concentrations_M'][var]/milli - initial_concentrations[met_id] = self.concentrations.at[name, self.col] + if name in self.met_names: + self.concentrations.at[name, self.col] += ( + datum["initial_concentrations_M"][var] / milli + ) + initial_concentrations[met_id] = self.concentrations.at[ + name, self.col + ] else: if self.warnings: - warn(f"KineticsError: The {name} reagent ({var}) in the {datum['substituted_rate_law']} rate law is not defined by the model.") + warn( + f"KineticsError: The {name} reagent ({var}) in the {datum['substituted_rate_law']} rate law is not defined by the model." + ) else: if self.warnings: - warn(f"KineticsError: The {name} reagent ({var}) in the {datum['substituted_rate_law']} rate law is not recognized by the ModelSEED Database.") - + warn( + f"KineticsError: The {name} reagent ({var}) in the {datum['substituted_rate_law']} rate law is not recognized by the ModelSEED Database." + ) + # incorporate custom initial concentrations - if isinstance(self.initial_concentrations_M, dict) and self.initial_concentrations_M != {}: + if ( + isinstance(self.initial_concentrations_M, dict) + and self.initial_concentrations_M != {} + ): for met_id in self.initial_concentrations_M: met_name = self.met_ids[met_id] if met_name not in self.concentrations.index: if self.warnings: - warn(f'InitialConcError: The {met_id} ({met_name}) metabolite is not defined by the model.') + warn( + f"InitialConcError: The {met_id} ({met_name}) metabolite is not defined by the model." + ) else: - self.concentrations.at[met_name, self.col] = self.initial_concentrations_M[met_id]*milli - initial_concentrations[met_id] = self.concentrations.at[name, self.col] + self.concentrations.at[met_name, self.col] = ( + self.initial_concentrations_M[met_id] * milli + ) + initial_concentrations[met_id] = self.concentrations.at[ + name, self.col + ] self.initial_concentrations_M = initial_concentrations - - def _define_timestep(self,): - self.col = f'{self.timestep*self.timestep_value} min' - self.previous_col = f'{(self.timestep-1)*self.timestep_value} min' - self.concentrations[self.col] = [float(0) for ind in self.concentrations.index] #!!! + def _define_timestep( + self, + ): + self.col = f"{self.timestep*self.timestep_value} min" + self.previous_col = f"{(self.timestep-1)*self.timestep_value} min" + self.concentrations[self.col] = [ + float(0) for ind in self.concentrations.index + ] #!!! self.fluxes[self.col] = [nan for ind in self.fluxes.index] - - - def _calculate_kinetics(self): + + def _calculate_kinetics(self): for reaction_name in self.kinetics_data: fluxes = [] - for source in self.kinetics_data[reaction_name]: + for source in self.kinetics_data[reaction_name]: incalculable = False datum = self.kinetics_data[reaction_name][source] - if "substituted_rate_law" in datum: #!!! Statistics of aggregating each condition should be provided for provenance. - remainder = re.sub('([0-9A-Za-z/()e\-\+\.\*])', '', datum["substituted_rate_law"]) - if remainder == '': + if ( + "substituted_rate_law" in datum + ): #!!! Statistics of aggregating each condition should be provided for provenance. + remainder = re.sub( + "([0-9A-Za-z/()e\-\+\.\*])", "", datum["substituted_rate_law"] + ) + if remainder == "": # define each variable concentration conc_dict = {} - for var in datum['met_id']: - met_id = datum['met_id'][var] + for var in datum["met_id"]: + met_id = datum["met_id"][var] if len(var) == 1: - conc_dict[var] = self.concentrations.at[self.met_ids[met_id], self.previous_col]*milli # concentrations are mM + conc_dict[var] = ( + self.concentrations.at[ + self.met_ids[met_id], self.previous_col + ] + * milli + ) # concentrations are mM # warn(f'MetaboliteError: The {self.met_ids[met_id]} chemical is not recognized by the ModelSEED Database.') if conc_dict != {}: locals().update(conc_dict) flux = eval(datum["substituted_rate_law"]) - + # average or overwrite flux calculations based upon the alignment of the data conditions with the simulation conditions - add_or_write = 'a' - if 'metadata' in self.kinetics_data[reaction_name][source]: - add_or_write = self.__find_data_match(reaction_name, source) - if add_or_write == 'a': - fluxes.append(flux) - elif add_or_write == 'w': + add_or_write = "a" + if "metadata" in self.kinetics_data[reaction_name][source]: + add_or_write = self.__find_data_match( + reaction_name, source + ) + if add_or_write == "a": + fluxes.append(flux) + elif add_or_write == "w": fluxes = [flux] else: if self.warnings: - warn(f'MetaboliteError: The {reaction_name} reaction possesses unpredictable chemicals.') + warn( + f"MetaboliteError: The {reaction_name} reaction possesses unpredictable chemicals." + ) else: - if self.warnings: - warn('RateLawError: The {datum["substituted_rate_law"]} rate law contains unknown characters: {remainder}') - else: + if self.warnings: + warn( + 'RateLawError: The {datum["substituted_rate_law"]} rate law contains unknown characters: {remainder}' + ) + else: if self.warnings: - warn(f'RateLawError: The {datum} datum lacks a rate law.') - + warn(f"RateLawError: The {datum} datum lacks a rate law.") + flux = mean(fluxes) if isnumber(flux): if reaction_name in self.defined_reactions: self.__set_constraints(reaction_name, flux) - self.fluxes.at[reaction_name, self.col] = flux + self.fluxes.at[reaction_name, self.col] = flux if self.printing: - print('\n') + print("\n") else: if self.warnings: - warn(f'ReactionError: The {reaction_name} reaction, with a flux of {flux}, is not described by the model.') + warn( + f"ReactionError: The {reaction_name} reaction, with a flux of {flux}, is not described by the model." + ) else: - if self.warnings: - warn(f'FluxError: The {reaction_name} reaction flux {datum["substituted_rate_law"]} value {flux} is not numberic.') - + if self.warnings: + warn( + f'FluxError: The {reaction_name} reaction flux {datum["substituted_rate_law"]} value {flux} is not numberic.' + ) + def _execute_cobra(self): - # execute the COBRA model + # execute the COBRA model solution = self.model.optimize() self.solutions.append(solution) for rxn in self.model.reactions: if not isnumber(self.fluxes.at[rxn.name, self.col]): self.fluxes.at[rxn.name, self.col] = solution.fluxes[rxn.id] - - def _update_concentrations(self,): - for met in self.model.metabolites: + + def _update_concentrations( + self, + ): + for met in self.model.metabolites: self.concentrations.at[self.met_ids[met.id], self.col] = 0 for rxn in met.reactions: # flux units: mmol/(g_(dry weight)*hour) stoich = rxn.metabolites[met] - flux = self.fluxes.at[rxn.name, self.col] - delta_conc = stoich * (flux * self.timestep_value*(minute/hour) * self.cellular_dry_mass_fg/self.cellular_fL) + flux = self.fluxes.at[rxn.name, self.col] + delta_conc = stoich * ( + flux + * self.timestep_value + * (minute / hour) + * self.cellular_dry_mass_fg + / self.cellular_fL + ) self.concentrations.at[self.met_ids[met.id], self.col] += delta_conc - - def _visualize(self, - figure_title, # defines the title of the concentrations figure - included_metabolites, # specifies which metabolites will be included in the figure - labeled_plots # specifies which plots will be labeled in the figure - ): + + def _visualize( + self, + figure_title, # defines the title of the concentrations figure + included_metabolites, # specifies which metabolites will be included in the figure + labeled_plots, # specifies which plots will be labeled in the figure + ): # define the figure - pyplot.rcParams['figure.figsize'] = (11, 7) - pyplot.rcParams['figure.dpi'] = 150 - + pyplot.rcParams["figure.figsize"] = (11, 7) + pyplot.rcParams["figure.dpi"] = 150 + self.figure, ax = pyplot.subplots() ax.set_title(figure_title) - ax.set_ylabel('Concentrations (mM)') - + ax.set_ylabel("Concentrations (mM)") + x_axis_scalar, unit = self.__x_axis_determination() - ax.set_xlabel('Time '+unit) - legend_list, times = [], [t*self.timestep_value*x_axis_scalar for t in range(self.parameters['timesteps']+1)] - + ax.set_xlabel("Time " + unit) + legend_list, times = [], [ + t * self.timestep_value * x_axis_scalar + for t in range(self.parameters["timesteps"] + 1) + ] + # determine the plotted metabolites and the scale of the figure axis - bbox = (1,1) + bbox = (1, 1) if included_metabolites == []: - bbox = (1.7,1) + bbox = (1.7, 1) for chem in self.changed: - if max(self.concentrations.loc[[chem]].values[0].tolist()) > 1e-2: # an arbitrary concentration threshold for plotting on the figure + if ( + max(self.concentrations.loc[[chem]].values[0].tolist()) > 1e-2 + ): # an arbitrary concentration threshold for plotting on the figure included_metabolites.append(chem) - + log_axis = False minimum, maximum = inf, -inf printed_concentrations = {} for chem in self.changed: if chem in included_metabolites: - concentrations = self.concentrations.loc[[chem]].values[0].tolist() # molar - + concentrations = ( + self.concentrations.loc[[chem]].values[0].tolist() + ) # molar + # determine the concentration range max_conc = max([x if x > 1e-9 else 0 for x in concentrations]) maximum = max(maximum, max_conc) min_conc = min([x if x > 1e-9 else 0 for x in concentrations]) minimum = min(minimum, min_conc) - + # plot chemicals with perturbed concentrations ax.plot(times, concentrations) if len(chem) > 25: @@ -333,136 +441,197 @@ def _visualize(self, if not concentrations[0] < 1e-9: legend_list.append(chem) else: - legend_list.append(f'(rel) {chem}') - + legend_list.append(f"(rel) {chem}") + # design the proper location of the overlaid labels in the figure if labeled_plots: for i, conc in enumerate(concentrations): if conc > 1e-9: - x_value = i*self.timestep_value + x_value = i * self.timestep_value vertical_adjustment = 0 if x_value in printed_concentrations: - vertical_adjustment = (maximum - minimum)*.05 + vertical_adjustment = (maximum - minimum) * 0.05 if log_axis: - vertical_adjustment = log10(maximum - minimum)/3 - ax.text(x_value, conc+vertical_adjustment, f"{chem} - {round(conc, 4)}", ha="left") + vertical_adjustment = log10(maximum - minimum) / 3 + ax.text( + x_value, + conc + vertical_adjustment, + f"{chem} - {round(conc, 4)}", + ha="left", + ) printed_concentrations[x_value] = conc break # finalize figure details - if maximum > 10*minimum: + if maximum > 10 * minimum: log_axis = True - ax.set_yscale('log') + ax.set_yscale("log") ax.set_xticks(times) ax.grid(True) - ax.legend(legend_list, title = 'Changed chemicals', loc='upper right', bbox_to_anchor = bbox, title_fontsize = 'x-large', fontsize = 'large') - - - def _export(self, - export_name: str, # the folder name to which the simulation content will be exported - export_directory: str # the directory within which the simulation folder will be created - ): - # define a unique simulation name + ax.legend( + legend_list, + title="Changed chemicals", + loc="upper right", + bbox_to_anchor=bbox, + title_fontsize="x-large", + fontsize="large", + ) + + def _export( + self, + export_name: str, # the folder name to which the simulation content will be exported + export_directory: str, # the directory within which the simulation folder will be created + ): + # define a unique simulation name directory = os.getcwd() if export_directory is not None: directory = os.path.dirname(export_directory) if export_name is None: - export_name = '-'.join([re.sub(' ', '_', str(x)) for x in [date.today(), 'dFBA', self.model.name, f'{self.total_time} min']]) - + export_name = "-".join( + [ + re.sub(" ", "_", str(x)) + for x in [ + date.today(), + "dFBA", + self.model.name, + f"{self.total_time} min", + ] + ] + ) + simulation_number = -1 while os.path.exists(os.path.join(directory, export_name)): simulation_number += 1 - export_name = re.sub('(\-\d+$)', '', export_name) - export_name = '-'.join([export_name, str(simulation_number)]) - - self.parameters['simulation_path'] = self.simulation_path = os.path.join(directory, export_name) + export_name = re.sub("(\-\d+$)", "", export_name) + export_name = "-".join([export_name, str(simulation_number)]) + + self.parameters["simulation_path"] = self.simulation_path = os.path.join( + directory, export_name + ) os.mkdir(self.simulation_path) - + # export simulation content - self.fluxes.to_csv(os.path.join(self.simulation_path, 'fluxes.csv')) - self.concentrations.to_csv(os.path.join(self.simulation_path, 'concentrations.csv')) - + self.fluxes.to_csv(os.path.join(self.simulation_path, "fluxes.csv")) + self.concentrations.to_csv( + os.path.join(self.simulation_path, "concentrations.csv") + ) + times = self.fluxes.columns - with open(os.path.join(self.simulation_path, 'objective_values.csv'), 'w') as obj_val: - obj_val.write('min,objective_value') + with open( + os.path.join(self.simulation_path, "objective_values.csv"), "w" + ) as obj_val: + obj_val.write("min,objective_value") for sol in self.solutions: index = self.solutions.index(sol) - time = re.sub('(\smin)', '', times[index]) - obj_val.write(f'\n{time},{sol.objective_value}') - + time = re.sub("(\smin)", "", times[index]) + obj_val.write(f"\n{time},{sol.objective_value}") + # export the parameters - parameters = {'parameter':[], 'value':[]} + parameters = {"parameter": [], "value": []} for parameter in self.parameters: - parameters['parameter'].append(parameter) - parameters['value'].append(self.parameters[parameter]) - + parameters["parameter"].append(parameter) + parameters["value"].append(self.parameters[parameter]) + parameters_table = pandas.DataFrame(parameters) - parameters_table.to_csv(os.path.join(self.simulation_path, 'parameters.csv')) - + parameters_table.to_csv(os.path.join(self.simulation_path, "parameters.csv")) + # export the figure - self.figure.savefig(os.path.join(self.simulation_path, 'changed_concentrations.svg')) + self.figure.savefig( + os.path.join(self.simulation_path, "changed_concentrations.svg") + ) if self.verbose: if not self.jupyter: - self.figure.show() - + self.figure.show() + def _build_constraints(self): # create a metabolite variable that prevents negative concentrations - timestep_hr = self.timestep_value * (minute/hour) - for met in self.model.metabolites: + timestep_hr = self.timestep_value * (minute / hour) + for met in self.model.metabolites: if met.id in self.initial_concentrations_M: coef = {} for rxn in met.reactions: - stoich = timestep_hr*rxn.metabolites[met] # The product of the reaction stoichiometry and the timestep, for the integration of the steady-state + stoich = ( + timestep_hr * rxn.metabolites[met] + ) # The product of the reaction stoichiometry and the timestep, for the integration of the steady-state coef[rxn.forward_variable] = stoich coef[rxn.reverse_variable] = -stoich if stoich < 0: coef[rxn.forward_variable] = -stoich coef[rxn.reverse_variable] = stoich - + # build the metabolite constraint if met.id in self.constraints["conc"]: self.model.remove_cons_vars(self.constraints["conc"][met.id]) self.constraints["conc"][met.id] = self.model.problem.Constraint( - Zero, lb=-self.concentrations.at[met.name, self.previous_col], ub=None, name=f'{met.id}_conc' - ) + Zero, + lb=-self.concentrations.at[met.name, self.previous_col], + ub=None, + name=f"{met.id}_conc", + ) self.model.add_cons_vars(self.constraints["conc"][met.id]) self.model.solver.update() - + self.constraints["conc"][met.id].set_linear_coefficients(coef) self.model.solver.update() - - # var = BaseFBAPkg.build_variable(self,"met",0,None,"continuous",met) + + # var = BaseFBAPkg.build_variable(self,"met",0,None,"continuous",met) # BaseFBAPkg.build_constraint(self,"conc",0,None,{met:1},met) - - def _chemostat(self, feed_profile, # a dictionary of the chemicals and their concentrations in the influent feed - exchange_rate, # the L/hr flow rate of the feed and extraction of the chemostat - chemostat_L # the volume (l) of the chemostat - ): - L_changed = exchange_rate*self.timestep_value + + def _chemostat( + self, + feed_profile, # a dictionary of the chemicals and their concentrations in the influent feed + exchange_rate, # the L/hr flow rate of the feed and extraction of the chemostat + chemostat_L, # the volume (l) of the chemostat + ): + L_changed = exchange_rate * self.timestep_value # chemostat addition for chem_id, conc in feed_profile.items(): chem_name = self.met_ids[chem_id] - self.chemical_moles.at[chem_name, self.col] += conc*L_changed - self.concentrations.at[chem_name, self.col] = (self.chemical_moles.at[chem_name, self.col]/milli/chemostat_L) # normalize to the chemostat volume - + self.chemical_moles.at[chem_name, self.col] += conc * L_changed + self.concentrations.at[chem_name, self.col] = ( + self.chemical_moles.at[chem_name, self.col] / milli / chemostat_L + ) # normalize to the chemostat volume + # chemostat subtraction for met in self.model.metabolites: - if met.compartment[0] == 'e': - self.chemical_moles.at[met.name, self.col] -= (self.concentrations.at[met.name, self.col]*L_changed) - self.concentrations.at[met.name, self.col] = (self.chemical_moles.at[met.name, self.col]/milli/chemostat_L) # normalize to the chemostat volume - - + if met.compartment[0] == "e": + self.chemical_moles.at[met.name, self.col] -= ( + self.concentrations.at[met.name, self.col] * L_changed + ) + self.concentrations.at[met.name, self.col] = ( + self.chemical_moles.at[met.name, self.col] / milli / chemostat_L + ) # normalize to the chemostat volume + # nested functions - def __find_data_match(self, - reaction_name: str, # specifies the name of the given reaction - source: str # specifies which datum of the enzymatic data will be used, where multiple data entries are present - ): + def __find_data_match( + self, + reaction_name: str, # specifies the name of the given reaction + source: str, # specifies which datum of the enzymatic data will be used, where multiple data entries are present + ): # identifies the datum whose experimental conditions most closely matches the simulation conditions temperature_deviation = ph_deviation = 0 - if isnumber(self.kinetics_data[reaction_name][source]['metadata']["Temperature"]): - temperature_deviation = abs(self.parameters['temperature'] - float(self.kinetics_data[reaction_name][source]['metadata']["Temperature"]))/self.parameters['temperature'] - if isnumber(self.kinetics_data[reaction_name][source]['metadata']["pH"]): - ph_deviation = abs(self.parameters['pH'] - float(self.kinetics_data[reaction_name][source]['metadata']["pH"]))/self.parameters['pH'] + if isnumber( + self.kinetics_data[reaction_name][source]["metadata"]["Temperature"] + ): + temperature_deviation = ( + abs( + self.parameters["temperature"] + - float( + self.kinetics_data[reaction_name][source]["metadata"][ + "Temperature" + ] + ) + ) + / self.parameters["temperature"] + ) + if isnumber(self.kinetics_data[reaction_name][source]["metadata"]["pH"]): + ph_deviation = ( + abs( + self.parameters["pH"] + - float(self.kinetics_data[reaction_name][source]["metadata"]["pH"]) + ) + / self.parameters["pH"] + ) # equally weight between temperature and pH deviation from the simulation conditions old_minimum = self.minimum @@ -470,36 +639,41 @@ def __find_data_match(self, self.minimum = min(deviation, self.minimum) if old_minimum == self.minimum: - return 'a' # append to an existing list of data + return "a" # append to an existing list of data elif deviation == self.minimum: - return 'w' # construct a new list of data - - def __set_constraints(self, - reaction_name: str, flux: float # specify the name and flux of the given reaction, respectively - ): + return "w" # construct a new list of data + + def __set_constraints( + self, + reaction_name: str, + flux: float, # specify the name and flux of the given reaction, respectively + ): rxn = self.defined_reactions[reaction_name] - rxn_name = re.sub(' ', '_', rxn.name) + rxn_name = re.sub(" ", "_", rxn.name) if rxn_name in self.constrained: self.model.remove_cons_vars(self.constrained[rxn_name]) self.model.solver.update() - self.constrained[rxn_name] = self.model.problem.Constraint(rxn.flux_expression, lb=flux, ub=flux, name=f'{rxn_name}_kinetics') + self.constrained[rxn_name] = self.model.problem.Constraint( + rxn.flux_expression, lb=flux, ub=flux, name=f"{rxn_name}_kinetics" + ) self.model.add_cons_vars(self.constrained[rxn_name]) self.model.solver.update() if self.verbose: - print(self.model.constraints[f'{rxn_name}_kinetics']) - - - def __x_axis_determination(self,): + print(self.model.constraints[f"{rxn_name}_kinetics"]) + + def __x_axis_determination( + self, + ): scalar = minute - time = self.total_time*scalar - unit = 's' + time = self.total_time * scalar + unit = "s" if time > 600: - unit = 'min' + unit = "min" scalar = 1 if time > 7200: - unit = 'hr' - scalar = 1/hour + unit = "hr" + scalar = 1 / hour if time > 2e5: - scalar = 1/day - unit = 'days' - return scalar, unit \ No newline at end of file + scalar = 1 / day + unit = "days" + return scalar, unit diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index 66567bd7..a1139934 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -3,7 +3,8 @@ from modelseedpy.core.msmodelutl import MSModelUtil from modelseedpy.core.msgapfill import MSGapfill from modelseedpy.core.fbahelper import FBAHelper -#from modelseedpy.fbapkg.gapfillingpkg import default_blacklist + +# from modelseedpy.fbapkg.gapfillingpkg import default_blacklist from modelseedpy.core import MSATPCorrection from cobra import Model, Reaction, Metabolite from cobra.core.dictlist import DictList @@ -14,7 +15,8 @@ from pandas import DataFrame from pprint import pprint import logging -#import itertools + +# import itertools import cobra import networkx import sigfig @@ -22,97 +24,136 @@ logger = logging.getLogger(__name__) + class CommunityModelSpecies: - def __init__(self, - community, # MSCommunity environment - biomass_cpd, # metabolite in the biomass reaction - names=[], # names of the community species - name=None, # the name of a species - index=None # the index of the species - ): + def __init__( + self, + community, # MSCommunity environment + biomass_cpd, # metabolite in the biomass reaction + names=[], # names of the community species + name=None, # the name of a species + index=None, # the index of the species + ): self.community, self.biomass_cpd = community, biomass_cpd print(self.biomass_cpd.compartment) - self.index = int(self.biomass_cpd.compartment[1:]) # if index is None else index + self.index = int( + self.biomass_cpd.compartment[1:] + ) # if index is None else index self.abundance = 0 if self.biomass_cpd in self.community.primary_biomass.metabolites: - self.abundance = abs(self.community.primary_biomass.metabolites[self.biomass_cpd]) + self.abundance = abs( + self.community.primary_biomass.metabolites[self.biomass_cpd] + ) if name: self.id = name elif self.index < len(names): - self.id = names[self.index-1] + self.id = names[self.index - 1] else: if "species_name" in self.biomass_cpd.annotation: self.id = self.biomass_cpd.annotation["species_name"] else: - self.id = "Species"+str(self.index) - - logger.info("Making atp hydrolysis reaction for species: "+self.id) - atp_rxn = FBAHelper.add_atp_hydrolysis(self.community.model,"c"+str(self.index)) + self.id = "Species" + str(self.index) + + logger.info("Making atp hydrolysis reaction for species: " + self.id) + atp_rxn = FBAHelper.add_atp_hydrolysis( + self.community.model, "c" + str(self.index) + ) # FBAHelper.add_autodrain_reactions_to_self.community_model(self.community.model) # !!! FIXME This FBAHelper function is not defined. self.atp_hydrolysis = atp_rxn["reaction"] self.biomass_drain = None self.biomasses, self.reactions = [], [] for rxn in self.community.model.reactions: - if int(FBAHelper.rxn_compartment(rxn)[1:]) == self.index and 'bio' not in rxn.name: + if ( + int(FBAHelper.rxn_compartment(rxn)[1:]) == self.index + and "bio" not in rxn.name + ): self.reactions.append(rxn) if self.biomass_cpd in rxn.metabolites: if rxn.metabolites[self.biomass_cpd] == 1 and len(rxn.metabolites) > 1: self.biomasses.append(rxn) - elif len(rxn.metabolites) == 1 and rxn.metabolites[self.biomass_cpd] < 0: + elif ( + len(rxn.metabolites) == 1 and rxn.metabolites[self.biomass_cpd] < 0 + ): self.biomass_drain = rxn - + if len(self.biomasses) == 0: - logger.critical("No biomass reaction found for species "+self.id) + logger.critical("No biomass reaction found for species " + self.id) if not self.biomass_drain: - logger.info("Making biomass drain reaction for species: "+self.id) - self.biomass_drain = Reaction(id="DM_"+self.biomass_cpd.id, - name="DM_" + self.biomass_cpd.name, - lower_bound=0, upper_bound=100) + logger.info("Making biomass drain reaction for species: " + self.id) + self.biomass_drain = Reaction( + id="DM_" + self.biomass_cpd.id, + name="DM_" + self.biomass_cpd.name, + lower_bound=0, + upper_bound=100, + ) self.community.model.add_reactions([self.biomass_drain]) self.biomass_drain.add_metabolites({self.biomass_cpd: -1}) - self.biomass_drain.annotation["sbo"] = 'SBO:0000627' - + self.biomass_drain.annotation["sbo"] = "SBO:0000627" + def disable_species(self): for reaction in self.community.model.reactions: if int(FBAHelper.rxn_compartment(reaction)[1:]) == self.index: reaction.upper_bound = reaction.lower_bound = 0 - + def compute_max_biomass(self): if len(self.biomasses) == 0: - logger.critical("No biomass reaction found for species "+self.id) - self.community.model.objective = self.community.model.problem.Objective(Zero,direction="max") - self.community.model.objective.set_linear_coefficients({self.biomasses[0].forward_variable:1}) + logger.critical("No biomass reaction found for species " + self.id) + self.community.model.objective = self.community.model.problem.Objective( + Zero, direction="max" + ) + self.community.model.objective.set_linear_coefficients( + {self.biomasses[0].forward_variable: 1} + ) if self.community.lp_filename != None: - self.community.print_lp(self.community.lp_filename+"_"+self.id+"_Biomass") + self.community.print_lp( + self.community.lp_filename + "_" + self.id + "_Biomass" + ) return self.community.model.optimize() - + def compute_max_atp(self): if not self.atp_hydrolysis: - logger.critical("No ATP hydrolysis found for species:"+self.id) - self.community.model.objective = self.community.model.problem.Objective(Zero,direction="max") - self.community.model.objective.set_linear_coefficients({self.atp_hydrolysis.forward_variable:1}) + logger.critical("No ATP hydrolysis found for species:" + self.id) + self.community.model.objective = self.community.model.problem.Objective( + Zero, direction="max" + ) + self.community.model.objective.set_linear_coefficients( + {self.atp_hydrolysis.forward_variable: 1} + ) if self.community.lp_filename: - self.community.print_lp(self.community.lp_filename+"_"+self.id+"_ATP") + self.community.print_lp(self.community.lp_filename + "_" + self.id + "_ATP") return self.community.model.optimize() + class MSCommunity: - def __init__(self, model=None, # the model that will be defined - models:list=None, # the list of models that will be assembled into a community - names=[], abundances=None, # names and abundances of the community species - pfba = True, # specify whether parsimonious FBA will be simulated - lp_filename = None # specify a filename to create an lp file - ): + def __init__( + self, + model=None, # the model that will be defined + models: list = None, # the list of models that will be assembled into a community + names=[], + abundances=None, # names and abundances of the community species + pfba=True, # specify whether parsimonious FBA will be simulated + lp_filename=None, # specify a filename to create an lp file + ): self.lp_filename, self.pfba = lp_filename, pfba self.gapfillings = {} - - #Define Data attributes as None - self.solution = self.biomass_cpd = self.primary_biomass = self.biomass_drain = None - self.msgapfill = self.element_uptake_limit = self.kinetic_coeff = self.modelseed_db_path = None + + # Define Data attributes as None + self.solution = ( + self.biomass_cpd + ) = self.primary_biomass = self.biomass_drain = None + self.msgapfill = ( + self.element_uptake_limit + ) = self.kinetic_coeff = self.modelseed_db_path = None self.species = DictList() - + # defining the models - self.model = model if not models else MSCommunity.build_from_species_models( - models, names=names, abundances=abundances, cobra_model=True) + self.model = ( + model + if not models + else MSCommunity.build_from_species_models( + models, names=names, abundances=abundances, cobra_model=True + ) + ) self.pkgmgr = MSPackageManager.get_pkg_mgr(self.model) msid_cobraid_hash = FBAHelper.msid_hash(self.model) if "cpd11416" not in msid_cobraid_hash: @@ -125,12 +166,18 @@ def __init__(self, model=None, # the model that will be defined for reaction in self.model.reactions: if self.biomass_cpd in reaction.metabolites: print(reaction) - if reaction.metabolites[self.biomass_cpd] == 1 and len(reaction.metabolites) > 1: - print('primary biomass defined', reaction) + if ( + reaction.metabolites[self.biomass_cpd] == 1 + and len(reaction.metabolites) > 1 + ): + print("primary biomass defined", reaction) self.primary_biomass = reaction - elif reaction.metabolites[self.biomass_cpd] < 0 and len(reaction.metabolites) == 1: + elif ( + reaction.metabolites[self.biomass_cpd] < 0 + and len(reaction.metabolites) == 1 + ): self.biomass_drain = reaction - elif 'c' in self.biomass_cpd.compartment: + elif "c" in self.biomass_cpd.compartment: other_biomass_cpds.append(self.biomass_cpd) for biomass_cpd in other_biomass_cpds: print(biomass_cpd) @@ -138,12 +185,19 @@ def __init__(self, model=None, # the model that will be defined self.species.append(species_obj) if abundances: self.set_abundance(abundances) - - + @staticmethod - def build_from_species_models(models, msdb_path, model_id=None, name=None, names=[], abundances=None, cobra_model=False): + def build_from_species_models( + models, + msdb_path, + model_id=None, + name=None, + names=[], + abundances=None, + cobra_model=False, + ): """Merges the input list of single species metabolic models into a community metabolic model - + Parameters ---------- models : list @@ -160,22 +214,28 @@ def build_from_species_models(models, msdb_path, model_id=None, name=None, names Hash of relative abundances for input models in community model cobra_model : bool Specifies whether the raw COBRA model is returned - + Returns ------- Cobra.Model Community model object - + Raises ------ """ # compatabilize the models - mscompat = MSCompatibility(modelseed_db_path = msdb_path) - models = mscompat.align_exchanges(models, conflicts_file_name='exchanges_conflicts.json', model_names = names) - models = mscompat.standardize(models, conflicts_file_name = 'standardized_exchange_metabolites.json', model_names = names) - + mscompat = MSCompatibility(modelseed_db_path=msdb_path) + models = mscompat.align_exchanges( + models, conflicts_file_name="exchanges_conflicts.json", model_names=names + ) + models = mscompat.standardize( + models, + conflicts_file_name="standardized_exchange_metabolites.json", + model_names=names, + ) + # construct the new model - newmodel = Model(model_id,name) + newmodel = Model(model_id, name) biomass_compounds = [] biomass_index = 2 biomass_indices = [1] @@ -186,14 +246,14 @@ def build_from_species_models(models, msdb_path, model_id=None, name=None, names # model_index+=1 print([rxn.id for rxn in model.reactions if "bio" in rxn.id]) print(model_index, model.id) - #Rename metabolites + # Rename metabolites for met in model.metabolites: - #Renaming compartments + # Renaming compartments output = MSModelUtil.parse_id(met) if output is None: if met.compartment[0] != "e": met.id += str(model_index) - met.compartment = met.compartment[0]+str(model_index) + met.compartment = met.compartment[0] + str(model_index) else: met.compartment = "e0" else: @@ -204,34 +264,37 @@ def build_from_species_models(models, msdb_path, model_id=None, name=None, names elif output[1] == "e": met.compartment = "e0" else: - met.compartment = output[1]+str(model_index) - met.id = output[0]+"_"+output[1]+str(model_index) + met.compartment = output[1] + str(model_index) + met.id = output[0] + "_" + output[1] + str(model_index) new_metabolites.add(met) if "cpd11416_c" in met.id: print(met.id, model.id) biomass_compounds.append(met) - #Rename reactions + # Rename reactions for rxn in model.reactions: if rxn.id[0:3] != "EX_": - if re.search('^(bio)(\d+)$', rxn.id): + if re.search("^(bio)(\d+)$", rxn.id): print(biomass_indices) - index = int(rxn.id.removeprefix('bio')) + index = int(rxn.id.removeprefix("bio")) if index not in biomass_indices: biomass_indices.append(index) biomass_indices_dict[model.id] = index - print(rxn.id, '2') + print(rxn.id, "2") else: - rxn_id = "bio"+str(biomass_index) + rxn_id = "bio" + str(biomass_index) if rxn_id not in model_reaction_ids: - print(rxn_id, '1') + print(rxn_id, "1") rxn.id = rxn_id biomass_indices.append(biomass_index) biomass_indices_dict[model.id] = index else: - print(rxn_id, '3') - for i in range(len(models)*2): - rxn_id = "bio"+str(i) - if rxn_id not in model_reaction_ids and i not in biomass_indices: + print(rxn_id, "3") + for i in range(len(models) * 2): + rxn_id = "bio" + str(i) + if ( + rxn_id not in model_reaction_ids + and i not in biomass_indices + ): rxn.id = rxn_id biomass_indices.append(i) biomass_indices_dict[model.id] = i @@ -243,58 +306,66 @@ def build_from_species_models(models, msdb_path, model_id=None, name=None, names if "e" not in rxn.compartment.id: rxn.id += str(model_index) elif output[1] != "e": - rxn.id = output[0]+"_"+output[1]+str(model_index) + rxn.id = output[0] + "_" + output[1] + str(model_index) if output[2] == "": - rxn.id = rxn.id+str(model_index) + rxn.id = rxn.id + str(model_index) new_reactions.add(rxn) - #Adding new reactions and compounds to base model + # Adding new reactions and compounds to base model newmodel.add_reactions(FBAHelper.filter_cobra_set(new_reactions)) newmodel.add_metabolites(FBAHelper.filter_cobra_set(new_metabolites)) - - #Create community biomass + + # Create community biomass comm_biomass = Metabolite("cpd11416_c0", None, "Community biomass", 0, "c0") metabolites = {comm_biomass: 1} - metabolites.update({cpd:-1/len(biomass_compounds) for cpd in biomass_compounds}) - comm_biorxn = Reaction(id="bio1", name= "bio1", lower_bound=0, upper_bound=100) + metabolites.update( + {cpd: -1 / len(biomass_compounds) for cpd in biomass_compounds} + ) + comm_biorxn = Reaction(id="bio1", name="bio1", lower_bound=0, upper_bound=100) comm_biorxn.add_metabolites(metabolites) newmodel.add_reactions([comm_biorxn]) - + # create a biomass sink reaction newutl = MSModelUtil(newmodel) - newutl.add_exchanges_for_metabolites([comm_biomass],0,100,'SK_') + newutl.add_exchanges_for_metabolites([comm_biomass], 0, 100, "SK_") if cobra_model: return newmodel, biomass_indices_dict - return MSCommunity(model=newmodel,names=names,abundances=abundances), biomass_indices_dict - - #Manipulation functions - def set_abundance(self,abundances): - #ensure normalization + return ( + MSCommunity(model=newmodel, names=names, abundances=abundances), + biomass_indices_dict, + ) + + # Manipulation functions + def set_abundance(self, abundances): + # ensure normalization total_abundance = sum([abundances[species] for species in abundances]) - #map abundances to all species + # map abundances to all species for species in abundances: - abundances[species] = abundances[species]/total_abundance + abundances[species] = abundances[species] / total_abundance if species in self.species: self.species.get_by_id(species).abundance = abundances[species] - #remake the primary biomass reaction based on abundances + # remake the primary biomass reaction based on abundances if self.primary_biomass is None: logger.critical("Primary biomass reaction not found in community model") - all_metabolites = {self.biomass_cpd:1} + all_metabolites = {self.biomass_cpd: 1} for species in self.species: - all_metabolites[species.biomass_cpd] = -1*abundances[species.id] - self.primary_biomass.add_metabolites(all_metabolites,combine=False) - - def set_objective(self,target = None,minimize = False): #!!! Mustn't a multilevel objective be set for community models? + all_metabolites[species.biomass_cpd] = -1 * abundances[species.id] + self.primary_biomass.add_metabolites(all_metabolites, combine=False) + + def set_objective( + self, target=None, minimize=False + ): #!!! Mustn't a multilevel objective be set for community models? if target is None: target = self.primary_biomass.id sense = "max" if minimize: sense = "min" self.model.objective = self.model.problem.Objective( - self.model.reactions.get_by_id(target).flux_expression, - direction=sense + self.model.reactions.get_by_id(target).flux_expression, direction=sense ) - - def constrain(self,element_uptake_limit = None, kinetic_coeff = None,modelseed_db_path = None): + + def constrain( + self, element_uptake_limit=None, kinetic_coeff=None, modelseed_db_path=None + ): # applying uptake constraints self.element_uptake_limit = element_uptake_limit if element_uptake_limit: @@ -302,53 +373,61 @@ def constrain(self,element_uptake_limit = None, kinetic_coeff = None,modelseed_d # applying kinetic constraints self.kinetic_coeff = kinetic_coeff if kinetic_coeff: - self.pkgmgr.getpkg("CommKineticPkg").build_package(kinetic_coeff,self) + self.pkgmgr.getpkg("CommKineticPkg").build_package(kinetic_coeff, self) # applying FullThermo constraints self.modelseed_db_path = modelseed_db_path if modelseed_db_path: - self.pkgmgr.getpkg("FullThermoPkg").build_package({'modelseed_db_path':modelseed_db_path}) - - #Utility functions - def print_lp(self,filename = None): + self.pkgmgr.getpkg("FullThermoPkg").build_package( + {"modelseed_db_path": modelseed_db_path} + ) + + # Utility functions + def print_lp(self, filename=None): if not filename: filename = self.lp_filename if filename: - with open(filename+".lp", 'w') as out: + with open(filename + ".lp", "w") as out: out.write(str(self.model.solver)) out.close() - - def compute_interactions(self, solution = None, # the COBRA simulation solution that will be parsed and visualized - threshold: int = 1, #!!! What is this threshold? - visualize: bool = True, # specifies whether the net flux will be depicted in a network diagram - export_directory: str = None, # specifies the directory to which the network diagram and associated datatable will be exported, where None does not export the content - node_metabolites: bool = True, # specifies whether the metabolites of each node will be printed - x_offset: float = 0.15, # specifies the x-axis buffer between each species node and its metabolite list in the network diagram - show_figure: bool = True # specifies whether the figure will be printed to the console - ): - #Check for solution + + def compute_interactions( + self, + solution=None, # the COBRA simulation solution that will be parsed and visualized + threshold: int = 1, #!!! What is this threshold? + visualize: bool = True, # specifies whether the net flux will be depicted in a network diagram + export_directory: str = None, # specifies the directory to which the network diagram and associated datatable will be exported, where None does not export the content + node_metabolites: bool = True, # specifies whether the metabolites of each node will be printed + x_offset: float = 0.15, # specifies the x-axis buffer between each species node and its metabolite list in the network diagram + show_figure: bool = True, # specifies whether the figure will be printed to the console + ): + # Check for solution if not solution: - solution = self.solution + solution = self.solution if not solution: logger.warning("No feasible solution!") return None - - #Initialize data - metabolite_data, species_data, species_collection = {}, {"Environment":{}}, {"Environment":{}} - data = {"IDs":[],"Metabolites/Donor":[], "Environment":[]} + + # Initialize data + metabolite_data, species_data, species_collection = ( + {}, + {"Environment": {}}, + {"Environment": {}}, + ) + data = {"IDs": [], "Metabolites/Donor": [], "Environment": []} met_list, species_list = [], [None for i in range(1000)] - #establish spreadsheet infrastructure for only extracellular metabolites + # establish spreadsheet infrastructure for only extracellular metabolites for met in self.model.metabolites: if met.compartment == "e0": met_list.append(met) data["IDs"].append(met.id) data["Metabolites/Donor"].append(met.name) - - metabolite_data[met] = {} + + metabolite_data[met] = {} metabolite_data[met]["Environment"] = 0 for individual in self.species: metabolite_data[met][individual.id] = 0 - + for individual in self.species: species_data[individual.id], species_collection[individual.id] = {}, {} species_list[individual.index] = individual @@ -358,33 +437,46 @@ def compute_interactions(self, solution = None, # the COBRA simula for other in self.species: species_data[individual.id][other.id] = 0 species_collection[individual.id][other.id] = [] - - species_data["Environment"][individual.id] = species_data[individual.id]["Environment"] = 0 - species_collection["Environment"][individual.id], species_collection[individual.id]["Environment"] = [], [] - + + species_data["Environment"][individual.id] = species_data[individual.id][ + "Environment" + ] = 0 + ( + species_collection["Environment"][individual.id], + species_collection[individual.id]["Environment"], + ) = ([], []) + data["IDs"].append("Environment") data["Metabolites/Donor"].append("Environment") for individual in self.species: data["IDs"].append(individual.index) - data["Metabolites/Donor"].append(individual.id+" list") - + data["Metabolites/Donor"].append(individual.id + " list") + # computing net metabolite flux from each reaction for rxn in self.model.reactions: if rxn.id[0:3] == "EX_" and abs(solution.fluxes[rxn.id]) > Zero: - cpd = list(rxn.metabolites.keys())[0] + cpd = list(rxn.metabolites.keys())[0] if cpd in metabolite_data: - metabolite_data[cpd]["Environment"] += -1*solution.fluxes[rxn.id] + metabolite_data[cpd]["Environment"] += -1 * solution.fluxes[rxn.id] if len(rxn.id.split("_")) > 1: comp_index = int(rxn.id.split("_")[-1][1:]) for metabolite in rxn.metabolites: if metabolite in metabolite_data: if species_list[comp_index] != None: - metabolite_data[metabolite][species_list[comp_index].id] += solution.fluxes[rxn.id]*rxn.metabolites[metabolite] - + metabolite_data[metabolite][ + species_list[comp_index].id + ] += (solution.fluxes[rxn.id] * rxn.metabolites[metabolite]) + # translating net metbaolite flux into species interaction flux for met in metabolite_data: - #Iterating through the metabolite producers - total = sum([metabolite_data[met][individual.id] for individual in self.species if metabolite_data[met][individual.id] > Zero]) + # Iterating through the metabolite producers + total = sum( + [ + metabolite_data[met][individual.id] + for individual in self.species + if metabolite_data[met][individual.id] > Zero + ] + ) if metabolite_data[met]["Environment"] > Zero: total += metabolite_data[met]["Environment"] for individual in self.species: @@ -392,24 +484,48 @@ def compute_interactions(self, solution = None, # the COBRA simula # calculate the total net flux between each combination of species, and track the involved metabolites for other in self.species: if metabolite_data[met][other.id] < Zero: - normalized_flux = abs(metabolite_data[met][individual.id]*metabolite_data[met][other.id])/total + normalized_flux = ( + abs( + metabolite_data[met][individual.id] + * metabolite_data[met][other.id] + ) + / total + ) species_data[individual.id][other.id] += normalized_flux if normalized_flux > threshold: - species_collection[individual.id][other.id].append(met.name) + species_collection[individual.id][other.id].append( + met.name + ) # calculate the total net flux between the species and the environment, and track the involved metabolites if metabolite_data[met]["Environment"] < Zero: - normalized_flux = abs(metabolite_data[met][individual.id]*metabolite_data[met]["Environment"])/total + normalized_flux = ( + abs( + metabolite_data[met][individual.id] + * metabolite_data[met]["Environment"] + ) + / total + ) species_data[individual.id]["Environment"] += normalized_flux if normalized_flux > threshold: - species_collection[individual.id]["Environment"].append(met.name) + species_collection[individual.id]["Environment"].append( + met.name + ) if metabolite_data[met]["Environment"] > Zero: for individual in self.species: if metabolite_data[met][individual.id] < Zero: - normalized_flux = abs(metabolite_data[met]["Environment"]*metabolite_data[met][individual.id])/total + normalized_flux = ( + abs( + metabolite_data[met]["Environment"] + * metabolite_data[met][individual.id] + ) + / total + ) species_data["Environment"][individual.id] += normalized_flux if normalized_flux > threshold: - species_collection["Environment"][individual.id].append(met.name) - + species_collection["Environment"][individual.id].append( + met.name + ) + # construct a dataframe for met in met_list: for individual in self.species: @@ -422,126 +538,198 @@ def compute_interactions(self, solution = None, # the COBRA simula for individual in self.species: data["Environment"].append(species_data["Environment"][individual.id]) data["Environment"].append(0) - for individual in self.species: + for individual in self.species: for other in self.species: - data[individual.id].append("; ".join(species_collection[individual.id][other.id])) - data[individual.id].append("; ".join(species_collection[individual.id]["Environment"])) + data[individual.id].append( + "; ".join(species_collection[individual.id][other.id]) + ) + data[individual.id].append( + "; ".join(species_collection[individual.id]["Environment"]) + ) for individual in self.species: - data["Environment"].append("; ".join(species_collection["Environment"][individual.id])) - data["Environment"].append(0), data["IDs"].append("Environment list"), data["Metabolites/Donor"].append("Environment list") - + data["Environment"].append( + "; ".join(species_collection["Environment"][individual.id]) + ) + data["Environment"].append(0), data["IDs"].append("Environment list"), data[ + "Metabolites/Donor" + ].append("Environment list") + self.cross_feeding_df = DataFrame(data) logger.info(self.cross_feeding_df) - + # graph the network diagram if visualize: - self._visualize_cross_feeding(export_directory, node_metabolites, x_offset, show_figure) - + self._visualize_cross_feeding( + export_directory, node_metabolites, x_offset, show_figure + ) + return self.cross_feeding_df - - def _visualize_cross_feeding(self, export_directory, node_metabolites = True, x_offset = 0.15, show_figure = True): + + def _visualize_cross_feeding( + self, export_directory, node_metabolites=True, x_offset=0.15, show_figure=True + ): # construct an efficient DataFrame of the cross-feeding interactions net_cross_feeding = {} for index, row in self.cross_feeding_df.iterrows(): - if re.search('Species\d+', row["Metabolites/Donor"]): - net_cross_feeding[row["Metabolites/Donor"]] = row[len(self.species):] - + if re.search("Species\d+", row["Metabolites/Donor"]): + net_cross_feeding[row["Metabolites/Donor"]] = row[len(self.species) :] + # define species and the metabolite fluxes net_cross_feeding = DataFrame(net_cross_feeding) self.graph = networkx.Graph() species_nums = {} for species in self.species: - species_nums[species.index]= set() + species_nums[species.index] = set() self.graph.add_node(species.index) - for index, entry in net_cross_feeding[f'Species{species.index} list'].iteritems(): - if 'Species' in index and re.search('(\d+)', index).group() != species.index: - species_nums[species.index].update(entry.split('; ')) - + for index, entry in net_cross_feeding[ + f"Species{species.index} list" + ].iteritems(): + if ( + "Species" in index + and re.search("(\d+)", index).group() != species.index + ): + species_nums[species.index].update(entry.split("; ")) + # define the net fluxes for each combination of two species for species_1, species_2 in combinations(list(species_nums.keys()), 2): - species_2_to_1 = net_cross_feeding.at[f'Species{species_2}', f'Species{species_1}'] - species_1_to_2 = net_cross_feeding.at[f'Species{species_1}', f'Species{species_2}'] + species_2_to_1 = net_cross_feeding.at[ + f"Species{species_2}", f"Species{species_1}" + ] + species_1_to_2 = net_cross_feeding.at[ + f"Species{species_1}", f"Species{species_2}" + ] interaction_net_flux = sigfig.round(species_2_to_1 - species_1_to_2, 3) - self.graph.add_edge(species_1,species_2,flux = interaction_net_flux) # The graph plots directionally toward the larger numbered species + self.graph.add_edge( + species_1, species_2, flux=interaction_net_flux + ) # The graph plots directionally toward the larger numbered species # compose the nextwork diagram of net fluxes self.pos = networkx.circular_layout(self.graph) if node_metabolites: for species in self.pos: x, y = self.pos[species] - metabolites = '\n'.join(species_nums[species]) - pyplot.text(x+x_offset, y, metabolites) - networkx.draw_networkx(self.graph,self.pos) - self.labels = networkx.get_edge_attributes(self.graph,'flux') - networkx.draw_networkx_edge_labels(self.graph,self.pos,edge_labels=self.labels) - + metabolites = "\n".join(species_nums[species]) + pyplot.text(x + x_offset, y, metabolites) + networkx.draw_networkx(self.graph, self.pos) + self.labels = networkx.get_edge_attributes(self.graph, "flux") + networkx.draw_networkx_edge_labels( + self.graph, self.pos, edge_labels=self.labels + ) + if export_directory: - pyplot.savefig(os.path.join(export_directory, 'cross_feeding_diagram.svg')) - self.cross_feeding_df.to_csv(os.path.join(export_directory, 'cross_feeding.csv')) - + pyplot.savefig(os.path.join(export_directory, "cross_feeding_diagram.svg")) + self.cross_feeding_df.to_csv( + os.path.join(export_directory, "cross_feeding.csv") + ) + if show_figure: pyplot.show() - - #Analysis functions - def gapfill(self, media = None, target = None, minimize = False,default_gapfill_templates = [], default_gapfill_models = [], test_conditions = [], reaction_scores = {}, blacklist = [], suffix = None, solver = 'glpk'): + + # Analysis functions + def gapfill( + self, + media=None, + target=None, + minimize=False, + default_gapfill_templates=[], + default_gapfill_models=[], + test_conditions=[], + reaction_scores={}, + blacklist=[], + suffix=None, + solver="glpk", + ): if not target: target = self.primary_biomass.id - self.set_objective(target,minimize) - gfname = FBAHelper.medianame(media)+"-"+target + self.set_objective(target, minimize) + gfname = FBAHelper.medianame(media) + "-" + target if suffix: gfname += f"-{suffix}" - self.gapfillings[gfname] = MSGapfill(self.model, default_gapfill_templates, default_gapfill_models, test_conditions, reaction_scores, blacklist) - gfresults = self.gapfillings[gfname].run_gapfilling(media,target, solver = solver) + self.gapfillings[gfname] = MSGapfill( + self.model, + default_gapfill_templates, + default_gapfill_models, + test_conditions, + reaction_scores, + blacklist, + ) + gfresults = self.gapfillings[gfname].run_gapfilling( + media, target, solver=solver + ) if not gfresults: - logger.critical("Gapfilling failed with the specified model, media, and target reaction.") + logger.critical( + "Gapfilling failed with the specified model, media, and target reaction." + ) return None return self.gapfillings[gfname].integrate_gapfill_solution(gfresults) - - def test_individual_species(self,media = None,allow_cross_feeding=True,run_atp=True,run_biomass=True): + + def test_individual_species( + self, media=None, allow_cross_feeding=True, run_atp=True, run_biomass=True + ): self.pkgmgr.getpkg("KBaseMediaPkg").build_package(media) - #Iterating over species and running tests - data = {"Species":[],"Biomass":[],"ATP":[]} + # Iterating over species and running tests + data = {"Species": [], "Biomass": [], "ATP": []} for individual in self.species: data["Species"].append(individual.id) - with self.model: # WITH, here, discards changes after each simulation - #If no interaction allowed, iterate over all other species and disable them + with self.model: # WITH, here, discards changes after each simulation + # If no interaction allowed, iterate over all other species and disable them if not allow_cross_feeding: for indtwo in self.species: if indtwo != individual: indtwo.disable_species() - if run_biomass: #If testing biomass, setting objective to individual species biomass and optimizing + if ( + run_biomass + ): # If testing biomass, setting objective to individual species biomass and optimizing data["Biomass"].append(individual.compute_max_biomass()) - if run_atp: #If testing atp, setting objective to individual species atp and optimizing + if ( + run_atp + ): # If testing atp, setting objective to individual species atp and optimizing data["ATP"].append(individual.compute_max_atp()) df = DataFrame(data) logger.info(df) return df - - def atp_correction(self,core_template, atp_medias, atp_objective="bio2", max_gapfilling=None, gapfilling_delta=0): - self.atpcorrect = MSATPCorrection(self.model,core_template, atp_medias, atp_objective="bio2", max_gapfilling=None, gapfilling_delta=0) - - def predict_abundances(self,media=None,pfba=True,kinetic_coeff = None): - with self.model: # WITH, here, discards changes after each simulation + + def atp_correction( + self, + core_template, + atp_medias, + atp_objective="bio2", + max_gapfilling=None, + gapfilling_delta=0, + ): + self.atpcorrect = MSATPCorrection( + self.model, + core_template, + atp_medias, + atp_objective="bio2", + max_gapfilling=None, + gapfilling_delta=0, + ) + + def predict_abundances(self, media=None, pfba=True, kinetic_coeff=None): + with self.model: # WITH, here, discards changes after each simulation if not kinetic_coeff: kinetic_coeff = self.kinetic_coeff - if not kinetic_coeff: #Kinetic coefficients must be used for this formulation to work - kinetic_coeff = 2000 - self.pkgmgr.getpkg("CommKineticPkg").build_package(kinetic_coeff,self) - + if ( + not kinetic_coeff + ): # Kinetic coefficients must be used for this formulation to work + kinetic_coeff = 2000 + self.pkgmgr.getpkg("CommKineticPkg").build_package(kinetic_coeff, self) + objcoef = {} for species in self.species: objcoef[species.biomasses[0].forward_variable] = 1 - new_objective = self.model.problem.Objective(Zero,direction="max") + new_objective = self.model.problem.Objective(Zero, direction="max") self.model.objective = new_objective new_objective.set_linear_coefficients(objcoef) - self.run(media,pfba) + self.run(media, pfba) return self._compute_relative_abundance_from_solution() return None - - def run(self,media,pfba = None): + + def run(self, media, pfba=None): self.pkgmgr.getpkg("KBaseMediaPkg").build_package(media) self.print_lp() - save_matlab_model(self.model, self.model.name+".mat") + save_matlab_model(self.model, self.model.name + ".mat") if pfba or self.pfba: self._set_solution(cobra.flux_analysis.pfba(self.model)) else: @@ -550,34 +738,38 @@ def run(self,media,pfba = None): return None logger.info(self.model.summary()) return self.solution - - #Internal functions - def _compute_relative_abundance_from_solution(self,solution = None): + # Internal functions + def _compute_relative_abundance_from_solution(self, solution=None): if not solution and not self.solution: logger.warning("No feasible solution!") return None - data = {"Species":[],"Abundance":[]} - totalgrowth = sum([self.solution.fluxes[species.biomasses[0].id] for species in self.species]) + data = {"Species": [], "Abundance": []} + totalgrowth = sum( + [self.solution.fluxes[species.biomasses[0].id] for species in self.species] + ) if totalgrowth == 0: logger.warning("The community did not grow!") return None for species in self.species: data["Species"].append(species.id) - data["Abundance"].append(self.solution.fluxes[species.biomasses[0].id]/totalgrowth) + data["Abundance"].append( + self.solution.fluxes[species.biomasses[0].id] / totalgrowth + ) df = DataFrame(data) logger.info(df) return df - - def _set_solution(self,solution): + + def _set_solution(self, solution): self.solution = None - if solution.status != 'optimal': + if solution.status != "optimal": logger.warning("No solution found for the simulation.") return self.solution = solution - def steady_com(self,): + def steady_com( + self, + ): from reframed.community import SteadyCom, SteadyComVA - + reframed_model = FBAHelper.get_reframed_model(self.model) - \ No newline at end of file diff --git a/modelseedpy/community/mscompatibility.py b/modelseedpy/community/mscompatibility.py index b284d155..10ba5b38 100644 --- a/modelseedpy/community/mscompatibility.py +++ b/modelseedpy/community/mscompatibility.py @@ -6,52 +6,68 @@ from pprint import pprint import json, lzma, re, os -class MSCompatibility(): - def __init__(self, - modelseed_db_path: str, # the local path to the ModelSEEDDatabase repository - printing = True # specifies whether results are printed - ): + +class MSCompatibility: + def __init__( + self, + modelseed_db_path: str, # the local path to the ModelSEEDDatabase repository + printing=True, # specifies whether results are printed + ): self.printing = printing - + # import and parse ModelSEED Database reactions and compounds self.reaction_ids = OrderedDict() self.reactions = {} - for num in range(0,49): - with open(os.path.join(modelseed_db_path, 'Biochemistry', f'reaction_{num:0>2}.json'), 'r') as rxns: + for num in range(0, 49): + with open( + os.path.join( + modelseed_db_path, "Biochemistry", f"reaction_{num:0>2}.json" + ), + "r", + ) as rxns: reactions = json.load(rxns) for rxn in reactions: self.reactions.update(rxn) - self.reaction_ids[rxn['id']] = rxn['name'] - - self.compounds_cross_references, self.compound_names = OrderedDict(), OrderedDict() + self.reaction_ids[rxn["id"]] = rxn["name"] + + self.compounds_cross_references, self.compound_names = ( + OrderedDict(), + OrderedDict(), + ) self.compounds = {} - for num in range(0,38): - with open(os.path.join(modelseed_db_path, 'Biochemistry', f'compound_{num:0>2}.json'), 'r') as cpds: + for num in range(0, 38): + with open( + os.path.join( + modelseed_db_path, "Biochemistry", f"compound_{num:0>2}.json" + ), + "r", + ) as cpds: try: compounds = json.load(cpds) except: - print(f'compound_{num:0>2}.json is probably empty.') + print(f"compound_{num:0>2}.json is probably empty.") continue for cpd in compounds: self.compounds.update(cpd) - self.compounds_cross_references[cpd['id']] = {} - if cpd['aliases'] is not None: - for category in cpd['aliases']: - content = category.split(';') - if 'Name' in category: - content[0] = content[0].split(':')[0].strip() + self.compounds_cross_references[cpd["id"]] = {} + if cpd["aliases"] is not None: + for category in cpd["aliases"]: + content = category.split(";") + if "Name" in category: + content[0] = content[0].split(":")[0].strip() names = [name.strip() for name in content] - names.append(cpd['name']) + names.append(cpd["name"]) for name in names: if name not in self.compound_names: - self.compound_names[name] = cpd['id'] + self.compound_names[name] = cpd["id"] else: - first = content[0].split(':') + first = content[0].split(":") db = first[0].strip() content[0] = first[1] - self.compounds_cross_references[cpd['id']][db] = [x.strip() for x in content] - - + self.compounds_cross_references[cpd["id"]][db] = [ + x.strip() for x in content + ] + # def _parse_modelReactionReagents(self, modelReactionReagents, model_metabolites): # rxn_dict = {} # for cpd in modelReactionReagents: @@ -66,18 +82,24 @@ def __init__(self, # rxn_dict[met] = stoich # return rxn_dict - - def standardize(self, models, # the collection of cobrakbase models that will be compared - metabolites: bool = True, # specifies whether metabolites or reactions (FALSE) will be standardized - exchanges: bool = True, # specifies whether only the exchange reaction will be standardized - conflicts_file_name: str = None, # the metabolite conflicts are stored and organized, where None does not export - model_names: list = None, # specifies the export names of the models - model_format: str = 'json', # specifies to which format the model will be exported - export_directory: str = None # specifies the directory to which all of the content will be exported - ): + + def standardize( + self, + models, # the collection of cobrakbase models that will be compared + metabolites: bool = True, # specifies whether metabolites or reactions (FALSE) will be standardized + exchanges: bool = True, # specifies whether only the exchange reaction will be standardized + conflicts_file_name: str = None, # the metabolite conflicts are stored and organized, where None does not export + model_names: list = None, # specifies the export names of the models + model_format: str = "json", # specifies to which format the model will be exported + export_directory: str = None, # specifies the directory to which all of the content will be exported + ): self.models = models self.unique_mets, self.met_conflicts = OrderedDict(), OrderedDict() - self.unknown_met_ids, self.changed_metabolites, self.changed_reactions= [], [], [] + self.unknown_met_ids, self.changed_metabolites, self.changed_reactions = ( + [], + [], + [], + ) self.changed_ids_count = self.changed_rxn_count = 0 for self.model_index, self.model in enumerate(self.models): # standardize metabolites @@ -88,24 +110,39 @@ def standardize(self, models, # the collection of cobrakbas for met in ex_rxn.metabolites: met, new_met_id, success = self._fix_met(met) try: - ex_rxn.id = 'EX_'+met.id + ex_rxn.id = "EX_" + met.id except: - ex_rxn.id = 'EX_'+new_met_id - if 'cpd' not in met.id and success and new_met_id not in model_metabolites: + ex_rxn.id = "EX_" + new_met_id + if ( + "cpd" not in met.id + and success + and new_met_id not in model_metabolites + ): self.unknown_met_ids.append(met.id) - warn(f'CodeError: The metabolite {met.id} | {met.name} was not corrected to a ModelSEED metabolite.') + warn( + f"CodeError: The metabolite {met.id} | {met.name} was not corrected to a ModelSEED metabolite." + ) else: for met in self.model.metabolites: met, new_met_id, success = self._fix_met(met) - if 'cpd' not in met.id: + if "cpd" not in met.id: self.unknown_met_ids.append(met.id) - warn(f'CodeError: The metabolite {met.id} | {met.name} was not corrected to a ModelSEED metabolite.') - + warn( + f"CodeError: The metabolite {met.id} | {met.name} was not corrected to a ModelSEED metabolite." + ) + if conflicts_file_name is not None: - self._export({'metabolite_changes':self.changed_metabolites, 'reaction_changes':self.changed_reactions}, - conflicts_file_name, model_names, model_format, export_directory - ) - + self._export( + { + "metabolite_changes": self.changed_metabolites, + "reaction_changes": self.changed_reactions, + }, + conflicts_file_name, + model_names, + model_format, + export_directory, + ) + # standardize reactions # else: #!!! The modelreactions appear to be incorrect # modelreactions_ids = {re.sub('(_\w\d$)', '', rxn['id']).removeprefix('R-'):rxn for rxn in model.modelreactions} @@ -118,7 +155,7 @@ def standardize(self, models, # the collection of cobrakbas # continue # original_reaction = rxn.reaction # rxn.add_metabolites({rxn_met:0 for rxn_met in rxn.metabolites}, combine = False) - + # if re.sub('(_\w\d$)', '', rxn.id) in modelreactions_ids: # reaction_dict = self._parse_modelReactionReagents( # modelreactions_ids[re.sub('(_\w\d$)', '', rxn.id)]['modelReactionReagents'], model_metabolites @@ -129,9 +166,9 @@ def standardize(self, models, # the collection of cobrakbas # ) # else: # warn(f'ModelSEEDError: The reaction ID {rxn.id} is not captured by the modelreactions.') - + # try: - # rxn.add_metabolites(reaction_dict, combine = False) + # rxn.add_metabolites(reaction_dict, combine = False) # except: # new_reaction_dict = {} # for met, content in reaction_dict.items(): @@ -142,10 +179,10 @@ def standardize(self, models, # the collection of cobrakbas # met.id = re.sub('_\w\d', '', met.id) # new_reaction_dict[met] = content # reaction_dict = new_reaction_dict - # if rxn.id not in self.reaction_ids: + # if rxn.id not in self.reaction_ids: # missed_reactions += 1 # # warn(f'ModelSEEDError: The {rxn.id} | {rxn.name} reaction is not recognized by the ModelSEED Database') - + # # describe the change # if original_reaction != rxn.reaction: # change = { @@ -158,126 +195,184 @@ def standardize(self, models, # the collection of cobrakbas # 'explanation': f'The reaction {rxn.id} was reconstructed from the ModelSEED Database.' # } # self.changed_reactions.append(change) - + # if export_directory is not None: # with open(os.path.join(export_directory, 'standardized_reactions.txt'), 'w') as out: # json.dump(self.changed_reactions, out, indent = 3) - + # total_reactions = 0 # for model in models: # total_reactions += len(model.reactions) - + # warn(f'\nModelSEEDError: {missed_reactions}/{total_reactions} reactions were not captured by the ModelSEED modelreaction IDs.') - + self.models[self.model_index] = self.model - print(f'\n\n{self.changed_rxn_count} reactions were substituted and {self.changed_ids_count} metabolite IDs were redefined.') + print( + f"\n\n{self.changed_rxn_count} reactions were substituted and {self.changed_ids_count} metabolite IDs were redefined." + ) return self.models - - def align_exchanges(self, models, # the collection of cobrakbase models that will be compared - standardize: bool = False, # standardize the model names and reactions to the ModelSEED Database - conflicts_file_name: str = None, # the metabolite conflicts are stored and organized, where None does not the conflicts - model_names: list = None, # specifies the name of the exported model, where None does not export the models - model_format: str = 'json', # specifies to which format the model will be exported - export_directory: str = None # specifies the directory to which all of the content will be exported - ): + + def align_exchanges( + self, + models, # the collection of cobrakbase models that will be compared + standardize: bool = False, # standardize the model names and reactions to the ModelSEED Database + conflicts_file_name: str = None, # the metabolite conflicts are stored and organized, where None does not the conflicts + model_names: list = None, # specifies the name of the exported model, where None does not export the models + model_format: str = "json", # specifies to which format the model will be exported + export_directory: str = None, # specifies the directory to which all of the content will be exported + ): self.models = models self.changed_ids_count = self.changed_rxn_count = 0 if standardize: self.standardize_MSD(self.models) - - unique_names, established_mets, self.unknown_met_ids, self.changed_metabolites, self.changed_reactions = [], [], [], [], [] + + ( + unique_names, + established_mets, + self.unknown_met_ids, + self.changed_metabolites, + self.changed_reactions, + ) = ([], [], [], [], []) self.unique_mets, self.met_conflicts = OrderedDict(), OrderedDict() for self.model_index, self.model in enumerate(self.models): - model_metabolites = {met.id:met for met in self.model.metabolites} + model_metabolites = {met.id: met for met in self.model.metabolites} for ex_rxn in self.model.exchanges: for met in ex_rxn.metabolites: - met_name = re.sub('_\w\d$', '', met.name) - if met.id not in self.unique_mets and met.id not in established_mets: + met_name = re.sub("_\w\d$", "", met.name) + if ( + met.id not in self.unique_mets + and met.id not in established_mets + ): if met_name not in unique_names: # identify the unique metabolite self.unique_mets[met.id] = { - f'model{self.model_index}_id': met.id, - f'model{self.model_index}_met': met - } + f"model{self.model_index}_id": met.id, + f"model{self.model_index}_met": met, + } unique_names.append(met_name) else: # describe the metabolite conflict between the ID and name - former_id = list(self.unique_mets.keys())[unique_names.index(met_name)] - former_model_index = list(self.unique_mets[former_id].keys())[0].split('_')[0].removeprefix('model') + former_id = list(self.unique_mets.keys())[ + unique_names.index(met_name) + ] + former_model_index = ( + list(self.unique_mets[former_id].keys())[0] + .split("_")[0] + .removeprefix("model") + ) if met.name not in self.met_conflicts: self.met_conflicts[met_name] = { - f'model{former_model_index}_id': former_id, - f'model{former_model_index}_met': self.unique_mets[former_id][f'model{former_model_index}_met'], - f'model{self.model_index}_id': met.id, - f'model{self.model_index}_met': met - } + f"model{former_model_index}_id": former_id, + f"model{former_model_index}_met": self.unique_mets[ + former_id + ][f"model{former_model_index}_met"], + f"model{self.model_index}_id": met.id, + f"model{self.model_index}_met": met, + } else: - self.met_conflicts[met_name].update({ - f'model{self.model_index}_id': met.id, - f'model{self.model_index}_met': met - }) + self.met_conflicts[met_name].update( + { + f"model{self.model_index}_id": met.id, + f"model{self.model_index}_met": met, + } + ) met, new_met_id, success = self._fix_met(met) else: - former_name = unique_names[list(self.unique_mets.keys()).index(met.id)] - former_model_index = list(self.unique_mets[met.id].keys())[0].split('_')[0].removeprefix('model') + former_name = unique_names[ + list(self.unique_mets.keys()).index(met.id) + ] + former_model_index = ( + list(self.unique_mets[met.id].keys())[0] + .split("_")[0] + .removeprefix("model") + ) if met_name == former_name: # remove the metabolite that is no longer unique - del unique_names[list(self.unique_mets.keys()).index(met.id)] - self.unique_mets.pop(met.id) + del unique_names[ + list(self.unique_mets.keys()).index(met.id) + ] + self.unique_mets.pop(met.id) established_mets.append(met.id) else: # describe the conflicting metabolite names if met.id not in self.met_conflicts: self.met_conflicts[met.id] = { - f'model{former_model_index}_name': former_name, - f'model{former_model_index}_met': self.unique_mets[former_id][f'model{former_model_index}_met'], - f'model{self.model_index}_name': met.name, - f'model{self.model_index}_met': met - } + f"model{former_model_index}_name": former_name, + f"model{former_model_index}_met": self.unique_mets[ + former_id + ][f"model{former_model_index}_met"], + f"model{self.model_index}_name": met.name, + f"model{self.model_index}_met": met, + } else: - if f'model{self.model_index}_name' not in self.met_conflicts[met.id]: - self.met_conflicts[met.id].update({ - f'model{self.model_index}_name': met.name, - f'model{self.model_index}_met': met - }) + if ( + f"model{self.model_index}_name" + not in self.met_conflicts[met.id] + ): + self.met_conflicts[met.id].update( + { + f"model{self.model_index}_name": met.name, + f"model{self.model_index}_met": met, + } + ) else: iteration = 0 - while f'model{self.model_index}_{iteration}_name' in self.met_conflicts[met.id]: + while ( + f"model{self.model_index}_{iteration}_name" + in self.met_conflicts[met.id] + ): iteration += 1 - - self.met_conflicts[met.id].update({ - f'model{self.model_index}_{iteration}_name': met.name, - f'model{self.model_index}_{iteration}_met': met - }) + + self.met_conflicts[met.id].update( + { + f"model{self.model_index}_{iteration}_name": met.name, + f"model{self.model_index}_{iteration}_met": met, + } + ) met, new_met_id, success = self._fix_met(met) - + self.models[self.model_index] = self.model - + # correct the reaction ID - if re.sub('(_\w\d$)', '', ex_rxn.id).removeprefix('EX_') in model_metabolites: - suffix = re.search('(_\w\d$)', ex_rxn.id).group() - rxn_met, new_met_id, success = self._fix_met(re.sub('(_\w\d$)', '', ex_rxn.id).removeprefix('EX_')) - ex_rxn.id = 'EX_'+new_met_id+suffix + if ( + re.sub("(_\w\d$)", "", ex_rxn.id).removeprefix("EX_") + in model_metabolites + ): + suffix = re.search("(_\w\d$)", ex_rxn.id).group() + rxn_met, new_met_id, success = self._fix_met( + re.sub("(_\w\d$)", "", ex_rxn.id).removeprefix("EX_") + ) + ex_rxn.id = "EX_" + new_met_id + suffix if conflicts_file_name: export_met_conflicts = {} for met_id, content in self.met_conflicts.items(): export_met_conflicts[met_id] = {} for key, val in content.items(): - if '_met' not in key: + if "_met" not in key: export_met_conflicts[met_id][key] = val else: - export_met_conflicts[met_id][key.replace('_met','_formula')] = val.formula - - self._export(export_met_conflicts, conflicts_file_name, model_names, model_format, export_directory) + export_met_conflicts[met_id][ + key.replace("_met", "_formula") + ] = val.formula + + self._export( + export_met_conflicts, + conflicts_file_name, + model_names, + model_format, + export_directory, + ) - print(f'\n\n{self.changed_rxn_count} exchange reactions were substituted and {self.changed_ids_count} exchange metabolite IDs were redefined.') + print( + f"\n\n{self.changed_rxn_count} exchange reactions were substituted and {self.changed_ids_count} exchange metabolite IDs were redefined." + ) return self.models - - def _fix_met(self,met): + + def _fix_met(self, met): # correct the conflict - base_name = ''.join(met.name.split('-')[1:]).capitalize() - met_name = re.sub('_\w\d$', '', met.name) + base_name = "".join(met.name.split("-")[1:]).capitalize() + met_name = re.sub("_\w\d$", "", met.name) new_met_id = met.id success = True if met.name in self.compound_names: @@ -288,112 +383,138 @@ def _fix_met(self,met): met, new_met_id = self.__correct_met(met, met_name) elif met_name.capitalize() in self.compound_names: met, new_met_id = self.__correct_met(met, met_name.capitalize()) - elif base_name in self.compound_names and base_name != '': + elif base_name in self.compound_names and base_name != "": met, new_met_id = self.__correct_met(met, base_name) else: self.unknown_met_ids.append(met.id) success = False - warn(f'ModelSEEDError: The metabolite ({" | ".join([x for x in [met.id, met.name, base_name, met_name] if x != ""])}) is not recognized by the ModelSEED Database') + warn( + f'ModelSEEDError: The metabolite ({" | ".join([x for x in [met.id, met.name, base_name, met_name] if x != ""])}) is not recognized by the ModelSEED Database' + ) return met, new_met_id, success - - def _export(self, conflicts, # the conflicts dictionary that will be exported - conflicts_file_name, # the metabolite conflicts are stored and organized, where None does not the conflicts - model_names, # specifies the name of the exported model, where None does not export the models - model_format, # specifies to which format the model will be exported - export_directory # specifies the directory to which all of the content will be exported - ): + + def _export( + self, + conflicts, # the conflicts dictionary that will be exported + conflicts_file_name, # the metabolite conflicts are stored and organized, where None does not the conflicts + model_names, # specifies the name of the exported model, where None does not export the models + model_format, # specifies to which format the model will be exported + export_directory, # specifies the directory to which all of the content will be exported + ): if export_directory is None: export_directory = os.getcwd() - + file_paths = [] if conflicts_file_name is not None: - path = os.path.join(export_directory,conflicts_file_name) + path = os.path.join(export_directory, conflicts_file_name) file_paths.append(os.path.relpath(path, export_directory)) - with open(path, 'w') as out: - json.dump(conflicts, out, indent = 3) + with open(path, "w") as out: + json.dump(conflicts, out, indent=3) if model_names is not None: for index, model in enumerate(self.models): - path = os.path.join(export_directory,f'{model_names[index]}.{model_format}') + path = os.path.join( + export_directory, f"{model_names[index]}.{model_format}" + ) file_paths.append(os.path.relpath(path, export_directory)) save_json_model(model, path) - with ZipFile('_'.join(model_names[:4])+'.zip', 'w', compression = ZIP_LZMA) as zip: + with ZipFile( + "_".join(model_names[:4]) + ".zip", "w", compression=ZIP_LZMA + ) as zip: for file in file_paths: zip.write(file) os.remove(file) - - def __correct_met(self, met, met_name, standardize = False): + + def __correct_met(self, met, met_name, standardize=False): def check_cross_references(met, general_met): for db in self.compounds_cross_references[general_met]: for cross_ref in self.compounds_cross_references[general_met][db]: - if cross_ref in self.compounds_cross_references[self.compound_names[met_name]][db]: + if ( + cross_ref + in self.compounds_cross_references[ + self.compound_names[met_name] + ][db] + ): match = True break if match: break return match, db - + original_id = new_met_id = met.id - compartment = re.search('(_\w\d$)', met.id).group() - if met.id.removesuffix(compartment) != self.compound_names[met_name]: # If the ID associated with the name deviates from that in the ModelSEED Database - new_met_id = self.compound_names[met_name]+compartment + compartment = re.search("(_\w\d$)", met.id).group() + if ( + met.id.removesuffix(compartment) != self.compound_names[met_name] + ): # If the ID associated with the name deviates from that in the ModelSEED Database + new_met_id = self.compound_names[met_name] + compartment if new_met_id in met.model.metabolites: # replace the undesirable isomer in every instance, since it cannot be renamed for rxn in met.reactions: double_reagent = False original_reaction = rxn.reaction removal_dict, reaction_dict = {}, {} - for rxn_met in rxn.reactants+rxn.products: # The REACTANTS+PRODUCTS may resolve metabolites that are both, more than the METABOLITES attribute + for rxn_met in ( + rxn.reactants + rxn.products + ): # The REACTANTS+PRODUCTS may resolve metabolites that are both, more than the METABOLITES attribute match = False stoich = float(rxn.metabolites[rxn_met]) - compartment = re.search('(_\w\d$)', rxn_met.id).group() + compartment = re.search("(_\w\d$)", rxn_met.id).group() new_met = rxn_met if rxn_met.id == met.id: - if new_met_id in [old_met.id for old_met in rxn.metabolites]: + if new_met_id in [ + old_met.id for old_met in rxn.metabolites + ]: double_reagent = True - warn(f'CodeError: The metabolite {new_met_id} replacement for {met.id} already exists in the reaction {rxn.id}, thus the reaction cannot be updated.') + warn( + f"CodeError: The metabolite {new_met_id} replacement for {met.id} already exists in the reaction {rxn.id}, thus the reaction cannot be updated." + ) break - + # affirm the match with cross-references, where it is possible for ModelSEED compounds general_met = re.sub("(_\w\d$)", "", met.id) - if 'cpd' in met.id and self.compounds_cross_references[general_met] != {}: + if ( + "cpd" in met.id + and self.compounds_cross_references[general_met] != {} + ): match, db = check_cross_references(met, general_met) if not match: - warn(f'ModelSEEDError: The old metabolite {met.id} cross-references ({self.compounds_cross_references[general_met]}) do not overlap with those ({self.compounds_cross_references[self.compound_names[met_name]]}) of the new metabolite {new_met_id}.') - + warn( + f"ModelSEEDError: The old metabolite {met.id} cross-references ({self.compounds_cross_references[general_met]}) do not overlap with those ({self.compounds_cross_references[self.compound_names[met_name]]}) of the new metabolite {new_met_id}." + ) + # remove duplicate exchange reaction - if 'EX_' in rxn.id and 'EX_'+new_met_id in [ex_rxn.id for ex_rxn in self.model.exchanges]: + if "EX_" in rxn.id and "EX_" + new_met_id in [ + ex_rxn.id for ex_rxn in self.model.exchanges + ]: change = { - 'original': { - 'reaction': original_reaction - }, - 'new': { - 'reaction': None - }, - 'justification': f'A {new_met_id} exchange reaction already exists in model {self.model_index}, thus this duplicative exchange reaction ({rxn.id}) is deleted.' - } + "original": {"reaction": original_reaction}, + "new": {"reaction": None}, + "justification": f"A {new_met_id} exchange reaction already exists in model {self.model_index}, thus this duplicative exchange reaction ({rxn.id}) is deleted.", + } if match: - change['justification'] += f' The ID match was verified with {db} cross-references.' + change[ + "justification" + ] += f" The ID match was verified with {db} cross-references." self.model.remove_reactions([rxn.id]) self.changed_reactions.append(change) if self.printing: - print('\n') + print("\n") pprint(change, sort_dicts=False) self.changed_rxn_count += 1 double_reagent = True break - + # define the metabolite with the new name new_met = Metabolite( - id = new_met_id, - name = met_name, - formula = met.formula, - charge = met.charge, - compartment = met.compartment - ) - + id=new_met_id, + name=met_name, + formula=met.formula, + charge=met.charge, + compartment=met.compartment, + ) + removal_dict[rxn_met] = 0 reaction_dict[new_met] = stoich - + # reconstruct the reactions if double_reagent: continue @@ -403,60 +524,64 @@ def check_cross_references(met, general_met): new_products = len(reaction_dict) - new_reactants num_reactants, num_products = len(rxn.reactants), len(rxn.products) if num_reactants == new_reactants and num_products == new_products: - rxn.add_metabolites(removal_dict, combine = False) - rxn.add_metabolites(reaction_dict, combine = False) + rxn.add_metabolites(removal_dict, combine=False) + rxn.add_metabolites(reaction_dict, combine=False) change = { - 'original': { - 'reaction': original_reaction - }, - 'new': { - 'reaction': rxn.reaction - }, - 'justification': f'The {new_met_id} replacement for {met.id} already exists in model {self.model_index}, so each reaction (here {rxn.id}) must be updated.' - } + "original": {"reaction": original_reaction}, + "new": {"reaction": rxn.reaction}, + "justification": f"The {new_met_id} replacement for {met.id} already exists in model {self.model_index}, so each reaction (here {rxn.id}) must be updated.", + } if match: - change['justification'] += f' The ID match was verified with {db} cross-references.' + change[ + "justification" + ] += f" The ID match was verified with {db} cross-references." self.changed_reactions.append(change) if self.printing: - print('\n') + print("\n") pprint(change, sort_dicts=False) - + self.changed_rxn_count += 1 else: - warn(f'CodeError: The reaction {reaction_dict} | {new_reactants} {new_products} possesses a different number of reagents than the original reaction {original_reaction} | {num_reactants} {num_products}, and is skipped.') + warn( + f"CodeError: The reaction {reaction_dict} | {new_reactants} {new_products} possesses a different number of reagents than the original reaction {original_reaction} | {num_reactants} {num_products}, and is skipped." + ) else: # affirm the match with cross-references, where it is possible for ModelSEED compounds match = False general_met = re.sub("(_\w\d$)", "", met.id) - if 'cpd' in met.id and self.compounds_cross_references[general_met] != {}: + if ( + "cpd" in met.id + and self.compounds_cross_references[general_met] != {} + ): match, db = check_cross_references(met, general_met) if not match: - warn(f'ModelSEEDError: The old metabolite {met.id} cross-references ({self.compounds_cross_references[general_met]}) do not overlap with those ({self.compounds_cross_references[self.compound_names[met_name]]}) of the new metabolite {new_met_id}.') - + warn( + f"ModelSEEDError: The old metabolite {met.id} cross-references ({self.compounds_cross_references[general_met]}) do not overlap with those ({self.compounds_cross_references[self.compound_names[met_name]]}) of the new metabolite {new_met_id}." + ) + # rename the undesirable isomer - met.id = self.compound_names[met_name]+compartment + met.id = self.compound_names[met_name] + compartment change = { - 'original': { - 'id': original_id, - 'name': met.name - }, - 'new': { - 'id': met.id, - 'name': met_name+compartment - }, - 'justification': f'The {original_id} and {met.id} distinction in {self.model_index} is incompatible.' - } - if 'cpd' not in original_id: - change['justification'] = f'The {original_id} ID is not a ModelSEED Database ID.' + "original": {"id": original_id, "name": met.name}, + "new": {"id": met.id, "name": met_name + compartment}, + "justification": f"The {original_id} and {met.id} distinction in {self.model_index} is incompatible.", + } + if "cpd" not in original_id: + change[ + "justification" + ] = f"The {original_id} ID is not a ModelSEED Database ID." if standardize: - change['justification'] = f'The {original_id} and {met.id} metabolites were matched via their name.' + change[ + "justification" + ] = f"The {original_id} and {met.id} metabolites were matched via their name." if match: - change['justification'] += f' The ID match was verified with {db} cross-references.' + change[ + "justification" + ] += f" The ID match was verified with {db} cross-references." self.changed_metabolites.append(change) if self.printing: - print('\n') + print("\n") pprint(change, sort_dicts=False) self.changed_ids_count += 1 return met, new_met_id - \ No newline at end of file diff --git a/modelseedpy/core/__init__.py b/modelseedpy/core/__init__.py index c811a8c2..16879a2c 100755 --- a/modelseedpy/core/__init__.py +++ b/modelseedpy/core/__init__.py @@ -11,4 +11,4 @@ from modelseedpy.core.msgrowthphenotypes import MSGrowthPhenotypes from modelseedpy.core.msmodelutl import MSModelUtil from modelseedpy.core.mstemplate import MSTemplateBuilder -from modelseedpy.core.exceptions import * \ No newline at end of file +from modelseedpy.core.exceptions import * diff --git a/modelseedpy/core/biolog.py b/modelseedpy/core/biolog.py index 6eaec71c..94c880f1 100644 --- a/modelseedpy/core/biolog.py +++ b/modelseedpy/core/biolog.py @@ -97,7 +97,6 @@ class BiologPlate: - def __init__(self, plate_id, rows, cols): self.id = plate_id self.rows = rows @@ -115,8 +114,8 @@ def get_media(self, well_id): well = self.wells[well_id] for compound in self.base: media[compound] = self.base[compound] - for compound in well['compounds']: - media[compound] = well['value'] + for compound in well["compounds"]: + media[compound] = well["value"] return media return None @@ -129,7 +128,7 @@ def _repr_html_(self): t += '' for o in self.wells: if o == row + col: - t += self.wells[o]['desc'] + t += self.wells[o]["desc"] # print(self.wells[o]) t += "" t += "" @@ -139,16 +138,15 @@ def _repr_html_(self): class Biolog: - def __init__(self): self.plates = {} def add_plate(self, plate): if plate.id in self.plates: - print('replace existing plate') + print("replace existing plate") self.plates[plate.id] = plate - def run_plates(self, model, biomass=None, cmp='e'): # !!! biomass is never used + def run_plates(self, model, biomass=None, cmp="e"): # !!! biomass is never used prev_medium = model.medium compound_exchange = {} for ex_rxn in model.exchanges: @@ -166,10 +164,10 @@ def run_plates(self, model, biomass=None, cmp='e'): # !!! biomass is never used if match in compound_exchange: model_medium[compound_exchange[match].id] = media[o] else: - print('skip', o) + print("skip", o) model.medium = model_medium ovalue = model.slim_optimize() - plate.wells[well_id]['growth'] = ovalue + plate.wells[well_id]["growth"] = ovalue # print(well_id, solution) # print(well_id, media) return prev_medium diff --git a/modelseedpy/core/exceptions.py b/modelseedpy/core/exceptions.py index 572355b8..2119871e 100644 --- a/modelseedpy/core/exceptions.py +++ b/modelseedpy/core/exceptions.py @@ -1,14 +1,18 @@ - -#Adding a few exception classes to handle different types of errors in a central file +# Adding a few exception classes to handle different types of errors in a central file class FeasibilityError(Exception): """Error in FBA formulation""" + def __init__(self, message): super(FeasibilityError, self).__init__(message) - + + class PackageError(Exception): """Error in package manager""" + pass + class GapfillingError(Exception): """Error in model gapfilling""" - pass \ No newline at end of file + + pass diff --git a/modelseedpy/core/fbahelper.py b/modelseedpy/core/fbahelper.py index 449d17cd..28065a07 100755 --- a/modelseedpy/core/fbahelper.py +++ b/modelseedpy/core/fbahelper.py @@ -3,37 +3,54 @@ import logging from chemicals import periodic_table import re -from cobra.core import Gene, Metabolite, Model, Reaction # !!! Gene, Metabolite, and Model are never used +from cobra.core import ( + Gene, + Metabolite, + Model, + Reaction, +) # !!! Gene, Metabolite, and Model are never used from cobra.util import solver as sutil # !!! sutil is never used import time from modelseedpy.biochem import from_local from scipy.odr.odrpack import Output # !!! Output is never used from chemw import ChemMW from warnings import warn -#from Carbon.Aliases import false + +# from Carbon.Aliases import false logger = logging.getLogger(__name__) -class FBAHelper: +class FBAHelper: @staticmethod - def add_autodrain_reactions_to_community_model(model,auto_sink = ["cpd02701", "cpd15302"]): - #Adding missing drains in the base model + def add_autodrain_reactions_to_community_model( + model, auto_sink=["cpd02701", "cpd15302"] + ): + # Adding missing drains in the base model drain_reactions = [] for metabolite in model.metabolites: msid = FBAHelper.modelseed_id_from_cobra_metabolite(metabolite) if msid in auto_sink: if metabolite.compartment == "c0": met_id = metabolite.id - if all([rxn not in model.reactions for rxn in [f"EX_{met_id}", f"DM_{met_id}", f"SK_{met_id}"]]): - drain_reaction = FBAHelper.add_drain_from_metabolite_id(model,metabolite.id,0,100,"DM_") + if all( + [ + rxn not in model.reactions + for rxn in [f"EX_{met_id}", f"DM_{met_id}", f"SK_{met_id}"] + ] + ): + drain_reaction = FBAHelper.add_drain_from_metabolite_id( + model, metabolite.id, 0, 100, "DM_" + ) if not drain_reaction: - logger.info("Adding "+met_id+" DM") + logger.info("Adding " + met_id + " DM") drain_reactions.append(drain_reaction) model.add_reactions(drain_reactions) - + @staticmethod - def add_drain_from_metabolite_id(model, cpd_id, uptake, excretion, prefix='EX_', prefix_name='Exchange for '): + def add_drain_from_metabolite_id( + model, cpd_id, uptake, excretion, prefix="EX_", prefix_name="Exchange for " + ): """ :param model: :param cpd_id: @@ -46,18 +63,18 @@ def add_drain_from_metabolite_id(model, cpd_id, uptake, excretion, prefix='EX_', if cpd_id in model.metabolites: cobra_metabolite = model.metabolites.get_by_id(cpd_id) drain_reaction = Reaction( - id=f'{prefix}{cpd_id}', + id=f"{prefix}{cpd_id}", name=prefix_name + cobra_metabolite.name, - lower_bound = -uptake, - upper_bound = excretion) - drain_reaction.add_metabolites({cobra_metabolite : -1}) - drain_reaction.annotation["sbo"] = 'SBO:0000627' - #model.add_reactions([drain_reaction]) + lower_bound=-uptake, + upper_bound=excretion, + ) + drain_reaction.add_metabolites({cobra_metabolite: -1}) + drain_reaction.annotation["sbo"] = "SBO:0000627" + # model.add_reactions([drain_reaction]) return drain_reaction return None @staticmethod - def set_reaction_bounds_from_direction(reaction, direction, add=False): if direction == "<": reaction.lower_bound = -100 @@ -70,31 +87,33 @@ def set_reaction_bounds_from_direction(reaction, direction, add=False): reaction.update_variable_bounds() @staticmethod - def set_objective_from_target_reaction(model,target_reaction,minimize = False): + def set_objective_from_target_reaction(model, target_reaction, minimize=False): target_reaction = model.reactions.get_by_id(target_reaction) sense = "max" if minimize: sense = "min" - model.objective = model.problem.Objective(target_reaction.flux_expression, direction=sense) + model.objective = model.problem.Objective( + target_reaction.flux_expression, direction=sense + ) return target_reaction - + @staticmethod def modelseed_id_from_cobra_metabolite(metabolite): - if re.search('^(cpd\d+)', metabolite.id): - m = re.search('^(cpd\d+)', metabolite.id) + if re.search("^(cpd\d+)", metabolite.id): + m = re.search("^(cpd\d+)", metabolite.id) return m[1] - #TODO: should check to see if ModelSEED ID is in the annotations for the compound + # TODO: should check to see if ModelSEED ID is in the annotations for the compound return None - + @staticmethod def modelseed_id_from_cobra_reaction(reaction): - if re.search('^(rxn\d+)', reaction.id): - m = re.search('^(rxn\d+)', reaction.id) + if re.search("^(rxn\d+)", reaction.id): + m = re.search("^(rxn\d+)", reaction.id) return m[1] - #TODO: should check to see if ModelSEED ID is in the annotations for the compound + # TODO: should check to see if ModelSEED ID is in the annotations for the compound else: return None - + @staticmethod def metabolite_mw(metabolite): try: @@ -102,16 +121,20 @@ def metabolite_mw(metabolite): chem_mw.mass(metabolite.formula) return chem_mw.raw_mw except: - warn("The compound "+metabolite.id+" possesses an unconventional formula {metabolite.formula}; hence, the MW cannot be computed.") - - @staticmethod + warn( + "The compound " + + metabolite.id + + " possesses an unconventional formula {metabolite.formula}; hence, the MW cannot be computed." + ) + + @staticmethod def elemental_mass(): - return {element.symbol:element.MW for element in periodic_table} - + return {element.symbol: element.MW for element in periodic_table} + @staticmethod def get_modelseed_db_api(modelseed_path): return from_local(modelseed_path) - + @staticmethod def is_ex(reaction): # TODO: check for SBO @@ -123,25 +146,25 @@ def is_ex(reaction): def is_biomass(reaction): # TODO: check for SBO return reaction.id[0:3] == "bio" - + @staticmethod def exchange_hash(model): #!!! This function is pointless? exchange_hash = {} # !!! this variable is never used for reaction in model.reactions: if len(reaction.metabolites) == 1: for metabolite in reaction.metabolites: - (base,comp,index) = FBAHelper.parse_id(metabolite) - #exchange_hash[base][comp] + (base, comp, index) = FBAHelper.parse_id(metabolite) + # exchange_hash[base][comp] @staticmethod - def find_reaction(model,stoichiometry): + def find_reaction(model, stoichiometry): reaction_strings = FBAHelper.stoichiometry_to_string(stoichiometry) atpstring = reaction_strings[0] rxn_hash = FBAHelper.rxn_hash(model) if atpstring in rxn_hash: return rxn_hash[atpstring] return None - + @staticmethod def msid_hash(model): output = {} @@ -152,18 +175,18 @@ def msid_hash(model): output[msid] = [] output[msid].append(met) return output - + @staticmethod - def rxn_hash(model): + def rxn_hash(model): output = {} for rxn in model.reactions: reaction_strings = FBAHelper.stoichiometry_to_string(rxn.metabolites) - output[reaction_strings[0]] = [rxn,1] - output[reaction_strings[1]] = [rxn,-1] + output[reaction_strings[0]] = [rxn, 1] + output[reaction_strings[1]] = [rxn, -1] return output - + @staticmethod - def rxn_compartment(reaction): + def rxn_compartment(reaction): compartments = list(reaction.compartments) if len(compartments) == 1: return compartments[0] @@ -174,83 +197,112 @@ def rxn_compartment(reaction): elif comp[0:1] != "e": othercomp = comp return othercomp or cytosol - + @staticmethod def stoichiometry_to_string(stoichiometry): reactants, products = [], [] for met in stoichiometry: stoich = stoichiometry[met] if not isinstance(met, str): - met = None if FBAHelper.modelseed_id_from_cobra_metabolite(met) == "cpd00067" else met.id + met = ( + None + if FBAHelper.modelseed_id_from_cobra_metabolite(met) == "cpd00067" + else met.id + ) if met: if stoich < 0: reactants.append(met) else: products.append(met) - return ["+".join(sorted(reactants))+"="+"+".join(sorted(products)),"+".join(sorted(products))+"="+"+".join(sorted(reactants))] - + return [ + "+".join(sorted(reactants)) + "=" + "+".join(sorted(products)), + "+".join(sorted(products)) + "=" + "+".join(sorted(reactants)), + ] + @staticmethod - def add_atp_hydrolysis(model,compartment): + def add_atp_hydrolysis(model, compartment): # Searching for ATP hydrolysis compounds - coefs = {"cpd00002": [-1,compartment], "cpd00001": [-1,compartment], "cpd00008": [1,compartment], - "cpd00009": [1,compartment], "cpd00067": [1,compartment]} + coefs = { + "cpd00002": [-1, compartment], + "cpd00001": [-1, compartment], + "cpd00008": [1, compartment], + "cpd00009": [1, compartment], + "cpd00067": [1, compartment], + } stoichiometry = {} id_hash = FBAHelper.msid_hash(model) for msid, content in coefs.items(): if msid not in id_hash: - logger.warning("Compound "+msid+" not found in model!") + logger.warning("Compound " + msid + " not found in model!") return None else: for cpd in id_hash[msid]: if cpd.compartment == content[1]: stoichiometry[cpd] = content[0] - output = FBAHelper.find_reaction(model,stoichiometry) - if output and output[1] == 1: # !!! the second element of the output is 1/0 and not a direction string - return {"reaction":output[0],"direction":">","new":False} - cobra_reaction = Reaction("rxn00062_"+compartment, name="ATP hydrolysis", lower_bound=0, upper_bound=1000) - cobra_reaction.annotation.update({"sbo":"SBO:0000176", "seed.reaction":"rxn00062"}) #biochemical reaction + output = FBAHelper.find_reaction(model, stoichiometry) + if ( + output and output[1] == 1 + ): # !!! the second element of the output is 1/0 and not a direction string + return {"reaction": output[0], "direction": ">", "new": False} + cobra_reaction = Reaction( + "rxn00062_" + compartment, + name="ATP hydrolysis", + lower_bound=0, + upper_bound=1000, + ) + cobra_reaction.annotation.update( + {"sbo": "SBO:0000176", "seed.reaction": "rxn00062"} + ) # biochemical reaction cobra_reaction.add_metabolites(stoichiometry) model.add_reactions([cobra_reaction]) - return {"reaction":cobra_reaction,"direction":">","new":True} - + return {"reaction": cobra_reaction, "direction": ">", "new": True} + @staticmethod def parse_id(cobra_obj): - if re.search('(.+)_([a-z])(\d+)$', cobra_obj.id): - m = re.search('(.+)_([a-z])(\d+)$', cobra_obj.id) - return (m[1],m[2],int(m[3])) + if re.search("(.+)_([a-z])(\d+)$", cobra_obj.id): + m = re.search("(.+)_([a-z])(\d+)$", cobra_obj.id) + return (m[1], m[2], int(m[3])) return None - + + @staticmethod + def id_from_ref(ref): + array = ref.split("/") + return array[-1] + @staticmethod def medianame(media): if media == None: return "Complete" return media.id - + @staticmethod - def validate_dictionary(dictionary,required_keys, optional_keys={}): + def validate_dictionary(dictionary, required_keys, optional_keys={}): for item in required_keys: if item not in dictionary: - raise ValueError('Required key '+item+' is missing!') + raise ValueError("Required key " + item + " is missing!") for key in optional_keys: if key not in dictionary: dictionary[key] = optional_keys[key] return dictionary - + @staticmethod def parse_media(media): - return [cpd.id for cpd in media.data['mediacompounds']] - + return [cpd.id for cpd in media.data["mediacompounds"]] + @staticmethod def parse_df(df): from numpy import array - return array(dtype=object, object=[array(df.index), array(df.columns), df.to_numpy()]) - + + return array( + dtype=object, object=[array(df.index), array(df.columns), df.to_numpy()] + ) + @staticmethod def add_vars_cons(model, vars_cons): model.add_cons_vars(vars_cons) model.solver.update() return model - + @staticmethod def update_model_media(model, media): medium = {} @@ -258,12 +310,16 @@ def update_model_media(model, media): for cpd in media.data["mediacompounds"]: ex_rxn = f"EX_{cpd.id}" if ex_rxn not in model_reactions: - model.add_boundary(metabolite=Metabolite(id=cpd.id, name=cpd.name, compartment="e0"), - type="exchange", lb=cpd.minFlux, ub=cpd.maxFlux) + model.add_boundary( + metabolite=Metabolite(id=cpd.id, name=cpd.name, compartment="e0"), + type="exchange", + lb=cpd.minFlux, + ub=cpd.maxFlux, + ) medium[ex_rxn] = cpd.maxFlux model.medium = medium return model - + @staticmethod def filter_cobra_set(cobra_set): unique_ids = set(obj.id for obj in cobra_set) @@ -272,19 +328,24 @@ def filter_cobra_set(cobra_set): if obj.id in unique_ids: unique_objs.add(obj) unique_ids.remove(obj.id) - return unique_objs + return unique_objs @staticmethod - def get_reframed_model(kbase_model,): + def get_reframed_model( + kbase_model, + ): from reframed import from_cobrapy - + reframed_model = from_cobrapy(kbase_model) - if hasattr(kbase_model, 'id'): + if hasattr(kbase_model, "id"): reframed_model.id = kbase_model.id reframed_model.compartments.e0.external = True return reframed_model - + @staticmethod def parse_df(df): from numpy import array - return array(dtype=object, object=[array(df.index), array(df.columns), df.to_numpy()]) + + return array( + dtype=object, object=[array(df.index), array(df.columns), df.to_numpy()] + ) diff --git a/modelseedpy/core/gapfillinghelper.py b/modelseedpy/core/gapfillinghelper.py index a7d5422b..df3497a9 100644 --- a/modelseedpy/core/gapfillinghelper.py +++ b/modelseedpy/core/gapfillinghelper.py @@ -8,162 +8,480 @@ from optlang.symbolics import Zero, add from cobra.core import Gene, Metabolite, Model, Reaction from cobrakbase.core.kbaseobject import AttrDict -from cobrakbase.annotation_ontology_api.annotation_ontology_apiServiceClient import annotation_ontology_api +from cobrakbase.annotation_ontology_api.annotation_ontology_apiServiceClient import ( + annotation_ontology_api, +) from numpy.f2py.cfuncs import f90modhooks logger = logging.getLogger(__name__) + def build_cpd_id(str): if str.startswith("M_"): str = str[2:] elif str.startswith("M-"): str = str[2:] str_fix = str - if '-' in str_fix: - str_fix = str_fix.replace('-', '__DASH__') + if "-" in str_fix: + str_fix = str_fix.replace("-", "__DASH__") if not str == str_fix: - logger.debug('[Species] rename: [%s] -> [%s]', str, str_fix) + logger.debug("[Species] rename: [%s] -> [%s]", str, str_fix) return str + def build_rxn_id(str): if str.startswith("R_"): str = str[2:] elif str.startswith("R-"): str = str[2:] str_fix = str - if '-' in str_fix: - str_fix = str_fix.replace('-', '__DASH__') + if "-" in str_fix: + str_fix = str_fix.replace("-", "__DASH__") if not str == str_fix: - logger.debug('[Reaction] rename: [%s] -> [%s]', str, str_fix) + logger.debug("[Reaction] rename: [%s] -> [%s]", str, str_fix) return str_fix -#Adding a few exception classes to handle different types of errors + +# Adding a few exception classes to handle different types of errors class ObjectError(Exception): """Error in the construction of a base KBase object""" + pass + class FeasibilityError(Exception): """Error in FBA formulation""" + pass -#This class caries functions designed to more easily make standard modifications to an input model - no model state is retained in this class -class GapfillingHelper(): - def __init__(self,blacklist = [],auto_sink = ["cpd02701_c", "cpd11416_c0", "cpd15302_c"]): - self.blacklist = ["rxn12985","rxn00238","rxn07058","rxn05305","rxn00154","rxn09037","rxn10643", - "rxn11317","rxn05254","rxn05257","rxn05258","rxn05259","rxn05264","rxn05268", - "rxn05269","rxn05270","rxn05271","rxn05272","rxn05273","rxn05274","rxn05275", - "rxn05276","rxn05277","rxn05278","rxn05279","rxn05280","rxn05281","rxn05282", - "rxn05283","rxn05284","rxn05285","rxn05286","rxn05963","rxn05964","rxn05971", - "rxn05989","rxn05990","rxn06041","rxn06042","rxn06043","rxn06044","rxn06045", - "rxn06046","rxn06079","rxn06080","rxn06081","rxn06086","rxn06087","rxn06088", - "rxn06089","rxn06090","rxn06091","rxn06092","rxn06138","rxn06139","rxn06140", - "rxn06141","rxn06145","rxn06217","rxn06218","rxn06219","rxn06220","rxn06221", - "rxn06222","rxn06223","rxn06235","rxn06362","rxn06368","rxn06378","rxn06474", - "rxn06475","rxn06502","rxn06562","rxn06569","rxn06604","rxn06702","rxn06706", - "rxn06715","rxn06803","rxn06811","rxn06812","rxn06850","rxn06901","rxn06971", - "rxn06999","rxn07123","rxn07172","rxn07254","rxn07255","rxn07269","rxn07451", - "rxn09037","rxn10018","rxn10077","rxn10096","rxn10097","rxn10098","rxn10099", - "rxn10101","rxn10102","rxn10103","rxn10104","rxn10105","rxn10106","rxn10107", - "rxn10109","rxn10111","rxn10403","rxn10410","rxn10416","rxn11313","rxn11316", - "rxn11318","rxn11353","rxn05224","rxn05795","rxn05796","rxn05797","rxn05798", - "rxn05799","rxn05801","rxn05802","rxn05803","rxn05804","rxn05805","rxn05806", - "rxn05808","rxn05812","rxn05815","rxn05832","rxn05836","rxn05851","rxn05857", - "rxn05869","rxn05870","rxn05884","rxn05888","rxn05896","rxn05898","rxn05900", - "rxn05903","rxn05904","rxn05905","rxn05911","rxn05921","rxn05925","rxn05936", - "rxn05947","rxn05956","rxn05959","rxn05960","rxn05980","rxn05991","rxn05992", - "rxn05999","rxn06001","rxn06014","rxn06017","rxn06021","rxn06026","rxn06027", - "rxn06034","rxn06048","rxn06052","rxn06053","rxn06054","rxn06057","rxn06059", - "rxn06061","rxn06102","rxn06103","rxn06127","rxn06128","rxn06129","rxn06130", - "rxn06131","rxn06132","rxn06137","rxn06146","rxn06161","rxn06167","rxn06172", - "rxn06174","rxn06175","rxn06187","rxn06189","rxn06203","rxn06204","rxn06246", - "rxn06261","rxn06265","rxn06266","rxn06286","rxn06291","rxn06294","rxn06310", - "rxn06320","rxn06327","rxn06334","rxn06337","rxn06339","rxn06342","rxn06343", - "rxn06350","rxn06352","rxn06358","rxn06361","rxn06369","rxn06380","rxn06395", - "rxn06415","rxn06419","rxn06420","rxn06421","rxn06423","rxn06450","rxn06457", - "rxn06463","rxn06464","rxn06466","rxn06471","rxn06482","rxn06483","rxn06486", - "rxn06492","rxn06497","rxn06498","rxn06501","rxn06505","rxn06506","rxn06521", - "rxn06534","rxn06580","rxn06585","rxn06593","rxn06609","rxn06613","rxn06654", - "rxn06667","rxn06676","rxn06693","rxn06730","rxn06746","rxn06762","rxn06779", - "rxn06790","rxn06791","rxn06792","rxn06793","rxn06794","rxn06795","rxn06796", - "rxn06797","rxn06821","rxn06826","rxn06827","rxn06829","rxn06839","rxn06841", - "rxn06842","rxn06851","rxn06866","rxn06867","rxn06873","rxn06885","rxn06891", - "rxn06892","rxn06896","rxn06938","rxn06939","rxn06944","rxn06951","rxn06952", - "rxn06955","rxn06957","rxn06960","rxn06964","rxn06965","rxn07086","rxn07097", - "rxn07103","rxn07104","rxn07105","rxn07106","rxn07107","rxn07109","rxn07119", - "rxn07179","rxn07186","rxn07187","rxn07188","rxn07195","rxn07196","rxn07197", - "rxn07198","rxn07201","rxn07205","rxn07206","rxn07210","rxn07244","rxn07245", - "rxn07253","rxn07275","rxn07299","rxn07302","rxn07651","rxn07723","rxn07736", - "rxn07878","rxn11417","rxn11582","rxn11593","rxn11597","rxn11615","rxn11617", - "rxn11619","rxn11620","rxn11624","rxn11626","rxn11638","rxn11648","rxn11651", - "rxn11665","rxn11666","rxn11667","rxn11698","rxn11983","rxn11986","rxn11994", - "rxn12006","rxn12007","rxn12014","rxn12017","rxn12022","rxn12160","rxn12161", - "rxn01267","rxn05294","rxn04656"] + +# This class caries functions designed to more easily make standard modifications to an input model - no model state is retained in this class +class GapfillingHelper: + def __init__( + self, blacklist=[], auto_sink=["cpd02701_c", "cpd11416_c0", "cpd15302_c"] + ): + self.blacklist = [ + "rxn12985", + "rxn00238", + "rxn07058", + "rxn05305", + "rxn00154", + "rxn09037", + "rxn10643", + "rxn11317", + "rxn05254", + "rxn05257", + "rxn05258", + "rxn05259", + "rxn05264", + "rxn05268", + "rxn05269", + "rxn05270", + "rxn05271", + "rxn05272", + "rxn05273", + "rxn05274", + "rxn05275", + "rxn05276", + "rxn05277", + "rxn05278", + "rxn05279", + "rxn05280", + "rxn05281", + "rxn05282", + "rxn05283", + "rxn05284", + "rxn05285", + "rxn05286", + "rxn05963", + "rxn05964", + "rxn05971", + "rxn05989", + "rxn05990", + "rxn06041", + "rxn06042", + "rxn06043", + "rxn06044", + "rxn06045", + "rxn06046", + "rxn06079", + "rxn06080", + "rxn06081", + "rxn06086", + "rxn06087", + "rxn06088", + "rxn06089", + "rxn06090", + "rxn06091", + "rxn06092", + "rxn06138", + "rxn06139", + "rxn06140", + "rxn06141", + "rxn06145", + "rxn06217", + "rxn06218", + "rxn06219", + "rxn06220", + "rxn06221", + "rxn06222", + "rxn06223", + "rxn06235", + "rxn06362", + "rxn06368", + "rxn06378", + "rxn06474", + "rxn06475", + "rxn06502", + "rxn06562", + "rxn06569", + "rxn06604", + "rxn06702", + "rxn06706", + "rxn06715", + "rxn06803", + "rxn06811", + "rxn06812", + "rxn06850", + "rxn06901", + "rxn06971", + "rxn06999", + "rxn07123", + "rxn07172", + "rxn07254", + "rxn07255", + "rxn07269", + "rxn07451", + "rxn09037", + "rxn10018", + "rxn10077", + "rxn10096", + "rxn10097", + "rxn10098", + "rxn10099", + "rxn10101", + "rxn10102", + "rxn10103", + "rxn10104", + "rxn10105", + "rxn10106", + "rxn10107", + "rxn10109", + "rxn10111", + "rxn10403", + "rxn10410", + "rxn10416", + "rxn11313", + "rxn11316", + "rxn11318", + "rxn11353", + "rxn05224", + "rxn05795", + "rxn05796", + "rxn05797", + "rxn05798", + "rxn05799", + "rxn05801", + "rxn05802", + "rxn05803", + "rxn05804", + "rxn05805", + "rxn05806", + "rxn05808", + "rxn05812", + "rxn05815", + "rxn05832", + "rxn05836", + "rxn05851", + "rxn05857", + "rxn05869", + "rxn05870", + "rxn05884", + "rxn05888", + "rxn05896", + "rxn05898", + "rxn05900", + "rxn05903", + "rxn05904", + "rxn05905", + "rxn05911", + "rxn05921", + "rxn05925", + "rxn05936", + "rxn05947", + "rxn05956", + "rxn05959", + "rxn05960", + "rxn05980", + "rxn05991", + "rxn05992", + "rxn05999", + "rxn06001", + "rxn06014", + "rxn06017", + "rxn06021", + "rxn06026", + "rxn06027", + "rxn06034", + "rxn06048", + "rxn06052", + "rxn06053", + "rxn06054", + "rxn06057", + "rxn06059", + "rxn06061", + "rxn06102", + "rxn06103", + "rxn06127", + "rxn06128", + "rxn06129", + "rxn06130", + "rxn06131", + "rxn06132", + "rxn06137", + "rxn06146", + "rxn06161", + "rxn06167", + "rxn06172", + "rxn06174", + "rxn06175", + "rxn06187", + "rxn06189", + "rxn06203", + "rxn06204", + "rxn06246", + "rxn06261", + "rxn06265", + "rxn06266", + "rxn06286", + "rxn06291", + "rxn06294", + "rxn06310", + "rxn06320", + "rxn06327", + "rxn06334", + "rxn06337", + "rxn06339", + "rxn06342", + "rxn06343", + "rxn06350", + "rxn06352", + "rxn06358", + "rxn06361", + "rxn06369", + "rxn06380", + "rxn06395", + "rxn06415", + "rxn06419", + "rxn06420", + "rxn06421", + "rxn06423", + "rxn06450", + "rxn06457", + "rxn06463", + "rxn06464", + "rxn06466", + "rxn06471", + "rxn06482", + "rxn06483", + "rxn06486", + "rxn06492", + "rxn06497", + "rxn06498", + "rxn06501", + "rxn06505", + "rxn06506", + "rxn06521", + "rxn06534", + "rxn06580", + "rxn06585", + "rxn06593", + "rxn06609", + "rxn06613", + "rxn06654", + "rxn06667", + "rxn06676", + "rxn06693", + "rxn06730", + "rxn06746", + "rxn06762", + "rxn06779", + "rxn06790", + "rxn06791", + "rxn06792", + "rxn06793", + "rxn06794", + "rxn06795", + "rxn06796", + "rxn06797", + "rxn06821", + "rxn06826", + "rxn06827", + "rxn06829", + "rxn06839", + "rxn06841", + "rxn06842", + "rxn06851", + "rxn06866", + "rxn06867", + "rxn06873", + "rxn06885", + "rxn06891", + "rxn06892", + "rxn06896", + "rxn06938", + "rxn06939", + "rxn06944", + "rxn06951", + "rxn06952", + "rxn06955", + "rxn06957", + "rxn06960", + "rxn06964", + "rxn06965", + "rxn07086", + "rxn07097", + "rxn07103", + "rxn07104", + "rxn07105", + "rxn07106", + "rxn07107", + "rxn07109", + "rxn07119", + "rxn07179", + "rxn07186", + "rxn07187", + "rxn07188", + "rxn07195", + "rxn07196", + "rxn07197", + "rxn07198", + "rxn07201", + "rxn07205", + "rxn07206", + "rxn07210", + "rxn07244", + "rxn07245", + "rxn07253", + "rxn07275", + "rxn07299", + "rxn07302", + "rxn07651", + "rxn07723", + "rxn07736", + "rxn07878", + "rxn11417", + "rxn11582", + "rxn11593", + "rxn11597", + "rxn11615", + "rxn11617", + "rxn11619", + "rxn11620", + "rxn11624", + "rxn11626", + "rxn11638", + "rxn11648", + "rxn11651", + "rxn11665", + "rxn11666", + "rxn11667", + "rxn11698", + "rxn11983", + "rxn11986", + "rxn11994", + "rxn12006", + "rxn12007", + "rxn12014", + "rxn12017", + "rxn12022", + "rxn12160", + "rxn12161", + "rxn01267", + "rxn05294", + "rxn04656", + ] for item in blacklist: if item not in self.blacklist: self.blacklist.append(item) self.auto_sink = [] - full_id = re.compile('\d+$') + full_id = re.compile("\d+$") for id in auto_sink: if full_id.search(id): self.auto_sink.append(id) else: - for i in range(0,100): + for i in range(0, 100): newid = id + str(i) self.auto_sink.append(newid) - + self.auto_exchange = "e0" self.COBRA_0_BOUND = 0 self.COBRA_DEFAULT_LB = -1000 self.COBRA_DEFAULT_UB = 1000 - - #FBA macro analyses - def test_reaction_additions_againt_limits(self,model,reactions,tests): - filtered = DictList(); + + # FBA macro analyses + def test_reaction_additions_againt_limits(self, model, reactions, tests): + filtered = DictList() with model: for rxn in reactions: if rxn.id() in model.reactions: rxn_obj = model.reactions.get_by_id(rxn.id()) else: rxn_obj = model.add_reactions([rxn]) - self.set_reaction_bounds_from_direction(rxn_obj,reactions[rxn]) + self.set_reaction_bounds_from_direction(rxn_obj, reactions[rxn]) for test in tests: testmodel = model with testmodel: - self.apply_media_to_model(testmodel,test["media"],test["default_uptake"],test["default_excretion"]) - self.set_objective_from_target_reaction(testmodel,test["target"],test["maximize"]) + self.apply_media_to_model( + testmodel, + test["media"], + test["default_uptake"], + test["default_excretion"], + ) + self.set_objective_from_target_reaction( + testmodel, test["target"], test["maximize"] + ) solution = testmodel.optimize() if test.maximize == 1: if testmodel.objective.value() > test.limit: + pass - - - + def build_model_extended_for_gapfilling( + self, + extend_with_template=1, + source_models=[], + input_templates=[], + model_penalty=1, + reaction_scores={}, + ): + model_id = self.fbamodel["id"] + ".gf" - def build_model_extended_for_gapfilling(self,extend_with_template = 1,source_models = [], input_templates = [],model_penalty = 1,reaction_scores = {}): - model_id = self.fbamodel["id"]+".gf" - - #Determine all indecies that should be gapfilled - indexlist = [0]*1000 + # Determine all indecies that should be gapfilled + indexlist = [0] * 1000 compounds = self.fbamodel["modelcompounds"] for compound in compounds: - compartment = compound['modelcompartment_ref'].split("/").pop() + compartment = compound["modelcompartment_ref"].split("/").pop() basecomp = compartment[0:1] if not basecomp == "e": index = compartment[1:] index = int(index) indexlist[index] += 1 - #Iterating over all indecies with more than 10 intracellular compounds: + # Iterating over all indecies with more than 10 intracellular compounds: gapfilling_penalties = dict() - for i in range(0,1000): + for i in range(0, 1000): if indexlist[i] > 10: if extend_with_template == 1: - new_penalties = self.temp_extend_model_index_for_gapfilling(i,input_templates) + new_penalties = self.temp_extend_model_index_for_gapfilling( + i, input_templates + ) gapfilling_penalties.update(new_penalties) if i < len(source_models) and source_models[i] != None: - new_penalties = self.mdl_extend_model_index_for_gapfilling(i,source_models[i],model_penalty) + new_penalties = self.mdl_extend_model_index_for_gapfilling( + i, source_models[i], model_penalty + ) gapfilling_penalties.update(new_penalties) - #Rescaling penalties by reaction scores and saving genes + # Rescaling penalties by reaction scores and saving genes for reaction in gapfilling_penalties: array = reaction.split("_") rxnid = array[0] @@ -172,16 +490,22 @@ def build_model_extended_for_gapfilling(self,extend_with_template = 1,source_mod for gene in reaction_scores[rxnid]: if highest_score < reaction_scores[rxnid][gene]: highest_score = reaction_scores[rxnid][gene] - factor = 1-0.9*highest_score + factor = 1 - 0.9 * highest_score if "reverse" in gapfilling_penalties[reaction]: - penalties[reaction.id]["reverse"] = factor*penalties[reaction.id]["reverse"] + penalties[reaction.id]["reverse"] = ( + factor * penalties[reaction.id]["reverse"] + ) if "forward" in gapfilling_penalties[reaction]: - penalties[reaction.id]["forward"] = factor*penalties[reaction.id]["forward"] + penalties[reaction.id]["forward"] = ( + factor * penalties[reaction.id]["forward"] + ) self.cobramodel.solver.update() return gapfilling_penalties - #Possible new function to add to the KBaseFBAModelToCobraBuilder to extend a model with a template for gapfilling for a specific index - def mdl_extend_model_index_for_gapfilling(self,model,index,source_model,model_penalty): + # Possible new function to add to the KBaseFBAModelToCobraBuilder to extend a model with a template for gapfilling for a specific index + def mdl_extend_model_index_for_gapfilling( + self, model, index, source_model, model_penalty + ): new_metabolites = {} new_reactions = {} new_exchange = [] @@ -189,25 +513,24 @@ def mdl_extend_model_index_for_gapfilling(self,model,index,source_model,model_pe new_penalties = dict() local_remap = {} - comp = re.compile('(.*_*)(.)\d+$') + comp = re.compile("(.*_*)(.)\d+$") for modelcompound in source_model.metabolites: - - - - - + cobra_metabolite = self.convert_modelcompound(modelcompound) original_id = cobra_metabolite.id groups = comp.match(cobra_metabolite.compartment) if groups[2] == "e": - cobra_metabolite.compartment = groups[1]+groups[2]+"0" + cobra_metabolite.compartment = groups[1] + groups[2] + "0" groups = comp.match(cobra_metabolite.id) - cobra_metabolite.id = groups[1]+groups[2]+"0" + cobra_metabolite.id = groups[1] + groups[2] + "0" else: - cobra_metabolite.compartment = groups[1]+groups[2]+str(index) + cobra_metabolite.compartment = groups[1] + groups[2] + str(index) groups = comp.match(cobra_metabolite.id) - cobra_metabolite.id = groups[1]+groups[2]+str(index) - if cobra_metabolite.id not in self.cobramodel.metabolites and cobra_metabolite.id not in new_metabolites: + cobra_metabolite.id = groups[1] + groups[2] + str(index) + if ( + cobra_metabolite.id not in self.cobramodel.metabolites + and cobra_metabolite.id not in new_metabolites + ): new_metabolites[cobra_metabolite.id] = cobra_metabolite if original_id in self.auto_sink: self.demand_compounds.add(cobra_metabolite.id) @@ -216,74 +539,101 @@ def mdl_extend_model_index_for_gapfilling(self,model,index,source_model,model_pe self.exchange_compounds.add(cobra_metabolite.id) new_exchange.append(cobra_metabolite) if cobra_metabolite.id in self.cobramodel.metabolites: - cobra_metabolite = self.cobramodel.metabolites.get_by_id(cobra_metabolite.id) - else:#Just in case the same compound is added twice - we want to switch the metabolite to the first new version + cobra_metabolite = self.cobramodel.metabolites.get_by_id( + cobra_metabolite.id + ) + else: # Just in case the same compound is added twice - we want to switch the metabolite to the first new version cobra_metabolite = new_metabolites[cobra_metabolite.id] local_remap[original_id] = cobra_metabolite - #Adding all metabolites to model prior to adding reactions + # Adding all metabolites to model prior to adding reactions self.cobramodel.add_metabolites(new_metabolites.values()) - + for modelreaction in source_model.reactions: if modelreaction.id.split("_")[0] in self.blacklist: next - #cobra_reaction = self.convert_modelreaction(modelreaction) + # cobra_reaction = self.convert_modelreaction(modelreaction) cobra_reaction = modelreaction.copy() groups = comp.match(cobra_reaction.id) - cobra_reaction.id = groups[1]+groups[2]+str(index) - new_penalties[cobra_reaction.id] = dict(); - #Updating metabolites in reaction to new model - metabolites = cobra_reaction.metabolites; + cobra_reaction.id = groups[1] + groups[2] + str(index) + new_penalties[cobra_reaction.id] = dict() + # Updating metabolites in reaction to new model + metabolites = cobra_reaction.metabolites new_stoichiometry = {} for metabolite in metabolites: - #Adding new coefficient: + # Adding new coefficient: new_stoichiometry[local_remap[metabolite.id]] = metabolites[metabolite] - #Zeroing out current coefficients + # Zeroing out current coefficients if local_remap[metabolite.id] != metabolite: new_stoichiometry[metabolite] = 0 - cobra_reaction.add_metabolites(new_stoichiometry,combine=False) - if cobra_reaction.id not in self.cobramodel.reactions and cobra_reaction.id not in new_reactions: + cobra_reaction.add_metabolites(new_stoichiometry, combine=False) + if ( + cobra_reaction.id not in self.cobramodel.reactions + and cobra_reaction.id not in new_reactions + ): new_reactions[cobra_reaction.id] = cobra_reaction new_penalties[cobra_reaction.id]["added"] = 1 if cobra_reaction.lower_bound < 0: new_penalties[cobra_reaction.id]["reverse"] = model_penalty if cobra_reaction.upper_bound > 0: new_penalties[cobra_reaction.id]["forward"] = model_penalty - elif cobra_reaction.lower_bound < 0 and self.cobramodel.reactions.get_by_id(cobra_reaction.id).lower_bound == 0: - self.cobramodel.reactions.get_by_id(cobra_reaction.id).lower_bound = cobra_reaction.lower_bound - self.cobramodel.reactions.get_by_id(cobra_reaction.id).update_variable_bounds() + elif ( + cobra_reaction.lower_bound < 0 + and self.cobramodel.reactions.get_by_id(cobra_reaction.id).lower_bound + == 0 + ): + self.cobramodel.reactions.get_by_id( + cobra_reaction.id + ).lower_bound = cobra_reaction.lower_bound + self.cobramodel.reactions.get_by_id( + cobra_reaction.id + ).update_variable_bounds() new_penalties[cobra_reaction.id]["reverse"] = model_penalty new_penalties[cobra_reaction.id]["reversed"] = 1 - elif cobra_reaction.upper_bound > 0 and self.cobramodel.reactions.get_by_id(cobra_reaction.id).upper_bound == 0: - self.cobramodel.reactions.get_by_id(cobra_reaction.id).upper_bound = cobra_reaction.upper_bound - self.cobramodel.reactions.get_by_id(cobra_reaction.id).update_variable_bounds() + elif ( + cobra_reaction.upper_bound > 0 + and self.cobramodel.reactions.get_by_id(cobra_reaction.id).upper_bound + == 0 + ): + self.cobramodel.reactions.get_by_id( + cobra_reaction.id + ).upper_bound = cobra_reaction.upper_bound + self.cobramodel.reactions.get_by_id( + cobra_reaction.id + ).update_variable_bounds() new_penalties[cobra_reaction.id]["forward"] = model_penalty new_penalties[cobra_reaction.id]["reversed"] = 1 - #Only run this on new exchanges so we don't readd for all exchanges + # Only run this on new exchanges so we don't readd for all exchanges for cpd in new_exchange: drain_reaction = self.add_drain_from_metabolite_id(cpd.id) - if drain_reaction.id not in self.cobramodel.reactions and drain_reaction.id not in new_reactions: + if ( + drain_reaction.id not in self.cobramodel.reactions + and drain_reaction.id not in new_reactions + ): new_reactions[drain_reaction.id] = drain_reaction - #Only run this on new demands so we don't readd for all exchanges + # Only run this on new demands so we don't readd for all exchanges for cpd_id in new_demand: drain_reaction = self.add_drain_from_metabolite_id( cpd_id, - lower_bound = self.COBRA_0_BOUND, - upper_bound = self.COBRA_DEFAULT_UB, - prefix = 'DM_', - prefix_name = 'Demand for ', - sbo = 'SBO:0000627' + lower_bound=self.COBRA_0_BOUND, + upper_bound=self.COBRA_DEFAULT_UB, + prefix="DM_", + prefix_name="Demand for ", + sbo="SBO:0000627", ) - if drain_reaction.id not in self.cobramodel.reactions and drain_reaction.id not in new_reactions: + if ( + drain_reaction.id not in self.cobramodel.reactions + and drain_reaction.id not in new_reactions + ): new_reactions[drain_reaction.id] = drain_reaction - - #Adding all new reactions to the model at once (much faster than one at a time) + + # Adding all new reactions to the model at once (much faster than one at a time) self.cobramodel.add_reactions(new_reactions.values()) return new_penalties - #Possible new function to add to the KBaseFBAModelToCobraBuilder to extend a model with a template for gapfilling for a specific index - def temp_extend_model_index_for_gapfilling(self,index,input_templates = []): + # Possible new function to add to the KBaseFBAModelToCobraBuilder to extend a model with a template for gapfilling for a specific index + def temp_extend_model_index_for_gapfilling(self, index, input_templates=[]): new_metabolites = {} new_reactions = {} new_exchange = [] @@ -292,13 +642,15 @@ def temp_extend_model_index_for_gapfilling(self,index,input_templates = []): template = None if index < len(input_templates): template = input_templates[index] - elif index in self.fbamodel['template_refs']: - template = self.kbapi.get_from_ws(self.fbamodel['template_refs'][index]) + elif index in self.fbamodel["template_refs"]: + template = self.kbapi.get_from_ws(self.fbamodel["template_refs"][index]) else: - template = self.kbapi.get_from_ws(self.fbamodel['template_ref']) + template = self.kbapi.get_from_ws(self.fbamodel["template_ref"]) if template.info.type != "KBaseFBA.NewModelTemplate": - raise ObjectError(template.info.type+" loaded when KBaseFBA.NewModelTemplate expected") + raise ObjectError( + template.info.type + " loaded when KBaseFBA.NewModelTemplate expected" + ) for template_compound in template.compcompounds: tempindex = index @@ -306,99 +658,130 @@ def temp_extend_model_index_for_gapfilling(self,index,input_templates = []): if compartment == "e": tempindex = 0 - cobra_metabolite = self.convert_template_compound(template_compound,tempindex,template) - if cobra_metabolite.id not in self.cobramodel.metabolites and cobra_metabolite.id not in new_metabolites: + cobra_metabolite = self.convert_template_compound( + template_compound, tempindex, template + ) + if ( + cobra_metabolite.id not in self.cobramodel.metabolites + and cobra_metabolite.id not in new_metabolites + ): new_metabolites[cobra_metabolite.id] = cobra_metabolite - self.cobramodel.add_metabolites([cobra_metabolite]) + self.cobramodel.add_metabolites([cobra_metabolite]) if cobra_metabolite.id in self.auto_sink: self.demand_compounds.add(cobra_metabolite.id) new_demand.append(cobra_metabolite.id) if cobra_metabolite.compartment == self.auto_exchange: new_exchange.append(cobra_metabolite.id) self.exchange_compounds.add(cobra_metabolite.id) - #Adding all metabolites to model prior to adding reactions + # Adding all metabolites to model prior to adding reactions self.cobramodel.add_metabolites(new_metabolites.values()) - + for template_reaction in template.reactions: if template_reaction.id.split("_")[0] in self.blacklist: - continue - cobra_reaction = self.convert_template_reaction(template_reaction,index,template,1) - new_penalties[cobra_reaction.id] = dict(); - if cobra_reaction.id not in self.cobramodel.reactions and cobra_reaction.id not in new_reactions: - #Adding any template reactions missing from the present model + continue + cobra_reaction = self.convert_template_reaction( + template_reaction, index, template, 1 + ) + new_penalties[cobra_reaction.id] = dict() + if ( + cobra_reaction.id not in self.cobramodel.reactions + and cobra_reaction.id not in new_reactions + ): + # Adding any template reactions missing from the present model new_reactions[cobra_reaction.id] = cobra_reaction if cobra_reaction.lower_bound < 0: - new_penalties[cobra_reaction.id]["reverse"] = template_reaction.base_cost + template_reaction.reverse_penalty + new_penalties[cobra_reaction.id]["reverse"] = ( + template_reaction.base_cost + template_reaction.reverse_penalty + ) if cobra_reaction.upper_bound > 0: - new_penalties[cobra_reaction.id]["forward"] = template_reaction.base_cost + template_reaction.forward_penalty + new_penalties[cobra_reaction.id]["forward"] = ( + template_reaction.base_cost + template_reaction.forward_penalty + ) new_penalties[cobra_reaction.id]["added"] = 1 elif template_reaction.GapfillDirection == "=": - #Adjusting directionality as needed for existing reactions + # Adjusting directionality as needed for existing reactions new_penalties[cobra_reaction.id]["reversed"] = 1 - if self.cobramodel.reactions.get_by_id(cobra_reaction.id).lower_bound == 0: - self.cobramodel.reactions.get_by_id(cobra_reaction.id).lower_bound = template_reaction.maxrevflux - self.cobramodel.reactions.get_by_id(cobra_reaction.id).update_variable_bounds() - new_penalties[cobra_reaction.id]["reverse"] = template_reaction.base_cost + template_reaction.reverse_penalty - if self.cobramodel.reactions.get_by_id(cobra_reaction.id).upper_bound == 0: - self.cobramodel.reactions.get_by_id(cobra_reaction.id).upper_bound = template_reaction.maxforflux - self.cobramodel.reactions.get_by_id(cobra_reaction.id).update_variable_bounds() - new_penalties[cobra_reaction.id]["forward"] = template_reaction.base_cost + template_reaction.forward_penalty - - #Only run this on new exchanges so we don't readd for all exchanges + if ( + self.cobramodel.reactions.get_by_id(cobra_reaction.id).lower_bound + == 0 + ): + self.cobramodel.reactions.get_by_id( + cobra_reaction.id + ).lower_bound = template_reaction.maxrevflux + self.cobramodel.reactions.get_by_id( + cobra_reaction.id + ).update_variable_bounds() + new_penalties[cobra_reaction.id]["reverse"] = ( + template_reaction.base_cost + template_reaction.reverse_penalty + ) + if ( + self.cobramodel.reactions.get_by_id(cobra_reaction.id).upper_bound + == 0 + ): + self.cobramodel.reactions.get_by_id( + cobra_reaction.id + ).upper_bound = template_reaction.maxforflux + self.cobramodel.reactions.get_by_id( + cobra_reaction.id + ).update_variable_bounds() + new_penalties[cobra_reaction.id]["forward"] = ( + template_reaction.base_cost + template_reaction.forward_penalty + ) + + # Only run this on new exchanges so we don't readd for all exchanges for cpd_id in new_exchange: drain_reaction = self.add_drain_from_metabolite_id(cpd_id) if drain_reaction != None and drain_reaction.id not in new_reactions: new_reactions[drain_reaction.id] = drain_reaction - #Only run this on new demands so we don't readd for all exchanges + # Only run this on new demands so we don't readd for all exchanges for cpd_id in new_demand: drain_reaction = self.add_drain_from_metabolite_id( - cpd_id, - self.COBRA_0_BOUND, - self.COBRA_DEFAULT_UB, - "DM_", - "Demand for " + cpd_id, self.COBRA_0_BOUND, self.COBRA_DEFAULT_UB, "DM_", "Demand for " ) if drain_reaction != None and drain_reaction.id not in new_reactions: new_reactions[drain_reaction.id] = drain_reaction - - #Adding all new reactions to the model at once (much faster than one at a time) + + # Adding all new reactions to the model at once (much faster than one at a time) self.cobramodel.add_reactions(new_reactions.values()) return new_penalties - + def convert_modelreaction(self, reaction, bigg=False): mr_id = reaction.id name = reaction.name annotation = reaction.annotation lower_bound, upper_bound = reaction.get_reaction_constraints() - + id = build_rxn_id(mr_id) if bigg and "bigg.reaction" in annotation: id = annotation["bigg.reaction"] - + gpr = reaction.get_gpr() - - cobra_reaction = Reaction(id, - name=name, - lower_bound=lower_bound, - upper_bound=upper_bound) - cobra_reaction.annotation[self.SBO_ANNOTATION] = "SBO:0000176" #biochemical reaction + + cobra_reaction = Reaction( + id, name=name, lower_bound=lower_bound, upper_bound=upper_bound + ) + cobra_reaction.annotation[ + self.SBO_ANNOTATION + ] = "SBO:0000176" # biochemical reaction cobra_reaction.annotation.update(annotation) - - if id.startswith('rxn'): + + if id.startswith("rxn"): cobra_reaction.annotation["seed.reaction"] = id.split("_")[0] - - cobra_reaction.add_metabolites(self.convert_modelreaction_stoichiometry(reaction)) - + + cobra_reaction.add_metabolites( + self.convert_modelreaction_stoichiometry(reaction) + ) + cobra_reaction.gene_reaction_rule = reaction.gene_reaction_rule - + for genes in gpr: for gene in genes: if not gene in self.genes: self.genes[gene] = gene - + return cobra_reaction - + def convert_modelcompound(self, metabolite, bigg=False): formula = metabolite.formula name = metabolite.name @@ -406,86 +789,142 @@ def convert_modelcompound(self, metabolite, bigg=False): mc_id = metabolite.id compartment = metabolite.compartment annotation = metabolite.annotation - + id = build_cpd_id(mc_id) - + if bigg and "bigg.metabolite" in annotation: id = annotation["bigg.metabolite"] + "_" + compartment - #print(id) - - met = Metabolite(id, - formula=formula, - name=name, - charge=charge, - compartment=compartment) - - met.annotation[self.SBO_ANNOTATION] = "SBO:0000247" #simple chemical - Simple, non-repetitive chemical entity. - if id.startswith('cpd'): + # print(id) + + met = Metabolite( + id, formula=formula, name=name, charge=charge, compartment=compartment + ) + + met.annotation[ + self.SBO_ANNOTATION + ] = "SBO:0000247" # simple chemical - Simple, non-repetitive chemical entity. + if id.startswith("cpd"): met.annotation["seed.compound"] = id.split("_")[0] met.annotation.update(annotation) return met - + def convert_modelreaction_stoichiometry(self, reaction): object_stoichiometry = {} s = reaction.stoichiometry for metabolite_id in s: if metabolite_id in self.metabolites_remap: - object_stoichiometry[self.cobramodel.metabolites.get_by_id(self.metabolites_remap[metabolite_id])] = s[metabolite_id] + object_stoichiometry[ + self.cobramodel.metabolites.get_by_id( + self.metabolites_remap[metabolite_id] + ) + ] = s[metabolite_id] return object_stoichiometry - - def create_binary_variables(self,rxnobj,forward = 1,reverse = 1): + + def create_binary_variables(self, rxnobj, forward=1, reverse=1): if rxnobj.id not in self.binary_flux_variables: self.binary_flux_variables[rxnobj.id] = dict() self.binary_flux_constraints[rxnobj.id] = dict() - if forward == 1 and rxnobj.upper_bound > 0 and "forward" not in self.binary_flux_variables[rxnobj.id]: - self.binary_flux_variables[rxnobj.id]["forward"] = self.cobramodel.problem.Variable(rxnobj.id+"_fb", lb=0,ub=1,type="binary") - self.cobramodel.add_cons_vars(self.binary_flux_variables[rxnobj.id]["forward"]) - self.binary_flux_constraints[rxnobj.id]["forward"] = self.cobramodel.problem.Constraint( - 1000*self.binary_flux_variables[rxnobj.id]["forward"] - rxnobj.forward_variable,lb=0,ub=None,name=rxnobj.id+"_fb" + if ( + forward == 1 + and rxnobj.upper_bound > 0 + and "forward" not in self.binary_flux_variables[rxnobj.id] + ): + self.binary_flux_variables[rxnobj.id][ + "forward" + ] = self.cobramodel.problem.Variable( + rxnobj.id + "_fb", lb=0, ub=1, type="binary" + ) + self.cobramodel.add_cons_vars( + self.binary_flux_variables[rxnobj.id]["forward"] ) - self.cobramodel.add_cons_vars(self.binary_flux_constraints[rxnobj.id]["forward"]) - if reverse == 1 and rxnobj.lower_bound < 0 and "reverse" not in self.binary_flux_variables[rxnobj.id]: - self.binary_flux_variables[rxnobj.id]["reverse"] = self.cobramodel.problem.Variable(rxnobj.id+"_bb", lb=0,ub=1,type="binary") - self.cobramodel.add_cons_vars(self.binary_flux_variables[rxnobj.id]["reverse"]) - self.binary_flux_constraints[rxnobj.id]["reverse"] = self.cobramodel.problem.Constraint( - 1000*self.binary_flux_variables[rxnobj.id]["reverse"] - rxnobj.forward_variable,lb=0,ub=None,name=rxnobj.id+"_bb" + self.binary_flux_constraints[rxnobj.id][ + "forward" + ] = self.cobramodel.problem.Constraint( + 1000 * self.binary_flux_variables[rxnobj.id]["forward"] + - rxnobj.forward_variable, + lb=0, + ub=None, + name=rxnobj.id + "_fb", ) - self.cobramodel.add_cons_vars(self.binary_flux_constraints[rxnobj.id]["reverse"]) - - def binary_check_gapfilling_solution(self,gapfilling_penalties,add_solution_exclusion_constraint): + self.cobramodel.add_cons_vars( + self.binary_flux_constraints[rxnobj.id]["forward"] + ) + if ( + reverse == 1 + and rxnobj.lower_bound < 0 + and "reverse" not in self.binary_flux_variables[rxnobj.id] + ): + self.binary_flux_variables[rxnobj.id][ + "reverse" + ] = self.cobramodel.problem.Variable( + rxnobj.id + "_bb", lb=0, ub=1, type="binary" + ) + self.cobramodel.add_cons_vars( + self.binary_flux_variables[rxnobj.id]["reverse"] + ) + self.binary_flux_constraints[rxnobj.id][ + "reverse" + ] = self.cobramodel.problem.Constraint( + 1000 * self.binary_flux_variables[rxnobj.id]["reverse"] + - rxnobj.forward_variable, + lb=0, + ub=None, + name=rxnobj.id + "_bb", + ) + self.cobramodel.add_cons_vars( + self.binary_flux_constraints[rxnobj.id]["reverse"] + ) + + def binary_check_gapfilling_solution( + self, gapfilling_penalties, add_solution_exclusion_constraint + ): objcoef = {} flux_values = self.compute_flux_values_from_variables() for rxnobj in self.cobramodel.reactions: if rxnobj.id in gapfilling_penalties: - if "reverse" in gapfilling_penalties[rxnobj.id] and flux_values[rxnobj.id]["reverse"] > Zero: - self.create_binary_variables(rxnobj,0,1) + if ( + "reverse" in gapfilling_penalties[rxnobj.id] + and flux_values[rxnobj.id]["reverse"] > Zero + ): + self.create_binary_variables(rxnobj, 0, 1) objcoef[self.binary_flux_variables[rxnobj.id]["reverse"]] = 1 - if "forward" in gapfilling_penalties[rxnobj.id] and flux_values[rxnobj.id]["forward"] > Zero: - self.create_binary_variables(rxnobj,1,0) + if ( + "forward" in gapfilling_penalties[rxnobj.id] + and flux_values[rxnobj.id]["forward"] > Zero + ): + self.create_binary_variables(rxnobj, 1, 0) objcoef[self.binary_flux_variables[rxnobj.id]["forward"]] = 1 with self.cobramodel: - #Setting all gapfilled reactions not in the solution to zero - min_reaction_objective = self.cobramodel.problem.Objective(Zero,direction="min") + # Setting all gapfilled reactions not in the solution to zero + min_reaction_objective = self.cobramodel.problem.Objective( + Zero, direction="min" + ) for rxnobj in self.cobramodel.reactions: if rxnobj.id in gapfilling_penalties: - if "reverse" in gapfilling_penalties[rxnobj.id] and flux_values[rxnobj.id]["reverse"] <= Zero: + if ( + "reverse" in gapfilling_penalties[rxnobj.id] + and flux_values[rxnobj.id]["reverse"] <= Zero + ): rxnobj.lower_bound = 0 - if "forward" in gapfilling_penalties[rxnobj.id] and flux_values[rxnobj.id]["forward"] <= Zero: + if ( + "forward" in gapfilling_penalties[rxnobj.id] + and flux_values[rxnobj.id]["forward"] <= Zero + ): rxnobj.upper_bound = 0 rxnobj.update_variable_bounds() - #Setting the objective to be minimization of sum of binary variables + # Setting the objective to be minimization of sum of binary variables self.cobramodel.objective = min_reaction_objective min_reaction_objective.set_linear_coefficients(objcoef) - with open('GapfillBinary.lp', 'w') as out: + with open("GapfillBinary.lp", "w") as out: out.write(str(self.cobramodel.solver)) self.cobramodel.optimize() flux_values = self.compute_flux_values_from_variables() if add_solution_exclusion_constraint == 1: self.add_binary_solution_exclusion_constraint(flux_values) return flux_values - - #Adds a constraint that eliminates a gapfilled solution from feasibility so a new solution can be obtained - def add_binary_solution_exclusion_constraint(self,flux_values): + + # Adds a constraint that eliminates a gapfilled solution from feasibility so a new solution can be obtained + def add_binary_solution_exclusion_constraint(self, flux_values): count = len(self.solution_exclusion_constraints) solution_coef = {} solution_size = 0 @@ -496,69 +935,76 @@ def add_binary_solution_exclusion_constraint(self,flux_values): solution_coef[self.binary_flux_variables[reaction][direction]] = 1 if len(solution_coef) > 0: new_exclusion_constraint = self.cobramodel.problem.Constraint( - Zero,lb=None,ub=(solution_size-1),name="exclusion."+str(count+1) + Zero, + lb=None, + ub=(solution_size - 1), + name="exclusion." + str(count + 1), ) self.cobramodel.add_cons_vars(new_exclusion_constraint) self.cobramodel.solver.update() new_exclusion_constraint.set_linear_coefficients(solution_coef) - self.solution_exclusion_constraints.append(new_exclusion_constraint); + self.solution_exclusion_constraints.append(new_exclusion_constraint) return new_exclusion_constraint return None - - #Takes gapfilled penalties and creates and objective function minimizing gapfilled reactions - def create_minimal_reaction_objective(self,penalty_hash,default_penalty = 0): - reaction_objective = self.cobramodel.problem.Objective( - Zero, - direction="min") + + # Takes gapfilled penalties and creates and objective function minimizing gapfilled reactions + def create_minimal_reaction_objective(self, penalty_hash, default_penalty=0): + reaction_objective = self.cobramodel.problem.Objective(Zero, direction="min") obj_coef = dict() for reaction in self.cobramodel.reactions: if reaction.id in penalty_hash: - #Minimizing gapfilled reactions + # Minimizing gapfilled reactions if "reverse" in penalty_hash[reaction.id]: - obj_coef[reaction.reverse_variable] = abs(penalty_hash[reaction.id]["reverse"]) + obj_coef[reaction.reverse_variable] = abs( + penalty_hash[reaction.id]["reverse"] + ) elif default_penalty != 0: obj_coef[reaction.reverse_variable] = default_penalty if "forward" in penalty_hash[reaction.id]: - obj_coef[reaction.forward_variable] = abs(penalty_hash[reaction.id]["forward"]) + obj_coef[reaction.forward_variable] = abs( + penalty_hash[reaction.id]["forward"] + ) elif default_penalty != 0: obj_coef[reaction.forward_variable] = default_penalty else: obj_coef[reaction.forward_variable] = default_penalty obj_coef[reaction.reverse_variable] = default_penalty - + self.cobramodel.objective = reaction_objective reaction_objective.set_linear_coefficients(obj_coef) - - #Required this function to add gapfilled compounds to a KBase model for saving gapfilled model - def convert_cobra_compound_to_kbcompound(self,cpd,kbmodel,add_to_model = 1): + + # Required this function to add gapfilled compounds to a KBase model for saving gapfilled model + def convert_cobra_compound_to_kbcompound(self, cpd, kbmodel, add_to_model=1): refid = "cpd00000" - if re.search('cpd\d+_[a-z]+',cpd.id): + if re.search("cpd\d+_[a-z]+", cpd.id): refid = cpd.id - refid = re.sub("_[a-z]\d+$","",refid) + refid = re.sub("_[a-z]\d+$", "", refid) cpd_data = { "aliases": [], "charge": cpd.charge, - "compound_ref": "~/template/compounds/id/"+refid, + "compound_ref": "~/template/compounds/id/" + refid, "dblinks": {}, "formula": cpd.formula, "id": cpd.id, "inchikey": "ALYNCZNDIQEVRV-UHFFFAOYSA-M", - "modelcompartment_ref": "~/modelcompartments/id/"+cpd.id.split("_").pop(), + "modelcompartment_ref": "~/modelcompartments/id/" + cpd.id.split("_").pop(), "name": cpd.name(), "numerical_attributes": {}, - "string_attributes": {} + "string_attributes": {}, } cpd_data = AttrDict(cpd_data) if add_to_model == 1: kbmodel.modelcompounds.append(cpd_data) return cpd_data - #Required this function to add gapfilled reactions to a KBase model for saving gapfilled model - def convert_cobra_reaction_to_kbreaction(self,rxn,kbmodel,direction = "=",add_to_model = 1): + # Required this function to add gapfilled reactions to a KBase model for saving gapfilled model + def convert_cobra_reaction_to_kbreaction( + self, rxn, kbmodel, direction="=", add_to_model=1 + ): rxnref = "~/template/reactions/id/rxn00000_c" - if re.search('rxn\d+_[a-z]+',rxn.id): - rxnref = "~/template/reactions/id/"+rxn.id - rxnref = re.sub("\d+$","",rxnref) + if re.search("rxn\d+_[a-z]+", rxn.id): + rxnref = "~/template/reactions/id/" + rxn.id + rxnref = re.sub("\d+$", "", rxnref) rxn_data = { "id": rxn.id, "aliases": [], @@ -570,30 +1016,31 @@ def convert_cobra_reaction_to_kbreaction(self,rxn,kbmodel,direction = "=",add_to "maxrevflux": 1000000, "modelReactionProteins": [], "modelReactionReagents": [], - "modelcompartment_ref": "~/modelcompartments/id/"+rxn.id.split("_").pop(), + "modelcompartment_ref": "~/modelcompartments/id/" + rxn.id.split("_").pop(), "name": rxn.name, "numerical_attributes": {}, "probability": 0, "protons": 0, "reaction_ref": rxnref, - "string_attributes": {} + "string_attributes": {}, } rxn_data = AttrDict(rxn_data) for cpd in rxn.metabolites: if cpd.id not in kbmodel.modelcompounds: - convert_cobra_compound_to_kbcompound(cpd,kbmodel,1) - rxn_data.modelReactionReagents.append({ - "coefficient" : rxn.metabolites[cpd], - "modelcompound_ref" : "~/modelcompounds/id/"+cpd.id - }) + convert_cobra_compound_to_kbcompound(cpd, kbmodel, 1) + rxn_data.modelReactionReagents.append( + { + "coefficient": rxn.metabolites[cpd], + "modelcompound_ref": "~/modelcompounds/id/" + cpd.id, + } + ) if add_to_model == 1: kbmodel.modelreactions.append(rxn_data) return rxn_data - - def convert_objective_to_constraint(self,lower_bound,upper_bound): + + def convert_objective_to_constraint(self, lower_bound, upper_bound): old_obj_variable = self.cobramodel.problem.Variable( - name="old_objective_variable", - lb=lower_bound,ub=upper_bound + name="old_objective_variable", lb=lower_bound, ub=upper_bound ) old_obj_constraint = self.cobramodel.problem.Constraint( self.cobramodel.solver.objective.expression - old_obj_variable, @@ -602,7 +1049,7 @@ def convert_objective_to_constraint(self,lower_bound,upper_bound): name="old_objective_constraint", ) self.cobramodel.add_cons_vars([old_obj_variable, old_obj_constraint]) - + def compute_flux_values_from_variables(self): flux_values = {} for rxnobj in self.cobramodel.reactions: @@ -610,26 +1057,32 @@ def compute_flux_values_from_variables(self): flux_values[rxnobj.id]["reverse"] = rxnobj.reverse_variable.primal flux_values[rxnobj.id]["forward"] = rxnobj.forward_variable.primal return flux_values - - def compute_gapfilled_solution(self,penalties,flux_values = None): + + def compute_gapfilled_solution(self, penalties, flux_values=None): if flux_values == None: flux_values = self.compute_flux_values_from_variables() - output = {"reversed" : {},"new" : {}} + output = {"reversed": {}, "new": {}} for reaction in self.cobramodel.reactions: if reaction.id in penalties: - if flux_values[reaction.id]["forward"] > Zero and "forward" in penalties[reaction.id]: + if ( + flux_values[reaction.id]["forward"] > Zero + and "forward" in penalties[reaction.id] + ): if "added" in penalties[reaction.id]: output["new"][reaction.id] = ">" else: output["reversed"][reaction.id] = ">" - elif flux_values[reaction.id]["reverse"] > Zero and "reverse" in penalties[reaction.id]: + elif ( + flux_values[reaction.id]["reverse"] > Zero + and "reverse" in penalties[reaction.id] + ): if "added" in penalties[reaction.id]: output["new"][reaction.id] = "<" else: output["reversed"][reaction.id] = "<" return output - - def add_gapfilling_solution_to_kbase_model(self,newmodel,penalties,media_ref): + + def add_gapfilling_solution_to_kbase_model(self, newmodel, penalties, media_ref): gfid = None if gfid == None: largest_index = 0 @@ -637,62 +1090,88 @@ def add_gapfilling_solution_to_kbase_model(self,newmodel,penalties,media_ref): current_index = gapfilling.id.split(".").pop() if largest_index == 0 or largest_index < current_index: largest_index = current_index - gfid = "gf."+str(largest_index+1) - newmodel.gapfillings.append({ - "gapfill_id": newmodel.id+"."+gfid, - "id": gfid, - "integrated": 1, - "integrated_solution": "0", - "media_ref": media_ref - }) + gfid = "gf." + str(largest_index + 1) + newmodel.gapfillings.append( + { + "gapfill_id": newmodel.id + "." + gfid, + "id": gfid, + "integrated": 1, + "integrated_solution": "0", + "media_ref": media_ref, + } + ) for reaction in self.cobramodel.reactions: if reaction.id in penalties: - if reaction.forward_variable.primal > Zero and "forward" in penalties[reaction.id]: + if ( + reaction.forward_variable.primal > Zero + and "forward" in penalties[reaction.id] + ): if reaction.id not in newmodel.modelreactions: - self.convert_cobra_reaction_to_kbreaction(reaction,newmodel,">",1) + self.convert_cobra_reaction_to_kbreaction( + reaction, newmodel, ">", 1 + ) gfrxn = newmodel.modelreactions.get_by_id(reaction.id) gfrxn.gapfill_data[gfid] = dict() - gfrxn.gapfill_data[gfid]["0"] = [">",1,[]] - elif reaction.forward_variable.primal > Zero and "reverse" in penalties[reaction.id]: + gfrxn.gapfill_data[gfid]["0"] = [">", 1, []] + elif ( + reaction.forward_variable.primal > Zero + and "reverse" in penalties[reaction.id] + ): if reaction.id not in newmodel.modelreactions: - self.convert_cobra_reaction_to_kbreaction(reaction,newmodel,"<",1) + self.convert_cobra_reaction_to_kbreaction( + reaction, newmodel, "<", 1 + ) gfrxn = newmodel.modelreactions.get_by_id(reaction.id) gfrxn.gapfill_data[gfid] = dict() - gfrxn.gapfill_data[gfid]["0"] = ["<",1,[]] - - def compute_reaction_scores(self,weigh_all_events_equally = 1,weights = None): + gfrxn.gapfill_data[gfid]["0"] = ["<", 1, []] + + def compute_reaction_scores(self, weigh_all_events_equally=1, weights=None): reaction_genes = {} if "genome_ref" in self.fbamodel: anno_api = annotation_ontology_api() - events = anno_api.get_annotation_ontology_events({ - "input_ref" : self.fbamodel["genome_ref"], - }) + events = anno_api.get_annotation_ontology_events( + { + "input_ref": self.fbamodel["genome_ref"], + } + ) for event in events: for gene in event["ontology_terms"]: if "modelseed_ids" in event["ontology_terms"][gene]: for rxn in event["ontology_terms"][gene]["modelseed_ids"]: - newrxn = re.sub("^MSRXN:","",rxn) + newrxn = re.sub("^MSRXN:", "", rxn) if newrxn not in reaction_genes: reaction_genes[newrxn] = {} if gene not in reaction_genes[newrxn]: - reaction_genes[newrxn][gene] = 0 + reaction_genes[newrxn][gene] = 0 if weigh_all_events_equally == 1 or weights == None: reaction_genes[newrxn][gene] += 1 elif event["description"] in weights: - reaction_genes[newrxn][gene] += weights[event["description"]] + reaction_genes[newrxn][gene] += weights[ + event["description"] + ] elif event["event_id"] in weights: - reaction_genes[newrxn][gene] += weights[event["event_id"]] + reaction_genes[newrxn][gene] += weights[ + event["event_id"] + ] elif event["id"] in weights: reaction_genes[newrxn][gene] += weights[event["id"]] return reaction_genes - - def replicate_model(self,count): - newmodel = Model(self.cobramodel.id+"_rep"+str(count)) - utilities = KBaseFBAUtilities(newmodel,newmodel,self.kbapi,self.media,default_uptake = self.default_uptake,default_excretion = self.default_excretion,blacklist = self.blacklist) + + def replicate_model(self, count): + newmodel = Model(self.cobramodel.id + "_rep" + str(count)) + utilities = KBaseFBAUtilities( + newmodel, + newmodel, + self.kbapi, + self.media, + default_uptake=self.default_uptake, + default_excretion=self.default_excretion, + blacklist=self.blacklist, + ) metabolites = [] reactions = [] metabolite_hash = {} - for i in range(0,count): + for i in range(0, count): for metabolite in self.cobramodel.metabolites: metabolite = metabolite.copy() metabolite.id = metabolite.id + "__" + str(i) @@ -704,19 +1183,19 @@ def replicate_model(self,count): input_metabolites = {} for metabolite in reaction.metabolites: newid = metabolite.id + "__" + str(i) - input_metabolites[metabolite_hash[newid]] = reaction.metabolites[metabolite] - reaction.add_metabolites(input_metabolites,combine=False) + input_metabolites[metabolite_hash[newid]] = reaction.metabolites[ + metabolite + ] + reaction.add_metabolites(input_metabolites, combine=False) reactions.append(reaction) newmodel.add_metabolites(metabolites) newmodel.add_reactions(reactions) return utilities - - def test_reaction_additions_againt_limits(self,reactions,directions,tests): + + def test_reaction_additions_againt_limits(self, reactions, directions, tests): filtered_rxn = [] filtered_direction = [] - - - #Using "with" to ensure we don't alter the model with these tests + # Using "with" to ensure we don't alter the model with these tests model = self.cobramodel with model: for rxn in reactions: @@ -724,19 +1203,26 @@ def test_reaction_additions_againt_limits(self,reactions,directions,tests): rxn_obj = self.cobramodel.reactions.get_by_id(rxn.id()) else: rxn_obj = self.cobramodel.add_reactions([rxn]) - self.set_reaction_bounds_from_direction(rxn_obj,reactions[rxn]) + self.set_reaction_bounds_from_direction(rxn_obj, reactions[rxn]) for test in tests: testmodel = model with testmodel: - self.apply_media_to_model(test["media"],test["default_uptake"],test["default_excretion"],testmodel) - self.set_objective_from_target_reaction(test["target"],test["maximize"],testmodel) + self.apply_media_to_model( + test["media"], + test["default_uptake"], + test["default_excretion"], + testmodel, + ) + self.set_objective_from_target_reaction( + test["target"], test["maximize"], testmodel + ) solution = self.cobramodel.optimize() if test.maximize == 1: if testmodel.objective.value() > test.limit: - - - def set_reaction_bounds_from_direction(self,reaction,direction,add=0): - if direction == "<": + pass + + def set_reaction_bounds_from_direction(self, reaction, direction, add=0): + if direction == "<": reaction.lower_bound = -100 if add == 0: reaction.upper_bound = 0 @@ -744,4 +1230,4 @@ def set_reaction_bounds_from_direction(self,reaction,direction,add=0): reaction.upper_bound = 100 if add == 0: reaction.lower_bound = 0 - reaction.update_variable_bounds() \ No newline at end of file + reaction.update_variable_bounds() diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 26e4f0a3..fdf33c9d 100755 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -9,7 +9,10 @@ from optlang.symbolics import Zero, add from modelseedpy.core.rast_client import RastClient from modelseedpy.core.msgenome import normalize_role -from modelseedpy.core.msmodel import get_gpr_string, get_reaction_constraints_from_direction +from modelseedpy.core.msmodel import ( + get_gpr_string, + get_reaction_constraints_from_direction, +) from cobra.core import Gene, Metabolite, Model, Reaction from modelseedpy.core.msmodelutl import MSModelUtil from modelseedpy.core.mstemplate import MSTemplateBuilder @@ -22,30 +25,42 @@ _path = _dirname(_abspath(__file__)) min_gap = { - 'Glc/O2': 5, - 'Etho/O2': 0.01, - 'Ac/O2': 1, - 'Pyr/O2': 3, - 'Glyc/O2': 2, - 'Fum/O2': 3, - 'Succ/O2': 2, - 'Akg/O2': 2, - 'LLac/O2': 2, - 'Dlac/O2': 2, - 'For/O2': 2, - 'For/NO3': 1.5, - 'Pyr/NO': 2.5, - 'Pyr/NO2': 2.5, - 'Pyr/NO3': 2.5, - 'Pyr/SO4': 2.5, + "Glc/O2": 5, + "Etho/O2": 0.01, + "Ac/O2": 1, + "Pyr/O2": 3, + "Glyc/O2": 2, + "Fum/O2": 3, + "Succ/O2": 2, + "Akg/O2": 2, + "LLac/O2": 2, + "Dlac/O2": 2, + "For/O2": 2, + "For/NO3": 1.5, + "Pyr/NO": 2.5, + "Pyr/NO2": 2.5, + "Pyr/NO3": 2.5, + "Pyr/SO4": 2.5, } + class MSATPCorrection: DEBUG = False - def __init__(self,model_or_mdlutl,core_template=None,atp_medias=[],compartment="c0",max_gapfilling=10, - gapfilling_delta=0,atp_hydrolysis_id=None,load_default_medias=True,forced_media=[],default_media_path=None): + def __init__( + self, + model_or_mdlutl, + core_template=None, + atp_medias=[], + compartment="c0", + max_gapfilling=10, + gapfilling_delta=0, + atp_hydrolysis_id=None, + load_default_medias=True, + forced_media=[], + default_media_path=None, + ): """ :param model: :param core_template: @@ -57,29 +72,29 @@ def __init__(self,model_or_mdlutl,core_template=None,atp_medias=[],compartment=" :param gapfilling_delta: string : difference between lowest gapfilling and current gapfilling where media will be accepted :param atp_hydrolysis_id: string : ATP Hydrolysis reaction ID, if None it will perform a SEED reaction search """ - #Discerning input is model or mdlutl and setting internal links + # Discerning input is model or mdlutl and setting internal links if isinstance(model_or_mdlutl, MSModelUtil): self.model = model_or_mdlutl.model self.modelutl = model_or_mdlutl else: self.model = model_or_mdlutl self.modelutl = MSModelUtil.get(model_or_mdlutl) - #Setting atpcorrection attribute in model utl so link is bidirectional + # Setting atpcorrection attribute in model utl so link is bidirectional self.modelutl.atputl = self - + if default_media_path: self.default_media_path = default_media_path else: - self.default_media_path = _path+"/../data/atp_medias.tsv" - + self.default_media_path = _path + "/../data/atp_medias.tsv" + self.compartment = compartment - + if atp_hydrolysis_id and atp_hydrolysis_id in self.model.reactions: self.atp_hydrolysis = self.model.reactions.get_by_id(atp_hydrolysis_id) else: output = self.modelutl.add_atp_hydrolysis(compartment) self.atp_hydrolysis = output["reaction"] - + self.atp_medias = [] if load_default_medias: self.load_default_medias() @@ -88,27 +103,29 @@ def __init__(self,model_or_mdlutl,core_template=None,atp_medias=[],compartment=" self.atp_medias.append(media) else: self.atp_medias.append([media, 0.01]) - + self.forced_media = [] for media_id in forced_media: for media in self.atp_medias: if media.id == media_id: self.forced_media.append(media) break - + self.max_gapfilling = max_gapfilling self.gapfilling_delta = gapfilling_delta - + if not core_template: self.load_default_template() else: self.coretemplate = core_template - - self.msgapfill = MSGapfill(self.modelutl, default_gapfill_templates=core_template) - #These should stay as None until atp correction is actually run + + self.msgapfill = MSGapfill( + self.modelutl, default_gapfill_templates=core_template + ) + # These should stay as None until atp correction is actually run self.cumulative_core_gapfilling = None self.selected_media = None - + self.original_bounds = {} self.noncore_reactions = [] self.other_compartments = [] @@ -118,27 +135,29 @@ def __init__(self,model_or_mdlutl,core_template=None,atp_medias=[],compartment=" self.multiplier = 1.2 def load_default_template(self): - self.coretemplate = MSTemplateBuilder.from_dict(get_template('template_core'), None).build() - + self.coretemplate = MSTemplateBuilder.from_dict( + get_template("template_core"), None + ).build() + def load_default_medias(self): filename = self.default_media_path - medias = pd.read_csv(filename, sep='\t', index_col=0).to_dict() + medias = pd.read_csv(filename, sep="\t", index_col=0).to_dict() for media_id in medias: media_d = {} for exchange, v in medias[media_id].items(): if v > 0: - k = exchange.split('_')[1] + k = exchange.split("_")[1] media_d[k] = v - media_d['cpd00001'] = 1000 - media_d['cpd00067'] = 1000 + media_d["cpd00001"] = 1000 + media_d["cpd00067"] = 1000 media = MSMedia.from_dict(media_d) media.id = media_id media.name = media_id min_obj = 0.01 if media_id in min_gap: min_obj = min_gap[media_id] - self.atp_medias.append([media,min_obj]) - + self.atp_medias.append([media, min_obj]) + @staticmethod def find_reaction_in_template(model_reaction, template, compartment): template_reaction = None # we save lookup result here @@ -149,7 +168,9 @@ def find_reaction_in_template(model_reaction, template, compartment): if msid is not None: msid += "_" + compartment if msid in template.reactions: - template_reaction = template.reactions.get_by_id(model_reaction.id[0:-1]) + template_reaction = template.reactions.get_by_id( + model_reaction.id[0:-1] + ) else: # will leave this here for now def split_id_from_index(s): @@ -165,7 +186,7 @@ def split_id_from_index(s): break str_pos -= 1 - return s[:str_pos + 1], s[str_pos + 1:] + return s[: str_pos + 1], s[str_pos + 1 :] rxn_id, index = split_id_from_index(model_reaction.id) if rxn_id in template.reactions: @@ -194,10 +215,15 @@ def disable_noncore_reactions(self): if FBAHelper.is_biomass(reaction): continue - self.original_bounds[reaction.id] = (reaction.lower_bound, reaction.upper_bound) + self.original_bounds[reaction.id] = ( + reaction.lower_bound, + reaction.upper_bound, + ) # check if reaction is in core template - template_reaction = self.find_reaction_in_template(reaction, self.coretemplate, self.compartment[0:1]) + template_reaction = self.find_reaction_in_template( + reaction, self.coretemplate, self.compartment[0:1] + ) # update bounds to reaction if template_reaction is not None: @@ -239,33 +265,46 @@ def evaluate_growth_media(self): output = {} with self.model: self.model.objective = self.atp_hydrolysis.id - #self.model.objective = self.model.problem.Objective(Zero,direction="max") + # self.model.objective = self.model.problem.Objective(Zero,direction="max") - logger.debug(f'ATP bounds: ({self.atp_hydrolysis.lower_bound}, {self.atp_hydrolysis.upper_bound})') - #self.model.objective.set_linear_coefficients({self.atp_hydrolysis.forward_variable:1}) + logger.debug( + f"ATP bounds: ({self.atp_hydrolysis.lower_bound}, {self.atp_hydrolysis.upper_bound})" + ) + # self.model.objective.set_linear_coefficients({self.atp_hydrolysis.forward_variable:1}) pkgmgr = MSPackageManager.get_pkg_mgr(self.model) for media, minimum_obj in self.atp_medias: - logger.debug('evaluate media %s', media) + logger.debug("evaluate media %s", media) pkgmgr.getpkg("KBaseMediaPkg").build_package(media) - logger.debug('model.medium %s', self.model.medium) + logger.debug("model.medium %s", self.model.medium) solution = self.model.optimize() - logger.debug('evaluate media %s - %f (%s)', media.id, solution.objective_value, solution.status) + logger.debug( + "evaluate media %s - %f (%s)", + media.id, + solution.objective_value, + solution.status, + ) self.media_gapfill_stats[media] = None output[media.id] = solution.objective_value - #with open("Core-"+media.id.replace("/","-")+".lp", 'w') as out: + # with open("Core-"+media.id.replace("/","-")+".lp", 'w') as out: # out.write(str(self.model.solver)) - if solution.objective_value < minimum_obj or solution.status != 'optimal': - #self.msgapfill.lp_filename = "CoreGF-"+media.id.replace("/","-")+".lp" - self.media_gapfill_stats[media] = self.msgapfill.run_gapfilling(media, - self.atp_hydrolysis.id, - minimum_obj) - #IF gapfilling fails - need to activate and penalize the noncore and try again + if ( + solution.objective_value < minimum_obj + or solution.status != "optimal" + ): + # self.msgapfill.lp_filename = "CoreGF-"+media.id.replace("/","-")+".lp" + self.media_gapfill_stats[media] = self.msgapfill.run_gapfilling( + media, self.atp_hydrolysis.id, minimum_obj + ) + # IF gapfilling fails - need to activate and penalize the noncore and try again elif solution.objective_value >= minimum_obj: - self.media_gapfill_stats[media] = {'reversed': {}, 'new': {}} - logger.debug('gapfilling stats: %s', json.dumps(self.media_gapfill_stats[media], indent=2,default=vars)) + self.media_gapfill_stats[media] = {"reversed": {}, "new": {}} + logger.debug( + "gapfilling stats: %s", + json.dumps(self.media_gapfill_stats[media], indent=2, default=vars), + ) if MSATPCorrection.DEBUG: - with open('debug.json', 'w') as outfile: + with open("debug.json", "w") as outfile: json.dump(self.media_gapfill_stats[media], outfile) return output @@ -275,17 +314,25 @@ def determine_growth_media(self, max_gapfilling=None): Decides which of the test media to use as growth conditions for this model :return: """ + def scoring_function(media): - return len(self.media_gapfill_stats[media]["new"].keys()) + 0.5 * \ - len(self.media_gapfill_stats[media]["reversed"].keys()) + return len(self.media_gapfill_stats[media]["new"].keys()) + 0.5 * len( + self.media_gapfill_stats[media]["reversed"].keys() + ) + if not max_gapfilling: max_gapfilling = self.max_gapfilling self.selected_media = [] media_scores = dict( - (media, scoring_function(media)) for media in self.media_gapfill_stats if self.media_gapfill_stats[media]) + (media, scoring_function(media)) + for media in self.media_gapfill_stats + if self.media_gapfill_stats[media] + ) best_score = min(media_scores.values()) - if max_gapfilling is None or max_gapfilling > (best_score+self.gapfilling_delta): - max_gapfilling = best_score+self.gapfilling_delta + if max_gapfilling is None or max_gapfilling > ( + best_score + self.gapfilling_delta + ): + max_gapfilling = best_score + self.gapfilling_delta for media in media_scores: score = media_scores[media] logger.debug(score, best_score, max_gapfilling) @@ -297,11 +344,19 @@ def apply_growth_media_gapfilling(self): Applies the gapfilling to all selected growth media :return: """ - self.cumulative_core_gapfilling = []#TODO: In case someone runs ATP correction twice with different parameters, before resetting this, maybe check if any of these reactions are already in the model and remove them so we're starting fresh??? + self.cumulative_core_gapfilling = ( + [] + ) # TODO: In case someone runs ATP correction twice with different parameters, before resetting this, maybe check if any of these reactions are already in the model and remove them so we're starting fresh??? for media in self.selected_media: - if media in self.media_gapfill_stats and self.media_gapfill_stats[media] and MSGapfill.gapfill_count(self.media_gapfill_stats[media]) > 0: - self.msgapfill.integrate_gapfill_solution(self.media_gapfill_stats[media],self.cumulative_core_gapfilling) - + if ( + media in self.media_gapfill_stats + and self.media_gapfill_stats[media] + and MSGapfill.gapfill_count(self.media_gapfill_stats[media]) > 0 + ): + self.msgapfill.integrate_gapfill_solution( + self.media_gapfill_stats[media], self.cumulative_core_gapfilling + ) + def expand_model_to_genome_scale(self): """Restores noncore reactions to model while filtering out reactions that break ATP Parameters @@ -317,10 +372,12 @@ def expand_model_to_genome_scale(self): # it is not detrimental to run this twice self.restore_noncore_reactions(noncore=True, othercompartment=False) # Extending model with non core reactions while retaining ATP accuracy - self.filtered_noncore = self.modelutl.reaction_expansion_test(self.noncore_reactions,tests) + self.filtered_noncore = self.modelutl.reaction_expansion_test( + self.noncore_reactions, tests + ) # Removing filtered reactions for item in self.filtered_noncore: - print("Removing "+item[0].id+" "+item[1]) + print("Removing " + item[0].id + " " + item[1]) if item[1] == ">": item[0].upper_bound = 0 else: @@ -331,7 +388,7 @@ def expand_model_to_genome_scale(self): # Restoring other compartment reactions but not the core because this would undo reaction filtering self.restore_noncore_reactions(noncore=False, othercompartment=True) - def restore_noncore_reactions(self,noncore = True,othercompartment = True): + def restore_noncore_reactions(self, noncore=True, othercompartment=True): """ Restores the bounds on all noncore reactions :return: @@ -340,29 +397,35 @@ def restore_noncore_reactions(self,noncore = True,othercompartment = True): if noncore: for item in self.noncore_reactions: reaction = item[0] - if reaction.id in self.original_bounds and reaction in self.model.reactions: + if ( + reaction.id in self.original_bounds + and reaction in self.model.reactions + ): reaction.lower_bound = self.original_bounds[reaction.id][0] reaction.upper_bound = self.original_bounds[reaction.id][1] if othercompartment: for item in self.other_compartments: reaction = item[0] - if reaction.id in self.original_bounds and reaction in self.model.reactions: + if ( + reaction.id in self.original_bounds + and reaction in self.model.reactions + ): reaction.lower_bound = self.original_bounds[reaction.id][0] reaction.upper_bound = self.original_bounds[reaction.id][1] def build_tests(self, multiplier=None): """Build tests based on ATP media evaluations - + Parameters ---------- multiplier : float Override for multiplier to ATP threshold dictating when tests will pass and fail - + Returns ------- list<{"media":obj media,"is_max_threshold":bool,"threshold":float,"objective":string}> List of test specifications - + Raises ------ """ @@ -373,13 +436,15 @@ def build_tests(self, multiplier=None): for media in self.selected_media: self.modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package(media) obj_value = self.model.slim_optimize() - logger.debug(f'{media.name} = {obj_value}') - tests.append({ - "media": media, - "is_max_threshold": True, - "threshold": multiplier*obj_value, - "objective": self.atp_hydrolysis.id - }) + logger.debug(f"{media.name} = {obj_value}") + tests.append( + { + "media": media, + "is_max_threshold": True, + "threshold": multiplier * obj_value, + "objective": self.atp_hydrolysis.id, + } + ) return tests def run_atp_correction(self): @@ -394,10 +459,22 @@ def run_atp_correction(self): self.evaluate_growth_media() self.expand_model_to_genome_scale() return self.build_tests() - + @staticmethod - def atp_correction(model, core_template, atp_medias=None, atp_objective="bio2", - max_gapfilling=None, gapfilling_delta=0): - atp_correction = MSATPCorrection(model, core_template, atp_medias, atp_hydrolysis_id=atp_objective, - max_gapfilling=max_gapfilling, gapfilling_delta=gapfilling_delta) - return atp_correction.run_atp_correction() \ No newline at end of file + def atp_correction( + model, + core_template, + atp_medias=None, + atp_objective="bio2", + max_gapfilling=None, + gapfilling_delta=0, + ): + atp_correction = MSATPCorrection( + model, + core_template, + atp_medias, + atp_hydrolysis_id=atp_objective, + max_gapfilling=max_gapfilling, + gapfilling_delta=gapfilling_delta, + ) + return atp_correction.run_atp_correction() diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 41aa5f40..aa062288 100755 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -3,7 +3,10 @@ import cobra from modelseedpy.core.rast_client import RastClient from modelseedpy.core.msgenome import normalize_role -from modelseedpy.core.msmodel import get_gpr_string, get_reaction_constraints_from_direction +from modelseedpy.core.msmodel import ( + get_gpr_string, + get_reaction_constraints_from_direction, +) from cobra.core import Gene, Metabolite, Model, Reaction from modelseedpy.core import FBAHelper from modelseedpy.fbapkg.mspackagemanager import MSPackageManager @@ -14,226 +17,173 @@ ### temp stuff ### core_biomass = { - 'cpd00032_c0': -1.7867, - 'cpd00005_c0': -1.8225, - 'cpd00169_c0': -1.496, - 'cpd11416_c0': 1, - 'cpd00003_c0': -3.547, - 'cpd00008_c0': 41.257, - 'cpd00024_c0': -1.0789, - 'cpd00009_c0': 41.257, - 'cpd00102_c0': -0.129, - 'cpd00101_c0': -0.8977, - 'cpd00236_c0': -0.8977, - 'cpd00002_c0': -41.257, - 'cpd00022_c0': -3.7478, - 'cpd00020_c0': -2.8328, - 'cpd00006_c0': 1.8225, - 'cpd00001_c0': -41.257, - 'cpd00072_c0': -0.0709, - 'cpd00010_c0': 3.7478, - 'cpd00004_c0': 3.547, - 'cpd00061_c0': -0.5191, - 'cpd00067_c0': 46.6265, - 'cpd00079_c0': -0.205 + "cpd00032_c0": -1.7867, + "cpd00005_c0": -1.8225, + "cpd00169_c0": -1.496, + "cpd11416_c0": 1, + "cpd00003_c0": -3.547, + "cpd00008_c0": 41.257, + "cpd00024_c0": -1.0789, + "cpd00009_c0": 41.257, + "cpd00102_c0": -0.129, + "cpd00101_c0": -0.8977, + "cpd00236_c0": -0.8977, + "cpd00002_c0": -41.257, + "cpd00022_c0": -3.7478, + "cpd00020_c0": -2.8328, + "cpd00006_c0": 1.8225, + "cpd00001_c0": -41.257, + "cpd00072_c0": -0.0709, + "cpd00010_c0": 3.7478, + "cpd00004_c0": 3.547, + "cpd00061_c0": -0.5191, + "cpd00067_c0": 46.6265, + "cpd00079_c0": -0.205, } core_atp2 = { - 'cpd00067_c0': 46.6265, - 'cpd00002_c0': -41.257, - 'cpd00008_c0': 41.257, - 'cpd00001_c0': -41.257, - 'cpd00009_c0': 41.257, + "cpd00067_c0": 46.6265, + "cpd00002_c0": -41.257, + "cpd00008_c0": 41.257, + "cpd00001_c0": -41.257, + "cpd00009_c0": 41.257, } core_atp = { - 'cpd00067_c0': 1, - 'cpd00002_c0': -1, - 'cpd00008_c0': 1, - 'cpd00001_c0': -1, - 'cpd00009_c0': 1, + "cpd00067_c0": 1, + "cpd00002_c0": -1, + "cpd00008_c0": 1, + "cpd00001_c0": -1, + "cpd00009_c0": 1, } gramneg = { - 'cpd00166_c0': -0.00280615915959131, - 'cpd00087_c0': -0.00280615915959131, - 'cpd15560_c0': -0.00280615915959131, - 'cpd00028_c0': -0.00280615915959131, - 'cpd10515_c0': -0.00280615915959131, - 'cpd15665_c0': -0.0250105977108944, - 'cpd12370_c0': 0.00280615915959131, - 'cpd15500_c0': -0.00280615915959131, - 'cpd00220_c0': -0.00280615915959131, - 'cpd00003_c0': -0.00280615915959131, - 'cpd00557_c0': -0.00280615915959131, - 'cpd00002_c0': -40.1101757365074, - 'cpd00023_c0': -0.219088153012743, - 'cpd00062_c0': -0.0908319049068452, - 'cpd00050_c0': -0.00280615915959131, - 'cpd00008_c0': 40, - 'cpd00264_c0': -0.00280615915959131, - 'cpd00010_c0': -0.00280615915959131, - 'cpd15533_c0': -0.0311453449430676, - 'cpd11416_c0': 1, - 'cpd15540_c0': -0.0311453449430676, - 'cpd00048_c0': -0.00280615915959131, - 'cpd00035_c0': -0.427934380173264, - 'cpd17042_c0': -1, - 'cpd00030_c0': -0.00280615915959131, - 'cpd00034_c0': -0.00280615915959131, - 'cpd00161_c0': -0.211072732780569, - 'cpd00201_c0': -0.00280615915959131, - 'cpd00016_c0': -0.00280615915959131, - 'cpd00104_c0': -0.00280615915959131, - 'cpd00067_c0': 40, - 'cpd11493_c0': -0.00280615915959131, - 'cpd00051_c0': -0.246696822701341, - 'cpd00017_c0': -0.00280615915959131, - 'cpd00357_c0': -0.0157642107352084, - 'cpd17041_c0': -1, - 'cpd00038_c0': -0.135406821203723, - 'cpd00107_c0': -0.375388847540127, - 'cpd00042_c0': -0.00280615915959131, - 'cpd00149_c0': -0.00280615915959131, - 'cpd00058_c0': -0.00280615915959131, - 'cpd00041_c0': -0.200830806928348, - 'cpd00129_c0': -0.184354665339991, - 'cpd03736_c0': -0.0250105977108944, - 'cpd00052_c0': -0.0841036156544863, - 'cpd00012_c0': 0.484600235732628, - 'cpd15352_c0': -0.00280615915959131, - 'cpd00322_c0': -0.241798510337235, - 'cpd00053_c0': -0.219088153012743, - 'cpd00006_c0': -0.00280615915959131, - 'cpd00345_c0': -0.00280615915959131, - 'cpd00063_c0': -0.00280615915959131, - 'cpd00033_c0': -0.509869786991038, - 'cpd00066_c0': -0.154519490031345, - 'cpd17043_c0': -1, - 'cpd00118_c0': -0.00280615915959131, - 'cpd00009_c0': 39.9971938408404, - 'cpd15793_c0': -0.0311453449430676, - 'cpd00356_c0': -0.01627686799489, - 'cpd01997_c0': 0.00280615915959131, - 'cpd00132_c0': -0.200830806928348, - 'cpd00060_c0': -0.127801422590767, - 'cpd00037_c0': -0.00280615915959131, - 'cpd00115_c0': -0.0157642107352084, - 'cpd00099_c0': -0.00280615915959131, - 'cpd00156_c0': -0.352233189091625, - 'cpd02229_c0': -0.0250105977108944, - 'cpd00069_c0': -0.120676604606612, - 'cpd00065_c0': -0.0472019191450218, - 'cpd00241_c0': -0.01627686799489, - 'cpd15666_c0': 0.0250105977108944, - 'cpd10516_c0': -0.00280615915959131, - 'cpd00084_c0': -0.0761464922056484, - 'cpd00056_c0': -0.00280615915959131, - 'cpd00119_c0': -0.0792636000737159, - 'cpd00001_c0': -35.5403092430435, - 'cpd03422_c0': 0.00280615915959131, - 'cpd00015_c0': -0.00280615915959131, - 'cpd00054_c0': -0.179456352975885, - 'cpd00205_c0': -0.00280615915959131, - 'cpd00039_c0': -0.285438020490179, - 'cpd00254_c0': -0.00280615915959131 + "cpd11463_c0": 1, + "cpd00008_c0": 40, + "cpd00067_c0": 40, + "cpd00009_c0": 40, + "cpd00001_c0": -40, + "cpd00002_c0": -40, + "cpd00166_c0": -0.00280615915959131, + "cpd00087_c0": -0.00280615915959131, + "cpd15560_c0": -0.00280615915959131, + "cpd00028_c0": -0.00280615915959131, + "cpd10515_c0": -0.00280615915959131, + "cpd15665_c0": -0.0250105977108944, + "cpd12370_c0": 0.00280615915959131, + "cpd15500_c0": -0.00280615915959131, + "cpd00220_c0": -0.00280615915959131, + "cpd00003_c0": -0.00280615915959131, + "cpd00557_c0": -0.00280615915959131, + "cpd00050_c0": -0.00280615915959131, + "cpd00264_c0": -0.00280615915959131, + "cpd00010_c0": -0.00280615915959131, + "cpd15533_c0": -0.0311453449430676, + "cpd15540_c0": -0.0311453449430676, + "cpd00048_c0": -0.00280615915959131, + "cpd00030_c0": -0.00280615915959131, + "cpd00034_c0": -0.00280615915959131, + "cpd00201_c0": -0.00280615915959131, + "cpd00016_c0": -0.00280615915959131, + "cpd00104_c0": -0.00280615915959131, + "cpd11493_c0": -0.00280615915959131, + "cpd00017_c0": -0.00280615915959131, + "cpd00042_c0": -0.00280615915959131, + "cpd00149_c0": -0.00280615915959131, + "cpd00058_c0": -0.00280615915959131, + "cpd03736_c0": -0.0250105977108944, + "cpd15352_c0": -0.00280615915959131, + "cpd00006_c0": -0.00280615915959131, + "cpd00345_c0": -0.00280615915959131, + "cpd00063_c0": -0.00280615915959131, + "cpd00118_c0": -0.00280615915959131, + "cpd15793_c0": -0.0311453449430676, + "cpd01997_c0": 0.00280615915959131, + "cpd00037_c0": -0.00280615915959131, + "cpd00099_c0": -0.00280615915959131, + "cpd02229_c0": -0.0250105977108944, + "cpd15666_c0": 0.0250105977108944, + "cpd10516_c0": -0.00280615915959131, + "cpd00056_c0": -0.00280615915959131, + "cpd03422_c0": 0.00280615915959131, + "cpd00015_c0": -0.00280615915959131, + "cpd00205_c0": -0.00280615915959131, + "cpd00254_c0": -0.00280615915959131, + "cpd11463_c0": -0.5, + "cpd11461_c0": -0.1, + "cpd11462_c0": -0.2, } grampos = { - 'cpd00241_c0': -0.0116907079028565, - 'cpd00017_c0': -0.00719527989638797, - 'cpd00033_c0': -0.409331301687739, - 'cpd00066_c0': -0.176188648374102, - 'cpd17043_c0': -1, - 'cpd03422_c0': 0.00719527989638797, - 'cpd17041_c0': -1, - 'cpd00557_c0': -0.00719527989638797, - 'cpd00129_c0': -0.161028229793075, - 'cpd00166_c0': -0.00719527989638797, - 'cpd00030_c0': -0.00719527989638797, - 'cpd00087_c0': -0.00719527989638797, - 'cpd00015_c0': -0.00719527989638797, - 'cpd00065_c0': -0.0544955586831525, - 'cpd00357_c0': -0.0151844826784228, - 'cpd00009_c0': 41.2498047201036, - 'cpd00038_c0': -0.0424026391792249, - 'cpd15667_c0': -0.00309563020839783, - 'cpd00069_c0': -0.111039822579957, - 'cpd15540_c0': -0.0251172136637642, - 'cpd00161_c0': -0.186841915485094, - 'cpd15748_c0': -0.00309563020839783, - 'cpd00035_c0': -0.267560900902997, - 'cpd00048_c0': -0.00719527989638797, - 'cpd12370_c0': 0.00719527989638797, - 'cpd00052_c0': -0.0261242266150642, - 'cpd15757_c0': -0.00309563020839783, - 'cpd00053_c0': -0.261005044219309, - 'cpd15533_c0': -0.0251172136637642, - 'cpd00002_c0': -41.2913947104178, - 'cpd00006_c0': -0.00719527989638797, - 'cpd00084_c0': -0.0569540049395353, - 'cpd10515_c0': -0.00719527989638797, - 'cpd00104_c0': -0.00719527989638797, - 'cpd00051_c0': -0.193397772168782, - 'cpd00028_c0': -0.00719527989638797, - 'cpd00118_c0': -0.00719527989638797, - 'cpd00107_c0': -0.347460404235438, - 'cpd00037_c0': -0.00719527989638797, - 'cpd15793_c0': -0.0251172136637642, - 'cpd00010_c0': -0.00719527989638797, - 'cpd11493_c0': -0.00719527989638797, - 'cpd00264_c0': -0.00719527989638797, - 'cpd15766_c0': -0.00309563020839783, - 'cpd00041_c0': -0.14832625746843, - 'cpd00056_c0': -0.00719527989638797, - 'cpd01997_c0': 0.00719527989638797, - 'cpd15668_c0': -0.00309563020839783, - 'cpd00254_c0': -0.00719527989638797, - 'cpd11416_c0': 1, - 'cpd02229_c0': -0.00309563020839783, - 'cpd00003_c0': -0.00719527989638797, - 'cpd00008_c0': 41.257, - 'cpd17042_c0': -1, - 'cpd00023_c0': -0.261005044219309, - 'cpd15665_c0': -0.00309563020839783, - 'cpd11459_c0': -0.00309563020839783, - 'cpd15666_c0': 0.0123825208335913, - 'cpd00115_c0': -0.0151844826784228, - 'cpd00050_c0': -0.00719527989638797, - 'cpd00063_c0': -0.00719527989638797, - 'cpd00205_c0': -0.00719527989638797, - 'cpd00054_c0': -0.216753011604418, - 'cpd00042_c0': -0.00719527989638797, - 'cpd00034_c0': -0.00719527989638797, - 'cpd15500_c0': -0.00719527989638797, - 'cpd00156_c0': -0.307715523090583, - 'cpd00132_c0': -0.14832625746843, - 'cpd00067_c0': -41.257, - 'cpd15775_c0': -0.00309563020839783, - 'cpd00119_c0': -0.0819482085460939, - 'cpd00060_c0': -0.11349826883634, - 'cpd00001_c0': 45.354000686262, - 'cpd00099_c0': -0.00719527989638797, - 'cpd00356_c0': -0.0116907079028565, - 'cpd00220_c0': -0.00719527989638797, - 'cpd00322_c0': -0.27042908820211, - 'cpd00062_c0': -0.0282246669459237, - 'cpd00345_c0': -0.00719527989638797, - 'cpd00012_c0': 0.184896624320595, - 'cpd10516_c0': -0.00719527989638797, - 'cpd00039_c0': -0.323695423757071, - 'cpd00201_c0': -0.00719527989638797, - 'cpd15669_c0': -0.00309563020839783, - 'cpd15560_c0': -0.00719527989638797, - 'cpd00149_c0': -0.00719527989638797, - 'cpd00058_c0': -0.00719527989638797, - 'cpd00016_c0': -0.00719527989638797, - 'cpd15352_c0': -0.00719527989638797 + "cpd11416_c0": 1, + "cpd00001_c0": -40, + "cpd00009_c0": 40, + "cpd00008_c0": 40, + "cpd00002_c0": -40, + "cpd00067_c0": 40, + "cpd00017_c0": -0.00719527989638797, + "cpd03422_c0": 0.00719527989638797, + "cpd00557_c0": -0.00719527989638797, + "cpd00166_c0": -0.00719527989638797, + "cpd00030_c0": -0.00719527989638797, + "cpd00087_c0": -0.00719527989638797, + "cpd00015_c0": -0.00719527989638797, + "cpd00038_c0": -0.0424026391792249, + "cpd15667_c0": -0.00309563020839783, + "cpd15540_c0": -0.0251172136637642, + "cpd15748_c0": -0.00309563020839783, + "cpd00048_c0": -0.00719527989638797, + "cpd12370_c0": 0.00719527989638797, + "cpd00052_c0": -0.0261242266150642, + "cpd15757_c0": -0.00309563020839783, + "cpd15533_c0": -0.0251172136637642, + "cpd00006_c0": -0.00719527989638797, + "cpd10515_c0": -0.00719527989638797, + "cpd00104_c0": -0.00719527989638797, + "cpd00028_c0": -0.00719527989638797, + "cpd00118_c0": -0.00719527989638797, + "cpd00037_c0": -0.00719527989638797, + "cpd15793_c0": -0.0251172136637642, + "cpd00010_c0": -0.00719527989638797, + "cpd11493_c0": -0.00719527989638797, + "cpd00264_c0": -0.00719527989638797, + "cpd15766_c0": -0.00309563020839783, + "cpd00056_c0": -0.00719527989638797, + "cpd01997_c0": 0.00719527989638797, + "cpd15668_c0": -0.00309563020839783, + "cpd00254_c0": -0.00719527989638797, + "cpd02229_c0": -0.00309563020839783, + "cpd00003_c0": -0.00719527989638797, + "cpd15665_c0": -0.00309563020839783, + "cpd11459_c0": -0.00309563020839783, + "cpd15666_c0": 0.0123825208335913, + "cpd00050_c0": -0.00719527989638797, + "cpd00063_c0": -0.00719527989638797, + "cpd00205_c0": -0.00719527989638797, + "cpd00042_c0": -0.00719527989638797, + "cpd00034_c0": -0.00719527989638797, + "cpd15500_c0": -0.00719527989638797, + "cpd15775_c0": -0.00309563020839783, + "cpd00099_c0": -0.00719527989638797, + "cpd00220_c0": -0.00719527989638797, + "cpd00062_c0": -0.0282246669459237, + "cpd00345_c0": -0.00719527989638797, + "cpd10516_c0": -0.00719527989638797, + "cpd00201_c0": -0.00719527989638797, + "cpd15669_c0": -0.00309563020839783, + "cpd15560_c0": -0.00719527989638797, + "cpd00149_c0": -0.00719527989638797, + "cpd00058_c0": -0.00719527989638797, + "cpd00016_c0": -0.00719527989638797, + "cpd15352_c0": -0.00719527989638797, + "cpd11463_c0": -0.5, + "cpd11461_c0": -0.1, + "cpd11462_c0": -0.2, } -def build_biomass(rxn_id, cobra_model, template, biomass_compounds, index='0'): - bio_rxn = Reaction(rxn_id, 'biomass', '', 0, 1000) +def build_biomass(rxn_id, cobra_model, template, biomass_compounds, index="0"): + bio_rxn = Reaction(rxn_id, "biomass", "", 0, 1000) metabolites = {} for cpd_id in biomass_compounds: if cpd_id in cobra_model.metabolites: @@ -268,17 +218,18 @@ def _aaaa(genome, ontology_term): def aux_template(template): rxn_roles = {} - roles = dict(map(lambda x: (x['id'], x), template.roles)) + roles = dict(map(lambda x: (x["id"], x), template.roles)) for r in template.reactions: rxn_roles[r.id] = set() complex_roles = r.get_complex_roles() if len(complex_roles) > 0: for cpx_id in complex_roles: for role_id in complex_roles[cpx_id]: - rxn_roles[r.id].add(normalize_role(roles[role_id]['name'])) + rxn_roles[r.id].add(normalize_role(roles[role_id]["name"])) # print(role_id, normalize_role(roles[role_id]['name'])) return rxn_roles + def build_gpr2(cpx_sets): list_of_ors = [] for cpx in cpx_sets: @@ -286,14 +237,15 @@ def build_gpr2(cpx_sets): for role_id in cpx_sets[cpx]: gene_ors = cpx_sets[cpx][role_id] if len(gene_ors) > 1: - list_of_ands.append('(' + ' or '.join(gene_ors) + ')') + list_of_ands.append("(" + " or ".join(gene_ors) + ")") else: list_of_ands.append(list(gene_ors)[0]) - list_of_ors.append('(' + ' and '.join(list_of_ands) + ')') + list_of_ors.append("(" + " and ".join(list_of_ands) + ")") if len(list_of_ors) > 1: - return ' or '.join(list_of_ors) + return " or ".join(list_of_ors) return list_of_ors[0] + def build_gpr(cpx_gene_role): """ example input: @@ -314,20 +266,19 @@ def build_gpr(cpx_gene_role): # print(cpx_id) for complex_set in cpx_gene_role[cpx_id]: # print(complex_set) - gpr_or_ll.append("({})".format(' and '.join(set(complex_set)))) + gpr_or_ll.append("({})".format(" and ".join(set(complex_set)))) - return ' or '.join(gpr_or_ll) + return " or ".join(gpr_or_ll) class MSBuilder: - def __init__(self, genome, template=None): """ for future methods with better customization """ self.genome = genome self.template = template - self.search_name_to_genes, self.search_name_to_original = _aaaa(genome, 'RAST') + self.search_name_to_genes, self.search_name_to_original = _aaaa(genome, "RAST") def _get_template_reaction_complexes(self, template_reaction): """ @@ -344,12 +295,16 @@ def _get_template_reaction_complexes(self, template_reaction): sn, triggering, optional, - set() if sn not in self.search_name_to_genes else set(self.search_name_to_genes[sn]) + set() + if sn not in self.search_name_to_genes + else set(self.search_name_to_genes[sn]), ] return template_reaction_complexes - + @staticmethod - def _build_reaction_complex_gpr_sets2(match_complex, allow_incomplete_complexes=True): + def _build_reaction_complex_gpr_sets2( + match_complex, allow_incomplete_complexes=True + ): complexes = {} for cpx_id in match_complex: complete = True @@ -361,16 +316,18 @@ def _build_reaction_complex_gpr_sets2(match_complex, allow_incomplete_complexes= if len(t[3]) > 0: roles.add(role_id) role_genes[role_id] = t[3] - #print(cpx_id, complete, roles) + # print(cpx_id, complete, roles) if len(roles) > 0 and (allow_incomplete_complexes or complete): complexes[cpx_id] = {} for role_id in role_genes: complexes[cpx_id][role_id] = role_genes[role_id] - #print(role_id, role_genes[role_id]) + # print(role_id, role_genes[role_id]) return complexes @staticmethod - def _build_reaction_complex_gpr_sets(match_complex, allow_incomplete_complexes=True): + def _build_reaction_complex_gpr_sets( + match_complex, allow_incomplete_complexes=True + ): complexes = {} for cpx_id in match_complex: complete = True @@ -378,7 +335,9 @@ def _build_reaction_complex_gpr_sets(match_complex, allow_incomplete_complexes=T role_genes = {} for role_id in match_complex[cpx_id]: t = match_complex[cpx_id][role_id] - complete &= len(t[3]) > 0 or not t[1] or t[2] # true if has genes or is not triggering or is optional + complete &= ( + len(t[3]) > 0 or not t[1] or t[2] + ) # true if has genes or is not triggering or is optional # print(t[3]) if len(t[3]) > 0: roles.add(role_id) @@ -386,32 +345,42 @@ def _build_reaction_complex_gpr_sets(match_complex, allow_incomplete_complexes=T # print(t) # it is never complete if has no genes, only needed if assuming a complex can have all # roles be either non triggering or optional - logger.debug('[%s] maps to %s and complete: %s', cpx_id, roles, complete) + logger.debug("[%s] maps to %s and complete: %s", cpx_id, roles, complete) if len(roles) > 0 and (allow_incomplete_complexes or complete): - logger.debug('[%s] role_genes: %s', cpx_id, role_genes) + logger.debug("[%s] role_genes: %s", cpx_id, role_genes) ll = [] for role_id in role_genes: role_gene_set = [] for gene_id in role_genes[role_id]: role_gene_set.append({gene_id: role_id}) ll.append(role_gene_set) - logger.debug('[%s] complex lists: %s', cpx_id, ll) + logger.debug("[%s] complex lists: %s", cpx_id, ll) complexes[cpx_id] = list( - map(lambda x: dict(map(lambda o: list(o.items())[0], x)), itertools.product(*ll))) + map( + lambda x: dict(map(lambda o: list(o.items())[0], x)), + itertools.product(*ll), + ) + ) return complexes - def get_gpr_from_template_reaction(self, template_reaction, allow_incomplete_complexes=True): - template_reaction_complexes = self._get_template_reaction_complexes(template_reaction) + def get_gpr_from_template_reaction( + self, template_reaction, allow_incomplete_complexes=True + ): + template_reaction_complexes = self._get_template_reaction_complexes( + template_reaction + ) if len(template_reaction_complexes) == 0: return None # self.map_gene(template_reaction_complexes) # print(template_reaction_complexes) - gpr_set = self._build_reaction_complex_gpr_sets2(template_reaction_complexes, allow_incomplete_complexes) + gpr_set = self._build_reaction_complex_gpr_sets2( + template_reaction_complexes, allow_incomplete_complexes + ) return gpr_set @staticmethod - def _build_reaction(reaction_id, gpr_set, template, index='0', sbo=None): + def _build_reaction(reaction_id, gpr_set, template, index="0", sbo=None): template_reaction = template.reactions.get_by_id(reaction_id) reaction_compartment = template_reaction.compartment @@ -420,17 +389,20 @@ def _build_reaction(reaction_id, gpr_set, template, index='0', sbo=None): for cpd, value in template_reaction.metabolites.items(): compartment = f"{cpd.compartment}{index}" name = f"{cpd.name}_{compartment}" - cpd = Metabolite(cpd.id + str(index), cpd.formula, name, cpd.charge, compartment) + cpd = Metabolite( + cpd.id + str(index), cpd.formula, name, cpd.charge, compartment + ) metabolites[cpd] = value reaction = Reaction( "{}{}".format(template_reaction.id, index), "{}_{}{}".format(template_reaction.name, reaction_compartment, index), - '', - template_reaction.lower_bound, template_reaction.upper_bound + "", + template_reaction.lower_bound, + template_reaction.upper_bound, ) - gpr_str = build_gpr2(gpr_set) if gpr_set else '' + gpr_str = build_gpr2(gpr_set) if gpr_set else "" reaction.add_metabolites(metabolites) if gpr_str and len(gpr_str) > 0: reaction.gene_reaction_rule = gpr_str # get_gpr_string(gpr_ll) @@ -441,7 +413,7 @@ def _build_reaction(reaction_id, gpr_set, template, index='0', sbo=None): return reaction @staticmethod - def build_exchanges(model, extra_cell='e0'): + def build_exchanges(model, extra_cell="e0"): """ Build exchange reactions for the "extra_cell" compartment :param model: Cobra Model @@ -451,9 +423,15 @@ def build_exchanges(model, extra_cell='e0'): reactions_exchanges = [] for m in model.metabolites: if m.compartment == extra_cell: - rxn_exchange_id = 'EX_' + m.id + rxn_exchange_id = "EX_" + m.id if rxn_exchange_id not in model.reactions: - rxn_exchange = Reaction(rxn_exchange_id, 'Exchange for ' + m.name, 'exchanges', -1000, 1000) + rxn_exchange = Reaction( + rxn_exchange_id, + "Exchange for " + m.name, + "exchanges", + -1000, + 1000, + ) rxn_exchange.add_metabolites({m: -1}) rxn_exchange.annotation[SBO_ANNOTATION] = "SBO:0000627" reactions_exchanges.append(rxn_exchange) @@ -461,16 +439,105 @@ def build_exchanges(model, extra_cell='e0'): return reactions_exchanges + @staticmethod + def get_or_create_metabolite( + model, template, cpd_base_id, compartment="c", index=0 + ): + if isinstance(index, int): + index = str(index) + full_id = cpd_base_id + "_" + compartment + index + if full_id not in model.metabolites: + pass + return model.metabolites.get_by_id(full_id) + + @staticmethod + def build_biomass_new(model, template, index): + biomasses = [] + for bio in template.biomasses: + # Creating biomass reaction object + metabolites = {} + biorxn = Reaction(bio.id, bio.name, "biomasses", 0, 1000) + # Adding standard compounds for DNA, RNA, protein, and biomass + if bio["type"] == "growth": + met = MSBuilder.get_or_create_metabolite( + model, template, "cpd11416", "c", index + ) + metabolites[met] = 1 + if "dna" in bio and bio["dna"] > 0: + met = MSBuilder.get_or_create_metabolite( + model, template, "cpd11461", "c", index + ) + metabolites[met] = -1 * bio["dna"] + if "protein" in bio and bio["protein"] > 0: + met = MSBuilder.get_or_create_metabolite( + model, template, "cpd11463", "c", index + ) + metabolites[met] = -1 * bio["protein"] + if "rna" in bio and bio["rna"] > 0: + met = MSBuilder.get_or_create_metabolite( + model, template, "cpd11462", "c", index + ) + metabolites[met] = -1 * bio["rna"] + bio_type_hash = {} + for type in types: + for comp in bio["templateBiomassComponents"]: + fullid = FBAHelper.id_from_ref(comp["templatecompcompound_ref"]) + (baseid, compartment, ignore_index) = FBAHelper.parse_id(fullid) + comp["met"] = MSBuilder.get_or_create_metabolite( + model, template, baseid, compartment, index + ) + if type not in bio_type_hash: + bio_type_hash[type] = {"items": [], "total_mw": 0} + if FBAHelper.metabolite_mw(comp["met"]): + types[type] += FBAHelper.metabolite_mw(comp["met"]) / 1000 + bio_type_hash[type].append(comp) + for type in bio_type_hash: + compmass = bio[type] + for comp in bio_type_hash[type]: + coef = None + if comp["coefficient_type"] == "MOLFRACTION": + coef = compmass / types[type] * comp["coefficient"] + elif comp["coefficient_type"] == "MOLSPLIT": + coef = compmass / types[type] * comp["coefficient"] + elif comp["coefficient_type"] == "MULTIPLIER": + coef = biorxn[type] * comp["coefficient"] + elif comp["coefficient_type"] == "EXACT": + coef = comp["coefficient"] + if coef: + met = model.metabolites.get_by_id("cpd11416_c0") + if met in metabolites: + metabolites[met] += coef + else: + metabolites[met] = coef + metabolites[met] = coef + for count, value in enumerate(comp["linked_compound_refs"]): + met = model.metabolites.get_by_id( + FBAHelper.id_from_ref(value) + ) + if met in metabolites: + metabolites[met] += ( + coef * comp["link_coefficients"][count] + ) + else: + metabolites[met] = ( + coef * comp["link_coefficients"][count] + ) + + biorxn.annotation[SBO_ANNOTATION] = "SBO:0000629" + biorxn.add_metabolites(metabolites) + biomasses.append(biorxn) + return biomasses + @staticmethod def build_biomasses(model, template, index): res = [] - if template.name.startswith('CoreModel'): - res.append(build_biomass('bio1', model, template, core_biomass, index)) - res.append(build_biomass('bio2', model, template, core_atp, index)) - if template.name.startswith('GramNeg'): - res.append(build_biomass('bio1', model, template, gramneg, index)) - if template.name.startswith('GramPos'): - res.append(build_biomass('bio1', model, template, grampos, index)) + if template.name.startswith("CoreModel"): + res.append(build_biomass("bio1", model, template, core_biomass, index)) + res.append(build_biomass("bio2", model, template, core_atp, index)) + if template.name.startswith("GramNeg"): + res.append(build_biomass("bio1", model, template, gramneg, index)) + if template.name.startswith("GramPos"): + res.append(build_biomass("bio1", model, template, grampos, index)) return res def auto_select_template(self): @@ -480,64 +547,93 @@ def auto_select_template(self): """ from modelseedpy.helpers import get_template, get_classifier from modelseedpy.core.mstemplate import MSTemplateBuilder - genome_classifier = get_classifier('knn_ACNP_RAST_filter') + + genome_classifier = get_classifier("knn_ACNP_RAST_filter") genome_class = genome_classifier.classify(self.genome) template_genome_scale_map = { - 'A': 'template_gram_neg', - 'C': 'template_gram_neg', - 'N': 'template_gram_neg', - 'P': 'template_gram_pos', + "A": "template_gram_neg", + "C": "template_gram_neg", + "N": "template_gram_neg", + "P": "template_gram_pos", } template_core_map = { - 'A': 'template_core', - 'C': 'template_core', - 'N': 'template_core', - 'P': 'template_core', + "A": "template_core", + "C": "template_core", + "N": "template_core", + "P": "template_core", } - if genome_class in template_genome_scale_map and genome_class in template_core_map: - self.template = MSTemplateBuilder.from_dict(get_template(template_genome_scale_map[genome_class])).build() + if ( + genome_class in template_genome_scale_map + and genome_class in template_core_map + ): + self.template = MSTemplateBuilder.from_dict( + get_template(template_genome_scale_map[genome_class]) + ).build() elif self.template is None: - raise Exception(f'unable to select template for {genome_class}') + raise Exception(f"unable to select template for {genome_class}") return genome_class - def build_metabolic_reactions(self, index='0', allow_incomplete_complexes=True): + def build_metabolic_reactions(self, index="0", allow_incomplete_complexes=True): metabolic_reactions = {} for template_reaction in self.template.reactions: - gpr_set = self.get_gpr_from_template_reaction(template_reaction, allow_incomplete_complexes) + gpr_set = self.get_gpr_from_template_reaction( + template_reaction, allow_incomplete_complexes + ) if gpr_set: metabolic_reactions[template_reaction.id] = gpr_set logger.debug("[%s] gpr set: %s", template_reaction.id, gpr_set) - reactions = list(map( - lambda x: self._build_reaction(x[0], x[1], self.template, index, "SBO:0000176"), - metabolic_reactions.items())) + reactions = list( + map( + lambda x: self._build_reaction( + x[0], x[1], self.template, index, "SBO:0000176" + ), + metabolic_reactions.items(), + ) + ) return reactions - def build_non_metabolite_reactions(self, cobra_model, index='0', allow_all_non_grp_reactions=False): + def build_non_metabolite_reactions( + self, cobra_model, index="0", allow_all_non_grp_reactions=False + ): reactions_no_gpr = [] reactions_in_model = set(map(lambda x: x.id, cobra_model.reactions)) metabolites_in_model = set(map(lambda x: x.id, cobra_model.metabolites)) for rxn in self.template.reactions: - if rxn.type == 'universal' or rxn.type == 'spontaneous': - reaction = self._build_reaction(rxn.id, {}, self.template, index, "SBO:0000176") - reaction_metabolite_ids = set(map(lambda x: x.id, set(reaction.metabolites))) - if (len(metabolites_in_model & reaction_metabolite_ids) > 0 or allow_all_non_grp_reactions) and \ - reaction.id not in reactions_in_model: + if rxn.type == "universal" or rxn.type == "spontaneous": + reaction = self._build_reaction( + rxn.id, {}, self.template, index, "SBO:0000176" + ) + reaction_metabolite_ids = set( + map(lambda x: x.id, set(reaction.metabolites)) + ) + if ( + len(metabolites_in_model & reaction_metabolite_ids) > 0 + or allow_all_non_grp_reactions + ) and reaction.id not in reactions_in_model: reaction.annotation["seed.reaction"] = rxn.id reactions_no_gpr.append(reaction) return reactions_no_gpr - def build(self, model_id, index='0', allow_all_non_grp_reactions=False, annotate_with_rast=True): + def build( + self, + model_id, + index="0", + allow_all_non_grp_reactions=False, + annotate_with_rast=True, + ): if annotate_with_rast: rast = RastClient() res = rast.annotate_genome(self.genome) - self.search_name_to_genes, self.search_name_to_original = _aaaa(self.genome, 'RAST') + self.search_name_to_genes, self.search_name_to_original = _aaaa( + self.genome, "RAST" + ) # rxn_roles = aux_template(self.template) # needs to be fixed to actually reflect template GPR rules if self.template is None: @@ -545,28 +641,39 @@ def build(self, model_id, index='0', allow_all_non_grp_reactions=False, annotate cobra_model = Model(model_id) cobra_model.add_reactions(self.build_metabolic_reactions(index=index)) - cobra_model.add_reactions(self.build_non_metabolite_reactions(cobra_model, index, allow_all_non_grp_reactions)) + cobra_model.add_reactions( + self.build_non_metabolite_reactions( + cobra_model, index, allow_all_non_grp_reactions + ) + ) self.build_exchanges(cobra_model) - if self.template.name.startswith('CoreModel') or \ - self.template.name.startswith('GramNeg') or self.template.name.startswith('GramPos'): - cobra_model.add_reactions(self.build_biomasses(cobra_model, self.template, index)) - cobra_model.objective = 'bio1' + if ( + self.template.name.startswith("CoreModel") + or self.template.name.startswith("GramNeg") + or self.template.name.startswith("GramPos") + ): + cobra_model.add_reactions( + self.build_biomasses(cobra_model, self.template, index) + ) + cobra_model.objective = "bio1" reactions_sinks = [] - for cpd_id in ['cpd02701_c0', 'cpd11416_c0', 'cpd15302_c0', 'cpd03091_c0']: + for cpd_id in ["cpd02701_c0", "cpd11416_c0", "cpd15302_c0", "cpd03091_c0"]: if cpd_id in cobra_model.metabolites: m = cobra_model.metabolites.get_by_id(cpd_id) - rxn_exchange = Reaction('SK_' + m.id, 'Sink for ' + m.name, 'exchanges', 0, 1000) + rxn_exchange = Reaction( + "SK_" + m.id, "Sink for " + m.name, "exchanges", 0, 1000 + ) rxn_exchange.add_metabolites({m: -1}) rxn_exchange.annotation[SBO_ANNOTATION] = "SBO:0000627" reactions_sinks.append(rxn_exchange) cobra_model.add_reactions(reactions_sinks) return cobra_model - + @staticmethod - def build_full_template_model(template, model_id=None, index='0'): + def build_full_template_model(template, model_id=None, index="0"): """ :param template: @@ -577,31 +684,35 @@ def build_full_template_model(template, model_id=None, index='0'): model = Model(model_id if model_id else template.id) all_reactions = [] for rxn in template.reactions: - reaction = MSBuilder._build_reaction(rxn.id, {}, template, index, "SBO:0000176") + reaction = MSBuilder._build_reaction( + rxn.id, {}, template, index, "SBO:0000176" + ) reaction.annotation["seed.reaction"] = rxn.id all_reactions.append(reaction) model.add_reactions(all_reactions) model.add_reactions(MSBuilder.build_exchanges(model)) - - if template.name.startswith('CoreModel'): - bio_rxn1 = build_biomass('bio1', model, template, core_biomass, index) - bio_rxn2 = build_biomass('bio2', model, template, core_atp, index) + + if template.name.startswith("CoreModel"): + bio_rxn1 = build_biomass("bio1", model, template, core_biomass, index) + bio_rxn2 = build_biomass("bio2", model, template, core_atp, index) model.add_reactions([bio_rxn1, bio_rxn2]) - model.objective = 'bio1' - if template.name.startswith('GramNeg'): - bio_rxn1 = build_biomass('bio1', model, template, gramneg, index) + model.objective = "bio1" + if template.name.startswith("GramNeg"): + bio_rxn1 = build_biomass("bio1", model, template, gramneg, index) model.add_reactions([bio_rxn1]) - model.objective = 'bio1' - if template.name.startswith('GramPos'): - bio_rxn1 = build_biomass('bio1', model, template, grampos, index) + model.objective = "bio1" + if template.name.startswith("GramPos"): + bio_rxn1 = build_biomass("bio1", model, template, grampos, index) model.add_reactions([bio_rxn1]) - model.objective = 'bio1' - + model.objective = "bio1" + reactions_sinks = [] - for cpd_id in ['cpd02701_c0', 'cpd11416_c0', 'cpd15302_c0',"cpd03091_c0"]: + for cpd_id in ["cpd02701_c0", "cpd11416_c0", "cpd15302_c0", "cpd03091_c0"]: if cpd_id in model.metabolites: m = model.metabolites.get_by_id(cpd_id) - rxn_exchange = Reaction('SK_' + m.id, 'Sink for ' + m.name, 'exchanges', 0, 1000) + rxn_exchange = Reaction( + "SK_" + m.id, "Sink for " + m.name, "exchanges", 0, 1000 + ) rxn_exchange.add_metabolites({m: -1}) rxn_exchange.annotation[SBO_ANNOTATION] = "SBO:0000627" reactions_sinks.append(rxn_exchange) @@ -609,13 +720,25 @@ def build_full_template_model(template, model_id=None, index='0'): return model @staticmethod - def build_metabolic_model(model_id, genome, gapfill_media=None, template=None, index='0', - allow_all_non_grp_reactions=False, annotate_with_rast=True, gapfill_model=True): + def build_metabolic_model( + model_id, + genome, + gapfill_media=None, + template=None, + index="0", + allow_all_non_grp_reactions=False, + annotate_with_rast=True, + gapfill_model=True, + ): builder = MSBuilder(genome, template) - model = builder.build(model_id, index, allow_all_non_grp_reactions, annotate_with_rast) + model = builder.build( + model_id, index, allow_all_non_grp_reactions, annotate_with_rast + ) # Gapfilling model if gapfill_model: - model = MSBuilder.gapfill_model(model, 'bio1', builder.template, gapfill_media) + model = MSBuilder.gapfill_model( + model, "bio1", builder.template, gapfill_media + ) return model @staticmethod @@ -623,14 +746,16 @@ def gapfill_model(original_mdl, target_reaction, template, media): FBAHelper.set_objective_from_target_reaction(original_mdl, target_reaction) model = cobra.io.json.from_json(cobra.io.json.to_json(original_mdl)) pkgmgr = MSPackageManager.get_pkg_mgr(model) - pkgmgr.getpkg("GapfillingPkg").build_package({ - "default_gapfill_templates": [template], - "gapfill_all_indecies_with_default_templates": 1, - "minimum_obj": 0.01, - "set_objective": 1 - }) + pkgmgr.getpkg("GapfillingPkg").build_package( + { + "default_gapfill_templates": [template], + "gapfill_all_indecies_with_default_templates": 1, + "minimum_obj": 0.01, + "set_objective": 1, + } + ) pkgmgr.getpkg("KBaseMediaPkg").build_package(media) - #with open('Gapfilling.lp', 'w') as out: + # with open('Gapfilling.lp', 'w') as out: # out.write(str(model.solver)) sol = model.optimize() gfresults = pkgmgr.getpkg("GapfillingPkg").compute_gapfilled_solution() @@ -646,8 +771,8 @@ def gapfill_model(original_mdl, target_reaction, template, media): original_mdl.add_reactions([rxn]) if gfresults["new"][rxnid] == ">": rxn.upper_bound = 100 - rxn.lower_bound = 0 + rxn.lower_bound = 0 else: rxn.upper_bound = 0 rxn.lower_bound = -100 - return original_mdl \ No newline at end of file + return original_mdl diff --git a/modelseedpy/core/mseditorapi.py b/modelseedpy/core/mseditorapi.py index 3c9b82eb..6c4c3c5a 100755 --- a/modelseedpy/core/mseditorapi.py +++ b/modelseedpy/core/mseditorapi.py @@ -1,19 +1,22 @@ import logging + logger = logging.getLogger(__name__) from cobra.core import Reaction import cobra import re -class MSEditorAPI: +class MSEditorAPI: @staticmethod - def remove_reactions(model, rxn_id_list = []): - model_reactions = ' '.join([rxn.id for rxn in model.reactions]) # removed from loop for greater efficiency + def remove_reactions(model, rxn_id_list=[]): + model_reactions = " ".join( + [rxn.id for rxn in model.reactions] + ) # removed from loop for greater efficiency for rxn_id in rxn_id_list: if not model.reactions.has_id(rxn_id): - compartment = re.search(f'(?<={rxn_id})(\_\w\d)', model_reactions) + compartment = re.search(f"(?<={rxn_id})(\_\w\d)", model_reactions) if not compartment: - raise Exception('Reaction', rxn_id, 'is not in the model.') + raise Exception("Reaction", rxn_id, "is not in the model.") else: rxn_id += compartment.group() model.remove_reactions([rxn_id]) @@ -51,38 +54,44 @@ def edit_reaction(model, rxn_id, direction=None, gpr=None, genome=None): if gpr is not None: model.reactions.get_by_id(rxn_id).gene_reaction_rule = gpr except: - raise Exception('invalid gpr statement, check parentheses') # not working, unsure exactly why - + raise Exception( + "invalid gpr statement, check parentheses" + ) # not working, unsure exactly why + @staticmethod - def edit_biomass_compound(model,biomass_id,cpd_id,new_coef,rescale = 1): + def edit_biomass_compound(model, biomass_id, cpd_id, new_coef, rescale=1): if biomass_id in model.reactions: if cpd_id in model.metabolites: - model.reactions.get_by_id(biomass_id).add_metabolites({model.metabolites.get_by_id(cpd_id): new_coef}, - combine=False) + model.reactions.get_by_id(biomass_id).add_metabolites( + {model.metabolites.get_by_id(cpd_id): new_coef}, combine=False + ) else: - raise Exception('Metabolite', cpd_id, ' is not in the model.') + raise Exception("Metabolite", cpd_id, " is not in the model.") else: # if there is no biomass reaction biomass_rxn = Reaction(biomass_id) model.add_reaction(biomass_rxn) if cpd_id in model.metabolites: - biomass_rxn.add_metabolites({model.metabolites.get_by_id(cpd_id): new_coef}) + biomass_rxn.add_metabolites( + {model.metabolites.get_by_id(cpd_id): new_coef} + ) else: - raise Exception('Metabolite ', cpd_id, ' is not in the model.') + raise Exception("Metabolite ", cpd_id, " is not in the model.") @staticmethod def compute_molecular_weight(model, metabolite_id): if metabolite_id not in model.metabolites: - raise Exception('Error, metabolite', metabolite_id, 'not found in the model') + raise Exception( + "Error, metabolite", metabolite_id, "not found in the model" + ) return model.metabolites.get_by_id(metabolite_id).formula_weight @staticmethod - - def add_custom_reaction(model,rxn_id,MSEquation,gpr = None,genome = None): + def add_custom_reaction(model, rxn_id, MSEquation, gpr=None, genome=None): new_rxn = Reaction(id=rxn_id) # going on the assumption that all metabolites are present in the model metabolites = {} for key in MSEquation.equation: - met_id = key[0] + '_' + key[1] + met_id = key[0] + "_" + key[1] if met_id in model.metabolites: metabolites[met_id] = MSEquation.equation[key] else: @@ -92,81 +101,102 @@ def add_custom_reaction(model,rxn_id,MSEquation,gpr = None,genome = None): new_rxn.add_metabolites(metabolites) # adjust the bounds based on the arrow direction -1000, 1000, 0 - if MSEquation.direction == 'left': + if MSEquation.direction == "left": new_rxn.lower_bound = -1000 new_rxn.upper_bound = 0 - if MSEquation.direction == 'reversable': + if MSEquation.direction == "reversable": new_rxn.lower_bound = -1000 new_rxn.upper_bound = 1000 - @staticmethod - def add_ms_reaction(model, rxn_id, modelseed, compartment_equivalents = {'0':'c0', '1':'e0'}, direction = 'forward'):#Andrew - ''' Add a reaction with ModelSEED parameters to the FBA simulation + @staticmethod + def add_ms_reaction( + model, + rxn_id, + modelseed, + compartment_equivalents={"0": "c0", "1": "e0"}, + direction="forward", + ): # Andrew + """Add a reaction with ModelSEED parameters to the FBA simulation "model" (COBRA object): The metabolic model that is defined by COBRApy "rxn_id" (Python object, string): The ModelSEED reaction id that will be added to the model - "Compartment_equivalents" (Python object, dictionary): The compartment codes that are used in formating the passed reactions + "Compartment_equivalents" (Python object, dictionary): The compartment codes that are used in formating the passed reactions "direction" (Python object, string): The direction of the defined reaction - "modelseed" (ModelSEED object): The ModelSEED database that describes the reaction and metabolites of the argument - ''' + "modelseed" (ModelSEED object): The ModelSEED database that describes the reaction and metabolites of the argument + """ modelseed_reaction = modelseed.get_seed_reaction(rxn_id) reaction_stoich = modelseed_reaction.cstoichiometry cobra_reaction = cobra.Reaction(rxn_id) - cobra_reaction.name = modelseed_reaction.data['name'] + cobra_reaction.name = modelseed_reaction.data["name"] metabolites_to_add = {} for metabolite, stoich in reaction_stoich.items(): id = metabolite[0] compound = modelseed.get_seed_compound(id).data compartment_number = metabolite[1] - compartment_string = compartment_equivalents[compartment_number] + compartment_string = compartment_equivalents[compartment_number] - metabolites_to_add[cobra.Metabolite(id, name = compound['name'], compartment = compartment_string)] = stoich + metabolites_to_add[ + cobra.Metabolite( + id, name=compound["name"], compartment=compartment_string + ) + ] = stoich cobra_reaction.add_metabolites(metabolites_to_add) cobra_reaction.reaction - if direction == 'reversible': + if direction == "reversible": cobra_reaction.lower_bound = -1000 - elif direction == 'backward': + elif direction == "backward": cobra_reaction.lower_bound = -1000 cobra_reaction.upper_bound = 0 - elif direction == 'forward': + elif direction == "forward": pass else: - directions = ['forward', 'backward', 'reversible'] - print('ERROR: The \'direction\' argument is not among the accepted {}, {}, and {} values.'.format(directions[0], directions[1], directions[2])) - direction = input('What is the direction of the reaction?') + directions = ["forward", "backward", "reversible"] + print( + "ERROR: The 'direction' argument is not among the accepted {}, {}, and {} values.".format( + directions[0], directions[1], directions[2] + ) + ) + direction = input("What is the direction of the reaction?") while direction not in directions: - print('ERROR: The \'direction\' argument is not among the accepted {}, {}, and {} values.'.format(directions[0], directions[1], directions[2])) - direction = input('What is the direction of the reaction?') - MSEditorAPI.add_ms_reaction(model, rxn_id, modelseed, direction = direction) - + print( + "ERROR: The 'direction' argument is not among the accepted {}, {}, and {} values.".format( + directions[0], directions[1], directions[2] + ) + ) + direction = input("What is the direction of the reaction?") + MSEditorAPI.add_ms_reaction(model, rxn_id, modelseed, direction=direction) model.add_reactions([cobra_reaction]) - + @staticmethod - def copy_model_reactions(model,source_model,rxn_id_list = []): + def copy_model_reactions(model, source_model, rxn_id_list=[]): for rxnid in rxn_id_list: if rxnid in source_model.reactions: model.add_reactions([source_model.reactions.get_by_id(rxnid)]) else: - raise Exception('The reaction', rxnid, 'in the reaction list is not in the model.') + raise Exception( + "The reaction", rxnid, "in the reaction list is not in the model." + ) @staticmethod - def copy_all_model_reactions(model,source_model): #new method that copies all reactions, may not be necessary + def copy_all_model_reactions( + model, source_model + ): # new method that copies all reactions, may not be necessary for rxn in source_model.reactions: model.add_reactions([source_model.reactions.get_by_id(rxn.id)]) class MSEquation: - def __init__(self, stoichiometry, d): self.equation = stoichiometry self.direction = d @staticmethod - def build_from_palsson_string(equation_string, default_group='c'): # add default group - + def build_from_palsson_string( + equation_string, default_group="c" + ): # add default group def clean_ends(lst): """ FIXME: use .strip @@ -175,10 +205,10 @@ def clean_ends(lst): """ for i in range(len(lst)): # remove whitespace from the front - while lst[i][0] == ' ': + while lst[i][0] == " ": lst[i] = lst[i][1:] # remove whitespace from the back - while lst[i][-1] == ' ': + while lst[i][-1] == " ": lst[i] = lst[i][:-1] return lst @@ -186,31 +216,41 @@ def get_coef_and_group(lst, return_dict, side): # for side variable, -1 is left side, 1 is right side, for coeficients for reactant in lst: coeficient = side - if reactant.find('(') != -1 or reactant.find( - ')') != -1: # if one is present, check to make sure both there - if equation_string.find(')') == -1: - raise Exception("Error, ')' character missing in string", reactant) - if equation_string.find('(') == -1: - raise Exception("Error, '(' character missing in string", reactant) - number = '' + if ( + reactant.find("(") != -1 or reactant.find(")") != -1 + ): # if one is present, check to make sure both there + if equation_string.find(")") == -1: + raise Exception( + "Error, ')' character missing in string", reactant + ) + if equation_string.find("(") == -1: + raise Exception( + "Error, '(' character missing in string", reactant + ) + number = "" position = 1 - while reactant[position] != ')': + while reactant[position] != ")": number += reactant[position] position += 1 coeficient = side * float(number) - reactant = reactant[position + 1:] + reactant = reactant[position + 1 :] identifier = default_group - if reactant.find('[') != -1 or reactant.find( - ']') != -1: # if one is present, check to make sure both there + if ( + reactant.find("[") != -1 or reactant.find("]") != -1 + ): # if one is present, check to make sure both there # check to see both are present - if equation_string.find(']') == -1: - raise Exception("Error, ']' character missing in string", reactant) - if equation_string.find('[') == -1: - raise Exception("Error, '[' character missing in string", reactant) - s = '' + if equation_string.find("]") == -1: + raise Exception( + "Error, ']' character missing in string", reactant + ) + if equation_string.find("[") == -1: + raise Exception( + "Error, '[' character missing in string", reactant + ) + s = "" position = -2 - while reactant[position] != '[': + while reactant[position] != "[": s = reactant[position] + s position -= 1 identifier = s @@ -220,36 +260,46 @@ def get_coef_and_group(lst, return_dict, side): return return_dict # check for the '=' character, throw exception otherwise - if equation_string.find('=') == -1: - raise Exception("Error, '=' character missing, unable to split string", equation_string) + if equation_string.find("=") == -1: + raise Exception( + "Error, '=' character missing, unable to split string", equation_string + ) # check direction reversible = False right = False left = False - ret_str = '' - reversible = equation_string.find('<=>') != -1 + ret_str = "" + reversible = equation_string.find("<=>") != -1 if reversible: - ret_str = '=' + ret_str = "=" else: # not two ways, so check right - right = equation_string.find('=>') != -1 + right = equation_string.find("=>") != -1 if right: - ret_str = '>' + ret_str = ">" else: # if not right, check left - left = equation_string.find('<=') != -1 + left = equation_string.find("<=") != -1 if left: - ret_str = '<' + ret_str = "<" else: # if not left, error ret_str = "?" # cpd00001 + cpd00002[e] => (2)cpd00003 + cpd00004 # get substrings for either side of the euqation - reactants_substring_list = equation_string[0:equation_string.find('=') - 1].split('+') - products_substring_list = equation_string[equation_string.find('=') + 2:len(equation_string)].split('+') + reactants_substring_list = equation_string[ + 0 : equation_string.find("=") - 1 + ].split("+") + products_substring_list = equation_string[ + equation_string.find("=") + 2 : len(equation_string) + ].split("+") # clean up our substrings: - reactants_substring_list = list(map(lambda x: x.strip(), reactants_substring_list)) - products_substring_list = list(map(lambda x: x.strip(), products_substring_list)) + reactants_substring_list = list( + map(lambda x: x.strip(), reactants_substring_list) + ) + products_substring_list = list( + map(lambda x: x.strip(), products_substring_list) + ) variables = {} # add reactants to the dictionary diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 53ff5d89..c9137e85 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -1,5 +1,6 @@ import logging import itertools # !!! the import is never used + logger = logging.getLogger(__name__) import cobra @@ -11,6 +12,7 @@ from modelseedpy.fbapkg.gapfillingpkg import default_blacklist from modelseedpy.core.exceptions import GapfillingError + class MSGapfill: @staticmethod def gapfill_count(solution): @@ -21,19 +23,32 @@ def gapfill_count(solution): total += len(solution["reversed"]) return total - def __init__(self, model_or_mdlutl, default_gapfill_templates=[], default_gapfill_models=[], - test_conditions=[], reaction_scores={}, blacklist=[], atp_gapfilling=False): - #Discerning input is model or mdlutl and setting internal links + def __init__( + self, + model_or_mdlutl, + default_gapfill_templates=[], + default_gapfill_models=[], + test_conditions=[], + reaction_scores={}, + blacklist=[], + atp_gapfilling=False, + ): + # Discerning input is model or mdlutl and setting internal links if isinstance(model_or_mdlutl, MSModelUtil): self.model = model_or_mdlutl.model self.mdlutl = model_or_mdlutl else: self.model = model_or_mdlutl self.mdlutl = MSModelUtil.get(model_or_mdlutl) - #Setting gapfilling attribute in model utl so link is bidirectional + # Setting gapfilling attribute in model utl so link is bidirectional if not atp_gapfilling: self.mdlutl.gfutl = self - self.auto_sink = ["cpd02701", "cpd11416", "cpd15302","cpd03091"] # the cpd11416 compound is filtered during model extension with templates + self.auto_sink = [ + "cpd02701", + "cpd11416", + "cpd15302", + "cpd03091", + ] # the cpd11416 compound is filtered during model extension with templates self.gfmodel = self.lp_filename = self.last_solution = None self.model_penalty = 1 self.default_gapfill_models = default_gapfill_models @@ -41,180 +56,237 @@ def __init__(self, model_or_mdlutl, default_gapfill_templates=[], default_gapfil self.gapfill_templates_by_index, self.gapfill_models_by_index = {}, {} self.gapfill_all_indecies_with_default_templates = True self.gapfill_all_indecies_with_default_models = True - self.blacklist = list(set(default_blacklist+blacklist)) + self.blacklist = list(set(default_blacklist + blacklist)) self.test_condition_iteration_limit = 10 self.test_conditions = test_conditions self.reaction_scores = reaction_scores self.cumulative_gapfilling = [] - - - def run_gapfilling(self, media=None, target=None, minimum_obj=0.01, binary_check=False, prefilter=True): + + def run_gapfilling( + self, + media=None, + target=None, + minimum_obj=0.01, + binary_check=False, + prefilter=True, + ): if target: self.model.objective = self.model.problem.Objective( - self.model.reactions.get_by_id(target).flux_expression, direction='max') + self.model.reactions.get_by_id(target).flux_expression, direction="max" + ) self.gfmodel = cobra.io.json.from_json(cobra.io.json.to_json(self.model)) pkgmgr = MSPackageManager.get_pkg_mgr(self.gfmodel) - pkgmgr.getpkg("GapfillingPkg").build_package({ - "auto_sink": self.auto_sink, - "model_penalty": self.model_penalty, - "default_gapfill_models": self.default_gapfill_models, - "default_gapfill_templates": self.default_gapfill_templates, - "gapfill_templates_by_index": self.gapfill_templates_by_index, - "gapfill_models_by_index": self.gapfill_models_by_index, - "gapfill_all_indecies_with_default_templates": self.gapfill_all_indecies_with_default_templates, - "gapfill_all_indecies_with_default_models": self.gapfill_all_indecies_with_default_models, - "default_excretion":100, - "default_uptake":100, - "minimum_obj": minimum_obj, - "blacklist": self.blacklist, - "reaction_scores": self.reaction_scores, - "set_objective": 1 - }) + pkgmgr.getpkg("GapfillingPkg").build_package( + { + "auto_sink": self.auto_sink, + "model_penalty": self.model_penalty, + "default_gapfill_models": self.default_gapfill_models, + "default_gapfill_templates": self.default_gapfill_templates, + "gapfill_templates_by_index": self.gapfill_templates_by_index, + "gapfill_models_by_index": self.gapfill_models_by_index, + "gapfill_all_indecies_with_default_templates": self.gapfill_all_indecies_with_default_templates, + "gapfill_all_indecies_with_default_models": self.gapfill_all_indecies_with_default_models, + "default_excretion": 100, + "default_uptake": 100, + "minimum_obj": minimum_obj, + "blacklist": self.blacklist, + "reaction_scores": self.reaction_scores, + "set_objective": 1, + } + ) pkgmgr.getpkg("KBaseMediaPkg").build_package(media) - - #Filtering breaking reactions out of the database + + # Filtering breaking reactions out of the database if prefilter and self.test_conditions: - pkgmgr.getpkg("GapfillingPkg").filter_database_based_on_tests(self.test_conditions) - + pkgmgr.getpkg("GapfillingPkg").filter_database_based_on_tests( + self.test_conditions + ) + if self.lp_filename: - with open(self.lp_filename, 'w') as out: + with open(self.lp_filename, "w") as out: out.write(str(self.gfmodel.solver)) sol = self.gfmodel.optimize() - logger.debug('gapfill solution objective value %f (%s) for media %s', sol.objective_value, sol.status, media) + logger.debug( + "gapfill solution objective value %f (%s) for media %s", + sol.objective_value, + sol.status, + media, + ) - if sol.status != 'optimal': + if sol.status != "optimal": logger.warning("No solution found for %s", media) return None - self.last_solution = pkgmgr.getpkg("GapfillingPkg").compute_gapfilled_solution() + self.last_solution = pkgmgr.getpkg("GapfillingPkg").compute_gapfilled_solution() if self.test_conditions: - self.last_solution = pkgmgr.getpkg("GapfillingPkg").run_test_conditions(self.test_conditions, self.last_solution, self.test_condition_iteration_limit) + self.last_solution = pkgmgr.getpkg("GapfillingPkg").run_test_conditions( + self.test_conditions, + self.last_solution, + self.test_condition_iteration_limit, + ) if self.last_solution is None: - logger.warning("no solution could be found that satisfied all specified test conditions in specified iterations!") + logger.warning( + "no solution could be found that satisfied all specified test conditions in specified iterations!" + ) return None if binary_check: - self.last_solution = pkgmgr.getpkg("GapfillingPkg").binary_check_gapfilling_solution() - + self.last_solution = pkgmgr.getpkg( + "GapfillingPkg" + ).binary_check_gapfilling_solution() + self.last_solution["media"] = media self.last_solution["target"] = target self.last_solution["minobjective"] = minimum_obj self.last_solution["binary_check"] = binary_check return self.last_solution - - def integrate_gapfill_solution(self, solution,cumulative_solution=[]): + + def integrate_gapfill_solution(self, solution, cumulative_solution=[]): """Integrating gapfilling solution into model - Parameters - ---------- - solution : dict - Specifies the reactions to be added to the model to implement the gapfilling solution - cumulation_solution : list - Optional array to cumulatively track all reactions added to the model when integrating multiple solutions + Parameters + ---------- + solution : dict + Specifies the reactions to be added to the model to implement the gapfilling solution + cumulation_solution : list + Optional array to cumulatively track all reactions added to the model when integrating multiple solutions """ for rxn_id in solution["reversed"]: rxn = self.model.reactions.get_by_id(rxn_id) if solution["reversed"][rxn_id] == ">" and rxn.upper_bound <= 0: - cumulative_solution.append([rxn_id,">"]) + cumulative_solution.append([rxn_id, ">"]) rxn.upper_bound = 100 elif solution["reversed"][rxn_id] == "<" and rxn.lower_bound >= 0: - cumulative_solution.append([rxn_id,"<"]) + cumulative_solution.append([rxn_id, "<"]) rxn.lower_bound = -100 for rxn_id in solution["new"]: if rxn_id not in self.model.reactions: rxn = self.gfmodel.reactions.get_by_id(rxn_id) rxn = rxn.copy() self.model.add_reactions([rxn]) - coreid = re.sub(r'_[a-z]\d+$', '', rxn_id) + coreid = re.sub(r"_[a-z]\d+$", "", rxn_id) if coreid in self.reaction_scores: bestgene = None for gene in self.reaction_scores[coreid]: - if not bestgene or self.reaction_scores[coreid][gene] > self.reaction_scores[coreid][bestgene]: + if ( + not bestgene + or self.reaction_scores[coreid][gene] + > self.reaction_scores[coreid][bestgene] + ): bestgene = gene rxn = self.model.reactions.get_by_id(rxn_id) rxn.gene_reaction_rule = bestgene if solution["new"][rxn_id] == ">": - cumulative_solution.append([rxn_id,">"]) + cumulative_solution.append([rxn_id, ">"]) rxn.upper_bound = 100 - rxn.lower_bound = 0 + rxn.lower_bound = 0 else: - cumulative_solution.append([rxn_id,"<"]) + cumulative_solution.append([rxn_id, "<"]) rxn.upper_bound = 0 rxn.lower_bound = -100 - unneeded = self.mdlutl.test_solution(solution,keep_changes=True)#Strips out unneeded reactions - which undoes some of what is done above + unneeded = self.mdlutl.test_solution( + solution, keep_changes=True + ) # Strips out unneeded reactions - which undoes some of what is done above for item in unneeded: for oitem in cumulative_solution: if item[0] == oitem[0] and item[1] == oitem[1]: cumulative_solution.remove(oitem) break - self.mdlutl.add_gapfilling(solution) + self.mdlutl.add_gapfilling(solution) self.cumulative_gapfilling.extend(cumulative_solution) - - def link_gapfilling_to_biomass(self,target="bio1"): - def find_dependency(item,target_rxn,tempmodel,original_objective,min_flex_obj): + + def link_gapfilling_to_biomass(self, target="bio1"): + def find_dependency( + item, target_rxn, tempmodel, original_objective, min_flex_obj + ): objective = tempmodel.slim_optimize() - logger.debug("Obj:"+str(objective)) - with open("FlexBiomass2.lp", 'w') as out: + logger.debug("Obj:" + str(objective)) + with open("FlexBiomass2.lp", "w") as out: out.write(str(tempmodel.solver)) if objective > 0: target_rxn.lower_bound = 0.1 tempmodel.objective = min_flex_obj solution = tempmodel.optimize() - with open("FlexBiomass3.lp", 'w') as out: + with open("FlexBiomass3.lp", "w") as out: out.write(str(tempmodel.solver)) biocpds = [] for reaction in tempmodel.reactions: - if reaction.id[0:5] == "FLEX_" and reaction.forward_variable.primal > Zero: + if ( + reaction.id[0:5] == "FLEX_" + and reaction.forward_variable.primal > Zero + ): biocpds.append(reaction.id[5:]) item.append(biocpds) - logger.debug(item[0]+":"+",".join(biocpds)) + logger.debug(item[0] + ":" + ",".join(biocpds)) tempmodel.objective = original_objective target_rxn.lower_bound = 0 - - #Copying model before manipulating it + + # Copying model before manipulating it tempmodel = cobra.io.json.from_json(cobra.io.json.to_json(self.mdlutl.model)) - #Getting target reaction and making sure it exists + # Getting target reaction and making sure it exists target_rxn = tempmodel.reactions.get_by_id(target) - #Constraining objective to be greater than 0.1 + # Constraining objective to be greater than 0.1 pkgmgr = MSPackageManager.get_pkg_mgr(tempmodel) - #Adding biomass flexibility - pkgmgr.getpkg("FlexibleBiomassPkg").build_package({ - "bio_rxn_id":target, - "flex_coefficient":[0,1], - "use_rna_class":None, - "use_dna_class":None, - "use_protein_class":None, - "use_energy_class":[0,1], - "add_total_biomass_constraint":False - }) - #Creating min flex objective + # Adding biomass flexibility + pkgmgr.getpkg("FlexibleBiomassPkg").build_package( + { + "bio_rxn_id": target, + "flex_coefficient": [0, 1], + "use_rna_class": None, + "use_dna_class": None, + "use_protein_class": None, + "use_energy_class": [0, 1], + "add_total_biomass_constraint": False, + } + ) + # Creating min flex objective tempmodel.objective = target_rxn original_objective = tempmodel.objective - min_flex_obj = tempmodel.problem.Objective(Zero,direction="min") + min_flex_obj = tempmodel.problem.Objective(Zero, direction="min") obj_coef = dict() for reaction in tempmodel.reactions: if reaction.id[0:5] == "FLEX_" or reaction.id[0:6] == "energy": obj_coef[reaction.forward_variable] = 1 - #Temporarily setting flex objective so I can set coefficients + # Temporarily setting flex objective so I can set coefficients tempmodel.objective = min_flex_obj min_flex_obj.set_linear_coefficients(obj_coef) - #Restoring biomass object + # Restoring biomass object tempmodel.objective = original_objective - #Knocking out gapfilled reactions one at a time + # Knocking out gapfilled reactions one at a time for item in self.cumulative_gapfilling: - logger.debug("KO:"+item[0]+item[1]) + logger.debug("KO:" + item[0] + item[1]) rxnobj = tempmodel.reactions.get_by_id(item[0]) if item[1] == ">": original_bound = rxnobj.upper_bound rxnobj.upper_bound = 0 - find_dependency(item,target_rxn,tempmodel,original_objective,min_flex_obj) + find_dependency( + item, target_rxn, tempmodel, original_objective, min_flex_obj + ) rxnobj.upper_bound = original_bound else: original_bound = rxnobj.lower_bound rxnobj.lower_bound = 0 - find_dependency(item,target_rxn,tempmodel,original_objective,min_flex_obj) + find_dependency( + item, target_rxn, tempmodel, original_objective, min_flex_obj + ) rxnobj.lower_bound = original_bound - + @staticmethod - def gapfill(model, media=None, target_reaction="bio1", default_gapfill_templates=[], default_gapfill_models=[], test_conditions=[], reaction_scores={}, blacklist=[]): - gapfiller = MSGapfill(model,default_gapfill_templates,default_gapfill_models,test_conditions,reaction_scores,blacklist) - gfresults = gapfiller.run_gapfilling(media,target_reaction) + def gapfill( + model, + media=None, + target_reaction="bio1", + default_gapfill_templates=[], + default_gapfill_models=[], + test_conditions=[], + reaction_scores={}, + blacklist=[], + ): + gapfiller = MSGapfill( + model, + default_gapfill_templates, + default_gapfill_models, + test_conditions, + reaction_scores, + blacklist, + ) + gfresults = gapfiller.run_gapfilling(media, target_reaction) return gapfiller.integrate_gapfill_solution(gfresults) diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index f0c41be1..cdd883ba 100755 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -9,20 +9,20 @@ def normalize_role(s): # print(s) s = s.strip().lower() - s = re.sub('[\W_]+', '', s) + s = re.sub("[\W_]+", "", s) return s -def read_fasta(f, split='|', h_func=None): - with open(f, 'r') as fh: +def read_fasta(f, split="|", h_func=None): + with open(f, "r") as fh: return parse_fasta_str(fh.read(), split, h_func) -def parse_fasta_str(faa_str, split='|', h_func=None): +def parse_fasta_str(faa_str, split="|", h_func=None): features = [] seq = None - for line in faa_str.split('\n'): - if line.startswith('>'): + for line in faa_str.split("\n"): + if line.startswith(">"): if seq: features.append(seq) seq_id = line[1:] @@ -32,7 +32,9 @@ def parse_fasta_str(faa_str, split='|', h_func=None): elif split: header_data = line[1:].split(split, 1) seq_id = header_data[0] - desc = header_data[1] # The unit test throws an error when this is commented + desc = header_data[ + 1 + ] # The unit test throws an error when this is commented seq = MSFeature(seq_id, "", desc) else: @@ -44,7 +46,6 @@ def parse_fasta_str(faa_str, split='|', h_func=None): class MSFeature: - def __init__(self, feature_id, sequence, description=None): """ @@ -73,7 +74,6 @@ def add_ontology_term(self, ontology_term, value): class MSGenome: - def __init__(self): self.features = DictList() @@ -85,7 +85,9 @@ def add_features(self, feature_list: list): """ duplicates = list(filter(lambda o: o.id in self.features, feature_list)) if len(duplicates) > 0: - raise ValueError(f"unable to add features {duplicates} already present in the genome") + raise ValueError( + f"unable to add features {duplicates} already present in the genome" + ) for f in feature_list: f._genome = self @@ -93,7 +95,9 @@ def add_features(self, feature_list: list): self.features += feature_list @staticmethod - def from_fasta(filename, contigs=0, split='|', h_func=None): # !!! the contigs argument is never used + def from_fasta( + filename, contigs=0, split="|", h_func=None + ): # !!! the contigs argument is never used genome = MSGenome() genome.features += read_fasta(filename, split, h_func) return genome @@ -108,10 +112,10 @@ def from_protein_sequences_hash(sequences): genome = MSGenome() genome.features += features return genome - + def alias_hash(self): return {alias: gene for gene in self.features for alias in gene.aliases} - + def search_for_gene(self, query): if query in self.features: return self.features.get_by_id(query) diff --git a/modelseedpy/core/msgenomeclassifier.py b/modelseedpy/core/msgenomeclassifier.py index 9055c15a..9cb035d6 100755 --- a/modelseedpy/core/msgenomeclassifier.py +++ b/modelseedpy/core/msgenomeclassifier.py @@ -3,7 +3,6 @@ class MSGenomeClassifier: - def __init__(self, model, model_features): self.features = model_features self.model = model @@ -20,16 +19,22 @@ def extract_features_from_genome(genome, ontology_term): for feature in genome.features: if ontology_term in feature.ontology_terms: features.update(feature.ontology_terms[ontology_term]) - return {'genome': list(features)} + return {"genome": list(features)} - def classify(self, genome_or_roles, ontology_term='RAST'): + def classify(self, genome_or_roles, ontology_term="RAST"): """ param genome_or_roles: """ if isinstance(genome_or_roles, MSGenome): - genome_or_roles = self.extract_features_from_genome(genome_or_roles, ontology_term) - indicator_df, master_role_list = create_indicator_matrix(genome_or_roles, self.features) - predictions_numerical = self.model.predict(indicator_df[master_role_list].values) + genome_or_roles = self.extract_features_from_genome( + genome_or_roles, ontology_term + ) + indicator_df, master_role_list = create_indicator_matrix( + genome_or_roles, self.features + ) + predictions_numerical = self.model.predict( + indicator_df[master_role_list].values + ) return predictions_numerical[0] @@ -42,9 +47,10 @@ def load_classifier_from_folder(path, filename): """ import pickle import json - with open(f'{path}/{filename}.pickle', 'rb') as fh: + + with open(f"{path}/{filename}.pickle", "rb") as fh: model_filter = pickle.load(fh) - with open(f'{path}/{filename}_features.json', 'r') as fh: + with open(f"{path}/{filename}_features.json", "r") as fh: features = json.load(fh) return MSGenomeClassifier(model_filter, features) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 02a72e3c..454b1936 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -9,9 +9,18 @@ logger = logging.getLogger(__name__) -class MSGrowthPhenotype: - def __init__(self,id,media=None,growth=None,gene_ko=[],additional_compounds=[],parent=None,name=None): +class MSGrowthPhenotype: + def __init__( + self, + id, + media=None, + growth=None, + gene_ko=[], + additional_compounds=[], + parent=None, + name=None, + ): self.id = id self.name = name if name == None: @@ -22,27 +31,36 @@ def __init__(self,id,media=None,growth=None,gene_ko=[],additional_compounds=[],p self.gapfilling = None self.additional_compounds = additional_compounds self.parent = parent - + def build_media(self): cpd_hash = {} for cpd in self.additional_compounds: cpd_hash[cpd] = 100 full_media = MSMedia.from_dict(cpd_hash) if self.media != None: - full_media.merge(self.media,overwrite_overlap = False) + full_media.merge(self.media, overwrite_overlap=False) if self.parent != None and self.parent.base_media != None: - full_media.merge(parent.base_media,overwrite_overlap = False) + full_media.merge(parent.base_media, overwrite_overlap=False) return full_media - - def simulate(self,modelutl,growth_threshold=0.001,add_missing_exchanges=False,save_fluxes=False,pfba=False): - if not isinstance(modelutl,MSModelUtil): + + def simulate( + self, + modelutl, + growth_threshold=0.001, + add_missing_exchanges=False, + save_fluxes=False, + pfba=False, + ): + if not isinstance(modelutl, MSModelUtil): modelutl = MSModelUtil(modelutl) media = self.build_media() - output = {"growth":None,"class":None,"missing_transports":[]} + output = {"growth": None, "class": None, "missing_transports": []} if add_missing_exchanges: output["missing_transports"] = modelutl.add_missing_exchanges(media) pkgmgr = MSPackageManager.get_pkg_mgr(modelutl.model) - pkgmgr.getpkg("KBaseMediaPkg").build_package(media,self.parent.base_uptake,self.parent.base_excretion) + pkgmgr.getpkg("KBaseMediaPkg").build_package( + media, self.parent.base_uptake, self.parent.base_excretion + ) for gene in self.gene_ko: if gene in modelutl.model.genes: geneobj = modelutl.model.genes.get_by_id(gene) @@ -58,17 +76,33 @@ def simulate(self,modelutl,growth_threshold=0.001,add_missing_exchanges=False,sa output["class"] = "CP" else: output["class"] = "FP" - else: + else: if self.growth > 0: output["class"] = "FN" else: output["class"] = "CN" - return output - - def gapfill_model_for_phenotype(self,modelutl,default_gapfill_templates,test_conditions,default_gapfill_models=[],blacklist=[],growth_threshold=0.001,add_missing_exchanges=False): - if not isinstance(modelutl,MSModelUtil): + return output + + def gapfill_model_for_phenotype( + self, + modelutl, + default_gapfill_templates, + test_conditions, + default_gapfill_models=[], + blacklist=[], + growth_threshold=0.001, + add_missing_exchanges=False, + ): + if not isinstance(modelutl, MSModelUtil): modelutl = MSModelUtil(modelutl) - self.gapfilling = MSGapfill(modelutl.model, default_gapfill_templates, default_gapfill_models, test_conditions, modelutl.reaction_scores(), blacklist) + self.gapfilling = MSGapfill( + modelutl.model, + default_gapfill_templates, + default_gapfill_models, + test_conditions, + modelutl.reaction_scores(), + blacklist, + ) media = self.build_media() if add_missing_exchanges: modelutl.add_missing_exchanges(media) @@ -76,51 +110,54 @@ def gapfill_model_for_phenotype(self,modelutl,default_gapfill_templates,test_con if gene in modelutl.model.genes: geneobj = modelutl.model.genes.get_by_id(gene) geneobj.knock_out() - gfresults = self.gapfilling.run_gapfilling(media,None) + gfresults = self.gapfilling.run_gapfilling(media, None) if gfresults is None: - logger.warning("Gapfilling failed with the specified model, media, and target reaction.") + logger.warning( + "Gapfilling failed with the specified model, media, and target reaction." + ) return self.gapfilling.integrate_gapfill_solution(gfresults) - -class MSGrowthPhenotypes: - def __init__(self,base_media=None,base_uptake=0,base_excretion=1000): + +class MSGrowthPhenotypes: + def __init__(self, base_media=None, base_uptake=0, base_excretion=1000): self.base_media = base_media self.phenotypes = DictList() self.base_uptake = base_uptake self.base_excretion = base_excretion - @staticmethod - def from_compound_hash(compounds,base_media,base_uptake=0,base_excretion=1000): - growthpheno = MSGrowthPhenotypes(base_media,base_uptake,base_excretion) + def from_compound_hash(compounds, base_media, base_uptake=0, base_excretion=1000): + growthpheno = MSGrowthPhenotypes(base_media, base_uptake, base_excretion) new_phenos = [] for cpd in compounds: - newpheno = MSGrowthPhenotype(cpd,None,compounds[cpd],[],[cpd]) + newpheno = MSGrowthPhenotype(cpd, None, compounds[cpd], [], [cpd]) new_phenos.append(newpheno) growthpheno.add_phenotypes(new_phenos) return growthpheno - + @staticmethod - def from_kbase_object(data,kbase_api): - growthpheno = MSGrowthPhenotypes(None,0,1000) + def from_kbase_object(data, kbase_api): + growthpheno = MSGrowthPhenotypes(None, 0, 1000) new_phenos = [] for pheno in data["phenotypes"]: - media = kbase_api.get_from_ws(pheno["media_ref"],None) + media = kbase_api.get_from_ws(pheno["media_ref"], None) geneko = [] for gene in pheno["geneko_refs"]: geneko.append(added_cpd.split("/").pop()) added_compounds = [] for added_cpd in pheno["additionalcompound_refs"]: added_compounds.append(added_cpd.split("/").pop()) - newpheno = MSGrowthPhenotype(pheno["id"],media,pheno["normalizedGrowth"],geneko,added_compounds) + newpheno = MSGrowthPhenotype( + pheno["id"], media, pheno["normalizedGrowth"], geneko, added_compounds + ) new_phenos.append(newpheno) - growthpheno.add_phenotypes(new_phenos) + growthpheno.add_phenotypes(new_phenos) return growthpheno - + @staticmethod - def from_kbase_file(filename,kbase_api): - #TSV file with the following headers:media mediaws growth geneko addtlCpd - growthpheno = MSGrowthPhenotypes(base_media,0,1000) + def from_kbase_file(filename, kbase_api): + # TSV file with the following headers:media mediaws growth geneko addtlCpd + growthpheno = MSGrowthPhenotypes(base_media, 0, 1000) headings = [] new_phenos = [] with open(filename) as f: @@ -131,28 +168,34 @@ def from_kbase_file(filename,kbase_api): headings = items else: data = {} - for i in range(0,len(items)): + for i in range(0, len(items)): data[headings[i]] = items[i] - data = FBAHelper.validate_dictionary(headings,["media","growth"],{"mediaws":None,"geneko":[],"addtlCpd":[]}) - media = kbase_api.get_from_ws(data["media"],data["mediaws"]) + data = FBAHelper.validate_dictionary( + headings, + ["media", "growth"], + {"mediaws": None, "geneko": [], "addtlCpd": []}, + ) + media = kbase_api.get_from_ws(data["media"], data["mediaws"]) id = data["media"] if len(data["geneko"]) > 0: - id += "-"+",".join(data["geneko"]) + id += "-" + ",".join(data["geneko"]) if len(data["addtlCpd"]) > 0: - id += "-"+",".join(data["addtlCpd"]) - newpheno = MSGrowthPhenotype(id,media,data["growth"],data["geneko"],data["addtlCpd"]) + id += "-" + ",".join(data["addtlCpd"]) + newpheno = MSGrowthPhenotype( + id, media, data["growth"], data["geneko"], data["addtlCpd"] + ) new_phenos.append(newpheno) - growthpheno.add_phenotypes(new_phenos) + growthpheno.add_phenotypes(new_phenos) return growthpheno - + @staticmethod - def from_ms_file(filename,basemedia,base_uptake=0,base_excretion=100): - growthpheno = MSGrowthPhenotypes(base_media,base_uptake,base_excretion) - df = pd.read_csv (filename) - required_headers = ["Compounds","Growth"] + def from_ms_file(filename, basemedia, base_uptake=0, base_excretion=100): + growthpheno = MSGrowthPhenotypes(base_media, base_uptake, base_excretion) + df = pd.read_csv(filename) + required_headers = ["Compounds", "Growth"] for item in required_headers: if item not in df: - raise ValueError('Required header '+item+' is missing!') + raise ValueError("Required header " + item + " is missing!") new_phenos = [] for row in df.rows: cpds = row["Compounds"].split(";") @@ -162,12 +205,12 @@ def from_ms_file(filename,basemedia,base_uptake=0,base_excretion=100): geneko = [] if "GeneKO" in row: geneko = row["GeneKO"].split(";") - newpheno = MSGrowthPhenotype(id,None,row["Growth"],geneko,cpds) + newpheno = MSGrowthPhenotype(id, None, row["Growth"], geneko, cpds) new_phenos.append(newpheno) - growthpheno.add_phenotypes(new_phenos) + growthpheno.add_phenotypes(new_phenos) return growthpheno - - def add_phenotypes(self,new_phenotypes): + + def add_phenotypes(self, new_phenotypes): keep_phenos = [] for pheno in new_phenotypes: if pheno.id not in self.phenotypes: @@ -175,34 +218,64 @@ def add_phenotypes(self,new_phenotypes): keep_phenos.append(pheno) additions = DictList(keep_phenos) self.phenotypes += additions - - def simulate_phenotypes(self,model,biomass,add_missing_exchanges=False,correct_false_negatives=False,template=None,growth_threshold=0.001,save_fluxes=False): + + def simulate_phenotypes( + self, + model, + biomass, + add_missing_exchanges=False, + correct_false_negatives=False, + template=None, + growth_threshold=0.001, + save_fluxes=False, + ): model.objective = biomass modelutl = MSModelUtil(model) - summary = {"Label":["Accuracy","CP","CN","FP","FN"],"Count":[0,0,0,0,0]} - data = {"Phenotype":[],"Observed growth":[],"Simulated growth":[],"Class":[],"Transports missing":[],"Gapfilled reactions":[]} + summary = { + "Label": ["Accuracy", "CP", "CN", "FP", "FN"], + "Count": [0, 0, 0, 0, 0], + } + data = { + "Phenotype": [], + "Observed growth": [], + "Simulated growth": [], + "Class": [], + "Transports missing": [], + "Gapfilled reactions": [], + } for pheno in self.phenotypes: with model: - result = pheno.simulate(modelutl,growth_threshold,add_missing_exchanges,save_fluxes)#Result should have "growth" and "class" + result = pheno.simulate( + modelutl, growth_threshold, add_missing_exchanges, save_fluxes + ) # Result should have "growth" and "class" if result["class"] == "FN" and correct_false_negatives: - pheno.gapfill_model_for_phenotype(modelutl,[template],None) + pheno.gapfill_model_for_phenotype(modelutl, [template], None) if pheno.gapfilling.last_solution != None: - list = []; + list = [] for rxn_id in pheno.gapfilling.last_solution["reversed"]: - list.append(pheno.gapfilling.last_solution["reversed"][rxn_id]+rxn_id) + list.append( + pheno.gapfilling.last_solution["reversed"][rxn_id] + + rxn_id + ) for rxn_id in pheno.gapfilling.last_solution["new"]: - list.append(pheno.gapfilling.last_solution["new"][rxn_id]+rxn_id) + list.append( + pheno.gapfilling.last_solution["new"][rxn_id] + rxn_id + ) data["Gapfilled reactions"].append(";".join(list)) else: data["Gapfilled reactions"].append(None) else: data["Gapfilled reactions"].append(None) - result = pheno.simulate(modelutl,growth_threshold,add_missing_exchanges,save_fluxes)#Result should have "growth" and "class" + result = pheno.simulate( + modelutl, growth_threshold, add_missing_exchanges, save_fluxes + ) # Result should have "growth" and "class" data["Class"].append(result["class"]) data["Phenotype"].append(pheno.id) data["Observed growth"].append(pheno.growth) data["Simulated growth"].append(result["growth"]) - data["Transports missing"].append(";".join(result["missing_transports"])) + data["Transports missing"].append( + ";".join(result["missing_transports"]) + ) if result["class"] == "CP": summary["Count"][1] += 1 summary["Count"][0] += 1 @@ -213,11 +286,9 @@ def simulate_phenotypes(self,model,biomass,add_missing_exchanges=False,correct_f summary["Count"][3] += 1 if result["class"] == "FN": summary["Count"][4] += 1 - - summary["Count"][0] = summary["Count"][0]/len(self.phenotypes) + + summary["Count"][0] = summary["Count"][0] / len(self.phenotypes) sdf = pd.DataFrame(summary) df = pd.DataFrame(data) logger.info(df) - return {"details":df,"summary":sdf} - - \ No newline at end of file + return {"details": df, "summary": sdf} diff --git a/modelseedpy/core/msmedia.py b/modelseedpy/core/msmedia.py index 5f1a8400..17b250db 100755 --- a/modelseedpy/core/msmedia.py +++ b/modelseedpy/core/msmedia.py @@ -5,7 +5,6 @@ class MediaCompound: - def __init__(self, compound_id, lower_bound, upper_bound, concentration=None): self.id = compound_id self.lower_bound = lower_bound @@ -24,7 +23,6 @@ def minFlux(self): class MSMedia: - def __init__(self, media_id, name=""): self.id = media_id self.name = name @@ -38,7 +36,7 @@ def from_dict(media_dict): :param media_dict: :return: """ - media = MSMedia('media') + media = MSMedia("media") media_compounds = [] for cpd_id, v in media_dict.items(): if isinstance(v, tuple): @@ -48,7 +46,7 @@ def from_dict(media_dict): media.mediacompounds += media_compounds return media - def get_media_constraints(self, cmp='e0'): + def get_media_constraints(self, cmp="e0"): """ Parameters: cmp (str): compound suffix (model compartment) @@ -59,18 +57,19 @@ def get_media_constraints(self, cmp='e0'): for compound in self.mediacompounds: met_id = compound.id if cmp is not None: - met_id += '_' + cmp + met_id += "_" + cmp media[met_id] = (compound.lower_bound, compound.upper_bound) return media - - def merge(self,media,overwrite_overlap=False): + + def merge(self, media, overwrite_overlap=False): new_cpds = [] for cpd in media.mediacompounds: - newcpd = MediaCompound(cpd.id, -cpd.maxFlux, -cpd.minFlux, cpd.concentration) + newcpd = MediaCompound( + cpd.id, -cpd.maxFlux, -cpd.minFlux, cpd.concentration + ) if newcpd.id in self.mediacompounds: if overwrite_overlap: self.mediacompounds[newcpd.id] = newcpd else: new_cpds.append(newcpd) self.mediacompounds += new_cpds - \ No newline at end of file diff --git a/modelseedpy/core/msmodel.py b/modelseedpy/core/msmodel.py index 21cfd6a4..4626e08d 100755 --- a/modelseedpy/core/msmodel.py +++ b/modelseedpy/core/msmodel.py @@ -1,7 +1,9 @@ import logging import re from cobra.core import Model -from pyeda.inter import expr # wheels must be specially downloaded and installed for Windows https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyeda +from pyeda.inter import ( + expr, +) # wheels must be specially downloaded and installed for Windows https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyeda logger = logging.getLogger(__name__) @@ -12,9 +14,9 @@ def get_reaction_constraints_from_direction(direction: str) -> (float, float): :param direction: :return: """ - if direction == '>': + if direction == ">": return 0, 1000 - elif direction == '<': + elif direction == "<": return -1000, 0 else: return -1000, 1000 @@ -22,13 +24,16 @@ def get_reaction_constraints_from_direction(direction: str) -> (float, float): def get_direction_from_constraints(lower, upper): if lower < 0 < upper: - return '=' + return "=" elif upper > 0: - return '>' + return ">" elif lower < 0: - return '<' - logger.error(f'The [{lower}, {upper}] bounds are not amenable with a direction string.') - return '?' + return "<" + logger.error( + f"The [{lower}, {upper}] bounds are not amenable with a direction string." + ) + return "?" + def get_gpr_string(gpr): ors = [] @@ -51,18 +56,22 @@ def split_compartment_from_index(cmp_str: str): :param cmp_str: a compartment string with or without index :return: """ - s = re.split(r'(\d+)', cmp_str) + s = re.split(r"(\d+)", cmp_str) index_val = None cmp_val = None if len(s) == 3 and len(s[0]) > 0: cmp_val, index_val, empty = s if empty > 0: - cmp_val = None # set cmp_val to None to raise error if empty element is not empty + cmp_val = ( + None # set cmp_val to None to raise error if empty element is not empty + ) elif len(cmp_str) == 1: cmp_val = s[0] if cmp_val is None: - raise ValueError(f"""Bad value {cmp_str} Value of compartment string must start with letter(s) - and ending (optional) with digits""") + raise ValueError( + f"""Bad value {cmp_str} Value of compartment string must start with letter(s) + and ending (optional) with digits""" + ) return cmp_val, index_val @@ -73,38 +82,40 @@ def get_cmp_token(compartments): :return: """ if len(compartments) == 0: - logger.warning('The compartments parameter is empty. The "c" parameter is assumed.') - return 'c' + logger.warning( + 'The compartments parameter is empty. The "c" parameter is assumed.' + ) + return "c" if len(compartments) == 1: return list(compartments)[0] if len(compartments) == 2: - if set(compartments) == {'e', 'p'}: - return 'e' - elif 'b' in compartments and 'e' in compartments: - return 'b' - elif 'e' in compartments and 'c' in compartments: - return 'c' - elif 'k' in compartments: - return 'k' - elif 'c' in compartments: - return list(filter(lambda x: not x == 'c', compartments))[0] + if set(compartments) == {"e", "p"}: + return "e" + elif "b" in compartments and "e" in compartments: + return "b" + elif "e" in compartments and "c" in compartments: + return "c" + elif "k" in compartments: + return "k" + elif "c" in compartments: + return list(filter(lambda x: not x == "c", compartments))[0] return None -def get_set_set(expr_str): # !!! this currently returns dictionaries, not sets?? +def get_set_set(expr_str): # !!! this currently returns dictionaries, not sets?? if len(expr_str.strip()) == 0: return {} - expr_str = expr_str.replace(' or ', ' | ') - expr_str = expr_str.replace(' and ', ' & ') + expr_str = expr_str.replace(" or ", " | ") + expr_str = expr_str.replace(" and ", " & ") dnf = expr(expr_str).to_dnf() - if len(dnf.inputs) == 1 or dnf.NAME == 'And': + if len(dnf.inputs) == 1 or dnf.NAME == "And": return {frozenset({str(x) for x in dnf.inputs})} else: return {frozenset({str(x) for x in o.inputs}) for o in dnf.xs} return {} -class MSModel(Model): +class MSModel(Model): def __init__(self, id_or_model=None, genome=None, template=None): """ Class representation for a ModelSEED model. diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 99e2e075..edf017ec 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -10,47 +10,48 @@ logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) -#handler = logging.StreamHandler(sys.stdout) -#handler.setLevel(logging.DEBUG) -#formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') -#handler.setFormatter(formatter) -#logger.addHandler(handler) +# handler = logging.StreamHandler(sys.stdout) +# handler.setLevel(logging.DEBUG) +# formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +# handler.setFormatter(formatter) +# logger.addHandler(handler) + class MSModelUtil: mdlutls = {} - + @staticmethod def metabolite_msid(metabolite): - if re.search('^(cpd\d+)', metabolite.id): - m = re.search('^(cpd\d+)', metabolite.id) + if re.search("^(cpd\d+)", metabolite.id): + m = re.search("^(cpd\d+)", metabolite.id) return m[1] for anno in metabolite.annotation: if isinstance(metabolite.annotation[anno], list): for item in metabolite.annotation[anno]: - if re.search('^(cpd\d+)', item): - m = re.search('^(cpd\d+)', item) + if re.search("^(cpd\d+)", item): + m = re.search("^(cpd\d+)", item) return m[1] - elif re.search('^(cpd\d+)', metabolite.annotation[anno]): - m = re.search('^(cpd\d+)', metabolite.annotation[anno]) + elif re.search("^(cpd\d+)", metabolite.annotation[anno]): + m = re.search("^(cpd\d+)", metabolite.annotation[anno]) return m[1] return None - - @staticmethod + + @staticmethod def reaction_msid(reaction): - if re.search('^(rxn\d+)', reaction.id): - m = re.search('^(rxn\d+)', reaction.id) + if re.search("^(rxn\d+)", reaction.id): + m = re.search("^(rxn\d+)", reaction.id) return m[1] for anno in reaction.annotation: if isinstance(reaction.annotation[anno], list): for item in reaction.annotation[anno]: - if re.search('^(rxn\d+)', item): - m = re.search('^(rxn\d+)', item) + if re.search("^(rxn\d+)", item): + m = re.search("^(rxn\d+)", item) return m[1] - elif re.search('^(rxn\d+)', reaction.annotation[anno]): - m = re.search('^(rxn\d+)', reaction.annotation[anno]) + elif re.search("^(rxn\d+)", reaction.annotation[anno]): + m = re.search("^(rxn\d+)", reaction.annotation[anno]) return m[1] return None - + @staticmethod def stoichiometry_to_string(stoichiometry): reactants = [] @@ -69,26 +70,29 @@ def stoichiometry_to_string(stoichiometry): products.append(met) reactants.sort() products.sort() - return ["+".join(reactants)+"="+"+".join(products),"+".join(products)+"="+"+".join(reactants)] - + return [ + "+".join(reactants) + "=" + "+".join(products), + "+".join(products) + "=" + "+".join(reactants), + ] + @staticmethod def search_name(name): name = name.lower() - name = re.sub(r'_[a-z]\d*$', '', name) - name = re.sub(r'\W+', '', name) + name = re.sub(r"_[a-z]\d*$", "", name) + name = re.sub(r"\W+", "", name) return name - + @staticmethod - def get(model,create_if_missing = True): + def get(model, create_if_missing=True): if model in MSModelUtil.mdlutls: - return MSModelUtil.mdlutls[model] + return MSModelUtil.mdlutls[model] elif create_if_missing: MSModelUtil.mdlutls[model] = MSModelUtil(model) return MSModelUtil.mdlutls[model] else: return None - - def __init__(self,model): + + def __init__(self, model): self.model = model self.pkgmgr = MSPackageManager.get_pkg_mgr(model) self.atputl = None @@ -99,32 +103,32 @@ def __init__(self,model): self.reaction_scores = None self.score = None self.integrated_gapfillings = [] - + def compute_automated_reaction_scores(self): """ Computes reaction scores automatically from model data :return: """ self.reaction_scores = {} - - def printlp(self,lpfilename="debug.lp"): - with open(lpfilename, 'w') as out: - out.write(str(self.model.solver)) - + + def printlp(self, lpfilename="debug.lp"): + with open(lpfilename, "w") as out: + out.write(str(self.model.solver)) + def build_metabolite_hash(self): self.metabolite_hash = {} self.search_metabolite_hash = {} for met in self.model.metabolites: - self.add_name_to_metabolite_hash(met.id,met) - self.add_name_to_metabolite_hash(met.name,met) + self.add_name_to_metabolite_hash(met.id, met) + self.add_name_to_metabolite_hash(met.name, met) for anno in met.annotation: if isinstance(met.annotation[anno], list): for item in met.annotation[anno]: - self.add_name_to_metabolite_hash(item,met) + self.add_name_to_metabolite_hash(item, met) else: - self.add_name_to_metabolite_hash(met.annotation[anno],met) - - def add_name_to_metabolite_hash(self,name,met): + self.add_name_to_metabolite_hash(met.annotation[anno], met) + + def add_name_to_metabolite_hash(self, name, met): if name not in self.metabolite_hash: self.metabolite_hash[name] = [] self.metabolite_hash[name].append(met) @@ -132,8 +136,8 @@ def add_name_to_metabolite_hash(self,name,met): if sname not in self.search_metabolite_hash: self.search_metabolite_hash[sname] = [] self.search_metabolite_hash[sname].append(met) - - def find_met(self,name,compartment=None): + + def find_met(self, name, compartment=None): if self.metabolite_hash == None: self.build_metabolite_hash() if name in self.metabolite_hash: @@ -152,27 +156,27 @@ def find_met(self,name,compartment=None): array = met.id.split("_") if array[1] == compartment or met.compartment == compartment: return [met] - return None - logger.info(name+" not found in model!") + return None + logger.info(name + " not found in model!") return [] - - def rxn_hash(self): + + def rxn_hash(self): output = {} for rxn in self.model.reactions: strings = MSModelUtil.stoichiometry_to_string(rxn.metabolites) - output[strings[0]] = [rxn,1] - output[strings[1]] = [rxn,-1] + output[strings[0]] = [rxn, 1] + output[strings[1]] = [rxn, -1] return output - - def find_reaction(self,stoichiometry): + + def find_reaction(self, stoichiometry): output = MSModelUtil.stoichiometry_to_string(stoichiometry) atpstring = output[0] rxn_hash = self.rxn_hash() if atpstring in rxn_hash: return rxn_hash[atpstring] return None - - def msid_hash(self): + + def msid_hash(self): output = {} for cpd in self.model.metabolites: msid = MSModelUtil.metabolite_msid(cpd) @@ -181,22 +185,27 @@ def msid_hash(self): output[msid] = [] output[msid].append(cpd) return output - + def exchange_list(self): exchange_reactions = [] for reaction in self.model.reactions: - if reaction.id[:3] == 'EX_': + if reaction.id[:3] == "EX_": exchange_reactions.append(reaction) return exchange_reactions - + def nonexchange_reaction_count(self): count = 0 for reaction in self.model.reactions: - if reaction.id[:3] != 'EX_' and reaction.id[:3] != 'SK_' and reaction.id[:3] != 'DM_' and reaction.id[:3] != 'bio': + if ( + reaction.id[:3] != "EX_" + and reaction.id[:3] != "SK_" + and reaction.id[:3] != "DM_" + and reaction.id[:3] != "bio" + ): if reaction.upper_bound > 0 or reaction.lower_bound < 0: count += 1 return count - + def exchange_hash(self): exchange_reactions = {} exlist = self.exchange_list() @@ -205,10 +214,10 @@ def exchange_hash(self): if reaction.metabolites[met] == -1: exchange_reactions[met] = reaction else: - logger.warn("Nonstandard exchange reaction ignored:"+reaction.id) + logger.warn("Nonstandard exchange reaction ignored:" + reaction.id) return exchange_reactions - - def add_missing_exchanges(self,media): + + def add_missing_exchanges(self, media): output = [] exchange_hash = self.exchange_hash() exchange_list = [] @@ -222,84 +231,102 @@ def add_missing_exchanges(self,media): if met in exchange_hash: found = 1 elif met.compartment[0:1] == "c": - #We prefer to add a transport for the cytosol compound + # We prefer to add a transport for the cytosol compound cpd = met if cpd == None: - #No cytosol compound exists so choosing the first version we found that does exist + # No cytosol compound exists so choosing the first version we found that does exist cpd = mets[0] if found == 0: - #No transporter currently exists - adding exchange reaction for the compound that does exist + # No transporter currently exists - adding exchange reaction for the compound that does exist output.append(cpd.id) exchange_list.append(cpd) if len(exchange_list) > 0: self.add_exchanges_for_metabolites(exchange_list) return output - - def add_exchanges_for_metabolites(self,cpds,uptake=0,excretion=0,prefix='EX_', prefix_name='Exchange for '): + + def add_exchanges_for_metabolites( + self, cpds, uptake=0, excretion=0, prefix="EX_", prefix_name="Exchange for " + ): drains = [] for cpd in cpds: - drain_reaction = Reaction(id=f'{prefix}{cpd.id}', - name=prefix_name + cpd.name, - lower_bound=-1*uptake, - upper_bound=excretion) - drain_reaction.add_metabolites({cpd : -1}) - drain_reaction.annotation["sbo"] = 'SBO:0000627' + drain_reaction = Reaction( + id=f"{prefix}{cpd.id}", + name=prefix_name + cpd.name, + lower_bound=-1 * uptake, + upper_bound=excretion, + ) + drain_reaction.add_metabolites({cpd: -1}) + drain_reaction.annotation["sbo"] = "SBO:0000627" if drain_reaction.id not in self.model.reactions: drains.append(drain_reaction) self.model.add_reactions(drains) return drains - + def reaction_scores(self): return {} - + ################################################################################# - #Functions related to editing the model + # Functions related to editing the model ################################################################################# - def add_ms_reaction(self,rxn_dict,compartment_trans=["c0","e0"]): + def add_ms_reaction(self, rxn_dict, compartment_trans=["c0", "e0"]): modelseed = ModelSEEDBiochem.get() output = [] for rxnid, compartment in rxn_dict.items(): - fullid = rxnid+"_"+compartment + fullid = rxnid + "_" + compartment modelseed_reaction = modelseed.get_seed_reaction(rxnid) reaction_stoich = modelseed_reaction.cstoichiometry cobra_reaction = Reaction(fullid) output.append(cobra_reaction) - cobra_reaction.name = modelseed_reaction.data['name']+"_"+compartment + cobra_reaction.name = modelseed_reaction.data["name"] + "_" + compartment metabolites_to_add = {} for metabolite, stoich in reaction_stoich.items(): id = metabolite[0] compound = modelseed.get_seed_compound(id).data compartment_number = int(metabolite[1]) if compartment_number > len(compartment_trans): - logger.critical("Compartment index "+str(compartment_number)+" out of range") + logger.critical( + "Compartment index " + str(compartment_number) + " out of range" + ) compartment_string = compartment_trans[compartment_number] - output = self.find_met(id,compartment_string) + met_output = self.find_met(id, compartment_string) cobramet = None - if output: - cobramet = output[0] + if met_output: + cobramet = met_output[0] else: - cobramet = Metabolite(id+"_"+compartment_string, name = compound['name']+"_"+compartment_string, compartment = compartment_string) + cobramet = Metabolite( + id + "_" + compartment_string, + name=compound["name"] + "_" + compartment_string, + compartment=compartment_string, + ) metabolites_to_add[cobramet] = stoich - cobra_reaction.add_metabolites(metabolites_to_add) + cobra_reaction.add_metabolites(metabolites_to_add) cobra_reaction.reaction + print(cobra_reaction.id) + print(len(output)) self.model.add_reactions(output) return output - + ################################################################################# - #Functions related to managing biomass reactions + # Functions related to managing biomass reactions ################################################################################# - def evaluate_biomass_reaction_mass(self,biomass_rxn_id,normalize=False): + def evaluate_biomass_reaction_mass(self, biomass_rxn_id, normalize=False): biorxn = self.model.reactions.get_by_id(biomass_rxn_id) - #First computing energy biosynthesis coefficients + # First computing energy biosynthesis coefficients atp = None - atp_compounds = {"cpd00002":-1,"cpd00001":-1,"cpd00008":1,"cpd00009":1,"cpd00067":1} - mass_compounds = {'cpd11463':1,'cpd11461':1,'cpd11462':1} - process_compounds = {'cpd17041':1,'cpd17042':1,'cpd17043':1} + atp_compounds = { + "cpd00002": -1, + "cpd00001": -1, + "cpd00008": 1, + "cpd00009": 1, + "cpd00067": 1, + } + mass_compounds = {"cpd11463": 1, "cpd11461": 1, "cpd11462": 1} + process_compounds = {"cpd17041": 1, "cpd17042": 1, "cpd17043": 1} for met in biorxn.metabolites: msid = self.metabolite_msid(met) if msid == "cpd00008": atp = abs(biorxn.metabolites[met]) - #Computing non ATP total mass + # Computing non ATP total mass total = 0 for met in biorxn.metabolites: msid = self.metabolite_msid(met) @@ -316,27 +343,27 @@ def evaluate_biomass_reaction_mass(self,biomass_rxn_id,normalize=False): if coef < 0: coef += atp else: - coef += -1*atp - total += mw*coef/1000 - return {"ATP":atp,"Total":total} + coef += -1 * atp + total += mw * coef / 1000 + return {"ATP": atp, "Total": total} - #Required this function to add gapfilled compounds to a KBase model for saving gapfilled model - def convert_cobra_compound_to_kbcompound(self,cpd,kbmodel,add_to_model = 1): + # Required this function to add gapfilled compounds to a KBase model for saving gapfilled model + def convert_cobra_compound_to_kbcompound(self, cpd, kbmodel, add_to_model=1): refid = "cpd00000" - if re.search('cpd\d+_[a-z]+',cpd.id): + if re.search("cpd\d+_[a-z]+", cpd.id): refid = cpd.id - refid = re.sub("_[a-z]\d+$","",refid) + refid = re.sub("_[a-z]\d+$", "", refid) cpd_data = { "aliases": [], "charge": cpd.charge, - "compound_ref": "~/template/compounds/id/"+refid, + "compound_ref": "~/template/compounds/id/" + refid, "dblinks": {}, "formula": cpd.formula, "id": cpd.id, - "modelcompartment_ref": "~/modelcompartments/id/"+cpd.id.split("_").pop(), + "modelcompartment_ref": "~/modelcompartments/id/" + cpd.id.split("_").pop(), "name": cpd.name, "numerical_attributes": {}, - "string_attributes": {} + "string_attributes": {}, } if add_to_model == 1: kbmodel["modelcompounds"].append(cpd_data) @@ -344,32 +371,34 @@ def convert_cobra_compound_to_kbcompound(self,cpd,kbmodel,add_to_model = 1): def compute_flux_values_from_variables(self): """Returns a hash of reaction fluxes from model object - + Parameters ---------- - + Returns ------- dict Hash of reactions and their associated flux values - + Raises ------ """ flux_values = {} for rxn in self.model.reactions: flux_values[rxn.id] = { - 'reverse': rxn.reverse_variable.primal, - 'forward': rxn.forward_variable.primal + "reverse": rxn.reverse_variable.primal, + "forward": rxn.forward_variable.primal, } return flux_values - #Required this function to add gapfilled reactions to a KBase model for saving gapfilled model - def convert_cobra_reaction_to_kbreaction(self,rxn,kbmodel,cpd_hash,direction = "=",add_to_model = 1,reaction_genes = None): + # Required this function to add gapfilled reactions to a KBase model for saving gapfilled model + def convert_cobra_reaction_to_kbreaction( + self, rxn, kbmodel, cpd_hash, direction="=", add_to_model=1, reaction_genes=None + ): rxnref = "~/template/reactions/id/rxn00000_c" - if re.search('rxn\d+_[a-z]+',rxn.id): - rxnref = "~/template/reactions/id/"+rxn.id - rxnref = re.sub("\d+$","",rxnref) + if re.search("rxn\d+_[a-z]+", rxn.id): + rxnref = "~/template/reactions/id/" + rxn.id + rxnref = re.sub("\d+$", "", rxnref) rxn_data = { "id": rxn.id, "aliases": [], @@ -381,34 +410,55 @@ def convert_cobra_reaction_to_kbreaction(self,rxn,kbmodel,cpd_hash,direction = " "maxrevflux": 1000000, "modelReactionProteins": [], "modelReactionReagents": [], - "modelcompartment_ref": "~/modelcompartments/id/"+rxn.id.split("_").pop(), + "modelcompartment_ref": "~/modelcompartments/id/" + rxn.id.split("_").pop(), "name": rxn.name, "numerical_attributes": {}, "probability": 0, "protons": 0, "reaction_ref": rxnref, - "string_attributes": {} + "string_attributes": {}, } for cpd in rxn.metabolites: if cpd.id not in kbmodel["modelcompounds"]: - cpd_hash[cpd.id] = self.convert_cobra_compound_to_kbcompound(cpd,kbmodel,1) - rxn_data["modelReactionReagents"].append({ - "coefficient" : rxn.metabolites[cpd], - "modelcompound_ref" : "~/modelcompounds/id/"+cpd.id - }) + cpd_hash[cpd.id] = self.convert_cobra_compound_to_kbcompound( + cpd, kbmodel, 1 + ) + rxn_data["modelReactionReagents"].append( + { + "coefficient": rxn.metabolites[cpd], + "modelcompound_ref": "~/modelcompounds/id/" + cpd.id, + } + ) if reaction_genes != None and rxn.id in reaction_genes: best_gene = None for gene in reaction_genes[rxn.id]: - if best_gene == None or reaction_genes[rxn.id][gene] > reaction_genes[rxn.id][best_gene]: + if ( + best_gene == None + or reaction_genes[rxn.id][gene] > reaction_genes[rxn.id][best_gene] + ): best_gene = gene - rxn_data["modelReactionProteins"] = [{"note":"Added from gapfilling","modelReactionProteinSubunits":[],"source":"Unknown"}] - rxn_data["modelReactionProteins"][0]["modelReactionProteinSubunits"] = [{"note":"Added from gapfilling","optionalSubunit":0,"triggering":1,"feature_refs":["~/genome/features/id/"+best_gene],"role":"Unknown"}] + rxn_data["modelReactionProteins"] = [ + { + "note": "Added from gapfilling", + "modelReactionProteinSubunits": [], + "source": "Unknown", + } + ] + rxn_data["modelReactionProteins"][0]["modelReactionProteinSubunits"] = [ + { + "note": "Added from gapfilling", + "optionalSubunit": 0, + "triggering": 1, + "feature_refs": ["~/genome/features/id/" + best_gene], + "role": "Unknown", + } + ] if add_to_model == 1: kbmodel["modelreactions"].append(rxn_data) return rxn_data - + ################################################################################# - #Functions related to gapfilling of models + # Functions related to gapfilling of models ################################################################################# """Tests if every reaction in a given gapfilling solution is actually needed for growth Optionally can remove unneeded reactions from the model AND the solution object. @@ -428,7 +478,8 @@ def convert_cobra_reaction_to_kbreaction(self,rxn,kbmodel,cpd_hash,direction = " Raises ------ """ - def test_solution(self,solution,keep_changes=False): + + def test_solution(self, solution, keep_changes=False): unneeded = [] tempmodel = self.model if not keep_changes: @@ -437,8 +488,8 @@ def test_solution(self,solution,keep_changes=False): pkgmgr = MSPackageManager.get_pkg_mgr(tempmodel) pkgmgr.getpkg("KBaseMediaPkg").build_package(solution["media"]) objective = tempmodel.slim_optimize() - logger.debug("Starting objective:"+str(objective)) - types = ["new","reversed"] + logger.debug("Starting objective:" + str(objective)) + types = ["new", "reversed"] for key in types: for rxn_id in solution[key]: rxnobj = tempmodel.reactions.get_by_id(rxn_id) @@ -447,30 +498,54 @@ def test_solution(self,solution,keep_changes=False): rxnobj.upper_bound = 0 objective = tempmodel.slim_optimize() if objective < solution["minobjective"]: - logger.debug(rxn_id+solution[key][rxn_id]+" needed:"+str(objective)+" with min obj:"+str(solution["minobjective"])) + logger.debug( + rxn_id + + solution[key][rxn_id] + + " needed:" + + str(objective) + + " with min obj:" + + str(solution["minobjective"]) + ) rxnobj.upper_bound = original_bound else: - unneeded.append([rxn_id,solution[key][rxn_id],key]) - logger.debug(rxn_id+solution[key][rxn_id]+" not needed:"+str(objective)) + unneeded.append([rxn_id, solution[key][rxn_id], key]) + logger.debug( + rxn_id + + solution[key][rxn_id] + + " not needed:" + + str(objective) + ) else: original_bound = rxnobj.lower_bound rxnobj.lower_bound = 0 objective = tempmodel.slim_optimize() if objective < solution["minobjective"]: - logger.debug(rxn_id+solution[key][rxn_id]+" needed:"+str(objective)+" with min obj:"+str(solution["minobjective"])) + logger.debug( + rxn_id + + solution[key][rxn_id] + + " needed:" + + str(objective) + + " with min obj:" + + str(solution["minobjective"]) + ) rxnobj.lower_bound = original_bound else: - unneeded.append([rxn_id,solution[key][rxn_id],key]) - logger.debug(rxn_id+solution[key][rxn_id]+" not needed:"+str(objective)) + unneeded.append([rxn_id, solution[key][rxn_id], key]) + logger.debug( + rxn_id + + solution[key][rxn_id] + + " not needed:" + + str(objective) + ) if keep_changes: for items in unneeded: del solution[items[2]][items[0]] return unneeded - - def add_gapfilling(self,solution): + + def add_gapfilling(self, solution): self.integrated_gapfillings.append(solution) - - def create_kb_gapfilling_data(self,kbmodel,atpmedia_ws = "94026"): + + def create_kb_gapfilling_data(self, kbmodel, atpmedia_ws="94026"): gapfilling_hash = {} if "gapfillings" not in kbmodel: kbmodel["gapfillings"] = [] @@ -481,30 +556,30 @@ def create_kb_gapfilling_data(self,kbmodel,atpmedia_ws = "94026"): rxn_hash[rxn["id"]] = rxn for gf in self.integrated_gapfillings: media_ref = "KBaseMedia/Empty" - gf["media"].id.replace("/",".") + gf["media"].id.replace("/", ".") gfid = gf["media"].id if self.atputl: for item in self.atputl.atp_medias: if item[0] == gf["media"]: - gfid = "ATP-"+gfid - media_ref = atpmedia_ws+"/"+gf["media"].id+".atp" + gfid = "ATP-" + gfid + media_ref = atpmedia_ws + "/" + gf["media"].id + ".atp" break - if hasattr(gf["media"], 'info'): - media_ref = gf["media"].info.workspace_id+"/"+gf["media"].info.id + if hasattr(gf["media"], "info"): + media_ref = gf["media"].info.workspace_id + "/" + gf["media"].info.id suffix = 0 while gfid in gapfilling_hash: suffix += 1 - gfid += "."+str(suffix) + gfid += "." + str(suffix) gapfilling_hash[gfid] = 1 gapfilling_obj = { "gapfill_id": gfid, "id": gfid, "integrated": 1, "integrated_solution": "0", - "target":gf["target"], - "minobjective":gf["minobjective"], - "binary_check":gf["binary_check"], - "media_ref": media_ref + "target": gf["target"], + "minobjective": gf["minobjective"], + "binary_check": gf["binary_check"], + "media_ref": media_ref, } kbmodel["gapfillings"].append(gapfilling_obj) for rxn in gf["new"]: @@ -513,9 +588,7 @@ def create_kb_gapfilling_data(self,kbmodel,atpmedia_ws = "94026"): if "gapfill_data" not in rxnobj: rxnobj["gapfill_data"] = {} if gfid not in rxnobj["gapfill_data"]: - rxnobj["gapfill_data"][gfid] = { - "0" : [gf["new"][rxn],1,[]] - } + rxnobj["gapfill_data"][gfid] = {"0": [gf["new"][rxn], 1, []]} for rxn in gf["reversed"]: if rxn in rxn_hash: rxnobj = rxn_hash[rxn] @@ -523,27 +596,27 @@ def create_kb_gapfilling_data(self,kbmodel,atpmedia_ws = "94026"): rxnobj["gapfill_data"] = {} if gfid not in rxnobj["gapfill_data"]: rxnobj["gapfill_data"][gfid] = { - "0" : [gf["reversed"][rxn],1,[]] + "0": [gf["reversed"][rxn], 1, []] } - + ################################################################################# - #Functions related to applying, running, and expanding with test conditions + # Functions related to applying, running, and expanding with test conditions ################################################################################# - def apply_test_condition(self,condition,model = None): + def apply_test_condition(self, condition, model=None): """Applies constraints and objective of specified condition to model - + Parameters ---------- condition : dict Specifies condition to be tested with media, objective, is_max_threshold, threshold. model : cobra.Model, optional Specific instance of model to apply conditions to (useful if using "with model") - + Returns ------- boolean True if threshold is NOT exceeded, False if threshold is exceeded - + Raises ------ """ @@ -558,10 +631,10 @@ def apply_test_condition(self,condition,model = None): else: model.objective.direction = "min" pkgmgr.getpkg("KBaseMediaPkg").build_package(condition["media"]) - - def test_single_condition(self,condition,apply_condition=True,model=None): + + def test_single_condition(self, condition, apply_condition=True, model=None): """Runs a single test condition to determine if objective value on set media exceeds threshold - + Parameters ---------- condition : dict @@ -570,82 +643,93 @@ def test_single_condition(self,condition,apply_condition=True,model=None): Indicates if condition constraints and objective should be applied. model : cobra.Model, optional Specific instance of model to apply tests to (useful if using "with model") - + Returns ------- boolean True if threshold is NOT exceeded, False if threshold is exceeded - + Raises ------ """ if model == None: model = self.model if apply_condition: - self.apply_test_condition(condition,model) + self.apply_test_condition(condition, model) new_objective = model.slim_optimize() value = new_objective if "change" in condition and condition["change"]: if self.test_objective: value = new_objective - self.test_objective - logger.debug(condition["media"].id+" testing for change:"+str(value)+"="+str(new_objective)+"-"+str(self.test_objective)) + logger.debug( + condition["media"].id + + " testing for change:" + + str(value) + + "=" + + str(new_objective) + + "-" + + str(self.test_objective) + ) self.score = value - if model.solver.status != 'optimal': - self.printlp(condition["media"].id+"-Testing-Infeasible.lp") - logger.critical(ondition["media"].id+"testing leads to infeasible problem. LP file printed to debug!") + if model.solver.status != "optimal": + self.printlp(condition["media"].id + "-Testing-Infeasible.lp") + logger.critical( + ondition["media"].id + + "testing leads to infeasible problem. LP file printed to debug!" + ) return False if value >= condition["threshold"] and condition["is_max_threshold"]: - #logger.debug("Failed high:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) + # logger.debug("Failed high:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) return False elif value <= condition["threshold"] and not condition["is_max_threshold"]: - #logger.debug("Failed low:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) + # logger.debug("Failed low:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) return False self.test_objective = new_objective return True - - def test_condition_list(self,condition_list,model=None): + + def test_condition_list(self, condition_list, model=None): """Runs a set of test conditions to determine if objective values on set medias exceed thresholds - + Parameters ---------- condition_list : list Specifies set of conditions to be tested with media, objective, is_max_threshold, threshold. model : cobra.Model, optional Specific instance of model to apply tests to (useful if using "with model") - + Returns ------- boolean True if ALL tests pass, False if any test returns false - + Raises ------ """ if model == None: model = self.model for condition in condition_list: - if not self.test_single_condition(condition,True,model): + if not self.test_single_condition(condition, True, model): return False return True - - def linear_expansion_test(self,reaction_list,condition,currmodel): + + def linear_expansion_test(self, reaction_list, condition, currmodel): """Tests addition of reactions one at a time - + Parameters ---------- reaction_list : list<[obj reaction,{>|>}]> List of reactions and directions to test for addition in the model (should already be in model) - + Returns ------- list<[obj reaction,{>|>}]> List of reactions and directions filtered because they fail tests when in the model - + Raises ------ """ - #First run the full test - if self.test_single_condition(condition,False,currmodel): + # First run the full test + if self.test_single_condition(condition, False, currmodel): return [] # First knockout all reactions in the input list and save original bounds filtered_list = [] @@ -662,8 +746,8 @@ def linear_expansion_test(self,reaction_list,condition,currmodel): for item in reaction_list: if item[1] == ">": item[0].upper_bound = original_bound[count] - if not self.test_single_condition(condition,False,currmodel): - #logger.debug(item[0].id+":"+item[1]) + if not self.test_single_condition(condition, False, currmodel): + # logger.debug(item[0].id+":"+item[1]) item[0].upper_bound = 0 if item not in filtered_list: item.append(original_bound[count]) @@ -671,8 +755,8 @@ def linear_expansion_test(self,reaction_list,condition,currmodel): filtered_list.append(item) else: item[0].lower_bound = original_bound[count] - if not self.test_single_condition(condition,False,currmodel): - #logger.debug(item[0].id+":"+item[1]) + if not self.test_single_condition(condition, False, currmodel): + # logger.debug(item[0].id+":"+item[1]) item[0].lower_bound = 0 if item not in filtered_list: item.append(original_bound[count]) @@ -680,31 +764,31 @@ def linear_expansion_test(self,reaction_list,condition,currmodel): filtered_list.append(item) count += 1 return filtered_list - - def binary_expansion_test(self,reaction_list,condition,currmodel,depth=0): + + def binary_expansion_test(self, reaction_list, condition, currmodel, depth=0): """Conducts a binary search for bad reaction combinations - + Parameters ---------- reaction_list : list<[obj reaction,{>|>}]> List of reactions and directions to test for addition in the model (should already be in model) condition_list : list Specifies set of conditions to be tested with media, objective, is_max_threshold, threshold. - + Returns ------- list<[obj reaction,{>|>}]> List of reactions and directions filtered because they fail tests when in the model - + Raises ------ """ newdepth = depth + 1 filtered_list = [] - #First run the full test - if self.test_single_condition(condition,False,currmodel): + # First run the full test + if self.test_single_condition(condition, False, currmodel): return [] - #Check if input list contains only one reaction: + # Check if input list contains only one reaction: if len(reaction_list) == 1: if reaction_list[0][1] == ">": reaction_list[0].append(reaction_list[0][0].upper_bound) @@ -715,16 +799,16 @@ def binary_expansion_test(self,reaction_list,condition,currmodel,depth=0): reaction_list[0].append(self.score) filtered_list.append(reaction_list[0]) return filtered_list - #Break reaction list into two + # Break reaction list into two original_bound = [] - sub_lists = [[],[]] - midway_point = int(len(reaction_list)/2) + sub_lists = [[], []] + midway_point = int(len(reaction_list) / 2) for i, item in enumerate(reaction_list): if item[1] == ">": original_bound.append(item[0].upper_bound) else: original_bound.append(item[0].lower_bound) - if i < midway_point: + if i < midway_point: sub_lists[0].append(item) else: sub_lists[1].append(item) @@ -732,37 +816,43 @@ def binary_expansion_test(self,reaction_list,condition,currmodel,depth=0): item[0].upper_bound = 0 else: item[0].lower_bound = 0 - #Submitting first half of reactions for testing - new_filter = self.binary_expansion_test(sub_lists[0],condition,currmodel,newdepth) + # Submitting first half of reactions for testing + new_filter = self.binary_expansion_test( + sub_lists[0], condition, currmodel, newdepth + ) for item in new_filter: filtered_list.append(item) - #Submitting second half of reactions for testing - now only breaking reactions are removed from the first list + # Submitting second half of reactions for testing - now only breaking reactions are removed from the first list for i, item in enumerate(reaction_list): - if i >= midway_point: + if i >= midway_point: if item[1] == ">": item[0].upper_bound = original_bound[i] else: item[0].lower_bound = original_bound[i] - new_filter = self.binary_expansion_test(sub_lists[1],condition,currmodel,newdepth) + new_filter = self.binary_expansion_test( + sub_lists[1], condition, currmodel, newdepth + ) for item in new_filter: filtered_list.append(item) return filtered_list - - def reaction_expansion_test(self,reaction_list,condition_list,binary_search=True): + + def reaction_expansion_test( + self, reaction_list, condition_list, binary_search=True + ): """Adds reactions in reaction list one by one and appplies tests, filtering reactions that fail - + Parameters ---------- reaction_list : list<[obj reaction,{>|>}]> List of reactions and directions to test for addition in the model (should already be in model) condition_list : list Specifies set of conditions to be tested with media, objective, is_max_threshold, threshold. - + Returns ------- list<[obj reaction,{>|>}]> List of reactions and directions filtered because they fail tests when in the model - + Raises ------ """ @@ -775,33 +865,50 @@ def reaction_expansion_test(self,reaction_list,condition_list,binary_search=True with currmodel: self.apply_test_condition(condition) if binary_search: - new_filtered = self.binary_expansion_test(reaction_list,condition,currmodel) + new_filtered = self.binary_expansion_test( + reaction_list, condition, currmodel + ) for item in new_filtered: filtered_list.append(item) else: - new_filtered = self.linear_expansion_test(reaction_list,condition,currmodel) + new_filtered = self.linear_expansion_test( + reaction_list, condition, currmodel + ) for item in new_filtered: filtered_list.append(item) - #Restoring knockout of newly filtered reactions, which expire after exiting the "with" block above + # Restoring knockout of newly filtered reactions, which expire after exiting the "with" block above for item in new_filtered: if item[1] == ">": item[0].upper_bound = 0 else: item[0].lower_bound = 0 toc = time.perf_counter() - logger.debug("Expansion time:"+condition["media"].id+":"+str((toc-tic))) - logger.debug("Filtered count:"+str(len(filtered_list))+" out of "+str(len(reaction_list))) + logger.debug( + "Expansion time:" + condition["media"].id + ":" + str((toc - tic)) + ) + logger.debug( + "Filtered count:" + + str(len(filtered_list)) + + " out of " + + str(len(reaction_list)) + ) return filtered_list - def add_atp_hydrolysis(self,compartment): - #Searching for ATP hydrolysis compounds - coefs = {"cpd00002":[-1,compartment],"cpd00001":[-1,compartment],"cpd00008":[1,compartment],"cpd00009":[1,compartment],"cpd00067":[1,compartment]} - msids = ["cpd00002","cpd00001","cpd00008","cpd00009","cpd00067"] + def add_atp_hydrolysis(self, compartment): + # Searching for ATP hydrolysis compounds + coefs = { + "cpd00002": [-1, compartment], + "cpd00001": [-1, compartment], + "cpd00008": [1, compartment], + "cpd00009": [1, compartment], + "cpd00067": [1, compartment], + } + msids = ["cpd00002", "cpd00001", "cpd00008", "cpd00009", "cpd00067"] stoichiometry = {} id_hash = self.msid_hash() for msid in msids: if msid not in id_hash: - logger.warning("Compound "+msid+" not found in model!") + logger.warning("Compound " + msid + " not found in model!") return None else: for cpd in id_hash[msid]: @@ -809,20 +916,22 @@ def add_atp_hydrolysis(self,compartment): stoichiometry[cpd] = coefs[msid][0] output = self.find_reaction(stoichiometry) if output != None and output[1] == ">": - return {"reaction":output[0],"direction":">","new":False} - cobra_reaction = Reaction("rxn00062_"+compartment, - name="ATP hydrolysis", - lower_bound=0, - upper_bound=1000) - cobra_reaction.annotation["sbo"] = "SBO:0000176" #biochemical reaction + return {"reaction": output[0], "direction": ">", "new": False} + cobra_reaction = Reaction( + "rxn00062_" + compartment, + name="ATP hydrolysis", + lower_bound=0, + upper_bound=1000, + ) + cobra_reaction.annotation["sbo"] = "SBO:0000176" # biochemical reaction cobra_reaction.annotation["seed.reaction"] = "rxn00062" cobra_reaction.add_metabolites(stoichiometry) self.model.add_reactions([cobra_reaction]) - return {"reaction":cobra_reaction,"direction":">","new":True} - + return {"reaction": cobra_reaction, "direction": ">", "new": True} + @staticmethod def parse_id(object): - if re.search('(.+)_([a-z]+)(\d*)$', object.id) != None: - m = re.search('(.+)_([a-z]+)(\d*)$', object.id) - return (m[1],m[2],m[3]) - return None \ No newline at end of file + if re.search("(.+)_([a-z]+)(\d*)$", object.id) != None: + m = re.search("(.+)_([a-z]+)(\d*)$", object.id) + return (m[1], m[2], m[3]) + return None diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 03c485c1..d1f1b05e 100755 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -5,10 +5,14 @@ from cobra.core import Metabolite, Reaction from cobra.core.dictlist import DictList from cobra.util import format_long_string -from modelseedpy.core.msmodel import get_direction_from_constraints, \ - get_reaction_constraints_from_direction, get_cmp_token +from modelseedpy.core.msmodel import ( + get_direction_from_constraints, + get_reaction_constraints_from_direction, + get_cmp_token, +) from cobra.core.dictlist import DictList -#from cobrakbase.kbase_object_info import KBaseObjectInfo + +# from cobrakbase.kbase_object_info import KBaseObjectInfo logger = logging.getLogger(__name__) @@ -17,23 +21,33 @@ class AttrDict(dict): """ Base object to use for subobjects in KBase objects """ + def __init__(self, *args, **kwargs): super(AttrDict, self).__init__(*args, **kwargs) self.__dict__ = self class TemplateReactionType(Enum): - CONDITIONAL = 'conditional' - UNIVERSAL = 'universal' - SPONTANEOUS = 'spontaneous' - GAPFILLING = 'gapfilling' + CONDITIONAL = "conditional" + UNIVERSAL = "universal" + SPONTANEOUS = "spontaneous" + GAPFILLING = "gapfilling" class MSTemplateMetabolite: - - def __init__(self, cpd_id, formula=None, name='', default_charge=None, - mass=None, delta_g=None, delta_g_error=None, is_cofactor=False, - abbreviation='', aliases=None): + def __init__( + self, + cpd_id, + formula=None, + name="", + default_charge=None, + mass=None, + delta_g=None, + delta_g_error=None, + is_cofactor=False, + abbreviation="", + aliases=None, + ): self.id = cpd_id self.formula = formula self.name = name @@ -52,26 +66,30 @@ def __init__(self, cpd_id, formula=None, name='', default_charge=None, @staticmethod def from_dict(d): return MSTemplateMetabolite( - d['id'], d['formula'], d['name'], - d['defaultCharge'], d['mass'], - d['deltaG'], d['deltaGErr'], - d['isCofactor'] == 1, - d['abbreviation'], - d['aliases'] + d["id"], + d["formula"], + d["name"], + d["defaultCharge"], + d["mass"], + d["deltaG"], + d["deltaGErr"], + d["isCofactor"] == 1, + d["abbreviation"], + d["aliases"], ) def get_data(self): return { - 'id': self.id, - 'name': self.name, - 'abbreviation': self.abbreviation if self.abbreviation else "", - 'aliases': [], - 'defaultCharge': self.default_charge if self.default_charge else 0, - 'deltaG': self.delta_g if self.delta_g else 10000000, - 'deltaGErr': self.delta_g_error if self.delta_g_error else 10000000, - 'formula': self.formula if self.formula else 'R', - 'isCofactor': 1 if self.is_cofactor else 0, - 'mass': self.mass if self.mass else 0 + "id": self.id, + "name": self.name, + "abbreviation": self.abbreviation if self.abbreviation else "", + "aliases": [], + "defaultCharge": self.default_charge if self.default_charge else 0, + "deltaG": self.delta_g if self.delta_g else 10000000, + "deltaGErr": self.delta_g_error if self.delta_g_error else 10000000, + "formula": self.formula if self.formula else "R", + "isCofactor": 1 if self.is_cofactor else 0, + "mass": self.mass if self.mass else 0, } def __repr__(self): @@ -96,39 +114,50 @@ def _repr_html_(self): In {n_species} species {species} - """.format(id=self.id, name=format_long_string(self.name), - formula=self.formula, - address='0x0%x' % id(self), - n_species=len(self.species), - species=format_long_string( - ', '.join(r.id for r in self.species), 200)) + """.format( + id=self.id, + name=format_long_string(self.name), + formula=self.formula, + address="0x0%x" % id(self), + n_species=len(self.species), + species=format_long_string(", ".join(r.id for r in self.species), 200), + ) class MSTemplateSpecies(Metabolite): - - def __init__(self, comp_cpd_id: str, charge: int, compartment: str, cpd_id, max_uptake=0, template=None): + def __init__( + self, + comp_cpd_id: str, + charge: int, + compartment: str, + cpd_id, + max_uptake=0, + template=None, + ): self._template_compound = None - super().__init__(comp_cpd_id, '', '', charge, compartment) + super().__init__(comp_cpd_id, "", "", charge, compartment) self._template = template self.cpd_id = cpd_id self.max_uptake = max_uptake if self._template: if self.cpd_id in self._template.compounds: - self._template_compound = self._template.compounds.get_by_id(self.cpd_id) + self._template_compound = self._template.compounds.get_by_id( + self.cpd_id + ) - def to_metabolite(self, index='0'): + def to_metabolite(self, index="0"): """ Create cobra.core.Metabolite instance :param index: compartment index :return: cobra.core.Metabolite """ if index is None: - index = '' - cpd_id = f'{self.id}{index}' - compartment = f'{self.compartment}{index}' - name = f'{self.name}' + index = "" + cpd_id = f"{self.id}{index}" + compartment = f"{self.compartment}{index}" + name = f"{self.name}" if len(str(index)) > 0: - name = f'{self.name} [{compartment}]' + name = f"{self.name} [{compartment}]" metabolite = Metabolite(cpd_id, self.formula, name, self.charge, compartment) return metabolite @@ -140,7 +169,7 @@ def compound(self): def name(self): if self._template_compound: return self._template_compound.name - return '' + return "" @name.setter def name(self, value): @@ -151,7 +180,7 @@ def name(self, value): def formula(self): if self._template_compound: return self._template_compound.formula - return '' + return "" @formula.setter def formula(self, value): @@ -161,30 +190,41 @@ def formula(self, value): @staticmethod def from_dict(d, template=None): return MSTemplateSpecies( - d['id'], - d['charge'], - d['templatecompartment_ref'].split('/')[-1], - d['templatecompound_ref'].split('/')[-1], - d['maxuptake'], + d["id"], + d["charge"], + d["templatecompartment_ref"].split("/")[-1], + d["templatecompound_ref"].split("/")[-1], + d["maxuptake"], template, ) def get_data(self): return { - 'charge': self.charge, - 'id': self.id, - 'maxuptake': self.max_uptake, - 'templatecompartment_ref': '~/compartments/id/' + self.compartment, - 'templatecompound_ref': '~/compounds/id/' + self.cpd_id + "charge": self.charge, + "id": self.id, + "maxuptake": self.max_uptake, + "templatecompartment_ref": "~/compartments/id/" + self.compartment, + "templatecompound_ref": "~/compounds/id/" + self.cpd_id, } class MSTemplateReaction(Reaction): - - def __init__(self, rxn_id: str, reference_id: str, name='', subsystem='', lower_bound=0.0, upper_bound=None, - reaction_type=TemplateReactionType.CONDITIONAL, gapfill_direction='=', - base_cost=1000, reverse_penalty=1000, forward_penalty=1000, - status='OK', reference_reaction_id=None): + def __init__( + self, + rxn_id: str, + reference_id: str, + name="", + subsystem="", + lower_bound=0.0, + upper_bound=None, + reaction_type=TemplateReactionType.CONDITIONAL, + gapfill_direction="=", + base_cost=1000, + reverse_penalty=1000, + forward_penalty=1000, + status="OK", + reference_reaction_id=None, + ): """ :param rxn_id: @@ -209,7 +249,11 @@ def __init__(self, rxn_id: str, reference_id: str, name='', subsystem='', lower_ self.reverse_penalty = reverse_penalty self.forward_penalty = forward_penalty self.status = status - self.type = reaction_type.value if type(reaction_type) == TemplateReactionType else reaction_type + self.type = ( + reaction_type.value + if type(reaction_type) == TemplateReactionType + else reaction_type + ) self.reference_reaction_id = reference_reaction_id # TODO: to be removed self.complexes = DictList() self.templateReactionReagents = {} @@ -217,7 +261,7 @@ def __init__(self, rxn_id: str, reference_id: str, name='', subsystem='', lower_ @property def gene_reaction_rule(self): - return ' or '.join(map(lambda x: x.id, self.complexes)) + return " or ".join(map(lambda x: x.id, self.complexes)) @gene_reaction_rule.setter def gene_reaction_rule(self, gpr): @@ -231,12 +275,12 @@ def compartment(self): """ return get_cmp_token(self.compartments) - def to_reaction(self, model=None, index='0'): + def to_reaction(self, model=None, index="0"): if index is None: - index = '' - rxn_id = f'{self.id}{index}' - compartment = f'{self.compartment}{index}' - name = f'{self.name}' + index = "" + rxn_id = f"{self.id}{index}" + compartment = f"{self.compartment}{index}" + name = f"{self.name}" metabolites = {} for m, v in self.metabolites.items(): if model and m.id in model.metabolites: @@ -245,8 +289,10 @@ def to_reaction(self, model=None, index='0'): metabolites[m.to_metabolite(index)] = v if len(str(index)) > 0: - name = f'{self.name} [{compartment}]' - reaction = Reaction(rxn_id, name, self.subsystem, self.lower_bound, self.upper_bound) + name = f"{self.name} [{compartment}]" + reaction = Reaction( + rxn_id, name, self.subsystem, self.lower_bound, self.upper_bound + ) reaction.add_metabolites(metabolites) return reaction @@ -254,22 +300,34 @@ def to_reaction(self, model=None, index='0'): def from_dict(d, template): metabolites = {} complexes = set() - for o in d['templateReactionReagents']: - comp_compound = template.compcompounds.get_by_id(o['templatecompcompound_ref'].split('/')[-1]) - metabolites[comp_compound] = o['coefficient'] - for o in d['templatecomplex_refs']: - protein_complex = template.complexes.get_by_id(o.split('/')[-1]) + for o in d["templateReactionReagents"]: + comp_compound = template.compcompounds.get_by_id( + o["templatecompcompound_ref"].split("/")[-1] + ) + metabolites[comp_compound] = o["coefficient"] + for o in d["templatecomplex_refs"]: + protein_complex = template.complexes.get_by_id(o.split("/")[-1]) complexes.add(protein_complex) - lower_bound, upper_bound = get_reaction_constraints_from_direction(d['direction']) - if 'lower_bound' in d and 'upper_bound' in d: - lower_bound = d['lower_bound'] - upper_bound = d['upper_bound'] + lower_bound, upper_bound = get_reaction_constraints_from_direction( + d["direction"] + ) + if "lower_bound" in d and "upper_bound" in d: + lower_bound = d["lower_bound"] + upper_bound = d["upper_bound"] reaction = MSTemplateReaction( - d['id'], d['reaction_ref'].split('/')[-1], d['name'], '', lower_bound, upper_bound, - d['type'], d['GapfillDirection'], - d['base_cost'], d['reverse_penalty'], d['forward_penalty'], - d['status'] if 'status' in d else None, - d['reaction_ref'].split('/')[-1] + d["id"], + d["reaction_ref"].split("/")[-1], + d["name"], + "", + lower_bound, + upper_bound, + d["type"], + d["GapfillDirection"], + d["base_cost"], + d["reverse_penalty"], + d["forward_penalty"], + d["status"] if "status" in d else None, + d["reaction_ref"].split("/")[-1], ) reaction.add_metabolites(metabolites) reaction.add_complexes(complexes) @@ -280,7 +338,10 @@ def add_complexes(self, complex_list): @property def cstoichiometry(self): - return dict(((met.id, met.compartment), coefficient) for (met, coefficient) in self.metabolites.items()) + return dict( + ((met.id, met.compartment), coefficient) + for (met, coefficient) in self.metabolites.items() + ) def remove_role(self, role_id): pass @@ -304,46 +365,55 @@ def get_complexes(self): def get_complex_roles(self): res = {} - for complexes in self.data['templatecomplex_refs']: - complex_id = complexes.split('/')[-1] + for complexes in self.data["templatecomplex_refs"]: + complex_id = complexes.split("/")[-1] res[complex_id] = set() if self._template: cpx = self._template.get_complex(complex_id) if cpx: - for complex_role in cpx['complexroles']: - role_id = complex_role['templaterole_ref'].split('/')[-1] + for complex_role in cpx["complexroles"]: + role_id = complex_role["templaterole_ref"].split("/")[-1] res[complex_id].add(role_id) else: - print('!!') + print("!!") return res def get_data(self): - template_reaction_reagents = list(map(lambda x: { - 'coefficient': x[1], - 'templatecompcompound_ref': '~/compcompounds/id/' + x[0].id - }, self.metabolites.items())) + template_reaction_reagents = list( + map( + lambda x: { + "coefficient": x[1], + "templatecompcompound_ref": "~/compcompounds/id/" + x[0].id, + }, + self.metabolites.items(), + ) + ) return { - 'id': self.id, - 'name': self.name, - 'GapfillDirection': self.GapfillDirection, - 'base_cost': self.base_cost, - 'reverse_penalty': self.reverse_penalty, - 'forward_penalty': self.forward_penalty, - 'upper_bound': self.upper_bound, - 'lower_bound': self.lower_bound, - 'direction': get_direction_from_constraints(self.lower_bound, self.upper_bound), - 'maxforflux': self.upper_bound, - 'maxrevflux': 0 if self.lower_bound > 0 else math.fabs(self.lower_bound), - 'reaction_ref': 'kbase/default/reactions/id/' + self.reference_id, - 'templateReactionReagents': template_reaction_reagents, - 'templatecompartment_ref': '~/compartments/id/' + self.compartment, - 'templatecomplex_refs': list(map(lambda x: '~/complexes/id/' + x.id, self.complexes)), + "id": self.id, + "name": self.name, + "GapfillDirection": self.GapfillDirection, + "base_cost": self.base_cost, + "reverse_penalty": self.reverse_penalty, + "forward_penalty": self.forward_penalty, + "upper_bound": self.upper_bound, + "lower_bound": self.lower_bound, + "direction": get_direction_from_constraints( + self.lower_bound, self.upper_bound + ), + "maxforflux": self.upper_bound, + "maxrevflux": 0 if self.lower_bound > 0 else math.fabs(self.lower_bound), + "reaction_ref": "kbase/default/reactions/id/" + self.reference_id, + "templateReactionReagents": template_reaction_reagents, + "templatecompartment_ref": "~/compartments/id/" + self.compartment, + "templatecomplex_refs": list( + map(lambda x: "~/complexes/id/" + x.id, self.complexes) + ), # 'status': self.status, - 'type': self.type + "type": self.type, } - #def build_reaction_string(self, use_metabolite_names=False, use_compartment_names=None): + # def build_reaction_string(self, use_metabolite_names=False, use_compartment_names=None): # cpd_name_replace = {} # if use_metabolite_names: # if self._template: @@ -358,15 +428,13 @@ def get_data(self): # return self.data['definition'] # return to_str2(self, use_compartment_names, cpd_name_replace) - #def __str__(self): + # def __str__(self): # return "{id}: {stoichiometry}".format( # id=self.id, stoichiometry=self.build_reaction_string()) class NewModelTemplateRole: - - def __init__(self, role_id, name, - features=None, source='', aliases=None): + def __init__(self, role_id, name, features=None, source="", aliases=None): """ :param role_id: @@ -385,15 +453,17 @@ def __init__(self, role_id, name, @staticmethod def from_dict(d): - return NewModelTemplateRole(d['id'], d['name'], d['features'], d['source'], d['aliases']) + return NewModelTemplateRole( + d["id"], d["name"], d["features"], d["source"], d["aliases"] + ) def get_data(self): return { - 'id': self.id, - 'name': self.name, - 'aliases': self.aliases, - 'features': self.features, - 'source': self.source + "id": self.id, + "name": self.name, + "aliases": self.aliases, + "features": self.features, + "source": self.source, } def __repr__(self): @@ -416,16 +486,19 @@ def _repr_html_(self): In {n_complexes} complexes {complexes} - """.format(id=self.id, name=format_long_string(self.name), - address='0x0%x' % id(self), - n_complexes=len(self._complexes), - complexes=format_long_string( - ', '.join(r.id for r in self._complexes), 200)) + """.format( + id=self.id, + name=format_long_string(self.name), + address="0x0%x" % id(self), + n_complexes=len(self._complexes), + complexes=format_long_string(", ".join(r.id for r in self._complexes), 200), + ) class NewModelTemplateComplex: - - def __init__(self, complex_id, name, source='', reference='', confidence=0, template=None): + def __init__( + self, complex_id, name, source="", reference="", confidence=0, template=None + ): """ :param complex_id: @@ -446,13 +519,13 @@ def __init__(self, complex_id, name, source='', reference='', confidence=0, temp @staticmethod def from_dict(d, template): protein_complex = NewModelTemplateComplex( - d['id'], d['name'], - d['source'], d['reference'], d['confidence'], - template + d["id"], d["name"], d["source"], d["reference"], d["confidence"], template ) - for o in d['complexroles']: - role = template.roles.get_by_id(o['templaterole_ref'].split('/')[-1]) - protein_complex.add_role(role, o['triggering'] == 1, o['optional_role'] == 1) + for o in d["complexroles"]: + role = template.roles.get_by_id(o["templaterole_ref"].split("/")[-1]) + protein_complex.add_role( + role, o["triggering"] == 1, o["optional_role"] == 1 + ) return protein_complex def add_role(self, role: NewModelTemplateRole, triggering=True, optional=False): @@ -469,25 +542,31 @@ def get_data(self): complex_roles = [] for role in self.roles: triggering, optional = self.roles[role] - complex_roles.append({ - 'triggering': 1 if triggering else 0, - 'optional_role': 1 if optional else 0, - 'templaterole_ref': '~/roles/id/' + role.id - }) + complex_roles.append( + { + "triggering": 1 if triggering else 0, + "optional_role": 1 if optional else 0, + "templaterole_ref": "~/roles/id/" + role.id, + } + ) return { - 'id': self.id, - 'name': self.name, - 'reference': self.reference, - 'confidence': self.confidence, - 'source': self.source, - 'complexroles': complex_roles, + "id": self.id, + "name": self.name, + "reference": self.reference, + "confidence": self.confidence, + "source": self.source, + "complexroles": complex_roles, } def __str__(self): - return " and ".join(map(lambda x: "{}{}{}".format( - x[0].id, - ":trig" if x[1][0] else "", - ":optional" if x[1][1] else ""), self.roles.items())) + return " and ".join( + map( + lambda x: "{}{}{}".format( + x[0].id, ":trig" if x[1][0] else "", ":optional" if x[1][1] else "" + ), + self.roles.items(), + ) + ) def __repr__(self): return "<%s %s at 0x%x>" % (self.__class__.__name__, self.id, id(self)) @@ -507,17 +586,25 @@ def _repr_html_(self): Contains {n_complexes} role(s) {complexes} - """.format(id=self.id, name=format_long_string(self.name), - address='0x0%x' % id(self), - n_complexes=len(self.roles), - complexes=format_long_string( - ', '.join("{}:{}:{}:{}".format(r[0].id, r[0].name, r[1][0], r[1][1]) for r in - self.roles.items()), 200)) + """.format( + id=self.id, + name=format_long_string(self.name), + address="0x0%x" % id(self), + n_complexes=len(self.roles), + complexes=format_long_string( + ", ".join( + "{}:{}:{}:{}".format(r[0].id, r[0].name, r[1][0], r[1][1]) + for r in self.roles.items() + ), + 200, + ), + ) class MSTemplateCompartment: - - def __init__(self, compartment_id: str, name: str, ph: float, hierarchy=0, aliases=None): + def __init__( + self, compartment_id: str, name: str, ph: float, hierarchy=0, aliases=None + ): self.id = compartment_id self.name = name self.ph = ph @@ -527,27 +614,37 @@ def __init__(self, compartment_id: str, name: str, ph: float, hierarchy=0, alias @staticmethod def from_dict(d): - return MSTemplateCompartment(d['id'], d['name'], d['pH'], d['hierarchy'], d['aliases']) + return MSTemplateCompartment( + d["id"], d["name"], d["pH"], d["hierarchy"], d["aliases"] + ) def get_data(self): return { - 'id': self.id, - 'name': self.name, - 'pH': self.ph, - 'aliases': self.aliases, - 'hierarchy': self.hierarchy + "id": self.id, + "name": self.name, + "pH": self.ph, + "aliases": self.aliases, + "hierarchy": self.hierarchy, } class MSTemplate: - - def __init__(self, template_id, name='', domain='', template_type='', version=1, info=None, args=None): + def __init__( + self, + template_id, + name="", + domain="", + template_type="", + version=1, + info=None, + args=None, + ): self.id = template_id self.name = name self.domain = domain self.template_type = template_type self.__VERSION__ = version - self.biochemistry_ref = '' + self.biochemistry_ref = "" self.compartments = DictList() self.biomasses = DictList() self.reactions = DictList() @@ -566,7 +663,10 @@ def add_compartments(self, compartments: list): """ duplicates = list(filter(lambda x: x.id in self.compartments, compartments)) if len(duplicates) > 0: - logger.error("unable to add compartments [%s] already present in the template", duplicates) + logger.error( + "unable to add compartments [%s] already present in the template", + duplicates, + ) return None for x in compartments: @@ -581,7 +681,9 @@ def add_roles(self, roles: list): """ duplicates = list(filter(lambda x: x.id in self.roles, roles)) if len(duplicates) > 0: - logger.error("unable to add roles [%s] already present in the template", duplicates) + logger.error( + "unable to add roles [%s] already present in the template", duplicates + ) return None for x in roles: @@ -596,7 +698,10 @@ def add_complexes(self, complexes: list): """ duplicates = list(filter(lambda x: x.id in self.complexes, complexes)) if len(duplicates) > 0: - logger.error("unable to add comp compounds [%s] already present in the template", duplicates) + logger.error( + "unable to add comp compounds [%s] already present in the template", + duplicates, + ) return None roles_to_add = [] @@ -624,7 +729,10 @@ def add_compounds(self, compounds: list): """ duplicates = list(filter(lambda x: x.id in self.compounds, compounds)) if len(duplicates) > 0: - logger.error("unable to add compounds [%s] already present in the template", duplicates) + logger.error( + "unable to add compounds [%s] already present in the template", + duplicates, + ) return None for x in compounds: @@ -639,7 +747,10 @@ def add_comp_compounds(self, comp_compounds: list): """ duplicates = list(filter(lambda x: x.id in self.compcompounds, comp_compounds)) if len(duplicates) > 0: - logger.error("unable to add comp compounds [%s] already present in the template", duplicates) + logger.error( + "unable to add comp compounds [%s] already present in the template", + duplicates, + ) return None for x in comp_compounds: @@ -657,7 +768,10 @@ def add_reactions(self, reaction_list: list): """ duplicates = list(filter(lambda x: x.id in self.reactions, reaction_list)) if len(duplicates) > 0: - logger.error("unable to add reactions [%s] already present in the template", duplicates) + logger.error( + "unable to add reactions [%s] already present in the template", + duplicates, + ) return None for x in reaction_list: @@ -667,7 +781,9 @@ def add_reactions(self, reaction_list: list): for comp_cpd, coefficient in x.metabolites.items(): if comp_cpd.id not in self.compcompounds: self.add_comp_compounds([comp_cpd]) - metabolites_replace[self.compcompounds.get_by_id(comp_cpd.id)] = coefficient + metabolites_replace[ + self.compcompounds.get_by_id(comp_cpd.id) + ] = coefficient for cpx in x.complexes: if cpx.id not in self.complexes: self.add_complexes([cpx]) @@ -684,7 +800,7 @@ def get_complex_sources(self): pass def get_complex_from_role(self, roles): - cpx_role_str = ';'.join(sorted(roles)) + cpx_role_str = ";".join(sorted(roles)) if cpx_role_str in self.role_set_to_cpx: return self.role_set_to_cpx[cpx_role_str] return None @@ -694,7 +810,7 @@ def get_last_id_value(object_list, s): last_id = 0 for o in object_list: if o.id.startswith(s): - number_part = id[len(s):] + number_part = id[len(s) :] if len(number_part) == 5: if int(number_part) > last_id: last_id = int(number_part) @@ -742,21 +858,21 @@ def get_data(self): """ return { - '__VERSION__': self.__VERSION__, - 'id': self.id, - 'name': self.name, - 'domain': self.domain, - 'biochemistry_ref': self.biochemistry_ref, - 'type': 'Test', - 'compartments': list(map(lambda x: x.get_data(), self.compartments)), - 'compcompounds': list(map(lambda x: x.get_data(), self.compcompounds)), - 'compounds': list(map(lambda x: x.get_data(), self.compounds)), - 'roles': list(map(lambda x: x.get_data(), self.roles)), - 'complexes': list(map(lambda x: x.get_data(), self.complexes)), - 'reactions': list(map(lambda x: x.get_data(), self.reactions)), - 'biomasses': list(self.biomasses), - 'pathways': [], - 'subsystems': [], + "__VERSION__": self.__VERSION__, + "id": self.id, + "name": self.name, + "domain": self.domain, + "biochemistry_ref": self.biochemistry_ref, + "type": "Test", + "compartments": list(map(lambda x: x.get_data(), self.compartments)), + "compcompounds": list(map(lambda x: x.get_data(), self.compcompounds)), + "compounds": list(map(lambda x: x.get_data(), self.compounds)), + "roles": list(map(lambda x: x.get_data(), self.roles)), + "complexes": list(map(lambda x: x.get_data(), self.complexes)), + "reactions": list(map(lambda x: x.get_data(), self.reactions)), + "biomasses": list(self.biomasses), + "pathways": [], + "subsystems": [], } def _repr_html_(self): @@ -793,19 +909,30 @@ def _repr_html_(self): """.format( id=self.id, - address='0x0%x' % id(self), + address="0x0%x" % id(self), num_metabolites=len(self.compounds), num_species=len(self.compcompounds), num_reactions=len(self.reactions), num_bio=len(self.biomasses), num_roles=len(self.roles), - num_complexes=len(self.complexes)) + num_complexes=len(self.complexes), + ) class MSTemplateBuilder: - - def __init__(self, template_id, name='', domain='', template_type='', version=1, info=None, - biochemistry=None, biomasses=None, pathways=None, subsystems=None): + def __init__( + self, + template_id, + name="", + domain="", + template_type="", + version=1, + info=None, + biochemistry=None, + biomasses=None, + pathways=None, + subsystems=None, + ): self.id = template_id self.version = version self.name = name @@ -830,15 +957,17 @@ def from_dict(d, info=None, args=None): :param args: :return: """ - builder = MSTemplateBuilder(d['id'], d['name'], d['domain'], d['type'], d['__VERSION__'], None) - builder.compartments = d['compartments'] - builder.roles = d['roles'] - builder.complexes = d['complexes'] - builder.compounds = d['compounds'] - builder.compartment_compounds = d['compcompounds'] - builder.reactions = d['reactions'] - builder.biochemistry_ref = d['biochemistry_ref'] - builder.biomasses = d['biomasses'] + builder = MSTemplateBuilder( + d["id"], d["name"], d["domain"], d["type"], d["__VERSION__"], None + ) + builder.compartments = d["compartments"] + builder.roles = d["roles"] + builder.complexes = d["complexes"] + builder.compounds = d["compounds"] + builder.compartment_compounds = d["compcompounds"] + builder.reactions = d["reactions"] + builder.biochemistry_ref = d["biochemistry_ref"] + builder.biomasses = d["biomasses"] return builder @staticmethod @@ -866,23 +995,23 @@ def with_role(self, template_rxn, role_ids, auto_complex=False): for o in role_match: all_roles_present &= role_match[o] if all_roles_present: - logger.debug('ignore %s all present in atleast 1 complex', role_ids) + logger.debug("ignore %s all present in atleast 1 complex", role_ids) return None complex_id = self.template.get_complex_from_role(role_ids) if complex_id is None: - logger.warning('unable to find complex for %s', role_ids) + logger.warning("unable to find complex for %s", role_ids) if auto_complex: role_names = set() for role_id in role_ids: role = self.template.get_role(role_id) - role_names.add(role['name']) - logger.warning('build complex for %s', role_names) + role_names.add(role["name"]) + logger.warning("build complex for %s", role_names) complex_id = self.template.add_complex_from_role_names(role_names) else: return None - complex_ref = '~/complexes/id/' + complex_id - if complex_ref in template_rxn.data['templatecomplex_refs']: - logger.debug('already contains complex %s, role %s', role_ids, complex_ref) + complex_ref = "~/complexes/id/" + complex_id + if complex_ref in template_rxn.data["templatecomplex_refs"]: + logger.debug("already contains complex %s, role %s", role_ids, complex_ref) return None return complex_ref @@ -892,33 +1021,59 @@ def with_compound(self): def with_compound_compartment(self): pass - def with_compartment(self, cmp_id, name, ph=7, index='0'): - res = list(filter(lambda x: x['id'] == cmp_id, self.compartments)) + def with_compartment(self, cmp_id, name, ph=7, index="0"): + res = list(filter(lambda x: x["id"] == cmp_id, self.compartments)) if len(res) > 0: return res[0] - self.compartments.append({ - 'id': cmp_id, - 'name': name, - 'aliases': [], - 'hierarchy': 3, # TODO: what is this? - 'index': index, - 'pH': ph - }) + self.compartments.append( + { + "id": cmp_id, + "name": name, + "aliases": [], + "hierarchy": 3, # TODO: what is this? + "index": index, + "pH": ph, + } + ) return self def build(self): - template = MSTemplate(self.id, self.name, self.domain, self.template_type, self.version) - template.add_compartments(list(map(lambda x: MSTemplateCompartment.from_dict(x), self.compartments))) - template.add_compounds(list(map(lambda x: MSTemplateMetabolite.from_dict(x), self.compounds))) + template = MSTemplate( + self.id, self.name, self.domain, self.template_type, self.version + ) + template.add_compartments( + list(map(lambda x: MSTemplateCompartment.from_dict(x), self.compartments)) + ) + template.add_compounds( + list(map(lambda x: MSTemplateMetabolite.from_dict(x), self.compounds)) + ) template.add_comp_compounds( - list(map(lambda x: MSTemplateSpecies.from_dict(x), self.compartment_compounds))) - template.add_roles(list(map(lambda x: NewModelTemplateRole.from_dict(x), self.roles))) + list( + map( + lambda x: MSTemplateSpecies.from_dict(x), self.compartment_compounds + ) + ) + ) + template.add_roles( + list(map(lambda x: NewModelTemplateRole.from_dict(x), self.roles)) + ) template.add_complexes( - list(map(lambda x: NewModelTemplateComplex.from_dict(x, template), self.complexes))) + list( + map( + lambda x: NewModelTemplateComplex.from_dict(x, template), + self.complexes, + ) + ) + ) template.add_reactions( - list(map(lambda x: MSTemplateReaction.from_dict(x, template), self.reactions))) - template.biomasses += list(map(lambda x: AttrDict(x), self.biomasses)) # TODO: biomass object + list( + map(lambda x: MSTemplateReaction.from_dict(x, template), self.reactions) + ) + ) + template.biomasses += list( + map(lambda x: AttrDict(x), self.biomasses) + ) # TODO: biomass object return template diff --git a/modelseedpy/core/rast_client.py b/modelseedpy/core/rast_client.py index e2d75fcf..a4b6902a 100644 --- a/modelseedpy/core/rast_client.py +++ b/modelseedpy/core/rast_client.py @@ -1,93 +1,93 @@ from modelseedpy.core.rpcclient import RPCClient -from modelseedpy.core.msgenome import MSFeature # !!! import is never used +from modelseedpy.core.msgenome import MSFeature # !!! import is never used import re -from modelseedpy.core.msgenome import MSGenome, read_fasta, normalize_role #move this to this lib # !!! read_fasta is never used +from modelseedpy.core.msgenome import ( + MSGenome, + read_fasta, + normalize_role, +) # move this to this lib # !!! read_fasta is never used ### delete this after #### def aux_rast_result(res, g): search_name_to_genes = {} search_name_to_orginal = {} - for f in res[0]['features']: - function = f['function'] if 'function' in f else None + for f in res[0]["features"]: + function = f["function"] if "function" in f else None if not function: - function = g.features.get_by_id(f['id']).description + function = g.features.get_by_id(f["id"]).description if function and len(function) > 0: - functions = re.split('; | / | @ | => ', function) + functions = re.split("; | / | @ | => ", function) for f_ in functions: f_norm = normalize_role(f_) if f_norm not in search_name_to_genes: search_name_to_genes[f_norm] = set() search_name_to_orginal[f_norm] = set() search_name_to_orginal[f_norm].add(f_) - search_name_to_genes[f_norm].add(f['id']) + search_name_to_genes[f_norm].add(f["id"]) return search_name_to_genes, search_name_to_orginal + ### delete this after #### def aux_template(template): rxn_roles = {} - roles = dict(map(lambda x: (x['id'], x), template.roles)) + roles = dict(map(lambda x: (x["id"], x), template.roles)) for r in template.reactions: rxn_roles[r.id] = set() complex_roles = r.get_complex_roles() if len(complex_roles) > 0: for cpx_id in complex_roles: for role_id in complex_roles[cpx_id]: - rxn_roles[r.id].add(normalize_role(roles[role_id]['name'])) + rxn_roles[r.id].add(normalize_role(roles[role_id]["name"])) # print(role_id, normalize_role(roles[role_id]['name'])) return rxn_roles class RastClient: - def __init__(self): - self.rpc_client = RPCClient("https://tutorial.theseed.org/services/genome_annotation") + self.rpc_client = RPCClient( + "https://tutorial.theseed.org/services/genome_annotation" + ) self.stages = [ - {"name": 'annotate_proteins_kmer_v2', "kmer_v2_parameters": {}}, - {"name": 'annotate_proteins_kmer_v1', "kmer_v1_parameters": {"annotate_hypothetical_only": 1}}, - {"name": 'annotate_proteins_similarity', "similarity_parameters": {"annotate_hypothetical_only": 1}} + {"name": "annotate_proteins_kmer_v2", "kmer_v2_parameters": {}}, + { + "name": "annotate_proteins_kmer_v1", + "kmer_v1_parameters": {"annotate_hypothetical_only": 1}, + }, + { + "name": "annotate_proteins_similarity", + "similarity_parameters": {"annotate_hypothetical_only": 1}, + }, ] def annotate_genome(self, genome): p_features = [] for f in genome.features: if f.seq and len(f.seq) > 0: - p_features.append({ - "id": f.id, - "protein_translation": f.seq - }) + p_features.append({"id": f.id, "protein_translation": f.seq}) res = self.f(p_features) - for o in res[0]['features']: - feature = genome.features.get_by_id(o['id']) - if 'function' in o: - functions = re.split('; | / | @ | => ', o['function']) + for o in res[0]["features"]: + feature = genome.features.get_by_id(o["id"]) + if "function" in o: + functions = re.split("; | / | @ | => ", o["function"]) for function in functions: - feature.add_ontology_term('RAST', function) + feature.add_ontology_term("RAST", function) - return res[0]['analysis_events'] + return res[0]["analysis_events"] - def annotate_genome_from_fasta(self, filepath, split='|'): + def annotate_genome_from_fasta(self, filepath, split="|"): genome = MSGenome.from_fasta(filepath, split) res = self.annotate_genome(genome) return genome, res def f1(self, protein_id, protein_seq): - p_features = [ - { - "id": protein_id, - "protein_translation": protein_seq - } - ] + p_features = [{"id": protein_id, "protein_translation": protein_seq}] return self.f(p_features) def f(self, p_features): - params = [ - {"features": p_features}, - {"stages": self.stages} - ] + params = [{"features": p_features}, {"stages": self.stages}] result = self.rpc_client.call("GenomeAnnotation.run_pipeline", params) return result - diff --git a/modelseedpy/core/rpcclient.py b/modelseedpy/core/rpcclient.py index 1743a538..831fb2fe 100644 --- a/modelseedpy/core/rpcclient.py +++ b/modelseedpy/core/rpcclient.py @@ -6,6 +6,7 @@ import requests as _requests import random as _random + class _JSONObjectEncoder(_json.JSONEncoder): def default(self, obj): if isinstance(obj, set): @@ -14,56 +15,73 @@ def default(self, obj): return list(obj) return _json.JSONEncoder.default(self, obj) + class ServerError(Exception): - def __init__(self, name, code, message = None, data=None, error=None): + def __init__(self, name, code, message=None, data=None, error=None): super(Exception, self).__init__(message) self.name = name self.code = code - self.message = message or '' - self.data = data or error or '' + self.message = message or "" + self.data = data or error or "" # data = JSON RPC 2.0, error = 1.1 + def __str__(self): - return self.name + ': ' + str(self.code) + '. ' + self.message + '\n' + self.data + return ( + self.name + ": " + str(self.code) + ". " + self.message + "\n" + self.data + ) + class RPCClient: - def __init__(self, url, token=None, version="1.0", timeout=30*60, trust_all_ssl_certificates=False): + def __init__( + self, + url, + token=None, + version="1.0", + timeout=30 * 60, + trust_all_ssl_certificates=False, + ): self.url = url self.token = token self.version = version self.timeout = timeout self.trust_all_ssl_certificates = trust_all_ssl_certificates - - def call(self,method,params,token=None): + + def call(self, method, params, token=None): headers = {} if token: - headers['AUTHORIZATION'] = token + headers["AUTHORIZATION"] = token elif self.token: - headers['AUTHORIZATION'] = self.token - arg_hash = {'method': method, - 'params': params, - 'version': self.version, - 'id': str(_random.random())[2:], - 'context': {} - } + headers["AUTHORIZATION"] = self.token + arg_hash = { + "method": method, + "params": params, + "version": self.version, + "id": str(_random.random())[2:], + "context": {}, + } body = _json.dumps(arg_hash, cls=_JSONObjectEncoder) - ret = _requests.post(self.url, data=body, headers=headers, - timeout=self.timeout, - verify=not self.trust_all_ssl_certificates) - ret.encoding = 'utf-8' + ret = _requests.post( + self.url, + data=body, + headers=headers, + timeout=self.timeout, + verify=not self.trust_all_ssl_certificates, + ) + ret.encoding = "utf-8" if ret.status_code == 500: - if ret.headers.get('content-type') == 'application/json': + if ret.headers.get("content-type") == "application/json": err = ret.json() - if 'error' in err: - raise ServerError(**err['error']) + if "error" in err: + raise ServerError(**err["error"]) else: - raise ServerError('Unknown', 0, ret.text) + raise ServerError("Unknown", 0, ret.text) else: - raise ServerError('Unknown', 0, ret.text) + raise ServerError("Unknown", 0, ret.text) if not ret.ok: ret.raise_for_status() resp = ret.json() - if 'result' not in resp: - raise ServerError('Unknown', 0, 'An unknown server error occurred') - if not resp['result']: + if "result" not in resp: + raise ServerError("Unknown", 0, "An unknown server error occurred") + if not resp["result"]: return None - return resp['result'] \ No newline at end of file + return resp["result"] diff --git a/modelseedpy/core/template.py b/modelseedpy/core/template.py index 54657da0..0055f5db 100644 --- a/modelseedpy/core/template.py +++ b/modelseedpy/core/template.py @@ -1,4 +1,5 @@ import logging + logger = logging.getLogger(__name__) import re # !!! import never used @@ -6,23 +7,37 @@ from cobra.core.dictlist import DictList from cobra.core.model import Metabolite, Reaction -class Template(): + +class Template: def __init__(self): - self.compounds, self.compcompounds, self.reactions = DictList(), DictList(), DictList() - - def convert_template_compound(self,cpdid,index): + self.compounds, self.compcompounds, self.reactions = ( + DictList(), + DictList(), + DictList(), + ) + + def convert_template_compound(self, cpdid, index): comp_compound = self.compcompounds.get_by_id(cpdid) base_id = cpdid.split("_")[0] base_compound = self.compounds.get_by_id(base_id) - compartment = comp_compound.templatecompartment_ref.split("/").pop() + str(index) + compartment = comp_compound.templatecompartment_ref.split("/").pop() + str( + index + ) new_id = base_compound.id + str(index) - met = Metabolite(new_id, formula=base_compound.formula, name=base_compound.name, - charge=comp_compound.charge, compartment=compartment) - met.annotation["sbo"] = "SBO:0000247" #simple chemical - Simple, non-repetitive chemical entity. + met = Metabolite( + new_id, + formula=base_compound.formula, + name=base_compound.name, + charge=comp_compound.charge, + compartment=compartment, + ) + met.annotation[ + "sbo" + ] = "SBO:0000247" # simple chemical - Simple, non-repetitive chemical entity. met.annotation["seed.compound"] = base_id return met - - def convert_template_reaction(self,model,rxnid,index,for_gapfilling=True): + + def convert_template_reaction(self, model, rxnid, index, for_gapfilling=True): template_reaction = self.reactions.get_by_id(rxnid) base_id = template_reaction["id"].split("_")[0] new_id = template_reaction["id"] + str(index) @@ -39,10 +54,11 @@ def convert_template_reaction(self,model,rxnid,index,for_gapfilling=True): upper_bound = 0 cobra_reaction = Reaction( - new_id, - name=template_reaction["name"], - lower_bound=lower_bound, - upper_bound=upper_bound) + new_id, + name=template_reaction["name"], + lower_bound=lower_bound, + upper_bound=upper_bound, + ) object_stoichiometry = {} for item in template_reaction["templateReactionReagents"]: @@ -59,7 +75,7 @@ def convert_template_reaction(self,model,rxnid,index,for_gapfilling=True): cobra_reaction.add_metabolites(object_stoichiometry) - cobra_reaction.annotation["sbo"] = "SBO:0000176" #biochemical reaction + cobra_reaction.annotation["sbo"] = "SBO:0000176" # biochemical reaction cobra_reaction.annotation["seed.reaction"] = base_id return cobra_reaction diff --git a/modelseedpy/fbapkg/__init__.py b/modelseedpy/fbapkg/__init__.py index e67e3824..7f4ccda1 100755 --- a/modelseedpy/fbapkg/__init__.py +++ b/modelseedpy/fbapkg/__init__.py @@ -17,4 +17,4 @@ from modelseedpy.fbapkg.fullthermopkg import FullThermoPkg from modelseedpy.fbapkg.objconstpkg import ObjConstPkg from modelseedpy.fbapkg.changeoptpkg import ChangeOptPkg -from modelseedpy.fbapkg.elementuptakepkg import ElementUptakePkg \ No newline at end of file +from modelseedpy.fbapkg.elementuptakepkg import ElementUptakePkg diff --git a/modelseedpy/fbapkg/basefbapkg.py b/modelseedpy/fbapkg/basefbapkg.py index ed3123e1..924190ef 100755 --- a/modelseedpy/fbapkg/basefbapkg.py +++ b/modelseedpy/fbapkg/basefbapkg.py @@ -5,45 +5,59 @@ import logging import re # !!! import is never used from optlang.symbolics import Zero, add # !!! add is never used -import json as _json # !!! import is never used -from cobra.core import Gene, Metabolite, Model, Reaction # !!! none of these imports are used +import json as _json # !!! import is never used +from cobra.core import ( + Gene, + Metabolite, + Model, + Reaction, +) # !!! none of these imports are used from modelseedpy.fbapkg.mspackagemanager import MSPackageManager from modelseedpy.core.msmodelutl import MSModelUtil from modelseedpy.core.exceptions import FeasibilityError logger = logging.getLogger(__name__) + class BaseFBAPkg: """ Base class for FBA packages """ - def __init__(self, model, name, variable_types={}, constraint_types={}, reaction_types={}): + + def __init__( + self, model, name, variable_types={}, constraint_types={}, reaction_types={} + ): self.model = model self.modelutl = MSModelUtil.get(model) self.name = name - + self.pkgmgr = MSPackageManager.get_pkg_mgr(model) if self.pkgmgr is None: - self.pkgmgr = MSPackageManager.get_pkg_mgr(model,1) + self.pkgmgr = MSPackageManager.get_pkg_mgr(model, 1) self.pkgmgr.addpkgobj(self) - - self.constraints, self.variables, self.parameters, self.new_reactions = {}, {}, {}, {} + + self.constraints, self.variables, self.parameters, self.new_reactions = ( + {}, + {}, + {}, + {}, + ) self.variable_types = variable_types self.constraint_types = constraint_types - + for obj_type in variable_types: self.variables[obj_type] = dict() for obj_type in constraint_types: self.constraints[obj_type] = dict() - + def validate_parameters(self, params, required, defaults): for item in required: if item not in params: - raise ValueError(f'Required argument {item} is missing!') + raise ValueError(f"Required argument {item} is missing!") # defaults are assigned and then replaced with custom params - self.parameters.update(defaults) + self.parameters.update(defaults) self.parameters.update(params) - + def clear(self): cobra_objs = [] for obj_type in self.variables: @@ -55,26 +69,32 @@ def clear(self): self.model.remove_cons_vars(cobra_objs) self.variables = {} self.constraints = {} - - def build_variable(self, obj_type, lower_bound, upper_bound, vartype, cobra_obj=None): + + def build_variable( + self, obj_type, lower_bound, upper_bound, vartype, cobra_obj=None + ): name = None if self.variable_types[obj_type] == "none": count = len(self.variables[obj_type]) - name = str(count+1) + name = str(count + 1) elif self.variable_types[obj_type] == "string": name = cobra_obj else: name = cobra_obj.id if name not in self.variables[obj_type]: - self.variables[obj_type][name] = self.model.problem.Variable(name+"_"+obj_type, lb=lower_bound, ub=upper_bound, type=vartype) + self.variables[obj_type][name] = self.model.problem.Variable( + name + "_" + obj_type, lb=lower_bound, ub=upper_bound, type=vartype + ) self.model.add_cons_vars(self.variables[obj_type][name]) return self.variables[obj_type][name] - - def build_constraint(self, obj_type, lower_bound, upper_bound, coef={}, cobra_obj=None): + + def build_constraint( + self, obj_type, lower_bound, upper_bound, coef={}, cobra_obj=None + ): name = None if self.constraint_types[obj_type] == "none": count = len(self.constraints[obj_type]) - name = str(count+1) + name = str(count + 1) elif self.constraint_types[obj_type] == "string": name = cobra_obj else: @@ -82,7 +102,7 @@ def build_constraint(self, obj_type, lower_bound, upper_bound, coef={}, cobra_ob if name in self.constraints[obj_type]: self.model.remove_cons_vars(self.constraints[obj_type][name]) self.constraints[obj_type][name] = self.model.problem.Constraint( - Zero,lb=lower_bound,ub=upper_bound,name=name+"_"+obj_type + Zero, lb=lower_bound, ub=upper_bound, name=name + "_" + obj_type ) self.model.add_cons_vars(self.constraints[obj_type][name]) self.model.solver.update() @@ -90,35 +110,35 @@ def build_constraint(self, obj_type, lower_bound, upper_bound, coef={}, cobra_ob self.constraints[obj_type][name].set_linear_coefficients(coef) self.model.solver.update() return self.constraints[obj_type][name] - - #Utility functions - def print_lp(self,filename = None): + + # Utility functions + def print_lp(self, filename=None): if filename is None: filename = self.lp_filename if filename is not None: - with open(filename+".lp", 'w') as out: - complete_line = '' + with open(filename + ".lp", "w") as out: + complete_line = "" for line in str(self.model.solver).splitlines(): - if ':' in line: - if complete_line != '': + if ":" in line: + if complete_line != "": out.write(complete_line) - complete_line = '' + complete_line = "" else: complete_line += line - + def all_variables(self): return self.pkgmgr.all_variables() - + def all_constraints(self): return self.pkgmgr.all_constraints() - - def add_variable_type(self,name,obj_type): + + def add_variable_type(self, name, obj_type): if name not in self.variables: self.variables[name] = dict() if name not in self.variable_types: self.variable_types[name] = obj_type - - def add_constraint_type(self,name,obj_type): + + def add_constraint_type(self, name, obj_type): if name not in self.constraints: self.constraints[name] = dict() if name not in self.constraint_types: diff --git a/modelseedpy/fbapkg/bilevelpkg.py b/modelseedpy/fbapkg/bilevelpkg.py index e1b03e4b..7592cdda 100644 --- a/modelseedpy/fbapkg/bilevelpkg.py +++ b/modelseedpy/fbapkg/bilevelpkg.py @@ -4,69 +4,93 @@ import re from optlang.symbolics import Zero, add # !!! Neither import is used -from cobra.core import Gene, Metabolite, Model, Reaction # !!! None of these imports are used +from cobra.core import ( + Gene, + Metabolite, + Model, + Reaction, +) # !!! None of these imports are used from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg -#Base class for FBA packages +# Base class for FBA packages class BilevelPkg(BaseFBAPkg): - def __init__(self,model): - BaseFBAPkg.__init__(self,model,"reaction use", - {"dualconst":"string","dualub":"string","duallb":"string"}, - {"dualvar":"string","objective":"string","dualbin":"string"}) - - def build_package(self, rxn_filter=None, binary_variable_count=0): # !!! the filter parameter is never used - self.validate_parameters({}, [], { - "binary_variable_count":binary_variable_count - }); - print("binary_variable_count:",binary_variable_count) + def __init__(self, model): + BaseFBAPkg.__init__( + self, + model, + "reaction use", + {"dualconst": "string", "dualub": "string", "duallb": "string"}, + {"dualvar": "string", "objective": "string", "dualbin": "string"}, + ) + + def build_package( + self, rxn_filter=None, binary_variable_count=0 + ): # !!! the filter parameter is never used + self.validate_parameters( + {}, [], {"binary_variable_count": binary_variable_count} + ) + print("binary_variable_count:", binary_variable_count) varhash, coefficients, obj_coef = {}, {}, {} objective = self.model.solver.objective - - #Creating new objective coefficient and bound variables + + # Creating new objective coefficient and bound variables if self.parameters["binary_variable_count"] > 0: - for reaction in self.model.reactions: - var = self.build_variable("flxcmp",reaction,None) - #Retrieving model data with componenent flux variables - #Using the JSON calls because get_linear_coefficients is REALLY slow #!!! get_linear_coefficients is still used? + for reaction in self.model.reactions: + var = self.build_variable("flxcmp", reaction, None) + # Retrieving model data with componenent flux variables + # Using the JSON calls because get_linear_coefficients is REALLY slow #!!! get_linear_coefficients is still used? mdldata = self.model.solver.to_json() consthash = {} for const in mdldata["constraints"]: consthash[const["name"]] = const variables = list(self.model.solver.variables) objterms = objective.get_linear_coefficients(variables) - - #Adding binary variables and constraints which should not be included in dual formulation + + # Adding binary variables and constraints which should not be included in dual formulation if self.parameters["binary_variable_count"] > 0: - for reaction in self.model.reactions: - self.build_variable("bflxcmp",reaction,None) - - #Now implementing dual variables and constraints + for reaction in self.model.reactions: + self.build_variable("bflxcmp", reaction, None) + + # Now implementing dual variables and constraints for var in variables: varhash[var.name] = var for const in list(self.model.solver.constraints): - var = self.build_variable("dualconst",const,obj_coef) - if all([var, const.name in consthash, "expression" in consthash[const.name], "args" in consthash[const.name]["expression"]]): + var = self.build_variable("dualconst", const, obj_coef) + if all( + [ + var, + const.name in consthash, + "expression" in consthash[const.name], + "args" in consthash[const.name]["expression"], + ] + ): for item in consthash[const.name]["expression"]["args"]: - if all(["args" in item, len(item["args"]) >= 2, item["args"][1]["name"] in varhash]): + if all( + [ + "args" in item, + len(item["args"]) >= 2, + item["args"][1]["name"] in varhash, + ] + ): var_name = varhash[item["args"][1]["name"]] if var_name not in coefficients: coefficients[var_name] = {} coefficients[var_name][var] = item["args"][0]["value"] for var in variables: if var.type == "continuous": - dvar = self.build_variable("duallb",var,obj_coef) + dvar = self.build_variable("duallb", var, obj_coef) if dvar != None: if var not in coefficients: coefficients[var] = {} coefficients[var][dvar] = 1 - dvar = self.build_variable("dualub",var,obj_coef) + dvar = self.build_variable("dualub", var, obj_coef) if dvar != None: if var not in coefficients: coefficients[var] = {} coefficients[var][dvar] = 1 - self.build_constraint("dualvar",var,objective,objterms,coefficients) - self.build_constraint("objective",None,objective,objterms,obj_coef) - + self.build_constraint("dualvar", var, objective, objterms, coefficients) + self.build_constraint("objective", None, objective, objterms, obj_coef) + def build_variable(self, obj_type, cobra_obj, obj_coef): if obj_type == "dualconst": lb = -1000000 @@ -78,65 +102,107 @@ def build_variable(self, obj_type, cobra_obj, obj_coef): if cobra_obj.ub == None: ub = 0 coef = cobra_obj.lb - var = BaseFBAPkg.build_variable(self,obj_type,lb,ub,"continuous",cobra_obj.name) + var = BaseFBAPkg.build_variable( + self, obj_type, lb, ub, "continuous", cobra_obj.name + ) obj_coef[var] = coef return var - if obj_type == "dualub":#constrain this variable to zero when the binary variable is zero - var = BaseFBAPkg.build_variable(self,obj_type,0,1000000,"continuous",cobra_obj.name) - if re.search('(.+)_(fflxcmp\d+)$', cobra_obj.name) is not None: - match = re.search('(.+)_(fflxcmp\d+)$', cobra_obj.name) + if ( + obj_type == "dualub" + ): # constrain this variable to zero when the binary variable is zero + var = BaseFBAPkg.build_variable( + self, obj_type, 0, 1000000, "continuous", cobra_obj.name + ) + if re.search("(.+)_(fflxcmp\d+)$", cobra_obj.name) is not None: + match = re.search("(.+)_(fflxcmp\d+)$", cobra_obj.name) bvar = self.variables[match[2]][match[1]] - BaseFBAPkg.build_constraint(self,"dualbin",None,0,{var:1,bvar:-1000000},cobra_obj.name) + BaseFBAPkg.build_constraint( + self, "dualbin", None, 0, {var: 1, bvar: -1000000}, cobra_obj.name + ) obj_coef[var] = cobra_obj.ub return var if obj_type == "duallb": - var = BaseFBAPkg.build_variable(self,obj_type,-1000000,0,"continuous",cobra_obj.name) - #if re.search('(.+)_(fflxcmp\d+)$', cobra_obj.name) is not None: - #m = re.search('(.+)_(fflxcmp\d+)$', metabolite.id) - #bvar = self.variables[m[2]][m[1]] - #BaseFBAPkg.build_constraint(self,cobra_obj.name+"_lbdualbin",None,0,{var:-1,bvar:-1000000},cobra_obj) + var = BaseFBAPkg.build_variable( + self, obj_type, -1000000, 0, "continuous", cobra_obj.name + ) + # if re.search('(.+)_(fflxcmp\d+)$', cobra_obj.name) is not None: + # m = re.search('(.+)_(fflxcmp\d+)$', metabolite.id) + # bvar = self.variables[m[2]][m[1]] + # BaseFBAPkg.build_constraint(self,cobra_obj.name+"_lbdualbin",None,0,{var:-1,bvar:-1000000},cobra_obj) obj_coef[var] = cobra_obj.lb return var if obj_type == "flxcmp" and self.parameters["binary_variable_count"] > 0: - denominator = 2**self.parameters["binary_variable_count"]-1 - coefs = [{},{}] - for i in range(0,self.parameters["binary_variable_count"]): + denominator = 2 ** self.parameters["binary_variable_count"] - 1 + coefs = [{}, {}] + for i in range(0, self.parameters["binary_variable_count"]): value = 2**i if cobra_obj.lower_bound < 0: - self.add_variable_type("rflxcmp"+str(i),"reaction") - var = BaseFBAPkg.build_variable(self,"rflxcmp"+str(i),0,-1*value*cobra_obj.lower_bound/denominator,"continuous",cobra_obj) + self.add_variable_type("rflxcmp" + str(i), "reaction") + var = BaseFBAPkg.build_variable( + self, + "rflxcmp" + str(i), + 0, + -1 * value * cobra_obj.lower_bound / denominator, + "continuous", + cobra_obj, + ) coefs[0][var] = -1 if cobra_obj.upper_bound > 0: - self.add_variable_type("fflxcmp"+str(i),"reaction") - var = BaseFBAPkg.build_variable(self,"fflxcmp"+str(i),0,value*cobra_obj.upper_bound/denominator,"continuous",cobra_obj) + self.add_variable_type("fflxcmp" + str(i), "reaction") + var = BaseFBAPkg.build_variable( + self, + "fflxcmp" + str(i), + 0, + value * cobra_obj.upper_bound / denominator, + "continuous", + cobra_obj, + ) coefs[1][var] = -1 if cobra_obj.lower_bound < 0: - #flux - flux_comp_0 - flux_comp_n = 0 - restriction of reverse fluxes by component fluxes - self.add_constraint_type("rflxcmpc","reaction") + # flux - flux_comp_0 - flux_comp_n = 0 - restriction of reverse fluxes by component fluxes + self.add_constraint_type("rflxcmpc", "reaction") coefs[0][cobra_obj.reverse_variable] = 1 - BaseFBAPkg.build_constraint(self,"rflxcmpc",0,0,coefs[0],cobra_obj) + BaseFBAPkg.build_constraint(self, "rflxcmpc", 0, 0, coefs[0], cobra_obj) if cobra_obj.upper_bound > 0: - #flux - flux_comp_0 - flux_comp_n = 0 - restriction of forward fluxes by component fluxes - self.add_constraint_type("fflxcmpc","reaction") + # flux - flux_comp_0 - flux_comp_n = 0 - restriction of forward fluxes by component fluxes + self.add_constraint_type("fflxcmpc", "reaction") coefs[1][cobra_obj.forward_variable] = 1 - BaseFBAPkg.build_constraint(self,"fflxcmpc",0,0,coefs[1],cobra_obj) + BaseFBAPkg.build_constraint(self, "fflxcmpc", 0, 0, coefs[1], cobra_obj) return None if obj_type == "bflxcmp" and self.parameters["binary_variable_count"] > 0: - for i in range(0,self.parameters["binary_variable_count"]): + for i in range(0, self.parameters["binary_variable_count"]): if cobra_obj.lower_bound < 0: - self.add_variable_type("brflxcmp"+str(i),"reaction") - var = BaseFBAPkg.build_variable(self,"brflxcmp"+str(i),0,1,"binary",cobra_obj) - othervar = self.variables["rflxcmp"+str(i)][cobra_obj.id] - self.add_constraint_type("brflxcmpc"+str(i),"reaction") - BaseFBAPkg.build_constraint(self,"brflxcmpc"+str(i),None,0,{othervar:1,var:-1000},cobra_obj) + self.add_variable_type("brflxcmp" + str(i), "reaction") + var = BaseFBAPkg.build_variable( + self, "brflxcmp" + str(i), 0, 1, "binary", cobra_obj + ) + othervar = self.variables["rflxcmp" + str(i)][cobra_obj.id] + self.add_constraint_type("brflxcmpc" + str(i), "reaction") + BaseFBAPkg.build_constraint( + self, + "brflxcmpc" + str(i), + None, + 0, + {othervar: 1, var: -1000}, + cobra_obj, + ) if cobra_obj.upper_bound > 0: - self.add_variable_type("bfflxcmp"+str(i),"reaction") - var = BaseFBAPkg.build_variable(self,"bfflxcmp"+str(i),0,1,"binary",cobra_obj) - othervar = self.variables["fflxcmp"+str(i)][cobra_obj.id] - self.add_constraint_type("bfflxcmpc"+str(i),"reaction") - BaseFBAPkg.build_constraint(self,"bfflxcmpc"+str(i),None,0,{othervar:1,var:-1000},cobra_obj) + self.add_variable_type("bfflxcmp" + str(i), "reaction") + var = BaseFBAPkg.build_variable( + self, "bfflxcmp" + str(i), 0, 1, "binary", cobra_obj + ) + othervar = self.variables["fflxcmp" + str(i)][cobra_obj.id] + self.add_constraint_type("bfflxcmpc" + str(i), "reaction") + BaseFBAPkg.build_constraint( + self, + "bfflxcmpc" + str(i), + None, + 0, + {othervar: 1, var: -1000}, + cobra_obj, + ) return None - + def build_constraint(self, obj_type, cobra_obj, objective, objterms, coefficients): if obj_type == "dualvar": coef = {} @@ -153,14 +219,18 @@ def build_constraint(self, obj_type, cobra_obj, objective, objterms, coefficient ub = None elif cobra_obj.ub == 0: lb = None - return BaseFBAPkg.build_constraint(self,obj_type,lb,ub,coef,cobra_obj.name) + return BaseFBAPkg.build_constraint( + self, obj_type, lb, ub, coef, cobra_obj.name + ) elif obj_type == "objective": coef = {} objsign = 1 if objective.direction == "min": objsign = -1 for var in objterms: - coef[var] = objsign*objterms[var] + coef[var] = objsign * objterms[var] for dvar in coefficients: - coef[dvar] = -1*coefficients[dvar] - return BaseFBAPkg.build_constraint(self,obj_type,0,0,coef,"dualobjconst") \ No newline at end of file + coef[dvar] = -1 * coefficients[dvar] + return BaseFBAPkg.build_constraint( + self, obj_type, 0, 0, coef, "dualobjconst" + ) diff --git a/modelseedpy/fbapkg/changeoptpkg.py b/modelseedpy/fbapkg/changeoptpkg.py index 82c5b7c0..d0f74ca7 100644 --- a/modelseedpy/fbapkg/changeoptpkg.py +++ b/modelseedpy/fbapkg/changeoptpkg.py @@ -6,54 +6,59 @@ from cobra.core import Gene, Metabolite, Model, Reaction from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg -#Base class for FBA packages +# Base class for FBA packages class ChangeOptPkg(BaseFBAPkg): - def __init__(self,model): - BaseFBAPkg.__init__(self,model,"change optimization",{"bgoal":"string"},{"bgoalc":"reaction"}) - - def build_package(self,target_values = {},build_objective = True): - self.validate_parameters({}, [], { - "target_values":target_values - }); - #Creating objective but won't set objective unless build_objective is true - goal_objective = self.model.problem.Objective(Zero,direction="max") + def __init__(self, model): + BaseFBAPkg.__init__( + self, + model, + "change optimization", + {"bgoal": "string"}, + {"bgoalc": "reaction"}, + ) + + def build_package(self, target_values={}, build_objective=True): + self.validate_parameters({}, [], {"target_values": target_values}) + # Creating objective but won't set objective unless build_objective is true + goal_objective = self.model.problem.Objective(Zero, direction="max") obj_coef = dict() for rxnid in target_values: print(rxnid) if rxnid in self.model.reactions: print("FOUND!") rxn = self.model.reactions.get_by_id(rxnid) - var = self.build_variable("bgoal",rxn) + var = self.build_variable("bgoal", rxn) obj_coef[var] = target_values[rxnid]["objcoef"] - const = self.build_constraint("bgoalc",rxn) - #Now setting the goal objective if build_objective is true + const = self.build_constraint("bgoalc", rxn) + # Now setting the goal objective if build_objective is true if build_objective: self.model.objective = goal_objective goal_objective.set_linear_coefficients(obj_coef) - - def build_variable(self,type,object): + + def build_variable(self, type, object): if type == "bgoal": goal = self.parameters["target_values"][object.id] - return BaseFBAPkg.build_variable(self,type,0,1,"binary",object.id+goal["direction"]) - - def build_constraint(self,type,object): + return BaseFBAPkg.build_variable( + self, type, 0, 1, "binary", object.id + goal["direction"] + ) + + def build_constraint(self, type, object): if type == "bgoalc": - #For lower: goal - vi + 1000 - 1000 gi >= 0 - #For higher: vi - goal + 1000 - 1000 gi >= 0 + # For lower: goal - vi + 1000 - 1000 gi >= 0 + # For higher: vi - goal + 1000 - 1000 gi >= 0 lb = -1000 goal = self.parameters["target_values"][object.id] - var = self.variables["bgoal"][object.id+goal["direction"]] + var = self.variables["bgoal"][object.id + goal["direction"]] fluxvar = None if goal["flux"] < 0: fluxvar = object.reverse_variable else: fluxvar = object.forward_variable - coef = {var:-1000} + coef = {var: -1000} if goal["direction"] == "low": coef[fluxvar] = -1 - lb += -1*abs(goal["flux"]) + lb += -1 * abs(goal["flux"]) else: coef[fluxvar] = 1 lb += abs(goal["flux"]) - return BaseFBAPkg.build_constraint(self,type,lb,None,coef,object) - \ No newline at end of file + return BaseFBAPkg.build_constraint(self, type, lb, None, coef, object) diff --git a/modelseedpy/fbapkg/drainfluxpkg.py b/modelseedpy/fbapkg/drainfluxpkg.py index fd6da44c..93043842 100644 --- a/modelseedpy/fbapkg/drainfluxpkg.py +++ b/modelseedpy/fbapkg/drainfluxpkg.py @@ -8,62 +8,97 @@ logger = logging.getLogger("modelseedpy") -#Base class for FBA packages +# Base class for FBA packages class DrainFluxPkg(BaseFBAPkg): - def __init__(self,model): - BaseFBAPkg.__init__(self,model,"drain flux",{},{"drain"}) + def __init__(self, model): + BaseFBAPkg.__init__(self, model, "drain flux", {}, {"drain"}) self.update_drain_fluxes(self) - - def build_package(self,parameters): - self.validate_parameters(parameters,[],{ - "add_all_intracellular_drains":False, - "default_uptake":0, - "default_excretion":100, - "drain_compounds":{}, - "set_minimal_drain_objective":False, - "update_drain_fluxes":False - }) + + def build_package(self, parameters): + self.validate_parameters( + parameters, + [], + { + "add_all_intracellular_drains": False, + "default_uptake": 0, + "default_excretion": 100, + "drain_compounds": {}, + "set_minimal_drain_objective": False, + "update_drain_fluxes": False, + }, + ) if self.parameters["update_drain_fluxes"]: self.update_drain_fluxes(self) if self.parameters["add_all_intracellular_drains"]: for cpd in self.model.metabolites: - self.add_drain_reaction(cpd,self.parameters["default_uptake"],self.parameters["default_excretion"]) + self.add_drain_reaction( + cpd, + self.parameters["default_uptake"], + self.parameters["default_excretion"], + ) else: for cpd in self.parameters["drain_compounds"]: if cpd in self.metabolites: cpdobj = self.metabolites.get_by_id(cpd) - self.add_drain_reaction(cpdobj,self.parameters["drain_compounds"][cpd]["uptake"],self.parameters["drain_compounds"][cpd]["excretion"]) + self.add_drain_reaction( + cpdobj, + self.parameters["drain_compounds"][cpd]["uptake"], + self.parameters["drain_compounds"][cpd]["excretion"], + ) - def add_drain_reaction(self,cpd,uptake,excretion): + def add_drain_reaction(self, cpd, uptake, excretion): namespace = "DN" if cpd.id.split("_")[-1][0:1] == "e" or cpd.compartment == "e": namespace = "EX" - if cpd.id not in self.new_reactions["Existing_"+namespace] and cpd.id not in self.new_reactions["New_"+namespace]: - rxn = FBAHelper.add_drain_from_metabolite_id(self.model, cpd.id,uptake,excretion) + if ( + cpd.id not in self.new_reactions["Existing_" + namespace] + and cpd.id not in self.new_reactions["New_" + namespace] + ): + rxn = FBAHelper.add_drain_from_metabolite_id( + self.model, cpd.id, uptake, excretion + ) if rxn.id in self.model.reactions: rxn = self.model.reactions.get_by_id(rxn.id) - self.new_reactions["New_"+namespace][cpd.id] = rxn - + self.new_reactions["New_" + namespace][cpd.id] = rxn + def update_drain_fluxes(self): previous_reactions = self.new_reactions - self.new_reactions = {"Existing_EX":{},"Existing_DN":{},"New_EX":{},"New_DN":{}} + self.new_reactions = { + "Existing_EX": {}, + "Existing_DN": {}, + "New_EX": {}, + "New_DN": {}, + } for rxn in self.reactions: if FBAHelper.is_ex(rxn) and len(rxn.metabolites) == 1: cpd = rxn.metabolites.keys()[0] - if cpd.id.split("_")[-1][0:1] == "e" or cpd.compartment == "e" or rxn.id[0:3] == "EX_": - if "Existing_EX" not in previous_reactions or cpd.id in previous_reactions["Existing_EX"]: + if ( + cpd.id.split("_")[-1][0:1] == "e" + or cpd.compartment == "e" + or rxn.id[0:3] == "EX_" + ): + if ( + "Existing_EX" not in previous_reactions + or cpd.id in previous_reactions["Existing_EX"] + ): self.new_reactions["Existing_EX"][cpd.id] = rxn else: self.new_reactions["New_EX"][cpd.id] = rxn else: - if "Existing_DN" not in previous_reactions or cpd.id in previous_reactions["Existing_DN"]: + if ( + "Existing_DN" not in previous_reactions + or cpd.id in previous_reactions["Existing_DN"] + ): self.new_reactions["Existing_DN"][cpd.id] = rxn else: self.new_reactions["New_DN"][cpd.id] = rxn - logger.info("Updated drain fluxes - Exist EX:"+ - ";".join(self.new_reactions["Existing_EX"].keys())+"|New EX:"+ - ";".join(self.new_reactions["New_EX"].keys())+"|Existing DN:"+ - ";".join(self.new_reactions["Existing_DN"].keys())+"|New DN:"+ - ";".join(self.new_reactions["New_DN"].keys())) - - \ No newline at end of file + logger.info( + "Updated drain fluxes - Exist EX:" + + ";".join(self.new_reactions["Existing_EX"].keys()) + + "|New EX:" + + ";".join(self.new_reactions["New_EX"].keys()) + + "|Existing DN:" + + ";".join(self.new_reactions["Existing_DN"].keys()) + + "|New DN:" + + ";".join(self.new_reactions["New_DN"].keys()) + ) diff --git a/modelseedpy/fbapkg/elementuptakepkg.py b/modelseedpy/fbapkg/elementuptakepkg.py index deed26de..66e01035 100644 --- a/modelseedpy/fbapkg/elementuptakepkg.py +++ b/modelseedpy/fbapkg/elementuptakepkg.py @@ -5,31 +5,39 @@ import logging from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg -#Base class for FBA packages +# Base class for FBA packages class ElementUptakePkg(BaseFBAPkg): - def __init__(self,model): - BaseFBAPkg.__init__(self,model,"element uptake",{"elements":"string"},{"elements":"string"}) - - def build_package(self,element_limits): + def __init__(self, model): + BaseFBAPkg.__init__( + self, + model, + "element uptake", + {"elements": "string"}, + {"elements": "string"}, + ) + + def build_package(self, element_limits): for element in element_limits: if element not in self.variables["elements"]: - self.build_variable(element,element_limits[element]) + self.build_variable(element, element_limits[element]) self.build_constraint(element) - - def build_variable(self,element,limit): - return BaseFBAPkg.build_variable(self,"elements",0,limit,"continuous",element) - - def build_constraint(self,element): - coef = {self.variables["elements"][element] : -1} + + def build_variable(self, element, limit): + return BaseFBAPkg.build_variable( + self, "elements", 0, limit, "continuous", element + ) + + def build_constraint(self, element): + coef = {self.variables["elements"][element]: -1} for reaction in self.model.reactions: if reaction.id[0:3] == "EX_": total = 0 for metabolite in reaction.metabolites: elements = metabolite.elements if element in elements: - total += elements[element]*reaction.metabolites[metabolite] + total += elements[element] * reaction.metabolites[metabolite] if total < 0: - coef[reaction.reverse_variable] = -1*total + coef[reaction.reverse_variable] = -1 * total elif total > 0: coef[reaction.forward_variable] = total - return BaseFBAPkg.build_constraint(self,"elements",0,0,coef,element) \ No newline at end of file + return BaseFBAPkg.build_constraint(self, "elements", 0, 0, coef, element) diff --git a/modelseedpy/fbapkg/flexiblebiomasspkg.py b/modelseedpy/fbapkg/flexiblebiomasspkg.py index 06c731cd..bbef278d 100644 --- a/modelseedpy/fbapkg/flexiblebiomasspkg.py +++ b/modelseedpy/fbapkg/flexiblebiomasspkg.py @@ -3,6 +3,7 @@ from __future__ import absolute_import import logging + logger = logging.getLogger(__name__) from optlang.symbolics import Zero, add # !!! Neither import is ever used from cobra import Model, Reaction, Metabolite # !!! Model and Metabolite are never used @@ -11,27 +12,63 @@ from modelseedpy.core.fbahelper import FBAHelper classes = { - "rna":{"cpd00052":-1,"cpd00038":-1,"cpd00002":-1,"cpd00062":-1}, - "dna":{"cpd00115":-1,"cpd00356":-1,"cpd00241":-1,"cpd00357":-1}, - "protein":{"cpd00132":-1, "cpd00023":-1, "cpd00053":-1, "cpd00054":-1, "cpd00033":-1, "cpd00039":-1, "cpd00119":-1, "cpd00051":-1, "cpd00041":-1, "cpd00107":-1, "cpd00129":-1, "cpd00322":-1, "cpd00069":-1, "cpd00065":-1, "cpd00060":-1, "cpd00084":-1, "cpd00035":-1, "cpd00161":-1, "cpd00156":-1, "cpd00066":-1}, - "energy":{"cpd00008":1} + "rna": {"cpd00052": -1, "cpd00038": -1, "cpd00002": -1, "cpd00062": -1}, + "dna": {"cpd00115": -1, "cpd00356": -1, "cpd00241": -1, "cpd00357": -1}, + "protein": { + "cpd00132": -1, + "cpd00023": -1, + "cpd00053": -1, + "cpd00054": -1, + "cpd00033": -1, + "cpd00039": -1, + "cpd00119": -1, + "cpd00051": -1, + "cpd00041": -1, + "cpd00107": -1, + "cpd00129": -1, + "cpd00322": -1, + "cpd00069": -1, + "cpd00065": -1, + "cpd00060": -1, + "cpd00084": -1, + "cpd00035": -1, + "cpd00161": -1, + "cpd00156": -1, + "cpd00066": -1, + }, + "energy": {"cpd00008": 1}, } -#Base class for FBA packages +# Base class for FBA packages class FlexibleBiomassPkg(BaseFBAPkg): - def __init__(self,model): - BaseFBAPkg.__init__(self,model,"flexible biomass",{},{ - "flxbio":"reaction", "fflxcpd":"metabolite", "rflxcpd":"metabolite", "fflxcls":"reaction", "rflxcls":"reaction"}) - - def build_package(self,parameters): - self.validate_parameters(parameters,["bio_rxn_id"],{ - "flex_coefficient":[-0.75,0.75], - "use_rna_class":[-0.75,0.75], - "use_dna_class":[-0.75,0.75], - "use_protein_class":[-0.75,0.75], - "use_energy_class":[-0.1,0.1], - "add_total_biomass_constraint":True - }) + def __init__(self, model): + BaseFBAPkg.__init__( + self, + model, + "flexible biomass", + {}, + { + "flxbio": "reaction", + "fflxcpd": "metabolite", + "rflxcpd": "metabolite", + "fflxcls": "reaction", + "rflxcls": "reaction", + }, + ) + + def build_package(self, parameters): + self.validate_parameters( + parameters, + ["bio_rxn_id"], + { + "flex_coefficient": [-0.75, 0.75], + "use_rna_class": [-0.75, 0.75], + "use_dna_class": [-0.75, 0.75], + "use_protein_class": [-0.75, 0.75], + "use_energy_class": [-0.1, 0.1], + "add_total_biomass_constraint": True, + }, + ) if self.parameters["bio_rxn_id"] not in self.model.reactions: raise ValueError(self.parameters["bio_rxn_id"] + " not found in model!") self.parameters["bio_rxn"] = self.model.reactions.get_by_id( @@ -46,13 +83,13 @@ def build_package(self,parameters): "cpd00067": None, "cpd00002": None, } - #Finding all reference compounds in the model + # Finding all reference compounds in the model msid_hash = self.modelutl.msid_hash() for msid in refcpd: if msid in msid_hash: refcpd[msid] = msid_hash[msid][0] met_class = {} - #Determining class for each metabolite in biomass reaction + # Determining class for each metabolite in biomass reaction for metabolite in self.parameters["bio_rxn"].metabolites: met_class[metabolite] = None msid = MSModelUtil.metabolite_msid(metabolite) @@ -61,31 +98,43 @@ def build_package(self,parameters): met_class[metabolite] = "refcpd" else: for curr_class in classes: - if self.parameters["use_"+curr_class+"_class"] and msid in classes[curr_class]: + if ( + self.parameters["use_" + curr_class + "_class"] + and msid in classes[curr_class] + ): met_class[metabolite] = curr_class class_coef[curr_class][msid] = metabolite - #Eliminating any classes that are incomplete + # Eliminating any classes that are incomplete for curr_class in classes: for msid in classes[curr_class]: if msid not in class_coef[curr_class]: - self.parameters["use_"+curr_class+"_class"] = None + self.parameters["use_" + curr_class + "_class"] = None break - #Creating FLEX reactions and constraints for unclassified compounds + # Creating FLEX reactions and constraints for unclassified compounds flexcpds = [] for metabolite in self.parameters["bio_rxn"].metabolites: if not met_class[metabolite]: flexcpds.append(metabolite) - elif met_class[metabolite] != "refcpd" and not self.parameters["use_"+met_class[metabolite]+"_class"]: - flexcpds.append(metabolite) - self.modelutl.add_exchanges_for_metabolites(flexcpds,uptake=1000,excretion=1000,prefix='FLEX_', prefix_name='Biomass flex for ') + elif ( + met_class[metabolite] != "refcpd" + and not self.parameters["use_" + met_class[metabolite] + "_class"] + ): + flexcpds.append(metabolite) + self.modelutl.add_exchanges_for_metabolites( + flexcpds, + uptake=1000, + excretion=1000, + prefix="FLEX_", + prefix_name="Biomass flex for ", + ) for metabolite in flexcpds: self.build_constraint(metabolite, "flxcpd") - #Creating metabolite class constraints + # Creating metabolite class constraints for met_class in classes: - if self.parameters["use_"+met_class+"_class"]: + if self.parameters["use_" + met_class + "_class"]: add = 0 total_coef = 0 - object_stoichiometry = {} + object_stoichiometry = {} for msid in class_coef[met_class]: if ( met_class == "rna" @@ -101,9 +150,11 @@ def build_package(self,parameters): ] ) else: - object_stoichiometry[class_coef[met_class][msid]] = self.parameters[ - "bio_rxn" - ].metabolites[class_coef[met_class][msid]] + object_stoichiometry[ + class_coef[met_class][msid] + ] = self.parameters["bio_rxn"].metabolites[ + class_coef[met_class][msid] + ] total_coef += abs(object_stoichiometry[class_coef[met_class][msid]]) if ( (met_class == "rna" or met_class == "dna") @@ -142,104 +193,157 @@ def build_package(self,parameters): self.new_reactions[met_class + "_flex"].annotation[ "sbo" ] = "SBO:0000627" - self.model.add_reactions([self.new_reactions[met_class + "_flex"]]) - self.build_constraint(self.new_reactions[met_class + "_flex"], "flxcls") + self.model.add_reactions( + [self.new_reactions[met_class + "_flex"]] + ) + self.build_constraint( + self.new_reactions[met_class + "_flex"], "flxcls" + ) if parameters["add_total_biomass_constraint"]: - self.build_constraint(self.parameters["bio_rxn"],"flxbio") - - def build_variable(self,object,type): # !!! can the function be removed? + self.build_constraint(self.parameters["bio_rxn"], "flxbio") + + def build_variable(self, object, type): # !!! can the function be removed? pass - - def build_constraint(self,cobra_obj,obj_type): + + def build_constraint(self, cobra_obj, obj_type): element_mass = FBAHelper.elemental_mass() # !!! element_mass is never used if obj_type == "flxbio": - #Sum(MW*(vdrn,for-vdrn,ref)) + Sum(massdiff*(vrxn,for-vrxn,ref)) = 0 + # Sum(MW*(vdrn,for-vdrn,ref)) + Sum(massdiff*(vrxn,for-vrxn,ref)) = 0 coef = {} for metabolite in self.parameters["bio_rxn"].metabolites: - if "FLEX_"+metabolite.id in self.model.reactions: + if "FLEX_" + metabolite.id in self.model.reactions: mw = FBAHelper.metabolite_mw(metabolite) sign = -1 if self.parameters["bio_rxn"].metabolites[metabolite] > 0: sign = 1 - coef[self.model.reactions.get_by_id("FLEX_"+metabolite.id).forward_variable] = sign*mw - coef[self.model.reactions.get_by_id("FLEX_"+metabolite.id).reverse_variable] = -sign*mw + coef[ + self.model.reactions.get_by_id( + "FLEX_" + metabolite.id + ).forward_variable + ] = (sign * mw) + coef[ + self.model.reactions.get_by_id( + "FLEX_" + metabolite.id + ).reverse_variable + ] = (-sign * mw) for met_class in classes: - if met_class+"_flex" in self.model.reactions: + if met_class + "_flex" in self.model.reactions: massdiff = 0 - rxn = self.model.reactions.get_by_id(met_class+"_flex") + rxn = self.model.reactions.get_by_id(met_class + "_flex") for met in rxn.metabolites: mw = FBAHelper.metabolite_mw(met) - massdiff += rxn.metabolites[met]*mw + massdiff += rxn.metabolites[met] * mw if abs(massdiff) > 0.00001: coef[rxn.forward_variable] = massdiff coef[rxn.reverse_variable] = -massdiff - return BaseFBAPkg.build_constraint(self,obj_type,0,0,coef,cobra_obj) + return BaseFBAPkg.build_constraint(self, obj_type, 0, 0, coef, cobra_obj) elif obj_type == "flxcpd" or obj_type == "flxcls": biovar = self.parameters["bio_rxn"].forward_variable object = cobra_obj const = None if obj_type == "flxcpd": - #0.75 * abs(bio_coef) * vbio - vdrn,for >= 0 - #0.75 * abs(bio_coef) * vbio - vdrn,rev >= 0 - first_entry = self.parameters["flex_coefficient"][0]*abs(self.parameters["bio_rxn"].metabolites[cobra_obj]) - second_entry = self.parameters["flex_coefficient"][1]*abs(self.parameters["bio_rxn"].metabolites[cobra_obj]) - object = self.model.reactions.get_by_id("FLEX_"+cobra_obj.id) - elif cobra_obj.id[0:-5] == None or not self.parameters["use_"+cobra_obj.id[0:-5]+"_class"]: + # 0.75 * abs(bio_coef) * vbio - vdrn,for >= 0 + # 0.75 * abs(bio_coef) * vbio - vdrn,rev >= 0 + first_entry = self.parameters["flex_coefficient"][0] * abs( + self.parameters["bio_rxn"].metabolites[cobra_obj] + ) + second_entry = self.parameters["flex_coefficient"][1] * abs( + self.parameters["bio_rxn"].metabolites[cobra_obj] + ) + object = self.model.reactions.get_by_id("FLEX_" + cobra_obj.id) + elif ( + cobra_obj.id[0:-5] == None + or not self.parameters["use_" + cobra_obj.id[0:-5] + "_class"] + ): return None else: - #0.75 * vbio - vrxn,for >= 0 - #0.75 * vbio - vrxn,rev >= 0 - first_entry = self.parameters["use_"+cobra_obj.id[0:-5]+"_class"][0] - second_entry = self.parameters["use_"+cobra_obj.id[0:-5]+"_class"][1] + # 0.75 * vbio - vrxn,for >= 0 + # 0.75 * vbio - vrxn,rev >= 0 + first_entry = self.parameters["use_" + cobra_obj.id[0:-5] + "_class"][0] + second_entry = self.parameters["use_" + cobra_obj.id[0:-5] + "_class"][ + 1 + ] if first_entry == second_entry: - #If the value is positive, lock in the forward variable and set the reverse to zero + # If the value is positive, lock in the forward variable and set the reverse to zero if first_entry > 0: - const = BaseFBAPkg.build_constraint(self,"f"+obj_type,0,0,{ - biovar:second_entry, - object.forward_variable:-1 - },cobra_obj) + const = BaseFBAPkg.build_constraint( + self, + "f" + obj_type, + 0, + 0, + {biovar: second_entry, object.forward_variable: -1}, + cobra_obj, + ) object.lower_bound = 0 - #If the value is negative, lock in the reverse variable and set the forward to zero + # If the value is negative, lock in the reverse variable and set the forward to zero elif first_entry < 0: - const = BaseFBAPkg.build_constraint(self,"r"+obj_type,0,0,{ - biovar:-first_entry, - object.reverse_variable:-1 - },cobra_obj) - object.upper_bound = 0 - #If the value is zero, lock both variables to zero + const = BaseFBAPkg.build_constraint( + self, + "r" + obj_type, + 0, + 0, + {biovar: -first_entry, object.reverse_variable: -1}, + cobra_obj, + ) + object.upper_bound = 0 + # If the value is zero, lock both variables to zero if first_entry == 0: object.lower_bound = 0 object.upper_bound = 0 elif second_entry >= 0: - if first_entry >= 0: - const = BaseFBAPkg.build_constraint(self,"f"+obj_type,0,None,{ - biovar:second_entry, - object.forward_variable:-1 - },cobra_obj) + if first_entry >= 0: + const = BaseFBAPkg.build_constraint( + self, + "f" + obj_type, + 0, + None, + {biovar: second_entry, object.forward_variable: -1}, + cobra_obj, + ) object.lower_bound = 0 if first_entry > 0: - BaseFBAPkg.build_constraint(self,"r"+obj_type,0,None,{ - biovar:-first_entry, - object.forward_variable:1 - },cobra_obj) + BaseFBAPkg.build_constraint( + self, + "r" + obj_type, + 0, + None, + {biovar: -first_entry, object.forward_variable: 1}, + cobra_obj, + ) else: - const = BaseFBAPkg.build_constraint(self,"f"+obj_type,0,None,{ - biovar:second_entry, - object.forward_variable:-1 - },cobra_obj) - BaseFBAPkg.build_constraint(self,"r"+obj_type,0,None,{ - biovar:-first_entry, - object.reverse_variable:-1 - },cobra_obj) + const = BaseFBAPkg.build_constraint( + self, + "f" + obj_type, + 0, + None, + {biovar: second_entry, object.forward_variable: -1}, + cobra_obj, + ) + BaseFBAPkg.build_constraint( + self, + "r" + obj_type, + 0, + None, + {biovar: -first_entry, object.reverse_variable: -1}, + cobra_obj, + ) else: if second_entry < 0: - const = BaseFBAPkg.build_constraint(self,"f"+obj_type,0,None,{ - biovar:second_entry, - object.reverse_variable:1 - },cobra_obj) - BaseFBAPkg.build_constraint(self,"r"+obj_type,0,None,{ - biovar:-first_entry, - object.reverse_variable:-1 - },cobra_obj) + const = BaseFBAPkg.build_constraint( + self, + "f" + obj_type, + 0, + None, + {biovar: second_entry, object.reverse_variable: 1}, + cobra_obj, + ) + BaseFBAPkg.build_constraint( + self, + "r" + obj_type, + 0, + None, + {biovar: -first_entry, object.reverse_variable: -1}, + cobra_obj, + ) object.upper_bound = 0 return const diff --git a/modelseedpy/fbapkg/fluxfittingpkg.py b/modelseedpy/fbapkg/fluxfittingpkg.py index 8250e8b1..e3e832dc 100644 --- a/modelseedpy/fbapkg/fluxfittingpkg.py +++ b/modelseedpy/fbapkg/fluxfittingpkg.py @@ -3,55 +3,76 @@ from __future__ import absolute_import import logging + logger = logging.getLogger(__name__) from optlang.symbolics import Zero, add # !!! Zero is never used from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg -#Base class for FBA packages +# Base class for FBA packages class FluxFittingPkg(BaseFBAPkg): - def __init__(self,model): - BaseFBAPkg.__init__(self,model,"flux fitting",{"vfit":"reaction"},{"vfitc":"reaction"}) - - def build_package(self,parameters): - self.validate_parameters(parameters,[],{ - "target_flux":{}, - "totalflux":0, - "set_objective":1, - "default_rescaling":0.1, - "rescale_vfit_by_flux":True - }) + def __init__(self, model): + BaseFBAPkg.__init__( + self, model, "flux fitting", {"vfit": "reaction"}, {"vfitc": "reaction"} + ) + + def build_package(self, parameters): + self.validate_parameters( + parameters, + [], + { + "target_flux": {}, + "totalflux": 0, + "set_objective": 1, + "default_rescaling": 0.1, + "rescale_vfit_by_flux": True, + }, + ) if self.parameters["totalflux"] == 0: - self.pkgmgr.getpkg("RevBinPkg",1).build_package(self.parameters["target_flux"]) + self.pkgmgr.getpkg("RevBinPkg", 1).build_package( + self.parameters["target_flux"] + ) else: - self.pkgmgr.getpkg("TotalFluxPkg",1).build_package(self.parameters["target_flux"]) + self.pkgmgr.getpkg("TotalFluxPkg", 1).build_package( + self.parameters["target_flux"] + ) objvars = [] for rxnid in self.parameters["target_flux"]: if rxnid in self.model.reactions: rxnobj = self.model.reactions.get_by_id(rxnid) - var = self.build_variable(self,"vfit",-1000,1000,"continuous",rxnobj) + var = self.build_variable( + self, "vfit", -1000, 1000, "continuous", rxnobj + ) objvars.append(var**2) self.build_constraint(rxnobj) if self.parameters["set_objective"] == 1: - self.model.objective = self.model.problem.Objective(add(objvars), direction="min", sloppy=True) - - def build_variable(self,object): - return BaseFBAPkg.build_variable(self,"vfit",-1000,1000,"continuous",object) + self.model.objective = self.model.problem.Objective( + add(objvars), direction="min", sloppy=True + ) + + def build_variable(self, object): + return BaseFBAPkg.build_variable( + self, "vfit", -1000, 1000, "continuous", object + ) - def build_constraint(self,cobra_obj): - #vfit(i) = flux(i) - v(i) + def build_constraint(self, cobra_obj): + # vfit(i) = flux(i) - v(i) if cobra_obj.id in self.parameters["target_flux"]: flux = self.parameters["target_flux"][cobra_obj.id] vfitcoef = 1 - #if self.parameters["rescale_vfit_by_flux"] == True: + # if self.parameters["rescale_vfit_by_flux"] == True: # if flux != None and abs(flux) > 0: # vfitcoef = vfitcoef*flux#Multiply coef by fit flux which rescales by flux # else: # vfitcoef = vfitcoef*self.parameters["default_rescaling"]#Multiply coef by fit flux which rescales by flux - coef = {self.variables["vfit"][cobra_obj.id] : vfitcoef} + coef = {self.variables["vfit"][cobra_obj.id]: vfitcoef} if self.parameters["totalflux"] == 0: coef[cobra_obj.forward_variable] = 1 coef[cobra_obj.reverse_variable] = -1 else: - coef[self.pkgmgr.getpkg("TotalFluxPkg").variables["tf"][cobra_obj.id]] = 1 # !!! the total flux package does not return anything + coef[ + self.pkgmgr.getpkg("TotalFluxPkg").variables["tf"][cobra_obj.id] + ] = 1 # !!! the total flux package does not return anything flux = abs(flux) - return BaseFBAPkg.build_constraint(self,"vfitc",flux,flux,coef,cobra_obj) + return BaseFBAPkg.build_constraint( + self, "vfitc", flux, flux, coef, cobra_obj + ) diff --git a/modelseedpy/fbapkg/fullthermopkg.py b/modelseedpy/fbapkg/fullthermopkg.py index 7197f698..9a20018e 100644 --- a/modelseedpy/fbapkg/fullthermopkg.py +++ b/modelseedpy/fbapkg/fullthermopkg.py @@ -8,76 +8,128 @@ from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg from modelseedpy.core.fbahelper import FBAHelper -#Base class for FBA packages +# Base class for FBA packages class FullThermoPkg(BaseFBAPkg): @staticmethod def default_concentration(): return { - "cpd00067_c0":[0.0000001,0.0000001],#M H+ - equivalent to pHint = 7 - "cpd00007_c0":[1E-07,8.2E-06],#M O2 instracellular - "cpd00011_c0":[1E-08,0.0014],#M CO2 instracellular - "cpd00067_e0":[3.16228E-07,3.16228E-07],#M H+ - equivalent to pHext = 6.5 - "cpd00009_e0":[0.056,0.056],#Extracellular phosphate - overridden by media when media concentration is given - "cpd00048_e0":[0.0030,0.0030],#Extracellular sulfate - overridden by media when media concentration is given - "cpd00013_e0":[0.019,0.019],#Extracellular ammonia - overridden by media when media concentration is given - "cpd00971_e0":[0.16,0.16],#Extracellular sodium - overridden by media when media concentration is given - "cpd00205_e0":[0.022,0.022],#Extracellular potassium - overridden by media when media concentration is given - "cpd10515_e0":[0.062,0.062],#Extracellular Fe2+ - overridden by media when media concentration is given - "cpd00011_e0":[0.00010,0.00010],#Extracellular CO2 - overridden by media when media concentration is given - "cpd00007_e0":[8.2E-06,8.2E-06],#Extracellular O2 - overridden by media when media concentration is given - "cpd00027_e0":[0.020,0.020]#Extracellular glucose - overridden by media when media concentration is given + "cpd00067_c0": [0.0000001, 0.0000001], # M H+ - equivalent to pHint = 7 + "cpd00007_c0": [1e-07, 8.2e-06], # M O2 instracellular + "cpd00011_c0": [1e-08, 0.0014], # M CO2 instracellular + "cpd00067_e0": [ + 3.16228e-07, + 3.16228e-07, + ], # M H+ - equivalent to pHext = 6.5 + "cpd00009_e0": [ + 0.056, + 0.056, + ], # Extracellular phosphate - overridden by media when media concentration is given + "cpd00048_e0": [ + 0.0030, + 0.0030, + ], # Extracellular sulfate - overridden by media when media concentration is given + "cpd00013_e0": [ + 0.019, + 0.019, + ], # Extracellular ammonia - overridden by media when media concentration is given + "cpd00971_e0": [ + 0.16, + 0.16, + ], # Extracellular sodium - overridden by media when media concentration is given + "cpd00205_e0": [ + 0.022, + 0.022, + ], # Extracellular potassium - overridden by media when media concentration is given + "cpd10515_e0": [ + 0.062, + 0.062, + ], # Extracellular Fe2+ - overridden by media when media concentration is given + "cpd00011_e0": [ + 0.00010, + 0.00010, + ], # Extracellular CO2 - overridden by media when media concentration is given + "cpd00007_e0": [ + 8.2e-06, + 8.2e-06, + ], # Extracellular O2 - overridden by media when media concentration is given + "cpd00027_e0": [ + 0.020, + 0.020, + ], # Extracellular glucose - overridden by media when media concentration is given } @staticmethod def default_deltaG_error(): - return { - "cpd00067":0#KJ/mol - H delta G is based on pH and so has no error - } - - @staticmethod + return {"cpd00067": 0} # KJ/mol - H delta G is based on pH and so has no error + + @staticmethod def default_compartment_potential(): return { - "e0":0,#Extracellular MUST be the zero reference for compartment electrochemical potential (so community modeling works) - "c0":-160#mV = 0.33 (pHint - pHext) - 143.33 where pHint = 7 and pHext = 6.5 + "e0": 0, # Extracellular MUST be the zero reference for compartment electrochemical potential (so community modeling works) + "c0": -160, # mV = 0.33 (pHint - pHext) - 143.33 where pHint = 7 and pHext = 6.5 } - - def __init__(self,model): - BaseFBAPkg.__init__(self,model,"full thermo",{"logconc":"metabolite","dgerr":"metabolite"},{"potc":"metabolite"}) + + def __init__(self, model): + BaseFBAPkg.__init__( + self, + model, + "full thermo", + {"logconc": "metabolite", "dgerr": "metabolite"}, + {"potc": "metabolite"}, + ) self.pkgmgr.addpkgs(["SimpleThermoPkg"]) - def build_package(self,parameters, verbose = True): - self.validate_parameters(parameters,["modelseed_path"],{ - "default_max_conc":0.02,#M - "default_min_conc":0.000001,#M - "default_max_error":5,#KJ/mol - "custom_concentrations":{}, - "custom_deltaG_error":{}, - "compartment_potential":{}, - "temperature":298,#K - "filter":None, - "infeasible_model": False, - 'dgbin':False - }) - self.parameters["modelseed_api"] = FBAHelper.get_modelseed_db_api(self.parameters["modelseed_path"]) + def build_package(self, parameters, verbose=True): + self.validate_parameters( + parameters, + ["modelseed_path"], + { + "default_max_conc": 0.02, # M + "default_min_conc": 0.000001, # M + "default_max_error": 5, # KJ/mol + "custom_concentrations": {}, + "custom_deltaG_error": {}, + "compartment_potential": {}, + "temperature": 298, # K + "filter": None, + "infeasible_model": False, + "dgbin": False, + }, + ) + self.parameters["modelseed_api"] = FBAHelper.get_modelseed_db_api( + self.parameters["modelseed_path"] + ) simple_thermo_parameters = { - "filter":self.parameters["filter"], - "min_potential":-100000,#KJ/mol - "max_potential":100000,#KJ/mol - 'dgbin':self.parameters['dgbin'] - } - if self.parameters['infeasible_model']: - simple_thermo_parameters['dgbin'] = True + "filter": self.parameters["filter"], + "min_potential": -100000, # KJ/mol + "max_potential": 100000, # KJ/mol + "dgbin": self.parameters["dgbin"], + } + if self.parameters["infeasible_model"]: + simple_thermo_parameters["dgbin"] = True self.pkgmgr.getpkg("SimpleThermoPkg").build_package(simple_thermo_parameters) - - self.parameters["combined_custom_concentrations"] = FullThermoPkg.default_concentration() + + self.parameters[ + "combined_custom_concentrations" + ] = FullThermoPkg.default_concentration() for cpd in self.parameters["custom_concentrations"]: - self.parameters["combined_custom_concentrations"][cpd] = self.parameters["custom_concentrations"][cpd] - self.parameters["combined_custom_deltaG_error"] = FullThermoPkg.default_deltaG_error() + self.parameters["combined_custom_concentrations"][cpd] = self.parameters[ + "custom_concentrations" + ][cpd] + self.parameters[ + "combined_custom_deltaG_error" + ] = FullThermoPkg.default_deltaG_error() for cpd in self.parameters["custom_deltaG_error"]: - self.parameters["combined_custom_deltaG_error"][cpd] = self.parameters["custom_deltaG_error"][cpd] - self.parameters["combined_custom_comp_pot"] = FullThermoPkg.default_compartment_potential() + self.parameters["combined_custom_deltaG_error"][cpd] = self.parameters[ + "custom_deltaG_error" + ][cpd] + self.parameters[ + "combined_custom_comp_pot" + ] = FullThermoPkg.default_compartment_potential() for cmp in self.parameters["compartment_potential"]: - self.parameters["combined_custom_comp_pot"][cmp] = self.parameters["compartment_potential"][cmp] + self.parameters["combined_custom_comp_pot"][cmp] = self.parameters[ + "compartment_potential" + ][cmp] msid_hash = {} for metabolite in self.model.metabolites: msid = FBAHelper.modelseed_id_from_cobra_metabolite(metabolite) @@ -85,55 +137,83 @@ def build_package(self,parameters, verbose = True): if msid not in msid_hash: msid_hash[msid] = {} msid_hash[msid][metabolite.id] = metabolite - #Build concentration variable - self.build_variable(metabolite,"logconc") - #Build error variable - self.build_variable(metabolite,"dgerr") - #Build the potential constraint + # Build concentration variable + self.build_variable(metabolite, "logconc") + # Build error variable + self.build_variable(metabolite, "dgerr") + # Build the potential constraint self.build_constraint(metabolite, verbose) - def build_variable(self,object,type): + def build_variable(self, object, type): msid = FBAHelper.modelseed_id_from_cobra_metabolite(object) - if type == "logconc" and msid != "cpd00001":#Do not make a concentration variable for water + if ( + type == "logconc" and msid != "cpd00001" + ): # Do not make a concentration variable for water lb = ln(self.parameters["default_min_conc"]) ub = ln(self.parameters["default_max_conc"]) if object.id in self.parameters["combined_custom_concentrations"]: lb = ln(self.parameters["combined_custom_concentrations"][object.id][0]) ub = ln(self.parameters["combined_custom_concentrations"][object.id][1]) - return BaseFBAPkg.build_variable(self,"logconc",lb,ub,"continuous",object) + return BaseFBAPkg.build_variable( + self, "logconc", lb, ub, "continuous", object + ) elif type == "dgerr": ub = self.parameters["default_max_error"] if object.id in self.parameters["combined_custom_deltaG_error"]: ub = self.parameters["combined_custom_deltaG_error"][object.id] - return BaseFBAPkg.build_variable(self,"dgerr",-1*ub,ub,"continuous",object) - - def build_constraint(self,object, verbose): - #potential(i) (KJ/mol) = deltaG(i) (KJ/mol) + R * T(K) * lnconc(i) + charge(i) * compartment_potential - if object.id not in self.pkgmgr.getpkg("SimpleThermoPkg").variables["potential"]: + return BaseFBAPkg.build_variable( + self, "dgerr", -1 * ub, ub, "continuous", object + ) + + def build_constraint(self, object, verbose): + # potential(i) (KJ/mol) = deltaG(i) (KJ/mol) + R * T(K) * lnconc(i) + charge(i) * compartment_potential + if ( + object.id + not in self.pkgmgr.getpkg("SimpleThermoPkg").variables["potential"] + ): return None msid = FBAHelper.modelseed_id_from_cobra_metabolite(object) if msid == None: if verbose: - print(object.id+" has no modelseed ID!") + print(object.id + " has no modelseed ID!") return None mscpd = self.parameters["modelseed_api"].get_seed_compound(msid) if mscpd is None: if verbose: - print(object.id+" has modelseed ID "+msid+" but cannot be found in ModelSEED DB!") + print( + object.id + + " has modelseed ID " + + msid + + " but cannot be found in ModelSEED DB!" + ) return None if mscpd.deltag == 10000000: if verbose: - print(object.id+" has modelseed ID "+msid+" but does not have a valid deltaG!") + print( + object.id + + " has modelseed ID " + + msid + + " but does not have a valid deltaG!" + ) return None - Faraday = physical_constants['Faraday constant'][0]#C/mol + Faraday = physical_constants["Faraday constant"][0] # C/mol compartment_potential = 0 if object.compartment in self.parameters["combined_custom_comp_pot"]: - compartment_potential = self.parameters["combined_custom_comp_pot"][object.compartment] - constant = mscpd.deltag/calorie + object.charge*Faraday*compartment_potential/kilo/kilo + compartment_potential = self.parameters["combined_custom_comp_pot"][ + object.compartment + ] + constant = ( + mscpd.deltag / calorie + + object.charge * Faraday * compartment_potential / kilo / kilo + ) coef = { - self.pkgmgr.getpkg("SimpleThermoPkg").variables["potential"][object.id]:1, - self.variables["dgerr"][object.id]:-1 + self.pkgmgr.getpkg("SimpleThermoPkg").variables["potential"][object.id]: 1, + self.variables["dgerr"][object.id]: -1, } - if msid != "cpd00001":#Water concentration should not contribute to potential - coef[self.variables["logconc"][object.id]] = -1*R/kilo*self.parameters["temperature"] - return BaseFBAPkg.build_constraint(self,"potc",constant,constant,coef,object) \ No newline at end of file + if msid != "cpd00001": # Water concentration should not contribute to potential + coef[self.variables["logconc"][object.id]] = ( + -1 * R / kilo * self.parameters["temperature"] + ) + return BaseFBAPkg.build_constraint( + self, "potc", constant, constant, coef, object + ) diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index 2c0a4c56..6f2ff387 100755 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -12,61 +12,350 @@ logger = logging.getLogger(__name__) -default_blacklist = ["rxn12985", "rxn00238", "rxn07058", "rxn05305", "rxn09037", "rxn10643", - "rxn11317", "rxn05254", "rxn05257", "rxn05258", "rxn05259", "rxn05264", "rxn05268", - "rxn05269", "rxn05270", "rxn05271", "rxn05272", "rxn05273", "rxn05274", "rxn05275", - "rxn05276", "rxn05277", "rxn05278", "rxn05279", "rxn05280", "rxn05281", "rxn05282", - "rxn05283", "rxn05284", "rxn05285", "rxn05286", "rxn05963", "rxn05964", "rxn05971", - "rxn05989", "rxn05990", "rxn06041", "rxn06042", "rxn06043", "rxn06044", "rxn06045", - "rxn06046", "rxn06079", "rxn06080", "rxn06081", "rxn06086", "rxn06087", "rxn06088", - "rxn06089", "rxn06090", "rxn06091", "rxn06092", "rxn06138", "rxn06139", "rxn06140", - "rxn06141", "rxn06145", "rxn06217", "rxn06218", "rxn06219", "rxn06220", "rxn06221", - "rxn06222", "rxn06223", "rxn06235", "rxn06362", "rxn06368", "rxn06378", "rxn06474", - "rxn06475", "rxn06502", "rxn06562", "rxn06569", "rxn06604", "rxn06702", "rxn06706", - "rxn06715", "rxn06803", "rxn06811", "rxn06812", "rxn06850", "rxn06901", "rxn06971", - "rxn06999", "rxn07123", "rxn07172", "rxn07254", "rxn07255", "rxn07269", "rxn07451", - "rxn09037", "rxn10018", "rxn10077", "rxn10096", "rxn10097", "rxn10098", "rxn10099", - "rxn10101", "rxn10102", "rxn10103", "rxn10104", "rxn10105", "rxn10106", "rxn10107", - "rxn10109", "rxn10111", "rxn10403", "rxn10410", "rxn10416", "rxn11313", "rxn11316", - "rxn11318", "rxn11353", "rxn05224", "rxn05795", "rxn05796", "rxn05797", "rxn05798", - "rxn05799", "rxn05801", "rxn05802", "rxn05803", "rxn05804", "rxn05805", "rxn05806", - "rxn05808", "rxn05812", "rxn05815", "rxn05832", "rxn05836", "rxn05851", "rxn05857", - "rxn05869", "rxn05870", "rxn05884", "rxn05888", "rxn05896", "rxn05898", "rxn05900", - "rxn05903", "rxn05904", "rxn05905", "rxn05911", "rxn05921", "rxn05925", "rxn05936", - "rxn05947", "rxn05956", "rxn05959", "rxn05960", "rxn05980", "rxn05991", "rxn05992", - "rxn05999", "rxn06001", "rxn06014", "rxn06017", "rxn06021", "rxn06026", "rxn06027", - "rxn06034", "rxn06048", "rxn06052", "rxn06053", "rxn06054", "rxn06057", "rxn06059", - "rxn06061", "rxn06102", "rxn06103", "rxn06127", "rxn06128", "rxn06129", "rxn06130", - "rxn06131", "rxn06132", "rxn06137", "rxn06146", "rxn06161", "rxn06167", "rxn06172", - "rxn06174", "rxn06175", "rxn06187", "rxn06189", "rxn06203", "rxn06204", "rxn06246", - "rxn06261", "rxn06265", "rxn06266", "rxn06286", "rxn06291", "rxn06294", "rxn06310", - "rxn06320", "rxn06327", "rxn06334", "rxn06337", "rxn06339", "rxn06342", "rxn06343", - "rxn06350", "rxn06352", "rxn06358", "rxn06361", "rxn06369", "rxn06380", "rxn06395", - "rxn06415", "rxn06419", "rxn06420", "rxn06421", "rxn06423", "rxn06450", "rxn06457", - "rxn06463", "rxn06464", "rxn06466", "rxn06471", "rxn06482", "rxn06483", "rxn06486", - "rxn06492", "rxn06497", "rxn06498", "rxn06501", "rxn06505", "rxn06506", "rxn06521", - "rxn06534", "rxn06580", "rxn06585", "rxn06593", "rxn06609", "rxn06613", "rxn06654", - "rxn06667", "rxn06676", "rxn06693", "rxn06730", "rxn06746", "rxn06762", "rxn06779", - "rxn06790", "rxn06791", "rxn06792", "rxn06793", "rxn06794", "rxn06795", "rxn06796", - "rxn06797", "rxn06821", "rxn06826", "rxn06827", "rxn06829", "rxn06839", "rxn06841", - "rxn06842", "rxn06851", "rxn06866", "rxn06867", "rxn06873", "rxn06885", "rxn06891", - "rxn06892", "rxn06896", "rxn06938", "rxn06939", "rxn06944", "rxn06951", "rxn06952", - "rxn06955", "rxn06957", "rxn06960", "rxn06964", "rxn06965", "rxn07086", "rxn07097", - "rxn07103", "rxn07104", "rxn07105", "rxn07106", "rxn07107", "rxn07109", "rxn07119", - "rxn07179", "rxn07186", "rxn07187", "rxn07188", "rxn07195", "rxn07196", "rxn07197", - "rxn07198", "rxn07201", "rxn07205", "rxn07206", "rxn07210", "rxn07244", "rxn07245", - "rxn07253", "rxn07275", "rxn07299", "rxn07302", "rxn07651", "rxn07723", "rxn07736", - "rxn07878", "rxn11417", "rxn11582", "rxn11593", "rxn11597", "rxn11615", "rxn11617", - "rxn11619", "rxn11620", "rxn11624", "rxn11626", "rxn11638", "rxn11648", "rxn11651", - "rxn11665", "rxn11666", "rxn11667", "rxn11698", "rxn11983", "rxn11986", "rxn11994", - "rxn12006", "rxn12007", "rxn12014", "rxn12017", "rxn12022", "rxn12160", "rxn12161", - "rxn01267", "rxn05294", "rxn04656"] +default_blacklist = [ + "rxn12985", + "rxn00238", + "rxn07058", + "rxn05305", + "rxn09037", + "rxn10643", + "rxn11317", + "rxn05254", + "rxn05257", + "rxn05258", + "rxn05259", + "rxn05264", + "rxn05268", + "rxn05269", + "rxn05270", + "rxn05271", + "rxn05272", + "rxn05273", + "rxn05274", + "rxn05275", + "rxn05276", + "rxn05277", + "rxn05278", + "rxn05279", + "rxn05280", + "rxn05281", + "rxn05282", + "rxn05283", + "rxn05284", + "rxn05285", + "rxn05286", + "rxn05963", + "rxn05964", + "rxn05971", + "rxn05989", + "rxn05990", + "rxn06041", + "rxn06042", + "rxn06043", + "rxn06044", + "rxn06045", + "rxn06046", + "rxn06079", + "rxn06080", + "rxn06081", + "rxn06086", + "rxn06087", + "rxn06088", + "rxn06089", + "rxn06090", + "rxn06091", + "rxn06092", + "rxn06138", + "rxn06139", + "rxn06140", + "rxn06141", + "rxn06145", + "rxn06217", + "rxn06218", + "rxn06219", + "rxn06220", + "rxn06221", + "rxn06222", + "rxn06223", + "rxn06235", + "rxn06362", + "rxn06368", + "rxn06378", + "rxn06474", + "rxn06475", + "rxn06502", + "rxn06562", + "rxn06569", + "rxn06604", + "rxn06702", + "rxn06706", + "rxn06715", + "rxn06803", + "rxn06811", + "rxn06812", + "rxn06850", + "rxn06901", + "rxn06971", + "rxn06999", + "rxn07123", + "rxn07172", + "rxn07254", + "rxn07255", + "rxn07269", + "rxn07451", + "rxn09037", + "rxn10018", + "rxn10077", + "rxn10096", + "rxn10097", + "rxn10098", + "rxn10099", + "rxn10101", + "rxn10102", + "rxn10103", + "rxn10104", + "rxn10105", + "rxn10106", + "rxn10107", + "rxn10109", + "rxn10111", + "rxn10403", + "rxn10410", + "rxn10416", + "rxn11313", + "rxn11316", + "rxn11318", + "rxn11353", + "rxn05224", + "rxn05795", + "rxn05796", + "rxn05797", + "rxn05798", + "rxn05799", + "rxn05801", + "rxn05802", + "rxn05803", + "rxn05804", + "rxn05805", + "rxn05806", + "rxn05808", + "rxn05812", + "rxn05815", + "rxn05832", + "rxn05836", + "rxn05851", + "rxn05857", + "rxn05869", + "rxn05870", + "rxn05884", + "rxn05888", + "rxn05896", + "rxn05898", + "rxn05900", + "rxn05903", + "rxn05904", + "rxn05905", + "rxn05911", + "rxn05921", + "rxn05925", + "rxn05936", + "rxn05947", + "rxn05956", + "rxn05959", + "rxn05960", + "rxn05980", + "rxn05991", + "rxn05992", + "rxn05999", + "rxn06001", + "rxn06014", + "rxn06017", + "rxn06021", + "rxn06026", + "rxn06027", + "rxn06034", + "rxn06048", + "rxn06052", + "rxn06053", + "rxn06054", + "rxn06057", + "rxn06059", + "rxn06061", + "rxn06102", + "rxn06103", + "rxn06127", + "rxn06128", + "rxn06129", + "rxn06130", + "rxn06131", + "rxn06132", + "rxn06137", + "rxn06146", + "rxn06161", + "rxn06167", + "rxn06172", + "rxn06174", + "rxn06175", + "rxn06187", + "rxn06189", + "rxn06203", + "rxn06204", + "rxn06246", + "rxn06261", + "rxn06265", + "rxn06266", + "rxn06286", + "rxn06291", + "rxn06294", + "rxn06310", + "rxn06320", + "rxn06327", + "rxn06334", + "rxn06337", + "rxn06339", + "rxn06342", + "rxn06343", + "rxn06350", + "rxn06352", + "rxn06358", + "rxn06361", + "rxn06369", + "rxn06380", + "rxn06395", + "rxn06415", + "rxn06419", + "rxn06420", + "rxn06421", + "rxn06423", + "rxn06450", + "rxn06457", + "rxn06463", + "rxn06464", + "rxn06466", + "rxn06471", + "rxn06482", + "rxn06483", + "rxn06486", + "rxn06492", + "rxn06497", + "rxn06498", + "rxn06501", + "rxn06505", + "rxn06506", + "rxn06521", + "rxn06534", + "rxn06580", + "rxn06585", + "rxn06593", + "rxn06609", + "rxn06613", + "rxn06654", + "rxn06667", + "rxn06676", + "rxn06693", + "rxn06730", + "rxn06746", + "rxn06762", + "rxn06779", + "rxn06790", + "rxn06791", + "rxn06792", + "rxn06793", + "rxn06794", + "rxn06795", + "rxn06796", + "rxn06797", + "rxn06821", + "rxn06826", + "rxn06827", + "rxn06829", + "rxn06839", + "rxn06841", + "rxn06842", + "rxn06851", + "rxn06866", + "rxn06867", + "rxn06873", + "rxn06885", + "rxn06891", + "rxn06892", + "rxn06896", + "rxn06938", + "rxn06939", + "rxn06944", + "rxn06951", + "rxn06952", + "rxn06955", + "rxn06957", + "rxn06960", + "rxn06964", + "rxn06965", + "rxn07086", + "rxn07097", + "rxn07103", + "rxn07104", + "rxn07105", + "rxn07106", + "rxn07107", + "rxn07109", + "rxn07119", + "rxn07179", + "rxn07186", + "rxn07187", + "rxn07188", + "rxn07195", + "rxn07196", + "rxn07197", + "rxn07198", + "rxn07201", + "rxn07205", + "rxn07206", + "rxn07210", + "rxn07244", + "rxn07245", + "rxn07253", + "rxn07275", + "rxn07299", + "rxn07302", + "rxn07651", + "rxn07723", + "rxn07736", + "rxn07878", + "rxn11417", + "rxn11582", + "rxn11593", + "rxn11597", + "rxn11615", + "rxn11617", + "rxn11619", + "rxn11620", + "rxn11624", + "rxn11626", + "rxn11638", + "rxn11648", + "rxn11651", + "rxn11665", + "rxn11666", + "rxn11667", + "rxn11698", + "rxn11983", + "rxn11986", + "rxn11994", + "rxn12006", + "rxn12007", + "rxn12014", + "rxn12017", + "rxn12022", + "rxn12160", + "rxn12161", + "rxn01267", + "rxn05294", + "rxn04656", +] class GapfillingPkg(BaseFBAPkg): - """ - - """ + """ """ def __init__(self, model): BaseFBAPkg.__init__(self, model, "gapfilling", {}, {}) @@ -77,7 +366,7 @@ def build(self, template, minimum_objective=0.01): "default_gapfill_templates": [template], "gapfill_all_indecies_with_default_templates": 1, "minimum_obj": minimum_objective, - "set_objective": 1 + "set_objective": 1, } self.build_package(parameters) @@ -88,8 +377,8 @@ def get_model_index_hash(self): """ index_hash = {"none": 0} for metabolite in self.model.metabolites: - if re.search('_[a-z]\d+$', metabolite.id) is not None: - m = re.search('_([a-z])(\d+)$', metabolite.id) + if re.search("_[a-z]\d+$", metabolite.id) is not None: + m = re.search("_([a-z])(\d+)$", metabolite.id) if m[1] != "e": if m[2] not in index_hash: index_hash[m[2]] = 0 @@ -100,24 +389,28 @@ def get_model_index_hash(self): return index_hash def build_package(self, parameters): - self.validate_parameters(parameters, [], { - "auto_sink": ["cpd02701", "cpd11416", "cpd15302","cpd03091"], - "extend_with_template":1, - "model_penalty":1, - "default_gapfill_models":[], - "default_gapfill_templates":[], - "gapfill_templates_by_index":{}, - "gapfill_models_by_index":{}, - "reaction_scores":{}, - "gapfill_all_indecies_with_default_templates":1, - "gapfill_all_indecies_with_default_models":1, - "default_excretion":100, - "default_uptake":100, - "minimum_obj":0.01, - "set_objective":1, - "minimize_exchanges":False, - "blacklist":default_blacklist - }) + self.validate_parameters( + parameters, + [], + { + "auto_sink": ["cpd02701", "cpd11416", "cpd15302", "cpd03091"], + "extend_with_template": 1, + "model_penalty": 1, + "default_gapfill_models": [], + "default_gapfill_templates": [], + "gapfill_templates_by_index": {}, + "gapfill_models_by_index": {}, + "reaction_scores": {}, + "gapfill_all_indecies_with_default_templates": 1, + "gapfill_all_indecies_with_default_models": 1, + "default_excretion": 100, + "default_uptake": 100, + "minimum_obj": 0.01, + "set_objective": 1, + "minimize_exchanges": False, + "blacklist": default_blacklist, + }, + ) # Adding model reactions to original reaction list self.parameters["original_reactions"] = [] for rxn in self.model.reactions: @@ -131,8 +424,10 @@ def build_package(self, parameters): self.parameters["original_reactions"].append([rxn, ">"]) # Adding constraint for target reaction self.parameters["origobj"] = self.model.objective - self.pkgmgr.getpkg("ObjConstPkg").build_package(self.parameters["minimum_obj"],None) - + self.pkgmgr.getpkg("ObjConstPkg").build_package( + self.parameters["minimum_obj"], None + ) + # Determine all indecies that should be gapfilled indexhash = self.get_model_index_hash() @@ -142,26 +437,40 @@ def build_package(self, parameters): if indexhash[index] > 10: if index == "none": for template in self.parameters["default_gapfill_templates"]: - new_penalties = self.extend_model_with_template_for_gapfilling(template, index) + new_penalties = self.extend_model_with_template_for_gapfilling( + template, index + ) self.gapfilling_penalties.update(new_penalties) for gfmdl in self.parameters["default_gapfill_models"]: - new_penalties = self.extend_model_with_model_for_gapfilling(gfmdl, index) + new_penalties = self.extend_model_with_model_for_gapfilling( + gfmdl, index + ) self.gapfilling_penalties.update(new_penalties) if index in self.parameters["gapfill_templates_by_index"]: - for template in self.parameters["gapfill_templates_by_index"][index]: - new_penalties = self.extend_model_with_template_for_gapfilling(template, index) + for template in self.parameters["gapfill_templates_by_index"][ + index + ]: + new_penalties = self.extend_model_with_template_for_gapfilling( + template, index + ) self.gapfilling_penalties.update(new_penalties) if index in self.parameters["gapfill_models_by_index"]: for gfmdl in self.parameters["gapfill_models_by_index"]: - new_penalties = self.extend_model_with_model_for_gapfilling(gfmdl, index) + new_penalties = self.extend_model_with_model_for_gapfilling( + gfmdl, index + ) self.gapfilling_penalties.update(new_penalties) if self.parameters["gapfill_all_indecies_with_default_templates"]: for template in self.parameters["default_gapfill_templates"]: - new_penalties = self.extend_model_with_template_for_gapfilling(template, index) + new_penalties = self.extend_model_with_template_for_gapfilling( + template, index + ) self.gapfilling_penalties.update(new_penalties) if self.parameters["gapfill_all_indecies_with_default_models"]: for gfmdl in self.parameters["default_gapfill_models"]: - new_penalties = self.extend_model_with_model_for_gapfilling(gfmdl, index) + new_penalties = self.extend_model_with_model_for_gapfilling( + gfmdl, index + ) self.gapfilling_penalties.update(new_penalties) # Rescaling penalties by reaction scores and saving genes for reaction in self.gapfilling_penalties: @@ -173,24 +482,33 @@ def build_package(self, parameters): highest_score = self.parameters["reaction_scores"][rxnid][gene] factor = 0.1 if "reverse" in self.gapfilling_penalties[reaction]: - self.gapfilling_penalties[reaction]["reverse"] = factor * self.gapfilling_penalties[reaction]["reverse"] + self.gapfilling_penalties[reaction]["reverse"] = ( + factor * self.gapfilling_penalties[reaction]["reverse"] + ) if "forward" in self.gapfilling_penalties[reaction]: - self.gapfilling_penalties[reaction]["forward"] = factor * self.gapfilling_penalties[reaction]["forward"] + self.gapfilling_penalties[reaction]["forward"] = ( + factor * self.gapfilling_penalties[reaction]["forward"] + ) self.model.solver.update() if self.parameters["set_objective"] == 1: - reaction_objective = self.model.problem.Objective( - Zero, - direction="min") + reaction_objective = self.model.problem.Objective(Zero, direction="min") obj_coef = dict() for reaction in self.model.reactions: if reaction.id in self.gapfilling_penalties: - if self.parameters["minimize_exchanges"] or reaction.id[0:3] != "EX_": + if ( + self.parameters["minimize_exchanges"] + or reaction.id[0:3] != "EX_" + ): # Minimizing gapfilled reactions if "reverse" in self.gapfilling_penalties[reaction.id]: - obj_coef[reaction.reverse_variable] = abs(self.gapfilling_penalties[reaction.id]["reverse"]) + obj_coef[reaction.reverse_variable] = abs( + self.gapfilling_penalties[reaction.id]["reverse"] + ) if "forward" in self.gapfilling_penalties[reaction.id]: - obj_coef[reaction.forward_variable] = abs(self.gapfilling_penalties[reaction.id]["forward"]) + obj_coef[reaction.forward_variable] = abs( + self.gapfilling_penalties[reaction.id]["forward"] + ) else: obj_coef[reaction.forward_variable] = 0 obj_coef[reaction.reverse_variable] = 0 @@ -207,15 +525,18 @@ def extend_model_with_model_for_gapfilling(self, source_model, index): # Adding metabolites from source model to gapfill model for cobra_metabolite in source_model.metabolites: original_id = cobra_metabolite.id - if re.search('(.+)_([a-z])\d+$', cobra_metabolite.id) != None: - m = re.search('(.+)_([a-z])\d+$', cobra_metabolite.id) + if re.search("(.+)_([a-z])\d+$", cobra_metabolite.id) != None: + m = re.search("(.+)_([a-z])\d+$", cobra_metabolite.id) if m[2] == "e": cobra_metabolite.compartment = "e0" cobra_metabolite.id = m[1] + "_e0" else: cobra_metabolite.compartment = m[2] + index cobra_metabolite.id = m[1] + "_" + m[2] + index - if cobra_metabolite.id not in self.model.metabolites and cobra_metabolite.id not in new_metabolites: + if ( + cobra_metabolite.id not in self.model.metabolites + and cobra_metabolite.id not in new_metabolites + ): new_metabolites[cobra_metabolite.id] = cobra_metabolite local_remap[original_id] = cobra_metabolite if m[1] + "_" + m[2] in self.parameters["auto_sink"]: @@ -226,51 +547,89 @@ def extend_model_with_model_for_gapfilling(self, source_model, index): self.model.add_metabolites(new_metabolites.values()) # Adding reactions from source model to gapfill model for modelreaction in source_model.reactions: - if re.search('(.+)_([a-z])\d+$', modelreaction.id) != None: - m = re.search('(.+)_([a-z])\d+$', modelreaction.id) + if re.search("(.+)_([a-z])\d+$", modelreaction.id) != None: + m = re.search("(.+)_([a-z])\d+$", modelreaction.id) if m[1] not in self.parameters["blacklist"]: cobra_reaction = modelreaction.copy() cobra_reaction.id = groups[1] + "_" + groups[2] + index - if cobra_reaction.id not in self.model.reactions and cobra_reaction.id not in new_reactions: + if ( + cobra_reaction.id not in self.model.reactions + and cobra_reaction.id not in new_reactions + ): new_reactions[cobra_reaction.id] = cobra_reaction - new_penalties[cobra_reaction.id] = dict(); + new_penalties[cobra_reaction.id] = dict() new_penalties[cobra_reaction.id]["added"] = 1 if cobra_reaction.lower_bound < 0: - new_penalties[cobra_reaction.id]["reverse"] = self.parameters["model_penalty"] + new_penalties[cobra_reaction.id][ + "reverse" + ] = self.parameters["model_penalty"] if cobra_reaction.upper_bound > 0: - new_penalties[cobra_reaction.id]["forward"] = self.parameters["model_penalty"] + new_penalties[cobra_reaction.id][ + "forward" + ] = self.parameters["model_penalty"] # Updating metabolites in reaction to new model - metabolites = cobra_reaction.metabolites; + metabolites = cobra_reaction.metabolites new_stoichiometry = {} for metabolite in metabolites: # Adding new coefficient: - new_stoichiometry[local_remap[metabolite.id]] = metabolites[metabolite] + new_stoichiometry[local_remap[metabolite.id]] = metabolites[ + metabolite + ] # Zeroing out current coefficients if local_remap[metabolite.id] != metabolite: new_stoichiometry[metabolite] = 0 cobra_reaction.add_metabolites(new_stoichiometry, combine=False) - elif cobra_reaction.lower_bound < 0 and self.model.reactions.get_by_id( - cobra_reaction.id).lower_bound == 0: - self.model.reactions.get_by_id(cobra_reaction.id).lower_bound = cobra_reaction.lower_bound - self.model.reactions.get_by_id(cobra_reaction.id).update_variable_bounds() - new_penalties[cobra_reaction.id]["reverse"] = self.parameters["model_penalty"] + elif ( + cobra_reaction.lower_bound < 0 + and self.model.reactions.get_by_id( + cobra_reaction.id + ).lower_bound + == 0 + ): + self.model.reactions.get_by_id( + cobra_reaction.id + ).lower_bound = cobra_reaction.lower_bound + self.model.reactions.get_by_id( + cobra_reaction.id + ).update_variable_bounds() + new_penalties[cobra_reaction.id]["reverse"] = self.parameters[ + "model_penalty" + ] new_penalties[cobra_reaction.id]["reversed"] = 1 - elif cobra_reaction.upper_bound > 0 and self.model.reactions.get_by_id( - cobra_reaction.id).upper_bound == 0: - self.model.reactions.get_by_id(cobra_reaction.id).upper_bound = cobra_reaction.upper_bound - self.model.reactions.get_by_id(cobra_reaction.id).update_variable_bounds() + elif ( + cobra_reaction.upper_bound > 0 + and self.model.reactions.get_by_id( + cobra_reaction.id + ).upper_bound + == 0 + ): + self.model.reactions.get_by_id( + cobra_reaction.id + ).upper_bound = cobra_reaction.upper_bound + self.model.reactions.get_by_id( + cobra_reaction.id + ).update_variable_bounds() new_penalties[cobra_reaction.id]["forward"] = model_penalty new_penalties[cobra_reaction.id]["reversed"] = 1 # Only run this on new exchanges so we don't readd for all exchanges - self.modelutl.add_exchanges_for_metabolites(new_exchange,self.parameters["default_uptake"],self.parameters["default_excretion"]) + self.modelutl.add_exchanges_for_metabolites( + new_exchange, + self.parameters["default_uptake"], + self.parameters["default_excretion"], + ) # Only run this on new demands so we don't readd for all exchanges - self.modelutl.add_exchanges_for_metabolites(new_demand,self.parameters["default_uptake"],self.parameters["default_excretion"],"DM_") + self.modelutl.add_exchanges_for_metabolites( + new_demand, + self.parameters["default_uptake"], + self.parameters["default_excretion"], + "DM_", + ) # Adding all new reactions to the model at once (much faster than one at a time) self.model.add_reactions(new_reactions.values()) return new_penalties - def extend_model_with_template_metabolites(self, template, index='0'): + def extend_model_with_template_metabolites(self, template, index="0"): """ Add all missing template compartment compounds to the model :param template: @@ -282,12 +641,15 @@ def extend_model_with_template_metabolites(self, template, index='0'): new_demand = [] for template_compound in template.compcompounds: compartment = template_compound.compartment - compartment_index = "0" if compartment == 'e' else index + compartment_index = "0" if compartment == "e" else index cobra_metabolite = template_compound.to_metabolite(compartment_index) - #cobra_metabolite = self.convert_template_compound(template_compound, compartment_index, template) # TODO: move function out - if cobra_metabolite.id not in self.model.metabolites and cobra_metabolite.id not in new_metabolites: + # cobra_metabolite = self.convert_template_compound(template_compound, compartment_index, template) # TODO: move function out + if ( + cobra_metabolite.id not in self.model.metabolites + and cobra_metabolite.id not in new_metabolites + ): new_metabolites[cobra_metabolite.id] = cobra_metabolite - #self.model.add_metabolites([cobra_metabolite]) + # self.model.add_metabolites([cobra_metabolite]) msid = FBAHelper.modelseed_id_from_cobra_metabolite(cobra_metabolite) if msid in self.parameters["auto_sink"]: if msid != "cpd11416" or cobra_metabolite.compartment == "c0": @@ -301,28 +663,37 @@ def extend_model_with_template_metabolites(self, template, index='0'): # Possible new function to add to the KBaseFBAModelToCobraBuilder to extend a model with a template for gapfilling for a specific index def extend_model_with_template_for_gapfilling(self, template, index): - logger.debug(f'extend model with template: {template}, index: {index}') + logger.debug(f"extend model with template: {template}, index: {index}") new_reactions = {} new_penalties = dict() # Adding all metabolites to model prior to adding reactions - new_exchange, new_demand = self.extend_model_with_template_metabolites(template, index) + new_exchange, new_demand = self.extend_model_with_template_metabolites( + template, index + ) for template_reaction in template.reactions: if template_reaction.reference_id in self.parameters["blacklist"]: continue - cobra_reaction = self.convert_template_reaction(template_reaction, index, template, 1) # TODO: move function out + cobra_reaction = self.convert_template_reaction( + template_reaction, index, template, 1 + ) # TODO: move function out new_penalties[cobra_reaction.id] = dict() - if cobra_reaction.id not in self.model.reactions and cobra_reaction.id not in new_reactions: + if ( + cobra_reaction.id not in self.model.reactions + and cobra_reaction.id not in new_reactions + ): # Adding any template reactions missing from the present model new_reactions[cobra_reaction.id] = cobra_reaction if cobra_reaction.lower_bound < 0: - new_penalties[cobra_reaction.id][ - "reverse"] = template_reaction.base_cost + template_reaction.reverse_penalty + new_penalties[cobra_reaction.id]["reverse"] = ( + template_reaction.base_cost + template_reaction.reverse_penalty + ) if cobra_reaction.upper_bound > 0: - new_penalties[cobra_reaction.id][ - "forward"] = template_reaction.base_cost + template_reaction.forward_penalty + new_penalties[cobra_reaction.id]["forward"] = ( + template_reaction.base_cost + template_reaction.forward_penalty + ) new_penalties[cobra_reaction.id]["added"] = 1 elif template_reaction.GapfillDirection == "=": # Adjusting directionality as needed for existing reactions @@ -331,30 +702,33 @@ def extend_model_with_template_for_gapfilling(self, template, index): if model_reaction.lower_bound == 0: model_reaction.lower_bound = template_reaction.lower_bound model_reaction.update_variable_bounds() - new_penalties[cobra_reaction.id][ - "reverse"] = template_reaction.base_cost + template_reaction.reverse_penalty + new_penalties[cobra_reaction.id]["reverse"] = ( + template_reaction.base_cost + template_reaction.reverse_penalty + ) if model_reaction.upper_bound == 0: model_reaction.upper_bound = template_reaction.upper_bound model_reaction.update_variable_bounds() - new_penalties[cobra_reaction.id][ - "forward"] = template_reaction.base_cost + template_reaction.forward_penalty + new_penalties[cobra_reaction.id]["forward"] = ( + template_reaction.base_cost + template_reaction.forward_penalty + ) # Only run this on new exchanges so we don't read for all exchanges - exchanges = self.modelutl.add_exchanges_for_metabolites(new_exchange,self.parameters["default_uptake"],self.parameters["default_excretion"]) + exchanges = self.modelutl.add_exchanges_for_metabolites( + new_exchange, + self.parameters["default_uptake"], + self.parameters["default_excretion"], + ) for ex in exchanges: - new_penalties[ex.id] = { - 'added': 1, - 'reverse': 1, - 'forward': 1 - } - + new_penalties[ex.id] = {"added": 1, "reverse": 1, "forward": 1} + # Only run this on new demands so we don't readd for all exchanges - exchanges = self.modelutl.add_exchanges_for_metabolites(new_demand,self.parameters["default_uptake"],self.parameters["default_excretion"],"DM_") + exchanges = self.modelutl.add_exchanges_for_metabolites( + new_demand, + self.parameters["default_uptake"], + self.parameters["default_excretion"], + "DM_", + ) for ex in exchanges: - new_penalties[ex.id] = { - 'added': 1, - 'reverse': 1, - 'forward': 1 - } + new_penalties[ex.id] = {"added": 1, "reverse": 1, "forward": 1} # Adding all new reactions to the model at once (much faster than one at a time) self.model.add_reactions(new_reactions.values()) @@ -368,17 +742,23 @@ def convert_template_compound(self, template_compound, index, template): compartment = template_compound.compartment compartment += str(index) - met = Metabolite(new_id, - formula=base_compound.formula, - name=base_compound.name, - charge=template_compound.charge, - compartment=compartment) - - met.annotation["sbo"] = "SBO:0000247" # simple chemical - Simple, non-repetitive chemical entity. + met = Metabolite( + new_id, + formula=base_compound.formula, + name=base_compound.name, + charge=template_compound.charge, + compartment=compartment, + ) + + met.annotation[ + "sbo" + ] = "SBO:0000247" # simple chemical - Simple, non-repetitive chemical entity. met.annotation["seed.compound"] = base_id return met - def convert_template_reaction(self, template_reaction, index, template, for_gapfilling=1): + def convert_template_reaction( + self, template_reaction, index, template, for_gapfilling=1 + ): array = template_reaction.id.split("_") base_id = array[0] new_id = template_reaction.id @@ -396,10 +776,12 @@ def convert_template_reaction(self, template_reaction, index, template, for_gapf elif direction == "<": upper_bound = 0 - cobra_reaction = Reaction(new_id, - name=template_reaction.name, - lower_bound=lower_bound, - upper_bound=upper_bound) + cobra_reaction = Reaction( + new_id, + name=template_reaction.name, + lower_bound=lower_bound, + upper_bound=upper_bound, + ) object_stoichiometry = {} for m, value in template_reaction.metabolites.items(): @@ -419,7 +801,7 @@ def convert_template_reaction(self, template_reaction, index, template, for_gapf cobra_reaction.annotation["seed.reaction"] = template_reaction.reference_id return cobra_reaction - + def binary_check_gapfilling_solution(self, solution=None, flux_values=None): if solution is None: solution = self.compute_gapfilled_solution() @@ -440,7 +822,7 @@ def binary_check_gapfilling_solution(self, solution=None, flux_values=None): new_solution = {} with self.model: # Setting all gapfilled reactions not in the solution to zero - self.knockout_gf_reactions_outside_solution(solution,flux_values) + self.knockout_gf_reactions_outside_solution(solution, flux_values) # Setting the objective to be minimization of sum of binary variables min_reaction_objective = self.model.problem.Objective(Zero, direction="min") self.model.objective = min_reaction_objective @@ -448,87 +830,110 @@ def binary_check_gapfilling_solution(self, solution=None, flux_values=None): self.model.optimize() new_solution = self.compute_gapfilled_solution() return new_solution - - #This function is designed to KO all gapfilled reactions not included in the solution - def knockout_gf_reactions_outside_solution(self,solution = None,flux_values = None): + + # This function is designed to KO all gapfilled reactions not included in the solution + def knockout_gf_reactions_outside_solution(self, solution=None, flux_values=None): if solution == None: solution = self.compute_gapfilled_solution() if flux_values == None: flux_values = self.modelutl.compute_flux_values_from_variables() for rxnobj in self.model.reactions: if rxnobj.id in self.gapfilling_penalties: - if "reverse" in self.gapfilling_penalties[rxnobj.id] and flux_values[rxnobj.id]["reverse"] <= Zero: + if ( + "reverse" in self.gapfilling_penalties[rxnobj.id] + and flux_values[rxnobj.id]["reverse"] <= Zero + ): rxnobj.lower_bound = 0 - if "forward" in self.gapfilling_penalties[rxnobj.id] and flux_values[rxnobj.id]["forward"] <= Zero: + if ( + "forward" in self.gapfilling_penalties[rxnobj.id] + and flux_values[rxnobj.id]["forward"] <= Zero + ): rxnobj.upper_bound = 0 rxnobj.update_variable_bounds() - - def run_test_conditions(self,condition_list,solution = None,max_iterations = 10): + + def run_test_conditions(self, condition_list, solution=None, max_iterations=10): if solution == None: solution = self.compute_gapfilled_solution() reaction_list = [] for rxnid in solution["reversed"]: - reaction_list.append([self.model.reactions.get_by_id(rxnid),solution["reversed"][rxnid]]) + reaction_list.append( + [self.model.reactions.get_by_id(rxnid), solution["reversed"][rxnid]] + ) for rxnid in solution["new"]: - reaction_list.append([self.model.reactions.get_by_id(rxnid),solution["new"][rxnid]]) + reaction_list.append( + [self.model.reactions.get_by_id(rxnid), solution["new"][rxnid]] + ) filtered_list = [] with self.model: - #Setting all gapfilled reactions not in the solution to zero + # Setting all gapfilled reactions not in the solution to zero self.knockout_gf_reactions_outside_solution(solution) self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = 0 for condition in condition_list: condition["change"] = True - filtered_list = self.modelutl.reaction_expansion_test(reaction_list,condition_list) + filtered_list = self.modelutl.reaction_expansion_test( + reaction_list, condition_list + ) for condition in condition_list: condition["change"] = False if len(filtered_list) > 0: if max_iterations > 0: - print("Gapfilling test failed "+str(11-max_iterations)) - #Forcing filtered reactions to zero + print("Gapfilling test failed " + str(11 - max_iterations)) + # Forcing filtered reactions to zero for item in filtered_list: if item[1] == ">": self.model.reactions.get_by_id(item[0].id).upper_bound = 0 else: self.model.reactions.get_by_id(item[0].id).lower_bound = 0 - #Restoring lower bound on biomass constraint - self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = self.parameters["minimum_obj"] - #Reoptimizing + # Restoring lower bound on biomass constraint + self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"][ + "1" + ].lb = self.parameters["minimum_obj"] + # Reoptimizing self.model.optimize() - return self.run_test_conditions(condition_list,None,max_iterations-1) + return self.run_test_conditions( + condition_list, None, max_iterations - 1 + ) return None return solution - - def filter_database_based_on_tests(self,test_conditions): + + def filter_database_based_on_tests(self, test_conditions): filetered_list = [] with self.model: rxnlist = [] for reaction in self.model.reactions: if reaction.id in self.gapfilling_penalties: if "reverse" in self.gapfilling_penalties[reaction.id]: - rxnlist.append([reaction,"<"]) + rxnlist.append([reaction, "<"]) if "forward" in self.gapfilling_penalties[reaction.id]: - rxnlist.append([reaction,">"]) + rxnlist.append([reaction, ">"]) self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = 0 - filtered_list = self.modelutl.reaction_expansion_test(rxnlist,test_conditions) - #Now constraining filtered reactions to zero + filtered_list = self.modelutl.reaction_expansion_test( + rxnlist, test_conditions + ) + # Now constraining filtered reactions to zero for item in filtered_list: - logger.debug("Filtering:",item[0].id,item[1]) + logger.debug("Filtering:", item[0].id, item[1]) if item[1] == ">": self.model.reactions.get_by_id(item[0].id).upper_bound = 0 else: self.model.reactions.get_by_id(item[0].id).lower_bound = 0 - #Now testing if the gapfilling minimum objective can still be achieved + # Now testing if the gapfilling minimum objective can still be achieved gfobj = self.model.objective self.model.objective = self.parameters["origobj"] solution = self.model.optimize() - #Restoring the minimum objective constraint - self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = self.parameters["minimum_obj"] - print("Objective after filtering:",solution.objective_value,"; min objective:",self.parameters["minimum_obj"]) + # Restoring the minimum objective constraint + self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = self.parameters[ + "minimum_obj" + ] + print( + "Objective after filtering:", + solution.objective_value, + "; min objective:", + self.parameters["minimum_obj"], + ) if solution.objective_value < self.parameters["minimum_obj"]: - #Now we need to restore a minimal set of filtered reactions such that we permit the minimum objective to be reached - new_objective = self.model.problem.Objective( - Zero, - direction="min") + # Now we need to restore a minimal set of filtered reactions such that we permit the minimum objective to be reached + new_objective = self.model.problem.Objective(Zero, direction="min") filterobjcoef = dict() for item in filtered_list: rxn = self.model.reactions.get_by_id(item[0].id) @@ -538,7 +943,7 @@ def filter_database_based_on_tests(self,test_conditions): else: filterobjcoef[rxn.reverse_variable] = item[3] rxn.lower_bound = item[2] - + self.model.objective = new_objective new_objective.set_linear_coefficients(filterobjcoef) solution = self.model.optimize() @@ -560,31 +965,41 @@ def filter_database_based_on_tests(self,test_conditions): else: count += -1 rxn.lower_bound = 0 - print("Reactions unfiltered:",count) - #Checking for model reactions that can be removed to enable all tests to pass + print("Reactions unfiltered:", count) + # Checking for model reactions that can be removed to enable all tests to pass self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = 0 - filtered_list = self.modelutl.reaction_expansion_test(self.parameters["original_reactions"],test_conditions) + filtered_list = self.modelutl.reaction_expansion_test( + self.parameters["original_reactions"], test_conditions + ) for item in filtered_list: - logger.debug("Filtering:",item[0].id,item[1]) + logger.debug("Filtering:", item[0].id, item[1]) if item[1] == ">": self.model.reactions.get_by_id(item[0].id).upper_bound = 0 else: self.model.reactions.get_by_id(item[0].id).lower_bound = 0 - self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = self.parameters["minimum_obj"] + self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"][ + "1" + ].lb = self.parameters["minimum_obj"] self.model.objective = gfobj - + def compute_gapfilled_solution(self, flux_values=None): if flux_values is None: flux_values = self.modelutl.compute_flux_values_from_variables() output = {"reversed": {}, "new": {}} for reaction in self.model.reactions: if reaction.id in self.gapfilling_penalties: - if flux_values[reaction.id]["forward"] > Zero and "forward" in self.gapfilling_penalties[reaction.id]: + if ( + flux_values[reaction.id]["forward"] > Zero + and "forward" in self.gapfilling_penalties[reaction.id] + ): if "added" in self.gapfilling_penalties[reaction.id]: output["new"][reaction.id] = ">" else: output["reversed"][reaction.id] = ">" - elif flux_values[reaction.id]["reverse"] > Zero and "reverse" in self.gapfilling_penalties[reaction.id]: + elif ( + flux_values[reaction.id]["reverse"] > Zero + and "reverse" in self.gapfilling_penalties[reaction.id] + ): if "added" in self.gapfilling_penalties[reaction.id]: output["new"][reaction.id] = "<" else: diff --git a/modelseedpy/fbapkg/kbasemediapkg.py b/modelseedpy/fbapkg/kbasemediapkg.py index 3d4f9dc7..34d5d04e 100755 --- a/modelseedpy/fbapkg/kbasemediapkg.py +++ b/modelseedpy/fbapkg/kbasemediapkg.py @@ -4,10 +4,11 @@ import logging from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg -from modelseedpy.core.fbahelper import FBAHelper # !!! imported but not used +from modelseedpy.core.fbahelper import FBAHelper # !!! imported but not used logger = logging.getLogger(__name__) + class KBaseMediaPkg(BaseFBAPkg): """ Base class for FBA packages @@ -16,33 +17,39 @@ class KBaseMediaPkg(BaseFBAPkg): def __init__(self, model): BaseFBAPkg.__init__(self, model, "kbase media", {}, {}) - def build_package(self, media_or_parameters, default_uptake=None, default_excretion=None): + def build_package( + self, media_or_parameters, default_uptake=None, default_excretion=None + ): if isinstance(media_or_parameters, dict): - self.validate_parameters(media_or_parameters, [], { - "default_uptake": 0, - "default_excretion": 100, - "media": None - }) + self.validate_parameters( + media_or_parameters, + [], + {"default_uptake": 0, "default_excretion": 100, "media": None}, + ) else: - self.validate_parameters({}, [], { - "default_uptake": default_uptake, - "default_excretion": default_excretion, - "media": media_or_parameters - }) + self.validate_parameters( + {}, + [], + { + "default_uptake": default_uptake, + "default_excretion": default_excretion, + "media": media_or_parameters, + }, + ) if self.parameters["default_uptake"] is None: self.parameters["default_uptake"] = 0 if self.parameters["default_excretion"] is None: - self.parameters["default_excretion"] = 100 + self.parameters["default_excretion"] = 100 if self.parameters["media"] is None and self.parameters["default_uptake"] == 0: self.parameters["default_uptake"] = 100 - - #First initializing all exchanges to default uptake and excretion + + # First initializing all exchanges to default uptake and excretion exchange_list = self.modelutl.exchange_list() for reaction in exchange_list: - reaction.lower_bound = -1*self.parameters["default_uptake"] + reaction.lower_bound = -1 * self.parameters["default_uptake"] reaction.upper_bound = self.parameters["default_excretion"] - - #Now constraining exchanges for specific compounds specified in the media + + # Now constraining exchanges for specific compounds specified in the media if self.parameters["media"]: exchange_hash = self.modelutl.exchange_hash() self.modelutl.build_metabolite_hash() @@ -53,11 +60,21 @@ def build_package(self, media_or_parameters, default_uptake=None, default_excret if met in exchange_hash: exchange_hash[met].lower_bound = -1 * mediacpd.maxFlux exchange_hash[met].upper_bound = -1 * mediacpd.minFlux - if self.pkgmgr != None and "FullThermoPkg" in self.pkgmgr.packages: - logger.info('FullThermo constrained compound: ', met.id) - if met.id in self.variables["logconc"] and met.compartment[0:1] == "e": + if ( + self.pkgmgr != None + and "FullThermoPkg" in self.pkgmgr.packages + ): + logger.info("FullThermo constrained compound: ", met.id) + if ( + met.id in self.variables["logconc"] + and met.compartment[0:1] == "e" + ): if mediacpd.concentration != 0.001: - self.variables["logconc"][met.id].lb = ln(mediacpd.concentration) - self.variables["logconc"][met.id].ub = ln(mediacpd.concentration) + self.variables["logconc"][met.id].lb = ln( + mediacpd.concentration + ) + self.variables["logconc"][met.id].ub = ln( + mediacpd.concentration + ) else: - logger.warn('Media compound: ', mediacpd.id,' not found in model.') \ No newline at end of file + logger.warn("Media compound: ", mediacpd.id, " not found in model.") diff --git a/modelseedpy/fbapkg/metabofbapkg.py b/modelseedpy/fbapkg/metabofbapkg.py index 71e72f8c..0b7441dd 100644 --- a/modelseedpy/fbapkg/metabofbapkg.py +++ b/modelseedpy/fbapkg/metabofbapkg.py @@ -6,54 +6,65 @@ from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg from modelseedpy.fbapkg.simplethermopkg import SimpleThermoPkg -#Base class for FBA packages +# Base class for FBA packages class MetaboFBAPkg(BaseFBAPkg): - def __init__(self,model): - BaseFBAPkg.__init__(self,model,"metabo fba",{"met":"metabolite","pk":"string"},{"metc":"metabolite","pkc":"string"}) + def __init__(self, model): + BaseFBAPkg.__init__( + self, + model, + "metabo fba", + {"met": "metabolite", "pk": "string"}, + {"metc": "metabolite", "pkc": "string"}, + ) self.pkgmgr.addpkgs(["SimpleThermoPkg"]) - def build_package(self,parameters): - self.validate_parameters(parameters,["peaks"],{ - "set_objective":1, - }) + def build_package(self, parameters): + self.validate_parameters( + parameters, + ["peaks"], + { + "set_objective": 1, + }, + ) self.pkgmgr.getpkg("SimpleThermoPkg").build_package() peak_hash = {} for peak_data in peaks: peak_hash[peak_data["id"]] = peak_data self.find_metabolites_matching_peak(peak_data) - self.build_variable(peak_data,"pk") + self.build_variable(peak_data, "pk") for met in peak_data["metabolites"]: - self.build_variable(met,"met") - self.build_constraint(met,"metc") - self.build_constraint(peak_data,"pkc") + self.build_variable(met, "met") + self.build_constraint(met, "metc") + self.build_constraint(peak_data, "pkc") if parameters["set_objective"] == 1: - metabolite_objective = self.model.problem.Objective( - Zero, - direction="max") + metabolite_objective = self.model.problem.Objective(Zero, direction="max") obj_coef = dict() for peak_id in self.variables["pk"]: if "wieght" in peak_hash[peak_id]: - obj_coef[self.variables["pk"][peak_id]] = peak_hash[peak_id]["wieght"] + obj_coef[self.variables["pk"][peak_id]] = peak_hash[peak_id][ + "wieght" + ] else: obj_coef[self.variables["pk"][peak_id]] = 1 self.model.objective = metabolite_objective metabolite_objective.set_linear_coefficients(obj_coef) - - def build_variable(self,object,type): + + def build_variable(self, object, type): if type == "met": - return BaseFBAPkg.build_variable(self,type,0,1,"continuous",object) + return BaseFBAPkg.build_variable(self, type, 0, 1, "continuous", object) elif type == "pk": - return BaseFBAPkg.build_variable(self,type,0,1,"continuous",object["id"]) - - def build_constraint(self,object,type): - #TODO: need to determine coefficients - coef = {self.variables["met"][object.id]:1} + return BaseFBAPkg.build_variable( + self, type, 0, 1, "continuous", object["id"] + ) + + def build_constraint(self, object, type): + # TODO: need to determine coefficients + coef = {self.variables["met"][object.id]: 1} if type == "metc": - return BaseFBAPkg.build_constraint(self,"metc",0,0,coef,object) + return BaseFBAPkg.build_constraint(self, "metc", 0, 0, coef, object) elif type == "pkc": - return BaseFBAPkg.build_constraint(self,"pkc",0,0,coef,object["id"]) - - def find_metabolites_matching_peak(self,data): - #TODO: need to write this function + return BaseFBAPkg.build_constraint(self, "pkc", 0, 0, coef, object["id"]) + + def find_metabolites_matching_peak(self, data): + # TODO: need to write this function pass - \ No newline at end of file diff --git a/modelseedpy/fbapkg/mspackagemanager.py b/modelseedpy/fbapkg/mspackagemanager.py index 92b4be34..dc6d399d 100755 --- a/modelseedpy/fbapkg/mspackagemanager.py +++ b/modelseedpy/fbapkg/mspackagemanager.py @@ -6,22 +6,24 @@ import sys import inspect + class MSPackageManager: """ Class for organizing FBA package objects """ + pkgmgrs = {} - + @staticmethod - def get_pkg_mgr(model,create_if_missing = True): + def get_pkg_mgr(model, create_if_missing=True): if model in MSPackageManager.pkgmgrs: - return MSPackageManager.pkgmgrs[model] + return MSPackageManager.pkgmgrs[model] elif create_if_missing: MSPackageManager.pkgmgrs[model] = MSPackageManager(model) return MSPackageManager.pkgmgrs[model] else: return None - + def __init__(self, model): self.model = model self.packages = {} @@ -29,32 +31,32 @@ def __init__(self, model): for name, obj in inspect.getmembers(sys.modules["modelseedpy"]): if name != "BaseFBAPkg" and name[-3:] == "Pkg": self.available_packages[name] = obj - + def list_available_packages(self): return list(self.available_packages.keys()) - + def list_active_packages(self): return list(self.packages.keys()) - - def addpkgobj(self,object): + + def addpkgobj(self, object): classname = type(object).__name__ if classname not in self.packages: self.packages[classname] = object elif self.packages[classname] != object: - raise PackageError("Package with name "+classname+" already in model!") + raise PackageError("Package with name " + classname + " already in model!") return self.packages[classname] - - def addpkgs(self,packages): + + def addpkgs(self, packages): for package in packages: if package not in self.available_packages: - raise PackageError("Package "+package+" does not exist!") + raise PackageError("Package " + package + " does not exist!") if package not in self.packages: self.packages[package] = self.available_packages[package](self.model) - - def getpkg(self,package,create_if_missing = True): + + def getpkg(self, package, create_if_missing=True): if package not in self.packages: if create_if_missing: self.addpkgs([package]) else: return None - return self.packages[package] \ No newline at end of file + return self.packages[package] diff --git a/modelseedpy/fbapkg/objconstpkg.py b/modelseedpy/fbapkg/objconstpkg.py index 15ec0ec9..de1dc3b5 100644 --- a/modelseedpy/fbapkg/objconstpkg.py +++ b/modelseedpy/fbapkg/objconstpkg.py @@ -5,14 +5,18 @@ import logging from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg -#Base class for FBA packages +# Base class for FBA packages class ObjConstPkg(BaseFBAPkg): - def __init__(self,model): - BaseFBAPkg.__init__(self,model,"objective constraint",{},{"objc":"none"}) - - def build_package(self,lower_bound,upper_bound): - self.build_constraint(lower_bound,upper_bound) - - def build_constraint(self,lower_bound,upper_bound): - coef = self.model.solver.objective.get_linear_coefficients(self.model.solver.objective.variables) - return BaseFBAPkg.build_constraint(self,"objc",lower_bound,upper_bound,coef,None) \ No newline at end of file + def __init__(self, model): + BaseFBAPkg.__init__(self, model, "objective constraint", {}, {"objc": "none"}) + + def build_package(self, lower_bound, upper_bound): + self.build_constraint(lower_bound, upper_bound) + + def build_constraint(self, lower_bound, upper_bound): + coef = self.model.solver.objective.get_linear_coefficients( + self.model.solver.objective.variables + ) + return BaseFBAPkg.build_constraint( + self, "objc", lower_bound, upper_bound, coef, None + ) diff --git a/modelseedpy/fbapkg/problemreplicationpkg.py b/modelseedpy/fbapkg/problemreplicationpkg.py index e7d4dbb9..062abc33 100644 --- a/modelseedpy/fbapkg/problemreplicationpkg.py +++ b/modelseedpy/fbapkg/problemreplicationpkg.py @@ -9,23 +9,25 @@ from modelseedpy.fbapkg.revbinpkg import RevBinPkg from modelseedpy.fbapkg.totalfluxpkg import TotalFluxPkg -#Base class for FBA packages +# Base class for FBA packages class ProblemReplicationPkg(BaseFBAPkg): - def __init__(self,model): - BaseFBAPkg.__init__(self,model,"problem replication",{},{}) - - def build_package(self,parameters): - self.validate_parameters(parameters,["models"],{ - "shared_variable_packages":{} - }) - #First loading shared variables into a hash + def __init__(self, model): + BaseFBAPkg.__init__(self, model, "problem replication", {}, {}) + + def build_package(self, parameters): + self.validate_parameters( + parameters, ["models"], {"shared_variable_packages": {}} + ) + # First loading shared variables into a hash shared_var_hash = {} for pkg in self.parameters["shared_variable_packages"]: for type in self.parameters["shared_variable_packages"][pkg]: if type in pkg.variables: for objid in pkg.variables[type]: - shared_var_hash[pkg.variables[type][objid].name] = pkg.variables[type][objid] - #Now copying over variables and constraints from other models and replacing shared variables + shared_var_hash[ + pkg.variables[type][objid].name + ] = pkg.variables[type][objid] + # Now copying over variables and constraints from other models and replacing shared variables count = 0 for othermdl in self.parameters["models"]: self.constraints[str(count)] = {} @@ -35,10 +37,10 @@ def build_package(self,parameters): for var in othermdl.variables: if var.name not in shared_var_hash: newvar = Variable.clone(var) - newvar.name = var.name+"."+str(count) + newvar.name = var.name + "." + str(count) self.variables[str(count)][var.name] = newvar new_var_hash[var.name] = newvar - newobj.append(newvar) + newobj.append(newvar) self.model.add_cons_vars(newobj) newobj = [] for const in othermdl.constraints: @@ -50,9 +52,12 @@ def build_package(self,parameters): substitutions[var] = new_var_hash[var.name] expression = const.expression.xreplace(substitutions) newconst = self.model.problem.Constraint( - expression,lb=const.lb,ub=const.ub,name=const.name+"."+str(count) + expression, + lb=const.lb, + ub=const.ub, + name=const.name + "." + str(count), ) self.constraints[str(count)][const.name] = newconst - newobj.append(newconst) + newobj.append(newconst) self.model.add_cons_vars(newobj) - count += 1 \ No newline at end of file + count += 1 diff --git a/modelseedpy/fbapkg/proteomefittingpkg.py b/modelseedpy/fbapkg/proteomefittingpkg.py index 3a86f3c6..469efc08 100644 --- a/modelseedpy/fbapkg/proteomefittingpkg.py +++ b/modelseedpy/fbapkg/proteomefittingpkg.py @@ -9,100 +9,156 @@ from modelseedpy.core.fbahelper import FBAHelper from modelseedpy.multiomics.msexpression import MSExpression, GENOME, MODEL, COLUMN_NORM -#Options for default behavior +# Options for default behavior LOWEST = 10 -#Base class for FBA packages +# Base class for FBA packages class ProteomeFittingPkg(BaseFBAPkg): - def __init__(self,model): - BaseFBAPkg.__init__(self,model,"proteome fitting",{"kapp":"reaction","kvfit":"reaction","kfit":"reaction"},{"vkapp":"reaction","kfitc":"reaction"}) + def __init__(self, model): + BaseFBAPkg.__init__( + self, + model, + "proteome fitting", + {"kapp": "reaction", "kvfit": "reaction", "kfit": "reaction"}, + {"vkapp": "reaction", "kfitc": "reaction"}, + ) self.pkgmgr.addpkgs(["FluxFittingPkg"]) - - def build_package(self,parameters): - self.validate_parameters(parameters,["proteome","condition"],{ - "flux_values":{}, - "kcat_values":{}, - "prot_coef" : 0.1, - "totalflux" : 1, - "kcat_coef" : 0.333, - "obj_kfit":1, - "obj_kvfit":1, - "obj_vfit":1, - "set_objective":1, - "rescale_vfit_by_flux":True, - "default_rescaling":0.1, - "default_expression":LOWEST - }) + + def build_package(self, parameters): + self.validate_parameters( + parameters, + ["proteome", "condition"], + { + "flux_values": {}, + "kcat_values": {}, + "prot_coef": 0.1, + "totalflux": 1, + "kcat_coef": 0.333, + "obj_kfit": 1, + "obj_kvfit": 1, + "obj_vfit": 1, + "set_objective": 1, + "rescale_vfit_by_flux": True, + "default_rescaling": 0.1, + "default_expression": LOWEST, + }, + ) objvars = [] - #Converting genome proteome to reaction proteome if necessary + # Converting genome proteome to reaction proteome if necessary if self.parameters["proteome"].type == GENOME: - self.parameters["proteome"] = self.parameters["proteome"].build_reaction_expression(self.model,self.parameters["default_expression"]) - #Checking for condition in proteome and converting condition string to object if necessary - if isinstance(self.parameters["condition"],str): - if self.parameters["condition"] not in self.parameters["proteome"].conditions: - logger.critical("Condition "+self.parameters["condition"]+" not found in proteome!") - self.parameters["condition"] = self.parameters["proteome"].conditions.get_by_id(self.parameters["condition"]) - #Adding flux fitting variables and constraints - self.pkgmgr.getpkg("FluxFittingPkg").build_package({ - "target_flux":self.parameters["flux_values"], - "totalflux":self.parameters["totalflux"], - "rescale_vfit_by_flux":self.parameters["rescale_vfit_by_flux"], - "default_rescaling":self.parameters["default_rescaling"], - "set_objective":0 - }) + self.parameters["proteome"] = self.parameters[ + "proteome" + ].build_reaction_expression( + self.model, self.parameters["default_expression"] + ) + # Checking for condition in proteome and converting condition string to object if necessary + if isinstance(self.parameters["condition"], str): + if ( + self.parameters["condition"] + not in self.parameters["proteome"].conditions + ): + logger.critical( + "Condition " + + self.parameters["condition"] + + " not found in proteome!" + ) + self.parameters["condition"] = self.parameters[ + "proteome" + ].conditions.get_by_id(self.parameters["condition"]) + # Adding flux fitting variables and constraints + self.pkgmgr.getpkg("FluxFittingPkg").build_package( + { + "target_flux": self.parameters["flux_values"], + "totalflux": self.parameters["totalflux"], + "rescale_vfit_by_flux": self.parameters["rescale_vfit_by_flux"], + "default_rescaling": self.parameters["default_rescaling"], + "set_objective": 0, + } + ) self.pkgmgr.getpkg("TotalFluxPkg").build_package() for rxnid in self.pkgmgr.getpkg("FluxFittingPkg").variables["vfit"]: - objvars.append(self.parameters["obj_vfit"] * self.pkgmgr.getpkg("FluxFittingPkg").variables["vfit"][rxnid] ** 2) - #Adding proteome fitting variables and constraints + objvars.append( + self.parameters["obj_vfit"] + * self.pkgmgr.getpkg("FluxFittingPkg").variables["vfit"][rxnid] ** 2 + ) + # Adding proteome fitting variables and constraints for rxnobj in self.model.reactions: - #Only make constraints and variables if reaction is in the proteome + # Only make constraints and variables if reaction is in the proteome if rxnobj.id in self.parameters["proteome"].features: - self.build_variable(rxnobj,"kapp") - var = self.build_variable(rxnobj,"kvfit") - objvars.append(self.parameters["obj_kvfit"] * var ** 2) - const = self.build_constraint(rxnobj,"vkapp") - #Adding kcat fitting variables and constraints + self.build_variable(rxnobj, "kapp") + var = self.build_variable(rxnobj, "kvfit") + objvars.append(self.parameters["obj_kvfit"] * var**2) + const = self.build_constraint(rxnobj, "vkapp") + # Adding kcat fitting variables and constraints for rxnid in self.parameters["kcat_values"]: for rxnobj in self.model.reactions: if rxnid == FBAHelper.modelseed_id_from_cobra_reaction(rxnobj): if rxnobj.id not in self.variables["kapp"]: - self.build_variable(rxnobj,"kapp") - var = self.build_variable(rxnobj,"kfit") - const = self.build_constraint(rxnobj,"kfitc") - objvars.append(self.parameters["obj_kfit"] * var ** 2) - #Creating objective function + self.build_variable(rxnobj, "kapp") + var = self.build_variable(rxnobj, "kfit") + const = self.build_constraint(rxnobj, "kfitc") + objvars.append(self.parameters["obj_kfit"] * var**2) + # Creating objective function if self.parameters["set_objective"] == 1: - self.model.objective = self.model.problem.Objective(add(objvars), direction="min", sloppy=True) - - def build_variable(self,object,type): + self.model.objective = self.model.problem.Objective( + add(objvars), direction="min", sloppy=True + ) + + def build_variable(self, object, type): if type == "kapp": - return BaseFBAPkg.build_variable(self,type,-1000000,1000000,"continuous",object) + return BaseFBAPkg.build_variable( + self, type, -1000000, 1000000, "continuous", object + ) if type == "kvfit": - return BaseFBAPkg.build_variable(self,type,-1000,1000,"continuous",object) + return BaseFBAPkg.build_variable( + self, type, -1000, 1000, "continuous", object + ) elif type == "kfit": - return BaseFBAPkg.build_variable(self,type,-1000000,1000000,"continuous",object) - - def build_constraint(self,object,type): + return BaseFBAPkg.build_variable( + self, type, -1000000, 1000000, "continuous", object + ) + + def build_constraint(self, object, type): if type == "vkapp" and object.id in self.parameters["proteome"].features: - #kvfit(i) = kapp(i)*ProtCoef*Prot(i) - v(i) - #Pulling expression value for selected condition and reaction - expval = self.parameters["proteome"].get_value(object.id,self.parameters["condition"],COLUMN_NORM) + # kvfit(i) = kapp(i)*ProtCoef*Prot(i) - v(i) + # Pulling expression value for selected condition and reaction + expval = self.parameters["proteome"].get_value( + object.id, self.parameters["condition"], COLUMN_NORM + ) if expval is None and self.parameters["default_expression"] is not None: if self.parameters["default_expression"] == LOWEST: - expval = self.parameters["condition"].lowest/self.parameters["condition"].column_sum + expval = ( + self.parameters["condition"].lowest + / self.parameters["condition"].column_sum + ) if expval is not None: - prot = expval*self.parameters["prot_coef"] - if object.id in self.variables["kvfit"] and object.id in self.variables["kapp"]: - coef = {self.variables["kvfit"][object.id]:1,self.variables["kapp"][object.id]:-1*prot} + prot = expval * self.parameters["prot_coef"] + if ( + object.id in self.variables["kvfit"] + and object.id in self.variables["kapp"] + ): + coef = { + self.variables["kvfit"][object.id]: 1, + self.variables["kapp"][object.id]: -1 * prot, + } if self.parameters["totalflux"] == 1: - coef[self.pkgmgr.getpkg("TotalFluxPkg").variables["tf"][object.id]] = 1 + coef[ + self.pkgmgr.getpkg("TotalFluxPkg").variables["tf"][ + object.id + ] + ] = 1 else: coef[object.forward_variable] = 1 coef[object.reverse_variable] = 1 - return BaseFBAPkg.build_constraint(self,type,0,0,coef,object) + return BaseFBAPkg.build_constraint(self, type, 0, 0, coef, object) elif type == "kfitc": - #kfit(i) = kapp(i) - kcoef*kcat(i) + # kfit(i) = kapp(i) - kcoef*kcat(i) msid = FBAHelper.modelseed_id_from_cobra_reaction(object) - rhs = -1*self.parameters["kcat_values"][msid]*self.parameters["kcat_coef"] - coef = {self.variables["kfit"][object.id]:1,self.variables["kapp"][object.id]:-1} - return BaseFBAPkg.build_constraint(self,type,rhs,rhs,coef,object) + rhs = ( + -1 * self.parameters["kcat_values"][msid] * self.parameters["kcat_coef"] + ) + coef = { + self.variables["kfit"][object.id]: 1, + self.variables["kapp"][object.id]: -1, + } + return BaseFBAPkg.build_constraint(self, type, rhs, rhs, coef, object) diff --git a/modelseedpy/fbapkg/reactionusepkg.py b/modelseedpy/fbapkg/reactionusepkg.py index 5af5f23f..f3e17bc9 100644 --- a/modelseedpy/fbapkg/reactionusepkg.py +++ b/modelseedpy/fbapkg/reactionusepkg.py @@ -2,66 +2,129 @@ from __future__ import absolute_import import logging + logger = logging.getLogger(__name__) from optlang.symbolics import Zero, add # !!! add is never used from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg from modelseedpy.core.fbahelper import FBAHelper -#Base class for FBA packages +# Base class for FBA packages class ReactionUsePkg(BaseFBAPkg): - def __init__(self,model): - BaseFBAPkg.__init__(self,model,"reaction use",{"fu":"reaction","ru":"reaction"},{"fu":"reaction","ru":"reaction","exclusion":"none","urev":"reaction"}) + def __init__(self, model): + BaseFBAPkg.__init__( + self, + model, + "reaction use", + {"fu": "reaction", "ru": "reaction"}, + { + "fu": "reaction", + "ru": "reaction", + "exclusion": "none", + "urev": "reaction", + }, + ) def build_package(self, rxn_filter=None, reversibility=False): for rxn in self.model.reactions: - #Checking that reaction passes input filter if one is provided + # Checking that reaction passes input filter if one is provided if rxn_filter == None: - self.build_variable(rxn,"=") - self.build_constraint(rxn,reversibility) + self.build_variable(rxn, "=") + self.build_constraint(rxn, reversibility) elif rxn.id in rxn_filter: - self.build_variable(rxn,rxn_filter[rxn.id]) - self.build_constraint(rxn,reversibility) - - def build_variable(self,cobra_obj,direction): + self.build_variable(rxn, rxn_filter[rxn.id]) + self.build_constraint(rxn, reversibility) + + def build_variable(self, cobra_obj, direction): variable = None - if (direction == ">" or direction == "=") and cobra_obj.upper_bound > 0 and cobra_obj.id not in self.variables["fu"]: - variable = BaseFBAPkg.build_variable(self,"fu",0,1,"binary",cobra_obj) - if (direction == "<" or direction == "=") and cobra_obj.lower_bound < 0 and cobra_obj.id not in self.variables["ru"]: - variable = BaseFBAPkg.build_variable(self,"ru",0,1,"binary",cobra_obj) + if ( + (direction == ">" or direction == "=") + and cobra_obj.upper_bound > 0 + and cobra_obj.id not in self.variables["fu"] + ): + variable = BaseFBAPkg.build_variable(self, "fu", 0, 1, "binary", cobra_obj) + if ( + (direction == "<" or direction == "=") + and cobra_obj.lower_bound < 0 + and cobra_obj.id not in self.variables["ru"] + ): + variable = BaseFBAPkg.build_variable(self, "ru", 0, 1, "binary", cobra_obj) return variable - - def build_constraint(self,cobra_obj,reversibility): + + def build_constraint(self, cobra_obj, reversibility): constraint = None - if cobra_obj.id not in self.constraints["fu"] and cobra_obj.id in self.variables["fu"]: - constraint = BaseFBAPkg.build_constraint(self, "fu" ,0 ,None ,{ - self.variables["fu"][cobra_obj.id]:1000, cobra_obj.forward_variable:-1}, cobra_obj) - if cobra_obj.id not in self.constraints["ru"] and cobra_obj.id in self.variables["ru"]: - constraint = BaseFBAPkg.build_constraint(self, "ru", 0, None,{ - self.variables["ru"][cobra_obj.id]:1000, cobra_obj.reverse_variable:-1}, cobra_obj) - if all([reversibility, cobra_obj.id in self.variables["ru"], cobra_obj.id in self.variables["fu"]]): - constraint = BaseFBAPkg.build_constraint(self,"urev",None,1,{ - self.variables["ru"][cobra_obj.id]:1, self.variables["fu"][cobra_obj.id]:1}, cobra_obj) + if ( + cobra_obj.id not in self.constraints["fu"] + and cobra_obj.id in self.variables["fu"] + ): + constraint = BaseFBAPkg.build_constraint( + self, + "fu", + 0, + None, + { + self.variables["fu"][cobra_obj.id]: 1000, + cobra_obj.forward_variable: -1, + }, + cobra_obj, + ) + if ( + cobra_obj.id not in self.constraints["ru"] + and cobra_obj.id in self.variables["ru"] + ): + constraint = BaseFBAPkg.build_constraint( + self, + "ru", + 0, + None, + { + self.variables["ru"][cobra_obj.id]: 1000, + cobra_obj.reverse_variable: -1, + }, + cobra_obj, + ) + if all( + [ + reversibility, + cobra_obj.id in self.variables["ru"], + cobra_obj.id in self.variables["fu"], + ] + ): + constraint = BaseFBAPkg.build_constraint( + self, + "urev", + None, + 1, + { + self.variables["ru"][cobra_obj.id]: 1, + self.variables["fu"][cobra_obj.id]: 1, + }, + cobra_obj, + ) return constraint - + def build_exclusion_constraint(self, flux_values=None): - flux_values = flux_values or FBAHelper.compute_flux_values_from_variables(self.model) + flux_values = flux_values or FBAHelper.compute_flux_values_from_variables( + self.model + ) count = len(self.constraints["exclusion"]) solution_coef = {} - solution_size = 0 + solution_size = 0 for rxnid, flux in flux_values.items(): if flux > Zero: solution_size += 1 solution_coef[self.variables["fu"][rxnid]] = 1 - elif flux < -1*Zero: + elif flux < -1 * Zero: solution_size += 1 - solution_coef[self.variables["ru"][rxnid]] = 1 + solution_coef[self.variables["ru"][rxnid]] = 1 if len(solution_coef) > 0: - const_name = "exclusion."+str(count+1) + const_name = "exclusion." + str(count + 1) self.constraints["exclusion"][const_name] = self.model.problem.Constraint( - Zero,lb=None,ub=(solution_size-1),name=const_name + Zero, lb=None, ub=(solution_size - 1), name=const_name ) self.model.add_cons_vars(self.constraints["exclusion"][const_name]) self.model.solver.update() - self.constraints["exclusion"][const_name].set_linear_coefficients(solution_coef) + self.constraints["exclusion"][const_name].set_linear_coefficients( + solution_coef + ) return self.constraints["exclusion"][const_name] return None diff --git a/modelseedpy/fbapkg/revbinpkg.py b/modelseedpy/fbapkg/revbinpkg.py index e7312527..99d70779 100644 --- a/modelseedpy/fbapkg/revbinpkg.py +++ b/modelseedpy/fbapkg/revbinpkg.py @@ -5,23 +5,43 @@ import logging from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg -#Base class for FBA packages +# Base class for FBA packages class RevBinPkg(BaseFBAPkg): - def __init__(self,model): - BaseFBAPkg.__init__(self,model,"reversible binary",{"revbin":"reaction"},{"revbinF":"reaction","revbinR":"reaction"}) + def __init__(self, model): + BaseFBAPkg.__init__( + self, + model, + "reversible binary", + {"revbin": "reaction"}, + {"revbinF": "reaction", "revbinR": "reaction"}, + ) - def build_package(self,filter = None): + def build_package(self, filter=None): for reaction in self.model.reactions: - #Checking that reaction passes input filter if one is provided + # Checking that reaction passes input filter if one is provided if filter == None or reaction.id in filter: self.build_variable(reaction) self.build_constraint(reaction) - - def build_variable(self,object): - return BaseFBAPkg.build_variable(self,"revbin",0,1,"binary",object) - - def build_constraint(self,object): - #-1000 * revbin(i) + forv(i) <= 0 - BaseFBAPkg.build_constraint(self,"revbinF",None,0,{self.variables["revbin"][object.id]:-1000,object.forward_variable:1},object) - #1000 * revbin(i) + revv(i) <= 1000 - return BaseFBAPkg.build_constraint(self,"revbinR",None,1000,{self.variables["revbin"][object.id]:1000,object.reverse_variable:1},object) \ No newline at end of file + + def build_variable(self, object): + return BaseFBAPkg.build_variable(self, "revbin", 0, 1, "binary", object) + + def build_constraint(self, object): + # -1000 * revbin(i) + forv(i) <= 0 + BaseFBAPkg.build_constraint( + self, + "revbinF", + None, + 0, + {self.variables["revbin"][object.id]: -1000, object.forward_variable: 1}, + object, + ) + # 1000 * revbin(i) + revv(i) <= 1000 + return BaseFBAPkg.build_constraint( + self, + "revbinR", + None, + 1000, + {self.variables["revbin"][object.id]: 1000, object.reverse_variable: 1}, + object, + ) diff --git a/modelseedpy/fbapkg/simplethermopkg.py b/modelseedpy/fbapkg/simplethermopkg.py index 7114ef70..439bd2b7 100644 --- a/modelseedpy/fbapkg/simplethermopkg.py +++ b/modelseedpy/fbapkg/simplethermopkg.py @@ -6,99 +6,133 @@ from optlang.symbolics import Zero import re -#Base class for FBA packages +# Base class for FBA packages class SimpleThermoPkg(BaseFBAPkg): - def __init__(self,model): - BaseFBAPkg.__init__(self,model,"simple thermo",{"potential":"metabolite", 'dgbinF': 'reaction', 'dgbinR':'reaction'},{"thermo":"reaction"}) + def __init__(self, model): + BaseFBAPkg.__init__( + self, + model, + "simple thermo", + {"potential": "metabolite", "dgbinF": "reaction", "dgbinR": "reaction"}, + {"thermo": "reaction"}, + ) self.pkgmgr.addpkgs(["RevBinPkg"]) - - def build_package(self,parameters): - self.validate_parameters(parameters,[],{ - "filter":None, - "min_potential":0, - "max_potential":1000, - "dgbin": False, - 'reduced_constraints': False - }) + + def build_package(self, parameters): + self.validate_parameters( + parameters, + [], + { + "filter": None, + "min_potential": 0, + "max_potential": 1000, + "dgbin": False, + "reduced_constraints": False, + }, + ) self.pkgmgr.getpkg("RevBinPkg").build_package(self.parameters["filter"]) for metabolite in self.model.metabolites: self.build_variable(metabolite) for reaction in self.model.reactions: - if reaction.id[:3] not in ['EX_', 'SK_', 'DM_']: - # determine the range of Delta_rG values + if reaction.id[:3] not in ["EX_", "SK_", "DM_"]: + # determine the range of Delta_rG values objective_coefficient = {} for metabolite in reaction.metabolites: - objective_coefficient[self.variables['potential'][metabolite.id]] = reaction.metabolites[metabolite] + objective_coefficient[ + self.variables["potential"][metabolite.id] + ] = reaction.metabolites[metabolite] # define the maximum progression - self.model.objective = self.model.problem.Objective(Zero, direction='max') + self.model.objective = self.model.problem.Objective( + Zero, direction="max" + ) self.model.objective.set_linear_coefficients(objective_coefficient) solution = self.model.optimize() max_value = solution.objective_value # define the minimum progression - self.model.objective = self.model.problem.Objective(Zero,direction='min') + self.model.objective = self.model.problem.Objective( + Zero, direction="min" + ) self.model.objective.set_linear_coefficients(objective_coefficient) solution = self.model.optimize() min_value = solution.objective_value # determine the maximum Delta_rG magnitude reaction_energy_range = [min_value, max_value] - max_energy_magnitude = max(abs(energy) for energy in reaction_energy_range) + max_energy_magnitude = max( + abs(energy) for energy in reaction_energy_range + ) # build constraints for the filtered reactions - if self.parameters["filter"] == None or reaction.id in self.parameters["filter"]: + if ( + self.parameters["filter"] == None + or reaction.id in self.parameters["filter"] + ): self.build_constraint(reaction, max_energy_magnitude) - if self.parameters['dgbin']: + if self.parameters["dgbin"]: # define the model objective as the sum of the dgbin variables self.optimize_dgbin() - - def build_variable(self,object): - return BaseFBAPkg.build_variable(self,"potential",self.parameters["min_potential"],self.parameters["max_potential"],"continuous",object) - - def build_constraint(self,object, max_energy_magnitude): + + def build_variable(self, object): + return BaseFBAPkg.build_variable( + self, + "potential", + self.parameters["min_potential"], + self.parameters["max_potential"], + "continuous", + object, + ) + + def build_constraint(self, object, max_energy_magnitude): # Gibbs: dg = Sum(st(i,j)*p(j)) # 0 <= max_energy_magnitude*revbin(i) - max_energy_magnitude*dgbinR + max_energy_magnitude*dgbinF + Sum(st(i,j)*p(j)) <= max_energy_magnitude coef = {} for metabolite in object.metabolites: - coef[self.variables["potential"][metabolite.id]] = object.metabolites[metabolite] - - if not self.parameters['reduced_constraints']: - coef[self.pkgmgr.getpkg("RevBinPkg").variables["revbin"][object.id]] = max_energy_magnitude - if self.parameters['dgbin']: + coef[self.variables["potential"][metabolite.id]] = object.metabolites[ + metabolite + ] + + if not self.parameters["reduced_constraints"]: + coef[ + self.pkgmgr.getpkg("RevBinPkg").variables["revbin"][object.id] + ] = max_energy_magnitude + if self.parameters["dgbin"]: # build the dgbin variables - BaseFBAPkg.build_variable(self,"dgbinF",0,1,"binary",object) - BaseFBAPkg.build_variable(self,"dgbinR",0,1,"binary",object) + BaseFBAPkg.build_variable(self, "dgbinF", 0, 1, "binary", object) + BaseFBAPkg.build_variable(self, "dgbinR", 0, 1, "binary", object) # define the dgbin coefficients - coef[self.variables['dgbinF'][object.id]] = max_energy_magnitude - coef[self.variables['dgbinR'][object.id]] = -max_energy_magnitude - + coef[self.variables["dgbinF"][object.id]] = max_energy_magnitude + coef[self.variables["dgbinR"][object.id]] = -max_energy_magnitude + # build the constraint - built_constraint = BaseFBAPkg.build_constraint(self,"thermo",0,max_energy_magnitude,coef,object) + built_constraint = BaseFBAPkg.build_constraint( + self, "thermo", 0, max_energy_magnitude, coef, object + ) else: built_constraint = None - + return built_constraint - + def optimize_dgbin(self): # create the sum of dgbin variables dgbin_sum_coef = {} - for reaction in self.variables['dgbinF']: - print(f'{self.model.solver.status} status for {reaction}') + for reaction in self.variables["dgbinF"]: + print(f"{self.model.solver.status} status for {reaction}") try: - dgbin_sum_coef[self.variables['dgbinF'][reaction].primal] = 1 + dgbin_sum_coef[self.variables["dgbinF"][reaction].primal] = 1 except: - print('--> ERROR: The simulation lack a solution.') - for reaction in self.variables['dgbinR']: - print(f'{self.model.solver.status} status for {reaction}') + print("--> ERROR: The simulation lack a solution.") + for reaction in self.variables["dgbinR"]: + print(f"{self.model.solver.status} status for {reaction}") try: - dgbin_sum_coef[self.variables['dgbinR'][reaction].primal] = 1 + dgbin_sum_coef[self.variables["dgbinR"][reaction].primal] = 1 except: - print('--> ERROR: The simulation lack a solution.') - + print("--> ERROR: The simulation lack a solution.") + # set the dgbin sum as the model objective - self.model.objective = self.model.problem.Objective(Zero,direction='max') - self.model.objective.set_linear_coefficients(dgbin_sum_coef) \ No newline at end of file + self.model.objective = self.model.problem.Objective(Zero, direction="max") + self.model.objective.set_linear_coefficients(dgbin_sum_coef) diff --git a/modelseedpy/fbapkg/totalfluxpkg.py b/modelseedpy/fbapkg/totalfluxpkg.py index 98a9fc45..b8eb87c8 100644 --- a/modelseedpy/fbapkg/totalfluxpkg.py +++ b/modelseedpy/fbapkg/totalfluxpkg.py @@ -9,25 +9,36 @@ from cobra.core import Gene, Metabolite, Model, Reaction from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg -#Adding a few exception classes to handle different types of errors +# Adding a few exception classes to handle different types of errors class FeasibilityError(Exception): """Error in FBA formulation""" + pass -#Base class for FBA packages + +# Base class for FBA packages class TotalFluxPkg(BaseFBAPkg): - def __init__(self,model): - BaseFBAPkg.__init__(self,model,"totalflux",{"tf":"reaction"},{"tf":"reaction"}) - - def build_package(self,reaction_filter = None,upper_bound = 100): + def __init__(self, model): + BaseFBAPkg.__init__( + self, model, "totalflux", {"tf": "reaction"}, {"tf": "reaction"} + ) + + def build_package(self, reaction_filter=None, upper_bound=100): for reaction in self.model.reactions: - #Checking that variable has not yet been created + # Checking that variable has not yet been created if reaction.id not in self.variables["tf"]: - #Checking that reaction passes input filter if one is provided + # Checking that reaction passes input filter if one is provided if reaction_filter == None or reaction.id in reaction_filter: - self.variables["tf"][reaction.id] = self.model.problem.Variable(reaction.id+"_tf", lb=0,ub=upper_bound) + self.variables["tf"][reaction.id] = self.model.problem.Variable( + reaction.id + "_tf", lb=0, ub=upper_bound + ) self.model.add_cons_vars(self.variables["tf"][reaction.id]) self.constraints["tf"][reaction.id] = self.model.problem.Constraint( - reaction.forward_variable + reaction.reverse_variable - self.variables["tf"][reaction.id],lb=0,ub=0,name=reaction.id+"_tf" + reaction.forward_variable + + reaction.reverse_variable + - self.variables["tf"][reaction.id], + lb=0, + ub=0, + name=reaction.id + "_tf", ) - self.model.add_cons_vars(self.constraints["tf"][reaction.id]) \ No newline at end of file + self.model.add_cons_vars(self.constraints["tf"][reaction.id]) diff --git a/modelseedpy/helpers.py b/modelseedpy/helpers.py index aed9b6fd..a721970f 100755 --- a/modelseedpy/helpers.py +++ b/modelseedpy/helpers.py @@ -7,22 +7,22 @@ logger = logging.getLogger(__name__) -project_dir = os.path.abspath(os.path.dirname(__file__)) + '/' +project_dir = os.path.abspath(os.path.dirname(__file__)) + "/" config = ConfigParser() -config.read(project_dir + '/config.cfg') +config.read(project_dir + "/config.cfg") def get_or_download_file(filename, k, value, config): - folder_path = f'{project_dir}/' + config.get(k, value) - file_path = f'{folder_path}/{filename}' + folder_path = f"{project_dir}/" + config.get(k, value) + file_path = f"{folder_path}/{filename}" if not os.path.exists(folder_path): - logger.warning('mkdir: %s', folder_path) + logger.warning("mkdir: %s", folder_path) os.makedirs(folder_path) if not os.path.exists(file_path): - logger.warning('downloading data file to: %s', file_path) - url = 'https://bioseed.mcs.anl.gov/~fxliu/modelseedpy/' + filename + logger.warning("downloading data file to: %s", file_path) + url = "https://bioseed.mcs.anl.gov/~fxliu/modelseedpy/" + filename r = requests.get(url, allow_redirects=True) - with open(file_path, 'wb') as fh: + with open(file_path, "wb") as fh: fh.write(r.content) return file_path @@ -33,17 +33,20 @@ def get_file(filename, k, value): def get_classifier(classifier_id): from modelseedpy.core.msgenomeclassifier import MSGenomeClassifier - cls_pickle = get_file(f'{classifier_id}.pickle', 'data', 'classifier_folder') - cls_features = get_file(f'{classifier_id}_features.json', 'data', 'classifier_folder') - with open(cls_pickle, 'rb') as fh: + + cls_pickle = get_file(f"{classifier_id}.pickle", "data", "classifier_folder") + cls_features = get_file( + f"{classifier_id}_features.json", "data", "classifier_folder" + ) + with open(cls_pickle, "rb") as fh: model_filter = pickle.load(fh) - with open(cls_features, 'r') as fh: + with open(cls_features, "r") as fh: features = json.load(fh) return MSGenomeClassifier(model_filter, features) def get_template(template_id): # we need a mstemplate object! - template_file = get_file(f'{template_id}.json', 'data', 'template_folder') - with open(template_file, 'r') as fh: + template_file = get_file(f"{template_id}.json", "data", "template_folder") + with open(template_file, "r") as fh: return json.load(fh) diff --git a/modelseedpy/ml/build_classifier.py b/modelseedpy/ml/build_classifier.py index 77eeddd2..a4fee193 100755 --- a/modelseedpy/ml/build_classifier.py +++ b/modelseedpy/ml/build_classifier.py @@ -19,15 +19,15 @@ def unload_training_set(training_set_object): training set to use for app """ - phenotype = training_set_object[0]['data']["classification_type"] - classes_sorted = training_set_object[0]['data']["classes"] + phenotype = training_set_object[0]["data"]["classification_type"] + classes_sorted = training_set_object[0]["data"]["classes"] class_enumeration = {} # {'N': 0, 'P': 1} for index, _class in enumerate(classes_sorted): class_enumeration[_class] = index - training_set_object_data = training_set_object[0]['data']['classification_data'] - training_set_object_reference = training_set_object[0]['path'][0] + training_set_object_data = training_set_object[0]["data"]["classification_data"] + training_set_object_reference = training_set_object[0]["path"][0] _names = [] _references = [] @@ -42,10 +42,14 @@ def unload_training_set(training_set_object): _enumeration = class_enumeration[genome["genome_classification"]] _phenotype_enumeration.append(_enumeration) - uploaded_df = pd.DataFrame(data={ "Genome Name": _names, - "Genome Reference": _references, - "Phenotype": _phenotypes, - "Phenotype Enumeration": _phenotype_enumeration}) + uploaded_df = pd.DataFrame( + data={ + "Genome Name": _names, + "Genome Reference": _references, + "Phenotype": _phenotypes, + "Phenotype Enumeration": _phenotype_enumeration, + } + ) return phenotype, class_enumeration, uploaded_df, training_set_object_reference @@ -53,15 +57,20 @@ def unload_training_set(training_set_object): def save_classifier(scratch, folder_name, file_name, dfu_utils, classifier, x, y): import os import pickle + with open(os.path.join(scratch, folder_name, "data", file_name), "wb") as fh: main_clf = classifier.fit(x, y) pickle.dump(main_clf, fh, protocol=2) - shock_id, handle_id = dfu_utils._upload_to_shock(os.path.join(scratch, folder_name, "data", file_name)) + shock_id, handle_id = dfu_utils._upload_to_shock( + os.path.join(scratch, folder_name, "data", file_name) + ) return shock_id, handle_id -def execute_classifier(current_ws, common_classifier_information, current_classifier_object, folder_name): +def execute_classifier( + current_ws, common_classifier_information, current_classifier_object, folder_name +): """ Creates k=splits number of classifiers and then generates a confusion matrix that averages over the predicted results for all of the classifiers. @@ -94,19 +103,31 @@ def execute_classifier(current_ws, common_classifier_information, current_classi classifier = current_classifier_object["classifier_to_execute"] for c in range(common_classifier_information["splits"]): - X_train = common_classifier_information["whole_X"][common_classifier_information["list_train_index"][c]] - y_train = common_classifier_information["whole_Y"][common_classifier_information["list_train_index"][c]] - X_test = common_classifier_information["whole_X"][common_classifier_information["list_test_index"][c]] - y_test = common_classifier_information["whole_Y"][common_classifier_information["list_test_index"][c]] + X_train = common_classifier_information["whole_X"][ + common_classifier_information["list_train_index"][c] + ] + y_train = common_classifier_information["whole_Y"][ + common_classifier_information["list_train_index"][c] + ] + X_test = common_classifier_information["whole_X"][ + common_classifier_information["list_test_index"][c] + ] + y_test = common_classifier_information["whole_Y"][ + common_classifier_information["list_test_index"][c] + ] # do class reweighting specifically for GaussianNB¶ - if current_classifier_object['classifier_type'] == "gaussian_nb": + if current_classifier_object["classifier_type"] == "gaussian_nb": # https://datascience.stackexchange.com/questions/13490/how-to-set-class-weights-for-imbalanced-classes-in-keras unique_classes = np.unique(y_train) - class_weights = class_weight.compute_class_weight('balanced', unique_classes, y_train) - - dict_class_to_weight = {curr_class: curr_weight for curr_class, curr_weight in - zip(unique_classes, class_weights)} + class_weights = class_weight.compute_class_weight( + "balanced", unique_classes, y_train + ) + + dict_class_to_weight = { + curr_class: curr_weight + for curr_class, curr_weight in zip(unique_classes, class_weights) + } sample_weight = [dict_class_to_weight[curr_class] for curr_class in y_train] classifier.fit(X_train, y_train, sample_weight=sample_weight) @@ -115,9 +136,12 @@ def execute_classifier(current_ws, common_classifier_information, current_classi y_pred = classifier.predict(X_test) - cnf = confusion_matrix(y_test, y_pred, - labels=list(common_classifier_information["class_list_mapping"].values())) - cnf_f = cnf.astype('float') / cnf.sum(axis=1)[:, np.newaxis] + cnf = confusion_matrix( + y_test, + y_pred, + labels=list(common_classifier_information["class_list_mapping"].values()), + ) + cnf_f = cnf.astype("float") / cnf.sum(axis=1)[:, np.newaxis] for i in range(len(cnf)): for j in range(len(cnf)): cnf_matrix_proportion[i][j] += cnf_f[i][j] @@ -125,7 +149,9 @@ def execute_classifier(current_ws, common_classifier_information, current_classi # get statistics for the last case made # diagonal entries of cm are the accuracies of each class target_names = list(common_classifier_information["class_list_mapping"].keys()) - classification_report_dict = classification_report(y_test, y_pred, target_names=target_names, output_dict=True) + classification_report_dict = classification_report( + y_test, y_pred, target_names=target_names, output_dict=True + ) # save down classifier object in pickle format # no more saving! @@ -138,19 +164,21 @@ def execute_classifier(current_ws, common_classifier_information, current_classi """ classifier_object = { - 'classifier_id': '', - 'classifier_type': current_classifier_object["classifier_type"], - 'classifier_name': current_classifier_object["classifier_name"], - 'classifier_data': '', # saved in shock + "classifier_id": "", + "classifier_type": current_classifier_object["classifier_type"], + "classifier_name": current_classifier_object["classifier_name"], + "classifier_data": "", # saved in shock # 'classifier_handle_ref': handle_id, - 'classifier_description': common_classifier_information["description"], - 'lib_name': 'sklearn', - 'attribute_type': common_classifier_information["attribute_type"], - 'number_of_attributes': len(common_classifier_information["attribute_data"]), # size of master_role_list - 'attribute_data': common_classifier_information["attribute_data"], - 'class_list_mapping': common_classifier_information["class_list_mapping"], - 'number_of_genomes': len(common_classifier_information["whole_Y"]), - 'training_set_ref': common_classifier_information["training_set_ref"] + "classifier_description": common_classifier_information["description"], + "lib_name": "sklearn", + "attribute_type": common_classifier_information["attribute_type"], + "number_of_attributes": len( + common_classifier_information["attribute_data"] + ), # size of master_role_list + "attribute_data": common_classifier_information["attribute_data"], + "class_list_mapping": common_classifier_information["class_list_mapping"], + "number_of_genomes": len(common_classifier_information["whole_Y"]), + "training_set_ref": common_classifier_information["training_set_ref"], } """ @@ -170,9 +198,11 @@ def execute_classifier(current_ws, common_classifier_information, current_classi "classifier_ref": obj_save_ref, "accuracy": classification_report_dict["accuracy"]} """ - cm = np.round(cnf_matrix_proportion / common_classifier_information["splits"] * 100.0, 1) + cm = np.round( + cnf_matrix_proportion / common_classifier_information["splits"] * 100.0, 1 + ) title = "CM: " + current_classifier_object["classifier_type"] - #self.plot_confusion_matrix(cm, title, current_classifier_object["classifier_name"], + # self.plot_confusion_matrix(cm, title, current_classifier_object["classifier_name"], # list(common_classifier_information["class_list_mapping"].keys()), folder_name) - return classification_report_dict, individual_classifier_info, classifier \ No newline at end of file + return classification_report_dict, individual_classifier_info, classifier diff --git a/modelseedpy/ml/predict_phenotype.py b/modelseedpy/ml/predict_phenotype.py index 736ca7b3..db1134a9 100755 --- a/modelseedpy/ml/predict_phenotype.py +++ b/modelseedpy/ml/predict_phenotype.py @@ -15,7 +15,9 @@ def get_functional_roles(genome, ontology_term): def get_list_functional_roles_from_kbase(genome_ref, ws_client): list_functional_roles = [] - genome_object_data = ws_client.get_objects2({'objects': [{'ref': genome_ref}]})['data'][0]['data'] + genome_object_data = ws_client.get_objects2({"objects": [{"ref": genome_ref}]})[ + "data" + ][0]["data"] # determine where functional roles are kept keys_location = genome_object_data.keys() @@ -26,7 +28,9 @@ def get_list_functional_roles_from_kbase(genome_ref, ws_client): elif "cdss" in keys_location: location_of_functional_roles = genome_object_data["cdss"] else: - raise ValueError("The functional roles are not under 'features', 'non_coding_features', or 'cdss'.") + raise ValueError( + "The functional roles are not under 'features', 'non_coding_features', or 'cdss'." + ) # either the functional roles are under function or functions (really stupid...) keys_function = location_of_functional_roles[0].keys() @@ -40,7 +44,7 @@ def get_list_functional_roles_from_kbase(genome_ref, ws_client): list_functional_roles.extend(role_to_insert.split(" / ")) elif "; " in role_to_insert: list_functional_roles.extend(role_to_insert.split("; ")) - elif 'hypothetical protein' in role_to_insert: + elif "hypothetical protein" in role_to_insert: pass else: list_functional_roles.append(role_to_insert) @@ -81,20 +85,28 @@ def create_indicator_matrix(ref_to_role, master_role_list=None): ref_to_indication = {} # make indicator rows for each for genome_id, features in ref_to_role.items(): - matching_index = [i for i, role in enumerate(master_role_list) if role in set(features)] + matching_index = [ + i for i, role in enumerate(master_role_list) if role in set(features) + ] indicators = np.zeros(len(master_role_list)) try: indicators[np.array(matching_index)] = 1 except IndexError: - raise IndexError('The genomes or genomeSet that you have submitted wasn’t annotated using the \ + raise IndexError( + "The genomes or genomeSet that you have submitted wasn’t annotated using the \ RAST annotation pipeline. Please annotate the genomes via ‘Annotate Microbial Genome’ app \ (https://narrative.kbase.us/#appcatalog/app/RAST_SDK/reannotate_microbial_genome/release)or \ genomeSets via Annotate Multiple Microbial Genomes’ app \ (https://narrative.kbase.us/#appcatalog/app/RAST_SDK/reannotate_microbial_genomes/release) and \ - resubmit the RAST annotated genome/genomeSets into the Predict Phenotype app. (') + resubmit the RAST annotated genome/genomeSets into the Predict Phenotype app. (" + ) ref_to_indication[genome_id] = indicators.astype(int) - indicator_matrix = pd.DataFrame.from_dict(data=ref_to_indication, orient='index', - columns=master_role_list).reset_index() \ + indicator_matrix = ( + pd.DataFrame.from_dict( + data=ref_to_indication, orient="index", columns=master_role_list + ) + .reset_index() .rename(columns={"index": "Genome Reference"}) + ) return indicator_matrix, master_role_list diff --git a/modelseedpy/multiomics/msexpression.py b/modelseedpy/multiomics/msexpression.py index 96e421ad..a2825668 100644 --- a/modelseedpy/multiomics/msexpression.py +++ b/modelseedpy/multiomics/msexpression.py @@ -7,18 +7,19 @@ from ast import And, BitAnd, BitOr, BoolOp, Expression, Name, NodeTransformer, Or from modelseedpy.core.msgenome import MSGenome, MSFeature -#Types of expression data +# Types of expression data GENOME = 10 MODEL = 20 -#Types of normalization +# Types of normalization COLUMN_NORM = 10 logger = logging.getLogger(__name__) -def compute_gene_score(expr,values,default): + +def compute_gene_score(expr, values, default): if isinstance(expr, Expression): - return compute_gene_score(expr.body,values,default) + return compute_gene_score(expr.body, values, default) elif isinstance(expr, Name): if expr.id in values: return values[expr.id] @@ -29,12 +30,12 @@ def compute_gene_score(expr,values,default): if isinstance(op, Or): total = 0 for subexpr in expr.values: - total += compute_gene_score(subexpr,values,default) + total += compute_gene_score(subexpr, values, default) return total elif isinstance(op, And): least = None for subexpr in expr.values: - value = compute_gene_score(subexpr,values,default) + value = compute_gene_score(subexpr, values, default) if least == None or value < least: least = value return least @@ -45,56 +46,67 @@ def compute_gene_score(expr,values,default): else: raise TypeError("unsupported operation " + repr(expr)) -class MSCondition: +class MSCondition: def __init__(self, id): self.id = id self.column_sum = None self.feature_count = None self.lowest = None - -class MSExpressionFeature: - def __init__(self,feature,parent): + +class MSExpressionFeature: + def __init__(self, feature, parent): self.id = feature.id self.feature = feature self.values = {} self.parent = parent - - def add_value(self,condition,value): + + def add_value(self, condition, value): if condition in self.values: condition.feature_count += -1 - condition.column_sum += -1*value - logger.warning("Overwriting value "+str(self.values[condition])+" with "+str(value)+" in feature "+self.feature.id) + condition.column_sum += -1 * value + logger.warning( + "Overwriting value " + + str(self.values[condition]) + + " with " + + str(value) + + " in feature " + + self.feature.id + ) if condition.lowest is None or condition.lowest > value: condition.lowest = value condition.feature_count += 1 condition.column_sum += value self.values[condition] = value - - def get_value(self,condition,normalization = None): - if isinstance(condition,str): + + def get_value(self, condition, normalization=None): + if isinstance(condition, str): if condition not in self.parent.conditions: - logger.warning("Condition "+condition+" not found in expression object!") + logger.warning( + "Condition " + condition + " not found in expression object!" + ) return None condition = self.parent.conditions.get_by_id(condition) if condition not in self.values: - logger.info("Condition "+condition.id+" has no value in "+self.feature.id) + logger.info( + "Condition " + condition.id + " has no value in " + self.feature.id + ) return None if normalization == COLUMN_NORM: - return self.values[condition]/condition.column_sum + return self.values[condition] / condition.column_sum return self.values[condition] -class MSExpression: - def __init__(self,type): +class MSExpression: + def __init__(self, type): self.type = type self.object = None self.features = DictList() self.conditions = DictList() @staticmethod - def from_gene_feature_file(filename, genome = None,create_missing_features = False): + def from_gene_feature_file(filename, genome=None, create_missing_features=False): expression = MSExpression(GENOME) if genome == None: expression.object = MSGenome() @@ -102,7 +114,7 @@ def from_gene_feature_file(filename, genome = None,create_missing_features = Fal else: expression.object = genome data = "" - with open(filename, 'r') as file: + with open(filename, "r") as file: data = file.read() lines = data.split("\n") conditions = None @@ -110,55 +122,61 @@ def from_gene_feature_file(filename, genome = None,create_missing_features = Fal if conditions == None: conditions = [] headers = line.split("\t") - for i in range(1,len(headers)): + for i in range(1, len(headers)): if headers[i] not in expression.conditions: conditions.append(MSCondition(headers[i])) - expression.conditions.append(conditions[i-1]) + expression.conditions.append(conditions[i - 1]) else: conditions.append(self.conditions.get_by_id(headers[i])) - conditions[i-1].column_sum = 0 - conditions[i-1].feature_count = 0 + conditions[i - 1].column_sum = 0 + conditions[i - 1].feature_count = 0 else: array = line.split("\t") protfeature = expression.add_feature(array[0], create_missing_features) if protfeature != None: - for i in range(1,len(array)): - protfeature.add_value(conditions[i-1], float(array[i])) + for i in range(1, len(array)): + protfeature.add_value(conditions[i - 1], float(array[i])) return expression - def add_feature(self,id,create_gene_if_missing = False): + def add_feature(self, id, create_gene_if_missing=False): if id in self.features: return self.features.get_by_id(id) feature = None - if self.type == GENOME: + if self.type == GENOME: if self.object.search_for_gene(id) == None: if create_gene_if_missing: - self.object.features.append(MSFeature(id,"")) + self.object.features.append(MSFeature(id, "")) feature = self.object.search_for_gene(id) else: if id in self.object.reactions: feature = self.object.reactions.get_by_id(id) if feature == None: - logger.warning("Feature referred by expression "+id+" not found in genome object!") + logger.warning( + "Feature referred by expression " + id + " not found in genome object!" + ) return None if feature.id in self.features: return self.features.get_by_id(feature.id) - protfeature = MSExpressionFeature(feature,self) + protfeature = MSExpressionFeature(feature, self) self.features.append(protfeature) return protfeature - - def get_value(self,feature,condition,normalization = None): - if isinstance(feature,str): + + def get_value(self, feature, condition, normalization=None): + if isinstance(feature, str): if feature not in self.features: - logger.warning("Feature "+feature+" not found in expression object!") + logger.warning( + "Feature " + feature + " not found in expression object!" + ) return None feature = self.features.get_by_id(feature) - return feature.get_value(condition,normalization) - - def build_reaction_expression(self,model,default): + return feature.get_value(condition, normalization) + + def build_reaction_expression(self, model, default): if self.type == MODEL: - logger.critical("Cannot build a reaction expression from a model-based expression object!") - #Creating the expression and features + logger.critical( + "Cannot build a reaction expression from a model-based expression object!" + ) + # Creating the expression and features rxnexpression = MSExpression(MODEL) rxnexpression.object = model for rxn in model.reactions: @@ -166,15 +184,19 @@ def build_reaction_expression(self,model,default): rxnexpression.add_feature(rxn.id) for condition in self.conditions: rxnexpression.conditions.append(condition) - #Pulling the gene values from the current expression + # Pulling the gene values from the current expression values = {} logger.warning("TESTING!") for gene in model.genes: feature = self.object.search_for_gene(gene.id) if feature == None: - logger.warning("Model gene "+gene.id+" not found in genome of expression") + logger.warning( + "Model gene " + gene.id + " not found in genome of expression" + ) elif feature.id not in self.features: - logger.warning("Model gene "+gene.id+" in genome but not in expression") + logger.warning( + "Model gene " + gene.id + " in genome but not in expression" + ) else: feature = self.features.get_by_id(feature.id) for condition in self.conditions: @@ -182,9 +204,11 @@ def build_reaction_expression(self,model,default): values[condition.id] = {} if condition in feature.values: values[condition.id][gene.id] = feature.values[condition] - #Computing the reaction level values - for condition in rxnexpression.conditions: + # Computing the reaction level values + for condition in rxnexpression.conditions: for feature in rxnexpression.features: tree = parse_gpr(feature.feature.gene_reaction_rule)[0] - feature.add_value(condition,compute_gene_score(tree,values[condition.id],default)) - return rxnexpression \ No newline at end of file + feature.add_value( + condition, compute_gene_score(tree, values[condition.id], default) + ) + return rxnexpression diff --git a/setup.py b/setup.py index dd7af4f6..775d60a4 100755 --- a/setup.py +++ b/setup.py @@ -2,24 +2,24 @@ from setuptools import setup, find_packages -with open('README.rst') as f: +with open("README.rst") as f: readme = f.read() -with open('LICENSE') as f: +with open("LICENSE") as f: license = f.read() setup( - name='ModelSEEDpy', - version='0.2.2', - description='Python package for building and analyzing models using ModelSEED', + name="ModelSEEDpy", + version="0.2.2", + description="Python package for building and analyzing models using ModelSEED", long_description=readme, - author='Christopher Henry', - author_email='chenry@anl.gov', - url='https://github.com/ModelSEED/ModelSEEDpy', + author="Christopher Henry", + author_email="chenry@anl.gov", + url="https://github.com/ModelSEED/ModelSEEDpy", license=license, - packages=find_packages(exclude=('docs')), + packages=find_packages(exclude=("docs")), package_data={ - 'modelseedpy': ['config.cfg'], + "modelseedpy": ["config.cfg"], }, install_requires=[ "networkx >= 2.4", @@ -29,13 +29,13 @@ "chemicals >= 1.0.13", "chemw >= 0.3.2", "matplotlib >= 3.0.0", - "pyeda" + "pyeda", ], tests_require=[ "pytest", ], project_urls={ - 'Documentation': 'https://modelseedpy.readthedocs.io/en/stable/', - 'Issues': 'https://github.com/ModelSEED/ModelSEEDpy/issues', - } -) \ No newline at end of file + "Documentation": "https://modelseedpy.readthedocs.io/en/stable/", + "Issues": "https://github.com/ModelSEED/ModelSEEDpy/issues", + }, +) diff --git a/tests/__init__.py b/tests/__init__.py index 594b58bd..f57489c0 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,2 +1 @@ from tests.test_data.mock_data import mock_model_ecoli_core - diff --git a/tests/biochem/test_modelseed_biochem.py b/tests/biochem/test_modelseed_biochem.py index b64be89b..a5afa8c0 100755 --- a/tests/biochem/test_modelseed_biochem.py +++ b/tests/biochem/test_modelseed_biochem.py @@ -1,4 +1,3 @@ - """ def test_compound_data_h2o(cpd): assert cpd.id == 'cpd00001' @@ -95,4 +94,4 @@ def test_compound_data_h2o(cpd): assert rxn.pathways == 'MetaCyc: Degradation (Degradation/Utilization/Assimilation); Glyphosate-Degradation (glyphosate degradation); Noncarbon-Nutrients (Inorganic Nutrient Metabolism); PWY-7805 ((aminomethyl)phosphonate degradation); PWY-7807 (glyphosate degradation III); Phosphorus-Compounds (Phosphorus Compound Metabolism)' assert rxn.compound_ids == {'cpd00001', 'cpd00009', 'cpd00012', 'cpd00067'} assert rxn.linked_reaction == 'rxn27946;rxn27947;rxn27948;rxn32487;rxn38157;rxn38158' -""" \ No newline at end of file +""" diff --git a/tests/community/test_DynamicFBA.py b/tests/community/test_DynamicFBA.py index b206ec33..96393d10 100644 --- a/tests/community/test_DynamicFBA.py +++ b/tests/community/test_DynamicFBA.py @@ -80,16 +80,16 @@ # # ------------------------ test the dynamicFBA Package --------------------------------------- # # import statements -# from numpy import float64 +# from numpy import float64 # from math import inf -# from numpy import nan +# from numpy import nan # import pandas # import cobra # import json # import re # empty = ['', '-', '', None, nan, 'NaN'] - + # # add the units of logarithm to the Magnesium concentration # def isnumber(string): # string = str(string) @@ -100,12 +100,12 @@ # except: # print(string) # return False - + # def average(num_1, num_2 = None): # if type(num_1) is list: # average = sum(num_1) / len(num_1) # return average -# elif isnumber(num_1): +# elif isnumber(num_1): # if num_2 is not None: # numbers = [num_1, num_2] # average = sum(numbers) / len(numbers) @@ -120,24 +120,24 @@ # dfba = dynamicFBAPkg(model, total_time = 5, timestep = 1, initial_concentrations = initial_concentrations, reaction_kinetics = reaction_kinetics, logging = True) # def test_init(): -# # assert results of the model +# # assert results of the model # assert type(dfba.model) is cobra.core.model.Model # assert dfba.verbose is False # assert type(dfba.parameters) is dict # assert type(dfba.variables) is dict # assert ('timesteps' and 'reaction_kinetics' and 'initial_concentrations') in list(dfba.parameters.keys()) # assert ('time_series' and 'concentrations') in list(dfba.variables.keys()) - + # # ensure that the dataframes are generated # assert type(dfba.fluxes_df) is pandas.core.frame.DataFrame # assert type(dfba.concentrations_df) is pandas.core.frame.DataFrame - + # def test_simulate(): # # execute the function # # dfba.simulate(source = 'custom') # temperature = 25 # p_h = 7 - + # # ------------------------ execute the simulate mechanics ----------------------------------- # solutions = [] # for dfba.timestep in range(1,dfba.parameters['timesteps']+1): @@ -154,7 +154,7 @@ # kinetic_flux = dfba.parameters['calculated_rate_laws'][reaction.id.lower()] # else: # if dfba.verbose: -# print(f'--> ERROR: The {reaction.name} reaction is not defined in the kinetics data.') +# print(f'--> ERROR: The {reaction.name} reaction is not defined in the kinetics data.') # continue # if not isnumber(kinetic_flux): @@ -166,7 +166,7 @@ # else: # reaction.lower_bound = kinetic_flux # reaction.upper_bound = kinetic_flux - + # assert isnumber(reaction.lower_bound) # assert isnumber(reaction.upper_bound) # assert reaction.lower_bound == reaction.upper_bound == kinetic_flux @@ -178,12 +178,12 @@ # solutions.append(solution) # print(f'\nobjective value for timestep {dfba.timestep}: ', solution.objective_value, '\n\n') # dfba.update_concentrations(solution) - + # for solution in solutions: # assert type(solution) is cobra.core.solution.Solution - + # # evaluate the dataframes -# assert type(dfba.fluxes_df) is pandas.core.frame.DataFrame +# assert type(dfba.fluxes_df) is pandas.core.frame.DataFrame # for index, row in dfba.fluxes_df.iterrows(): # for entry in row: # if type(entry) is float: @@ -192,8 +192,8 @@ # assert type(entry) == float64 # else: # assert type(entry) is None - + # assert type(dfba.concentrations_df) is pandas.core.frame.DataFrame # for index, row in dfba.concentrations_df.iterrows(): # for entry in row: -# assert type(entry) == (float64 or float) \ No newline at end of file +# assert type(entry) == (float64 or float) diff --git a/tests/community/test_dfbapy.py b/tests/community/test_dfbapy.py index ac37fd5b..3b78b0d3 100644 --- a/tests/community/test_dfbapy.py +++ b/tests/community/test_dfbapy.py @@ -4,7 +4,7 @@ # import shutil # from modelseedpy.fbapkg import dfbapkg -# # define the environment path +# # define the environment path # import os # local_cobrakbase_path = os.path.join('C:', 'Users', 'Andrew Freiburger','Documents','Argonne','cobrakbase') # os.environ["HOME"] = local_cobrakbase_path @@ -50,12 +50,12 @@ # assert type(dfba.met_names) is list # for bol in [dfba.verbose,dfba.printing, dfba.warnings, dfba.jupyter]: # assert type(bol) is bool - + # def test_lp(): # dfba.lp('test') # assert os.path.exists('test.lp') # shutil.rmtree('test.lp') - + # def test_simulate(): # for dic in [dfba.kinetics_data,dfba.defined_reactions]: # assert type(dic) is dict @@ -81,6 +81,6 @@ # assert type(dfba.figure) is matplotlib.figure.Figure # for st in [dfba.changed,dfba.unchanged]: # assert type(st) is set - + # assert os.path.exists(os.path.join(os.getcwd(), 'test_dfba')) -# shutil.rmtree(dfba.simulation_path) \ No newline at end of file +# shutil.rmtree(dfba.simulation_path) diff --git a/tests/community/test_mscommunity.py b/tests/community/test_mscommunity.py index bb970cd1..104409f6 100644 --- a/tests/community/test_mscommunity.py +++ b/tests/community/test_mscommunity.py @@ -2,6 +2,7 @@ import os import cobra import numpy + # FIXME: COMMENTING ALL OF THIS will provide a model later """ from glob import glob @@ -98,4 +99,4 @@ def test_constrain(): def test_community_fba(): pass -""" \ No newline at end of file +""" diff --git a/tests/context.py b/tests/context.py index 91de701e..1305ddcf 100644 --- a/tests/context.py +++ b/tests/context.py @@ -2,6 +2,7 @@ import sys import os -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) + +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) import sample diff --git a/tests/core/test_fbahelper.py b/tests/core/test_fbahelper.py index 7b721006..fd39b1e6 100644 --- a/tests/core/test_fbahelper.py +++ b/tests/core/test_fbahelper.py @@ -27,7 +27,7 @@ # auto_sink_compound = 'cpd00169' # met_id = auto_sink_compound + '_c0' # cobra_id = model.metabolites.get_by_id(met_id) - + # drain_reactions = FBAHelper.add_autodrain_reactions_to_community_model(model, [auto_sink_compound]) # model.add_reactions(drain_reactions) # for reaction in model.reactions: @@ -37,16 +37,16 @@ # assert reaction.lower_bound == 0 # assert reaction.upper_bound == 100 # assert reaction.annotation['sbo'] == 'SBO:0000627' - + # def test_test_condition_list(): # pkgmgr = MSPackageManager.get_pkg_mgr(model) # condition_list = [{'objective':'bio1', 'media':media, 'threshold':0.9,'is_max_threshold':False},{'objective':'bio1','media':media,'threshold':1,'is_max_threshold':True}] # passage = FBAHelper.test_condition_list(model, condition_list, pkgmgr) - + # assert passage is True - + # def test_reaction_expansion_test(): # reaction_list = [] # count = 0 @@ -59,9 +59,9 @@ # condition_list = [{'objective':'bio1', 'media':media, 'threshold':0.9,'is_max_threshold':False},{'objective':'bio1','media':media,'threshold':1,'is_max_threshold':True}] # filtered_list = FBAHelper.reaction_expansion_test(model, reaction_list, condition_list, pkgmgr) - + # assert type(filtered_list) is list - + # def test_set_reaction_bounds_from_direction(): # count = 0 # for reaction in model.reactions: @@ -69,85 +69,85 @@ # if count > len(model.reactions)/2: # direction = '>' # FBAHelper.set_reaction_bounds_from_direction(reaction, direction) - + # if direction == '<': # assert reaction.lower_bound == -100 # assert reaction.upper_bound == 0 # elif direction == '>': # assert reaction.lower_bound == 0 # assert reaction.upper_bound == 100 - + # def test_set_objective_from_target_reaction(): # target_reaction = 'bio1' # reaction = FBAHelper.set_objective_from_target_reaction(model, target_reaction) - -# assert type(reaction) is cobrakbase.core.kbasefba.fbamodel_biomass.Biomass + +# assert type(reaction) is cobrakbase.core.kbasefba.fbamodel_biomass.Biomass # assert str(model.objective.expression) == '1.0*bio1 - 1.0*bio1_reverse_b18f7' # assert model.objective.direction == 'max' - + # reaction = FBAHelper.set_objective_from_target_reaction(model, target_reaction, minimize = True) # assert model.objective.direction == 'min' - + # def test_compute_flux_values_from_variables(): # flux_values = FBAHelper.compute_flux_values_from_variables(model) - + # assert type(flux_values) is dict - + # def test_modelseed_id_from_cobra_metabolite(): # for met in model.metabolites: # returned = FBAHelper.modelseed_id_from_cobra_metabolite(met) # match = re.search('^(cpd\d+)', str(returned)) - + # assert match is not None # assert type(returned) is str - + # def test_modelseed_id_from_cobra_reaction(): # for rxn in model.reactions: # returned = FBAHelper.modelseed_id_from_cobra_reaction(rxn) # match = re.search('^(rxn\d+)', str(returned)) - + # if match: # assert match is not None # assert type(returned) is str # else: # assert match is None - + # def test_metabolite_mw(): # pyruvate = 'cpd00020_c0' # pyruvate_mass = 87.05 # https://pubchem.ncbi.nlm.nih.gov/compound/pyruvate - + # for met in model.metabolites: # if met.id == pyruvate: # pyruvate = met - + # calculated_mass = FBAHelper.metabolite_mw(pyruvate) - + # assert pyruvate_mass == round(calculated_mass, 2) - + # def test_elemental_mass(): # elementmass = FBAHelper.elemental_mass() - + # assert type(elementmass) is dict - + # def test_get_modelseed_db_api(): # msdb_path = 'C:\\Users\\Andrew Freiburger\\Dropbox\\My PC (DESKTOP-M302P50)\\Documents\\UVic Civil Engineering\\Internships\\Agronne\\TFA\\ModelSEEDDatabase' # db_api = FBAHelper.get_modelseed_db_api(msdb_path) - -# assert type(db_api) is modelseedpy.biochem.modelseed_biochem.ModelSEEDBiochem - + +# assert type(db_api) is modelseedpy.biochem.modelseed_biochem.ModelSEEDBiochem + # def test_is_ex(): # for reaction in model.reactions: # result = FBAHelper.is_ex(reaction) - + # if len(reaction.id) > 3 and reaction.id[0:3] in ["EX_", "DM_", "SK_"]: # assert result is True # else: # assert result is False - + # def test_is_biomass(): # for reaction in model.reactions: # result = FBAHelper.is_biomass(reaction) - + # if reaction.id[0:3] == 'bio': # assert result is True # else: diff --git a/tests/core/test_msatpcorreption.py b/tests/core/test_msatpcorreption.py index ff315ae6..d222349a 100644 --- a/tests/core/test_msatpcorreption.py +++ b/tests/core/test_msatpcorreption.py @@ -7,48 +7,55 @@ @pytest.fixture def template(): - with open('./tests/test_data/template_core_bigg.json', 'r') as fh: + with open("./tests/test_data/template_core_bigg.json", "r") as fh: return MSTemplateBuilder.from_dict(json.load(fh)).build() @pytest.fixture def template_genome_scale(): - with open('./tests/test_data/template_genome_scale_bigg.json', 'r') as fh: + with open("./tests/test_data/template_genome_scale_bigg.json", "r") as fh: return MSTemplateBuilder.from_dict(json.load(fh)).build() @pytest.fixture def get_model(): - def _method(ko=None, added_compounds=None, added_reactions=None): if ko is None: ko = [] - with open('./tests/test_data/e_coli_core.json', 'r') as fh: + with open("./tests/test_data/e_coli_core.json", "r") as fh: model_json = json.load(fh) - model_json['compartments'] = {k + '0': v for (k, v) in model_json['compartments'].items()} + model_json["compartments"] = { + k + "0": v for (k, v) in model_json["compartments"].items() + } metabolites = {} - for m in model_json['metabolites']: - m['id'] += '0' - m['compartment'] += '0' - metabolites[m['id']] = m - for r in model_json['reactions']: - r['metabolites'] = {i + '0': v for (i, v) in r['metabolites'].items()} - compartments = set([metabolites[k]['compartment'] for k in r['metabolites'].keys()]) - if r['id'].endswith('_e'): - r['id'] += '0' + for m in model_json["metabolites"]: + m["id"] += "0" + m["compartment"] += "0" + metabolites[m["id"]] = m + for r in model_json["reactions"]: + r["metabolites"] = {i + "0": v for (i, v) in r["metabolites"].items()} + compartments = set( + [metabolites[k]["compartment"] for k in r["metabolites"].keys()] + ) + if r["id"].endswith("_e"): + r["id"] += "0" elif len(compartments) == 1: - r['id'] += '_' + list(compartments)[0] + r["id"] += "_" + list(compartments)[0] else: - r['id'] += '_' + 'c0' # hack cause there is only combo between e0 and c0 + r["id"] += ( + "_" + "c0" + ) # hack cause there is only combo between e0 and c0 - model_json['reactions'] = [x for x in model_json['reactions'] if x['id'] not in ko] + model_json["reactions"] = [ + x for x in model_json["reactions"] if x["id"] not in ko + ] if added_compounds: for o in added_compounds: - model_json['metabolites'].append(o) + model_json["metabolites"].append(o) if added_reactions: for o in added_reactions: - model_json['reactions'].append(o) + model_json["reactions"].append(o) model = cobra.io.from_json(json.dumps(model_json)) model.reactions.ATPM_c0.lower_bound = 0 model.reactions.ATPM_c0.upper_bound = 1000 @@ -59,40 +66,46 @@ def _method(ko=None, added_compounds=None, added_reactions=None): @pytest.fixture def media_glucose_aerobic(): - media = MSMedia.from_dict({ - 'glc__D': (-1, 1000), - 'o2': (-1000, 1000), - 'h': (-1000, 1000), - 'h2o': (-1000, 1000) - }) - media.id = 'glc/o2' + media = MSMedia.from_dict( + { + "glc__D": (-1, 1000), + "o2": (-1000, 1000), + "h": (-1000, 1000), + "h2o": (-1000, 1000), + } + ) + media.id = "glc/o2" return media @pytest.fixture def media_acetate_aerobic(): - media = MSMedia.from_dict({ - 'ac': (-1, 1000), - 'o2': (-1000, 1000), - 'h': (-1000, 1000), - 'h2o': (-1000, 1000) - }) - media.id = 'glc/o2' + media = MSMedia.from_dict( + { + "ac": (-1, 1000), + "o2": (-1000, 1000), + "h": (-1000, 1000), + "h2o": (-1000, 1000), + } + ) + media.id = "glc/o2" return media @pytest.fixture def media_genome_scale_glucose_aerobic(): - media = MSMedia.from_dict({ - 'glc__D': (-10, 1000), - 'o2': (-1000, 1000), - 'h': (-1000, 1000), - 'h2o': (-1000, 1000), - 'pi': (-1000, 1000), - 'co2': (-1000, 1000), - 'nh4': (-1000, 1000), - 'k': (-1000, 1000), - }) + media = MSMedia.from_dict( + { + "glc__D": (-10, 1000), + "o2": (-1000, 1000), + "h": (-1000, 1000), + "h2o": (-1000, 1000), + "pi": (-1000, 1000), + "co2": (-1000, 1000), + "nh4": (-1000, 1000), + "k": (-1000, 1000), + } + ) return media @@ -103,51 +116,55 @@ def media_all_aerobic(media_glucose_aerobic, media_acetate_aerobic): @pytest.fixture def get_model_with_infinite_atp_loop(get_model, template_genome_scale): - def _method(ko=None): - added_compounds = [{ - 'id': 'k_c0', - 'name': 'K [c]', - 'compartment': 'c0', - 'charge': 1, - 'formula': 'K', - 'notes': {}, - 'annotation': {'sbo': 'SBO:0000247'} - }, { - 'id': 'k_e0', - 'name': 'K [e]', - 'compartment': 'e0', - 'charge': 1, - 'formula': 'K', - 'notes': {}, - 'annotation': {'sbo': 'SBO:0000247'} - }] - added_reactions = [{ - 'id': 'EX_k_e0', - 'name': 'K exchange', - 'metabolites': {'k_e0': -1.0}, - 'lower_bound': -1000, - 'upper_bound': 1000.0, - 'gene_reaction_rule': '', - 'subsystem': 'Extracellular exchange', - 'notes': {}, - 'annotation': {} - }] + added_compounds = [ + { + "id": "k_c0", + "name": "K [c]", + "compartment": "c0", + "charge": 1, + "formula": "K", + "notes": {}, + "annotation": {"sbo": "SBO:0000247"}, + }, + { + "id": "k_e0", + "name": "K [e]", + "compartment": "e0", + "charge": 1, + "formula": "K", + "notes": {}, + "annotation": {"sbo": "SBO:0000247"}, + }, + ] + added_reactions = [ + { + "id": "EX_k_e0", + "name": "K exchange", + "metabolites": {"k_e0": -1.0}, + "lower_bound": -1000, + "upper_bound": 1000.0, + "gene_reaction_rule": "", + "subsystem": "Extracellular exchange", + "notes": {}, + "annotation": {}, + } + ] model = get_model(ko, added_compounds, added_reactions) - model.reactions.get_by_id('BIOMASS_Ecoli_core_w_GAM_c0').add_metabolites({ - model.metabolites.get_by_id('k_c0'): 0.01 - }) + model.reactions.get_by_id("BIOMASS_Ecoli_core_w_GAM_c0").add_metabolites( + {model.metabolites.get_by_id("k_c0"): 0.01} + ) model.add_reactions([template_genome_scale.reactions.Kt2r_c.to_reaction(model)]) model.add_reactions([template_genome_scale.reactions.Ktex_c.to_reaction(model)]) model.medium = { - 'EX_co2_e0': 1000.0, - 'EX_glc__D_e0': 10.0, - 'EX_h_e0': 1000.0, - 'EX_h2o_e0': 1000.0, - 'EX_nh4_e0': 1000.0, - 'EX_o2_e0': 1000.0, - 'EX_pi_e0': 1000.0, - 'EX_k_e0': 1000.0 + "EX_co2_e0": 1000.0, + "EX_glc__D_e0": 10.0, + "EX_h_e0": 1000.0, + "EX_h2o_e0": 1000.0, + "EX_nh4_e0": 1000.0, + "EX_o2_e0": 1000.0, + "EX_pi_e0": 1000.0, + "EX_k_e0": 1000.0, } return model @@ -155,16 +172,23 @@ def _method(ko=None): return _method -def test_infinite_atp_model_growth_boost(get_model_with_infinite_atp_loop, template, template_genome_scale, media_glucose_aerobic): +def test_infinite_atp_model_growth_boost( + get_model_with_infinite_atp_loop, + template, + template_genome_scale, + media_glucose_aerobic, +): model = get_model_with_infinite_atp_loop() solution = model.optimize() assert solution.objective_value > 1.2 # should be around 1.316 - assert solution.status == 'optimal' + assert solution.status == "optimal" def test_ms_atp_correction1(get_model, template, media_all_aerobic): model = get_model(["GLCpts_c0", "NADH16_c0", "CYTBD_c0", "O2t_c0"]) - atp_correction = MSATPCorrection(model, template, media_all_aerobic, atp_hydrolysis_id='ATPM_c0') + atp_correction = MSATPCorrection( + model, template, media_all_aerobic, atp_hydrolysis_id="ATPM_c0" + ) atp_correction.evaluate_growth_media() assert len(atp_correction.noncore_reactions) == 1 # the biomass assert len(atp_correction.other_compartments) == 0 # none @@ -187,36 +211,47 @@ def test_ms_atp_correction1(get_model, template, media_all_aerobic): assert tests assert len(tests) == 1 - assert tests[0]['threshold'] > 0 - assert tests[0]['objective'] == 'ATPM_c0' + assert tests[0]["threshold"] > 0 + assert tests[0]["objective"] == "ATPM_c0" -def test_ms_atp_correction_and_gap_fill1(get_model_with_infinite_atp_loop, template, template_genome_scale, - media_glucose_aerobic, media_genome_scale_glucose_aerobic): +def test_ms_atp_correction_and_gap_fill1( + get_model_with_infinite_atp_loop, + template, + template_genome_scale, + media_glucose_aerobic, + media_genome_scale_glucose_aerobic, +): from modelseedpy import MSGapfill - model = get_model_with_infinite_atp_loop(['GLCpts_c0', 'GLUSy_c0', 'GLUDy_c0']) + model = get_model_with_infinite_atp_loop(["GLCpts_c0", "GLUSy_c0", "GLUDy_c0"]) model.reactions.ATPM_c0.lower_bound = 0 model.reactions.ATPM_c0.upper_bound = 1000 - atp_correction = MSATPCorrection(model, template, [media_glucose_aerobic], atp_hydrolysis_id='ATPM_c0') + atp_correction = MSATPCorrection( + model, template, [media_glucose_aerobic], atp_hydrolysis_id="ATPM_c0" + ) tests = atp_correction.run_atp_correction() # expected tests = [{'media': MSMedia object, 'is_max_threshold': True, 'threshold': 21.0, 'objective': 'ATPM_c0'}] assert tests assert len(tests) == 1 - assert tests[0]['threshold'] > 0 - assert tests[0]['objective'] == 'ATPM_c0' + assert tests[0]["threshold"] > 0 + assert tests[0]["objective"] == "ATPM_c0" gap_fill = MSGapfill(model, [template_genome_scale], [], tests, {}, []) - result = gap_fill.run_gapfilling(media_genome_scale_glucose_aerobic, 'BIOMASS_Ecoli_core_w_GAM_c0', minimum_obj=0.1) + result = gap_fill.run_gapfilling( + media_genome_scale_glucose_aerobic, + "BIOMASS_Ecoli_core_w_GAM_c0", + minimum_obj=0.1, + ) # either GLUSy_c0 or GLUDy_c0 should be gap filled for glutamate assert result - assert len(result['new']) == 1 - assert 'GLUSy_c0' in result['new'] or 'GLUDy_c0' in result['new'] + assert len(result["new"]) == 1 + assert "GLUSy_c0" in result["new"] or "GLUDy_c0" in result["new"] model = gap_fill.integrate_gapfill_solution(result) diff --git a/tests/core/test_msbuilder.py b/tests/core/test_msbuilder.py index 10d47fe9..4c3a9f0c 100755 --- a/tests/core/test_msbuilder.py +++ b/tests/core/test_msbuilder.py @@ -4,58 +4,60 @@ def test_get_direction_from_constraints1(): - assert get_direction_from_constraints(-10, 10) == '=' + assert get_direction_from_constraints(-10, 10) == "=" def test_get_direction_from_constraints2(): - assert get_direction_from_constraints(0, 10) == '>' + assert get_direction_from_constraints(0, 10) == ">" def test_get_direction_from_constraints3(): - assert get_direction_from_constraints(5, 10) == '>' + assert get_direction_from_constraints(5, 10) == ">" def test_get_direction_from_constraints4(): - assert get_direction_from_constraints(-10, 0) == '<' + assert get_direction_from_constraints(-10, 0) == "<" def test_get_direction_from_constraints5(): - assert get_direction_from_constraints(-10, -5) == '<' + assert get_direction_from_constraints(-10, -5) == "<" def test_get_direction_from_constraints6(): - assert get_direction_from_constraints(0, 0) == '?' + assert get_direction_from_constraints(0, 0) == "?" def test_some_gpr(): # using this for later reaction_complex_role_gene_mapping = { - 'cpx1': { - 'role1': ['role1function', True, False, {'g1', 'g2'}], - 'role2': ['role2function', True, False, {'g3'}] + "cpx1": { + "role1": ["role1function", True, False, {"g1", "g2"}], + "role2": ["role2function", True, False, {"g3"}], + }, + "cpx2": { + "role1": ["role1function", True, False, {"g1", "g2"}], + "role3": ["role2function", True, False, {"g4", "g5"}], }, - 'cpx2': { - 'role1': ['role1function', True, False, {'g1', 'g2'}], - 'role3': ['role2function', True, False, {'g4', 'g5'}] - } } # reaction_complex_role_gene_mapping -> GPR_func -> expected expected = { - frozenset({'g1', 'g3'}), frozenset({'g2', 'g3'}), - frozenset({'g1', 'g4'}), frozenset({'g1', 'g5'}), - frozenset({'g2', 'g4'}), frozenset({'g2', 'g5'}), + frozenset({"g1", "g3"}), + frozenset({"g2", "g3"}), + frozenset({"g1", "g4"}), + frozenset({"g1", "g5"}), + frozenset({"g2", "g4"}), + frozenset({"g2", "g5"}), } def test_build(): template = mock_template() genome = mock_genome_rast() - #builder = MSBuilder(genome, template) - #model = builder.build('test_model', '0', True, False) + # builder = MSBuilder(genome, template) + # model = builder.build('test_model', '0', True, False) expect = mock_model() - pass diff --git a/tests/core/test_mseditorapi.py b/tests/core/test_mseditorapi.py index d8578cdf..abc4a945 100755 --- a/tests/core/test_mseditorapi.py +++ b/tests/core/test_mseditorapi.py @@ -16,15 +16,15 @@ def example_model(): @pytest.fixture def example_model2(): return mock_model_ecoli_core() - - + + def test_remove_reactions1(editor, example_model): """ testing for remove_reaction() """ # remove valid reactions total_reactions = len(example_model.reactions) - lst = ['rxn00171', 'rxn00248'] + lst = ["rxn00171", "rxn00248"] editor.remove_reactions(example_model, lst) assert len(example_model.reactions) == total_reactions - len(lst) @@ -33,7 +33,7 @@ def test_remove_reactions2(editor, example_model): """ remove invalid reactions """ - lst = ['C'] + lst = ["C"] with pytest.raises(Exception): editor.remove_reactions(example_model, lst) @@ -43,7 +43,7 @@ def test_edit_reaction1(editor, example_model): testing for edit_reaction() change a reversible reaction to a forward reaction and change the gpr """ - rxn = 'rxn00198_c0' + rxn = "rxn00198_c0" editor.edit_reaction(example_model, rxn, "=>", "(b0001 and b0002) or b1010") reaction = example_model.reactions.get_by_id(rxn) assert reaction.reversibility is False @@ -57,7 +57,7 @@ def test_edit_reaction2(editor, example_model): testing for edit_reaction() change a forward reaction to a reversible reaction """ - rxn = 'rxn19316_c0' + rxn = "rxn19316_c0" editor.edit_reaction(example_model, rxn, "<=>") reaction = example_model.reactions.get_by_id(rxn) assert reaction.reversibility is True @@ -70,7 +70,7 @@ def test_edit_reaction3(editor, example_model): testing for edit_reaction() change a forward reaction to a reverse reaction """ - rxn = 'rxn08288_c0' + rxn = "rxn08288_c0" editor.edit_reaction(example_model, rxn, "<=") reaction = example_model.reactions.get_by_id(rxn) assert reaction.reversibility is False @@ -78,48 +78,48 @@ def test_edit_reaction3(editor, example_model): assert reaction.upper_bound == 0 -def test_copy_model_reactions1(editor,example_model,example_model2): +def test_copy_model_reactions1(editor, example_model, example_model2): """ testing for copy_model_reaction() copying reactions from one list to another """ - lst = ['rxn00198_c0', 'rxn08288_c0'] - editor.remove_reactions(example_model2,lst) + lst = ["rxn00198_c0", "rxn08288_c0"] + editor.remove_reactions(example_model2, lst) assert len(example_model2.reactions) == 95 - len(lst) editor.copy_model_reactions(example_model2, example_model, lst) assert len(example_model2.reactions) == 95 -def test_copy_model_reactions2(editor,example_model,example_model2): +def test_copy_model_reactions2(editor, example_model, example_model2): """ testing for copy_model_reaction() copying a reaction that already in the original model """ - lst = ['rxn00198_c0', 'rxn08288_c0'] + lst = ["rxn00198_c0", "rxn08288_c0"] editor.copy_model_reactions(example_model2, example_model, lst) assert len(example_model2.reactions) == 95 -def test_copy_model_reactions3(editor,example_model,example_model2): +def test_copy_model_reactions3(editor, example_model, example_model2): """ testing for copy_model_reaction() copying a reaction that doesn't exist in the original model """ - lst = ['C','rxn00198'] + lst = ["C", "rxn00198"] with pytest.raises(Exception): editor.copy_model_reactions(example_model2, example_model, lst) assert len(example_model2.reactions) == 95 - -def test_copy_all_model_reactions1(editor,example_model,example_model2): + +def test_copy_all_model_reactions1(editor, example_model, example_model2): pass """ testing for copy_all_model_reactions() copying all reactions from a source model that don't already exist in the receiving model """ - lst = ['rxn00198'] - editor.remove_reactions(example_model2,lst) - editor.copy_all_model_reactions(example_model2,example_model) + lst = ["rxn00198"] + editor.remove_reactions(example_model2, lst) + editor.copy_all_model_reactions(example_model2, example_model) assert len(example_model2.reactions) == 95 @@ -127,24 +127,32 @@ def test_build_from_palsson_string_1(): """ test for building a modelseed equaiton form a string """ - eq = MSEquation.build_from_palsson_string('cpd00001 + cpd00002[e] <= (2)cpd00003 + cpd00004') - #assert(test.equation == "{('cpd00001', 'c'): -1, ('cpd00002', 'e'): -1, ('cpd00003', 'c'): 2, ('cpd00004', 'c'): 1}") + eq = MSEquation.build_from_palsson_string( + "cpd00001 + cpd00002[e] <= (2)cpd00003 + cpd00004" + ) + # assert(test.equation == "{('cpd00001', 'c'): -1, ('cpd00002', 'e'): -1, ('cpd00003', 'c'): 2, ('cpd00004', 'c'): 1}") assert eq.direction == "<" def test_build_from_palsson_string_2(): - eq = MSEquation.build_from_palsson_string('cpd00001 + cpd00002[e] <=> (2)cpd00003 + cpd00004') - #assert(test.equation == "{('cpd00001', 'c'): -1, ('cpd00002', 'e'): -1, ('cpd00003', 'c'): 2, ('cpd00004', 'c'): 1}") + eq = MSEquation.build_from_palsson_string( + "cpd00001 + cpd00002[e] <=> (2)cpd00003 + cpd00004" + ) + # assert(test.equation == "{('cpd00001', 'c'): -1, ('cpd00002', 'e'): -1, ('cpd00003', 'c'): 2, ('cpd00004', 'c'): 1}") assert eq.direction == "=" def test_build_from_palsson_string_3(): - eq = MSEquation.build_from_palsson_string('cpd00001 + cpd00002[e] => (2)cpd00003 + cpd00004') - #assert(test.equation == "{('cpd00001', 'c'): -1, ('cpd00002', 'e'): -1, ('cpd00003', 'c'): 2, ('cpd00004', 'c'): 1}") + eq = MSEquation.build_from_palsson_string( + "cpd00001 + cpd00002[e] => (2)cpd00003 + cpd00004" + ) + # assert(test.equation == "{('cpd00001', 'c'): -1, ('cpd00002', 'e'): -1, ('cpd00003', 'c'): 2, ('cpd00004', 'c'): 1}") assert eq.direction == ">" def test_build_from_palsson_string_4(editor): - eq = MSEquation.build_from_palsson_string('cpd00001 + cpd00002[e] = (2)cpd00003 + cpd00004') - #assert(test.equation == "{('cpd00001', 'c'): -1, ('cpd00002', 'e'): -1, ('cpd00003', 'c'): 2, ('cpd00004', 'c'): 1}") + eq = MSEquation.build_from_palsson_string( + "cpd00001 + cpd00002[e] = (2)cpd00003 + cpd00004" + ) + # assert(test.equation == "{('cpd00001', 'c'): -1, ('cpd00002', 'e'): -1, ('cpd00003', 'c'): 2, ('cpd00004', 'c'): 1}") assert eq.direction == "?" diff --git a/tests/core/test_msgapfill.py b/tests/core/test_msgapfill.py index 27e572f3..7985ab5b 100644 --- a/tests/core/test_msgapfill.py +++ b/tests/core/test_msgapfill.py @@ -7,35 +7,42 @@ @pytest.fixture def template(): - with open('./tests/test_data/template_core_bigg.json', 'r') as fh: + with open("./tests/test_data/template_core_bigg.json", "r") as fh: return MSTemplateBuilder.from_dict(json.load(fh)).build() @pytest.fixture def get_model(): - def _method(ko=None): if ko is None: ko = [] - with open('./tests/test_data/e_coli_core.json', 'r') as fh: + with open("./tests/test_data/e_coli_core.json", "r") as fh: model_json = json.load(fh) - model_json['compartments'] = {k + '0': v for (k, v) in model_json['compartments'].items()} + model_json["compartments"] = { + k + "0": v for (k, v) in model_json["compartments"].items() + } metabolites = {} - for m in model_json['metabolites']: - m['id'] += '0' - m['compartment'] += '0' - metabolites[m['id']] = m - for r in model_json['reactions']: - r['metabolites'] = {i + '0': v for (i, v) in r['metabolites'].items()} - compartments = set([metabolites[k]['compartment'] for k in r['metabolites'].keys()]) - if r['id'].endswith('_e'): - r['id'] += '0' + for m in model_json["metabolites"]: + m["id"] += "0" + m["compartment"] += "0" + metabolites[m["id"]] = m + for r in model_json["reactions"]: + r["metabolites"] = {i + "0": v for (i, v) in r["metabolites"].items()} + compartments = set( + [metabolites[k]["compartment"] for k in r["metabolites"].keys()] + ) + if r["id"].endswith("_e"): + r["id"] += "0" elif len(compartments) == 1: - r['id'] += '_' + list(compartments)[0] + r["id"] += "_" + list(compartments)[0] else: - r['id'] += '_' + 'c0' # hack cause there is only combo between e0 and c0 + r["id"] += ( + "_" + "c0" + ) # hack cause there is only combo between e0 and c0 - model_json['reactions'] = [x for x in model_json['reactions'] if x['id'] not in ko] + model_json["reactions"] = [ + x for x in model_json["reactions"] if x["id"] not in ko + ] return cobra.io.from_json(json.dumps(model_json)) return _method @@ -44,26 +51,28 @@ def _method(ko=None): @pytest.fixture def media_glucose_aerobic(): - return MSMedia.from_dict({ - 'glc__D': (-10, 1000), - 'o2': (-1000, 1000), - 'h': (-1000, 1000), - 'h2o': (-1000, 1000), - 'pi': (-1000, 1000), - 'co2': (-1000, 1000), - 'nh4': (-1000, 1000) - }) + return MSMedia.from_dict( + { + "glc__D": (-10, 1000), + "o2": (-1000, 1000), + "h": (-1000, 1000), + "h2o": (-1000, 1000), + "pi": (-1000, 1000), + "co2": (-1000, 1000), + "nh4": (-1000, 1000), + } + ) def test_model_default(get_model): solution = get_model([]).optimize() - assert solution.status == 'optimal' + assert solution.status == "optimal" assert solution.objective_value > 0.8 def test_model_no_solution(get_model): - solution = get_model(['GLCpts_c0']).optimize() - assert solution.status == 'infeasible' + solution = get_model(["GLCpts_c0"]).optimize() + assert solution.status == "infeasible" def test_ms_gap_fill1(template, get_model, media_glucose_aerobic): @@ -72,11 +81,13 @@ def test_ms_gap_fill1(template, get_model, media_glucose_aerobic): """ model = get_model(["CYTBD_c0", "NADH16_c0", "GLCpts_c0", "O2t_c0"]) gap_fill = MSGapfill(model, [template]) - result = gap_fill.run_gapfilling(media_glucose_aerobic, 'BIOMASS_Ecoli_core_w_GAM_c0', minimum_obj=0.1) + result = gap_fill.run_gapfilling( + media_glucose_aerobic, "BIOMASS_Ecoli_core_w_GAM_c0", minimum_obj=0.1 + ) assert result - assert 'new' in result - assert 'GLCpts_c0' in result['new'] - assert result['new']['GLCpts_c0'] == '>' + assert "new" in result + assert "GLCpts_c0" in result["new"] + assert result["new"]["GLCpts_c0"] == ">" def test_ms_gap_fill2(template, get_model, media_glucose_aerobic): @@ -85,13 +96,15 @@ def test_ms_gap_fill2(template, get_model, media_glucose_aerobic): """ model = get_model(["CYTBD_c0", "NADH16_c0", "GLCpts_c0", "O2t_c0"]) gap_fill = MSGapfill(model, [template]) - result = gap_fill.run_gapfilling(media_glucose_aerobic, 'BIOMASS_Ecoli_core_w_GAM_c0', minimum_obj=0.8) + result = gap_fill.run_gapfilling( + media_glucose_aerobic, "BIOMASS_Ecoli_core_w_GAM_c0", minimum_obj=0.8 + ) assert result - assert 'new' in result - assert 'GLCpts_c0' in result['new'] and result['new']['GLCpts_c0'] == '>' - assert 'CYTBD_c0' in result['new'] and result['new']['CYTBD_c0'] == '>' - assert 'NADH16_c0' in result['new'] and result['new']['NADH16_c0'] == '>' - assert 'O2t_c0' in result['new'] and result['new']['O2t_c0'] == '>' + assert "new" in result + assert "GLCpts_c0" in result["new"] and result["new"]["GLCpts_c0"] == ">" + assert "CYTBD_c0" in result["new"] and result["new"]["CYTBD_c0"] == ">" + assert "NADH16_c0" in result["new"] and result["new"]["NADH16_c0"] == ">" + assert "O2t_c0" in result["new"] and result["new"]["O2t_c0"] == ">" """ @@ -143,4 +156,4 @@ def test_run_gapfilling_and_integrate_gapfill_solution(): def test_gapfill(): pass -""" \ No newline at end of file +""" diff --git a/tests/core/test_msgenome.py b/tests/core/test_msgenome.py index f7c7863c..9f692742 100644 --- a/tests/core/test_msgenome.py +++ b/tests/core/test_msgenome.py @@ -16,10 +16,12 @@ def test_parse_fasta_str1(): NLSQLDDLFAARVAKARDEGKVLRYVGNIDEDGVCRVKIAEVDGNDPLFKVKNGENALAFYSHYYQPLPLVLRGYGAGND VTAAGVFADLLRTLSWKLGV """ - features = parse_fasta_str(faa_str, ' ') + features = parse_fasta_str(faa_str, " ") assert len(features) == 1 - assert features[0].id == 'NP_414543.1' - assert features[0].description == 'fused aspartate kinase/homoserine dehydrogenase 1' + assert features[0].id == "NP_414543.1" + assert ( + features[0].description == "fused aspartate kinase/homoserine dehydrogenase 1" + ) assert len(features[0].seq) == 820 @@ -43,7 +45,7 @@ def test_parse_fasta_str2(): ISQQVPGFDEWLWVLAYPGIKVSTAEARAILPAQYRRQDCIAHGRHLAGFIHACYSRQPELAAKLMKDVIAEPYRERLLP GFRQARQAVAEIGAVASGISGSGPTLFALCDKPETAQRVADWLGKNYLQNQEGFVHICRLDTAGARVLEN """ - features = parse_fasta_str(faa_str, ' ') + features = parse_fasta_str(faa_str, " ") assert len(features) == 2 @@ -54,26 +56,29 @@ def test_parse_fasta_str3(): """ features = parse_fasta_str(faa_str, None) assert len(features) == 1 - assert features[0].id == 'NP_414543.1 fused aspartate kinase/homoserine dehydrogenase 1' + assert ( + features[0].id + == "NP_414543.1 fused aspartate kinase/homoserine dehydrogenase 1" + ) assert features[0].description is None assert len(features[0].seq) == 80 def test_msfeature_add_ontology_term(): - feature = MSFeature('gene1', 'MKV') - feature.add_ontology_term('ONTOLOGY', 'value1') - assert 'ONTOLOGY' in feature.ontology_terms - assert 'value1' in feature.ontology_terms['ONTOLOGY'] + feature = MSFeature("gene1", "MKV") + feature.add_ontology_term("ONTOLOGY", "value1") + assert "ONTOLOGY" in feature.ontology_terms + assert "value1" in feature.ontology_terms["ONTOLOGY"] def test_msgenome_from_protein_sequences_hash1(): - genome = MSGenome.from_protein_sequences_hash({'gene1': 'MKV'}) + genome = MSGenome.from_protein_sequences_hash({"gene1": "MKV"}) assert len(genome.features) == 1 assert genome.features[0] - assert genome.features[0].id == 'gene1' - assert genome.features[0].seq == 'MKV' + assert genome.features[0].id == "gene1" + assert genome.features[0].seq == "MKV" def test_msgenome_from_protein_sequences_hash2(): - genome = MSGenome.from_protein_sequences_hash({'gene1': 'MKV', 'gene2': 'MKVLGD'}) + genome = MSGenome.from_protein_sequences_hash({"gene1": "MKV", "gene2": "MKVLGD"}) assert len(genome.features) == 2 diff --git a/tests/core/test_rast_client.py b/tests/core/test_rast_client.py index cd5b3917..73bbdd8b 100644 --- a/tests/core/test_rast_client.py +++ b/tests/core/test_rast_client.py @@ -2,5 +2,5 @@ def test_somefunction(): - + pass diff --git a/tests/fbapkg/test_revbin_core_model.py b/tests/fbapkg/test_revbin_core_model.py index e3e9006b..42df7794 100755 --- a/tests/fbapkg/test_revbin_core_model.py +++ b/tests/fbapkg/test_revbin_core_model.py @@ -9,9 +9,9 @@ def test_init(): assert type(rev_bin.name) is str assert type(rev_bin.variable_types) is dict assert type(rev_bin.constraint_types) is dict - assert 'revbin' in list(rev_bin.variables.keys()) - assert 'revbinR' in list(rev_bin.constraints.keys()) - assert 'revbinF' in list(rev_bin.constraints.keys()) + assert "revbin" in list(rev_bin.variables.keys()) + assert "revbinR" in list(rev_bin.constraints.keys()) + assert "revbinF" in list(rev_bin.constraints.keys()) def test_build_package(): @@ -19,7 +19,7 @@ def test_build_package(): lower_bound = 0 upper_bound = 1 var_type = "binary" - constraint_types = {"F": [None, 0],'R': [None, 1000]} + constraint_types = {"F": [None, 0], "R": [None, 1000]} # execute the function rev_bin = RevBinPkg(model=mock_model_ecoli_core(True)) @@ -34,8 +34,12 @@ def test_build_package(): assert rev_bin_var.type == var_type for constraint_type in constraint_types: - rev_bin_cons = rev_bin.constraints['revbin{}'.format(constraint_type)][reaction.id] + rev_bin_cons = rev_bin.constraints["revbin{}".format(constraint_type)][ + reaction.id + ] assert rev_bin_cons assert rev_bin_cons.lb == constraint_types[constraint_type][0] assert rev_bin_cons.ub == constraint_types[constraint_type][1] - assert rev_bin_cons.name == '{}_revbin{}'.format(reaction.id, constraint_type) + assert rev_bin_cons.name == "{}_revbin{}".format( + reaction.id, constraint_type + ) diff --git a/tests/mseditorapi_testing.py b/tests/mseditorapi_testing.py index 5bc96360..f05aa000 100644 --- a/tests/mseditorapi_testing.py +++ b/tests/mseditorapi_testing.py @@ -1,7 +1,6 @@ +# cobra_config = cobra.Configuration() -#cobra_config = cobra.Configuration() - -#from cobra import Model, Reaction, Metabolite +# from cobra import Model, Reaction, Metabolite import cobra.test import os from os.path import join @@ -11,94 +10,103 @@ def test_edit_reaction2(): # change a forward reaction to a reversible reaction - rxn = 'HXPRT' + rxn = "HXPRT" editor.edit_reaction(model, rxn, "<=>") assert model.reactions.get_by_id(rxn).reversibility == True assert model.reactions.get_by_id(rxn).lower_bound == -1000 assert model.reactions.get_by_id(rxn).upper_bound == 1000 + def test_edit_reaction3(): # change a forward reaction to a reverse reaction - rxn = 'CYTDK2' + rxn = "CYTDK2" editor.edit_reaction(model, rxn, "<=") assert model.reactions.get_by_id(rxn).reversibility == False assert model.reactions.get_by_id(rxn).lower_bound == -1000 assert model.reactions.get_by_id(rxn).upper_bound == 0 + # may throw exception because error handling was difficult, uncomment at your own risk # def test_edit_reaction4(): - # invalid gpr - # with pytest.raises(SyntaxError): - # editor.edit_reaction(model,rxn1,"=>","(b0001 and b0002 or b1010") +# invalid gpr +# with pytest.raises(SyntaxError): +# editor.edit_reaction(model,rxn1,"=>","(b0001 and b0002 or b1010") # testing for edit_biomass_compound def test_edit_biomass_compound1(): # properly change coefficient model2 = model - editor.edit_biomass_compound(model2, 'CYTDK2', 'cmp_c', 2) - assert model2.reactions.get_by_id('CYTDK2').get_coefficient('cmp_c') == 2 + editor.edit_biomass_compound(model2, "CYTDK2", "cmp_c", 2) + assert model2.reactions.get_by_id("CYTDK2").get_coefficient("cmp_c") == 2 + def test_edit_biomass_compound2(): # nonexistent reaction model3 = model with pytest.raises(Exception): - editor.edit_biomass_compound(model3, 'CYTDK', 'cmp_c', 2) + editor.edit_biomass_compound(model3, "CYTDK", "cmp_c", 2) + def test_edit_biomass_compound3(): # nonexistent metabolite model4 = model with pytest.raises(Exception): - editor.edit_biomass_compound(model4, 'CYTDK2', 'cmp_', 2) + editor.edit_biomass_compound(model4, "CYTDK2", "cmp_", 2) -#test molecular weight test + +# test molecular weight test def test_molecular_weight_1(): model = cobra.io.load_json_model("iML1515.json") - assert(editor.compute_molecular_weight(model, 'octapb_c') == 127.2041) + assert editor.compute_molecular_weight(model, "octapb_c") == 127.2041 + # tests for adding a custom reaction def test_add_custom_reaction_1(): - test = editor.build_from_palsson_string('octapb + cysi__L[e] => (2)dhap + prbatp') + test = editor.build_from_palsson_string("octapb + cysi__L[e] => (2)dhap + prbatp") model = cobra.io.load_json_model("iML1515.json") - editor.add_custom_reaction(model, 'test_id', test) - assert (model.reactions.get_by_id('test_id').lower_bound == 0) - assert (model.reactions.get_by_id('test_id').upper_bound == 1000) + editor.add_custom_reaction(model, "test_id", test) + assert model.reactions.get_by_id("test_id").lower_bound == 0 + assert model.reactions.get_by_id("test_id").upper_bound == 1000 def test_add_custom_reaction_2(): - test = editor.build_from_palsson_string('octapb + cysi__L[e] <=> (2)dhap + prbatp') + test = editor.build_from_palsson_string("octapb + cysi__L[e] <=> (2)dhap + prbatp") model = cobra.io.load_json_model("iML1515.json") - editor.add_custom_reaction(model, 'test_id', test) - assert (model.reactions.get_by_id('test_id').lower_bound == -1000) - assert (model.reactions.get_by_id('test_id').upper_bound == 1000) + editor.add_custom_reaction(model, "test_id", test) + assert model.reactions.get_by_id("test_id").lower_bound == -1000 + assert model.reactions.get_by_id("test_id").upper_bound == 1000 def test_add_custom_reaction_3(): - test = editor.build_from_palsson_string('octapb + cysi__L[e] <= (2)dhap + prbatp') + test = editor.build_from_palsson_string("octapb + cysi__L[e] <= (2)dhap + prbatp") model = cobra.io.load_json_model("iML1515.json") - editor.add_custom_reaction(model, 'test_id', test) - assert (model.reactions.get_by_id('test_id').lower_bound == -1000) - assert (model.reactions.get_by_id('test_id').upper_bound == 0) + editor.add_custom_reaction(model, "test_id", test) + assert model.reactions.get_by_id("test_id").lower_bound == -1000 + assert model.reactions.get_by_id("test_id").upper_bound == 0 + # testing for copy_model_reactions def test_copy_model_reactions1(): model2 = model - lst = ['CYTDK2'] - editor.remove_reactions(model2,lst) + lst = ["CYTDK2"] + editor.remove_reactions(model2, lst) assert len(model2.reactions) == 2712 - len(lst) editor.copy_model_reactions(model2, model, lst) assert len(model.reactions) == 2712 assert len(model2.reactions) == 2712 + def test_copy_model_reactions2(): # copying an id that already exists in the duplicate model3 = model - lst = ['CYTDK2'] + lst = ["CYTDK2"] editor.copy_model_reactions(model3, model, lst) assert len(model3.reactions) == 2712 + def test_copy_model_reactions3(self): -#testing on copying a id that does not exist in the origional + # testing on copying a id that does not exist in the origional model4 = model - lst = ['C'] + lst = ["C"] with pytest.raises(Exception): editor.copy_model_reactions(model4, model, lst) diff --git a/tests/test_advanced.py b/tests/test_advanced.py index 0c0acb56..80bdb72f 100644 --- a/tests/test_advanced.py +++ b/tests/test_advanced.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -#from .context import sample +# from .context import sample import unittest @@ -9,9 +9,9 @@ class AdvancedTestSuite(unittest.TestCase): """Advanced test cases.""" def test_thoughts(self): - #self.assertIsNone(sample.hmm()) + # self.assertIsNone(sample.hmm()) pass -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/tests/test_basic.py b/tests/test_basic.py index e811ecd6..4a9d36da 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -#from .context import sample +# from .context import sample import unittest @@ -12,5 +12,5 @@ def test_absolute_truth_and_meaning(self): assert True -if __name__ == '__main__': - unittest.main() \ No newline at end of file +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_data/mock_data.py b/tests/test_data/mock_data.py index 4d501aee..7f41e50d 100755 --- a/tests/test_data/mock_data.py +++ b/tests/test_data/mock_data.py @@ -1,188 +1,226 @@ def mock_atp_biomass(): return { - 'cellwall': 0, - 'cofactor': 0, - 'dna': 0, - 'energy': 1, - 'id': 'bio1', - 'lipid': 0, - 'name': 'EnergyProduction', - 'other': 0, - 'protein': 0, - 'rna': 0, - 'templateBiomassComponents': [ + "cellwall": 0, + "cofactor": 0, + "dna": 0, + "energy": 1, + "id": "bio1", + "lipid": 0, + "name": "EnergyProduction", + "other": 0, + "protein": 0, + "rna": 0, + "templateBiomassComponents": [ { - 'class': 'energy', - 'coefficient': -1, - 'coefficient_type': 'MULTIPLIER', - 'link_coefficients': [1, -1, -1, -1], - 'linked_compound_refs': [ - '~/compcompounds/id/cpd00001_c', - '~/compcompounds/id/cpd00008_c', - '~/compcompounds/id/cpd00009_c', - '~/compcompounds/id/cpd00067_c' + "class": "energy", + "coefficient": -1, + "coefficient_type": "MULTIPLIER", + "link_coefficients": [1, -1, -1, -1], + "linked_compound_refs": [ + "~/compcompounds/id/cpd00001_c", + "~/compcompounds/id/cpd00008_c", + "~/compcompounds/id/cpd00009_c", + "~/compcompounds/id/cpd00067_c", ], - 'templatecompcompound_ref': '~/compcompounds/id/cpd00002_c' + "templatecompcompound_ref": "~/compcompounds/id/cpd00002_c", } ], - 'type': 'energy' + "type": "energy", } def mock_biomass(): return { - 'cellwall': 0, - 'cofactor': 0, - 'dna': 0, - 'energy': 41.257, - 'id': 'bio2', - 'lipid': 0, - 'name': 'CoreBiomass', - 'other': 1, - 'protein': 0, - 'rna': 0, - 'templateBiomassComponents': [ + "cellwall": 0, + "cofactor": 0, + "dna": 0, + "energy": 41.257, + "id": "bio2", + "lipid": 0, + "name": "CoreBiomass", + "other": 1, + "protein": 0, + "rna": 0, + "templateBiomassComponents": [ { - 'class': 'other', - 'coefficient': -0.0709, - 'coefficient_type': 'EXACT', - 'link_coefficients': [], - 'linked_compound_refs': [], - 'templatecompcompound_ref': '~/compcompounds/id/cpd00072_c' + "class": "other", + "coefficient": -0.0709, + "coefficient_type": "EXACT", + "link_coefficients": [], + "linked_compound_refs": [], + "templatecompcompound_ref": "~/compcompounds/id/cpd00072_c", }, { - 'class': 'other', - 'coefficient': -0.8977, - 'coefficient_type': 'EXACT', - 'link_coefficients': [], - 'linked_compound_refs': [], - 'templatecompcompound_ref': '~/compcompounds/id/cpd00101_c' + "class": "other", + "coefficient": -0.8977, + "coefficient_type": "EXACT", + "link_coefficients": [], + "linked_compound_refs": [], + "templatecompcompound_ref": "~/compcompounds/id/cpd00101_c", }, - {'class': 'other', - 'coefficient': -0.8977, - 'coefficient_type': 'EXACT', - 'link_coefficients': [], - 'linked_compound_refs': [], - 'templatecompcompound_ref': '~/compcompounds/id/cpd00236_c'}, - {'class': 'other', - 'coefficient': -0.129, - 'coefficient_type': 'EXACT', - 'link_coefficients': [], - 'linked_compound_refs': [], - 'templatecompcompound_ref': '~/compcompounds/id/cpd00102_c'}, - {'class': 'other', - 'coefficient': -1.496, - 'coefficient_type': 'EXACT', - 'link_coefficients': [], - 'linked_compound_refs': [], - 'templatecompcompound_ref': '~/compcompounds/id/cpd00169_c'}, - {'class': 'other', - 'coefficient': -0.5191, - 'coefficient_type': 'EXACT', - 'link_coefficients': [], - 'linked_compound_refs': [], - 'templatecompcompound_ref': '~/compcompounds/id/cpd00061_c'}, - {'class': 'other', - 'coefficient': -2.8328, - 'coefficient_type': 'EXACT', - 'link_coefficients': [], - 'linked_compound_refs': [], - 'templatecompcompound_ref': '~/compcompounds/id/cpd00020_c'}, - {'class': 'other', - 'coefficient': -3.7478, - 'coefficient_type': 'EXACT', - 'link_coefficients': [], - 'linked_compound_refs': [], - 'templatecompcompound_ref': '~/compcompounds/id/cpd00022_c'}, - {'class': 'other', - 'coefficient': -1.7867, - 'coefficient_type': 'EXACT', - 'link_coefficients': [], - 'linked_compound_refs': [], - 'templatecompcompound_ref': '~/compcompounds/id/cpd00032_c'}, - {'class': 'other', - 'coefficient': -1.0789, - 'coefficient_type': 'EXACT', - 'link_coefficients': [], - 'linked_compound_refs': [], - 'templatecompcompound_ref': '~/compcompounds/id/cpd00024_c'}, - {'class': 'other', - 'coefficient': -0.205, - 'coefficient_type': 'EXACT', - 'link_coefficients': [], - 'linked_compound_refs': [], - 'templatecompcompound_ref': '~/compcompounds/id/cpd00079_c'}, - {'class': 'other', - 'coefficient': -1.8225, - 'coefficient_type': 'EXACT', - 'link_coefficients': [-1], - 'linked_compound_refs': ['~/compcompounds/id/cpd00067_c'], - 'templatecompcompound_ref': '~/compcompounds/id/cpd00005_c'}, - {'class': 'other', - 'coefficient': -3.547, - 'coefficient_type': 'EXACT', - 'link_coefficients': [-1], - 'linked_compound_refs': ['~/compcompounds/id/cpd00067_c'], - 'templatecompcompound_ref': '~/compcompounds/id/cpd00003_c'}, - {'class': 'other', - 'coefficient': 3.7478, - 'coefficient_type': 'EXACT', - 'link_coefficients': [], - 'linked_compound_refs': [], - 'templatecompcompound_ref': '~/compcompounds/id/cpd00010_c'}, - {'class': 'other', - 'coefficient': 1, - 'coefficient_type': 'EXACT', - 'link_coefficients': [], - 'linked_compound_refs': [], - 'templatecompcompound_ref': '~/compcompounds/id/cpd11416_c'}, - {'class': 'other', - 'coefficient': 1.8225, - 'coefficient_type': 'EXACT', - 'link_coefficients': [], - 'linked_compound_refs': [], - 'templatecompcompound_ref': '~/compcompounds/id/cpd00006_c'}, - {'class': 'other', - 'coefficient': 3.547, - 'coefficient_type': 'EXACT', - 'link_coefficients': [], - 'linked_compound_refs': [], - 'templatecompcompound_ref': '~/compcompounds/id/cpd00004_c'}, - {'class': 'energy', - 'coefficient': -1, - 'coefficient_type': 'MULTIPLIER', - 'link_coefficients': [1, -1, -1, -1], - 'linked_compound_refs': ['~/compcompounds/id/cpd00001_c', - '~/compcompounds/id/cpd00008_c', - '~/compcompounds/id/cpd00009_c', - '~/compcompounds/id/cpd00067_c'], - 'templatecompcompound_ref': '~/compcompounds/id/cpd00002_c'}], - 'type': 'growth'} + { + "class": "other", + "coefficient": -0.8977, + "coefficient_type": "EXACT", + "link_coefficients": [], + "linked_compound_refs": [], + "templatecompcompound_ref": "~/compcompounds/id/cpd00236_c", + }, + { + "class": "other", + "coefficient": -0.129, + "coefficient_type": "EXACT", + "link_coefficients": [], + "linked_compound_refs": [], + "templatecompcompound_ref": "~/compcompounds/id/cpd00102_c", + }, + { + "class": "other", + "coefficient": -1.496, + "coefficient_type": "EXACT", + "link_coefficients": [], + "linked_compound_refs": [], + "templatecompcompound_ref": "~/compcompounds/id/cpd00169_c", + }, + { + "class": "other", + "coefficient": -0.5191, + "coefficient_type": "EXACT", + "link_coefficients": [], + "linked_compound_refs": [], + "templatecompcompound_ref": "~/compcompounds/id/cpd00061_c", + }, + { + "class": "other", + "coefficient": -2.8328, + "coefficient_type": "EXACT", + "link_coefficients": [], + "linked_compound_refs": [], + "templatecompcompound_ref": "~/compcompounds/id/cpd00020_c", + }, + { + "class": "other", + "coefficient": -3.7478, + "coefficient_type": "EXACT", + "link_coefficients": [], + "linked_compound_refs": [], + "templatecompcompound_ref": "~/compcompounds/id/cpd00022_c", + }, + { + "class": "other", + "coefficient": -1.7867, + "coefficient_type": "EXACT", + "link_coefficients": [], + "linked_compound_refs": [], + "templatecompcompound_ref": "~/compcompounds/id/cpd00032_c", + }, + { + "class": "other", + "coefficient": -1.0789, + "coefficient_type": "EXACT", + "link_coefficients": [], + "linked_compound_refs": [], + "templatecompcompound_ref": "~/compcompounds/id/cpd00024_c", + }, + { + "class": "other", + "coefficient": -0.205, + "coefficient_type": "EXACT", + "link_coefficients": [], + "linked_compound_refs": [], + "templatecompcompound_ref": "~/compcompounds/id/cpd00079_c", + }, + { + "class": "other", + "coefficient": -1.8225, + "coefficient_type": "EXACT", + "link_coefficients": [-1], + "linked_compound_refs": ["~/compcompounds/id/cpd00067_c"], + "templatecompcompound_ref": "~/compcompounds/id/cpd00005_c", + }, + { + "class": "other", + "coefficient": -3.547, + "coefficient_type": "EXACT", + "link_coefficients": [-1], + "linked_compound_refs": ["~/compcompounds/id/cpd00067_c"], + "templatecompcompound_ref": "~/compcompounds/id/cpd00003_c", + }, + { + "class": "other", + "coefficient": 3.7478, + "coefficient_type": "EXACT", + "link_coefficients": [], + "linked_compound_refs": [], + "templatecompcompound_ref": "~/compcompounds/id/cpd00010_c", + }, + { + "class": "other", + "coefficient": 1, + "coefficient_type": "EXACT", + "link_coefficients": [], + "linked_compound_refs": [], + "templatecompcompound_ref": "~/compcompounds/id/cpd11416_c", + }, + { + "class": "other", + "coefficient": 1.8225, + "coefficient_type": "EXACT", + "link_coefficients": [], + "linked_compound_refs": [], + "templatecompcompound_ref": "~/compcompounds/id/cpd00006_c", + }, + { + "class": "other", + "coefficient": 3.547, + "coefficient_type": "EXACT", + "link_coefficients": [], + "linked_compound_refs": [], + "templatecompcompound_ref": "~/compcompounds/id/cpd00004_c", + }, + { + "class": "energy", + "coefficient": -1, + "coefficient_type": "MULTIPLIER", + "link_coefficients": [1, -1, -1, -1], + "linked_compound_refs": [ + "~/compcompounds/id/cpd00001_c", + "~/compcompounds/id/cpd00008_c", + "~/compcompounds/id/cpd00009_c", + "~/compcompounds/id/cpd00067_c", + ], + "templatecompcompound_ref": "~/compcompounds/id/cpd00002_c", + }, + ], + "type": "growth", + } def mock_template(): template_data = { - '__VERSION__': 1, - 'id': 'CoreModelTemplateTest', - 'biochemistry_ref': '1/2/3', - 'type': 'GenomeScale', - 'domain': 'Bacteria', - 'biomasses': [mock_biomass(), mock_atp_biomass()], - 'compartments': [ + "__VERSION__": 1, + "id": "CoreModelTemplateTest", + "biochemistry_ref": "1/2/3", + "type": "GenomeScale", + "domain": "Bacteria", + "biomasses": [mock_biomass(), mock_atp_biomass()], + "compartments": [ { - 'aliases': [], - 'hierarchy': 3, - 'id': 'c', - 'index': '0', - 'name': 'Cytosol', - 'pH': 7}, - {'aliases': [], - 'hierarchy': 0, - 'id': 'e', - 'index': '1', - 'name': 'Extracellular', - }], - + "aliases": [], + "hierarchy": 3, + "id": "c", + "index": "0", + "name": "Cytosol", + "pH": 7, + }, + { + "aliases": [], + "hierarchy": 0, + "id": "e", + "index": "1", + "name": "Extracellular", + }, + ], } return template_data @@ -195,15 +233,16 @@ def mock_model(): pass -def remap(model, bigg_to_seed_cpd, bigg_to_seed_rxn, index='0'): +def remap(model, bigg_to_seed_cpd, bigg_to_seed_rxn, index="0"): from cobra.core import Model, Metabolite, Reaction from modelseedpy.core.msmodel import get_cmp_token + model_result = Model(model.id) metabolites = {} for m in model.metabolites: metabolite_id = m.id if m.id[:-2] in bigg_to_seed_cpd: - metabolite_id = f'{bigg_to_seed_cpd[m.id[:-2]]}_{m.compartment}{index}' + metabolite_id = f"{bigg_to_seed_cpd[m.id[:-2]]}_{m.compartment}{index}" m_result = Metabolite(metabolite_id, m.formula, m.name, m.charge, m.compartment) metabolites[m.id] = m_result @@ -213,8 +252,10 @@ def remap(model, bigg_to_seed_cpd, bigg_to_seed_rxn, index='0'): reaction_id = r.id if r.id in bigg_to_seed_rxn: compartment = get_cmp_token(r.compartments) - reaction_id = f'{bigg_to_seed_rxn[r.id]}_{compartment}{index}' - r_result = Reaction(reaction_id, r.name, r.subsystem, r.lower_bound, r.upper_bound) + reaction_id = f"{bigg_to_seed_rxn[r.id]}_{compartment}{index}" + r_result = Reaction( + reaction_id, r.name, r.subsystem, r.lower_bound, r.upper_bound + ) s = {} for m, value in r.metabolites.items(): if m.id in metabolites: @@ -231,116 +272,141 @@ def remap(model, bigg_to_seed_cpd, bigg_to_seed_rxn, index='0'): def mock_model_ecoli_core(seed=True): from cobra.io import load_json_model from os import path - model = load_json_model(path.join(path.dirname(__file__),'e_coli_core.json')) + + model = load_json_model(path.join(path.dirname(__file__), "e_coli_core.json")) if not seed: return model - bigg_to_seed_cpd = {'pyr': 'cpd00020', - '3pg': 'cpd00169', - 'q8h2': 'cpd15561', - 'pi': 'cpd00009', - 'xu5p__D': 'cpd00198', - '2pg': 'cpd00482', - 'glu__L': 'cpd00023', - 'glc__D': 'cpd00027', - 'g3p': 'cpd00102', - 'e4p': 'cpd00236', - '6pgl': 'cpd00911', - 'lac__D': 'cpd00221', - 'acon_C': 'cpd00331', - 'oaa': 'cpd00032', - 'coa': 'cpd00010', - 'ru5p__D': 'cpd00171', - 'atp': 'cpd00002', - 'nadh': 'cpd00004', - 'o2': 'cpd00007', - 'gln__L': 'cpd00053', - 'nadp': 'cpd00006', - 'acald': 'cpd00071', - 'h': 'cpd00067', - 'nh4': 'cpd00013', - 'nadph': 'cpd00005', - 'h2o': 'cpd00001', - 'co2': 'cpd00011', - 'accoa': 'cpd00022', - 'adp': 'cpd00008', - 'dhap': 'cpd00095', - 'cit': 'cpd00137', - 'fum': 'cpd00106', - 'f6p': 'cpd00072', - 'r5p': 'cpd00101', - 'etoh': 'cpd00363', - '6pgc': 'cpd00284', - 'akg': 'cpd00024', - 'fdp': 'cpd00290', - 'amp': 'cpd00018', - 'for': 'cpd00047', - 'nad': 'cpd00003', - '13dpg': 'cpd00203', - 'succoa': 'cpd00078', - 'succ': 'cpd00036', - 'glx': 'cpd00040', - 'icit': 'cpd00260', - 'mal__L': 'cpd00130', - 'q8': 'cpd15560', - 'actp': 'cpd00196', - 'fru': 'cpd00082', - 'g6p': 'cpd00079', - 'ac': 'cpd00029', - 's7p': 'cpd00238', - 'pep': 'cpd00061'} + bigg_to_seed_cpd = { + "pyr": "cpd00020", + "3pg": "cpd00169", + "q8h2": "cpd15561", + "pi": "cpd00009", + "xu5p__D": "cpd00198", + "2pg": "cpd00482", + "glu__L": "cpd00023", + "glc__D": "cpd00027", + "g3p": "cpd00102", + "e4p": "cpd00236", + "6pgl": "cpd00911", + "lac__D": "cpd00221", + "acon_C": "cpd00331", + "oaa": "cpd00032", + "coa": "cpd00010", + "ru5p__D": "cpd00171", + "atp": "cpd00002", + "nadh": "cpd00004", + "o2": "cpd00007", + "gln__L": "cpd00053", + "nadp": "cpd00006", + "acald": "cpd00071", + "h": "cpd00067", + "nh4": "cpd00013", + "nadph": "cpd00005", + "h2o": "cpd00001", + "co2": "cpd00011", + "accoa": "cpd00022", + "adp": "cpd00008", + "dhap": "cpd00095", + "cit": "cpd00137", + "fum": "cpd00106", + "f6p": "cpd00072", + "r5p": "cpd00101", + "etoh": "cpd00363", + "6pgc": "cpd00284", + "akg": "cpd00024", + "fdp": "cpd00290", + "amp": "cpd00018", + "for": "cpd00047", + "nad": "cpd00003", + "13dpg": "cpd00203", + "succoa": "cpd00078", + "succ": "cpd00036", + "glx": "cpd00040", + "icit": "cpd00260", + "mal__L": "cpd00130", + "q8": "cpd15560", + "actp": "cpd00196", + "fru": "cpd00082", + "g6p": "cpd00079", + "ac": "cpd00029", + "s7p": "cpd00238", + "pep": "cpd00061", + } bigg_to_seed_rxn = { - 'FBP': 'rxn00549', 'PIt2r': 'rxn05312', 'PPCK': 'rxn00247', 'FBA': 'rxn00786', 'MALt2_2': 'rxn08865', - 'TKT1': 'rxn01200', 'FORt': 'rxn08525', 'FRD7': 'rxn09272_copy1', 'PFK': 'rxn00545', 'SUCCt3': 'rxn09270', - 'PTAr': 'rxn00173', 'CYTBD': 'rxn08288', 'ENO': 'rxn00459', 'NADTRHD': 'rxn00083', 'ADK1': 'rxn00097', - 'PPC': 'rxn32421', 'PDH': 'rxn00154', 'CS': 'rxn19316', 'GLNS': 'rxn00187', 'PGI': 'rxn00558', - 'H2Ot': 'rxn05319', 'TPI': 'rxn00747', 'O2t': 'rxn05468', 'PYK': 'rxn35242', 'FRUpts2': 'rxn08535', - 'GND': 'rxn01115', 'ACKr': 'rxn00225', - 'LDH_D': 'rxn00500', - 'D_LACt2': 'rxn08350', - 'MALS': 'rxn20162', - 'TALA': 'rxn01333', - 'FUM': 'rxn30674', - 'PGK': 'rxn01100', - 'NH4t': 'rxn39085', - 'ATPS4r': 'rxn08173', - 'SUCOAS': 'rxn00285', - 'ME2': 'rxn00161', - 'ALCD2x': 'rxn00543', - 'GLUt2r': 'rxn05297', - 'CO2t': 'rxn05467', - 'ACt2r': 'rxn05488', - 'GLUSy': 'rxn00085', - 'ATPM': 'rxn00062', - 'PFL': 'rxn34258', - 'ACALD': 'rxn00171', - 'FORt2': 'rxn05559', - 'SUCDi': 'rxn09272', - 'G6PDH2r': 'rxn00604', - 'ME1': 'rxn00159', - 'NADH16': 'rxn08972', - 'FUMt2_2': 'rxn08542', - 'PGM': 'rxn01106', - 'ICDHyr': 'rxn00198', - 'PGL': 'rxn01476', - 'GAPD': 'rxn00781', - 'THD2': 'rxn09295', - 'TKT2': 'rxn00785', - 'ACALDt': 'rxn08032', - 'GLUN': 'rxn00189', - 'ICL': 'rxn00336', - 'PPS': 'rxn00147', - 'SUCCt2_2': 'rxn09269', - 'MDH': 'rxn00248', - 'ACONTa': 'rxn00974', - 'AKGt2r': 'rxn05493', - 'RPI': 'rxn00777', - 'AKGDH': 'rxn08094', - 'GLCpts': 'rxn05226', - 'GLNabc': 'rxn05155', - 'ETOHt2r': 'rxn08427', - 'GLUDy': 'rxn00184', - 'PYRt2': 'rxn05469', - 'ACONTb': 'rxn32587', - 'RPE': 'rxn01116'} + "FBP": "rxn00549", + "PIt2r": "rxn05312", + "PPCK": "rxn00247", + "FBA": "rxn00786", + "MALt2_2": "rxn08865", + "TKT1": "rxn01200", + "FORt": "rxn08525", + "FRD7": "rxn09272_copy1", + "PFK": "rxn00545", + "SUCCt3": "rxn09270", + "PTAr": "rxn00173", + "CYTBD": "rxn08288", + "ENO": "rxn00459", + "NADTRHD": "rxn00083", + "ADK1": "rxn00097", + "PPC": "rxn32421", + "PDH": "rxn00154", + "CS": "rxn19316", + "GLNS": "rxn00187", + "PGI": "rxn00558", + "H2Ot": "rxn05319", + "TPI": "rxn00747", + "O2t": "rxn05468", + "PYK": "rxn35242", + "FRUpts2": "rxn08535", + "GND": "rxn01115", + "ACKr": "rxn00225", + "LDH_D": "rxn00500", + "D_LACt2": "rxn08350", + "MALS": "rxn20162", + "TALA": "rxn01333", + "FUM": "rxn30674", + "PGK": "rxn01100", + "NH4t": "rxn39085", + "ATPS4r": "rxn08173", + "SUCOAS": "rxn00285", + "ME2": "rxn00161", + "ALCD2x": "rxn00543", + "GLUt2r": "rxn05297", + "CO2t": "rxn05467", + "ACt2r": "rxn05488", + "GLUSy": "rxn00085", + "ATPM": "rxn00062", + "PFL": "rxn34258", + "ACALD": "rxn00171", + "FORt2": "rxn05559", + "SUCDi": "rxn09272", + "G6PDH2r": "rxn00604", + "ME1": "rxn00159", + "NADH16": "rxn08972", + "FUMt2_2": "rxn08542", + "PGM": "rxn01106", + "ICDHyr": "rxn00198", + "PGL": "rxn01476", + "GAPD": "rxn00781", + "THD2": "rxn09295", + "TKT2": "rxn00785", + "ACALDt": "rxn08032", + "GLUN": "rxn00189", + "ICL": "rxn00336", + "PPS": "rxn00147", + "SUCCt2_2": "rxn09269", + "MDH": "rxn00248", + "ACONTa": "rxn00974", + "AKGt2r": "rxn05493", + "RPI": "rxn00777", + "AKGDH": "rxn08094", + "GLCpts": "rxn05226", + "GLNabc": "rxn05155", + "ETOHt2r": "rxn08427", + "GLUDy": "rxn00184", + "PYRt2": "rxn05469", + "ACONTb": "rxn32587", + "RPE": "rxn01116", + } return remap(model, bigg_to_seed_cpd, bigg_to_seed_rxn) From 861f565b0278f9570d5656a14b2acd350c50d07c Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 8 Dec 2022 12:00:02 -0600 Subject: [PATCH 053/298] More formatting wtih black --- modelseedpy/biochem/modelseed_biochem.py | 2 ++ modelseedpy/biochem/modelseed_compound.py | 2 +- modelseedpy/community/mscommunity.py | 2 +- modelseedpy/core/biolog.py | 2 +- modelseedpy/core/fbahelper.py | 1 - modelseedpy/core/msatpcorrection.py | 5 +++-- modelseedpy/core/msbuilder.py | 3 ++- modelseedpy/core/msgapfill.py | 2 +- modelseedpy/core/msgenome.py | 3 ++- modelseedpy/fbapkg/basefbapkg.py | 2 ++ modelseedpy/fbapkg/flexiblebiomasspkg.py | 2 +- modelseedpy/fbapkg/reactionusepkg.py | 2 +- 12 files changed, 17 insertions(+), 11 deletions(-) diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index 9b3c7e06..d136d452 100644 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -179,6 +179,7 @@ def load_metabolites_from_df( logger.error("failed to read compound at Index: %s. %s", t[0], e) return compounds + def _load_aliases_df(df_aliases, seed_index=1, source_index=3, alias_id_index=2): aliases = {} for i in df_aliases.itertuples(): @@ -319,6 +320,7 @@ def _load_reactions( return reactions, metabolites_indexed + def load_reactions_from_df( df: pd.DataFrame, database_metabolites: dict, diff --git a/modelseedpy/biochem/modelseed_compound.py b/modelseedpy/biochem/modelseed_compound.py index 2cb637f9..89c4d5f5 100644 --- a/modelseedpy/biochem/modelseed_compound.py +++ b/modelseedpy/biochem/modelseed_compound.py @@ -149,4 +149,4 @@ def is_obsolete(self): return False else: return True - return False \ No newline at end of file + return False diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index 518fd3f4..c2b5ab6f 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -33,7 +33,7 @@ def __init__( biomass_cpd, # metabolite in the biomass reaction names=[], # names of the community species #TODO - look into whether there should be a names field name=None, # the name of a species - index=None # the index of the species + index=None, # the index of the species ): self.community, self.biomass_cpd = community, biomass_cpd print(self.biomass_cpd.compartment) diff --git a/modelseedpy/core/biolog.py b/modelseedpy/core/biolog.py index 8b667c98..3b18b82a 100644 --- a/modelseedpy/core/biolog.py +++ b/modelseedpy/core/biolog.py @@ -171,4 +171,4 @@ def run_plates(self, model, biomass=None, cmp="e"): # !!! biomass is never used plate.wells[well_id]["growth"] = ovalue # print(well_id, solution) # print(well_id, media) - return prev_medium \ No newline at end of file + return prev_medium diff --git a/modelseedpy/core/fbahelper.py b/modelseedpy/core/fbahelper.py index d4348662..39102323 100644 --- a/modelseedpy/core/fbahelper.py +++ b/modelseedpy/core/fbahelper.py @@ -287,7 +287,6 @@ def validate_dictionary(dictionary, required_keys, optional_keys={}): return dictionary @staticmethod - def parse_media(media): return [cpd.id for cpd in media.data["mediacompounds"]] diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index fb65dc05..c5b20e3c 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -60,7 +60,7 @@ def __init__( atp_hydrolysis_id=None, load_default_medias=True, forced_media=[], - default_media_path=None + default_media_path=None, ): """ :param model: @@ -285,7 +285,7 @@ def evaluate_growth_media(self): ) self.media_gapfill_stats[media] = None output[media.id] = solution.objective_value - + if ( solution.objective_value < minimum_obj or solution.status != "optimal" @@ -345,6 +345,7 @@ def determine_growth_media2(self, max_gapfilling=None): Decides which of the test media to use as growth conditions for this model :return: """ + def scoring_function(media): return len(self.media_gapfill_stats[media]["new"].keys()) + 0.5 * len( self.media_gapfill_stats[media]["reversed"].keys() diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 82c28d61..2ef832e3 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -179,7 +179,7 @@ "cpd15352_c0": -0.00719527989638797, "cpd11463_c0": -0.5, "cpd11461_c0": -0.1, - "cpd11462_c0": -0.2 + "cpd11462_c0": -0.2, } @@ -778,6 +778,7 @@ def gapfill_model(original_mdl, target_reaction, template, media): rxn.lower_bound = -100 return original_mdl + def build_metabolic_model( genome, media=None, diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index cc2a88bf..9b42e17d 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -48,7 +48,7 @@ def __init__( "cpd02701", "cpd11416", "cpd15302", - "cpd03091" + "cpd03091", ] # the cpd11416 compound is filtered during model extension with templates self.gfmodel = self.lp_filename = self.last_solution = None self.model_penalty = 1 diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index fe150cfb..999e464d 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -18,6 +18,7 @@ def read_fasta(f, split=DEFAULT_SPLIT, h_func=None): with open(f, "r") as fh: return parse_fasta_str(fh.read(), split, h_func) + def parse_fasta_str(faa_str, split=DEFAULT_SPLIT, h_func=None): features = [] seq = None @@ -36,7 +37,7 @@ def parse_fasta_str(faa_str, split=DEFAULT_SPLIT, h_func=None): desc = header_data[ 1 ] # The unit test throws an error when this is commented - + seq = MSFeature(seq_id, "", desc) else: if seq: diff --git a/modelseedpy/fbapkg/basefbapkg.py b/modelseedpy/fbapkg/basefbapkg.py index e5bc3931..662696f3 100644 --- a/modelseedpy/fbapkg/basefbapkg.py +++ b/modelseedpy/fbapkg/basefbapkg.py @@ -21,8 +21,10 @@ # Adding a few exception classes to handle different types of errors class FeasibilityError(Exception): """Error in FBA formulation""" + pass + class BaseFBAPkg: """ Base class for FBA packages diff --git a/modelseedpy/fbapkg/flexiblebiomasspkg.py b/modelseedpy/fbapkg/flexiblebiomasspkg.py index a8c99dc4..ae8a1cfe 100644 --- a/modelseedpy/fbapkg/flexiblebiomasspkg.py +++ b/modelseedpy/fbapkg/flexiblebiomasspkg.py @@ -313,7 +313,7 @@ def build_constraint(self, cobra_obj, obj_type): else: const = BaseFBAPkg.build_constraint( self, - "f" + obj_type, + "f" + obj_type, 0, None, {biovar: second_entry, object.forward_variable: -1}, diff --git a/modelseedpy/fbapkg/reactionusepkg.py b/modelseedpy/fbapkg/reactionusepkg.py index c85ebd44..f3e17bc9 100644 --- a/modelseedpy/fbapkg/reactionusepkg.py +++ b/modelseedpy/fbapkg/reactionusepkg.py @@ -24,7 +24,7 @@ def __init__(self, model): }, ) - def build_package(self, rxn_filter=None, reversibility=False): + def build_package(self, rxn_filter=None, reversibility=False): for rxn in self.model.reactions: # Checking that reaction passes input filter if one is provided if rxn_filter == None: From bcee27d98b214125e9a00599ae843e1ae8146df0 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 8 Dec 2022 15:38:31 -0600 Subject: [PATCH 054/298] Running black on builder --- modelseedpy/core/msbuilder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index aac079eb..606825f7 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -121,7 +121,7 @@ "cpd00254_c0": -0.00280615915959131, "cpd11463_c0": -0.5, "cpd11461_c0": -0.1, - "cpd11462_c0": -0.2 + "cpd11462_c0": -0.2, } grampos = { @@ -188,7 +188,7 @@ "cpd15352_c0": -0.00719527989638797, "cpd11463_c0": -0.5, "cpd11461_c0": -0.1, - "cpd11462_c0": -0.2 + "cpd11462_c0": -0.2, } From 6f71669ca8c9ba3cf4a8bdc9f862e5ee20d28fc7 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 8 Dec 2022 15:39:40 -0600 Subject: [PATCH 055/298] Deleting bad context file --- tests/context.py | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 tests/context.py diff --git a/tests/context.py b/tests/context.py deleted file mode 100644 index 1305ddcf..00000000 --- a/tests/context.py +++ /dev/null @@ -1,8 +0,0 @@ -# -*- coding: utf-8 -*- - -import sys -import os - -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) - -import sample From fc756a63258ac34ff80cc984ba90befe8bff66c8 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Sat, 10 Dec 2022 00:03:43 -0600 Subject: [PATCH 056/298] pre commit hooks fix --- modelseedpy/config.cfg | 2 +- modelseedpy/core/msgrowthphenotypes.py | 1 + modelseedpy/core/msmedia.py | 3 ++- modelseedpy/core/msmodelutl.py | 4 ++-- modelseedpy/data/atp_medias.tsv | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/modelseedpy/config.cfg b/modelseedpy/config.cfg index 5afa6feb..8bc1172e 100644 --- a/modelseedpy/config.cfg +++ b/modelseedpy/config.cfg @@ -8,4 +8,4 @@ media_folder = data/media log_file = no filename = modelseedpy.log console_level = warning -file_level = info \ No newline at end of file +file_level = info diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 454b1936..309a942e 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- import pandas as pd import logging import cobra diff --git a/modelseedpy/core/msmedia.py b/modelseedpy/core/msmedia.py index 9e012f4e..e5ba1b7b 100644 --- a/modelseedpy/core/msmedia.py +++ b/modelseedpy/core/msmedia.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- import logging from cobra.core.dictlist import DictList @@ -72,4 +73,4 @@ def merge(self, media, overwrite_overlap=False): self.mediacompounds[newcpd.id] = newcpd else: new_cpds.append(newcpd) - self.mediacompounds += new_cpds + self.mediacompounds += new_cpds diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 65042804..d4494938 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -464,7 +464,7 @@ def convert_cobra_reaction_to_kbreaction( """Tests if every reaction in a given gapfilling solution is actually needed for growth Optionally can remove unneeded reactions from the model AND the solution object. Note, this code assumes the gapfilling solution is already integrated. - + Parameters ---------- {"new":{string reaction_id: string direction},"reversed":{string reaction_id: string direction}} - solution @@ -475,7 +475,7 @@ def convert_cobra_reaction_to_kbreaction( ------- list> List of unneeded reactions - + Raises ------ """ diff --git a/modelseedpy/data/atp_medias.tsv b/modelseedpy/data/atp_medias.tsv index 7718230e..4a4b7a84 100644 --- a/modelseedpy/data/atp_medias.tsv +++ b/modelseedpy/data/atp_medias.tsv @@ -27,4 +27,4 @@ EX_cpd00048_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 EX_cpd00081_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 EX_cpd11632_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 EX_cpd08701_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 -EX_cpd01024_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 \ No newline at end of file +EX_cpd01024_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 From f8955b21e803d2b239555dc95b59d35c68d6e4b0 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Sat, 10 Dec 2022 00:09:26 -0600 Subject: [PATCH 057/298] crlf --- modelseedpy/config.cfg | 20 +- modelseedpy/core/msgrowthphenotypes.py | 590 ++++++++++++------------- modelseedpy/core/msmedia.py | 152 +++---- 3 files changed, 381 insertions(+), 381 deletions(-) diff --git a/modelseedpy/config.cfg b/modelseedpy/config.cfg index 8bc1172e..e9be1382 100644 --- a/modelseedpy/config.cfg +++ b/modelseedpy/config.cfg @@ -1,11 +1,11 @@ -[biochem] -path = data/ModelSEEDDatabase -[data] -template_folder = data/templates -classifier_folder = data/ml -media_folder = data/media -[logging] -log_file = no -filename = modelseedpy.log -console_level = warning +[biochem] +path = data/ModelSEEDDatabase +[data] +template_folder = data/templates +classifier_folder = data/ml +media_folder = data/media +[logging] +log_file = no +filename = modelseedpy.log +console_level = warning file_level = info diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 309a942e..6c30bb2a 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -1,295 +1,295 @@ -# -*- coding: utf-8 -*- -import pandas as pd -import logging -import cobra -from cobra.core.dictlist import DictList -from modelseedpy.core.msmedia import MSMedia -from modelseedpy.fbapkg.mspackagemanager import MSPackageManager -from modelseedpy.core.msmodelutl import MSModelUtil -from modelseedpy.core.msgapfill import MSGapfill - -logger = logging.getLogger(__name__) - - -class MSGrowthPhenotype: - def __init__( - self, - id, - media=None, - growth=None, - gene_ko=[], - additional_compounds=[], - parent=None, - name=None, - ): - self.id = id - self.name = name - if name == None: - self.name = self.id - self.growth = growth - self.media = media - self.gene_ko = gene_ko - self.gapfilling = None - self.additional_compounds = additional_compounds - self.parent = parent - - def build_media(self): - cpd_hash = {} - for cpd in self.additional_compounds: - cpd_hash[cpd] = 100 - full_media = MSMedia.from_dict(cpd_hash) - if self.media != None: - full_media.merge(self.media, overwrite_overlap=False) - if self.parent != None and self.parent.base_media != None: - full_media.merge(parent.base_media, overwrite_overlap=False) - return full_media - - def simulate( - self, - modelutl, - growth_threshold=0.001, - add_missing_exchanges=False, - save_fluxes=False, - pfba=False, - ): - if not isinstance(modelutl, MSModelUtil): - modelutl = MSModelUtil(modelutl) - media = self.build_media() - output = {"growth": None, "class": None, "missing_transports": []} - if add_missing_exchanges: - output["missing_transports"] = modelutl.add_missing_exchanges(media) - pkgmgr = MSPackageManager.get_pkg_mgr(modelutl.model) - pkgmgr.getpkg("KBaseMediaPkg").build_package( - media, self.parent.base_uptake, self.parent.base_excretion - ) - for gene in self.gene_ko: - if gene in modelutl.model.genes: - geneobj = modelutl.model.genes.get_by_id(gene) - geneobj.knock_out() - solution = modelutl.model.optimize() - output["growth"] = solution.objective_value - if solution.objective_value > 0 and pfba: - solution = cobra.flux_analysis.pfba(modelutl.model) - if save_fluxes: - output["fluxes"] = solution.fluxes - if output["growth"] >= growth_threshold: - if self.growth > 0: - output["class"] = "CP" - else: - output["class"] = "FP" - else: - if self.growth > 0: - output["class"] = "FN" - else: - output["class"] = "CN" - return output - - def gapfill_model_for_phenotype( - self, - modelutl, - default_gapfill_templates, - test_conditions, - default_gapfill_models=[], - blacklist=[], - growth_threshold=0.001, - add_missing_exchanges=False, - ): - if not isinstance(modelutl, MSModelUtil): - modelutl = MSModelUtil(modelutl) - self.gapfilling = MSGapfill( - modelutl.model, - default_gapfill_templates, - default_gapfill_models, - test_conditions, - modelutl.reaction_scores(), - blacklist, - ) - media = self.build_media() - if add_missing_exchanges: - modelutl.add_missing_exchanges(media) - for gene in self.gene_ko: - if gene in modelutl.model.genes: - geneobj = modelutl.model.genes.get_by_id(gene) - geneobj.knock_out() - gfresults = self.gapfilling.run_gapfilling(media, None) - if gfresults is None: - logger.warning( - "Gapfilling failed with the specified model, media, and target reaction." - ) - return self.gapfilling.integrate_gapfill_solution(gfresults) - - -class MSGrowthPhenotypes: - def __init__(self, base_media=None, base_uptake=0, base_excretion=1000): - self.base_media = base_media - self.phenotypes = DictList() - self.base_uptake = base_uptake - self.base_excretion = base_excretion - - @staticmethod - def from_compound_hash(compounds, base_media, base_uptake=0, base_excretion=1000): - growthpheno = MSGrowthPhenotypes(base_media, base_uptake, base_excretion) - new_phenos = [] - for cpd in compounds: - newpheno = MSGrowthPhenotype(cpd, None, compounds[cpd], [], [cpd]) - new_phenos.append(newpheno) - growthpheno.add_phenotypes(new_phenos) - return growthpheno - - @staticmethod - def from_kbase_object(data, kbase_api): - growthpheno = MSGrowthPhenotypes(None, 0, 1000) - new_phenos = [] - for pheno in data["phenotypes"]: - media = kbase_api.get_from_ws(pheno["media_ref"], None) - geneko = [] - for gene in pheno["geneko_refs"]: - geneko.append(added_cpd.split("/").pop()) - added_compounds = [] - for added_cpd in pheno["additionalcompound_refs"]: - added_compounds.append(added_cpd.split("/").pop()) - newpheno = MSGrowthPhenotype( - pheno["id"], media, pheno["normalizedGrowth"], geneko, added_compounds - ) - new_phenos.append(newpheno) - growthpheno.add_phenotypes(new_phenos) - return growthpheno - - @staticmethod - def from_kbase_file(filename, kbase_api): - # TSV file with the following headers:media mediaws growth geneko addtlCpd - growthpheno = MSGrowthPhenotypes(base_media, 0, 1000) - headings = [] - new_phenos = [] - with open(filename) as f: - lines = f.readlines() - for line in lines: - items = line.split("\t") - if headings == None: - headings = items - else: - data = {} - for i in range(0, len(items)): - data[headings[i]] = items[i] - data = FBAHelper.validate_dictionary( - headings, - ["media", "growth"], - {"mediaws": None, "geneko": [], "addtlCpd": []}, - ) - media = kbase_api.get_from_ws(data["media"], data["mediaws"]) - id = data["media"] - if len(data["geneko"]) > 0: - id += "-" + ",".join(data["geneko"]) - if len(data["addtlCpd"]) > 0: - id += "-" + ",".join(data["addtlCpd"]) - newpheno = MSGrowthPhenotype( - id, media, data["growth"], data["geneko"], data["addtlCpd"] - ) - new_phenos.append(newpheno) - growthpheno.add_phenotypes(new_phenos) - return growthpheno - - @staticmethod - def from_ms_file(filename, basemedia, base_uptake=0, base_excretion=100): - growthpheno = MSGrowthPhenotypes(base_media, base_uptake, base_excretion) - df = pd.read_csv(filename) - required_headers = ["Compounds", "Growth"] - for item in required_headers: - if item not in df: - raise ValueError("Required header " + item + " is missing!") - new_phenos = [] - for row in df.rows: - cpds = row["Compounds"].split(";") - id = row["Compounds"] - if "ID" in row: - id = row["ID"] - geneko = [] - if "GeneKO" in row: - geneko = row["GeneKO"].split(";") - newpheno = MSGrowthPhenotype(id, None, row["Growth"], geneko, cpds) - new_phenos.append(newpheno) - growthpheno.add_phenotypes(new_phenos) - return growthpheno - - def add_phenotypes(self, new_phenotypes): - keep_phenos = [] - for pheno in new_phenotypes: - if pheno.id not in self.phenotypes: - pheno.parent = self - keep_phenos.append(pheno) - additions = DictList(keep_phenos) - self.phenotypes += additions - - def simulate_phenotypes( - self, - model, - biomass, - add_missing_exchanges=False, - correct_false_negatives=False, - template=None, - growth_threshold=0.001, - save_fluxes=False, - ): - model.objective = biomass - modelutl = MSModelUtil(model) - summary = { - "Label": ["Accuracy", "CP", "CN", "FP", "FN"], - "Count": [0, 0, 0, 0, 0], - } - data = { - "Phenotype": [], - "Observed growth": [], - "Simulated growth": [], - "Class": [], - "Transports missing": [], - "Gapfilled reactions": [], - } - for pheno in self.phenotypes: - with model: - result = pheno.simulate( - modelutl, growth_threshold, add_missing_exchanges, save_fluxes - ) # Result should have "growth" and "class" - if result["class"] == "FN" and correct_false_negatives: - pheno.gapfill_model_for_phenotype(modelutl, [template], None) - if pheno.gapfilling.last_solution != None: - list = [] - for rxn_id in pheno.gapfilling.last_solution["reversed"]: - list.append( - pheno.gapfilling.last_solution["reversed"][rxn_id] - + rxn_id - ) - for rxn_id in pheno.gapfilling.last_solution["new"]: - list.append( - pheno.gapfilling.last_solution["new"][rxn_id] + rxn_id - ) - data["Gapfilled reactions"].append(";".join(list)) - else: - data["Gapfilled reactions"].append(None) - else: - data["Gapfilled reactions"].append(None) - result = pheno.simulate( - modelutl, growth_threshold, add_missing_exchanges, save_fluxes - ) # Result should have "growth" and "class" - data["Class"].append(result["class"]) - data["Phenotype"].append(pheno.id) - data["Observed growth"].append(pheno.growth) - data["Simulated growth"].append(result["growth"]) - data["Transports missing"].append( - ";".join(result["missing_transports"]) - ) - if result["class"] == "CP": - summary["Count"][1] += 1 - summary["Count"][0] += 1 - if result["class"] == "CN": - summary["Count"][2] += 1 - summary["Count"][0] += 1 - if result["class"] == "FP": - summary["Count"][3] += 1 - if result["class"] == "FN": - summary["Count"][4] += 1 - - summary["Count"][0] = summary["Count"][0] / len(self.phenotypes) - sdf = pd.DataFrame(summary) - df = pd.DataFrame(data) - logger.info(df) - return {"details": df, "summary": sdf} +# -*- coding: utf-8 -*- +import pandas as pd +import logging +import cobra +from cobra.core.dictlist import DictList +from modelseedpy.core.msmedia import MSMedia +from modelseedpy.fbapkg.mspackagemanager import MSPackageManager +from modelseedpy.core.msmodelutl import MSModelUtil +from modelseedpy.core.msgapfill import MSGapfill + +logger = logging.getLogger(__name__) + + +class MSGrowthPhenotype: + def __init__( + self, + id, + media=None, + growth=None, + gene_ko=[], + additional_compounds=[], + parent=None, + name=None, + ): + self.id = id + self.name = name + if name == None: + self.name = self.id + self.growth = growth + self.media = media + self.gene_ko = gene_ko + self.gapfilling = None + self.additional_compounds = additional_compounds + self.parent = parent + + def build_media(self): + cpd_hash = {} + for cpd in self.additional_compounds: + cpd_hash[cpd] = 100 + full_media = MSMedia.from_dict(cpd_hash) + if self.media != None: + full_media.merge(self.media, overwrite_overlap=False) + if self.parent != None and self.parent.base_media != None: + full_media.merge(parent.base_media, overwrite_overlap=False) + return full_media + + def simulate( + self, + modelutl, + growth_threshold=0.001, + add_missing_exchanges=False, + save_fluxes=False, + pfba=False, + ): + if not isinstance(modelutl, MSModelUtil): + modelutl = MSModelUtil(modelutl) + media = self.build_media() + output = {"growth": None, "class": None, "missing_transports": []} + if add_missing_exchanges: + output["missing_transports"] = modelutl.add_missing_exchanges(media) + pkgmgr = MSPackageManager.get_pkg_mgr(modelutl.model) + pkgmgr.getpkg("KBaseMediaPkg").build_package( + media, self.parent.base_uptake, self.parent.base_excretion + ) + for gene in self.gene_ko: + if gene in modelutl.model.genes: + geneobj = modelutl.model.genes.get_by_id(gene) + geneobj.knock_out() + solution = modelutl.model.optimize() + output["growth"] = solution.objective_value + if solution.objective_value > 0 and pfba: + solution = cobra.flux_analysis.pfba(modelutl.model) + if save_fluxes: + output["fluxes"] = solution.fluxes + if output["growth"] >= growth_threshold: + if self.growth > 0: + output["class"] = "CP" + else: + output["class"] = "FP" + else: + if self.growth > 0: + output["class"] = "FN" + else: + output["class"] = "CN" + return output + + def gapfill_model_for_phenotype( + self, + modelutl, + default_gapfill_templates, + test_conditions, + default_gapfill_models=[], + blacklist=[], + growth_threshold=0.001, + add_missing_exchanges=False, + ): + if not isinstance(modelutl, MSModelUtil): + modelutl = MSModelUtil(modelutl) + self.gapfilling = MSGapfill( + modelutl.model, + default_gapfill_templates, + default_gapfill_models, + test_conditions, + modelutl.reaction_scores(), + blacklist, + ) + media = self.build_media() + if add_missing_exchanges: + modelutl.add_missing_exchanges(media) + for gene in self.gene_ko: + if gene in modelutl.model.genes: + geneobj = modelutl.model.genes.get_by_id(gene) + geneobj.knock_out() + gfresults = self.gapfilling.run_gapfilling(media, None) + if gfresults is None: + logger.warning( + "Gapfilling failed with the specified model, media, and target reaction." + ) + return self.gapfilling.integrate_gapfill_solution(gfresults) + + +class MSGrowthPhenotypes: + def __init__(self, base_media=None, base_uptake=0, base_excretion=1000): + self.base_media = base_media + self.phenotypes = DictList() + self.base_uptake = base_uptake + self.base_excretion = base_excretion + + @staticmethod + def from_compound_hash(compounds, base_media, base_uptake=0, base_excretion=1000): + growthpheno = MSGrowthPhenotypes(base_media, base_uptake, base_excretion) + new_phenos = [] + for cpd in compounds: + newpheno = MSGrowthPhenotype(cpd, None, compounds[cpd], [], [cpd]) + new_phenos.append(newpheno) + growthpheno.add_phenotypes(new_phenos) + return growthpheno + + @staticmethod + def from_kbase_object(data, kbase_api): + growthpheno = MSGrowthPhenotypes(None, 0, 1000) + new_phenos = [] + for pheno in data["phenotypes"]: + media = kbase_api.get_from_ws(pheno["media_ref"], None) + geneko = [] + for gene in pheno["geneko_refs"]: + geneko.append(added_cpd.split("/").pop()) + added_compounds = [] + for added_cpd in pheno["additionalcompound_refs"]: + added_compounds.append(added_cpd.split("/").pop()) + newpheno = MSGrowthPhenotype( + pheno["id"], media, pheno["normalizedGrowth"], geneko, added_compounds + ) + new_phenos.append(newpheno) + growthpheno.add_phenotypes(new_phenos) + return growthpheno + + @staticmethod + def from_kbase_file(filename, kbase_api): + # TSV file with the following headers:media mediaws growth geneko addtlCpd + growthpheno = MSGrowthPhenotypes(base_media, 0, 1000) + headings = [] + new_phenos = [] + with open(filename) as f: + lines = f.readlines() + for line in lines: + items = line.split("\t") + if headings == None: + headings = items + else: + data = {} + for i in range(0, len(items)): + data[headings[i]] = items[i] + data = FBAHelper.validate_dictionary( + headings, + ["media", "growth"], + {"mediaws": None, "geneko": [], "addtlCpd": []}, + ) + media = kbase_api.get_from_ws(data["media"], data["mediaws"]) + id = data["media"] + if len(data["geneko"]) > 0: + id += "-" + ",".join(data["geneko"]) + if len(data["addtlCpd"]) > 0: + id += "-" + ",".join(data["addtlCpd"]) + newpheno = MSGrowthPhenotype( + id, media, data["growth"], data["geneko"], data["addtlCpd"] + ) + new_phenos.append(newpheno) + growthpheno.add_phenotypes(new_phenos) + return growthpheno + + @staticmethod + def from_ms_file(filename, basemedia, base_uptake=0, base_excretion=100): + growthpheno = MSGrowthPhenotypes(base_media, base_uptake, base_excretion) + df = pd.read_csv(filename) + required_headers = ["Compounds", "Growth"] + for item in required_headers: + if item not in df: + raise ValueError("Required header " + item + " is missing!") + new_phenos = [] + for row in df.rows: + cpds = row["Compounds"].split(";") + id = row["Compounds"] + if "ID" in row: + id = row["ID"] + geneko = [] + if "GeneKO" in row: + geneko = row["GeneKO"].split(";") + newpheno = MSGrowthPhenotype(id, None, row["Growth"], geneko, cpds) + new_phenos.append(newpheno) + growthpheno.add_phenotypes(new_phenos) + return growthpheno + + def add_phenotypes(self, new_phenotypes): + keep_phenos = [] + for pheno in new_phenotypes: + if pheno.id not in self.phenotypes: + pheno.parent = self + keep_phenos.append(pheno) + additions = DictList(keep_phenos) + self.phenotypes += additions + + def simulate_phenotypes( + self, + model, + biomass, + add_missing_exchanges=False, + correct_false_negatives=False, + template=None, + growth_threshold=0.001, + save_fluxes=False, + ): + model.objective = biomass + modelutl = MSModelUtil(model) + summary = { + "Label": ["Accuracy", "CP", "CN", "FP", "FN"], + "Count": [0, 0, 0, 0, 0], + } + data = { + "Phenotype": [], + "Observed growth": [], + "Simulated growth": [], + "Class": [], + "Transports missing": [], + "Gapfilled reactions": [], + } + for pheno in self.phenotypes: + with model: + result = pheno.simulate( + modelutl, growth_threshold, add_missing_exchanges, save_fluxes + ) # Result should have "growth" and "class" + if result["class"] == "FN" and correct_false_negatives: + pheno.gapfill_model_for_phenotype(modelutl, [template], None) + if pheno.gapfilling.last_solution != None: + list = [] + for rxn_id in pheno.gapfilling.last_solution["reversed"]: + list.append( + pheno.gapfilling.last_solution["reversed"][rxn_id] + + rxn_id + ) + for rxn_id in pheno.gapfilling.last_solution["new"]: + list.append( + pheno.gapfilling.last_solution["new"][rxn_id] + rxn_id + ) + data["Gapfilled reactions"].append(";".join(list)) + else: + data["Gapfilled reactions"].append(None) + else: + data["Gapfilled reactions"].append(None) + result = pheno.simulate( + modelutl, growth_threshold, add_missing_exchanges, save_fluxes + ) # Result should have "growth" and "class" + data["Class"].append(result["class"]) + data["Phenotype"].append(pheno.id) + data["Observed growth"].append(pheno.growth) + data["Simulated growth"].append(result["growth"]) + data["Transports missing"].append( + ";".join(result["missing_transports"]) + ) + if result["class"] == "CP": + summary["Count"][1] += 1 + summary["Count"][0] += 1 + if result["class"] == "CN": + summary["Count"][2] += 1 + summary["Count"][0] += 1 + if result["class"] == "FP": + summary["Count"][3] += 1 + if result["class"] == "FN": + summary["Count"][4] += 1 + + summary["Count"][0] = summary["Count"][0] / len(self.phenotypes) + sdf = pd.DataFrame(summary) + df = pd.DataFrame(data) + logger.info(df) + return {"details": df, "summary": sdf} diff --git a/modelseedpy/core/msmedia.py b/modelseedpy/core/msmedia.py index e5ba1b7b..488aad57 100644 --- a/modelseedpy/core/msmedia.py +++ b/modelseedpy/core/msmedia.py @@ -1,76 +1,76 @@ -# -*- coding: utf-8 -*- -import logging -from cobra.core.dictlist import DictList - -logger = logging.getLogger(__name__) - - -class MediaCompound: - def __init__(self, compound_id, lower_bound, upper_bound, concentration=None): - self.id = compound_id - self.lower_bound = lower_bound - self.upper_bound = upper_bound - self.concentration = concentration - - @property - def maxFlux(self): - # TODO: will be removed later just for old methods - return -self.lower_bound - - @property - def minFlux(self): - # TODO: will be removed later just for old methods - return -self.upper_bound - - -class MSMedia: - def __init__(self, media_id, name=""): - self.id = media_id - self.name = name - self.mediacompounds = DictList() - - @staticmethod - def from_dict(media_dict): - """ - Either dict with exchange bounds (example: {'cpd00027': (-10, 1000)}) or - just absolute value of uptake (example: {''cpd00027': 10}) - :param media_dict: - :return: - """ - media = MSMedia("media") - media_compounds = [] - for cpd_id, v in media_dict.items(): - if isinstance(v, tuple): - media_compounds.append(MediaCompound(cpd_id, v[0], v[1])) - else: - media_compounds.append(MediaCompound(cpd_id, -v, 1000)) - media.mediacompounds += media_compounds - return media - - def get_media_constraints(self, cmp="e0"): - """ - Parameters: - cmp (str): compound suffix (model compartment) - Returns: - dict(str) -> (float,float): compound_ids mapped to lower/upper bound - """ - media = {} - for compound in self.mediacompounds: - met_id = compound.id - if cmp is not None: - met_id += "_" + cmp - media[met_id] = (compound.lower_bound, compound.upper_bound) - return media - - def merge(self, media, overwrite_overlap=False): - new_cpds = [] - for cpd in media.mediacompounds: - newcpd = MediaCompound( - cpd.id, -cpd.maxFlux, -cpd.minFlux, cpd.concentration - ) - if newcpd.id in self.mediacompounds: - if overwrite_overlap: - self.mediacompounds[newcpd.id] = newcpd - else: - new_cpds.append(newcpd) - self.mediacompounds += new_cpds +# -*- coding: utf-8 -*- +import logging +from cobra.core.dictlist import DictList + +logger = logging.getLogger(__name__) + + +class MediaCompound: + def __init__(self, compound_id, lower_bound, upper_bound, concentration=None): + self.id = compound_id + self.lower_bound = lower_bound + self.upper_bound = upper_bound + self.concentration = concentration + + @property + def maxFlux(self): + # TODO: will be removed later just for old methods + return -self.lower_bound + + @property + def minFlux(self): + # TODO: will be removed later just for old methods + return -self.upper_bound + + +class MSMedia: + def __init__(self, media_id, name=""): + self.id = media_id + self.name = name + self.mediacompounds = DictList() + + @staticmethod + def from_dict(media_dict): + """ + Either dict with exchange bounds (example: {'cpd00027': (-10, 1000)}) or + just absolute value of uptake (example: {''cpd00027': 10}) + :param media_dict: + :return: + """ + media = MSMedia("media") + media_compounds = [] + for cpd_id, v in media_dict.items(): + if isinstance(v, tuple): + media_compounds.append(MediaCompound(cpd_id, v[0], v[1])) + else: + media_compounds.append(MediaCompound(cpd_id, -v, 1000)) + media.mediacompounds += media_compounds + return media + + def get_media_constraints(self, cmp="e0"): + """ + Parameters: + cmp (str): compound suffix (model compartment) + Returns: + dict(str) -> (float,float): compound_ids mapped to lower/upper bound + """ + media = {} + for compound in self.mediacompounds: + met_id = compound.id + if cmp is not None: + met_id += "_" + cmp + media[met_id] = (compound.lower_bound, compound.upper_bound) + return media + + def merge(self, media, overwrite_overlap=False): + new_cpds = [] + for cpd in media.mediacompounds: + newcpd = MediaCompound( + cpd.id, -cpd.maxFlux, -cpd.minFlux, cpd.concentration + ) + if newcpd.id in self.mediacompounds: + if overwrite_overlap: + self.mediacompounds[newcpd.id] = newcpd + else: + new_cpds.append(newcpd) + self.mediacompounds += new_cpds From 95371f2b353091a0a868c8997e955a40c3eaec13 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Wed, 14 Dec 2022 17:26:44 +0000 Subject: [PATCH 058/298] atpcorrection travis tests --- modelseedpy/core/mstemplate.py | 25 +++++++++++++++++++++++++ setup.py | 2 +- tests/core/test_msatpcorreption.py | 8 ++++---- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index ef2f887a..5318b604 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -33,7 +33,14 @@ class TemplateReactionType(Enum): UNIVERSAL = "universal" SPONTANEOUS = "spontaneous" GAPFILLING = "gapfilling" + +class TemplateBiomassCoefficientType(Enum): + MOLFRACTION = "MOLFRACTION" + MOLSPLIT = "MOLSPLIT" + MULTIPLIER = "MULTIPLIER" + EXACT = "EXACT" + class MSTemplateMetabolite: def __init__( @@ -435,6 +442,24 @@ def get_data(self): # id=self.id, stoichiometry=self.build_reaction_string()) +class MSTemplateBiomass: + + def __init__(self): + pass + + @staticmethod + def from_dict(d): + pass + + def add_biomass_component(self): + pass + + def to_reaction(self, model=None, index="0"): + pass + + def get_data(self): + pass + class NewModelTemplateRole: def __init__(self, role_id, name, features=None, source="", aliases=None): """ diff --git a/setup.py b/setup.py index 8686e913..22892836 100644 --- a/setup.py +++ b/setup.py @@ -20,7 +20,7 @@ license=license, packages=find_packages(exclude=("docs")), package_data={ - "modelseedpy": ["config.cfg"], + "modelseedpy": ["config.cfg", "data/*"], }, classifiers=[ "Development Status :: 3 - Alpha", diff --git a/tests/core/test_msatpcorreption.py b/tests/core/test_msatpcorreption.py index 87090be0..251f8160 100644 --- a/tests/core/test_msatpcorreption.py +++ b/tests/core/test_msatpcorreption.py @@ -207,7 +207,7 @@ def test_infinite_atp_model_growth_boost( def test_ms_atp_correction1(get_model, template, media_all_aerobic): model = get_model(["GLCpts_c0", "NADH16_c0", "CYTBD_c0", "O2t_c0"]) atp_correction = MSATPCorrection( - model, template, media_all_aerobic, atp_hydrolysis_id="ATPM_c0" + model, template, media_all_aerobic, atp_hydrolysis_id="ATPM_c0", load_default_medias=False ) atp_correction.evaluate_growth_media() assert len(atp_correction.noncore_reactions) == 1 # the biomass @@ -249,7 +249,7 @@ def test_ms_atp_correction_and_gap_fill1( model.reactions.ATPM_c0.upper_bound = 1000 atp_correction = MSATPCorrection( - model, template, [media_glucose_aerobic], atp_hydrolysis_id="ATPM_c0" + model, template, [media_glucose_aerobic], atp_hydrolysis_id="ATPM_c0", load_default_medias=False ) tests = atp_correction.run_atp_correction() @@ -273,6 +273,6 @@ def test_ms_atp_correction_and_gap_fill1( assert len(result["new"]) == 1 assert "GLUSy_c0" in result["new"] or "GLUDy_c0" in result["new"] - model = gap_fill.integrate_gapfill_solution(result) + gap_fill.integrate_gapfill_solution(result) - assert model + # TODO: add some model testing assertion From 6e47576a7165a56919b7c0490057866831fe05d8 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Wed, 14 Dec 2022 17:31:16 +0000 Subject: [PATCH 059/298] formatting --- modelseedpy/core/mstemplate.py | 16 ++++++++-------- tests/core/test_msatpcorreption.py | 12 ++++++++++-- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 5318b604..fac9faa2 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -33,14 +33,14 @@ class TemplateReactionType(Enum): UNIVERSAL = "universal" SPONTANEOUS = "spontaneous" GAPFILLING = "gapfilling" - + class TemplateBiomassCoefficientType(Enum): MOLFRACTION = "MOLFRACTION" MOLSPLIT = "MOLSPLIT" MULTIPLIER = "MULTIPLIER" EXACT = "EXACT" - + class MSTemplateMetabolite: def __init__( @@ -443,23 +443,23 @@ def get_data(self): class MSTemplateBiomass: - def __init__(self): pass - + @staticmethod def from_dict(d): pass - + def add_biomass_component(self): pass - + def to_reaction(self, model=None, index="0"): pass - + def get_data(self): pass - + + class NewModelTemplateRole: def __init__(self, role_id, name, features=None, source="", aliases=None): """ diff --git a/tests/core/test_msatpcorreption.py b/tests/core/test_msatpcorreption.py index 251f8160..108cc3ec 100644 --- a/tests/core/test_msatpcorreption.py +++ b/tests/core/test_msatpcorreption.py @@ -207,7 +207,11 @@ def test_infinite_atp_model_growth_boost( def test_ms_atp_correction1(get_model, template, media_all_aerobic): model = get_model(["GLCpts_c0", "NADH16_c0", "CYTBD_c0", "O2t_c0"]) atp_correction = MSATPCorrection( - model, template, media_all_aerobic, atp_hydrolysis_id="ATPM_c0", load_default_medias=False + model, + template, + media_all_aerobic, + atp_hydrolysis_id="ATPM_c0", + load_default_medias=False, ) atp_correction.evaluate_growth_media() assert len(atp_correction.noncore_reactions) == 1 # the biomass @@ -249,7 +253,11 @@ def test_ms_atp_correction_and_gap_fill1( model.reactions.ATPM_c0.upper_bound = 1000 atp_correction = MSATPCorrection( - model, template, [media_glucose_aerobic], atp_hydrolysis_id="ATPM_c0", load_default_medias=False + model, + template, + [media_glucose_aerobic], + atp_hydrolysis_id="ATPM_c0", + load_default_medias=False, ) tests = atp_correction.run_atp_correction() From fadfbb3840aa087ec15385def85993ead5ef37f9 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 15 Dec 2022 10:26:55 -0600 Subject: [PATCH 060/298] Fixing missing types variable --- modelseedpy/core/msbuilder.py | 1 + 1 file changed, 1 insertion(+) diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 606825f7..fee2e15d 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -558,6 +558,7 @@ def get_or_create_metabolite( @staticmethod def build_biomass_new(model, template, index): biomasses = [] + types = ["cofactor","lipid","cellwall"] for bio in template.biomasses: # Creating biomass reaction object metabolites = {} From 4f06bf53a3cb435e2608889b180950d593876a2b Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 15 Dec 2022 10:30:36 -0600 Subject: [PATCH 061/298] Running black --- modelseedpy/core/msbuilder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index fee2e15d..18879205 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -558,7 +558,7 @@ def get_or_create_metabolite( @staticmethod def build_biomass_new(model, template, index): biomasses = [] - types = ["cofactor","lipid","cellwall"] + types = ["cofactor", "lipid", "cellwall"] for bio in template.biomasses: # Creating biomass reaction object metabolites = {} From 6c504bad7e1da5a8ab9d1e347f2937cf34a62a55 Mon Sep 17 00:00:00 2001 From: freiburgermsu Date: Wed, 28 Dec 2022 18:10:57 -0600 Subject: [PATCH 062/298] Update setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 22892836..bf6ab7a2 100644 --- a/setup.py +++ b/setup.py @@ -46,7 +46,7 @@ "pytest", ], project_urls={ - "Documentation": "https://modelseedpy.readthedocs.io/en/stable/", + "Documentation": "https://modelseedpy.readthedocs.io/en/latest/", "Issues": "https://github.com/ModelSEED/ModelSEEDpy/issues", }, ) From ad70240fdebb7d5f29539244f4b7e01542b7fdb9 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 12 Jan 2023 10:00:55 -0600 Subject: [PATCH 063/298] Checking in code for biomass reaction built into template --- modelseedpy/biochem/modelseed_biochem.py | 1 - modelseedpy/core/fbahelper.py | 12 +- modelseedpy/core/mstemplate.py | 296 +++++++++++++++++++++-- 3 files changed, 287 insertions(+), 22 deletions(-) diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index d136d452..ccdd8d76 100644 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -4,7 +4,6 @@ import json import pandas as pd from cobra.core.dictlist import DictList -from modelseedpy.core.msmodel import get_reaction_constraints_from_direction from modelseedpy.biochem.modelseed_compound import ModelSEEDCompound, ModelSEEDCompound2 from modelseedpy.biochem.modelseed_reaction import ModelSEEDReaction, ModelSEEDReaction2 from modelseedpy.helpers import config diff --git a/modelseedpy/core/fbahelper.py b/modelseedpy/core/fbahelper.py index 39102323..43223a99 100644 --- a/modelseedpy/core/fbahelper.py +++ b/modelseedpy/core/fbahelper.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import - import logging from chemicals import periodic_table import re @@ -12,7 +11,6 @@ ) # !!! Gene, Metabolite, and Model are never used from cobra.util import solver as sutil # !!! sutil is never used import time -from modelseedpy.biochem import from_local from scipy.odr.odrpack import Output # !!! Output is never used from chemw import ChemMW from warnings import warn @@ -21,7 +19,6 @@ logger = logging.getLogger(__name__) - class FBAHelper: @staticmethod def add_autodrain_reactions_to_community_model( @@ -118,8 +115,11 @@ def modelseed_id_from_cobra_reaction(reaction): @staticmethod def metabolite_mw(metabolite): try: - chem_mw = ChemMW() - chem_mw.mass(metabolite.formula) + if not metabolite.formula: + return 0 + formula = re.sub("R\d*", "", metabolite.formula) + chem_mw = ChemMW(printing=False) + chem_mw.mass(formula) return chem_mw.raw_mw except: warn( @@ -127,6 +127,7 @@ def metabolite_mw(metabolite): + metabolite.id + " possesses an unconventional formula {metabolite.formula}; hence, the MW cannot be computed." ) + return 0 @staticmethod def elemental_mass(): @@ -134,6 +135,7 @@ def elemental_mass(): @staticmethod def get_modelseed_db_api(modelseed_path): + from modelseedpy.biochem import from_local return from_local(modelseed_path) @staticmethod diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index fac9faa2..b8288ad3 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -3,20 +3,25 @@ import copy import math from enum import Enum +import pandas as pd +import numpy as np from cobra.core import Metabolite, Reaction from cobra.core.dictlist import DictList from cobra.util import format_long_string +from modelseedpy.core.fbahelper import FBAHelper from modelseedpy.core.msmodel import ( get_direction_from_constraints, get_reaction_constraints_from_direction, get_cmp_token, ) from cobra.core.dictlist import DictList +#from gevent.libev.corecext import self # from cobrakbase.kbase_object_info import KBaseObjectInfo logger = logging.getLogger(__name__) +SBO_ANNOTATION = "sbo" class AttrDict(dict): """ @@ -441,24 +446,254 @@ def get_data(self): # return "{id}: {stoichiometry}".format( # id=self.id, stoichiometry=self.build_reaction_string()) - -class MSTemplateBiomass: - def __init__(self): - pass +class MSTemplateBiomassComponent: + def __init__(self,metabolite,comp_class,coefficient,coefficient_type,linked_metabolites): + """ + :param metabolite:MSTemplateMetabolite + :param comp_class:string + :param coefficient:floar + :param coefficient_type:string + :param linked_metabolites:{MSTemplateMetabolite:float} + """ + self.id = metabolite.id+"_"+comp_class + self.metabolite = metabolite + self.comp_class = comp_class + self.coefficient = coefficient + self.coefficient_type = coefficient_type + self.linked_metabolites = linked_metabolites @staticmethod - def from_dict(d): - pass + def from_dict(d,template): + met_id = d["templatecompcompound_ref"].split("/").pop() + metabolite = template.compcompounds.get_by_id(met_id) + linked_metabolites = {} + for count,item in enumerate(d["linked_compound_refs"]): + l_met_id = item.split("/").pop() + l_metabolite = template.compcompounds.get_by_id(l_met_id) + linked_metabolites[l_metabolite] = d["link_coefficients"][count] + self = MSTemplateBiomassComponent(metabolite,d["class"],d["coefficient"],d["coefficient_type"],linked_metabolites) + return self + + def get_data(self): + data = { + "templatecompcompound_ref" : "~/compcompounds/id/"+self.metabolite.id, + "class" : self.comp_class, + "coefficient" : self.coefficient, + "coefficient_type" : self.coefficient_type, + "linked_compound_refs" : [], + "link_coefficients" : [] + } + for met in self.linked_metabolites: + data["linked_compound_refs"].append("~/compcompounds/id/"+met.id) + data["link_coefficients"].append(self.linked_metabolites[met]) + return data - def add_biomass_component(self): - pass +class MSTemplateBiomass: + def __init__(self,bio_id,name,type,dna,rna,protein,lipid,cellwall,cofactor,energy,other): + """ - def to_reaction(self, model=None, index="0"): - pass + :param bio_id:string + :param name:string + :param type:string + :param dna:float + :param rna:float + :param protein:float + :param lipid:float + :param cellwall:float + :param cofactor:float + :param energy:float + :param other:float + """ + self.id = bio_id + self.name = name + self.type = type + self.dna = dna + self.rna = rna + self.protein = protein + self.lipid = lipid + self.cellwall = cellwall + self.cofactor = cofactor + self.energy = energy + self.other = other + self.templateBiomassComponents = DictList() + self._template = None + + @staticmethod + def from_table(filename_or_df,template,bio_id,name,type,dna,rna,protein,lipid,cellwall,cofactor,energy,other): + self = MSTemplateBiomass(bio_id,name,type,dna,rna,protein,lipid,cellwall,cofactor,energy,other) + if isinstance(filename_or_df, str): + filename_or_df = pd.read_table(filename_or_df) + for index, row in filename_or_df.iterrows(): + if row["biomass_id"] == bio_id: + metabolite = template.compcompounds.get_by_id(row["id"]+"_"+row["compartment"]) + linked_mets = {} + if isinstance(row["linked_compounds"], str) and len(row["linked_compounds"]) > 0: + array = row["linked_compounds"].split("|") + for item in array: + sub_array = item.split(":") + l_met = template.compcompounds.get_by_id(sub_array[0]+"_"+row["compartment"]) + linked_mets[l_met] = float(sub_array[1]) + self.add_biomass_component(metabolite,row["class"],row["coefficient"],row["coefficient_type"],linked_mets) + return self + + @staticmethod + def from_dict(d,template): + self = MSTemplateBiomass(d["id"],d["name"],d["type"],d["dna"],d["rna"],d["protein"],d["lipid"],d["cellwall"],d["cofactor"],d["energy"],d["other"]) + for item in d["templateBiomassComponents"]: + biocomp = MSTemplateBiomassComponent.from_dict(item,template) + self.templateBiomassComponents.add(biocomp) + self._template = template + return self + + def add_biomass_component(self,metabolite,comp_class,coefficient,coefficient_type,linked_mets={}): + biocomp = MSTemplateBiomassComponent(metabolite,comp_class,coefficient,coefficient_type,linked_mets) + self.templateBiomassComponents.add(biocomp) + + def get_or_create_metabolite(self,model,baseid,compartment=None,index=None): + fullid = baseid + if compartment: + fullid += "_"+compartment + tempid = fullid + if index: + fullid += index + if fullid in model.metabolites: + return model.metabolites.get_by_id(fullid) + if tempid in self._template.compcompounds: + met = self._template.compcompounds.get_by_id(tempid).to_metabolite(index) + model.metabolites.add(met) + return met + logger.error( + "Could not find biomass metabolite [%s] in model or template!", + fullid, + ) + + def get_or_create_reaction(self,model,baseid,compartment=None,index=None): + fullid = baseid + if compartment: + fullid += "_"+compartment + tempid = fullid + if index: + fullid += index + if fullid in model.metabolites: + return model.reactions.get_by_id(fullid) + if tempid in self._template.reactions: + rxn = self._template.reactions.get_by_id(tempid).to_reaction(model,index) + model.reactions.add(rxn) + return rxn + newrxn = Reaction(fullid, fullid, "biomasses", 0, 1000) + model.reactions.add(newrxn) + return newrxn + + def build_biomass(self, model, index="0",classic=False,GC=0.5): + types = ["cofactor", "lipid", "cellwall","protein","dna","rna","energy","other"] + type_abundances = { + "cofactor":self.cofactor, + "lipid":self.lipid, + "cellwall":self.cellwall, + "protein":self.protein, + "dna":self.dna, + "rna":self.rna, + "energy":self.energy + } + # Creating biomass reaction object + metabolites = {} + biorxn = Reaction(self.id, self.name, "biomasses", 0, 1000) + # Adding standard compounds for DNA, RNA, protein, and biomass + if not classic and self.type == "growth": + met = self.get_or_create_metabolite(model,"cpd11416", "c", index) + metabolites[met] = 1 + specific_reactions = { + "dna":None, + "rna":None, + "protein":None + } + if not classic and self.dna > 0: + met = self.get_or_create_metabolite(model,"cpd11461", "c", index) + specific_reactions["dna"] = self.get_or_create_reaction(model,"rxn05294", "c", index) + specific_reactions["dna"].subtract_metabolites(specific_reactions["dna"].metabolites) + specific_reactions["dna"].metabolites[met] = 1 + metabolites[met] = -1 * self.dna + if not classic and self.protein > 0: + met = self.get_or_create_metabolite(model,"cpd11463", "c", index) + specific_reactions["protein"] = self.get_or_create_reaction(model,"rxn05296", "c", index) + specific_reactions["protein"].subtract_metabolites(specific_reactions["protein"].metabolites) + specific_reactions["protein"].metabolites[met] = 1 + metabolites[met] = -1 * self.protein + if not classic and self.rna > 0: + met = self.get_or_create_metabolite(model,"cpd11462", "c", index) + specific_reactions["rna"] = self.get_or_create_reaction(model,"rxn05295", "c", index) + specific_reactions["rna"].subtract_metabolites(specific_reactions["rna"].metabolites) + specific_reactions["rna"].metabolites[met] = 1 + metabolites[met] = -1 * self.rna + bio_type_hash = {} + for type in types: + for comp in self.templateBiomassComponents: + if type == comp.comp_class: + met = self.get_or_create_metabolite(model, comp.metabolite.id, None, index) + if type not in bio_type_hash: + bio_type_hash[type] = {"items": [], "total_mw": 0} + if FBAHelper.metabolite_mw(met): + bio_type_hash[type]["total_mw"] += -1*FBAHelper.metabolite_mw(met) * comp.coefficient/1000 + bio_type_hash[type]["items"].append(comp) + for type in bio_type_hash: + for comp in bio_type_hash[type]["items"]: + coef = None + if comp.coefficient_type == "MOLFRACTION" or comp.coefficient_type == "MOLSPLIT": + coef = (type_abundances[type] / bio_type_hash[type]["total_mw"])*comp.coefficient + elif comp.coefficient_type == "MULTIPLIER": + coef = type_abundances[type] * comp.coefficient + elif comp.coefficient_type == "EXACT": + coef = comp.coefficient + elif comp.coefficient_type == "AT": + coef = comp.coefficient * (1-GC) * (type_abundances[type] / bio_type_hash[type]["total_mw"]) + elif comp.coefficient_type == "GC": + coef = comp.coefficient * GC * (type_abundances[type] / bio_type_hash[type]["total_mw"]) + if coef: + met = model.metabolites.get_by_id(comp.metabolite.id+index) + if type not in ("dna","protein","rna") or classic: + if met in metabolites: + metabolites[met] += coef + else: + metabolites[met] = coef + elif not classic: + coef = coef / type_abundances[type] + if met in metabolites: + specific_reactions[type].metabolites[met] += coef + else: + specific_reactions[type].metabolites[met] = coef + for l_met in comp.linked_metabolites: + met = self.get_or_create_metabolite(model, l_met.id, None, index) + if type not in ("dna","protein","rna") or classic: + if met in metabolites: + metabolites[met] += (coef * comp.linked_metabolites[l_met]) + else: + metabolites[met] = (coef * comp.linked_metabolites[l_met]) + elif not classic: + if met in metabolites: + specific_reactions[type].metabolites[met] += (coef * comp.linked_metabolites[l_met]) + else: + specific_reactions[type].metabolites[met] = (coef * comp.linked_metabolites[l_met]) + biorxn.annotation[SBO_ANNOTATION] = "SBO:0000629" + biorxn.add_metabolites(metabolites) + return biorxn def get_data(self): - pass - + data = { + "id" : self.id, + "name" : self.name, + "type" : self.type, + "dna" : self.dna, + "rna" : self.rna, + "protein" : self.protein, + "lipid" : self.lipid, + "cellwall" : self.cellwall, + "cofactor" : self.cofactor, + "energy" : self.energy, + "other" : self.other, + "templateBiomassComponents" : [] + } + for comp in self.templateBiomassComponents: + data["templateBiomassComponents"].append(comp.get_data()) class NewModelTemplateRole: def __init__(self, role_id, name, features=None, source="", aliases=None): @@ -682,7 +917,16 @@ def __init__( self.pathways = DictList() self.subsystems = DictList() self.drains = None - + + ################# Replaces biomass reactions from an input TSV table ############################ + def overwrite_biomass_from_table(self,filename_or_df,bio_id,name,type,dna,rna,protein,lipid,cellwall,cofactor,energy,other): + if isinstance(filename_or_df, str): + filename_or_df = pd.read_table(filename_or_df) + newbio = MSTemplateBiomass.from_table(filename_or_df,self,bio_id,name,type,dna,rna,protein,lipid,cellwall,cofactor,energy,other) + if newbio.id in self.biomasses: + self.biomasses.remove(newbio.id) + self.biomasses.add(newbio) + def add_drain(self, compound_id, lower_bound, upper_bound): if compound_id not in self.compcompounds: raise ValueError(f"{compound_id} not in template") @@ -807,7 +1051,25 @@ def add_comp_compounds(self, comp_compounds: list): x._template_compound = self.compounds.get_by_id(x.cpd_id) x._template_compound.species.add(x) self.compcompounds += comp_compounds + + def add_biomasses(self, biomasses: list): + """ + Add biomasses to the template + :param biomasses: + :return: + """ + duplicates = list(filter(lambda x: x.id in self.biomasses, biomasses)) + if len(duplicates) > 0: + logger.error( + "unable to add biomasses [%s] already present in the template", + duplicates, + ) + return None + for x in biomasses: + x._template = self + self.biomasses += biomasses + def add_reactions(self, reaction_list: list): """ @@ -918,7 +1180,7 @@ def get_data(self): "roles": list(map(lambda x: x.get_data(), self.roles)), "complexes": list(map(lambda x: x.get_data(), self.complexes)), "reactions": list(map(lambda x: x.get_data(), self.reactions)), - "biomasses": list(self.biomasses), + "biomasses": list(map(lambda x: x.get_data(), self.biomasses)), "pathways": [], "subsystems": [], } @@ -1128,8 +1390,10 @@ def build(self): ) ) template.biomasses += list( - map(lambda x: AttrDict(x), self.biomasses) - ) # TODO: biomass object + list( + map(lambda x: MSTemplateBiomass.from_dict(x, template), self.biomasses) + ) + ) for compound_id, (lb, ub) in self.drains.items(): template.add_drain(compound_id, lb, ub) From 72d1ebb7348df698ef42689d7e86cabe66081add Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 12 Jan 2023 10:05:09 -0600 Subject: [PATCH 064/298] Formatting in black --- modelseedpy/core/fbahelper.py | 2 + modelseedpy/core/mstemplate.py | 339 ++++++++++++++++++++++++--------- 2 files changed, 247 insertions(+), 94 deletions(-) diff --git a/modelseedpy/core/fbahelper.py b/modelseedpy/core/fbahelper.py index 43223a99..6c44108f 100644 --- a/modelseedpy/core/fbahelper.py +++ b/modelseedpy/core/fbahelper.py @@ -19,6 +19,7 @@ logger = logging.getLogger(__name__) + class FBAHelper: @staticmethod def add_autodrain_reactions_to_community_model( @@ -136,6 +137,7 @@ def elemental_mass(): @staticmethod def get_modelseed_db_api(modelseed_path): from modelseedpy.biochem import from_local + return from_local(modelseed_path) @staticmethod diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index b8288ad3..51dc2e38 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -15,7 +15,8 @@ get_cmp_token, ) from cobra.core.dictlist import DictList -#from gevent.libev.corecext import self + +# from gevent.libev.corecext import self # from cobrakbase.kbase_object_info import KBaseObjectInfo @@ -23,6 +24,7 @@ SBO_ANNOTATION = "sbo" + class AttrDict(dict): """ Base object to use for subobjects in KBase objects @@ -446,8 +448,11 @@ def get_data(self): # return "{id}: {stoichiometry}".format( # id=self.id, stoichiometry=self.build_reaction_string()) + class MSTemplateBiomassComponent: - def __init__(self,metabolite,comp_class,coefficient,coefficient_type,linked_metabolites): + def __init__( + self, metabolite, comp_class, coefficient, coefficient_type, linked_metabolites + ): """ :param metabolite:MSTemplateMetabolite :param comp_class:string @@ -455,7 +460,7 @@ def __init__(self,metabolite,comp_class,coefficient,coefficient_type,linked_meta :param coefficient_type:string :param linked_metabolites:{MSTemplateMetabolite:float} """ - self.id = metabolite.id+"_"+comp_class + self.id = metabolite.id + "_" + comp_class self.metabolite = metabolite self.comp_class = comp_class self.coefficient = coefficient @@ -463,33 +468,53 @@ def __init__(self,metabolite,comp_class,coefficient,coefficient_type,linked_meta self.linked_metabolites = linked_metabolites @staticmethod - def from_dict(d,template): + def from_dict(d, template): met_id = d["templatecompcompound_ref"].split("/").pop() metabolite = template.compcompounds.get_by_id(met_id) linked_metabolites = {} - for count,item in enumerate(d["linked_compound_refs"]): + for count, item in enumerate(d["linked_compound_refs"]): l_met_id = item.split("/").pop() l_metabolite = template.compcompounds.get_by_id(l_met_id) linked_metabolites[l_metabolite] = d["link_coefficients"][count] - self = MSTemplateBiomassComponent(metabolite,d["class"],d["coefficient"],d["coefficient_type"],linked_metabolites) + self = MSTemplateBiomassComponent( + metabolite, + d["class"], + d["coefficient"], + d["coefficient_type"], + linked_metabolites, + ) return self - + def get_data(self): data = { - "templatecompcompound_ref" : "~/compcompounds/id/"+self.metabolite.id, - "class" : self.comp_class, - "coefficient" : self.coefficient, - "coefficient_type" : self.coefficient_type, - "linked_compound_refs" : [], - "link_coefficients" : [] + "templatecompcompound_ref": "~/compcompounds/id/" + self.metabolite.id, + "class": self.comp_class, + "coefficient": self.coefficient, + "coefficient_type": self.coefficient_type, + "linked_compound_refs": [], + "link_coefficients": [], } for met in self.linked_metabolites: - data["linked_compound_refs"].append("~/compcompounds/id/"+met.id) + data["linked_compound_refs"].append("~/compcompounds/id/" + met.id) data["link_coefficients"].append(self.linked_metabolites[met]) return data + class MSTemplateBiomass: - def __init__(self,bio_id,name,type,dna,rna,protein,lipid,cellwall,cofactor,energy,other): + def __init__( + self, + bio_id, + name, + type, + dna, + rna, + protein, + lipid, + cellwall, + cofactor, + energy, + other, + ): """ :param bio_id:string @@ -517,42 +542,97 @@ def __init__(self,bio_id,name,type,dna,rna,protein,lipid,cellwall,cofactor,energ self.other = other self.templateBiomassComponents = DictList() self._template = None - + @staticmethod - def from_table(filename_or_df,template,bio_id,name,type,dna,rna,protein,lipid,cellwall,cofactor,energy,other): - self = MSTemplateBiomass(bio_id,name,type,dna,rna,protein,lipid,cellwall,cofactor,energy,other) + def from_table( + filename_or_df, + template, + bio_id, + name, + type, + dna, + rna, + protein, + lipid, + cellwall, + cofactor, + energy, + other, + ): + self = MSTemplateBiomass( + bio_id, + name, + type, + dna, + rna, + protein, + lipid, + cellwall, + cofactor, + energy, + other, + ) if isinstance(filename_or_df, str): filename_or_df = pd.read_table(filename_or_df) for index, row in filename_or_df.iterrows(): if row["biomass_id"] == bio_id: - metabolite = template.compcompounds.get_by_id(row["id"]+"_"+row["compartment"]) + metabolite = template.compcompounds.get_by_id( + row["id"] + "_" + row["compartment"] + ) linked_mets = {} - if isinstance(row["linked_compounds"], str) and len(row["linked_compounds"]) > 0: + if ( + isinstance(row["linked_compounds"], str) + and len(row["linked_compounds"]) > 0 + ): array = row["linked_compounds"].split("|") for item in array: sub_array = item.split(":") - l_met = template.compcompounds.get_by_id(sub_array[0]+"_"+row["compartment"]) + l_met = template.compcompounds.get_by_id( + sub_array[0] + "_" + row["compartment"] + ) linked_mets[l_met] = float(sub_array[1]) - self.add_biomass_component(metabolite,row["class"],row["coefficient"],row["coefficient_type"],linked_mets) + self.add_biomass_component( + metabolite, + row["class"], + row["coefficient"], + row["coefficient_type"], + linked_mets, + ) return self - + @staticmethod - def from_dict(d,template): - self = MSTemplateBiomass(d["id"],d["name"],d["type"],d["dna"],d["rna"],d["protein"],d["lipid"],d["cellwall"],d["cofactor"],d["energy"],d["other"]) + def from_dict(d, template): + self = MSTemplateBiomass( + d["id"], + d["name"], + d["type"], + d["dna"], + d["rna"], + d["protein"], + d["lipid"], + d["cellwall"], + d["cofactor"], + d["energy"], + d["other"], + ) for item in d["templateBiomassComponents"]: - biocomp = MSTemplateBiomassComponent.from_dict(item,template) + biocomp = MSTemplateBiomassComponent.from_dict(item, template) self.templateBiomassComponents.add(biocomp) self._template = template return self - - def add_biomass_component(self,metabolite,comp_class,coefficient,coefficient_type,linked_mets={}): - biocomp = MSTemplateBiomassComponent(metabolite,comp_class,coefficient,coefficient_type,linked_mets) + + def add_biomass_component( + self, metabolite, comp_class, coefficient, coefficient_type, linked_mets={} + ): + biocomp = MSTemplateBiomassComponent( + metabolite, comp_class, coefficient, coefficient_type, linked_mets + ) self.templateBiomassComponents.add(biocomp) - def get_or_create_metabolite(self,model,baseid,compartment=None,index=None): + def get_or_create_metabolite(self, model, baseid, compartment=None, index=None): fullid = baseid if compartment: - fullid += "_"+compartment + fullid += "_" + compartment tempid = fullid if index: fullid += index @@ -563,94 +643,128 @@ def get_or_create_metabolite(self,model,baseid,compartment=None,index=None): model.metabolites.add(met) return met logger.error( - "Could not find biomass metabolite [%s] in model or template!", - fullid, + "Could not find biomass metabolite [%s] in model or template!", + fullid, ) - - def get_or_create_reaction(self,model,baseid,compartment=None,index=None): + + def get_or_create_reaction(self, model, baseid, compartment=None, index=None): fullid = baseid if compartment: - fullid += "_"+compartment + fullid += "_" + compartment tempid = fullid if index: fullid += index if fullid in model.metabolites: return model.reactions.get_by_id(fullid) if tempid in self._template.reactions: - rxn = self._template.reactions.get_by_id(tempid).to_reaction(model,index) + rxn = self._template.reactions.get_by_id(tempid).to_reaction(model, index) model.reactions.add(rxn) return rxn newrxn = Reaction(fullid, fullid, "biomasses", 0, 1000) model.reactions.add(newrxn) return newrxn - - def build_biomass(self, model, index="0",classic=False,GC=0.5): - types = ["cofactor", "lipid", "cellwall","protein","dna","rna","energy","other"] + + def build_biomass(self, model, index="0", classic=False, GC=0.5): + types = [ + "cofactor", + "lipid", + "cellwall", + "protein", + "dna", + "rna", + "energy", + "other", + ] type_abundances = { - "cofactor":self.cofactor, - "lipid":self.lipid, - "cellwall":self.cellwall, - "protein":self.protein, - "dna":self.dna, - "rna":self.rna, - "energy":self.energy + "cofactor": self.cofactor, + "lipid": self.lipid, + "cellwall": self.cellwall, + "protein": self.protein, + "dna": self.dna, + "rna": self.rna, + "energy": self.energy, } # Creating biomass reaction object metabolites = {} biorxn = Reaction(self.id, self.name, "biomasses", 0, 1000) # Adding standard compounds for DNA, RNA, protein, and biomass if not classic and self.type == "growth": - met = self.get_or_create_metabolite(model,"cpd11416", "c", index) + met = self.get_or_create_metabolite(model, "cpd11416", "c", index) metabolites[met] = 1 - specific_reactions = { - "dna":None, - "rna":None, - "protein":None - } + specific_reactions = {"dna": None, "rna": None, "protein": None} if not classic and self.dna > 0: - met = self.get_or_create_metabolite(model,"cpd11461", "c", index) - specific_reactions["dna"] = self.get_or_create_reaction(model,"rxn05294", "c", index) - specific_reactions["dna"].subtract_metabolites(specific_reactions["dna"].metabolites) + met = self.get_or_create_metabolite(model, "cpd11461", "c", index) + specific_reactions["dna"] = self.get_or_create_reaction( + model, "rxn05294", "c", index + ) + specific_reactions["dna"].subtract_metabolites( + specific_reactions["dna"].metabolites + ) specific_reactions["dna"].metabolites[met] = 1 metabolites[met] = -1 * self.dna if not classic and self.protein > 0: - met = self.get_or_create_metabolite(model,"cpd11463", "c", index) - specific_reactions["protein"] = self.get_or_create_reaction(model,"rxn05296", "c", index) - specific_reactions["protein"].subtract_metabolites(specific_reactions["protein"].metabolites) + met = self.get_or_create_metabolite(model, "cpd11463", "c", index) + specific_reactions["protein"] = self.get_or_create_reaction( + model, "rxn05296", "c", index + ) + specific_reactions["protein"].subtract_metabolites( + specific_reactions["protein"].metabolites + ) specific_reactions["protein"].metabolites[met] = 1 metabolites[met] = -1 * self.protein if not classic and self.rna > 0: - met = self.get_or_create_metabolite(model,"cpd11462", "c", index) - specific_reactions["rna"] = self.get_or_create_reaction(model,"rxn05295", "c", index) - specific_reactions["rna"].subtract_metabolites(specific_reactions["rna"].metabolites) + met = self.get_or_create_metabolite(model, "cpd11462", "c", index) + specific_reactions["rna"] = self.get_or_create_reaction( + model, "rxn05295", "c", index + ) + specific_reactions["rna"].subtract_metabolites( + specific_reactions["rna"].metabolites + ) specific_reactions["rna"].metabolites[met] = 1 metabolites[met] = -1 * self.rna bio_type_hash = {} for type in types: for comp in self.templateBiomassComponents: if type == comp.comp_class: - met = self.get_or_create_metabolite(model, comp.metabolite.id, None, index) + met = self.get_or_create_metabolite( + model, comp.metabolite.id, None, index + ) if type not in bio_type_hash: bio_type_hash[type] = {"items": [], "total_mw": 0} if FBAHelper.metabolite_mw(met): - bio_type_hash[type]["total_mw"] += -1*FBAHelper.metabolite_mw(met) * comp.coefficient/1000 + bio_type_hash[type]["total_mw"] += ( + -1 * FBAHelper.metabolite_mw(met) * comp.coefficient / 1000 + ) bio_type_hash[type]["items"].append(comp) for type in bio_type_hash: for comp in bio_type_hash[type]["items"]: coef = None - if comp.coefficient_type == "MOLFRACTION" or comp.coefficient_type == "MOLSPLIT": - coef = (type_abundances[type] / bio_type_hash[type]["total_mw"])*comp.coefficient + if ( + comp.coefficient_type == "MOLFRACTION" + or comp.coefficient_type == "MOLSPLIT" + ): + coef = ( + type_abundances[type] / bio_type_hash[type]["total_mw"] + ) * comp.coefficient elif comp.coefficient_type == "MULTIPLIER": coef = type_abundances[type] * comp.coefficient elif comp.coefficient_type == "EXACT": coef = comp.coefficient elif comp.coefficient_type == "AT": - coef = comp.coefficient * (1-GC) * (type_abundances[type] / bio_type_hash[type]["total_mw"]) + coef = ( + comp.coefficient + * (1 - GC) + * (type_abundances[type] / bio_type_hash[type]["total_mw"]) + ) elif comp.coefficient_type == "GC": - coef = comp.coefficient * GC * (type_abundances[type] / bio_type_hash[type]["total_mw"]) + coef = ( + comp.coefficient + * GC + * (type_abundances[type] / bio_type_hash[type]["total_mw"]) + ) if coef: - met = model.metabolites.get_by_id(comp.metabolite.id+index) - if type not in ("dna","protein","rna") or classic: + met = model.metabolites.get_by_id(comp.metabolite.id + index) + if type not in ("dna", "protein", "rna") or classic: if met in metabolites: metabolites[met] += coef else: @@ -662,39 +776,48 @@ def build_biomass(self, model, index="0",classic=False,GC=0.5): else: specific_reactions[type].metabolites[met] = coef for l_met in comp.linked_metabolites: - met = self.get_or_create_metabolite(model, l_met.id, None, index) - if type not in ("dna","protein","rna") or classic: + met = self.get_or_create_metabolite( + model, l_met.id, None, index + ) + if type not in ("dna", "protein", "rna") or classic: if met in metabolites: - metabolites[met] += (coef * comp.linked_metabolites[l_met]) + metabolites[met] += ( + coef * comp.linked_metabolites[l_met] + ) else: - metabolites[met] = (coef * comp.linked_metabolites[l_met]) + metabolites[met] = coef * comp.linked_metabolites[l_met] elif not classic: if met in metabolites: - specific_reactions[type].metabolites[met] += (coef * comp.linked_metabolites[l_met]) + specific_reactions[type].metabolites[met] += ( + coef * comp.linked_metabolites[l_met] + ) else: - specific_reactions[type].metabolites[met] = (coef * comp.linked_metabolites[l_met]) + specific_reactions[type].metabolites[met] = ( + coef * comp.linked_metabolites[l_met] + ) biorxn.annotation[SBO_ANNOTATION] = "SBO:0000629" biorxn.add_metabolites(metabolites) return biorxn def get_data(self): data = { - "id" : self.id, - "name" : self.name, - "type" : self.type, - "dna" : self.dna, - "rna" : self.rna, - "protein" : self.protein, - "lipid" : self.lipid, - "cellwall" : self.cellwall, - "cofactor" : self.cofactor, - "energy" : self.energy, - "other" : self.other, - "templateBiomassComponents" : [] + "id": self.id, + "name": self.name, + "type": self.type, + "dna": self.dna, + "rna": self.rna, + "protein": self.protein, + "lipid": self.lipid, + "cellwall": self.cellwall, + "cofactor": self.cofactor, + "energy": self.energy, + "other": self.other, + "templateBiomassComponents": [], } for comp in self.templateBiomassComponents: data["templateBiomassComponents"].append(comp.get_data()) + class NewModelTemplateRole: def __init__(self, role_id, name, features=None, source="", aliases=None): """ @@ -917,16 +1040,44 @@ def __init__( self.pathways = DictList() self.subsystems = DictList() self.drains = None - + ################# Replaces biomass reactions from an input TSV table ############################ - def overwrite_biomass_from_table(self,filename_or_df,bio_id,name,type,dna,rna,protein,lipid,cellwall,cofactor,energy,other): + def overwrite_biomass_from_table( + self, + filename_or_df, + bio_id, + name, + type, + dna, + rna, + protein, + lipid, + cellwall, + cofactor, + energy, + other, + ): if isinstance(filename_or_df, str): filename_or_df = pd.read_table(filename_or_df) - newbio = MSTemplateBiomass.from_table(filename_or_df,self,bio_id,name,type,dna,rna,protein,lipid,cellwall,cofactor,energy,other) + newbio = MSTemplateBiomass.from_table( + filename_or_df, + self, + bio_id, + name, + type, + dna, + rna, + protein, + lipid, + cellwall, + cofactor, + energy, + other, + ) if newbio.id in self.biomasses: self.biomasses.remove(newbio.id) self.biomasses.add(newbio) - + def add_drain(self, compound_id, lower_bound, upper_bound): if compound_id not in self.compcompounds: raise ValueError(f"{compound_id} not in template") @@ -1051,7 +1202,7 @@ def add_comp_compounds(self, comp_compounds: list): x._template_compound = self.compounds.get_by_id(x.cpd_id) x._template_compound.species.add(x) self.compcompounds += comp_compounds - + def add_biomasses(self, biomasses: list): """ Add biomasses to the template @@ -1069,7 +1220,7 @@ def add_biomasses(self, biomasses: list): for x in biomasses: x._template = self self.biomasses += biomasses - + def add_reactions(self, reaction_list: list): """ From 5ab95bfe160ac76f64249ab309dfec09c41588e5 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Tue, 17 Jan 2023 00:17:12 -0600 Subject: [PATCH 065/298] fixes --- modelseedpy/core/msbuilder.py | 2 +- modelseedpy/core/mstemplate.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 18879205..8e557463 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -9,7 +9,7 @@ get_gpr_string, get_reaction_constraints_from_direction, ) -from cobra.core import Gene, Metabolite, Model, Reaction +from cobra.core import Gene, Metabolite, Model, Reaction, Group from modelseedpy.core import FBAHelper from modelseedpy.fbapkg.mspackagemanager import MSPackageManager diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 51dc2e38..3d4fd1a1 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -451,12 +451,12 @@ def get_data(self): class MSTemplateBiomassComponent: def __init__( - self, metabolite, comp_class, coefficient, coefficient_type, linked_metabolites + self, metabolite, comp_class: str, coefficient: float, coefficient_type: str, linked_metabolites ): """ :param metabolite:MSTemplateMetabolite :param comp_class:string - :param coefficient:floar + :param coefficient:float :param coefficient_type:string :param linked_metabolites:{MSTemplateMetabolite:float} """ From 44bba2ba3f0c5151267be6967f85a5a575bf958d Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Tue, 17 Jan 2023 00:18:42 -0600 Subject: [PATCH 066/298] run black --- modelseedpy/core/mstemplate.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 3d4fd1a1..b0d384eb 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -451,7 +451,12 @@ def get_data(self): class MSTemplateBiomassComponent: def __init__( - self, metabolite, comp_class: str, coefficient: float, coefficient_type: str, linked_metabolites + self, + metabolite, + comp_class: str, + coefficient: float, + coefficient_type: str, + linked_metabolites, ): """ :param metabolite:MSTemplateMetabolite From edc05baa7f970651153170980a3f068c6bfcdf4c Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 17 Jan 2023 00:45:22 -0600 Subject: [PATCH 067/298] Minor fixes and adding some utility functionality --- modelseedpy/core/msmodelutl.py | 26 ++++++++++++++++++++++++ modelseedpy/core/mstemplate.py | 37 +++++++++++++++------------------- 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index d4494938..af499773 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -4,6 +4,7 @@ import time import json import sys +import pandas as pd from cobra import Model, Reaction, Metabolite from modelseedpy.fbapkg.mspackagemanager import MSPackageManager from modelseedpy.biochem.modelseed_biochem import ModelSEEDBiochem @@ -306,6 +307,31 @@ def add_ms_reaction(self, rxn_dict, compartment_trans=["c0", "e0"]): print(len(output)) self.model.add_reactions(output) return output + + ################################################################################# + # Functions related to utility functions + ################################################################################# + def build_model_data_hash(self): + data = { + "Model":self.id, + "Genome":self.genome.info.metadata["Name"], + "Genes":self.genome.info.metadata["Number of Protein Encoding Genes"], + + } + return data + + def compare_reactions(self, reaction_list,filename): + data = {} + for rxn in reaction_list: + for met in rxn.metabolites: + if met.id not in data: + data[met.id] = {} + for other_rxn in reaction_list: + data[met.id][other_rxn.id] = 0 + data[met.id][rxn.id] = rxn.metabolites[met] + df = pd.DataFrame(data) + df = df.transpose() + df.to_csv(filename) ################################################################################# # Functions related to managing biomass reactions diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 51dc2e38..1814e774 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -640,7 +640,7 @@ def get_or_create_metabolite(self, model, baseid, compartment=None, index=None): return model.metabolites.get_by_id(fullid) if tempid in self._template.compcompounds: met = self._template.compcompounds.get_by_id(tempid).to_metabolite(index) - model.metabolites.add(met) + model.add_metabolites([met]) return met logger.error( "Could not find biomass metabolite [%s] in model or template!", @@ -658,13 +658,13 @@ def get_or_create_reaction(self, model, baseid, compartment=None, index=None): return model.reactions.get_by_id(fullid) if tempid in self._template.reactions: rxn = self._template.reactions.get_by_id(tempid).to_reaction(model, index) - model.reactions.add(rxn) + model.add_reactions([rxn]) return rxn newrxn = Reaction(fullid, fullid, "biomasses", 0, 1000) - model.reactions.add(newrxn) + model.add_reactions(newrxn) return newrxn - def build_biomass(self, model, index="0", classic=False, GC=0.5): + def build_biomass(self, model, index="0", classic=False, GC=0.5,add_to_model=True): types = [ "cofactor", "lipid", @@ -700,7 +700,8 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5): specific_reactions["dna"].subtract_metabolites( specific_reactions["dna"].metabolites ) - specific_reactions["dna"].metabolites[met] = 1 + specific_reactions["dna"].add_metabolites({met:1}) + metabolites[met] = 1 metabolites[met] = -1 * self.dna if not classic and self.protein > 0: met = self.get_or_create_metabolite(model, "cpd11463", "c", index) @@ -710,7 +711,7 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5): specific_reactions["protein"].subtract_metabolites( specific_reactions["protein"].metabolites ) - specific_reactions["protein"].metabolites[met] = 1 + specific_reactions["protein"].add_metabolites({met:1}) metabolites[met] = -1 * self.protein if not classic and self.rna > 0: met = self.get_or_create_metabolite(model, "cpd11462", "c", index) @@ -720,7 +721,7 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5): specific_reactions["rna"].subtract_metabolites( specific_reactions["rna"].metabolites ) - specific_reactions["rna"].metabolites[met] = 1 + specific_reactions["rna"].add_metabolites({met:1}) metabolites[met] = -1 * self.rna bio_type_hash = {} for type in types: @@ -752,13 +753,13 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5): coef = comp.coefficient elif comp.coefficient_type == "AT": coef = ( - comp.coefficient + 2 * comp.coefficient * (1 - GC) * (type_abundances[type] / bio_type_hash[type]["total_mw"]) ) elif comp.coefficient_type == "GC": coef = ( - comp.coefficient + 2 * comp.coefficient * GC * (type_abundances[type] / bio_type_hash[type]["total_mw"]) ) @@ -771,10 +772,7 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5): metabolites[met] = coef elif not classic: coef = coef / type_abundances[type] - if met in metabolites: - specific_reactions[type].metabolites[met] += coef - else: - specific_reactions[type].metabolites[met] = coef + specific_reactions[type].add_metabolites({met:coef}) for l_met in comp.linked_metabolites: met = self.get_or_create_metabolite( model, l_met.id, None, index @@ -787,16 +785,13 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5): else: metabolites[met] = coef * comp.linked_metabolites[l_met] elif not classic: - if met in metabolites: - specific_reactions[type].metabolites[met] += ( - coef * comp.linked_metabolites[l_met] - ) - else: - specific_reactions[type].metabolites[met] = ( - coef * comp.linked_metabolites[l_met] - ) + specific_reactions[type].add_metabolites({met:coef * comp.linked_metabolites[l_met]}) biorxn.annotation[SBO_ANNOTATION] = "SBO:0000629" biorxn.add_metabolites(metabolites) + if add_to_model: + if biorxn.id in model.reactions: + model.remove_reactions([biorxn.id]) + model.add_reactions([biorxn]) return biorxn def get_data(self): From 7ae888a44904f6c4a7530b5c66c85920edfb2ad2 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Tue, 17 Jan 2023 01:12:25 -0600 Subject: [PATCH 068/298] biomass fix --- modelseedpy/core/msbuilder.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 8e557463..06869289 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -634,7 +634,6 @@ def build_biomass_new(model, template, index): biomasses.append(biorxn) return biomasses - @staticmethod def build_static_biomasses(self, model, template): res = [] if template.name.startswith("CoreModel"): @@ -862,7 +861,7 @@ def build_biomass(self, rxn_id, cobra_model, template, biomass_compounds): cpd = cobra_model.metabolites.get_by_id(model_species_id) metabolites[cpd] = biomass_compounds[template_cpd_id] else: - template_cpd = template.compcompounds.get_by_id(template_cpd_id) + template_cpd = template.compcompounds.get_by_id(template_cpd_id[:-1]) m = template_cpd.to_metabolite(self.index) metabolites[m] = biomass_compounds[template_cpd_id] self.template_species_to_model_species[template_cpd_id] = m From 3cba8e3d8d69ac606bc2d3ca7a0c6d8b1b0b4061 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Tue, 17 Jan 2023 20:33:41 -0600 Subject: [PATCH 069/298] updated ML and scikit-learn version --- modelseedpy/core/msbuilder.py | 35 +++++++++++++++++++++++------------ setup.py | 2 +- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 06869289..c8763c2d 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import logging import itertools +from enum import Enum import cobra from modelseedpy.core.exceptions import ModelSEEDError from modelseedpy.core.rast_client import RastClient @@ -192,6 +193,13 @@ } +class MSGenomeClass(Enum): + P = "Gram Positive" + N = "Gram Negative" + C = "Cyano" + A = "Archaea" + + def build_biomass(rxn_id, cobra_model, template, biomass_compounds, index="0"): bio_rxn = Reaction(rxn_id, "biomass", "", 0, 1000) metabolites = {} @@ -299,6 +307,7 @@ def __init__( self.name = name self.genome = genome self.template = template + self.genome_class = None self.search_name_to_genes, self.search_name_to_original = _aaaa( genome, ontology_term ) @@ -653,9 +662,10 @@ def auto_select_template(self): from modelseedpy.helpers import get_template, get_classifier from modelseedpy.core.mstemplate import MSTemplateBuilder - genome_classifier = get_classifier("knn_ACNP_RAST_filter") - genome_class = genome_classifier.classify(self.genome) + genome_classifier = get_classifier("knn_ACNP_RAST_filter_01_17_2023") + self.genome_class = genome_classifier.classify(self.genome) + # TODO: update with enum MSGenomeClass template_genome_scale_map = { "A": "template_gram_neg", "C": "template_gram_neg", @@ -670,16 +680,16 @@ def auto_select_template(self): } if ( - genome_class in template_genome_scale_map - and genome_class in template_core_map + self.genome_class in template_genome_scale_map + and self.genome_class in template_core_map ): self.template = MSTemplateBuilder.from_dict( - get_template(template_genome_scale_map[genome_class]) + get_template(template_genome_scale_map[self.genome_class]) ).build() elif self.template is None: - raise Exception(f"unable to select template for {genome_class}") + raise Exception(f"unable to select template for {self.genome_class}") - return genome_class + return self.genome_class def generate_reaction_complex_sets(self, allow_incomplete_complexes=True): self.reaction_to_complex_sets = {} @@ -872,14 +882,14 @@ def build_biomass(self, rxn_id, cobra_model, template, biomass_compounds): def build( self, - model_id_or_id, + model_or_id, index="0", allow_all_non_grp_reactions=False, annotate_with_rast=True, ): """ - @param model_id_or_id: a string ID to build from cobra.core.Model otherwise a type of cobra.core.Model + @param model_or_id: a string ID to build from cobra.core.Model otherwise a type of cobra.core.Model as Base Model @param index: @param allow_all_non_grp_reactions: @@ -898,11 +908,12 @@ def build( if self.template is None: self.auto_select_template() - cobra_model = model_id_or_id - if type(model_id_or_id) == str: + cobra_model = model_or_id + if type(model_or_id) == str: from cobra.core import Model - cobra_model = Model(model_id_or_id) + cobra_model = Model(model_or_id) + self.base_model = cobra_model self.generate_reaction_complex_sets() diff --git a/setup.py b/setup.py index bf6ab7a2..5fba7f6c 100644 --- a/setup.py +++ b/setup.py @@ -35,7 +35,7 @@ install_requires=[ "networkx >= 2.4", "cobra >= 0.17.1", - "scikit-learn == 0.24.2", # too support KBase pickle models + "scikit-learn == 1.2.0", # version lock for pickle ML models "scipy >= 1.5.4", "chemicals >= 1.0.13", "chemw >= 0.3.2", From e0a7f4fb882fe321901e13a62c3ce529edf1abb2 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Wed, 18 Jan 2023 04:06:01 -0600 Subject: [PATCH 070/298] index fix --- modelseedpy/core/msbuilder.py | 1 + 1 file changed, 1 insertion(+) diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index c8763c2d..e8b21f0b 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -896,6 +896,7 @@ def build( @param annotate_with_rast: @return: """ + self.index = index if annotate_with_rast: rast = RastClient() From a27257ca9321b8a8e5cefc576456dfcd206940e0 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Tue, 31 Jan 2023 08:57:33 -0600 Subject: [PATCH 071/298] missing import --- modelseedpy/biochem/modelseed_biochem.py | 1 + 1 file changed, 1 insertion(+) diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index ccdd8d76..80594e0e 100644 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -7,6 +7,7 @@ from modelseedpy.biochem.modelseed_compound import ModelSEEDCompound, ModelSEEDCompound2 from modelseedpy.biochem.modelseed_reaction import ModelSEEDReaction, ModelSEEDReaction2 from modelseedpy.helpers import config +from modelseedpy.core.msmodel import get_reaction_constraints_from_direction logger = logging.getLogger(__name__) From f2eb10e3fdeae8d0f2c3b62edf8e277a8031b59a Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Wed, 1 Feb 2023 10:25:06 -0600 Subject: [PATCH 072/298] fixed builder to detect biomass added compounds --- examples/Model Reconstruction/Biomass.ipynb | 162 +++++++++- .../build_metabolic_model.ipynb | 283 ++++++++++++++++++ modelseedpy/core/msbuilder.py | 29 +- modelseedpy/core/mstemplate.py | 1 + 4 files changed, 468 insertions(+), 7 deletions(-) diff --git a/examples/Model Reconstruction/Biomass.ipynb b/examples/Model Reconstruction/Biomass.ipynb index e4a2c901..3726f959 100644 --- a/examples/Model Reconstruction/Biomass.ipynb +++ b/examples/Model Reconstruction/Biomass.ipynb @@ -2,18 +2,17 @@ "cells": [ { "cell_type": "code", - "execution_count": 4, + "execution_count": 1, "id": "5434992c-fc67-40f5-ae08-82f44790666c", "metadata": {}, "outputs": [], "source": [ - "from modelseedpy.helpers import get_template\n", - "from modelseedpy.core.mstemplate import MSTemplateBuilder" + "import modelseedpy" ] }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 2, "id": "b243e00a-4a8b-489d-a778-61844a439e63", "metadata": {}, "outputs": [ @@ -21,7 +20,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "cobrakbase 0.2.8\n" + "cobrakbase 0.3.1\n" ] } ], @@ -30,6 +29,157 @@ "kbase = cobrakbase.KBaseAPI()" ] }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3a177c16-ecb0-4050-bbf5-47aad10f2af9", + "metadata": {}, + "outputs": [], + "source": [ + "template = kbase.get_from_ws('GramNegModelTemplateV3', 'NewKBaseModelTemplates')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "4ce52552-dce2-4c44-9884-cf00d15e76ab", + "metadata": {}, + "outputs": [], + "source": [ + "from modelseedpy import MSBuilder" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "6f216f6a-5e25-4697-bf6b-9ae63475b5c7", + "metadata": {}, + "outputs": [], + "source": [ + "from cobra.core import Model\n", + "model = Model('test')" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "d9763d58-daba-4751-811f-23581b390025", + "metadata": {}, + "outputs": [], + "source": [ + "biomass = template.biomasses[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "d3e884ac-2568-445a-ac04-1508b536c88a", + "metadata": {}, + "outputs": [], + "source": [ + "reaction = biomass.build_biomass(model, '0', True)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f5140ac5-273f-4eb5-b806-ddd9178b252e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cpd00010_c0 {'modelseed_template_id': 'cpd00010_c'}\n", + "cpd11493_c0 {'modelseed_template_id': 'cpd11493_c'}\n", + "cpd12370_c0 {'modelseed_template_id': 'cpd12370_c'}\n", + "cpd00003_c0 {'modelseed_template_id': 'cpd00003_c'}\n", + "cpd00006_c0 {'modelseed_template_id': 'cpd00006_c'}\n", + "cpd00205_c0 {'modelseed_template_id': 'cpd00205_c'}\n", + "cpd00254_c0 {'modelseed_template_id': 'cpd00254_c'}\n", + "cpd10516_c0 {'modelseed_template_id': 'cpd10516_c'}\n", + "cpd00063_c0 {'modelseed_template_id': 'cpd00063_c'}\n", + "cpd00009_c0 {'modelseed_template_id': 'cpd00009_c'}\n", + "cpd00099_c0 {'modelseed_template_id': 'cpd00099_c'}\n", + "cpd00149_c0 {'modelseed_template_id': 'cpd00149_c'}\n", + "cpd00058_c0 {'modelseed_template_id': 'cpd00058_c'}\n", + "cpd00015_c0 {'modelseed_template_id': 'cpd00015_c'}\n", + "cpd10515_c0 {'modelseed_template_id': 'cpd10515_c'}\n", + "cpd00030_c0 {'modelseed_template_id': 'cpd00030_c'}\n", + "cpd00048_c0 {'modelseed_template_id': 'cpd00048_c'}\n", + "cpd00034_c0 {'modelseed_template_id': 'cpd00034_c'}\n", + "cpd00016_c0 {'modelseed_template_id': 'cpd00016_c'}\n", + "cpd00220_c0 {'modelseed_template_id': 'cpd00220_c'}\n", + "cpd00017_c0 {'modelseed_template_id': 'cpd00017_c'}\n", + "cpd00201_c0 {'modelseed_template_id': 'cpd00201_c'}\n", + "cpd00087_c0 {'modelseed_template_id': 'cpd00087_c'}\n", + "cpd00345_c0 {'modelseed_template_id': 'cpd00345_c'}\n", + "cpd00042_c0 {'modelseed_template_id': 'cpd00042_c'}\n", + "cpd00028_c0 {'modelseed_template_id': 'cpd00028_c'}\n", + "cpd00557_c0 {'modelseed_template_id': 'cpd00557_c'}\n", + "cpd00264_c0 {'modelseed_template_id': 'cpd00264_c'}\n", + "cpd00118_c0 {'modelseed_template_id': 'cpd00118_c'}\n", + "cpd00056_c0 {'modelseed_template_id': 'cpd00056_c'}\n", + "cpd15560_c0 {'modelseed_template_id': 'cpd15560_c'}\n", + "cpd15352_c0 {'modelseed_template_id': 'cpd15352_c'}\n", + "cpd15500_c0 {'modelseed_template_id': 'cpd15500_c'}\n", + "cpd00166_c0 {'modelseed_template_id': 'cpd00166_c'}\n", + "cpd01997_c0 {'modelseed_template_id': 'cpd01997_c'}\n", + "cpd03422_c0 {'modelseed_template_id': 'cpd03422_c'}\n", + "cpd00104_c0 {'modelseed_template_id': 'cpd00104_c'}\n", + "cpd00037_c0 {'modelseed_template_id': 'cpd00037_c'}\n", + "cpd00050_c0 {'modelseed_template_id': 'cpd00050_c'}\n", + "cpd15793_c0 {'modelseed_template_id': 'cpd15793_c'}\n", + "cpd15540_c0 {'modelseed_template_id': 'cpd15540_c'}\n", + "cpd15533_c0 {'modelseed_template_id': 'cpd15533_c'}\n", + "cpd15432_c0 {'modelseed_template_id': 'cpd15432_c'}\n", + "cpd02229_c0 {'modelseed_template_id': 'cpd02229_c'}\n", + "cpd15665_c0 {'modelseed_template_id': 'cpd15665_c'}\n", + "cpd15666_c0 {'modelseed_template_id': 'cpd15666_c'}\n", + "cpd00023_c0 {'modelseed_template_id': 'cpd00023_c'}\n", + "cpd00001_c0 {'modelseed_template_id': 'cpd00001_c'}\n", + "cpd00033_c0 {'modelseed_template_id': 'cpd00033_c'}\n", + "cpd00035_c0 {'modelseed_template_id': 'cpd00035_c'}\n", + "cpd00039_c0 {'modelseed_template_id': 'cpd00039_c'}\n", + "cpd00041_c0 {'modelseed_template_id': 'cpd00041_c'}\n", + "cpd00051_c0 {'modelseed_template_id': 'cpd00051_c'}\n", + "cpd00053_c0 {'modelseed_template_id': 'cpd00053_c'}\n", + "cpd00054_c0 {'modelseed_template_id': 'cpd00054_c'}\n", + "cpd00060_c0 {'modelseed_template_id': 'cpd00060_c'}\n", + "cpd00065_c0 {'modelseed_template_id': 'cpd00065_c'}\n", + "cpd00066_c0 {'modelseed_template_id': 'cpd00066_c'}\n", + "cpd00069_c0 {'modelseed_template_id': 'cpd00069_c'}\n", + "cpd00084_c0 {'modelseed_template_id': 'cpd00084_c'}\n", + "cpd00107_c0 {'modelseed_template_id': 'cpd00107_c'}\n", + "cpd00119_c0 {'modelseed_template_id': 'cpd00119_c'}\n", + "cpd00129_c0 {'modelseed_template_id': 'cpd00129_c'}\n", + "cpd00132_c0 {'modelseed_template_id': 'cpd00132_c'}\n", + "cpd00156_c0 {'modelseed_template_id': 'cpd00156_c'}\n", + "cpd00161_c0 {'modelseed_template_id': 'cpd00161_c'}\n", + "cpd00322_c0 {'modelseed_template_id': 'cpd00322_c'}\n", + "cpd00115_c0 {'modelseed_template_id': 'cpd00115_c'}\n", + "cpd00012_c0 {'modelseed_template_id': 'cpd00012_c'}\n", + "cpd00241_c0 {'modelseed_template_id': 'cpd00241_c'}\n", + "cpd00356_c0 {'modelseed_template_id': 'cpd00356_c'}\n", + "cpd00357_c0 {'modelseed_template_id': 'cpd00357_c'}\n", + "cpd00002_c0 {'modelseed_template_id': 'cpd00002_c'}\n", + "cpd00038_c0 {'modelseed_template_id': 'cpd00038_c'}\n", + "cpd00052_c0 {'modelseed_template_id': 'cpd00052_c'}\n", + "cpd00062_c0 {'modelseed_template_id': 'cpd00062_c'}\n", + "cpd00008_c0 {'modelseed_template_id': 'cpd00008_c'}\n", + "cpd00067_c0 {'modelseed_template_id': 'cpd00067_c'}\n", + "cpd11416_c0 {'modelseed_template_id': 'cpd11416_c'}\n", + "cpd17041_c0 {'modelseed_template_id': 'cpd17041_c'}\n", + "cpd17042_c0 {'modelseed_template_id': 'cpd17042_c'}\n", + "cpd17043_c0 {'modelseed_template_id': 'cpd17043_c'}\n" + ] + } + ], + "source": [ + "for m in reaction.metabolites:\n", + " print(m, m.notes)" + ] + }, { "cell_type": "code", "execution_count": 42, @@ -551,7 +701,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, diff --git a/examples/Model Reconstruction/build_metabolic_model.ipynb b/examples/Model Reconstruction/build_metabolic_model.ipynb index 2f1e8d3f..6a817c0f 100644 --- a/examples/Model Reconstruction/build_metabolic_model.ipynb +++ b/examples/Model Reconstruction/build_metabolic_model.ipynb @@ -19,6 +19,24 @@ "genome = MSGenome.from_fasta('GCF_000005845.2_ASM584v2_protein.faa', split=' ')" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model = MSBuilder.build_metabolic_model('ecoli', genome, classic_biomass=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model.summary()" + ] + }, { "cell_type": "code", "execution_count": 3, @@ -36,6 +54,271 @@ "print('Number of features:', len(genome.features))" ] }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "builder = MSBuilder(genome)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "ename": "IndexError", + "evalue": "The genomes or genomeSet that you have submitted wasn’t annotated using the RAST annotation pipeline. Please annotate the genomes via ‘Annotate Microbial Genome’ app (https://narrative.kbase.us/#appcatalog/app/RAST_SDK/reannotate_microbial_genome/release)or genomeSets via Annotate Multiple Microbial Genomes’ app (https://narrative.kbase.us/#appcatalog/app/RAST_SDK/reannotate_microbial_genomes/release) and resubmit the RAST annotated genome/genomeSets into the Predict Phenotype app. (", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/modelseedpy/ml/predict_phenotype.py\u001b[0m in \u001b[0;36mcreate_indicator_matrix\u001b[0;34m(ref_to_role, master_role_list)\u001b[0m\n\u001b[1;32m 93\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 94\u001b[0;31m \u001b[0mindicators\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmatching_index\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 95\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mIndexError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mIndexError\u001b[0m: arrays used as indices must be of integer (or boolean) type", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/tmp/ipykernel_3016957/3197840996.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mbuilder\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mauto_select_template\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/modelseedpy/core/msbuilder.py\u001b[0m in \u001b[0;36mauto_select_template\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 664\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 665\u001b[0m \u001b[0mgenome_classifier\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_classifier\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"knn_ACNP_RAST_filter_01_17_2023\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 666\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgenome_class\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgenome_classifier\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclassify\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgenome\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 667\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 668\u001b[0m \u001b[0;31m# TODO: update with enum MSGenomeClass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/modelseedpy/core/msgenomeclassifier.py\u001b[0m in \u001b[0;36mclassify\u001b[0;34m(self, genome_or_roles, ontology_term)\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[0mgenome_or_roles\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0montology_term\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 32\u001b[0m )\n\u001b[0;32m---> 33\u001b[0;31m indicator_df, master_role_list = create_indicator_matrix(\n\u001b[0m\u001b[1;32m 34\u001b[0m \u001b[0mgenome_or_roles\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfeatures\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 35\u001b[0m )\n", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/modelseedpy/ml/predict_phenotype.py\u001b[0m in \u001b[0;36mcreate_indicator_matrix\u001b[0;34m(ref_to_role, master_role_list)\u001b[0m\n\u001b[1;32m 94\u001b[0m \u001b[0mindicators\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmatching_index\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 95\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mIndexError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 96\u001b[0;31m raise IndexError(\n\u001b[0m\u001b[1;32m 97\u001b[0m \u001b[0;31m\"\u001b[0m\u001b[0mThe\u001b[0m \u001b[0mgenomes\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mgenomeSet\u001b[0m \u001b[0mthat\u001b[0m \u001b[0myou\u001b[0m \u001b[0mhave\u001b[0m \u001b[0msubmitted\u001b[0m \u001b[0mwasn\u001b[0m\u001b[0;31m’\u001b[0m\u001b[0mt\u001b[0m \u001b[0mannotated\u001b[0m \u001b[0musing\u001b[0m \u001b[0mthe\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 98\u001b[0m \u001b[0mRAST\u001b[0m \u001b[0mannotation\u001b[0m \u001b[0mpipeline\u001b[0m\u001b[0;34m.\u001b[0m \u001b[0mPlease\u001b[0m \u001b[0mannotate\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mgenomes\u001b[0m \u001b[0mvia\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m‘\u001b[0m\u001b[0mAnnotate\u001b[0m \u001b[0mMicrobial\u001b[0m \u001b[0mGenome\u001b[0m\u001b[0;31m’\u001b[0m \u001b[0mapp\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mIndexError\u001b[0m: The genomes or genomeSet that you have submitted wasn’t annotated using the RAST annotation pipeline. Please annotate the genomes via ‘Annotate Microbial Genome’ app (https://narrative.kbase.us/#appcatalog/app/RAST_SDK/reannotate_microbial_genome/release)or genomeSets via Annotate Multiple Microbial Genomes’ app (https://narrative.kbase.us/#appcatalog/app/RAST_SDK/reannotate_microbial_genomes/release) and resubmit the RAST annotated genome/genomeSets into the Predict Phenotype app. (" + ] + } + ], + "source": [ + "builder.auto_select_template()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from cobra.core import Reaction" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "rxn = Reaction('SK_cpd11416_c0', 'SK_cpd11416_c0', '', 0, 1000)\n", + "rxn.add_metabolites({model.metabolites.cpd11416_c0: -1})\n", + "model.add_reactions([rxn])" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/fliu/.local/lib/python3.8/site-packages/cobra/io/dict.py:89: DeprecationWarning: `np.float` is a deprecated alias for the builtin `float`. To silence this warning, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here.\n", + "Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations\n", + " if isinstance(value, np.float):\n", + "/home/fliu/.local/lib/python3.8/site-packages/cobra/io/dict.py:91: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.\n", + "Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations\n", + " if isinstance(value, np.bool):\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Nameecoli
Memory address7f3dd51e8400
Number of metabolites1458
Number of reactions1772
Number of genes1295
Number of groups1323
Objective expression1.0*bio1 - 1.0*bio1_reverse_b18f7
CompartmentsCytosol, Extracellular
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "MSBuilder.gapfill_model(model, \"bio1\", builder.template, None)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "

Objective

1.0 bio1 = 0.0

Uptake

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MetaboliteReactionFluxC-NumberC-Flux

Secretion

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MetaboliteReactionFluxC-NumberC-Flux
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cpd00010_c0 CoA [c0] 80\n", + "cpd11493_c0 ACP [c0] 39\n", + "cpd12370_c0 apo-ACP [c0] 3\n", + "cpd00003_c0 NAD [c0] 127\n", + "cpd00006_c0 NADP [c0] 89\n", + "cpd00205_c0 K+ [c0] 5\n", + "cpd00254_c0 Mg [c0] 3\n", + "cpd10516_c0 fe3 [c0] 5\n", + "cpd00063_c0 Ca2+ [c0] 2\n", + "cpd00009_c0 Phosphate [c0] 210\n", + "cpd00099_c0 Cl- [c0] 3\n", + "cpd00149_c0 Co2+ [c0] 2\n", + "cpd00058_c0 Cu2+ [c0] 3\n", + "cpd00015_c0 FAD [c0] 13\n", + "cpd10515_c0 Fe2+ [c0] 5\n", + "cpd00030_c0 Mn2+ [c0] 2\n", + "cpd00048_c0 Sulfate [c0] 4\n", + "cpd00034_c0 Zn2+ [c0] 2\n", + "cpd00016_c0 Pyridoxal phosphate [c0] 5\n", + "cpd00220_c0 Riboflavin [c0] 5\n", + "cpd00017_c0 S-Adenosyl-L-methionine [c0] 21\n", + "cpd00201_c0 10-Formyltetrahydrofolate [c0] 7\n", + "cpd00087_c0 Tetrahydrofolate [c0] 12\n", + "cpd00345_c0 5-Methyltetrahydrofolate [c0] 3\n", + "cpd00042_c0 GSH [c0] 13\n", + "cpd00028_c0 Heme [c0] 4\n", + "cpd00557_c0 Siroheme [c0] 2\n", + "cpd00264_c0 Spermidine [c0] 8\n", + "cpd00118_c0 Putrescine [c0] 9\n", + "cpd00056_c0 TPP [c0] 7\n", + "cpd15560_c0 Ubiquinone-8 [c0] 18\n", + "cpd15352_c0 2-Demethylmenaquinone 8 [c0] 7\n", + "cpd15500_c0 Menaquinone 8 [c0] 12\n", + "cpd00166_c0 Calomide [c0] 4\n", + "cpd01997_c0 Dimethylbenzimidazole [c0] 2\n", + "cpd03422_c0 Cobinamide [c0] 2\n", + "cpd00104_c0 BIOT [c0] 5\n", + "cpd00037_c0 UDP-N-acetylglucosamine [c0] 16\n", + "cpd00050_c0 FMN [c0] 11\n", + "cpd15793_c0 Stearoylcardiolipin (B. subtilis) [c0] 1\n", + "cpd15540_c0 Phosphatidylglycerol dioctadecanoyl [c0] 3\n", + "cpd15533_c0 phosphatidylethanolamine dioctadecanoyl [c0] 3\n", + "cpd15432_c0 core oligosaccharide lipid A [c0] 2\n", + "cpd02229_c0 Bactoprenyl diphosphate [c0] 5\n", + "cpd15665_c0 Peptidoglycan polymer (n subunits) [c0] 2\n", + "cpd15666_c0 Peptidoglycan polymer (n-1 subunits) [c0] 2\n", + "cpd00023_c0 L-Glutamate [c0] 57\n", + "cpd00001_c0 H2O [c0] 556\n", + "cpd00033_c0 Glycine [c0] 21\n", + "cpd00035_c0 L-Alanine [c0] 17\n", + "cpd00039_c0 L-Lysine [c0] 8\n", + "cpd00041_c0 L-Aspartate [c0] 19\n", + "cpd00051_c0 L-Arginine [c0] 6\n", + "cpd00053_c0 L-Glutamine [c0] 17\n", + "cpd00054_c0 L-Serine [c0] 23\n", + "cpd00060_c0 L-Methionine [c0] 19\n", + "cpd00065_c0 L-Tryptophan [c0] 5\n", + "cpd00066_c0 L-Phenylalanine [c0] 4\n", + "cpd00069_c0 L-Tyrosine [c0] 6\n", + "cpd00084_c0 L-Cysteine [c0] 14\n", + "cpd00107_c0 L-Leucine [c0] 6\n", + "cpd00119_c0 L-Histidine [c0] 4\n", + "cpd00129_c0 L-Proline [c0] 11\n", + "cpd00132_c0 L-Asparagine [c0] 6\n", + "cpd00156_c0 L-Valine [c0] 5\n", + "cpd00161_c0 L-Threonine [c0] 7\n", + "cpd00322_c0 L-Isoleucine [c0] 4\n", + "cpd00115_c0 dATP [c0] 7\n", + "cpd00012_c0 PPi [c0] 134\n", + "cpd00241_c0 dGTP [c0] 8\n", + "cpd00356_c0 dCTP [c0] 6\n", + "cpd00357_c0 TTP [c0] 7\n", + "cpd00002_c0 ATP [c0] 276\n", + "cpd00038_c0 GTP [c0] 20\n", + "cpd00052_c0 CTP [c0] 25\n", + "cpd00062_c0 UTP [c0] 13\n", + "cpd00008_c0 ADP [c0] 214\n", + "cpd00067_c0 H+ [c0] 896\n", + "cpd11416_c0 Biomass [c0] 2\n", + "cpd17041_c0 Protein biosynthesis [c0] 2\n", + "cpd17042_c0 DNA replication [c0] 2\n", + "cpd17043_c0 RNA transcription [c0] 2\n" + ] + } + ], + "source": [ + "for m in model.reactions.bio1.metabolites:\n", + " print(m, m.name, len(m.reactions))" + ] + }, { "cell_type": "code", "execution_count": 4, diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index e8b21f0b..1c456d19 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -886,6 +886,8 @@ def build( index="0", allow_all_non_grp_reactions=False, annotate_with_rast=True, + biomass_classic=False, + biomass_gc=0.5, ): """ @@ -894,6 +896,8 @@ def build( @param index: @param allow_all_non_grp_reactions: @param annotate_with_rast: + @param biomass_classic: + @param biomass_gc: @return: """ self.index = index @@ -931,6 +935,23 @@ def build( cobra_model.add_groups(list(complex_groups.values())) self.add_exchanges_to_model(cobra_model) + biomass_reactions = [] + for rxn_biomass in self.template.biomasses: + reaction = rxn_biomass.build_biomass( + cobra_model, "0", biomass_classic, biomass_gc + ) + for m in reaction.metabolites: + if "modelseed_template_id" in m.notes: + self.template_species_to_model_species[ + m.notes["modelseed_template_id"] + ] = m + biomass_reactions.append(reaction) + + if len(biomass_reactions) > 0: + cobra_model.add_reactions(biomass_reactions) + cobra_model.objective = biomass_reactions[0].id + + """ if ( self.template.name.startswith("CoreModel") or self.template.name.startswith("GramNeg") @@ -940,6 +961,7 @@ def build( self.build_static_biomasses(cobra_model, self.template) ) cobra_model.objective = "bio1" + """ reactions_sinks = self.build_drains() cobra_model.add_reactions(reactions_sinks) @@ -1027,10 +1049,15 @@ def build_metabolic_model( allow_all_non_grp_reactions=False, annotate_with_rast=True, gapfill_model=True, + classic_biomass=False, ): builder = MSBuilder(genome, template) model = builder.build( - model_id, index, allow_all_non_grp_reactions, annotate_with_rast + model_id, + index, + allow_all_non_grp_reactions, + annotate_with_rast, + classic_biomass, ) # Gapfilling model if gapfill_model: diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index b0d384eb..d33846f3 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -174,6 +174,7 @@ def to_metabolite(self, index="0"): if len(str(index)) > 0: name = f"{self.name} [{compartment}]" metabolite = Metabolite(cpd_id, self.formula, name, self.charge, compartment) + metabolite.notes["modelseed_template_id"] = self.id return metabolite @property From a8583236fdfdd9c02e948b9573ff89a34a226c82 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Fri, 3 Feb 2023 16:54:03 -0600 Subject: [PATCH 073/298] notebook update --- .../build_metabolic_model.ipynb | 1140 ++++++++++++++++- 1 file changed, 1135 insertions(+), 5 deletions(-) diff --git a/examples/Model Reconstruction/build_metabolic_model.ipynb b/examples/Model Reconstruction/build_metabolic_model.ipynb index 6a817c0f..8cdd7a12 100644 --- a/examples/Model Reconstruction/build_metabolic_model.ipynb +++ b/examples/Model Reconstruction/build_metabolic_model.ipynb @@ -1,12 +1,26 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Build Metabolic Model from Genome .faa file" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* MSGenome: to read a faa file\n", + "* MSBuilder: to build metabolic model from the genome" + ] + }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ - "import modelseedpy\n", "from modelseedpy import MSBuilder, MSGenome" ] }, @@ -19,20 +33,1136 @@ "genome = MSGenome.from_fasta('GCF_000005845.2_ASM584v2_protein.faa', split=' ')" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`MSBuilder.build_metabolic_model` default parameters runs RAST, ML prediction to select template (gram neg, gram pos, cyano [not implemented], archaea [not implemented]), builds draft model and gapfills with complete media" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/fliu/.local/lib/python3.8/site-packages/cobra/io/dict.py:89: DeprecationWarning: `np.float` is a deprecated alias for the builtin `float`. To silence this warning, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here.\n", + "Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations\n", + " if isinstance(value, np.float):\n", + "/home/fliu/.local/lib/python3.8/site-packages/cobra/io/dict.py:91: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.\n", + "Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations\n", + " if isinstance(value, np.bool):\n" + ] + } + ], "source": [ "model = MSBuilder.build_metabolic_model('ecoli', genome, classic_biomass=True)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "

Objective

1.0 bio1 = 141.02637369025626

Uptake

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MetaboliteReactionFluxC-NumberC-Flux
cpd00007_e0EX_cpd00007_e0244.300.00%
cpd00024_e0EX_cpd00024_e083.0752.58%
cpd00028_e0EX_cpd00028_e00.3955340.08%
cpd00030_e0EX_cpd00030_e00.395500.00%
cpd00033_e0EX_cpd00033_e079.8120.99%
cpd00034_e0EX_cpd00034_e00.395500.00%
cpd00039_e0EX_cpd00039_e031.4261.17%
cpd00051_e0EX_cpd00051_e034.7461.29%
cpd00054_e0EX_cpd00054_e034.3530.64%
cpd00058_e0EX_cpd00058_e00.395500.00%
cpd00060_e0EX_cpd00060_e031.0950.96%
cpd00063_e0EX_cpd00063_e00.395500.00%
cpd00065_e0EX_cpd00065_e06.647110.45%
cpd00066_e0EX_cpd00066_e021.7691.21%
cpd00069_e0EX_cpd00069_e016.9990.95%
cpd00079_e0EX_cpd00079_e0499.9618.61%
cpd00080_e0EX_cpd00080_e0609.4311.34%
cpd00099_e0EX_cpd00099_e00.395500.00%
cpd00106_e0EX_cpd00106_e0401.249.96%
cpd00107_e0EX_cpd00107_e052.8661.97%
cpd00118_e0EX_cpd00118_e00.395540.01%
cpd00119_e0EX_cpd00119_e011.1660.42%
cpd00129_e0EX_cpd00129_e025.9650.81%
cpd00130_e0EX_cpd00130_e0199.144.94%
cpd00132_e0EX_cpd00132_e028.2840.70%
cpd00136_e0EX_cpd00136_e00.395570.02%
cpd00149_e0EX_cpd00149_e00.395500.00%
cpd00156_e0EX_cpd00156_e049.651.54%
cpd00161_e0EX_cpd00161_e029.7240.74%
cpd00184_e0EX_cpd00184_e0221.11013.71%
cpd00205_e0EX_cpd00205_e00.395500.00%
cpd00208_e0EX_cpd00208_e03.526120.26%
cpd00209_e0EX_cpd00209_e019000.00%
cpd00249_e0EX_cpd00249_e011.5690.65%
cpd00254_e0EX_cpd00254_e00.395500.00%
cpd00264_e0EX_cpd00264_e00.395570.02%
cpd00268_e0EX_cpd00268_e00.197800.00%
cpd00277_e0EX_cpd00277_e022.59101.40%
cpd00305_e0EX_cpd00305_e00.3955120.03%
cpd00322_e0EX_cpd00322_e034.0561.27%
cpd00355_e0EX_cpd00355_e00.791110.05%
cpd00367_e0EX_cpd00367_e012.9990.73%
cpd00383_e0EX_cpd00383_e01.97870.09%
cpd00412_e0EX_cpd00412_e02.76990.15%
cpd00438_e0EX_cpd00438_e02411014.95%
cpd00644_e0EX_cpd00644_e00.79190.04%
cpd00794_e0EX_cpd00794_e014.1121.05%
cpd01080_e0EX_cpd01080_e035.09183.92%
cpd03847_e0EX_cpd03847_e03.526140.31%
cpd10515_e0EX_cpd10515_e00.79100.00%
cpd10516_e0EX_cpd10516_e00.395500.00%
cpd17041_c0rxn13782_c014100.00%
cpd17042_c0rxn13783_c014100.00%
cpd17043_c0rxn13784_c014100.00%

Secretion

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MetaboliteReactionFluxC-NumberC-Flux
cpd00009_e0EX_cpd00009_e0-100000.00%
cpd00011_e0EX_cpd00011_e0-796.817.50%
cpd00020_e0EX_cpd00020_e0-282.137.97%
cpd00027_e0EX_cpd00027_e0-445.8625.18%
cpd00029_e0EX_cpd00029_e0-49029.22%
cpd00035_e0EX_cpd00035_e0-185.235.23%
cpd00047_e0EX_cpd00047_e0-2.37310.02%
cpd00100_e0EX_cpd00100_e0-4.38630.12%
cpd00108_e0EX_cpd00108_e0-3.52660.20%
cpd00116_e0EX_cpd00116_e0-0.395510.00%
cpd00139_e0EX_cpd00139_e0-1.18720.02%
cpd00151_e0EX_cpd00151_e0-221.1510.40%
cpd00159_e0EX_cpd00159_e0-835.5323.60%
cpd00226_e0EX_cpd00226_e0-220.8510.39%
cpd02701_c0SK_cpd02701_c0-0.3955150.06%
cpd03091_c0SK_cpd03091_c0-0.791100.07%
cpd11416_c0SK_cpd11416_c0-14100.00%
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ignore this below ..." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "from modelseedpy import RastClient\n", + "rast = RastClient()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "

Objective

1.0 bio1 = 141.02637369025626

Uptake

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MetaboliteReactionFluxC-NumberC-Flux
cpd00007_e0EX_cpd00007_e0244.300.00%
cpd00024_e0EX_cpd00024_e083.0752.58%
cpd00028_e0EX_cpd00028_e00.3955340.08%
cpd00030_e0EX_cpd00030_e00.395500.00%
cpd00033_e0EX_cpd00033_e079.8120.99%
cpd00034_e0EX_cpd00034_e00.395500.00%
cpd00039_e0EX_cpd00039_e031.4261.17%
cpd00051_e0EX_cpd00051_e034.7461.29%
cpd00054_e0EX_cpd00054_e034.3530.64%
cpd00058_e0EX_cpd00058_e00.395500.00%
cpd00060_e0EX_cpd00060_e031.0950.96%
cpd00063_e0EX_cpd00063_e00.395500.00%
cpd00065_e0EX_cpd00065_e06.647110.45%
cpd00066_e0EX_cpd00066_e021.7691.21%
cpd00069_e0EX_cpd00069_e016.9990.95%
cpd00079_e0EX_cpd00079_e0499.9618.61%
cpd00080_e0EX_cpd00080_e0609.4311.34%
cpd00099_e0EX_cpd00099_e00.395500.00%
cpd00106_e0EX_cpd00106_e0401.249.96%
cpd00107_e0EX_cpd00107_e052.8661.97%
cpd00118_e0EX_cpd00118_e00.395540.01%
cpd00119_e0EX_cpd00119_e011.1660.42%
cpd00129_e0EX_cpd00129_e025.9650.81%
cpd00130_e0EX_cpd00130_e0199.144.94%
cpd00132_e0EX_cpd00132_e028.2840.70%
cpd00136_e0EX_cpd00136_e00.395570.02%
cpd00149_e0EX_cpd00149_e00.395500.00%
cpd00156_e0EX_cpd00156_e049.651.54%
cpd00161_e0EX_cpd00161_e029.7240.74%
cpd00184_e0EX_cpd00184_e0221.11013.71%
cpd00205_e0EX_cpd00205_e00.395500.00%
cpd00208_e0EX_cpd00208_e03.526120.26%
cpd00209_e0EX_cpd00209_e019000.00%
cpd00249_e0EX_cpd00249_e011.5690.65%
cpd00254_e0EX_cpd00254_e00.395500.00%
cpd00264_e0EX_cpd00264_e00.395570.02%
cpd00268_e0EX_cpd00268_e00.197800.00%
cpd00277_e0EX_cpd00277_e022.59101.40%
cpd00305_e0EX_cpd00305_e00.3955120.03%
cpd00322_e0EX_cpd00322_e034.0561.27%
cpd00355_e0EX_cpd00355_e00.791110.05%
cpd00367_e0EX_cpd00367_e012.9990.73%
cpd00383_e0EX_cpd00383_e01.97870.09%
cpd00412_e0EX_cpd00412_e02.76990.15%
cpd00438_e0EX_cpd00438_e02411014.95%
cpd00644_e0EX_cpd00644_e00.79190.04%
cpd00794_e0EX_cpd00794_e014.1121.05%
cpd01080_e0EX_cpd01080_e035.09183.92%
cpd03847_e0EX_cpd03847_e03.526140.31%
cpd10515_e0EX_cpd10515_e00.79100.00%
cpd10516_e0EX_cpd10516_e00.395500.00%
cpd17041_c0rxn13782_c014100.00%
cpd17042_c0rxn13783_c014100.00%
cpd17043_c0rxn13784_c014100.00%

Secretion

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MetaboliteReactionFluxC-NumberC-Flux
cpd00009_e0EX_cpd00009_e0-100000.00%
cpd00011_e0EX_cpd00011_e0-796.817.50%
cpd00020_e0EX_cpd00020_e0-282.137.97%
cpd00027_e0EX_cpd00027_e0-445.8625.18%
cpd00029_e0EX_cpd00029_e0-49029.22%
cpd00035_e0EX_cpd00035_e0-185.235.23%
cpd00047_e0EX_cpd00047_e0-2.37310.02%
cpd00100_e0EX_cpd00100_e0-4.38630.12%
cpd00108_e0EX_cpd00108_e0-3.52660.20%
cpd00116_e0EX_cpd00116_e0-0.395510.00%
cpd00139_e0EX_cpd00139_e0-1.18720.02%
cpd00151_e0EX_cpd00151_e0-221.1510.40%
cpd00159_e0EX_cpd00159_e0-835.5323.60%
cpd00226_e0EX_cpd00226_e0-220.8510.39%
cpd02701_c0SK_cpd02701_c0-0.3955150.06%
cpd03091_c0SK_cpd03091_c0-0.791100.07%
cpd11416_c0SK_cpd11416_c0-14100.00%
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "model.summary()" ] From f00dbc1b429410443878f5f1f2b8b4611f83da89 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 9 Feb 2023 13:47:14 -0600 Subject: [PATCH 074/298] Fixes for new biomass code --- modelseedpy/core/fbahelper.py | 16 +++-- modelseedpy/core/msbuilder.py | 100 +++------------------------- modelseedpy/core/msgapfill.py | 2 +- modelseedpy/core/mstemplate.py | 23 +++++-- modelseedpy/fbapkg/gapfillingpkg.py | 43 ++++++++---- 5 files changed, 72 insertions(+), 112 deletions(-) diff --git a/modelseedpy/core/fbahelper.py b/modelseedpy/core/fbahelper.py index 6c44108f..8605fef3 100644 --- a/modelseedpy/core/fbahelper.py +++ b/modelseedpy/core/fbahelper.py @@ -115,18 +115,24 @@ def modelseed_id_from_cobra_reaction(reaction): @staticmethod def metabolite_mw(metabolite): + fixed_masses = {"cpd11416":1,"cpd17041":0,"cpd17042":0,"cpd17043":0} + msid = FBAHelper.modelseed_id_from_cobra_metabolite(metabolite) + if msid in fixed_masses: + return fixed_masses[msid] + if not metabolite.formula: + return 0 + formula = re.sub("R\d*", "", metabolite.formula) try: - if not metabolite.formula: - return 0 - formula = re.sub("R\d*", "", metabolite.formula) chem_mw = ChemMW(printing=False) chem_mw.mass(formula) return chem_mw.raw_mw except: - warn( + logger.warn( "The compound " + metabolite.id - + " possesses an unconventional formula {metabolite.formula}; hence, the MW cannot be computed." + + " possesses an unconventional formula " + + metabolite.formula + + "; hence, the MW cannot be computed." ) return 0 diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 06869289..2a2415cb 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -555,85 +555,6 @@ def get_or_create_metabolite( pass return model.metabolites.get_by_id(full_id) - @staticmethod - def build_biomass_new(model, template, index): - biomasses = [] - types = ["cofactor", "lipid", "cellwall"] - for bio in template.biomasses: - # Creating biomass reaction object - metabolites = {} - biorxn = Reaction(bio.id, bio.name, "biomasses", 0, 1000) - # Adding standard compounds for DNA, RNA, protein, and biomass - if bio["type"] == "growth": - met = MSBuilder.get_or_create_metabolite( - model, template, "cpd11416", "c", index - ) - metabolites[met] = 1 - if "dna" in bio and bio["dna"] > 0: - met = MSBuilder.get_or_create_metabolite( - model, template, "cpd11461", "c", index - ) - metabolites[met] = -1 * bio["dna"] - if "protein" in bio and bio["protein"] > 0: - met = MSBuilder.get_or_create_metabolite( - model, template, "cpd11463", "c", index - ) - metabolites[met] = -1 * bio["protein"] - if "rna" in bio and bio["rna"] > 0: - met = MSBuilder.get_or_create_metabolite( - model, template, "cpd11462", "c", index - ) - metabolites[met] = -1 * bio["rna"] - bio_type_hash = {} - for type in types: - for comp in bio["templateBiomassComponents"]: - fullid = FBAHelper.id_from_ref(comp["templatecompcompound_ref"]) - (baseid, compartment, ignore_index) = FBAHelper.parse_id(fullid) - comp["met"] = MSBuilder.get_or_create_metabolite( - model, template, baseid, compartment, index - ) - if type not in bio_type_hash: - bio_type_hash[type] = {"items": [], "total_mw": 0} - if FBAHelper.metabolite_mw(comp["met"]): - types[type] += FBAHelper.metabolite_mw(comp["met"]) / 1000 - bio_type_hash[type].append(comp) - for type in bio_type_hash: - compmass = bio[type] - for comp in bio_type_hash[type]: - coef = None - if comp["coefficient_type"] == "MOLFRACTION": - coef = compmass / types[type] * comp["coefficient"] - elif comp["coefficient_type"] == "MOLSPLIT": - coef = compmass / types[type] * comp["coefficient"] - elif comp["coefficient_type"] == "MULTIPLIER": - coef = biorxn[type] * comp["coefficient"] - elif comp["coefficient_type"] == "EXACT": - coef = comp["coefficient"] - if coef: - met = model.metabolites.get_by_id("cpd11416_c0") - if met in metabolites: - metabolites[met] += coef - else: - metabolites[met] = coef - metabolites[met] = coef - for count, value in enumerate(comp["linked_compound_refs"]): - met = model.metabolites.get_by_id( - FBAHelper.id_from_ref(value) - ) - if met in metabolites: - metabolites[met] += ( - coef * comp["link_coefficients"][count] - ) - else: - metabolites[met] = ( - coef * comp["link_coefficients"][count] - ) - - biorxn.annotation[SBO_ANNOTATION] = "SBO:0000629" - biorxn.add_metabolites(metabolites) - biomasses.append(biorxn) - return biomasses - def build_static_biomasses(self, model, template): res = [] if template.name.startswith("CoreModel"): @@ -737,7 +658,7 @@ def build_complex_groups(self, complex_sets): group_complexes = {} for complex_set in complex_sets: for complex_id in complex_set: - if complex_id not in group_complexes: + if complex_id not in group_complexes and complex_id in self.template.complexes: cpx = self.template.complexes.get_by_id(complex_id) g = Group(complex_id) g.notes["complex_source"] = cpx.source @@ -924,9 +845,12 @@ def build( or self.template.name.startswith("GramNeg") or self.template.name.startswith("GramPos") ): - cobra_model.add_reactions( - self.build_static_biomasses(cobra_model, self.template) - ) + gc = 0.5 + if hasattr(self.genome,"info"): + gc = float(self.genome.info.metadata["GC content"]) + print("Genome custom GC:",gc) + for bio in self.template.biomasses: + bio.build_biomass(cobra_model, index, classic=False, GC=gc,add_to_model=True) cobra_model.objective = "bio1" reactions_sinks = self.build_drains() @@ -983,13 +907,9 @@ def build_full_template_model(template, model_id=None, index="0"): bio_rxn2 = build_biomass("bio2", model, template, core_atp, index) model.add_reactions([bio_rxn1, bio_rxn2]) model.objective = "bio1" - if template.name.startswith("GramNeg"): - bio_rxn1 = build_biomass("bio1", model, template, gramneg, index) - model.add_reactions([bio_rxn1]) - model.objective = "bio1" - if template.name.startswith("GramPos"): - bio_rxn1 = build_biomass("bio1", model, template, grampos, index) - model.add_reactions([bio_rxn1]) + else: + for bio in template.biomasses: + bio.build_biomass(self, model, index, classic=False, GC=0.5,add_to_model=True) model.objective = "bio1" reactions_sinks = [] diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 9b42e17d..c48cf94b 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -147,7 +147,7 @@ def integrate_gapfill_solution(self, solution, cumulative_solution=[]): ---------- solution : dict Specifies the reactions to be added to the model to implement the gapfilling solution - cumulation_solution : list + cumulative_solution : list Optional array to cumulatively track all reactions added to the model when integrating multiple solutions """ for rxn_id in solution["reversed"]: diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 4335ef45..ed44ce0c 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -693,15 +693,18 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5,add_to_model=Tru metabolites = {} biorxn = Reaction(self.id, self.name, "biomasses", 0, 1000) # Adding standard compounds for DNA, RNA, protein, and biomass - if not classic and self.type == "growth": - met = self.get_or_create_metabolite(model, "cpd11416", "c", index) - metabolites[met] = 1 specific_reactions = {"dna": None, "rna": None, "protein": None} + exclusions = {"cpd17041_c":1,"cpd17042_c":1,"cpd17043_c":1} if not classic and self.dna > 0: met = self.get_or_create_metabolite(model, "cpd11461", "c", index) specific_reactions["dna"] = self.get_or_create_reaction( model, "rxn05294", "c", index ) + specific_reactions["dna"].name = "DNA synthesis" + if "rxn13783_c" + index in model.reactions: + specific_reactions["dna"].gene_reaction_rule = model.reactions.get_by_id("rxn13783_c" + index).gene_reaction_rule + specific_reactions["dna"].notes['modelseed_complex'] = model.reactions.get_by_id("rxn13783_c" + index).notes['modelseed_complex'] + model.remove_reactions([model.reactions.get_by_id("rxn13783_c" + index)]) specific_reactions["dna"].subtract_metabolites( specific_reactions["dna"].metabolites ) @@ -713,6 +716,11 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5,add_to_model=Tru specific_reactions["protein"] = self.get_or_create_reaction( model, "rxn05296", "c", index ) + specific_reactions["protein"].name = "Protein synthesis" + if "rxn13782_c" + index in model.reactions: + specific_reactions["protein"].gene_reaction_rule = model.reactions.get_by_id("rxn13782_c" + index).gene_reaction_rule + specific_reactions["protein"].notes['modelseed_complex'] = model.reactions.get_by_id("rxn13782_c" + index).notes['modelseed_complex'] + model.remove_reactions([model.reactions.get_by_id("rxn13782_c" + index)]) specific_reactions["protein"].subtract_metabolites( specific_reactions["protein"].metabolites ) @@ -723,6 +731,11 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5,add_to_model=Tru specific_reactions["rna"] = self.get_or_create_reaction( model, "rxn05295", "c", index ) + specific_reactions["rna"].name = "mRNA synthesis" + if "rxn13784_c" + index in model.reactions: + specific_reactions["rna"].gene_reaction_rule = model.reactions.get_by_id("rxn13784_c" + index).gene_reaction_rule + specific_reactions["rna"].notes['modelseed_complex'] = model.reactions.get_by_id("rxn13784_c" + index).notes['modelseed_complex'] + model.remove_reactions([model.reactions.get_by_id("rxn13784_c" + index)]) specific_reactions["rna"].subtract_metabolites( specific_reactions["rna"].metabolites ) @@ -731,7 +744,9 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5,add_to_model=Tru bio_type_hash = {} for type in types: for comp in self.templateBiomassComponents: - if type == comp.comp_class: + if comp.metabolite.id in exclusions and not classic: + pass + elif type == comp.comp_class: met = self.get_or_create_metabolite( model, comp.metabolite.id, None, index ) diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index 58140418..880aeabf 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -7,6 +7,7 @@ import json from optlang.symbolics import Zero, add from cobra import Model, Reaction, Metabolite +from cobra.io import load_json_model, save_json_model, load_matlab_model, save_matlab_model, read_sbml_model, write_sbml_model from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg from modelseedpy.core.fbahelper import FBAHelper @@ -899,6 +900,26 @@ def run_test_conditions(self, condition_list, solution=None, max_iterations=10): return solution def filter_database_based_on_tests(self, test_conditions): + #Preserving the gapfilling objective function + gfobj = self.model.objective + #Setting the minimal growth constraint to zero + self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = 0 + #Setting the objective to the original default objective for the model + self.model.objective = self.parameters["origobj"] + #Testing if the minimal objective can be achieved before filtering + solution = self.model.optimize() + print( + "Objective before filtering:", + solution.objective_value, + "; min objective:", + self.parameters["minimum_obj"], + ) + with open("debuggf.lp", "w") as out: + out.write(str(self.model.solver)) + if solution.objective_value < self.parameters["minimum_obj"]: + save_json_model(self.model, "gfdebugmdl.json") + logger.critical("Model cannot achieve the minimum objective even before filtering!") + #Filtering the database of any reactions that violate the specified tests filetered_list = [] with self.model: rxnlist = [] @@ -908,7 +929,7 @@ def filter_database_based_on_tests(self, test_conditions): rxnlist.append([reaction, "<"]) if "forward" in self.gapfilling_penalties[reaction.id]: rxnlist.append([reaction, ">"]) - self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = 0 + filtered_list = self.modelutl.reaction_expansion_test( rxnlist, test_conditions ) @@ -920,21 +941,19 @@ def filter_database_based_on_tests(self, test_conditions): else: self.model.reactions.get_by_id(item[0].id).lower_bound = 0 # Now testing if the gapfilling minimum objective can still be achieved - gfobj = self.model.objective - self.model.objective = self.parameters["origobj"] solution = self.model.optimize() - # Restoring the minimum objective constraint - self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = self.parameters[ - "minimum_obj" - ] print( "Objective after filtering:", solution.objective_value, "; min objective:", self.parameters["minimum_obj"], ) + # Now we need to restore a minimal set of filtered reactions such that we permit the minimum objective to be reached if solution.objective_value < self.parameters["minimum_obj"]: - # Now we need to restore a minimal set of filtered reactions such that we permit the minimum objective to be reached + # Restoring the minimum objective constraint + self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = self.parameters[ + "minimum_obj" + ] new_objective = self.model.problem.Objective(Zero, direction="min") filterobjcoef = dict() for item in filtered_list: @@ -945,7 +964,6 @@ def filter_database_based_on_tests(self, test_conditions): else: filterobjcoef[rxn.reverse_variable] = item[3] rxn.lower_bound = item[2] - self.model.objective = new_objective new_objective.set_linear_coefficients(filterobjcoef) solution = self.model.optimize() @@ -979,9 +997,10 @@ def filter_database_based_on_tests(self, test_conditions): self.model.reactions.get_by_id(item[0].id).upper_bound = 0 else: self.model.reactions.get_by_id(item[0].id).lower_bound = 0 - self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"][ - "1" - ].lb = self.parameters["minimum_obj"] + #Restoring gapfilling objective function and minimal objective constraint + self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = self.parameters[ + "minimum_obj" + ] self.model.objective = gfobj def compute_gapfilled_solution(self, flux_values=None): From c22a8d6940ca173f934e21a3d1d6e39b02239cca Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 9 Feb 2023 13:59:47 -0600 Subject: [PATCH 075/298] Formatting with black --- modelseedpy/core/fbahelper.py | 2 +- modelseedpy/core/msbuilder.py | 9 +++- modelseedpy/core/mstemplate.py | 70 +++++++++++++++++++++-------- modelseedpy/fbapkg/gapfillingpkg.py | 33 +++++++++----- 4 files changed, 81 insertions(+), 33 deletions(-) diff --git a/modelseedpy/core/fbahelper.py b/modelseedpy/core/fbahelper.py index 8605fef3..502611d9 100644 --- a/modelseedpy/core/fbahelper.py +++ b/modelseedpy/core/fbahelper.py @@ -115,7 +115,7 @@ def modelseed_id_from_cobra_reaction(reaction): @staticmethod def metabolite_mw(metabolite): - fixed_masses = {"cpd11416":1,"cpd17041":0,"cpd17042":0,"cpd17043":0} + fixed_masses = {"cpd11416": 1, "cpd17041": 0, "cpd17042": 0, "cpd17043": 0} msid = FBAHelper.modelseed_id_from_cobra_metabolite(metabolite) if msid in fixed_masses: return fixed_masses[msid] diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 3c54986b..e53a28ac 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -668,7 +668,10 @@ def build_complex_groups(self, complex_sets): group_complexes = {} for complex_set in complex_sets: for complex_id in complex_set: - if complex_id not in group_complexes and complex_id in self.template.complexes: + if ( + complex_id not in group_complexes + and complex_id in self.template.complexes + ): cpx = self.template.complexes.get_by_id(complex_id) g = Group(complex_id) g.notes["complex_source"] = cpx.source @@ -943,7 +946,9 @@ def build_full_template_model(template, model_id=None, index="0"): model.objective = "bio1" else: for bio in template.biomasses: - bio.build_biomass(self, model, index, classic=False, GC=0.5,add_to_model=True) + bio.build_biomass( + self, model, index, classic=False, GC=0.5, add_to_model=True + ) model.objective = "bio1" reactions_sinks = [] diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 8f2a8560..6a6d5b6f 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -670,7 +670,7 @@ def get_or_create_reaction(self, model, baseid, compartment=None, index=None): model.add_reactions(newrxn) return newrxn - def build_biomass(self, model, index="0", classic=False, GC=0.5,add_to_model=True): + def build_biomass(self, model, index="0", classic=False, GC=0.5, add_to_model=True): types = [ "cofactor", "lipid", @@ -695,7 +695,7 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5,add_to_model=Tru biorxn = Reaction(self.id, self.name, "biomasses", 0, 1000) # Adding standard compounds for DNA, RNA, protein, and biomass specific_reactions = {"dna": None, "rna": None, "protein": None} - exclusions = {"cpd17041_c":1,"cpd17042_c":1,"cpd17043_c":1} + exclusions = {"cpd17041_c": 1, "cpd17042_c": 1, "cpd17043_c": 1} if not classic and self.dna > 0: met = self.get_or_create_metabolite(model, "cpd11461", "c", index) specific_reactions["dna"] = self.get_or_create_reaction( @@ -703,13 +703,23 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5,add_to_model=Tru ) specific_reactions["dna"].name = "DNA synthesis" if "rxn13783_c" + index in model.reactions: - specific_reactions["dna"].gene_reaction_rule = model.reactions.get_by_id("rxn13783_c" + index).gene_reaction_rule - specific_reactions["dna"].notes['modelseed_complex'] = model.reactions.get_by_id("rxn13783_c" + index).notes['modelseed_complex'] - model.remove_reactions([model.reactions.get_by_id("rxn13783_c" + index)]) + specific_reactions[ + "dna" + ].gene_reaction_rule = model.reactions.get_by_id( + "rxn13783_c" + index + ).gene_reaction_rule + specific_reactions["dna"].notes[ + "modelseed_complex" + ] = model.reactions.get_by_id("rxn13783_c" + index).notes[ + "modelseed_complex" + ] + model.remove_reactions( + [model.reactions.get_by_id("rxn13783_c" + index)] + ) specific_reactions["dna"].subtract_metabolites( specific_reactions["dna"].metabolites ) - specific_reactions["dna"].add_metabolites({met:1}) + specific_reactions["dna"].add_metabolites({met: 1}) metabolites[met] = 1 metabolites[met] = -1 * self.dna if not classic and self.protein > 0: @@ -719,13 +729,23 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5,add_to_model=Tru ) specific_reactions["protein"].name = "Protein synthesis" if "rxn13782_c" + index in model.reactions: - specific_reactions["protein"].gene_reaction_rule = model.reactions.get_by_id("rxn13782_c" + index).gene_reaction_rule - specific_reactions["protein"].notes['modelseed_complex'] = model.reactions.get_by_id("rxn13782_c" + index).notes['modelseed_complex'] - model.remove_reactions([model.reactions.get_by_id("rxn13782_c" + index)]) + specific_reactions[ + "protein" + ].gene_reaction_rule = model.reactions.get_by_id( + "rxn13782_c" + index + ).gene_reaction_rule + specific_reactions["protein"].notes[ + "modelseed_complex" + ] = model.reactions.get_by_id("rxn13782_c" + index).notes[ + "modelseed_complex" + ] + model.remove_reactions( + [model.reactions.get_by_id("rxn13782_c" + index)] + ) specific_reactions["protein"].subtract_metabolites( specific_reactions["protein"].metabolites ) - specific_reactions["protein"].add_metabolites({met:1}) + specific_reactions["protein"].add_metabolites({met: 1}) metabolites[met] = -1 * self.protein if not classic and self.rna > 0: met = self.get_or_create_metabolite(model, "cpd11462", "c", index) @@ -734,13 +754,23 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5,add_to_model=Tru ) specific_reactions["rna"].name = "mRNA synthesis" if "rxn13784_c" + index in model.reactions: - specific_reactions["rna"].gene_reaction_rule = model.reactions.get_by_id("rxn13784_c" + index).gene_reaction_rule - specific_reactions["rna"].notes['modelseed_complex'] = model.reactions.get_by_id("rxn13784_c" + index).notes['modelseed_complex'] - model.remove_reactions([model.reactions.get_by_id("rxn13784_c" + index)]) + specific_reactions[ + "rna" + ].gene_reaction_rule = model.reactions.get_by_id( + "rxn13784_c" + index + ).gene_reaction_rule + specific_reactions["rna"].notes[ + "modelseed_complex" + ] = model.reactions.get_by_id("rxn13784_c" + index).notes[ + "modelseed_complex" + ] + model.remove_reactions( + [model.reactions.get_by_id("rxn13784_c" + index)] + ) specific_reactions["rna"].subtract_metabolites( specific_reactions["rna"].metabolites ) - specific_reactions["rna"].add_metabolites({met:1}) + specific_reactions["rna"].add_metabolites({met: 1}) metabolites[met] = -1 * self.rna bio_type_hash = {} for type in types: @@ -774,13 +804,15 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5,add_to_model=Tru coef = comp.coefficient elif comp.coefficient_type == "AT": coef = ( - 2 * comp.coefficient + 2 + * comp.coefficient * (1 - GC) * (type_abundances[type] / bio_type_hash[type]["total_mw"]) ) elif comp.coefficient_type == "GC": coef = ( - 2 * comp.coefficient + 2 + * comp.coefficient * GC * (type_abundances[type] / bio_type_hash[type]["total_mw"]) ) @@ -793,7 +825,7 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5,add_to_model=Tru metabolites[met] = coef elif not classic: coef = coef / type_abundances[type] - specific_reactions[type].add_metabolites({met:coef}) + specific_reactions[type].add_metabolites({met: coef}) for l_met in comp.linked_metabolites: met = self.get_or_create_metabolite( model, l_met.id, None, index @@ -806,7 +838,9 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5,add_to_model=Tru else: metabolites[met] = coef * comp.linked_metabolites[l_met] elif not classic: - specific_reactions[type].add_metabolites({met:coef * comp.linked_metabolites[l_met]}) + specific_reactions[type].add_metabolites( + {met: coef * comp.linked_metabolites[l_met]} + ) biorxn.annotation[SBO_ANNOTATION] = "SBO:0000629" biorxn.add_metabolites(metabolites) if add_to_model: diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index 880aeabf..ebbebe72 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -7,7 +7,14 @@ import json from optlang.symbolics import Zero, add from cobra import Model, Reaction, Metabolite -from cobra.io import load_json_model, save_json_model, load_matlab_model, save_matlab_model, read_sbml_model, write_sbml_model +from cobra.io import ( + load_json_model, + save_json_model, + load_matlab_model, + save_matlab_model, + read_sbml_model, + write_sbml_model, +) from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg from modelseedpy.core.fbahelper import FBAHelper @@ -900,13 +907,13 @@ def run_test_conditions(self, condition_list, solution=None, max_iterations=10): return solution def filter_database_based_on_tests(self, test_conditions): - #Preserving the gapfilling objective function + # Preserving the gapfilling objective function gfobj = self.model.objective - #Setting the minimal growth constraint to zero + # Setting the minimal growth constraint to zero self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = 0 - #Setting the objective to the original default objective for the model + # Setting the objective to the original default objective for the model self.model.objective = self.parameters["origobj"] - #Testing if the minimal objective can be achieved before filtering + # Testing if the minimal objective can be achieved before filtering solution = self.model.optimize() print( "Objective before filtering:", @@ -918,8 +925,10 @@ def filter_database_based_on_tests(self, test_conditions): out.write(str(self.model.solver)) if solution.objective_value < self.parameters["minimum_obj"]: save_json_model(self.model, "gfdebugmdl.json") - logger.critical("Model cannot achieve the minimum objective even before filtering!") - #Filtering the database of any reactions that violate the specified tests + logger.critical( + "Model cannot achieve the minimum objective even before filtering!" + ) + # Filtering the database of any reactions that violate the specified tests filetered_list = [] with self.model: rxnlist = [] @@ -929,7 +938,7 @@ def filter_database_based_on_tests(self, test_conditions): rxnlist.append([reaction, "<"]) if "forward" in self.gapfilling_penalties[reaction.id]: rxnlist.append([reaction, ">"]) - + filtered_list = self.modelutl.reaction_expansion_test( rxnlist, test_conditions ) @@ -951,9 +960,9 @@ def filter_database_based_on_tests(self, test_conditions): # Now we need to restore a minimal set of filtered reactions such that we permit the minimum objective to be reached if solution.objective_value < self.parameters["minimum_obj"]: # Restoring the minimum objective constraint - self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = self.parameters[ - "minimum_obj" - ] + self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"][ + "1" + ].lb = self.parameters["minimum_obj"] new_objective = self.model.problem.Objective(Zero, direction="min") filterobjcoef = dict() for item in filtered_list: @@ -997,7 +1006,7 @@ def filter_database_based_on_tests(self, test_conditions): self.model.reactions.get_by_id(item[0].id).upper_bound = 0 else: self.model.reactions.get_by_id(item[0].id).lower_bound = 0 - #Restoring gapfilling objective function and minimal objective constraint + # Restoring gapfilling objective function and minimal objective constraint self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = self.parameters[ "minimum_obj" ] From c61394c564810914e39da3ee8698fd3c60db7ced Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Mon, 13 Feb 2023 23:26:21 -0600 Subject: [PATCH 076/298] biomass fix --- modelseedpy/core/mstemplate.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index d33846f3..b9475dc4 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -823,6 +823,8 @@ def get_data(self): for comp in self.templateBiomassComponents: data["templateBiomassComponents"].append(comp.get_data()) + return data + class NewModelTemplateRole: def __init__(self, role_id, name, features=None, source="", aliases=None): From 2915d7743f8cd6f1b335e2a86d44eb55e0f84d0b Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Tue, 14 Feb 2023 14:45:37 -0600 Subject: [PATCH 077/298] bug fix --- .../build_metabolic_model.ipynb | 26 +++++++++++++++++++ modelseedpy/core/mstemplate.py | 3 ++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/examples/Model Reconstruction/build_metabolic_model.ipynb b/examples/Model Reconstruction/build_metabolic_model.ipynb index 8cdd7a12..ea2e8d41 100644 --- a/examples/Model Reconstruction/build_metabolic_model.ipynb +++ b/examples/Model Reconstruction/build_metabolic_model.ipynb @@ -40,6 +40,32 @@ "`MSBuilder.build_metabolic_model` default parameters runs RAST, ML prediction to select template (gram neg, gram pos, cyano [not implemented], archaea [not implemented]), builds draft model and gapfills with complete media" ] }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "type object argument after ** must be a mapping, not str", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/tmp/ipykernel_3118582/859642788.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mmodelseedpy\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mRastClient\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mrast\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mRastClient\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mrast\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mannotate_genome\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgenome\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/modelseedpy/core/rast_client.py\u001b[0m in \u001b[0;36mannotate_genome\u001b[0;34m(self, genome)\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseq\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseq\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[0mp_features\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m\"id\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"protein_translation\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseq\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 70\u001b[0;31m \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mp_features\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 71\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 72\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mo\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mres\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"features\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/modelseedpy/core/rast_client.py\u001b[0m in \u001b[0;36mf\u001b[0;34m(self, p_features)\u001b[0m\n\u001b[1;32m 91\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp_features\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 92\u001b[0m \u001b[0mparams\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m\"features\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mp_features\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\"stages\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstages\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 93\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrpc_client\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcall\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"GenomeAnnotation.run_pipeline\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparams\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 94\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.8/site-packages/modelseedpy/core/rpcclient.py\u001b[0m in \u001b[0;36mcall\u001b[0;34m(self, method, params, token)\u001b[0m\n\u001b[1;32m 73\u001b[0m \u001b[0merr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mret\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjson\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 74\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m\"error\"\u001b[0m \u001b[0;32min\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 75\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mServerError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0merr\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"error\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 76\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 77\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mServerError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Unknown\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mret\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: type object argument after ** must be a mapping, not str" + ] + } + ], + "source": [ + "from modelseedpy import RastClient\n", + "rast = RastClient()\n", + "rast.annotate_genome(genome)" + ] + }, { "cell_type": "code", "execution_count": 3, diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index b9475dc4..7e992d52 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -654,13 +654,14 @@ def get_or_create_metabolite(self, model, baseid, compartment=None, index=None): ) def get_or_create_reaction(self, model, baseid, compartment=None, index=None): + logger.debug(f'{baseid}, {compartment}, {index}') fullid = baseid if compartment: fullid += "_" + compartment tempid = fullid if index: fullid += index - if fullid in model.metabolites: + if fullid in model.reactions: return model.reactions.get_by_id(fullid) if tempid in self._template.reactions: rxn = self._template.reactions.get_by_id(tempid).to_reaction(model, index) From b42a04f7b7dcfaa6b6cf1eea84c8e8519cbb0b23 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Tue, 14 Feb 2023 14:48:19 -0600 Subject: [PATCH 078/298] black --- modelseedpy/core/mstemplate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 7e992d52..36a49698 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -654,7 +654,7 @@ def get_or_create_metabolite(self, model, baseid, compartment=None, index=None): ) def get_or_create_reaction(self, model, baseid, compartment=None, index=None): - logger.debug(f'{baseid}, {compartment}, {index}') + logger.debug(f"{baseid}, {compartment}, {index}") fullid = baseid if compartment: fullid += "_" + compartment From d33bd9a23e720a5799853e485491d2b7f3086ded Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 15 Feb 2023 14:07:37 -0600 Subject: [PATCH 079/298] Updates to fix gapfilling and string concatenation --- modelseedpy/core/msgapfill.py | 3 +- modelseedpy/core/msmodelutl.py | 28 +- modelseedpy/core/mstemplate.py | 4 +- modelseedpy/fbapkg/gapfillingpkg.py | 777 ++++++++++++++++------------ 4 files changed, 456 insertions(+), 356 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index c48cf94b..ad430ef2 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -10,7 +10,6 @@ from modelseedpy.core import FBAHelper # !!! the import is never used from modelseedpy.fbapkg.mspackagemanager import MSPackageManager from modelseedpy.core.msmodelutl import MSModelUtil -from modelseedpy.fbapkg.gapfillingpkg import default_blacklist from modelseedpy.core.exceptions import GapfillingError @@ -57,7 +56,7 @@ def __init__( self.gapfill_templates_by_index, self.gapfill_models_by_index = {}, {} self.gapfill_all_indecies_with_default_templates = True self.gapfill_all_indecies_with_default_models = True - self.blacklist = list(set(default_blacklist + blacklist)) + self.blacklist = list(set(blacklist)) self.test_condition_iteration_limit = 10 self.test_conditions = test_conditions self.reaction_scores = reaction_scores diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index af499773..bb147f89 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -307,27 +307,26 @@ def add_ms_reaction(self, rxn_dict, compartment_trans=["c0", "e0"]): print(len(output)) self.model.add_reactions(output) return output - + ################################################################################# # Functions related to utility functions ################################################################################# def build_model_data_hash(self): data = { - "Model":self.id, - "Genome":self.genome.info.metadata["Name"], - "Genes":self.genome.info.metadata["Number of Protein Encoding Genes"], - + "Model": self.id, + "Genome": self.genome.info.metadata["Name"], + "Genes": self.genome.info.metadata["Number of Protein Encoding Genes"], } return data - - def compare_reactions(self, reaction_list,filename): + + def compare_reactions(self, reaction_list, filename): data = {} for rxn in reaction_list: for met in rxn.metabolites: if met.id not in data: data[met.id] = {} for other_rxn in reaction_list: - data[met.id][other_rxn.id] = 0 + data[met.id][other_rxn.id] = 0 data[met.id][rxn.id] = rxn.metabolites[met] df = pd.DataFrame(data) df = df.transpose() @@ -508,6 +507,7 @@ def convert_cobra_reaction_to_kbreaction( def test_solution(self, solution, keep_changes=False): unneeded = [] + removed_rxns = [] tempmodel = self.model if not keep_changes: tempmodel = cobra.io.json.from_json(cobra.io.json.to_json(self.model)) @@ -535,6 +535,7 @@ def test_solution(self, solution, keep_changes=False): ) rxnobj.upper_bound = original_bound else: + removed_rxns.append(rxnobj) unneeded.append([rxn_id, solution[key][rxn_id], key]) logger.debug( rxn_id @@ -557,6 +558,7 @@ def test_solution(self, solution, keep_changes=False): ) rxnobj.lower_bound = original_bound else: + removed_rxns.append(rxnobj) unneeded.append([rxn_id, solution[key][rxn_id], key]) logger.debug( rxn_id @@ -565,6 +567,7 @@ def test_solution(self, solution, keep_changes=False): + str(objective) ) if keep_changes: + tempmodel.remove_reactions(removed_rxns) for items in unneeded: del solution[items[2]][items[0]] return unneeded @@ -682,6 +685,7 @@ def test_single_condition(self, condition, apply_condition=True, model=None): if model is None: model = self.model if apply_condition: + print("applying - bad") self.apply_test_condition(condition, model) new_objective = model.slim_optimize() value = new_objective @@ -882,12 +886,10 @@ def reaction_expansion_test( Raises ------ """ - logger.debug("Expansion started!") + logger.debug(f"Expansion started! Binary = {binary_search}") filtered_list = [] for condition in condition_list: - logger.debug(f"testing condition {condition}") - currmodel = self.model tic = time.perf_counter() new_filtered = [] @@ -921,6 +923,10 @@ def reaction_expansion_test( + " out of " + str(len(reaction_list)) ) + filterlist = [] + for item in new_filtered: + filterlist.append(item[0].id + item[1]) + logger.debug(",".join(filterlist)) return filtered_list def add_atp_hydrolysis(self, compartment): diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 6a6d5b6f..5d206aed 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -583,7 +583,7 @@ def from_table( for index, row in filename_or_df.iterrows(): if row["biomass_id"] == bio_id: metabolite = template.compcompounds.get_by_id( - row["id"] + "_" + row["compartment"] + f'{row["id"]}_{row["compartment"]}' ) linked_mets = {} if ( @@ -594,7 +594,7 @@ def from_table( for item in array: sub_array = item.split(":") l_met = template.compcompounds.get_by_id( - sub_array[0] + "_" + row["compartment"] + f'{sub_array[0]}_{row["compartment"]}' ) linked_mets[l_met] = float(sub_array[1]) self.add_biomass_component( diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index ebbebe72..3ea2d6dd 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -20,346 +20,425 @@ logger = logging.getLogger(__name__) -default_blacklist = [ - "rxn12985", - "rxn00238", - "rxn07058", - "rxn05305", - "rxn09037", - "rxn10643", - "rxn11317", - "rxn05254", - "rxn05257", - "rxn05258", - "rxn05259", - "rxn05264", - "rxn05268", - "rxn05269", - "rxn05270", - "rxn05271", - "rxn05272", - "rxn05273", - "rxn05274", - "rxn05275", - "rxn05276", - "rxn05277", - "rxn05278", - "rxn05279", - "rxn05280", - "rxn05281", - "rxn05282", - "rxn05283", - "rxn05284", - "rxn05285", - "rxn05286", - "rxn05963", - "rxn05964", - "rxn05971", - "rxn05989", - "rxn05990", - "rxn06041", - "rxn06042", - "rxn06043", - "rxn06044", - "rxn06045", - "rxn06046", - "rxn06079", - "rxn06080", - "rxn06081", - "rxn06086", - "rxn06087", - "rxn06088", - "rxn06089", - "rxn06090", - "rxn06091", - "rxn06092", - "rxn06138", - "rxn06139", - "rxn06140", - "rxn06141", - "rxn06145", - "rxn06217", - "rxn06218", - "rxn06219", - "rxn06220", - "rxn06221", - "rxn06222", - "rxn06223", - "rxn06235", - "rxn06362", - "rxn06368", - "rxn06378", - "rxn06474", - "rxn06475", - "rxn06502", - "rxn06562", - "rxn06569", - "rxn06604", - "rxn06702", - "rxn06706", - "rxn06715", - "rxn06803", - "rxn06811", - "rxn06812", - "rxn06850", - "rxn06901", - "rxn06971", - "rxn06999", - "rxn07123", - "rxn07172", - "rxn07254", - "rxn07255", - "rxn07269", - "rxn07451", - "rxn09037", - "rxn10018", - "rxn10077", - "rxn10096", - "rxn10097", - "rxn10098", - "rxn10099", - "rxn10101", - "rxn10102", - "rxn10103", - "rxn10104", - "rxn10105", - "rxn10106", - "rxn10107", - "rxn10109", - "rxn10111", - "rxn10403", - "rxn10410", - "rxn10416", - "rxn11313", - "rxn11316", - "rxn11318", - "rxn11353", - "rxn05224", - "rxn05795", - "rxn05796", - "rxn05797", - "rxn05798", - "rxn05799", - "rxn05801", - "rxn05802", - "rxn05803", - "rxn05804", - "rxn05805", - "rxn05806", - "rxn05808", - "rxn05812", - "rxn05815", - "rxn05832", - "rxn05836", - "rxn05851", - "rxn05857", - "rxn05869", - "rxn05870", - "rxn05884", - "rxn05888", - "rxn05896", - "rxn05898", - "rxn05900", - "rxn05903", - "rxn05904", - "rxn05905", - "rxn05911", - "rxn05921", - "rxn05925", - "rxn05936", - "rxn05947", - "rxn05956", - "rxn05959", - "rxn05960", - "rxn05980", - "rxn05991", - "rxn05992", - "rxn05999", - "rxn06001", - "rxn06014", - "rxn06017", - "rxn06021", - "rxn06026", - "rxn06027", - "rxn06034", - "rxn06048", - "rxn06052", - "rxn06053", - "rxn06054", - "rxn06057", - "rxn06059", - "rxn06061", - "rxn06102", - "rxn06103", - "rxn06127", - "rxn06128", - "rxn06129", - "rxn06130", - "rxn06131", - "rxn06132", - "rxn06137", - "rxn06146", - "rxn06161", - "rxn06167", - "rxn06172", - "rxn06174", - "rxn06175", - "rxn06187", - "rxn06189", - "rxn06203", - "rxn06204", - "rxn06246", - "rxn06261", - "rxn06265", - "rxn06266", - "rxn06286", - "rxn06291", - "rxn06294", - "rxn06310", - "rxn06320", - "rxn06327", - "rxn06334", - "rxn06337", - "rxn06339", - "rxn06342", - "rxn06343", - "rxn06350", - "rxn06352", - "rxn06358", - "rxn06361", - "rxn06369", - "rxn06380", - "rxn06395", - "rxn06415", - "rxn06419", - "rxn06420", - "rxn06421", - "rxn06423", - "rxn06450", - "rxn06457", - "rxn06463", - "rxn06464", - "rxn06466", - "rxn06471", - "rxn06482", - "rxn06483", - "rxn06486", - "rxn06492", - "rxn06497", - "rxn06498", - "rxn06501", - "rxn06505", - "rxn06506", - "rxn06521", - "rxn06534", - "rxn06580", - "rxn06585", - "rxn06593", - "rxn06609", - "rxn06613", - "rxn06654", - "rxn06667", - "rxn06676", - "rxn06693", - "rxn06730", - "rxn06746", - "rxn06762", - "rxn06779", - "rxn06790", - "rxn06791", - "rxn06792", - "rxn06793", - "rxn06794", - "rxn06795", - "rxn06796", - "rxn06797", - "rxn06821", - "rxn06826", - "rxn06827", - "rxn06829", - "rxn06839", - "rxn06841", - "rxn06842", - "rxn06851", - "rxn06866", - "rxn06867", - "rxn06873", - "rxn06885", - "rxn06891", - "rxn06892", - "rxn06896", - "rxn06938", - "rxn06939", - "rxn06944", - "rxn06951", - "rxn06952", - "rxn06955", - "rxn06957", - "rxn06960", - "rxn06964", - "rxn06965", - "rxn07086", - "rxn07097", - "rxn07103", - "rxn07104", - "rxn07105", - "rxn07106", - "rxn07107", - "rxn07109", - "rxn07119", - "rxn07179", - "rxn07186", - "rxn07187", - "rxn07188", - "rxn07195", - "rxn07196", - "rxn07197", - "rxn07198", - "rxn07201", - "rxn07205", - "rxn07206", - "rxn07210", - "rxn07244", - "rxn07245", - "rxn07253", - "rxn07275", - "rxn07299", - "rxn07302", - "rxn07651", - "rxn07723", - "rxn07736", - "rxn07878", - "rxn11417", - "rxn11582", - "rxn11593", - "rxn11597", - "rxn11615", - "rxn11617", - "rxn11619", - "rxn11620", - "rxn11624", - "rxn11626", - "rxn11638", - "rxn11648", - "rxn11651", - "rxn11665", - "rxn11666", - "rxn11667", - "rxn11698", - "rxn11983", - "rxn11986", - "rxn11994", - "rxn12006", - "rxn12007", - "rxn12014", - "rxn12017", - "rxn12022", - "rxn12160", - "rxn12161", - "rxn01267", - "rxn05294", - "rxn04656", -] +base_blacklist = { + "rxn10157": "<", + "rxn09295": "<", + "rxn05938": "<", + "rxn08628": ">", + "rxn10155": "<", + "rxn01353": "<", + "rxn05683": "<", + "rxn09193": "<", + "rxn09003": "<", + "rxn01128": ">", + "rxn08655": "<", + "rxn09272": "<", + "rxn05313": "<", + "rxn01510": ">", + "rxn05297": ">", + "rxn00507": "<", + "rxn05596": "<", + "rxn01674": "<", + "rxn01679": "<", + "rxn00778": ">", + "rxn05206": ">", + "rxn00239": "<", + "rxn05937": "<", + "rxn00715": "<", + "rxn05638": ">", + "rxn05289": ">", + "rxn00839": "<", + "rxn08866": "<", + "rxn10901": "<", + "rxn09331": "<", + "rxn05242": "<", + "rxn12549": "<", + "rxn13143": "<", + "rxn12498": "<", + "rxn08373": "<", + "rxn05208": "<", + "rxn09372": "<", + "rxn00571": ">", + "rxn08104": "<", + "rxn08704": "<", + "rxn07191": "<", + "rxn09672": "<", + "rxn01048": ">", + "rxn11267": ">", + "rxn08290": "<", + "rxn09307": "<", + "rxn05676": ">", + "rxn09653": "<", + "rxn11277": "<", + "rxn00976": "<", + "rxn02520": "<", + "rxn08275": "<", + "rxn09121": "<", + "rxn08999": "<", + "rxn08633": "<", + "rxn08610": "<", + "rxn09218": "<", + "rxn05626": "<", + "rxn11320": "<", + "rxn10058": ">", + "rxn08544": "<", + "rxn12539": "<", + "rxn08990": "<", + "rxn09348": "<", + "rxn00378": "<", + "rxn05243": "<", + "rxn02154": "<", + "rxn12587": "<", + "rxn00125": "<", + "rxn05648": "<", + "rxn13722": "<", + "rxn10910": ">", + "rxn05308": ">", + "rxn08585": "<", + "rxn14207": "<", + "rxn08682": "<", + "rxn10895": "<", + "rxn09655": "<", + "rxn11934": "<", + "rxn01742": ">", + "rxn05222": ">", + "rxn09942": "<", + "rxn13753": ">", + "rxn10857": "<", + "rxn03468": "<", + "rxn04942": "<", + "rxn10990": ">", + "rxn08639": "<", + "rxn09248": "<", + "rxn11935": ">", + "rxn00870": ">", + "rxn08314": "<", + "rxn09378": "<", + "rxn09269": "<", + "rxn10057": ">", + "rxn13702": ">", + "rxn00517": "<", + "rxn09221": ">", + "rxn01505": ">", + "rxn13692": ">", + "rxn05573": "<", + "rxn10123": ">", + "rxn09005": "<", + "rxn05244": "<", + "rxn05940": "<", + "rxn10124": ">", + "rxn06202": ">", + "rxn09660": "<", + "rxn02260": ">", + "rxn08912": "<", + "rxn05760": ">", + "rxn05580": ">", + "rxn02181": ">", + "rxn09339": "<", + "rxn00767": "<", + "rxn09118": "<", + "rxn05303": "<", + "rxn06110": "<", + "rxn12800": "<", + "rxn10966": "<", + "rxn12561": "<", + "rxn04678": ">", + "rxn10818": "<", + "rxn08166": "<", + "rxn02044": ">", + "rxn12623": "<", + "rxn13392": ">", + "rxn02283": "<", + "rxn13647": ">", + "rxn08653": "<", + "rxn05218": ">", + "rxn11676": ">", + "rxn00197": "<", + "rxn00697": "<", + "rxn12575": ">", + "rxn08188": "<", + "rxn01215": "<", + "rxn08730": ">", + "rxn08519": ">", + "rxn08642": "<", + "rxn05245": "<", + "rxn04042": "<", + "rxn01443": ">", + "rxn08535": "<", + "rxn03983": "<", + "rxn08317": "<", + "rxn14173": ">", + "rxn08868": "<", + "rxn05893": ">", + "rxn00435": ">", + "rxn13724": "<", + "rxn09681": "<", + "rxn00572": ">", + "rxn05942": "<", + "rxn11158": "<", + "rxn05562": "<", + "rxn10868": "<", + "rxn10426": "<", + "rxn00941": ">", + "rxn08240": "<", + "rxn05220": ">", + "rxn01228": ">", + "rxn12540": "<", + "rxn10618": ">", + "rxn09659": "<", + "rxn08985": ">", + "rxn05523": "<", + "rxn00421": "<", + "rxn09385": "<", + "rxn08542": "<", + "rxn09658": "<", + "rxn01173": "<", + "rxn10977": "<", + "rxn05216": "<", + "rxn13748": ">", + "rxn10769": ">", + "rxn00451": "<", + "rxn01639": "<", + "rxn08661": "<", + "rxn09308": "<", + "rxn09260": "<", + "rxn00253": "<", + "rxn05207": "<", + "rxn01667": "<", + "rxn08063": "<", + "rxn01508": ">", + "rxn09657": "<", + "rxn01209": ">", + "rxn00548": ">", + "rxn12617": "<", + "rxn08747": ">", + "rxn08096": "<", + "rxn11951": "<", + "rxn09061": "<", + "rxn10978": "<", + "rxn02748": ">", + "rxn09663": "<", + "rxn08737": "<", + "rxn13127": "<", + "rxn09366": "<", + "rxn05634": "<", + "rxn05554": "<", + "rxn09266": ">", + "rxn04676": ">", + "rxn11078": ">", + "rxn04932": "<", + "rxn00607": ">", + "rxn08856": "<", + "rxn12624": "<", + "rxn05215": "<", + "rxn13686": "<", + "rxn12529": "<", + "rxn00234": "<", + "rxn13689": ">", + "rxn08117": "<", + "rxn05315": ">", + "rxn08865": "<", + "rxn11678": ">", + "rxn00518": "<", + "rxn00195": "<", + "rxn10054": "<", + "rxn12532": "<", + "rxn05902": ">", + "rxn12777": "<", + "rxn12822": ">", + "rxn13735": ">", + "rxn00427": "<", + "rxn13196": "<", + "rxn08284": "<", + "rxn10576": ">", + "rxn00891": "<", + "rxn08293": "<", + "rxn00374": ">", + "rxn08795": "<", + "rxn12583": "<", + "rxn00918": ">", + "rxn08525": "<", + "rxn10427": ">", + "rxn09271": "<", + "rxn10860": "<", + "rxn10600": ">", + "rxn13729": ">", + "rxn01375": "<", + "rxn13726": ">", + "rxn10587": "<", + "rxn08672": "<", + "rxn10588": ">", + "rxn08152": ">", + "rxn09306": "<", + "rxn00635": "<", + "rxn08427": "<", + "rxn05225": ">", + "rxn00680": ">", + "rxn08786": ">", + "rxn08721": "<", + "rxn11339": "<", + "rxn05749": "<", + "rxn01187": ">", + "rxn08625": "<", + "rxn06677": "<", + "rxn12302": ">", + "rxn02770": "<", + "rxn05628": "<", + "rxn13706": ">", + "rxn12739": "<", + "rxn00177": "<", + "rxn09896": ">", + "rxn12574": "<", + "rxn12533": ">", + "rxn08537": ">", + "rxn05651": ">", + "rxn08170": "<", + "rxn05240": "<", + "rxn00663": ">", + "rxn12589": "<", + "rxn09299": "<", + "rxn02059": "<", + "rxn12217": ">", + "rxn06592": "<", + "rxn05939": ">", + "rxn08581": "<", + "rxn00430": "<", + "rxn09283": ">", + "rxn08919": "<", + "rxn13660": "<", + "rxn08065": "<", + "rxn08428": ">", + "rxn10936": ">", + "rxn05238": ">", + "rxn05685": "<", + "rxn08920": ">", + "rxn07193": "<", + "rxn08265": "<", + "rxn12554": "<", + "rxn08094": "<", + "rxn13727": ">", + "rxn04158": "<", + "rxn09839": "<", + "rxn10820": "<", + "rxn00869": ">", + "rxn00331": ">", + "rxn09034": "<", + "rxn01136": "<", + "rxn09247": "<", + "rxn08302": "<", + "rxn10594": "<", + "rxn08670": ">", + "rxn11334": "<", + "rxn09941": "<", + "rxn02919": "<", + "rxn09670": "<", + "rxn10892": "<", + "rxn09794": "<", + "rxn02332": ">", + "rxn00244": ">", + "rxn08030": "<", + "rxn12526": "<", + "rxn13150": ">", + "rxn05486": "<", + "rxn10852": ">", + "rxn13790": ">", + "rxn06348": ">", + "rxn09172": ">", + "rxn03653": ">", + "rxn05213": "<", + "rxn01869": "<", + "rxn08142": "<", + "rxn12606": "<", + "rxn11916": ">", + "rxn05748": "<", + "rxn08543": "<", + "rxn01107": ">", + "rxn05708": "<", + "rxn08169": "<", + "rxn06641": ">", + "rxn12578": "<", + "rxn01172": "<", + "rxn02120": ">", + "rxn05669": "<", + "rxn11322": "<", + "rxn12630": "<", + "rxn00698": "<", + "rxn05507": ">", + "rxn12530": "<", + "rxn09304": "<", + "rxn05532": ">", + "rxn03644": ">", + "rxn08733": "<", + "rxn13733": "<", + "rxn10044": ">", + "rxn00176": ">", + "rxn01364": ">", + "rxn02198": ">", + "rxn06990": "<", + "rxn08424": "<", + "rxn08069": "<", + "rxn05611": "<", + "rxn11973": "<", + "rxn12665": ">", + "rxn05241": "<", + "rxn08982": ">", + "rxn00542": ">", + "rxn12588": "<", + "rxn03517": ">", + "rxn01805": "<", + "rxn13203": ">", + "rxn08614": "<", + "rxn12200": ">", + "rxn13811": "<", + "rxn08377": "<", + "rxn11342": ">", + "rxn02976": "<", + "rxn08217": "<", + "rxn07921": ">", + "rxn09944": ">", + "rxn02401": "<", + "rxn08429": ">", + "rxn00905": "<", + "rxn08196": "<", + "rxn03054": "<", + "rxn08643": "<", + "rxn01874": "<", + "rxn08028": "<", + "rxn01641": ">", + "rxn03442": "<", + "rxn02172": "<", + "rxn10692": ">", + "rxn10613": ">", + "rxn12928": ">", + "rxn12994": ">", + "rxn13843": ">", + "rxn12942": ">", + "rxn12934": ">", + "rxn16827": ">", + "rxn12941": ">", + "rxn01736": ">", + "rxn14109": ">", + "rxn15060": ">", + "rxn15064": ">", + "rxn30685": ">", + "rxn10095": ">", + "rxn16143": ">", + "rxn25271": ">", + "rxn25160": ">", + "rxn30917": ">", + "rxn16843": ">", + "rxn08921": ">", + "rxn09390": ">", + "rxn27362": ">", + "rxn02664": ">", + "rxn24638": ">", + "rxn24613": ">", + "rxn24611": ">", + "rxn14428": ">", + "rxn03079": ">", + "rxn03020": ">", + "rxn10471": "<", +} class GapfillingPkg(BaseFBAPkg): @@ -416,7 +495,7 @@ def build_package(self, parameters): "minimum_obj": 0.01, "set_objective": 1, "minimize_exchanges": False, - "blacklist": default_blacklist, + "blacklist": [], }, ) # Adding model reactions to original reaction list @@ -558,6 +637,11 @@ def extend_model_with_model_for_gapfilling(self, source_model, index): if re.search("(.+)_([a-z])\d+$", modelreaction.id) != None: m = re.search("(.+)_([a-z])\d+$", modelreaction.id) if m[1] not in self.parameters["blacklist"]: + if m[1] in base_blacklist: + if base_blacklist[m[1]] == ">" or base_blacklist[m[1]] == "=": + cobra_reaction.upper_bound = 0 + if base_blacklist[m[1]] == "<" or base_blacklist[m[1]] == "=": + cobra_reaction.lower_bound = 0 cobra_reaction = modelreaction.copy() cobra_reaction.id = groups[1] + "_" + groups[2] + index if ( @@ -687,6 +771,17 @@ def extend_model_with_template_for_gapfilling(self, template, index): cobra_reaction = self.convert_template_reaction( template_reaction, index, template, 1 ) # TODO: move function out + if template_reaction.reference_id in base_blacklist: + if ( + base_blacklist[template_reaction.reference_id] == ">" + or base_blacklist[template_reaction.reference_id] == "=" + ): + cobra_reaction.upper_bound = 0 + if ( + base_blacklist[template_reaction.reference_id] == "<" + or base_blacklist[template_reaction.reference_id] == "=" + ): + cobra_reaction.lower_bound = 0 new_penalties[cobra_reaction.id] = dict() if ( cobra_reaction.id not in self.model.reactions From 906bb3e3a008b81cafbc39597fbf71b21e8d40e6 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Mon, 20 Feb 2023 00:24:38 -0600 Subject: [PATCH 080/298] genome feature aliases --- modelseedpy/core/msbuilder.py | 4 +++- modelseedpy/core/msgenome.py | 4 ++-- modelseedpy/core/msmodelutl.py | 15 +++++++-------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index e53a28ac..54fb06c6 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -872,7 +872,9 @@ def build( biomass_reactions.append(reaction) if len(biomass_reactions) > 0: - cobra_model.add_reactions(biomass_reactions) + for rxn in biomass_reactions: + if rxn.id not in cobra_model.reactions: + cobra_model.add_reactions([rxn]) cobra_model.objective = biomass_reactions[0].id """ diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index 999e464d..875699c2 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -48,7 +48,7 @@ def parse_fasta_str(faa_str, split=DEFAULT_SPLIT, h_func=None): class MSFeature: - def __init__(self, feature_id, sequence, description=None): + def __init__(self, feature_id, sequence, description=None, aliases=None): """ @param feature_id: identifier for the protein coding feature @@ -60,7 +60,7 @@ def __init__(self, feature_id, sequence, description=None): self.seq = sequence self.description = description # temporary replace with proper parsing self.ontology_terms = {} - self.aliases = [] + self.aliases = aliases def add_ontology_term(self, ontology_term, value): """ diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index af499773..7017552b 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -307,27 +307,26 @@ def add_ms_reaction(self, rxn_dict, compartment_trans=["c0", "e0"]): print(len(output)) self.model.add_reactions(output) return output - + ################################################################################# # Functions related to utility functions ################################################################################# def build_model_data_hash(self): data = { - "Model":self.id, - "Genome":self.genome.info.metadata["Name"], - "Genes":self.genome.info.metadata["Number of Protein Encoding Genes"], - + "Model": self.id, + "Genome": self.genome.info.metadata["Name"], + "Genes": self.genome.info.metadata["Number of Protein Encoding Genes"], } return data - - def compare_reactions(self, reaction_list,filename): + + def compare_reactions(self, reaction_list, filename): data = {} for rxn in reaction_list: for met in rxn.metabolites: if met.id not in data: data[met.id] = {} for other_rxn in reaction_list: - data[met.id][other_rxn.id] = 0 + data[met.id][other_rxn.id] = 0 data[met.id][rxn.id] = rxn.metabolites[met] df = pd.DataFrame(data) df = df.transpose() From 26d7b622bf0d2a4464f7f631c87e5f1001abb575 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Mon, 20 Feb 2023 21:13:39 -0600 Subject: [PATCH 081/298] template.add_reaction update comcompound references --- modelseedpy/core/mstemplate.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index f439dc91..7bf9cbea 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -1302,7 +1302,9 @@ def add_reactions(self, reaction_list: list): if cpx.id not in self.complexes: self.add_complexes([cpx]) complex_replace.add(self.complexes.get_by_id(cpx.id)) + x._metabolites = metabolites_replace + x._update_awareness() x.complexes = complex_replace self.reactions += reaction_list From 34b4d812b0d1fcaf562a99db76f91f784f9db119 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 1 Mar 2023 00:01:53 -0600 Subject: [PATCH 082/298] Improving gapfilling and ATP correction --- modelseedpy/__init__.py | 2 + modelseedpy/biochem/modelseed_biochem.py | 2 +- modelseedpy/core/msatpcorrection.py | 46 ++++- modelseedpy/core/msbuilder.py | 8 +- modelseedpy/core/msgapfill.py | 137 ++++++-------- modelseedpy/core/msmodelutl.py | 169 ++++++++++++++++- modelseedpy/core/mstemplate.py | 14 +- modelseedpy/fbapkg/flexiblebiomasspkg.py | 229 ++++++++++++++++------- modelseedpy/fbapkg/gapfillingpkg.py | 99 +++++----- 9 files changed, 494 insertions(+), 212 deletions(-) diff --git a/modelseedpy/__init__.py b/modelseedpy/__init__.py index 7f135055..aabb2c53 100644 --- a/modelseedpy/__init__.py +++ b/modelseedpy/__init__.py @@ -59,6 +59,8 @@ from modelseedpy.community import MSCommunity, MSCompatibility, CommKineticPkg +from modelseedpy.biochem import ModelSEEDBiochem + from modelseedpy.fbapkg import ( BaseFBAPkg, RevBinPkg, diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index 80594e0e..287ce470 100644 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -495,7 +495,7 @@ class ModelSEEDBiochem: @staticmethod def get(create_if_missing=True): if not ModelSEEDBiochem.default_biochemistry: - ModelSEEDBiochem.default_biochemistry = from_local( + ModelSEEDBiochem.default_biochemistry = from_local2( config.get("biochem", "path") ) return ModelSEEDBiochem.default_biochemistry diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index c5b20e3c..e72835aa 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -22,6 +22,7 @@ from modelseedpy.helpers import get_template logger = logging.getLogger(__name__) +# logger.setLevel(logging.DEBUG) _path = _dirname(_abspath(__file__)) @@ -291,7 +292,10 @@ def evaluate_growth_media(self): or solution.status != "optimal" ): self.media_gapfill_stats[media] = self.msgapfill.run_gapfilling( - media, self.atp_hydrolysis.id, minimum_obj + media, + self.atp_hydrolysis.id, + minimum_obj, + check_for_growth=False, ) # IF gapfilling fails - need to activate and penalize the noncore and try again elif solution.objective_value >= minimum_obj: @@ -312,16 +316,29 @@ def determine_growth_media(self, max_gapfilling=None): Decides which of the test media to use as growth conditions for this model :return: """ + atp_att = {"tests": {}, "selected_media": {}, "core_atp_gapfilling": {}} self.selected_media = [] best_score = None for media in self.media_gapfill_stats: gfscore = 0 + atp_att["core_atp_gapfilling"][media.id] = { + "score": 0, + "new": {}, + "reversed": {}, + } if self.media_gapfill_stats[media]: gfscore = len( self.media_gapfill_stats[media]["new"].keys() ) + 0.5 * len(self.media_gapfill_stats[media]["reversed"].keys()) + atp_att["core_atp_gapfilling"][media.id][ + "new" + ] = self.media_gapfill_stats[media]["new"] + atp_att["core_atp_gapfilling"][media.id][ + "reversed" + ] = self.media_gapfill_stats[media]["reversed"] if best_score is None or gfscore < best_score: best_score = gfscore + atp_att["core_atp_gapfilling"][media.id]["score"] = gfscore if self.max_gapfilling is None: self.max_gapfilling = best_score @@ -339,6 +356,9 @@ def determine_growth_media(self, max_gapfilling=None): best_score + self.gapfilling_delta ): self.selected_media.append(media) + atp_att["selected_media"][media.id] = 0 + + self.modelutl.save_attributes(atp_att, "ATP_analysis") def determine_growth_media2(self, max_gapfilling=None): """ @@ -385,8 +405,15 @@ def apply_growth_media_gapfilling(self): and MSGapfill.gapfill_count(self.media_gapfill_stats[media]) > 0 ): self.msgapfill.integrate_gapfill_solution( - self.media_gapfill_stats[media], self.cumulative_core_gapfilling + self.media_gapfill_stats[media], + self.cumulative_core_gapfilling, + link_gaps_to_objective=False, ) + core_gf = { + "count": len(self.cumulative_core_gapfilling), + "reactions": self.cumulative_core_gapfilling, + } + self.modelutl.save_attributes(core_gf, "core_gapfilling") def expand_model_to_genome_scale(self): """Restores noncore reactions to model while filtering out reactions that break ATP @@ -460,6 +487,11 @@ def build_tests(self, multiplier=None): Raises ------ """ + atp_att = self.modelutl.get_attributes( + "ATP_analysis", + {"tests": {}, "selected_media": {}, "core_atp_gapfilling": {}}, + ) + if multiplier is None: multiplier = self.multiplier tests = [] @@ -467,7 +499,7 @@ def build_tests(self, multiplier=None): for media in self.selected_media: self.modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package(media) obj_value = self.model.slim_optimize() - logger.debug(f"{media.name} = {obj_value}") + logger.debug(f"{media.name} = {obj_value};{multiplier}") tests.append( { "media": media, @@ -476,6 +508,14 @@ def build_tests(self, multiplier=None): "objective": self.atp_hydrolysis.id, } ) + atp_att["selected_media"][media.id] = obj_value + atp_att["tests"][media.id] = { + "threshold": multiplier * obj_value, + "objective": self.atp_hydrolysis.id, + } + + self.modelutl.save_attributes(atp_att, "ATP_analysis") + return tests def run_atp_correction(self): diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index e53a28ac..4ea0cd3e 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -849,16 +849,22 @@ def build( complex_groups = self.build_complex_groups( self.reaction_to_complex_sets.values() ) - + if "bio1" in cobra_model.reactions: + print("1:Biomass present!!") metabolic_reactions = self.build_metabolic_reactions() cobra_model.add_reactions(metabolic_reactions) + if "bio1" in cobra_model.reactions: + print("2:Biomass present!!") non_metabolic_reactions = self.build_non_metabolite_reactions( cobra_model, allow_all_non_grp_reactions ) cobra_model.add_reactions(non_metabolic_reactions) + if "bio1" in cobra_model.reactions: + print("3:Biomass present!!") cobra_model.add_groups(list(complex_groups.values())) self.add_exchanges_to_model(cobra_model) + print("Adding biomass!!") biomass_reactions = [] for rxn_biomass in self.template.biomasses: reaction = rxn_biomass.build_biomass( diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index ad430ef2..8d023272 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -69,6 +69,7 @@ def run_gapfilling( minimum_obj=0.01, binary_check=False, prefilter=True, + check_for_growth=True, ): if target: self.model.objective = self.model.problem.Objective( @@ -96,15 +97,54 @@ def run_gapfilling( ) pkgmgr.getpkg("KBaseMediaPkg").build_package(media) + # Testing if gapfilling can work before filtering + if ( + check_for_growth + and not pkgmgr.getpkg("GapfillingPkg").test_gapfill_database() + ): + # save_json_model(self.model, "gfdebugmdl.json") + gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) + if media.id not in gf_sensitivity: + gf_sensitivity[media.id] = {} + if target not in gf_sensitivity[media.id]: + gf_sensitivity[media.id][target] = {} + gf_sensitivity[media.id][target][ + "FBF" + ] = self.mdlutl.find_unproducible_biomass_compounds(target) + self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") + logger.warning("No solution found before filtering for %s", media) + return None + # Filtering breaking reactions out of the database if prefilter and self.test_conditions: pkgmgr.getpkg("GapfillingPkg").filter_database_based_on_tests( self.test_conditions ) + # Testing if gapfilling can work after filtering + if ( + check_for_growth + and not pkgmgr.getpkg("GapfillingPkg").test_gapfill_database() + ): + # save_json_model(self.model, "gfdebugmdl.json") + gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) + if media.id not in gf_sensitivity: + gf_sensitivity[media.id] = {} + if target not in gf_sensitivity[media.id]: + gf_sensitivity[media.id][target] = {} + gf_sensitivity[media.id][target][ + "FAF" + ] = self.mdlutl.find_unproducible_biomass_compounds(target) + self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") + logger.warning("No solution found after filtering for %s", media) + return None + + # Printing the gapfilling LP file if self.lp_filename: with open(self.lp_filename, "w") as out: out.write(str(self.gfmodel.solver)) + + # Running gapfilling and checking solution sol = self.gfmodel.optimize() logger.debug( "gapfill solution objective value %f (%s) for media %s", @@ -112,11 +152,11 @@ def run_gapfilling( sol.status, media, ) - if sol.status != "optimal": logger.warning("No solution found for %s", media) return None + # Computing solution and ensuring all tests still pass self.last_solution = pkgmgr.getpkg("GapfillingPkg").compute_gapfilled_solution() if self.test_conditions: self.last_solution = pkgmgr.getpkg("GapfillingPkg").run_test_conditions( @@ -129,18 +169,23 @@ def run_gapfilling( "no solution could be found that satisfied all specified test conditions in specified iterations!" ) return None + + # Running binary check to reduce solution to minimal reaction soltuion if binary_check: self.last_solution = pkgmgr.getpkg( "GapfillingPkg" ).binary_check_gapfilling_solution() + # Setting last solution data self.last_solution["media"] = media self.last_solution["target"] = target self.last_solution["minobjective"] = minimum_obj self.last_solution["binary_check"] = binary_check return self.last_solution - def integrate_gapfill_solution(self, solution, cumulative_solution=[]): + def integrate_gapfill_solution( + self, solution, cumulative_solution=[], link_gaps_to_objective=True + ): """Integrating gapfilling solution into model Parameters ---------- @@ -191,84 +236,20 @@ def integrate_gapfill_solution(self, solution, cumulative_solution=[]): cumulative_solution.remove(oitem) break self.mdlutl.add_gapfilling(solution) + if link_gaps_to_objective: + gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) + if solution["media"] not in gf_sensitivity: + gf_sensitivity[solution["media"]] = {} + if solution["target"] not in gf_sensitivity[solution["media"]]: + gf_sensitivity[solution["media"]][solution["target"]] = {} + gf_sensitivity[solution["media"]][solution["target"]][ + "success" + ] = self.mdlutl.find_unproducible_biomass_compounds( + solution["target"], cumulative_solution + ) + self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") self.cumulative_gapfilling.extend(cumulative_solution) - def link_gapfilling_to_biomass(self, target="bio1"): - def find_dependency( - item, target_rxn, tempmodel, original_objective, min_flex_obj - ): - objective = tempmodel.slim_optimize() - logger.debug("Obj:" + str(objective)) - with open("FlexBiomass2.lp", "w") as out: - out.write(str(tempmodel.solver)) - if objective > 0: - target_rxn.lower_bound = 0.1 - tempmodel.objective = min_flex_obj - solution = tempmodel.optimize() - with open("FlexBiomass3.lp", "w") as out: - out.write(str(tempmodel.solver)) - biocpds = [] - for reaction in tempmodel.reactions: - if ( - reaction.id[0:5] == "FLEX_" - and reaction.forward_variable.primal > Zero - ): - biocpds.append(reaction.id[5:]) - item.append(biocpds) - logger.debug(item[0] + ":" + ",".join(biocpds)) - tempmodel.objective = original_objective - target_rxn.lower_bound = 0 - - # Copying model before manipulating it - tempmodel = cobra.io.json.from_json(cobra.io.json.to_json(self.mdlutl.model)) - # Getting target reaction and making sure it exists - target_rxn = tempmodel.reactions.get_by_id(target) - # Constraining objective to be greater than 0.1 - pkgmgr = MSPackageManager.get_pkg_mgr(tempmodel) - # Adding biomass flexibility - pkgmgr.getpkg("FlexibleBiomassPkg").build_package( - { - "bio_rxn_id": target, - "flex_coefficient": [0, 1], - "use_rna_class": None, - "use_dna_class": None, - "use_protein_class": None, - "use_energy_class": [0, 1], - "add_total_biomass_constraint": False, - } - ) - # Creating min flex objective - tempmodel.objective = target_rxn - original_objective = tempmodel.objective - min_flex_obj = tempmodel.problem.Objective(Zero, direction="min") - obj_coef = dict() - for reaction in tempmodel.reactions: - if reaction.id[0:5] == "FLEX_" or reaction.id[0:6] == "energy": - obj_coef[reaction.forward_variable] = 1 - # Temporarily setting flex objective so I can set coefficients - tempmodel.objective = min_flex_obj - min_flex_obj.set_linear_coefficients(obj_coef) - # Restoring biomass object - tempmodel.objective = original_objective - # Knocking out gapfilled reactions one at a time - for item in self.cumulative_gapfilling: - logger.debug("KO:" + item[0] + item[1]) - rxnobj = tempmodel.reactions.get_by_id(item[0]) - if item[1] == ">": - original_bound = rxnobj.upper_bound - rxnobj.upper_bound = 0 - find_dependency( - item, target_rxn, tempmodel, original_objective, min_flex_obj - ) - rxnobj.upper_bound = original_bound - else: - original_bound = rxnobj.lower_bound - rxnobj.lower_bound = 0 - find_dependency( - item, target_rxn, tempmodel, original_objective, min_flex_obj - ) - rxnobj.lower_bound = original_bound - @staticmethod def gapfill( model, diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index bb147f89..a44c5653 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -5,10 +5,15 @@ import json import sys import pandas as pd +import cobra from cobra import Model, Reaction, Metabolite +from optlang.symbolics import Zero from modelseedpy.fbapkg.mspackagemanager import MSPackageManager from modelseedpy.biochem.modelseed_biochem import ModelSEEDBiochem from modelseedpy.core.fbahelper import FBAHelper +from multiprocessing import Value + +# from builtins import None logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) @@ -105,6 +110,9 @@ def __init__(self, model): self.reaction_scores = None self.score = None self.integrated_gapfillings = [] + self.attributes = {} + if hasattr(self.model, "attributes"): + self.attributes = self.model def compute_automated_reaction_scores(self): """ @@ -270,6 +278,22 @@ def reaction_scores(self): ################################################################################# # Functions related to editing the model ################################################################################# + def get_attributes(self, key=None, default=None): + if not key: + return self.attributes + if key not in self.attributes: + self.attributes[key] = default + return self.attributes[key] + + def save_attributes(self, value, key=None): + attributes = self.get_attributes() + if key: + attributes[key] = value + else: + self.attributes = value + if hasattr(self.model, "attributes"): + self.model.attributes = self.attributes + def add_ms_reaction(self, rxn_dict, compartment_trans=["c0", "e0"]): modelseed = ModelSEEDBiochem.get() output = [] @@ -923,12 +947,151 @@ def reaction_expansion_test( + " out of " + str(len(reaction_list)) ) - filterlist = [] + # Adding filter results to attributes + gf_filter_att = self.get_attributes("gf_filter", {}) + if condition["media"].id not in gf_filter_att: + gf_filter_att[condition["media"].id] = {} + if condition["objective"] not in gf_filter_att[condition["media"].id]: + gf_filter_att[condition["media"].id][condition["objective"]] = {} + if ( + condition["threshold"] + not in gf_filter_att[condition["media"].id][condition["objective"]] + ): + gf_filter_att[condition["media"].id][condition["objective"]][ + condition["threshold"] + ] = {} for item in new_filtered: - filterlist.append(item[0].id + item[1]) - logger.debug(",".join(filterlist)) + if ( + item[0].id + not in gf_filter_att[condition["media"].id][condition["objective"]][ + condition["threshold"] + ] + ): + gf_filter_att[condition["media"].id][condition["objective"]][ + condition["threshold"] + ][item[0].id] = {} + if ( + item[1] + not in gf_filter_att[condition["media"].id][condition["objective"]][ + condition["threshold"] + ][item[0].id] + ): + if len(item) < 3: + gf_filter_att[condition["media"].id][condition["objective"]][ + condition["threshold"] + ][item[0].id][item[1]] = None + else: + gf_filter_att[condition["media"].id][condition["objective"]][ + condition["threshold"] + ][item[0].id][item[1]] = item[2] + gf_filter_att = self.save_attributes(gf_filter_att, "gf_filter") return filtered_list + ################################################################################# + # Functions related to biomass sensitivity analysis + ################################################################################# + def find_unproducible_biomass_compounds(self, target_rxn="bio1", ko_list=None): + # Cloning the model because we don't want to modify the original model with this analysis + tempmodel = cobra.io.json.from_json(cobra.io.json.to_json(self.model)) + # Getting target reaction and making sure it exists + if target_rxn not in tempmodel.reactions: + logger.critical(target_rxn + " not in model!") + target_rxn_obj = tempmodel.reactions.get_by_id(target_rxn) + tempmodel.objective = target_rxn + original_objective = tempmodel.objective + pkgmgr = MSPackageManager.get_pkg_mgr(tempmodel) + rxn_list = [target_rxn, "rxn05294_c0", "rxn05295_c0", "rxn05296_c0"] + for rxn in rxn_list: + if rxn in tempmodel.reactions: + pkgmgr.getpkg("FlexibleBiomassPkg").build_package( + { + "bio_rxn_id": rxn, + "flex_coefficient": [0, 1], + "use_rna_class": None, + "use_dna_class": None, + "use_protein_class": None, + "use_energy_class": [0, 1], + "add_total_biomass_constraint": False, + } + ) + + # Creating min flex objective + min_flex_obj = tempmodel.problem.Objective(Zero, direction="min") + obj_coef = dict() + for reaction in tempmodel.reactions: + if reaction.id[0:5] == "FLEX_" or reaction.id[0:6] == "energy": + obj_coef[reaction.forward_variable] = 1 + obj_coef[reaction.reverse_variable] = 1 + # Temporarily setting flex objective so I can set coefficients + tempmodel.objective = min_flex_obj + min_flex_obj.set_linear_coefficients(obj_coef) + if not ko_list: + return self.run_biomass_dependency_test( + target_rxn_obj, tempmodel, original_objective, min_flex_obj, rxn_list + ) + else: + output = {} + for item in ko_list: + logger.debug("KO:" + item[0] + item[1]) + rxnobj = tempmodel.reactions.get_by_id(item[0]) + if item[1] == ">": + original_bound = rxnobj.upper_bound + rxnobj.upper_bound = 0 + if item[0] not in output: + output[item[0]] = {} + output[item[0]][item[1]] = self.run_biomass_dependency_test( + target_rxn_obj, + tempmodel, + original_objective, + min_flex_obj, + rxn_list, + ) + rxnobj.upper_bound = original_bound + else: + original_bound = rxnobj.lower_bound + rxnobj.lower_bound = 0 + if item[0] not in output: + output[item[0]] = {} + output[item[0]][item[1]] = self.run_biomass_dependency_test( + target_rxn_obj, + tempmodel, + original_objective, + min_flex_obj, + rxn_list, + ) + rxnobj.lower_bound = original_bound + return output + + def run_biomass_dependency_test( + self, target_rxn, tempmodel, original_objective, min_flex_obj, rxn_list + ): + tempmodel.objective = original_objective + objective = tempmodel.slim_optimize() + with open("FlexBiomass2.lp", "w") as out: + out.write(str(tempmodel.solver)) + if objective > 0: + target_rxn.lower_bound = 0.1 + tempmodel.objective = min_flex_obj + solution = tempmodel.optimize() + with open("FlexBiomass3.lp", "w") as out: + out.write(str(tempmodel.solver)) + biocpds = [] + for reaction in tempmodel.reactions: + if reaction.id[0:5] == "FLEX_" and ( + reaction.forward_variable.primal > Zero + or reaction.reverse_variable.primal > Zero + ): + logger.debug("Depends on:" + reaction.id) + label = reaction.id[5:] + for item in rxn_list: + if label[0 : len(item)] == item: + biocpds.append(label[len(item) + 1 :]) + target_rxn.lower_bound = 0 + return biocpds + else: + logger.debug("Cannot grow") + return None + def add_atp_hydrolysis(self, compartment): # Searching for ATP hydrolysis compounds coefs = { diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 5d206aed..72118f07 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -581,9 +581,13 @@ def from_table( if isinstance(filename_or_df, str): filename_or_df = pd.read_table(filename_or_df) for index, row in filename_or_df.iterrows(): + if "biomass_id" not in row: + row["biomass_id"] = "bio1" if row["biomass_id"] == bio_id: + if "compartment" not in row: + row["compartment"] = "c" metabolite = template.compcompounds.get_by_id( - f'{row["id"]}_{row["compartment"]}' + f'{row["id"]}_{lower(row["compartment"])}' ) linked_mets = {} if ( @@ -594,14 +598,14 @@ def from_table( for item in array: sub_array = item.split(":") l_met = template.compcompounds.get_by_id( - f'{sub_array[0]}_{row["compartment"]}' + f'{sub_array[0]}_{lower(row["compartment"])}' ) linked_mets[l_met] = float(sub_array[1]) self.add_biomass_component( metabolite, - row["class"], - row["coefficient"], - row["coefficient_type"], + lower(row["class"]), + float(row["coefficient"]), + upper(row["coefficient_type"]), linked_mets, ) return self diff --git a/modelseedpy/fbapkg/flexiblebiomasspkg.py b/modelseedpy/fbapkg/flexiblebiomasspkg.py index ae8a1cfe..223f778d 100644 --- a/modelseedpy/fbapkg/flexiblebiomasspkg.py +++ b/modelseedpy/fbapkg/flexiblebiomasspkg.py @@ -93,7 +93,13 @@ def build_package(self, parameters): for metabolite in self.parameters["bio_rxn"].metabolites: met_class[metabolite] = None msid = MSModelUtil.metabolite_msid(metabolite) - if msid != "cpd11416" and msid != None: + if ( + msid != "cpd11416" + and msid != "cpd11463" + and msid != "cpd11462" + and msid != "cpd11461" + and msid != None + ): if msid in refcpd: met_class[metabolite] = "refcpd" else: @@ -111,20 +117,24 @@ def build_package(self, parameters): self.parameters["use_" + curr_class + "_class"] = None break # Creating FLEX reactions and constraints for unclassified compounds - flexcpds = [] + flexcpds = {} for metabolite in self.parameters["bio_rxn"].metabolites: if not met_class[metabolite]: - flexcpds.append(metabolite) + flexcpds[metabolite] = self.parameters["bio_rxn"].metabolites[ + metabolite + ] elif ( met_class[metabolite] != "refcpd" and not self.parameters["use_" + met_class[metabolite] + "_class"] ): - flexcpds.append(metabolite) + flexcpds[metabolite] = self.parameters["bio_rxn"].metabolites[ + metabolite + ] self.modelutl.add_exchanges_for_metabolites( flexcpds, uptake=1000, excretion=1000, - prefix="FLEX_", + prefix="FLEX_" + self.parameters["bio_rxn"].id + "_", prefix_name="Biomass flex for ", ) for metabolite in flexcpds: @@ -206,24 +216,32 @@ def build_variable(self, object, type): # !!! can the function be removed? pass def build_constraint(self, cobra_obj, obj_type): - element_mass = FBAHelper.elemental_mass() # !!! element_mass is never used if obj_type == "flxbio": # Sum(MW*(vdrn,for-vdrn,ref)) + Sum(massdiff*(vrxn,for-vrxn,ref)) = 0 coef = {} for metabolite in self.parameters["bio_rxn"].metabolites: - if "FLEX_" + metabolite.id in self.model.reactions: + if ( + "FLEX_" + self.parameters["bio_rxn"].id + "_" + metabolite.id + in self.model.reactions + ): mw = FBAHelper.metabolite_mw(metabolite) sign = -1 if self.parameters["bio_rxn"].metabolites[metabolite] > 0: sign = 1 coef[ self.model.reactions.get_by_id( - "FLEX_" + metabolite.id + "FLEX_" + + self.parameters["bio_rxn"].id + + "_" + + metabolite.id ).forward_variable ] = (sign * mw) coef[ self.model.reactions.get_by_id( - "FLEX_" + metabolite.id + "FLEX_" + + self.parameters["bio_rxn"].id + + "_" + + metabolite.id ).reverse_variable ] = (-1 * sign * mw) for met_class in classes: @@ -238,8 +256,11 @@ def build_constraint(self, cobra_obj, obj_type): coef[rxn.reverse_variable] = -massdiff return BaseFBAPkg.build_constraint(self, obj_type, 0, 0, coef, cobra_obj) elif obj_type == "flxcpd" or obj_type == "flxcls": + first_entry = None + second_entry = None + product = False biovar = self.parameters["bio_rxn"].forward_variable - object = cobra_obj + object = None const = None if obj_type == "flxcpd": # 0.75 * abs(bio_coef) * vbio - vdrn,for >= 0 @@ -250,7 +271,11 @@ def build_constraint(self, cobra_obj, obj_type): second_entry = self.parameters["flex_coefficient"][1] * abs( self.parameters["bio_rxn"].metabolites[cobra_obj] ) - object = self.model.reactions.get_by_id("FLEX_" + cobra_obj.id) + if self.parameters["bio_rxn"].metabolites[cobra_obj] > 0: + product = True + object = self.model.reactions.get_by_id( + "FLEX_" + self.parameters["bio_rxn"].id + "_" + cobra_obj.id + ) elif ( cobra_obj.id[0:-5] == None or not self.parameters["use_" + cobra_obj.id[0:-5] + "_class"] @@ -263,87 +288,157 @@ def build_constraint(self, cobra_obj, obj_type): second_entry = self.parameters["use_" + cobra_obj.id[0:-5] + "_class"][ 1 ] + object = cobra_obj if first_entry == second_entry: # If the value is positive, lock in the forward variable and set the reverse to zero if first_entry > 0: - const = BaseFBAPkg.build_constraint( - self, - "f" + obj_type, - 0, - 0, - {biovar: second_entry, object.forward_variable: -1}, - cobra_obj, - ) - object.lower_bound = 0 + if product: + const = self.build_constraint( + "f" + obj_type, + 0, + 0, + {biovar: second_entry, object.forward_variable: -1}, + cobra_obj, + ) + object.lower_bound = 0 + else: + const = self.build_constraint( + "f" + obj_type, + 0, + 0, + {biovar: second_entry, object.reverse_variable: -1}, + cobra_obj, + ) + object.upper_bound = 0 # If the value is negative, lock in the reverse variable and set the forward to zero elif first_entry < 0: - const = BaseFBAPkg.build_constraint( - self, - "r" + obj_type, - 0, - 0, - {biovar: -first_entry, object.reverse_variable: -1}, - cobra_obj, - ) - object.upper_bound = 0 + if product: + const = self.build_constraint( + "r" + obj_type, + 0, + 0, + {biovar: -first_entry, object.reverse_variable: -1}, + cobra_obj, + ) + object.upper_bound = 0 + else: + const = self.build_constraint( + "r" + obj_type, + 0, + 0, + {biovar: -first_entry, object.forward_variable: -1}, + cobra_obj, + ) + object.lower_bound = 0 # If the value is zero, lock both variables to zero if first_entry == 0: object.lower_bound = 0 object.upper_bound = 0 elif second_entry >= 0: if first_entry >= 0: - const = BaseFBAPkg.build_constraint( - self, - "f" + obj_type, - 0, - None, - {biovar: second_entry, object.forward_variable: -1}, - cobra_obj, - ) - object.lower_bound = 0 - if first_entry > 0: - BaseFBAPkg.build_constraint( + if product: + const = BaseFBAPkg.build_constraint( self, - "r" + obj_type, + "f" + obj_type, 0, None, - {biovar: -first_entry, object.forward_variable: 1}, + {biovar: second_entry, object.forward_variable: -1}, cobra_obj, ) + object.lower_bound = 0 + if first_entry > 0: + BaseFBAPkg.build_constraint( + self, + "r" + obj_type, + 0, + None, + {biovar: -first_entry, object.forward_variable: 1}, + cobra_obj, + ) + else: + const = BaseFBAPkg.build_constraint( + self, + "f" + obj_type, + 0, + None, + {biovar: second_entry, object.reverse_variable: -1}, + cobra_obj, + ) + object.upper_bound = 0 + if first_entry > 0: + BaseFBAPkg.build_constraint( + self, + "r" + obj_type, + 0, + None, + {biovar: -first_entry, object.reverse_variable: 1}, + cobra_obj, + ) else: - const = BaseFBAPkg.build_constraint( - self, - "f" + obj_type, - 0, - None, - {biovar: second_entry, object.forward_variable: -1}, - cobra_obj, - ) - BaseFBAPkg.build_constraint( - self, + if product: + const = self.build_constraint( + "f" + obj_type, + 0, + None, + {biovar: second_entry, object.forward_variable: -1}, + cobra_obj, + ) + self.build_constraint( + "r" + obj_type, + 0, + None, + {biovar: -first_entry, object.reverse_variable: -1}, + cobra_obj, + ) + else: + const = self.build_constraint( + "f" + obj_type, + 0, + None, + {biovar: second_entry, object.reverse_variable: -1}, + cobra_obj, + ) + self.build_constraint( + "r" + obj_type, + 0, + None, + {biovar: -first_entry, object.forward_variable: -1}, + cobra_obj, + ) + else: + if second_entry < 0: + if product: + const = self.build_constraint( + "f" + obj_type, + 0, + None, + {biovar: second_entry, object.reverse_variable: 1}, + cobra_obj, + ) + else: + const = self.build_constraint( + "f" + obj_type, + 0, + None, + {biovar: second_entry, object.forward_variable: 1}, + cobra_obj, + ) + if product: + self.build_constraint( "r" + obj_type, 0, None, {biovar: -first_entry, object.reverse_variable: -1}, cobra_obj, ) - else: - if second_entry < 0: - const = BaseFBAPkg.build_constraint( - self, - "f" + obj_type, + object.lower_bound = 0 + else: + self.build_constraint( + "r" + obj_type, 0, None, - {biovar: second_entry, object.reverse_variable: 1}, + {biovar: -first_entry, object.forward_variable: -1}, cobra_obj, ) - BaseFBAPkg.build_constraint( - self, - "r" + obj_type, - 0, - None, - {biovar: -first_entry, object.reverse_variable: -1}, - cobra_obj, - ) - object.upper_bound = 0 + object.upper_bound = 0 return const diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index 3ea2d6dd..f14eb7ed 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -19,6 +19,7 @@ from modelseedpy.core.fbahelper import FBAHelper logger = logging.getLogger(__name__) +# logger.setLevel(logging.DEBUG) base_blacklist = { "rxn10157": "<", @@ -493,7 +494,6 @@ def build_package(self, parameters): "default_excretion": 100, "default_uptake": 100, "minimum_obj": 0.01, - "set_objective": 1, "minimize_exchanges": False, "blacklist": [], }, @@ -578,29 +578,27 @@ def build_package(self, parameters): ) self.model.solver.update() - if self.parameters["set_objective"] == 1: - reaction_objective = self.model.problem.Objective(Zero, direction="min") - obj_coef = dict() - for reaction in self.model.reactions: - if reaction.id in self.gapfilling_penalties: - if ( - self.parameters["minimize_exchanges"] - or reaction.id[0:3] != "EX_" - ): - # Minimizing gapfilled reactions - if "reverse" in self.gapfilling_penalties[reaction.id]: - obj_coef[reaction.reverse_variable] = abs( - self.gapfilling_penalties[reaction.id]["reverse"] - ) - if "forward" in self.gapfilling_penalties[reaction.id]: - obj_coef[reaction.forward_variable] = abs( - self.gapfilling_penalties[reaction.id]["forward"] - ) - else: - obj_coef[reaction.forward_variable] = 0 - obj_coef[reaction.reverse_variable] = 0 - self.model.objective = reaction_objective - reaction_objective.set_linear_coefficients(obj_coef) + + reaction_objective = self.model.problem.Objective(Zero, direction="min") + obj_coef = dict() + for reaction in self.model.reactions: + if reaction.id in self.gapfilling_penalties: + if self.parameters["minimize_exchanges"] or reaction.id[0:3] != "EX_": + # Minimizing gapfilled reactions + if "reverse" in self.gapfilling_penalties[reaction.id]: + obj_coef[reaction.reverse_variable] = abs( + self.gapfilling_penalties[reaction.id]["reverse"] + ) + if "forward" in self.gapfilling_penalties[reaction.id]: + obj_coef[reaction.forward_variable] = abs( + self.gapfilling_penalties[reaction.id]["forward"] + ) + else: + obj_coef[reaction.forward_variable] = 0 + obj_coef[reaction.reverse_variable] = 0 + self.model.objective = reaction_objective + reaction_objective.set_linear_coefficients(obj_coef) + self.parameters["gfobj"] = self.model.objective def extend_model_with_model_for_gapfilling(self, source_model, index): new_metabolites = {} @@ -1001,28 +999,27 @@ def run_test_conditions(self, condition_list, solution=None, max_iterations=10): return None return solution - def filter_database_based_on_tests(self, test_conditions): - # Preserving the gapfilling objective function - gfobj = self.model.objective - # Setting the minimal growth constraint to zero + def test_gapfill_database(self): self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = 0 - # Setting the objective to the original default objective for the model self.model.objective = self.parameters["origobj"] - # Testing if the minimal objective can be achieved before filtering solution = self.model.optimize() - print( - "Objective before filtering:", - solution.objective_value, - "; min objective:", - self.parameters["minimum_obj"], + logger.info( + "Objective with gapfill database:" + + str(solution.objective_value) + + "; min objective:" + + str(self.parameters["minimum_obj"]) ) - with open("debuggf.lp", "w") as out: - out.write(str(self.model.solver)) + self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = self.parameters[ + "minimum_obj" + ] + self.model.objective = self.parameters["gfobj"] if solution.objective_value < self.parameters["minimum_obj"]: - save_json_model(self.model, "gfdebugmdl.json") - logger.critical( - "Model cannot achieve the minimum objective even before filtering!" - ) + return False + return True + + def filter_database_based_on_tests(self, test_conditions): + # Setting the minimal growth constraint to zero + self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = 0 # Filtering the database of any reactions that violate the specified tests filetered_list = [] with self.model: @@ -1039,21 +1036,14 @@ def filter_database_based_on_tests(self, test_conditions): ) # Now constraining filtered reactions to zero for item in filtered_list: - logger.debug("Filtering:", item[0].id, item[1]) + logger.info("Filtering:" + item[0].id + item[1]) if item[1] == ">": self.model.reactions.get_by_id(item[0].id).upper_bound = 0 else: self.model.reactions.get_by_id(item[0].id).lower_bound = 0 # Now testing if the gapfilling minimum objective can still be achieved - solution = self.model.optimize() - print( - "Objective after filtering:", - solution.objective_value, - "; min objective:", - self.parameters["minimum_obj"], - ) - # Now we need to restore a minimal set of filtered reactions such that we permit the minimum objective to be reached - if solution.objective_value < self.parameters["minimum_obj"]: + if not self.test_gapfill_database(): + # Now we need to restore a minimal set of filtered reactions such that we permit the minimum objective to be reached # Restoring the minimum objective constraint self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"][ "1" @@ -1089,14 +1079,14 @@ def filter_database_based_on_tests(self, test_conditions): else: count += -1 rxn.lower_bound = 0 - print("Reactions unfiltered:", count) + logger.info("Reactions unfiltered:" + str(count)) # Checking for model reactions that can be removed to enable all tests to pass self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = 0 filtered_list = self.modelutl.reaction_expansion_test( self.parameters["original_reactions"], test_conditions ) for item in filtered_list: - logger.debug("Filtering:", item[0].id, item[1]) + logger.info("Filtering:" + item[0].id + item[1]) if item[1] == ">": self.model.reactions.get_by_id(item[0].id).upper_bound = 0 else: @@ -1105,7 +1095,8 @@ def filter_database_based_on_tests(self, test_conditions): self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = self.parameters[ "minimum_obj" ] - self.model.objective = gfobj + self.model.objective = self.parameters["gfobj"] + return True def compute_gapfilled_solution(self, flux_values=None): if flux_values is None: From 64010b3096b1259afb727074c5578c7cb9565773 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Wed, 1 Mar 2023 00:46:17 -0600 Subject: [PATCH 083/298] template species name --- modelseedpy/core/msbuilder.py | 2 +- modelseedpy/core/mstemplate.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 86df362b..cd16d75e 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -955,7 +955,7 @@ def build_full_template_model(template, model_id=None, index="0"): else: for bio in template.biomasses: bio.build_biomass( - self, model, index, classic=False, GC=0.5, add_to_model=True + model, index, classic=False, GC=0.5, add_to_model=True ) model.objective = "bio1" diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 07931f86..af7b0deb 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -184,8 +184,8 @@ def compound(self): @property def name(self): if self._template_compound: - return self._template_compound.name - return "" + return f'{self._template_compound.name} [{self.compartment}]' + return f'{self.id} [{self.compartment}]' @name.setter def name(self, value): From 972920b35bb8ac597085a46a0fb7039ba54c6233 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Wed, 1 Mar 2023 00:46:42 -0600 Subject: [PATCH 084/298] black --- modelseedpy/core/mstemplate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index af7b0deb..f28d170f 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -184,8 +184,8 @@ def compound(self): @property def name(self): if self._template_compound: - return f'{self._template_compound.name} [{self.compartment}]' - return f'{self.id} [{self.compartment}]' + return f"{self._template_compound.name} [{self.compartment}]" + return f"{self.id} [{self.compartment}]" @name.setter def name(self, value): From 75c464ac5ca4a5f05085baacec295ad03cd45052 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Mon, 13 Mar 2023 09:55:05 -0500 Subject: [PATCH 085/298] x --- modelseedpy/biochem/modelseed_compound.py | 18 +++++++++++++++++- modelseedpy/core/mstemplate.py | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/modelseedpy/biochem/modelseed_compound.py b/modelseedpy/biochem/modelseed_compound.py index 89c4d5f5..1d00435d 100644 --- a/modelseedpy/biochem/modelseed_compound.py +++ b/modelseedpy/biochem/modelseed_compound.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- from modelseedpy.biochem.seed_object import ModelSEEDObject -from modelseedpy.core.mstemplate import MSTemplateSpecies +from modelseedpy.core.mstemplate import MSTemplateSpecies, MSTemplateMetabolite from cobra.core import Metabolite import pandas as pd @@ -58,7 +58,23 @@ def __init__( def to_template_compartment_compound(self, compartment): cpd_id = f"{self.seed_id}_{compartment}" + # build Template Compound + metabolite = MSTemplateMetabolite( + self.seed_id, + self.formula, + self.name, + self.charge, + self.mass, + self.delta_g, + self.delta_g_error, + self.is_cofactor, + self.abbr, + ) + # build Template Compartment Compound res = MSTemplateSpecies(cpd_id, self.charge, compartment, self.id) + + # assign Compound to Compartment Compound + res._template_compound = metabolite res.annotation.update(self.annotation) return res diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index f28d170f..3b5552f4 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -143,7 +143,7 @@ class MSTemplateSpecies(Metabolite): def __init__( self, comp_cpd_id: str, - charge: int, + charge: float, compartment: str, cpd_id, max_uptake=0, From cac909bbec0f6d1176511c817a5ba3246ee758e7 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Tue, 28 Mar 2023 01:07:23 -0500 Subject: [PATCH 086/298] template format --- modelseedpy/core/mstemplate.py | 23 ++++++++++++++++------- setup.py | 3 ++- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 3b5552f4..fc2bbb08 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -160,19 +160,26 @@ def __init__( self.cpd_id ) - def to_metabolite(self, index="0"): + def to_metabolite(self, index="0", force=False): """ Create cobra.core.Metabolite instance :param index: compartment index + :@param force: force index :return: cobra.core.Metabolite """ if index is None: index = "" + index = str(index) + + if self.compartment == 'e' and index.isnumeric(): + if force: + logger.warning(f'Forcing numeric index [{index}] to extra cellular compartment not advised') + else: + index = '0' + cpd_id = f"{self.id}{index}" compartment = f"{self.compartment}{index}" - name = f"{self.name}" - if len(str(index)) > 0: - name = f"{self.name} [{compartment}]" + name = f"{self.compound.name} [{compartment}]" metabolite = Metabolite(cpd_id, self.formula, name, self.charge, compartment) metabolite.notes["modelseed_template_id"] = self.id return metabolite @@ -294,15 +301,17 @@ def compartment(self): def to_reaction(self, model=None, index="0"): if index is None: index = "" + index = str(index) rxn_id = f"{self.id}{index}" compartment = f"{self.compartment}{index}" name = f"{self.name}" metabolites = {} for m, v in self.metabolites.items(): - if model and m.id in model.metabolites: - metabolites[model.metabolites.get_by_id(m.id)] = v + _metabolite = m.to_metabolite(index) + if _metabolite.id in model.metabolites: + metabolites[model.metabolites.get_by_id(_metabolite.id)] = v else: - metabolites[m.to_metabolite(index)] = v + metabolites[_metabolite] = v if len(str(index)) > 0: name = f"{self.name} [{compartment}]" diff --git a/setup.py b/setup.py index 5fba7f6c..a7555b97 100644 --- a/setup.py +++ b/setup.py @@ -27,9 +27,10 @@ "Topic :: Scientific/Engineering :: Bio-Informatics", "Intended Audience :: Science/Research", "Operating System :: OS Independent", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", "Natural Language :: English", ], install_requires=[ From dbe8c6d7acb3f72087166200766b8436f96150e3 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Tue, 28 Mar 2023 01:11:06 -0500 Subject: [PATCH 087/298] black --- modelseedpy/core/mstemplate.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index fc2bbb08..4a628e21 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -171,11 +171,13 @@ def to_metabolite(self, index="0", force=False): index = "" index = str(index) - if self.compartment == 'e' and index.isnumeric(): + if self.compartment == "e" and index.isnumeric(): if force: - logger.warning(f'Forcing numeric index [{index}] to extra cellular compartment not advised') + logger.warning( + f"Forcing numeric index [{index}] to extra cellular compartment not advised" + ) else: - index = '0' + index = "0" cpd_id = f"{self.id}{index}" compartment = f"{self.compartment}{index}" From 29e5c4d164bdee5a9fd6077cba23636b4107bef7 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Thu, 13 Apr 2023 08:44:34 -0500 Subject: [PATCH 088/298] examples --- .../Model Reconstruction/Gapfilling.ipynb | 95 +++--- examples/Model Reconstruction/Genomes.ipynb | 297 +++++++++++------- 2 files changed, 234 insertions(+), 158 deletions(-) diff --git a/examples/Model Reconstruction/Gapfilling.ipynb b/examples/Model Reconstruction/Gapfilling.ipynb index eea0c536..88eadaa6 100644 --- a/examples/Model Reconstruction/Gapfilling.ipynb +++ b/examples/Model Reconstruction/Gapfilling.ipynb @@ -2,17 +2,9 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "cobrakbase 0.2.8\n" - ] - } - ], + "outputs": [], "source": [ "import cobra\n", "#If you have CPLEX, uncomment this\n", @@ -20,31 +12,37 @@ "import cobrakbase\n", "#import modelseedpy.fbapkg\n", "from modelseedpy import GapfillingPkg, KBaseMediaPkg\n", - "from modelseedpy import FBAHelper, MSBuilder" + "from modelseedpy import FBAHelper, MSBuilder\n", + "kbase_api = cobrakbase.KBaseAPI()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "model = kbase_api.get_from_ws(\"test_model\",18528)" + ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - }, "tags": [] }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:modelseedpy.core.msmodelutl:cpd00244 not found in model!\n" + ] + }, { "data": { "text/html": [ - "

Objective

1.0 bio1 = 0.8048653841131165

Uptake

\n", + "

Objective

1.0 bio1 = 0.7997546667881398

Uptake

\n", " \n", " \n", " \n", @@ -58,14 +56,14 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -79,98 +77,98 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -189,28 +187,35 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -218,19 +223,15 @@ "
Metabolite
cpd00009_e0EX_cpd00009_e00.99980.993400.00%
cpd00013_e0EX_cpd00013_e06.0376.09400.00%
cpd00030_e0EX_cpd00030_e00.006390.0063500.00%
cpd00034_e0EX_cpd00034_e00.006390.0063500.00%
cpd00048_e0EX_cpd00048_e00.17550.174400.00%
cpd00058_e0EX_cpd00058_e00.006390.0063500.00%
cpd00063_e0EX_cpd00063_e00.006390.0063500.00%
cpd00067_e0EX_cpd00067_e061.8561.4300.00%
cpd00099_e0EX_cpd00099_e00.006390.0063500.00%
cpd00149_e0EX_cpd00149_e00.006390.0063500.00%
cpd00205_e0EX_cpd00205_e00.006390.0063500.00%
cpd00254_e0EX_cpd00254_e00.006390.0063500.00%
cpd10516_e0EX_cpd10516_e00.025560.025400.00%
cpd17041_c0rxn13782_c00.80490.799800.00%
cpd17042_c0rxn13783_c00.80490.799800.00%
cpd17043_c0rxn13784_c00.80490.799800.00%
cpd00001_e0EX_cpd00001_e0-82.26-81.9500.00%
cpd00007_e0EX_cpd00007_e0-2.928-2.86900.00%
cpd15378_e0EX_cpd15378_e0-0.00639-0.006357100.00%18.92%
cpd03091_c0SK_cpd03091_c0-0.019051081.08%
cpd11416_c0SK_cpd11416_c0-0.8049-0.799800.00%
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 2, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "kbase_api = cobrakbase.KBaseAPI()\n", - "model = kbase_api.get_from_ws(\"test_model\",18528)\n", - "#If you have CPLEX, uncomment this\n", - "#model.solver = 'optlang-cplex'\n", "template = kbase_api.get_from_ws(\"GramNegModelTemplateV3\",\"NewKBaseModelTemplates\")\n", "media = kbase_api.get_from_ws(\"Carbon-D-Glucose\",\"KBaseMedia\")\n", "model = MSBuilder.gapfill_model(model,\"bio1\",template,media)\n", @@ -17910,7 +17911,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, diff --git a/examples/Model Reconstruction/Genomes.ipynb b/examples/Model Reconstruction/Genomes.ipynb index 60270468..8ea82ef4 100644 --- a/examples/Model Reconstruction/Genomes.ipynb +++ b/examples/Model Reconstruction/Genomes.ipynb @@ -1,223 +1,300 @@ { "cells": [ { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "cell_type": "markdown", + "metadata": { + "tags": [] + }, "source": [ - "import modelseedpy\n", - "from modelseedpy.core.msgenome import MSGenome\n", - "from modelseedpy.core.rast_client import RastClient" + "### Genomes\n", + "\n", + "ModelSEEDpy provides its own genome object type `modelseedpy.core.msgenome.MSGenome` to manipulate genomes" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ - "genome = MS" + "import modelseedpy\n", + "from modelseedpy.core.msgenome import MSGenome" ] }, { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "cell_type": "markdown", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, "source": [ - "1" + "#### Reading faa file\n", + "\n", + "To load a genome we can read a `.faa` file that contains protein sequences" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "genome = MSGenome.from_fasta('GCF_000005845.2_ASM584v2_protein.faa', split=' ')" + ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "rast = RastClient()" + "genome" ] }, { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], + "cell_type": "markdown", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, "source": [ - "genome = MSGenome.from_fasta('GCF_000005845.2.faa', split=' ')" + "#### Manipulating genes\n", + "\n", + "Each gene is stored as a `modelseedpy.core.msgenome.MSFeature` in the `.features` of type `cobra.core.dictlist.DictList` similiar to the cobrapy `.reactions` and `.metabolites` in the `cobra.core.Model`" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 4, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of features: 3\n" - ] + "data": { + "text/plain": [ + "4285" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "print('Number of features:', len(genome.features))" + "len(genome.features)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "for f in genome.features:\n", - " print(f.id, len(f.seq), f.description)" + "gene = genome.features.get_by_id('NP_414542.1')\n", + "gene" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 14, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[{'execution_time': 1622756127.36331,\n", - " 'tool_name': 'kmer_search',\n", - " 'hostname': 'pear',\n", - " 'parameters': ['-a',\n", - " '-g',\n", - " 200,\n", - " '-m',\n", - " 5,\n", - " '-d',\n", - " '/opt/patric-common/data/kmer_metadata_v2',\n", - " '-u',\n", - " 'http://pear.mcs.anl.gov:6100/query'],\n", - " 'id': '9CCA6D20-C4B3-11EB-A893-36A8BEF382BD'},\n", - " {'parameters': ['annotate_hypothetical_only=1',\n", - " 'dataset_name=Release70',\n", - " 'kmer_size=8'],\n", - " 'hostname': 'pear',\n", - " 'tool_name': 'KmerAnnotationByFigfam',\n", - " 'id': '9CE3769E-C4B3-11EB-A893-36A8BEF382BD',\n", - " 'execution_time': 1622756127.52738},\n", - " {'execute_time': 1622756127.88296,\n", - " 'hostname': 'pear',\n", - " 'parameters': [],\n", - " 'tool_name': 'annotate_proteins_similarity',\n", - " 'id': '9D19B7EA-C4B3-11EB-9714-71B3BDF382BD'}]" + "modelseedpy.core.msgenome.MSFeature" ] }, - "execution_count": 14, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "rast.annotate_genome(genome)" + "type(gene)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Equivalent call from the client it self" + "##### Gene annotation\n", + "Annotation is store as an **ontology term**. When loading from a `.faa` file no ontology term is present but we can add them later." ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{}" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "#genome, res = rast.annotate_genome_from_fasta('GCF_000005845.2_ASM584v2_protein.faa', split=' ')\n", - "#res" + "gene.ontology_terms" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "'thr operon leader peptide [Escherichia coli str. K-12 substr. MG1655]'" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gene.description" + ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 9, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "{'annotation': ['thr operon leader peptide [Escherichia coli str. K-12 substr. MG1655]']}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gene.add_ontology_term('annotation', gene.description)\n", + "gene.ontology_terms" + ] }, { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] + "cell_type": "markdown", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "#### RAST\n", + "It is possible to annotate genomes with RAST by calling the `RastClient`" + ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "from modelseedpy.core.rast_client import RastClient\n", + "rast = RastClient()" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "[{'id': 'C54F08A4-CDB3-11ED-A7E9-CAF09D6086F0',\n", + " 'parameters': ['-a',\n", + " '-g',\n", + " 200,\n", + " '-m',\n", + " 5,\n", + " '-d',\n", + " '/opt/patric-common/data/kmer_metadata_v2',\n", + " '-u',\n", + " 'http://pear.mcs.anl.gov:6100/query'],\n", + " 'hostname': 'pear',\n", + " 'tool_name': 'kmer_search',\n", + " 'execution_time': 1680040751.14837},\n", + " {'id': 'C5638324-CDB3-11ED-A7E9-CAF09D6086F0',\n", + " 'parameters': ['annotate_hypothetical_only=1',\n", + " 'dataset_name=Release70',\n", + " 'kmer_size=8'],\n", + " 'tool_name': 'KmerAnnotationByFigfam',\n", + " 'hostname': 'pear',\n", + " 'execution_time': 1680040751.28257},\n", + " {'parameters': [],\n", + " 'id': 'C5944E1E-CDB3-11ED-8217-51F29F6086F0',\n", + " 'execute_time': 1680040751.60236,\n", + " 'tool_name': 'annotate_proteins_similarity',\n", + " 'hostname': 'pear'}]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rast.annotate_genome(genome)" + ] }, { - "cell_type": "code", - "execution_count": 34, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "feature = genome.features.get_by_id('YP_588478.1')" + "RAST annotation is stored in the ontology term **RAST** and this is used as default to build metabolic models with the ModelSEED templates" ] }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'RAST': 'DUF1435 domain-containing protein YjjZ [Escherichia coli str. K-12 substr. MG1655]'}" + "{'annotation': ['thr operon leader peptide [Escherichia coli str. K-12 substr. MG1655]'],\n", + " 'RAST': ['Thr operon leader peptide']}" ] }, - "execution_count": 36, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "feature.ontology_terms" + "gene.ontology_terms" ] }, { @@ -225,14 +302,12 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "feature.add_ontology_term('')" - ] + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -246,7 +321,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.4" + "version": "3.8.10" } }, "nbformat": 4, From 24ef228fd800755c6380e917e4c513d8ff5d36ef Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Tue, 18 Apr 2023 16:09:06 -0500 Subject: [PATCH 089/298] lower/upper case fix --- modelseedpy/core/mstemplate.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 4a628e21..49fd98c3 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -598,7 +598,7 @@ def from_table( if "compartment" not in row: row["compartment"] = "c" metabolite = template.compcompounds.get_by_id( - f'{row["id"]}_{lower(row["compartment"])}' + f'{row["id"]}_{row["compartment"].lower()}' ) linked_mets = {} if ( @@ -609,14 +609,14 @@ def from_table( for item in array: sub_array = item.split(":") l_met = template.compcompounds.get_by_id( - f'{sub_array[0]}_{lower(row["compartment"])}' + f'{sub_array[0]}_{row["compartment"].lower()}' ) linked_mets[l_met] = float(sub_array[1]) self.add_biomass_component( metabolite, - lower(row["class"]), + row["class"].lower(), float(row["coefficient"]), - upper(row["coefficient_type"]), + row["coefficient_type"].upper(), linked_mets, ) return self From b1e7ff457ad84fcdddbd8f9bfff2a575956ee1ba Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 3 May 2023 09:31:25 -0500 Subject: [PATCH 090/298] Implementing multiple gapfill --- modelseedpy/core/msatpcorrection.py | 73 +++-- modelseedpy/core/msgapfill.py | 190 ++++++++---- modelseedpy/core/msmodelutl.py | 19 +- modelseedpy/fbapkg/gapfillingpkg.py | 448 ++-------------------------- 4 files changed, 206 insertions(+), 524 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index e72835aa..46bd32ea 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import logging -import itertools import cobra +import copy import json import time import pandas as pd @@ -22,7 +22,9 @@ from modelseedpy.helpers import get_template logger = logging.getLogger(__name__) -# logger.setLevel(logging.DEBUG) +logger.setLevel( + logging.WARNING +) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO _path = _dirname(_abspath(__file__)) @@ -122,7 +124,9 @@ def __init__( self.coretemplate = core_template self.msgapfill = MSGapfill( - self.modelutl, default_gapfill_templates=core_template + self.modelutl, + default_gapfill_templates=[core_template], + default_target=self.atp_hydrolysis.id, ) # These should stay as None until atp correction is actually run self.cumulative_core_gapfilling = None @@ -209,6 +213,7 @@ def disable_noncore_reactions(self): self.other_compartments = [] # Iterating through reactions and disabling for reaction in self.model.reactions: + gfrxn = self.msgapfill.gfmodel.reactions.get_by_id(reaction.id) if reaction.id == self.atp_hydrolysis.id: continue if FBAHelper.is_ex(reaction): @@ -233,10 +238,12 @@ def disable_noncore_reactions(self): logger.debug(reaction.id + " core but reversible") self.noncore_reactions.append([reaction, "<"]) reaction.lower_bound = 0 + gfrxn.lower_bound = 0 if reaction.upper_bound > 0 and template_reaction.upper_bound <= 0: logger.debug(reaction.id + " core but reversible") self.noncore_reactions.append([reaction, ">"]) reaction.upper_bound = 0 + gfrxn.upper_bound = 0 else: logger.debug(f"{reaction.id} non core") if FBAHelper.rxn_compartment(reaction) != self.compartment: @@ -251,6 +258,8 @@ def disable_noncore_reactions(self): self.noncore_reactions.append([reaction, ">"]) reaction.lower_bound = 0 reaction.upper_bound = 0 + gfrxn.lower_bound = 0 + gfrxn.upper_bound = 0 def evaluate_growth_media(self): """ @@ -266,24 +275,22 @@ def evaluate_growth_media(self): output = {} with self.model: self.model.objective = self.atp_hydrolysis.id - # self.model.objective = self.model.problem.Objective(Zero,direction="max") - - logger.debug( - f"ATP bounds: ({self.atp_hydrolysis.lower_bound}, {self.atp_hydrolysis.upper_bound})" - ) - # self.model.objective.set_linear_coefficients({self.atp_hydrolysis.forward_variable:1}) pkgmgr = MSPackageManager.get_pkg_mgr(self.model) + # First prescreening model for ATP production without gapfilling + media_list = [] + min_objectives = {} for media, minimum_obj in self.atp_medias: - logger.debug("evaluate media %s", media) + logger.info("evaluate media %s", media) pkgmgr.getpkg("KBaseMediaPkg").build_package(media) - logger.debug("model.medium %s", self.model.medium) + logger.info("model.medium %s", self.model.medium) solution = self.model.optimize() - logger.debug( + logger.info( "evaluate media %s - %f (%s)", media.id, solution.objective_value, solution.status, ) + self.media_gapfill_stats[media] = None output[media.id] = solution.objective_value @@ -291,23 +298,29 @@ def evaluate_growth_media(self): solution.objective_value < minimum_obj or solution.status != "optimal" ): - self.media_gapfill_stats[media] = self.msgapfill.run_gapfilling( - media, - self.atp_hydrolysis.id, - minimum_obj, - check_for_growth=False, - ) - # IF gapfilling fails - need to activate and penalize the noncore and try again + media_list.append(media) + min_objectives[media] = minimum_obj elif solution.objective_value >= minimum_obj: self.media_gapfill_stats[media] = {"reversed": {}, "new": {}} - logger.debug( - "gapfilling stats: %s", - json.dumps(self.media_gapfill_stats[media], indent=2, default=vars), - ) + + # Now running gapfilling on all conditions where initially there was no growth + all_solutions = self.msgapfill.run_multi_gapfill( + media_list, + self.atp_hydrolysis.id, + min_objectives, + check_for_growth=False, + ) + + # Adding the new solutions to the media gapfill stats + for media in all_solutions: + self.media_gapfill_stats[media] = all_solutions[media] if MSATPCorrection.DEBUG: + export_data = {} + for media in self.media_gapfill_stats: + export_data[media.id] = self.media_gapfill_stats[media] with open("debug.json", "w") as outfile: - json.dump(self.media_gapfill_stats[media], outfile) + json.dump(export_data, outfile) return output @@ -342,7 +355,7 @@ def determine_growth_media(self, max_gapfilling=None): if self.max_gapfilling is None: self.max_gapfilling = best_score - logger.debug(f"max_gapfilling: {self.max_gapfilling}, best_score: {best_score}") + logger.info(f"max_gapfilling: {self.max_gapfilling}, best_score: {best_score}") for media in self.media_gapfill_stats: gfscore = 0 @@ -359,6 +372,9 @@ def determine_growth_media(self, max_gapfilling=None): atp_att["selected_media"][media.id] = 0 self.modelutl.save_attributes(atp_att, "ATP_analysis") + if MSATPCorrection.DEBUG: + with open("atp_att_debug.json", "w") as outfile: + json.dump(atp_att, outfile) def determine_growth_media2(self, max_gapfilling=None): """ @@ -386,7 +402,7 @@ def scoring_function(media): max_gapfilling = best_score + self.gapfilling_delta for media in media_scores: score = media_scores[media] - logger.debug(score, best_score, max_gapfilling) + logger.info(score, best_score, max_gapfilling) if score <= max_gapfilling: self.selected_media.append(media) @@ -435,7 +451,7 @@ def expand_model_to_genome_scale(self): ) # Removing filtered reactions for item in self.filtered_noncore: - print("Removing " + item[0].id + " " + item[1]) + logger.debug("Removing " + item[0].id + " " + item[1]) if item[1] == ">": item[0].upper_bound = 0 else: @@ -500,6 +516,7 @@ def build_tests(self, multiplier=None): self.modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package(media) obj_value = self.model.slim_optimize() logger.debug(f"{media.name} = {obj_value};{multiplier}") + logger.debug("Test:" + media.id + ";" + str(multiplier * obj_value)) tests.append( { "media": media, @@ -527,7 +544,7 @@ def run_atp_correction(self): self.evaluate_growth_media() self.determine_growth_media() self.apply_growth_media_gapfilling() - self.evaluate_growth_media() + # self.evaluate_growth_media() self.expand_model_to_genome_scale() return self.build_tests() diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 8d023272..92890c0e 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -1,9 +1,5 @@ # -*- coding: utf-8 -*- import logging -import itertools # !!! the import is never used - -logger = logging.getLogger(__name__) - import cobra import re from optlang.symbolics import Zero, add @@ -12,6 +8,11 @@ from modelseedpy.core.msmodelutl import MSModelUtil from modelseedpy.core.exceptions import GapfillingError +logger = logging.getLogger(__name__) +logger.setLevel( + logging.WARNING +) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO + class MSGapfill: @staticmethod @@ -32,6 +33,10 @@ def __init__( reaction_scores={}, blacklist=[], atp_gapfilling=False, + minimum_obj=0.01, + default_excretion=100, + default_uptake=100, + default_target=None, ): # Discerning input is model or mdlutl and setting internal links if isinstance(model_or_mdlutl, MSModelUtil): @@ -49,7 +54,18 @@ def __init__( "cpd15302", "cpd03091", ] # the cpd11416 compound is filtered during model extension with templates - self.gfmodel = self.lp_filename = self.last_solution = None + # Cloning model to create gapfilling model + self.gfmodel = cobra.io.json.from_json(cobra.io.json.to_json(self.model)) + # Getting package manager for gapfilling model + self.gfpkgmgr = MSPackageManager.get_pkg_mgr(self.gfmodel) + # Setting target from input + if default_target: + self.gfmodel.objective = self.gfmodel.problem.Objective( + self.gfmodel.reactions.get_by_id(default_target).flux_expression, + direction="max", + ) + # Setting parameters for gapfilling + self.lp_filename = self.last_solution = None self.model_penalty = 1 self.default_gapfill_models = default_gapfill_models self.default_gapfill_templates = default_gapfill_templates @@ -61,23 +77,8 @@ def __init__( self.test_conditions = test_conditions self.reaction_scores = reaction_scores self.cumulative_gapfilling = [] - - def run_gapfilling( - self, - media=None, - target=None, - minimum_obj=0.01, - binary_check=False, - prefilter=True, - check_for_growth=True, - ): - if target: - self.model.objective = self.model.problem.Objective( - self.model.reactions.get_by_id(target).flux_expression, direction="max" - ) - self.gfmodel = cobra.io.json.from_json(cobra.io.json.to_json(self.model)) - pkgmgr = MSPackageManager.get_pkg_mgr(self.gfmodel) - pkgmgr.getpkg("GapfillingPkg").build_package( + # Building gapfilling package + self.gfpkgmgr.getpkg("GapfillingPkg").build_package( { "auto_sink": self.auto_sink, "model_penalty": self.model_penalty, @@ -87,58 +88,95 @@ def run_gapfilling( "gapfill_models_by_index": self.gapfill_models_by_index, "gapfill_all_indecies_with_default_templates": self.gapfill_all_indecies_with_default_templates, "gapfill_all_indecies_with_default_models": self.gapfill_all_indecies_with_default_models, - "default_excretion": 100, - "default_uptake": 100, + "default_excretion": default_excretion, + "default_uptake": default_uptake, "minimum_obj": minimum_obj, "blacklist": self.blacklist, "reaction_scores": self.reaction_scores, "set_objective": 1, } ) - pkgmgr.getpkg("KBaseMediaPkg").build_package(media) + def test_gapfill_database(self, media, target=None, before_filtering=True): # Testing if gapfilling can work before filtering - if ( - check_for_growth - and not pkgmgr.getpkg("GapfillingPkg").test_gapfill_database() - ): - # save_json_model(self.model, "gfdebugmdl.json") - gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) - if media.id not in gf_sensitivity: - gf_sensitivity[media.id] = {} - if target not in gf_sensitivity[media.id]: - gf_sensitivity[media.id][target] = {} - gf_sensitivity[media.id][target][ - "FBF" - ] = self.mdlutl.find_unproducible_biomass_compounds(target) - self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") - logger.warning("No solution found before filtering for %s", media) - return None + if target: + self.gfmodel.objective = self.gfmodel.problem.Objective( + self.gfmodel.reactions.get_by_id(target).flux_expression, + direction="max", + ) + self.gfpkgmgr.getpkg("GapfillingPkg").reset_original_objective() + else: + target = str(self.gfmodel.objective) + target = target.split(" ")[0] + target = target[13:] + if self.gfpkgmgr.getpkg("GapfillingPkg").test_gapfill_database(): + return True + gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) + if media.id not in gf_sensitivity: + gf_sensitivity[media.id] = {} + if target not in gf_sensitivity[media.id]: + gf_sensitivity[media.id][target] = {} + filter_msg = " " + note = "FAF" + if before_filtering: + filter_msg = " before filtering " + note = "FBF" + gf_sensitivity[media.id][target][ + note + ] = self.mdlutl.find_unproducible_biomass_compounds(target) + self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") + logger.warning( + "No gapfilling solution found" + + filter_msg + + "for " + + media.id + + " activating " + + target + ) + return False + def prefilter(self, media, target): # Filtering breaking reactions out of the database - if prefilter and self.test_conditions: - pkgmgr.getpkg("GapfillingPkg").filter_database_based_on_tests( + if self.test_conditions: + self.gfpkgmgr.getpkg("GapfillingPkg").filter_database_based_on_tests( self.test_conditions ) # Testing if gapfilling can work after filtering - if ( - check_for_growth - and not pkgmgr.getpkg("GapfillingPkg").test_gapfill_database() - ): - # save_json_model(self.model, "gfdebugmdl.json") - gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) - if media.id not in gf_sensitivity: - gf_sensitivity[media.id] = {} - if target not in gf_sensitivity[media.id]: - gf_sensitivity[media.id][target] = {} - gf_sensitivity[media.id][target][ - "FAF" - ] = self.mdlutl.find_unproducible_biomass_compounds(target) - self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") - logger.warning("No solution found after filtering for %s", media) + if not self.test_gapfill_database(media, target, before_filtering=False): + return False + return True + + def run_gapfilling( + self, + media=None, + target=None, + minimum_obj=None, + binary_check=False, + prefilter=True, + check_for_growth=True, + ): + # Setting target and media if specified + if target: + self.gfmodel.objective = self.gfmodel.problem.Objective( + self.gfmodel.reactions.get_by_id(target).flux_expression, + direction="max", + ) + self.gfpkgmgr.getpkg("GapfillingPkg").reset_original_objective() + if media: + self.gfpkgmgr.getpkg("KBaseMediaPkg").build_package(media) + if minimum_obj: + self.gfpkgmgr.getpkg("GapfillingPkg").set_min_objective(minimum_obj) + + # Testing if gapfilling can work before filtering + if not self.test_gapfill_database(media, before_filtering=True): return None + # Filtering + if prefilter: + if not self.prefilter(media, target): + return None + # Printing the gapfilling LP file if self.lp_filename: with open(self.lp_filename, "w") as out: @@ -157,9 +195,13 @@ def run_gapfilling( return None # Computing solution and ensuring all tests still pass - self.last_solution = pkgmgr.getpkg("GapfillingPkg").compute_gapfilled_solution() + self.last_solution = self.gfpkgmgr.getpkg( + "GapfillingPkg" + ).compute_gapfilled_solution() if self.test_conditions: - self.last_solution = pkgmgr.getpkg("GapfillingPkg").run_test_conditions( + self.last_solution = self.gfpkgmgr.getpkg( + "GapfillingPkg" + ).run_test_conditions( self.test_conditions, self.last_solution, self.test_condition_iteration_limit, @@ -172,7 +214,7 @@ def run_gapfilling( # Running binary check to reduce solution to minimal reaction soltuion if binary_check: - self.last_solution = pkgmgr.getpkg( + self.last_solution = self.gfpkgmgr.getpkg( "GapfillingPkg" ).binary_check_gapfilling_solution() @@ -183,6 +225,32 @@ def run_gapfilling( self.last_solution["binary_check"] = binary_check return self.last_solution + def run_multi_gapfill( + self, + media_list, + target=None, + minimum_objectives={}, + binary_check=False, + prefilter=True, + check_for_growth=True, + ): + first = True + solution_dictionary = {} + for item in media_list: + minimum_obj = None + if item in minimum_objectives: + minimum_obj = minimum_objectives[item] + if first: + solution_dictionary[item] = self.run_gapfilling( + item, target, minimum_obj, binary_check, True, True + ) + else: + solution_dictionary[item] = self.run_gapfilling( + item, None, minimum_obj, binary_check, False, True + ) + false = False + return solution_dictionary + def integrate_gapfill_solution( self, solution, cumulative_solution=[], link_gaps_to_objective=True ): diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index a44c5653..371abeb7 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -16,12 +16,9 @@ # from builtins import None logger = logging.getLogger(__name__) -logger.setLevel(logging.DEBUG) -# handler = logging.StreamHandler(sys.stdout) -# handler.setLevel(logging.DEBUG) -# formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') -# handler.setFormatter(formatter) -# logger.addHandler(handler) +logger.setLevel( + logging.INFO +) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO class MSModelUtil: @@ -924,13 +921,15 @@ def reaction_expansion_test( reaction_list, condition, currmodel ) for item in new_filtered: - filtered_list.append(item) + if item not in filtered_list: + filtered_list.append(item) else: new_filtered = self.linear_expansion_test( reaction_list, condition, currmodel ) for item in new_filtered: - filtered_list.append(item) + if item not in filtered_list: + filtered_list.append(item) # Restoring knockout of newly filtered reactions, which expire after exiting the "with" block above for item in new_filtered: if item[1] == ">": @@ -938,10 +937,10 @@ def reaction_expansion_test( else: item[0].lower_bound = 0 toc = time.perf_counter() - logger.debug( + logger.info( "Expansion time:" + condition["media"].id + ":" + str((toc - tic)) ) - logger.debug( + logger.info( "Filtered count:" + str(len(filtered_list)) + " out of " diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index f14eb7ed..465e5558 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -3,6 +3,7 @@ from __future__ import absolute_import import logging +import sys import re import json from optlang.symbolics import Zero, add @@ -19,427 +20,11 @@ from modelseedpy.core.fbahelper import FBAHelper logger = logging.getLogger(__name__) -# logger.setLevel(logging.DEBUG) +logger.setLevel( + logging.WARNING +) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO -base_blacklist = { - "rxn10157": "<", - "rxn09295": "<", - "rxn05938": "<", - "rxn08628": ">", - "rxn10155": "<", - "rxn01353": "<", - "rxn05683": "<", - "rxn09193": "<", - "rxn09003": "<", - "rxn01128": ">", - "rxn08655": "<", - "rxn09272": "<", - "rxn05313": "<", - "rxn01510": ">", - "rxn05297": ">", - "rxn00507": "<", - "rxn05596": "<", - "rxn01674": "<", - "rxn01679": "<", - "rxn00778": ">", - "rxn05206": ">", - "rxn00239": "<", - "rxn05937": "<", - "rxn00715": "<", - "rxn05638": ">", - "rxn05289": ">", - "rxn00839": "<", - "rxn08866": "<", - "rxn10901": "<", - "rxn09331": "<", - "rxn05242": "<", - "rxn12549": "<", - "rxn13143": "<", - "rxn12498": "<", - "rxn08373": "<", - "rxn05208": "<", - "rxn09372": "<", - "rxn00571": ">", - "rxn08104": "<", - "rxn08704": "<", - "rxn07191": "<", - "rxn09672": "<", - "rxn01048": ">", - "rxn11267": ">", - "rxn08290": "<", - "rxn09307": "<", - "rxn05676": ">", - "rxn09653": "<", - "rxn11277": "<", - "rxn00976": "<", - "rxn02520": "<", - "rxn08275": "<", - "rxn09121": "<", - "rxn08999": "<", - "rxn08633": "<", - "rxn08610": "<", - "rxn09218": "<", - "rxn05626": "<", - "rxn11320": "<", - "rxn10058": ">", - "rxn08544": "<", - "rxn12539": "<", - "rxn08990": "<", - "rxn09348": "<", - "rxn00378": "<", - "rxn05243": "<", - "rxn02154": "<", - "rxn12587": "<", - "rxn00125": "<", - "rxn05648": "<", - "rxn13722": "<", - "rxn10910": ">", - "rxn05308": ">", - "rxn08585": "<", - "rxn14207": "<", - "rxn08682": "<", - "rxn10895": "<", - "rxn09655": "<", - "rxn11934": "<", - "rxn01742": ">", - "rxn05222": ">", - "rxn09942": "<", - "rxn13753": ">", - "rxn10857": "<", - "rxn03468": "<", - "rxn04942": "<", - "rxn10990": ">", - "rxn08639": "<", - "rxn09248": "<", - "rxn11935": ">", - "rxn00870": ">", - "rxn08314": "<", - "rxn09378": "<", - "rxn09269": "<", - "rxn10057": ">", - "rxn13702": ">", - "rxn00517": "<", - "rxn09221": ">", - "rxn01505": ">", - "rxn13692": ">", - "rxn05573": "<", - "rxn10123": ">", - "rxn09005": "<", - "rxn05244": "<", - "rxn05940": "<", - "rxn10124": ">", - "rxn06202": ">", - "rxn09660": "<", - "rxn02260": ">", - "rxn08912": "<", - "rxn05760": ">", - "rxn05580": ">", - "rxn02181": ">", - "rxn09339": "<", - "rxn00767": "<", - "rxn09118": "<", - "rxn05303": "<", - "rxn06110": "<", - "rxn12800": "<", - "rxn10966": "<", - "rxn12561": "<", - "rxn04678": ">", - "rxn10818": "<", - "rxn08166": "<", - "rxn02044": ">", - "rxn12623": "<", - "rxn13392": ">", - "rxn02283": "<", - "rxn13647": ">", - "rxn08653": "<", - "rxn05218": ">", - "rxn11676": ">", - "rxn00197": "<", - "rxn00697": "<", - "rxn12575": ">", - "rxn08188": "<", - "rxn01215": "<", - "rxn08730": ">", - "rxn08519": ">", - "rxn08642": "<", - "rxn05245": "<", - "rxn04042": "<", - "rxn01443": ">", - "rxn08535": "<", - "rxn03983": "<", - "rxn08317": "<", - "rxn14173": ">", - "rxn08868": "<", - "rxn05893": ">", - "rxn00435": ">", - "rxn13724": "<", - "rxn09681": "<", - "rxn00572": ">", - "rxn05942": "<", - "rxn11158": "<", - "rxn05562": "<", - "rxn10868": "<", - "rxn10426": "<", - "rxn00941": ">", - "rxn08240": "<", - "rxn05220": ">", - "rxn01228": ">", - "rxn12540": "<", - "rxn10618": ">", - "rxn09659": "<", - "rxn08985": ">", - "rxn05523": "<", - "rxn00421": "<", - "rxn09385": "<", - "rxn08542": "<", - "rxn09658": "<", - "rxn01173": "<", - "rxn10977": "<", - "rxn05216": "<", - "rxn13748": ">", - "rxn10769": ">", - "rxn00451": "<", - "rxn01639": "<", - "rxn08661": "<", - "rxn09308": "<", - "rxn09260": "<", - "rxn00253": "<", - "rxn05207": "<", - "rxn01667": "<", - "rxn08063": "<", - "rxn01508": ">", - "rxn09657": "<", - "rxn01209": ">", - "rxn00548": ">", - "rxn12617": "<", - "rxn08747": ">", - "rxn08096": "<", - "rxn11951": "<", - "rxn09061": "<", - "rxn10978": "<", - "rxn02748": ">", - "rxn09663": "<", - "rxn08737": "<", - "rxn13127": "<", - "rxn09366": "<", - "rxn05634": "<", - "rxn05554": "<", - "rxn09266": ">", - "rxn04676": ">", - "rxn11078": ">", - "rxn04932": "<", - "rxn00607": ">", - "rxn08856": "<", - "rxn12624": "<", - "rxn05215": "<", - "rxn13686": "<", - "rxn12529": "<", - "rxn00234": "<", - "rxn13689": ">", - "rxn08117": "<", - "rxn05315": ">", - "rxn08865": "<", - "rxn11678": ">", - "rxn00518": "<", - "rxn00195": "<", - "rxn10054": "<", - "rxn12532": "<", - "rxn05902": ">", - "rxn12777": "<", - "rxn12822": ">", - "rxn13735": ">", - "rxn00427": "<", - "rxn13196": "<", - "rxn08284": "<", - "rxn10576": ">", - "rxn00891": "<", - "rxn08293": "<", - "rxn00374": ">", - "rxn08795": "<", - "rxn12583": "<", - "rxn00918": ">", - "rxn08525": "<", - "rxn10427": ">", - "rxn09271": "<", - "rxn10860": "<", - "rxn10600": ">", - "rxn13729": ">", - "rxn01375": "<", - "rxn13726": ">", - "rxn10587": "<", - "rxn08672": "<", - "rxn10588": ">", - "rxn08152": ">", - "rxn09306": "<", - "rxn00635": "<", - "rxn08427": "<", - "rxn05225": ">", - "rxn00680": ">", - "rxn08786": ">", - "rxn08721": "<", - "rxn11339": "<", - "rxn05749": "<", - "rxn01187": ">", - "rxn08625": "<", - "rxn06677": "<", - "rxn12302": ">", - "rxn02770": "<", - "rxn05628": "<", - "rxn13706": ">", - "rxn12739": "<", - "rxn00177": "<", - "rxn09896": ">", - "rxn12574": "<", - "rxn12533": ">", - "rxn08537": ">", - "rxn05651": ">", - "rxn08170": "<", - "rxn05240": "<", - "rxn00663": ">", - "rxn12589": "<", - "rxn09299": "<", - "rxn02059": "<", - "rxn12217": ">", - "rxn06592": "<", - "rxn05939": ">", - "rxn08581": "<", - "rxn00430": "<", - "rxn09283": ">", - "rxn08919": "<", - "rxn13660": "<", - "rxn08065": "<", - "rxn08428": ">", - "rxn10936": ">", - "rxn05238": ">", - "rxn05685": "<", - "rxn08920": ">", - "rxn07193": "<", - "rxn08265": "<", - "rxn12554": "<", - "rxn08094": "<", - "rxn13727": ">", - "rxn04158": "<", - "rxn09839": "<", - "rxn10820": "<", - "rxn00869": ">", - "rxn00331": ">", - "rxn09034": "<", - "rxn01136": "<", - "rxn09247": "<", - "rxn08302": "<", - "rxn10594": "<", - "rxn08670": ">", - "rxn11334": "<", - "rxn09941": "<", - "rxn02919": "<", - "rxn09670": "<", - "rxn10892": "<", - "rxn09794": "<", - "rxn02332": ">", - "rxn00244": ">", - "rxn08030": "<", - "rxn12526": "<", - "rxn13150": ">", - "rxn05486": "<", - "rxn10852": ">", - "rxn13790": ">", - "rxn06348": ">", - "rxn09172": ">", - "rxn03653": ">", - "rxn05213": "<", - "rxn01869": "<", - "rxn08142": "<", - "rxn12606": "<", - "rxn11916": ">", - "rxn05748": "<", - "rxn08543": "<", - "rxn01107": ">", - "rxn05708": "<", - "rxn08169": "<", - "rxn06641": ">", - "rxn12578": "<", - "rxn01172": "<", - "rxn02120": ">", - "rxn05669": "<", - "rxn11322": "<", - "rxn12630": "<", - "rxn00698": "<", - "rxn05507": ">", - "rxn12530": "<", - "rxn09304": "<", - "rxn05532": ">", - "rxn03644": ">", - "rxn08733": "<", - "rxn13733": "<", - "rxn10044": ">", - "rxn00176": ">", - "rxn01364": ">", - "rxn02198": ">", - "rxn06990": "<", - "rxn08424": "<", - "rxn08069": "<", - "rxn05611": "<", - "rxn11973": "<", - "rxn12665": ">", - "rxn05241": "<", - "rxn08982": ">", - "rxn00542": ">", - "rxn12588": "<", - "rxn03517": ">", - "rxn01805": "<", - "rxn13203": ">", - "rxn08614": "<", - "rxn12200": ">", - "rxn13811": "<", - "rxn08377": "<", - "rxn11342": ">", - "rxn02976": "<", - "rxn08217": "<", - "rxn07921": ">", - "rxn09944": ">", - "rxn02401": "<", - "rxn08429": ">", - "rxn00905": "<", - "rxn08196": "<", - "rxn03054": "<", - "rxn08643": "<", - "rxn01874": "<", - "rxn08028": "<", - "rxn01641": ">", - "rxn03442": "<", - "rxn02172": "<", - "rxn10692": ">", - "rxn10613": ">", - "rxn12928": ">", - "rxn12994": ">", - "rxn13843": ">", - "rxn12942": ">", - "rxn12934": ">", - "rxn16827": ">", - "rxn12941": ">", - "rxn01736": ">", - "rxn14109": ">", - "rxn15060": ">", - "rxn15064": ">", - "rxn30685": ">", - "rxn10095": ">", - "rxn16143": ">", - "rxn25271": ">", - "rxn25160": ">", - "rxn30917": ">", - "rxn16843": ">", - "rxn08921": ">", - "rxn09390": ">", - "rxn27362": ">", - "rxn02664": ">", - "rxn24638": ">", - "rxn24613": ">", - "rxn24611": ">", - "rxn14428": ">", - "rxn03079": ">", - "rxn03020": ">", - "rxn10471": "<", -} +base_blacklist = {} class GapfillingPkg(BaseFBAPkg): @@ -600,6 +185,9 @@ def build_package(self, parameters): reaction_objective.set_linear_coefficients(obj_coef) self.parameters["gfobj"] = self.model.objective + def reset_original_objective(self): + self.parameters["origobj"] = self.model.objective + def extend_model_with_model_for_gapfilling(self, source_model, index): new_metabolites = {} new_reactions = {} @@ -980,7 +568,7 @@ def run_test_conditions(self, condition_list, solution=None, max_iterations=10): condition["change"] = False if len(filtered_list) > 0: if max_iterations > 0: - print("Gapfilling test failed " + str(11 - max_iterations)) + logger.warning("Gapfilling test failed " + str(11 - max_iterations)) # Forcing filtered reactions to zero for item in filtered_list: if item[1] == ">": @@ -1003,7 +591,7 @@ def test_gapfill_database(self): self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = 0 self.model.objective = self.parameters["origobj"] solution = self.model.optimize() - logger.info( + logger.debug( "Objective with gapfill database:" + str(solution.objective_value) + "; min objective:" @@ -1017,6 +605,12 @@ def test_gapfill_database(self): return False return True + def set_min_objective(self, min_objective): + self.parameters["minimum_obj"] = min_objective + self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = self.parameters[ + "minimum_obj" + ] + def filter_database_based_on_tests(self, test_conditions): # Setting the minimal growth constraint to zero self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = 0 @@ -1036,7 +630,7 @@ def filter_database_based_on_tests(self, test_conditions): ) # Now constraining filtered reactions to zero for item in filtered_list: - logger.info("Filtering:" + item[0].id + item[1]) + logger.debug("Filtering:" + item[0].id + item[1]) if item[1] == ">": self.model.reactions.get_by_id(item[0].id).upper_bound = 0 else: @@ -1079,14 +673,14 @@ def filter_database_based_on_tests(self, test_conditions): else: count += -1 rxn.lower_bound = 0 - logger.info("Reactions unfiltered:" + str(count)) + logger.debug("Reactions unfiltered:" + str(count)) # Checking for model reactions that can be removed to enable all tests to pass self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = 0 filtered_list = self.modelutl.reaction_expansion_test( self.parameters["original_reactions"], test_conditions ) for item in filtered_list: - logger.info("Filtering:" + item[0].id + item[1]) + logger.debug("Filtering:" + item[0].id + item[1]) if item[1] == ">": self.model.reactions.get_by_id(item[0].id).upper_bound = 0 else: @@ -1109,15 +703,19 @@ def compute_gapfilled_solution(self, flux_values=None): and "forward" in self.gapfilling_penalties[reaction.id] ): if "added" in self.gapfilling_penalties[reaction.id]: + logger.debug(f"New gapfilled reaction: {reaction.id} >") output["new"][reaction.id] = ">" else: + logger.debug(f"Reversed gapfilled reaction: {reaction.id} >") output["reversed"][reaction.id] = ">" elif ( flux_values[reaction.id]["reverse"] > Zero and "reverse" in self.gapfilling_penalties[reaction.id] ): if "added" in self.gapfilling_penalties[reaction.id]: + logger.debug(f"New gapfilled reaction: {reaction.id} <") output["new"][reaction.id] = "<" else: + logger.debug(f"Reversed gapfilled reaction: {reaction.id} <") output["reversed"][reaction.id] = "<" return output From 9a6da4521df92689f27f4a8794e32f40bccdc1dd Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 16 May 2023 01:18:17 -0500 Subject: [PATCH 091/298] Fixing test --- tests/core/test_msatpcorreption.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/core/test_msatpcorreption.py b/tests/core/test_msatpcorreption.py index 108cc3ec..3d036193 100644 --- a/tests/core/test_msatpcorreption.py +++ b/tests/core/test_msatpcorreption.py @@ -251,7 +251,7 @@ def test_ms_atp_correction_and_gap_fill1( model = get_model_with_infinite_atp_loop(["GLCpts_c0", "GLUSy_c0", "GLUDy_c0"]) model.reactions.ATPM_c0.lower_bound = 0 model.reactions.ATPM_c0.upper_bound = 1000 - + model.objective = "ATPM_c0" atp_correction = MSATPCorrection( model, template, @@ -260,7 +260,6 @@ def test_ms_atp_correction_and_gap_fill1( load_default_medias=False, ) tests = atp_correction.run_atp_correction() - # expected tests = [{'media': MSMedia object, 'is_max_threshold': True, 'threshold': 21.0, 'objective': 'ATPM_c0'}] assert tests @@ -268,13 +267,13 @@ def test_ms_atp_correction_and_gap_fill1( assert tests[0]["threshold"] > 0 assert tests[0]["objective"] == "ATPM_c0" + model.objective = "BIOMASS_Ecoli_core_w_GAM_c0" gap_fill = MSGapfill(model, [template_genome_scale], [], tests, {}, []) result = gap_fill.run_gapfilling( media_genome_scale_glucose_aerobic, "BIOMASS_Ecoli_core_w_GAM_c0", minimum_obj=0.1, ) - # either GLUSy_c0 or GLUDy_c0 should be gap filled for glutamate assert result From 3256ea0ad2e0d5b199500afe654c18b33d54ee89 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 14 Jun 2023 23:48:42 -0500 Subject: [PATCH 092/298] Renaming ATP --- modelseedpy/core/msatpcorrection.py | 36 ++++++++++++++--------------- modelseedpy/data/atp_medias.tsv | 2 +- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 46bd32ea..c848fbeb 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -23,28 +23,28 @@ logger = logging.getLogger(__name__) logger.setLevel( - logging.WARNING + logging.INFO ) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO _path = _dirname(_abspath(__file__)) min_gap = { - "Glc/O2": 5, - "Etho/O2": 0.01, - "Ac/O2": 1, - "Pyr/O2": 3, - "Glyc/O2": 2, - "Fum/O2": 3, - "Succ/O2": 2, - "Akg/O2": 2, - "LLac/O2": 2, - "Dlac/O2": 2, - "For/O2": 2, - "For/NO3": 1.5, - "Pyr/NO": 2.5, - "Pyr/NO2": 2.5, - "Pyr/NO3": 2.5, - "Pyr/SO4": 2.5, + "Glc.O2": 5, + "Etho.O2": 0.01, + "Ac.O2": 1, + "Pyr.O2": 3, + "Glyc.O2": 2, + "Fum.O2": 3, + "Succ.O2": 2, + "Akg.O2": 2, + "LLac.O2": 2, + "Dlac.O2": 2, + "For.O2": 2, + "For.NO3": 1.5, + "Pyr.NO": 2.5, + "Pyr.NO2": 2.5, + "Pyr.NO3": 2.5, + "Pyr.SO4": 2.5, } @@ -451,7 +451,7 @@ def expand_model_to_genome_scale(self): ) # Removing filtered reactions for item in self.filtered_noncore: - logger.debug("Removing " + item[0].id + " " + item[1]) + logger.info("Removing " + item[0].id + " " + item[1]) if item[1] == ">": item[0].upper_bound = 0 else: diff --git a/modelseedpy/data/atp_medias.tsv b/modelseedpy/data/atp_medias.tsv index 4a4b7a84..0bf5e56c 100644 --- a/modelseedpy/data/atp_medias.tsv +++ b/modelseedpy/data/atp_medias.tsv @@ -1,4 +1,4 @@ -seed Glc/O2 Ac/O2 Etho/O2 Pyr/O2 Glyc/O2 Fum/O2 Succ/O2 Akg/O2 LLac/O2 Dlac/O2 For/O2 Glc Ac Etho Pyr Glyc Fum Succ Akg Llac Dlac For mal-L For/NO2 For/NO3 For/NO Pyr/NO2 Pyr/NO3 Pyr/NO Ac/NO2 Ac/NO3 Ac/NO Glc/DMSO Glc/TMAO Pyr/DMSO Pyr/TMAO Pyr/SO4 Pyr/SO3 H2/CO2 H2/Ac For/SO4/H2 LLac/SO4/H2 For/SO4 LLac/SO4 H2/SO4 empty Light ANME Methane +seed Glc.O2 Ac.O2 Etho.O2 Pyr.O2 Glyc.O2 Fum.O2 Succ.O2 Akg.O2 LLac.O2 Dlac.O2 For.O2 Glc Ac Etho Pyr Glyc Fum Succ Akg Llac Dlac For mal-L For.NO2 For.NO3 For.NO Pyr.NO2 Pyr.NO3 Pyr.NO Ac.NO2 Ac.NO3 Ac.NO Glc.DMSO Glc.TMAO Pyr.DMSO Pyr.TMAO Pyr.SO4 Pyr.SO3 H2.CO2 H2.Ac For.SO4.H2 LLac.SO4.H2 For.SO4 LLac.SO4 H2.SO4 empty Light ANME Methane EX_cpd00027_e0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 EX_cpd00024_e0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 EX_cpd00106_e0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 From da33bd2b366cadab4da89d5f790ef3607fb54dba Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Mon, 26 Jun 2023 12:34:56 -0500 Subject: [PATCH 093/298] fixes --- modelseedpy/biochem/modelseed_compound.py | 2 +- modelseedpy/core/msbuilder.py | 1 + modelseedpy/core/msgenome.py | 9 +++++++-- modelseedpy/core/rast_client.py | 8 ++++++++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/modelseedpy/biochem/modelseed_compound.py b/modelseedpy/biochem/modelseed_compound.py index 1d00435d..a3ea75f3 100644 --- a/modelseedpy/biochem/modelseed_compound.py +++ b/modelseedpy/biochem/modelseed_compound.py @@ -71,7 +71,7 @@ def to_template_compartment_compound(self, compartment): self.abbr, ) # build Template Compartment Compound - res = MSTemplateSpecies(cpd_id, self.charge, compartment, self.id) + res = MSTemplateSpecies(cpd_id, self.charge, compartment, metabolite.id) # assign Compound to Compartment Compound res._template_compound = metabolite diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index cd16d75e..e376ae0b 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -315,6 +315,7 @@ def __init__( self.reaction_to_complex_sets = None self.compartments = None self.base_model = None + self.compartments_index = None # TODO: implement custom index by compartment self.index = index def build_drains(self): diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index 875699c2..e41953d2 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -15,8 +15,13 @@ def normalize_role(s): def read_fasta(f, split=DEFAULT_SPLIT, h_func=None): - with open(f, "r") as fh: - return parse_fasta_str(fh.read(), split, h_func) + if f.endswith('.gz'): + import gzip + with gzip.open(f, 'rb') as fh: + return parse_fasta_str(fh.read().decode('utf-8'), split, h_func) + else: + with open(f, "r") as fh: + return parse_fasta_str(fh.read(), split, h_func) def parse_fasta_str(faa_str, split=DEFAULT_SPLIT, h_func=None): diff --git a/modelseedpy/core/rast_client.py b/modelseedpy/core/rast_client.py index 575cf0d4..ebe06cb5 100644 --- a/modelseedpy/core/rast_client.py +++ b/modelseedpy/core/rast_client.py @@ -84,6 +84,14 @@ def annotate_genome_from_fasta(self, filepath, split="|"): return genome, res + def annotate_protein_sequence(self, protein_id: str, protein_seq: str): + p_features = [{"id": protein_id, "protein_translation": protein_seq}] + return self.f(p_features) + + def annotate_protein_sequences(self, protein_seqs: dict): + p_features = [{"id": protein_id, "protein_translation": protein_seq}] + return self.f(p_features) + def f1(self, protein_id, protein_seq): p_features = [{"id": protein_id, "protein_translation": protein_seq}] return self.f(p_features) From d13f6c20b7f70413d668c4ddcbb23b27af083f1b Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Mon, 26 Jun 2023 12:35:47 -0500 Subject: [PATCH 094/298] black --- modelseedpy/core/msgenome.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index e41953d2..78f1e004 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -15,10 +15,11 @@ def normalize_role(s): def read_fasta(f, split=DEFAULT_SPLIT, h_func=None): - if f.endswith('.gz'): + if f.endswith(".gz"): import gzip - with gzip.open(f, 'rb') as fh: - return parse_fasta_str(fh.read().decode('utf-8'), split, h_func) + + with gzip.open(f, "rb") as fh: + return parse_fasta_str(fh.read().decode("utf-8"), split, h_func) else: with open(f, "r") as fh: return parse_fasta_str(fh.read(), split, h_func) From b7edac04b16ae63ba68b7afa344dd8995c81e946 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sun, 2 Jul 2023 14:30:36 -0500 Subject: [PATCH 095/298] Changing zero threshold on gapfilling --- modelseedpy/core/msgapfill.py | 8 +++++++- modelseedpy/core/msmodelutl.py | 2 ++ modelseedpy/fbapkg/gapfillingpkg.py | 10 +++++----- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 92890c0e..774c1ca8 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -67,6 +67,7 @@ def __init__( # Setting parameters for gapfilling self.lp_filename = self.last_solution = None self.model_penalty = 1 + self.default_minimum_objective = minimum_obj self.default_gapfill_models = default_gapfill_models self.default_gapfill_templates = default_gapfill_templates self.gapfill_templates_by_index, self.gapfill_models_by_index = {}, {} @@ -165,6 +166,8 @@ def run_gapfilling( self.gfpkgmgr.getpkg("GapfillingPkg").reset_original_objective() if media: self.gfpkgmgr.getpkg("KBaseMediaPkg").build_package(media) + if not minimum_obj: + minimum_obj = self.default_minimum_objective if minimum_obj: self.gfpkgmgr.getpkg("GapfillingPkg").set_min_objective(minimum_obj) @@ -230,14 +233,17 @@ def run_multi_gapfill( media_list, target=None, minimum_objectives={}, + default_minimum_objective = None, binary_check=False, prefilter=True, check_for_growth=True, ): + if not default_minimum_objective: + default_minimum_objective = self.default_minimum_objective first = True solution_dictionary = {} for item in media_list: - minimum_obj = None + minimum_obj = default_minimum_objective if item in minimum_objectives: minimum_obj = minimum_objectives[item] if first: diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 371abeb7..d24ac90f 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -88,6 +88,8 @@ def search_name(name): @staticmethod def get(model, create_if_missing=True): + if isinstance(model, MSModelUtil): + return model if model in MSModelUtil.mdlutls: return MSModelUtil.mdlutls[model] elif create_if_missing: diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index 465e5558..d066c1a1 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -25,7 +25,7 @@ ) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO base_blacklist = {} - +zero_threshold = 1e-8 class GapfillingPkg(BaseFBAPkg): """ """ @@ -532,12 +532,12 @@ def knockout_gf_reactions_outside_solution(self, solution=None, flux_values=None if rxnobj.id in self.gapfilling_penalties: if ( "reverse" in self.gapfilling_penalties[rxnobj.id] - and flux_values[rxnobj.id]["reverse"] <= Zero + and flux_values[rxnobj.id]["reverse"] <= zero_threshold ): rxnobj.lower_bound = 0 if ( "forward" in self.gapfilling_penalties[rxnobj.id] - and flux_values[rxnobj.id]["forward"] <= Zero + and flux_values[rxnobj.id]["forward"] <= zero_threshold ): rxnobj.upper_bound = 0 rxnobj.update_variable_bounds() @@ -699,7 +699,7 @@ def compute_gapfilled_solution(self, flux_values=None): for reaction in self.model.reactions: if reaction.id in self.gapfilling_penalties: if ( - flux_values[reaction.id]["forward"] > Zero + flux_values[reaction.id]["forward"] > zero_threshold and "forward" in self.gapfilling_penalties[reaction.id] ): if "added" in self.gapfilling_penalties[reaction.id]: @@ -709,7 +709,7 @@ def compute_gapfilled_solution(self, flux_values=None): logger.debug(f"Reversed gapfilled reaction: {reaction.id} >") output["reversed"][reaction.id] = ">" elif ( - flux_values[reaction.id]["reverse"] > Zero + flux_values[reaction.id]["reverse"] > zero_threshold and "reverse" in self.gapfilling_penalties[reaction.id] ): if "added" in self.gapfilling_penalties[reaction.id]: From 97b5d4fe436dc477fefbb451bffbf057660685eb Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 3 Jul 2023 00:47:30 -0500 Subject: [PATCH 096/298] Adding version printing to ModelSEEDpy so I can be sure what version of the code is running --- modelseedpy/__init__.py | 26 ++++---------------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/modelseedpy/__init__.py b/modelseedpy/__init__.py index aabb2c53..24c19a8e 100644 --- a/modelseedpy/__init__.py +++ b/modelseedpy/__init__.py @@ -11,27 +11,11 @@ from os.path import dirname as _dirname from modelseedpy.helpers import config -logging_hash = { - "debug": logging.DEBUG, - "critical": logging.CRITICAL, - "error": logging.ERROR, - "warning": logging.WARNING, - "info": logging.INFO, -} +__author__ = "Christopher Henry" +__email__ = "chenry@anl.gov" +__version__ = "0.2.2" -# Configuing modelseedpy logger -logger = logging.getLogger(__name__) -c_handler = logging.StreamHandler() -c_handler.setLevel(logging_hash[config.get("logging", "console_level")]) -c_format = logging.Formatter("%(name)s - %(levelname)s - %(message)s") -c_handler.setFormatter(c_format) -logger.addHandler(c_handler) -if config.get("logging", "log_file") == "yes": - f_handler = logging.FileHandler(config.get("logging", "filename"), mode="a") - f_handler.setLevel(logging_hash[config.get("logging", "file_level")]) - f_format = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") - f_handler.setFormatter(f_format) - logger.addHandler(f_handler) +print("modelseedpy", __version__) if sys.version_info[0] == 2: logger.warning( @@ -83,5 +67,3 @@ ) from modelseedpy.multiomics import MSExpression - -__version__ = "0.2.2" From a27ba8f7d1940435a0b966943e41d85b57ca5fe8 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 4 Jul 2023 01:01:40 -0500 Subject: [PATCH 097/298] Resetting gapfill threshold for zero --- modelseedpy/fbapkg/gapfillingpkg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index d066c1a1..715f7667 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -25,7 +25,7 @@ ) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO base_blacklist = {} -zero_threshold = 1e-8 +zero_threshold = 0 class GapfillingPkg(BaseFBAPkg): """ """ From 3dc662bc8c2852739ae58ed42c39aa5868572dab Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 4 Jul 2023 11:35:27 -0500 Subject: [PATCH 098/298] Restoring small gapfilling threshold --- modelseedpy/core/msmodelutl.py | 9 +++++---- modelseedpy/fbapkg/gapfillingpkg.py | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index d24ac90f..e1754b0d 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -101,6 +101,7 @@ def get(model, create_if_missing=True): def __init__(self, model): self.model = model self.pkgmgr = MSPackageManager.get_pkg_mgr(model) + self.wsid = None self.atputl = None self.gfutl = None self.metabolite_hash = None @@ -548,7 +549,7 @@ def test_solution(self, solution, keep_changes=False): rxnobj.upper_bound = 0 objective = tempmodel.slim_optimize() if objective < solution["minobjective"]: - logger.debug( + logger.info( rxn_id + solution[key][rxn_id] + " needed:" @@ -560,7 +561,7 @@ def test_solution(self, solution, keep_changes=False): else: removed_rxns.append(rxnobj) unneeded.append([rxn_id, solution[key][rxn_id], key]) - logger.debug( + logger.info( rxn_id + solution[key][rxn_id] + " not needed:" @@ -571,7 +572,7 @@ def test_solution(self, solution, keep_changes=False): rxnobj.lower_bound = 0 objective = tempmodel.slim_optimize() if objective < solution["minobjective"]: - logger.debug( + logger.info( rxn_id + solution[key][rxn_id] + " needed:" @@ -583,7 +584,7 @@ def test_solution(self, solution, keep_changes=False): else: removed_rxns.append(rxnobj) unneeded.append([rxn_id, solution[key][rxn_id], key]) - logger.debug( + logger.info( rxn_id + solution[key][rxn_id] + " not needed:" diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index 715f7667..d066c1a1 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -25,7 +25,7 @@ ) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO base_blacklist = {} -zero_threshold = 0 +zero_threshold = 1e-8 class GapfillingPkg(BaseFBAPkg): """ """ From 7f694bf515b900f2a8e27e9f0bf87a5100e7099b Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 4 Jul 2023 11:46:02 -0500 Subject: [PATCH 099/298] Fixing gapfilling target issue --- modelseedpy/core/msgapfill.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 774c1ca8..09ba8c5c 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -60,6 +60,7 @@ def __init__( self.gfpkgmgr = MSPackageManager.get_pkg_mgr(self.gfmodel) # Setting target from input if default_target: + self.default_target = default_target self.gfmodel.objective = self.gfmodel.problem.Objective( self.gfmodel.reactions.get_by_id(default_target).flux_expression, direction="max", @@ -164,6 +165,8 @@ def run_gapfilling( direction="max", ) self.gfpkgmgr.getpkg("GapfillingPkg").reset_original_objective() + else: + target = self.default_target if media: self.gfpkgmgr.getpkg("KBaseMediaPkg").build_package(media) if not minimum_obj: From a8563df8fd9bb31e51e93395b4f8ce420ffe4e38 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 4 Jul 2023 14:53:44 -0500 Subject: [PATCH 100/298] Fixing bug in ATP correction --- modelseedpy/core/msatpcorrection.py | 39 +++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index c848fbeb..38114ace 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -99,6 +99,7 @@ def __init__( output = self.modelutl.add_atp_hydrolysis(compartment) self.atp_hydrolysis = output["reaction"] + self.media_hash = {} self.atp_medias = [] if load_default_medias: self.load_default_medias() @@ -107,6 +108,7 @@ def __init__( self.atp_medias.append(media) else: self.atp_medias.append([media, 0.01]) + self.media_hash[media.id] = media self.forced_media = [] for media_id in forced_media: @@ -292,6 +294,7 @@ def evaluate_growth_media(self): ) self.media_gapfill_stats[media] = None + output[media.id] = solution.objective_value if ( @@ -339,16 +342,23 @@ def determine_growth_media(self, max_gapfilling=None): "new": {}, "reversed": {}, } - if self.media_gapfill_stats[media]: - gfscore = len( - self.media_gapfill_stats[media]["new"].keys() - ) + 0.5 * len(self.media_gapfill_stats[media]["reversed"].keys()) - atp_att["core_atp_gapfilling"][media.id][ - "new" - ] = self.media_gapfill_stats[media]["new"] - atp_att["core_atp_gapfilling"][media.id][ - "reversed" - ] = self.media_gapfill_stats[media]["reversed"] + if media in self.media_gapfill_stats: + if self.media_gapfill_stats[media]: + gfscore = len( + self.media_gapfill_stats[media]["new"].keys() + ) + 0.5 * len(self.media_gapfill_stats[media]["reversed"].keys()) + atp_att["core_atp_gapfilling"][media.id][ + "new" + ] = self.media_gapfill_stats[media]["new"] + atp_att["core_atp_gapfilling"][media.id][ + "reversed" + ] = self.media_gapfill_stats[media]["reversed"] + else: + gfscore = 1000 + atp_att["core_atp_gapfilling"][media.id] = { + "score": 1000, + "failed":True + } if best_score is None or gfscore < best_score: best_score = gfscore atp_att["core_atp_gapfilling"][media.id]["score"] = gfscore @@ -511,6 +521,15 @@ def build_tests(self, multiplier=None): if multiplier is None: multiplier = self.multiplier tests = [] + if "empty" in self.media_hash: + tests.append( + { + "media": self.media_hash["empty"], + "is_max_threshold": True, + "threshold": 0.00001, + "objective": self.atp_hydrolysis.id, + } + ) self.model.objective = self.atp_hydrolysis.id for media in self.selected_media: self.modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package(media) From 7cc3c550a481df80fdf3c65757c4654f60e26927 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 4 Jul 2023 15:21:26 -0500 Subject: [PATCH 101/298] Fixing ATP correction --- modelseedpy/core/msatpcorrection.py | 33 ++++++++++++++--------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 38114ace..c6cc5707 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -342,23 +342,22 @@ def determine_growth_media(self, max_gapfilling=None): "new": {}, "reversed": {}, } - if media in self.media_gapfill_stats: - if self.media_gapfill_stats[media]: - gfscore = len( - self.media_gapfill_stats[media]["new"].keys() - ) + 0.5 * len(self.media_gapfill_stats[media]["reversed"].keys()) - atp_att["core_atp_gapfilling"][media.id][ - "new" - ] = self.media_gapfill_stats[media]["new"] - atp_att["core_atp_gapfilling"][media.id][ - "reversed" - ] = self.media_gapfill_stats[media]["reversed"] - else: - gfscore = 1000 - atp_att["core_atp_gapfilling"][media.id] = { - "score": 1000, - "failed":True - } + if self.media_gapfill_stats[media]: + gfscore = len( + self.media_gapfill_stats[media]["new"].keys() + ) + 0.5 * len(self.media_gapfill_stats[media]["reversed"].keys()) + atp_att["core_atp_gapfilling"][media.id][ + "new" + ] = self.media_gapfill_stats[media]["new"] + atp_att["core_atp_gapfilling"][media.id][ + "reversed" + ] = self.media_gapfill_stats[media]["reversed"] + else: + gfscore = 1000 + atp_att["core_atp_gapfilling"][media.id] = { + "score": 1000, + "failed":True + } if best_score is None or gfscore < best_score: best_score = gfscore atp_att["core_atp_gapfilling"][media.id]["score"] = gfscore From e76d8242245c8bfdfdd38efea8107d85e5cb9348 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 4 Jul 2023 15:37:08 -0500 Subject: [PATCH 102/298] Fixing ATP correction media selection --- modelseedpy/core/msatpcorrection.py | 54 ++++------------------------- 1 file changed, 7 insertions(+), 47 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index c6cc5707..b5e59c97 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -336,14 +336,15 @@ def determine_growth_media(self, max_gapfilling=None): self.selected_media = [] best_score = None for media in self.media_gapfill_stats: - gfscore = 0 atp_att["core_atp_gapfilling"][media.id] = { "score": 0, "new": {}, "reversed": {}, } if self.media_gapfill_stats[media]: - gfscore = len( + atp_att["core_atp_gapfilling"][media.id][ + "score" + ] = len( self.media_gapfill_stats[media]["new"].keys() ) + 0.5 * len(self.media_gapfill_stats[media]["reversed"].keys()) atp_att["core_atp_gapfilling"][media.id][ @@ -353,67 +354,26 @@ def determine_growth_media(self, max_gapfilling=None): "reversed" ] = self.media_gapfill_stats[media]["reversed"] else: - gfscore = 1000 atp_att["core_atp_gapfilling"][media.id] = { "score": 1000, "failed":True } - if best_score is None or gfscore < best_score: - best_score = gfscore - atp_att["core_atp_gapfilling"][media.id]["score"] = gfscore + if best_score is None or atp_att["core_atp_gapfilling"][media.id]["score"] < best_score: + best_score = atp_att["core_atp_gapfilling"][media.id]["score"] + if self.max_gapfilling is None: self.max_gapfilling = best_score logger.info(f"max_gapfilling: {self.max_gapfilling}, best_score: {best_score}") for media in self.media_gapfill_stats: - gfscore = 0 - if self.media_gapfill_stats[media]: - gfscore = len( - self.media_gapfill_stats[media]["new"].keys() - ) + 0.5 * len(self.media_gapfill_stats[media]["reversed"].keys()) - - logger.debug(f"media gapfilling score: {media.id}: {gfscore}") - if gfscore <= self.max_gapfilling and gfscore <= ( + if atp_att["core_atp_gapfilling"][media.id]["score"] <= self.max_gapfilling and atp_att["core_atp_gapfilling"][media.id]["score"] <= ( best_score + self.gapfilling_delta ): self.selected_media.append(media) atp_att["selected_media"][media.id] = 0 self.modelutl.save_attributes(atp_att, "ATP_analysis") - if MSATPCorrection.DEBUG: - with open("atp_att_debug.json", "w") as outfile: - json.dump(atp_att, outfile) - - def determine_growth_media2(self, max_gapfilling=None): - """ - Decides which of the test media to use as growth conditions for this model - :return: - """ - - def scoring_function(media): - return len(self.media_gapfill_stats[media]["new"].keys()) + 0.5 * len( - self.media_gapfill_stats[media]["reversed"].keys() - ) - - if not max_gapfilling: - max_gapfilling = self.max_gapfilling - self.selected_media = [] - media_scores = dict( - (media, scoring_function(media)) - for media in self.media_gapfill_stats - if self.media_gapfill_stats[media] - ) - best_score = min(media_scores.values()) - if max_gapfilling is None or max_gapfilling > ( - best_score + self.gapfilling_delta - ): - max_gapfilling = best_score + self.gapfilling_delta - for media in media_scores: - score = media_scores[media] - logger.info(score, best_score, max_gapfilling) - if score <= max_gapfilling: - self.selected_media.append(media) def apply_growth_media_gapfilling(self): """ From c4565407d6420cd1e8073899d86f11ffc653a871 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 4 Jul 2023 15:40:43 -0500 Subject: [PATCH 103/298] Running black --- modelseedpy/core/msatpcorrection.py | 21 +++++++++++++-------- modelseedpy/core/msgapfill.py | 2 +- modelseedpy/core/msmodelutl.py | 2 +- modelseedpy/fbapkg/gapfillingpkg.py | 1 + 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index b5e59c97..232d4b3f 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -294,7 +294,7 @@ def evaluate_growth_media(self): ) self.media_gapfill_stats[media] = None - + output[media.id] = solution.objective_value if ( @@ -342,9 +342,7 @@ def determine_growth_media(self, max_gapfilling=None): "reversed": {}, } if self.media_gapfill_stats[media]: - atp_att["core_atp_gapfilling"][media.id][ - "score" - ] = len( + atp_att["core_atp_gapfilling"][media.id]["score"] = len( self.media_gapfill_stats[media]["new"].keys() ) + 0.5 * len(self.media_gapfill_stats[media]["reversed"].keys()) atp_att["core_atp_gapfilling"][media.id][ @@ -356,18 +354,25 @@ def determine_growth_media(self, max_gapfilling=None): else: atp_att["core_atp_gapfilling"][media.id] = { "score": 1000, - "failed":True + "failed": True, } - if best_score is None or atp_att["core_atp_gapfilling"][media.id]["score"] < best_score: + if ( + best_score is None + or atp_att["core_atp_gapfilling"][media.id]["score"] < best_score + ): best_score = atp_att["core_atp_gapfilling"][media.id]["score"] - + if self.max_gapfilling is None: self.max_gapfilling = best_score logger.info(f"max_gapfilling: {self.max_gapfilling}, best_score: {best_score}") for media in self.media_gapfill_stats: - if atp_att["core_atp_gapfilling"][media.id]["score"] <= self.max_gapfilling and atp_att["core_atp_gapfilling"][media.id]["score"] <= ( + if atp_att["core_atp_gapfilling"][media.id][ + "score" + ] <= self.max_gapfilling and atp_att["core_atp_gapfilling"][media.id][ + "score" + ] <= ( best_score + self.gapfilling_delta ): self.selected_media.append(media) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 09ba8c5c..4448b1e7 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -236,7 +236,7 @@ def run_multi_gapfill( media_list, target=None, minimum_objectives={}, - default_minimum_objective = None, + default_minimum_objective=None, binary_check=False, prefilter=True, check_for_growth=True, diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index e1754b0d..ac232de8 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -89,7 +89,7 @@ def search_name(name): @staticmethod def get(model, create_if_missing=True): if isinstance(model, MSModelUtil): - return model + return model if model in MSModelUtil.mdlutls: return MSModelUtil.mdlutls[model] elif create_if_missing: diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index d066c1a1..74a097df 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -27,6 +27,7 @@ base_blacklist = {} zero_threshold = 1e-8 + class GapfillingPkg(BaseFBAPkg): """ """ From c8b67b563862bdc36a2066740880dc6921cc3923 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Tue, 4 Jul 2023 18:01:40 -0500 Subject: [PATCH 104/298] minor --- modelseedpy/core/msatpcorrection.py | 14 +++++----- modelseedpy/core/msgapfill.py | 12 +++------ modelseedpy/core/msmodelutl.py | 42 +++++++---------------------- 3 files changed, 21 insertions(+), 47 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 46bd32ea..63b6933d 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -413,15 +413,15 @@ def apply_growth_media_gapfilling(self): """ self.cumulative_core_gapfilling = ( [] - ) # TODO: In case someone runs ATP correction twice with different parameters, before resetting this, maybe check if any of these reactions are already in the model and remove them so we're starting fresh??? + ) + # TODO: In case someone runs ATP correction twice with different parameters, + # before resetting this, maybe check if any of these reactions are already in + # the model and remove them so we're starting fresh??? for media in self.selected_media: - if ( - media in self.media_gapfill_stats - and self.media_gapfill_stats[media] - and MSGapfill.gapfill_count(self.media_gapfill_stats[media]) > 0 - ): + stats = self.media_gapfill_stats.get(media, None) + if stats is not None and MSGapfill.gapfill_count(self.media_gapfill_stats[media]) > 0: self.msgapfill.integrate_gapfill_solution( - self.media_gapfill_stats[media], + stats, self.cumulative_core_gapfilling, link_gaps_to_objective=False, ) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 92890c0e..68b9ba9a 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -15,6 +15,7 @@ class MSGapfill: + @staticmethod def gapfill_count(solution): total = 0 @@ -184,12 +185,7 @@ def run_gapfilling( # Running gapfilling and checking solution sol = self.gfmodel.optimize() - logger.debug( - "gapfill solution objective value %f (%s) for media %s", - sol.objective_value, - sol.status, - media, - ) + logger.debug(f"gapfill solution objective value {sol.objective_value} ({sol.status}) for media {media}") if sol.status != "optimal": logger.warning("No solution found for %s", media) return None @@ -212,7 +208,7 @@ def run_gapfilling( ) return None - # Running binary check to reduce solution to minimal reaction soltuion + # Running binary check to reduce solution to minimal reaction solution if binary_check: self.last_solution = self.gfpkgmgr.getpkg( "GapfillingPkg" @@ -221,7 +217,7 @@ def run_gapfilling( # Setting last solution data self.last_solution["media"] = media self.last_solution["target"] = target - self.last_solution["minobjective"] = minimum_obj + self.last_solution["minobjective"] = self.gfpkgmgr.getpkg("GapfillingPkg").parameters['minimum_obj'] self.last_solution["binary_check"] = binary_check return self.last_solution diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 371abeb7..031a9e58 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -538,55 +538,33 @@ def test_solution(self, solution, keep_changes=False): objective = tempmodel.slim_optimize() logger.debug("Starting objective:" + str(objective)) types = ["new", "reversed"] + for key in types: for rxn_id in solution[key]: rxnobj = tempmodel.reactions.get_by_id(rxn_id) - if solution[key][rxn_id] == ">": + solution_key_rxn_id = solution[key][rxn_id] # could call this direction instead but wasn't 100% sure + if solution_key_rxn_id == ">": original_bound = rxnobj.upper_bound rxnobj.upper_bound = 0 objective = tempmodel.slim_optimize() if objective < solution["minobjective"]: - logger.debug( - rxn_id - + solution[key][rxn_id] - + " needed:" - + str(objective) - + " with min obj:" - + str(solution["minobjective"]) - ) + logger.debug(f'{rxn_id}{solution_key_rxn_id} needed:{objective} with min obj:{solution["minobjective"]}') rxnobj.upper_bound = original_bound else: removed_rxns.append(rxnobj) - unneeded.append([rxn_id, solution[key][rxn_id], key]) - logger.debug( - rxn_id - + solution[key][rxn_id] - + " not needed:" - + str(objective) - ) + unneeded.append([rxn_id, solution_key_rxn_id, key]) + logger.debug(f'{rxn_id}{solution_key_rxn_id} not needed:{objective}') else: original_bound = rxnobj.lower_bound rxnobj.lower_bound = 0 objective = tempmodel.slim_optimize() if objective < solution["minobjective"]: - logger.debug( - rxn_id - + solution[key][rxn_id] - + " needed:" - + str(objective) - + " with min obj:" - + str(solution["minobjective"]) - ) + logger.debug(f'{rxn_id}{solution_key_rxn_id} needed:{objective} with min obj:{solution["minobjective"]}') rxnobj.lower_bound = original_bound else: removed_rxns.append(rxnobj) - unneeded.append([rxn_id, solution[key][rxn_id], key]) - logger.debug( - rxn_id - + solution[key][rxn_id] - + " not needed:" - + str(objective) - ) + unneeded.append([rxn_id, solution_key_rxn_id, key]) + logger.debug(f'{rxn_id}{solution_key_rxn_id} not needed:{objective}') if keep_changes: tempmodel.remove_reactions(removed_rxns) for items in unneeded: @@ -726,7 +704,7 @@ def test_single_condition(self, condition, apply_condition=True, model=None): if model.solver.status != "optimal": self.printlp(condition["media"].id + "-Testing-Infeasible.lp") logger.critical( - ondition["media"].id + condition["media"].id + "testing leads to infeasible problem. LP file printed to debug!" ) return False From 1851286a03871a758d67e81750dfd4392d6f6da7 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Thu, 6 Jul 2023 12:20:51 -0500 Subject: [PATCH 105/298] added e0 as extracell search for cobrapy --- .gitignore | 2 ++ modelseedpy/__init__.py | 6 +++++ tests/core/test_msgapfill.py | 50 ------------------------------------ 3 files changed, 8 insertions(+), 50 deletions(-) diff --git a/.gitignore b/.gitignore index 6390162b..5589324a 100644 --- a/.gitignore +++ b/.gitignore @@ -131,3 +131,5 @@ dmypy.json # Pyre type checker .pyre/ + +*.lp \ No newline at end of file diff --git a/modelseedpy/__init__.py b/modelseedpy/__init__.py index 24c19a8e..1973b2a3 100644 --- a/modelseedpy/__init__.py +++ b/modelseedpy/__init__.py @@ -5,6 +5,7 @@ # set the warning format to be on a single line import sys import logging +import cobra import warnings as _warnings from os import name as _name from os.path import abspath as _abspath @@ -15,6 +16,8 @@ __email__ = "chenry@anl.gov" __version__ = "0.2.2" +logger = logging.getLogger(__name__) + print("modelseedpy", __version__) if sys.version_info[0] == 2: @@ -25,6 +28,9 @@ "still work but we will no longer actively maintain Python 2 support." ) +if 'e0' not in cobra.medium.annotations.compartment_shortlist['e']: + cobra.medium.annotations.compartment_shortlist['e'].append('e0') + import modelseedpy from modelseedpy.core import ( RastClient, diff --git a/tests/core/test_msgapfill.py b/tests/core/test_msgapfill.py index 1ee694bd..622a0924 100644 --- a/tests/core/test_msgapfill.py +++ b/tests/core/test_msgapfill.py @@ -1,54 +1,4 @@ # -*- coding: utf-8 -*- -""" -from glob import glob -os.environ["HOME"] = 'C:\\Users\\Andrew Freiburger\\Dropbox\\My PC (DESKTOP-M302P50)\\Documents\\UVic Civil Engineering\\Internships\\Agronne\\cobrakbase' -import cobrakbase -token = 'xx' -kbase = cobrakbase.KBaseAPI(token) -import re - -# define the example individual model and associated API media package -model = kbase.get_from_ws('e_coli_core.kb', 95098) -model.solver = 'optlang-cplex' - -# import the modelseedpy packages -import modelseedpy -from modelseedpy.core.msgapfill import MSGapfill -gapfill = MSGapfill(model) - -def test_init(): - assert type(gapfill.model) is cobrakbase.core.kbasefba.fbamodel.FBAModel - assert type(gapfill.blacklist) is list - assert type(gapfill.solutions) is dict - -def test_run_gapfilling_and_integrate_gapfill_solution(): - solutions = gapfill.run_gapfilling() - - # test that the objective expression is correctly set - if solutions is not None: - assert type(solutions) is dict - - # verify the integrate_gapfill_solution function - model_2 = gapfill.integrate_gapfill_solution(solutions) - assert type(model_2) is cobrakbase.core.kbasefba.fbamodel.FBAModel - - for reaction in solutions['reversed']: - if solution["reversed"][reaction] == ">": - assert reaction.upper_bound == 100 - else: - assert reaction.lower_bound == -100 - - for reaction in solutions['new']: - if solution["new"][reaction] == ">": - assert reaction.upper_bound == 100 - assert reaction.lower_bound == 0 - else: - assert reaction.upper_bound == 0 - assert reaction.lower_bound == -100 - -def test_gapfill(): - pass -""" import os import pytest import json From 7e0e21632d2580c7d3ab5337a06c632b232508c1 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Thu, 6 Jul 2023 12:21:16 -0500 Subject: [PATCH 106/298] black --- modelseedpy/__init__.py | 4 ++-- modelseedpy/core/msatpcorrection.py | 9 +++++---- modelseedpy/core/msgapfill.py | 9 ++++++--- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/modelseedpy/__init__.py b/modelseedpy/__init__.py index 1973b2a3..665f000c 100644 --- a/modelseedpy/__init__.py +++ b/modelseedpy/__init__.py @@ -28,8 +28,8 @@ "still work but we will no longer actively maintain Python 2 support." ) -if 'e0' not in cobra.medium.annotations.compartment_shortlist['e']: - cobra.medium.annotations.compartment_shortlist['e'].append('e0') +if "e0" not in cobra.medium.annotations.compartment_shortlist["e"]: + cobra.medium.annotations.compartment_shortlist["e"].append("e0") import modelseedpy from modelseedpy.core import ( diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 2f17d576..727c3e33 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -385,15 +385,16 @@ def apply_growth_media_gapfilling(self): Applies the gapfilling to all selected growth media :return: """ - self.cumulative_core_gapfilling = ( - [] - ) + self.cumulative_core_gapfilling = [] # TODO: In case someone runs ATP correction twice with different parameters, # before resetting this, maybe check if any of these reactions are already in # the model and remove them so we're starting fresh??? for media in self.selected_media: stats = self.media_gapfill_stats.get(media, None) - if stats is not None and MSGapfill.gapfill_count(self.media_gapfill_stats[media]) > 0: + if ( + stats is not None + and MSGapfill.gapfill_count(self.media_gapfill_stats[media]) > 0 + ): self.msgapfill.integrate_gapfill_solution( stats, self.cumulative_core_gapfilling, diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index c6dd0a17..cb0824a4 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -15,7 +15,6 @@ class MSGapfill: - @staticmethod def gapfill_count(solution): total = 0 @@ -191,7 +190,9 @@ def run_gapfilling( # Running gapfilling and checking solution sol = self.gfmodel.optimize() - logger.debug(f"gapfill solution objective value {sol.objective_value} ({sol.status}) for media {media}") + logger.debug( + f"gapfill solution objective value {sol.objective_value} ({sol.status}) for media {media}" + ) if sol.status != "optimal": logger.warning("No solution found for %s", media) return None @@ -223,7 +224,9 @@ def run_gapfilling( # Setting last solution data self.last_solution["media"] = media self.last_solution["target"] = target - self.last_solution["minobjective"] = self.gfpkgmgr.getpkg("GapfillingPkg").parameters['minimum_obj'] + self.last_solution["minobjective"] = self.gfpkgmgr.getpkg( + "GapfillingPkg" + ).parameters["minimum_obj"] self.last_solution["binary_check"] = binary_check return self.last_solution From afcaa7a2fe060f58195994638381090118b32c85 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Thu, 6 Jul 2023 12:33:44 -0500 Subject: [PATCH 107/298] pre-commit --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5589324a..d5d6d7bd 100644 --- a/.gitignore +++ b/.gitignore @@ -132,4 +132,4 @@ dmypy.json # Pyre type checker .pyre/ -*.lp \ No newline at end of file +*.lp From 38c5a7a48d5cc3567b179a5b9530b6506c2f7e17 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 6 Jul 2023 23:38:21 -0500 Subject: [PATCH 108/298] Fixing threshold and adding empty media and fixing thresholds --- modelseedpy/core/msatpcorrection.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 232d4b3f..d22e816e 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -39,7 +39,7 @@ "Akg.O2": 2, "LLac.O2": 2, "Dlac.O2": 2, - "For.O2": 2, + "For.O2": 1.875, "For.NO3": 1.5, "Pyr.NO": 2.5, "Pyr.NO2": 2.5, @@ -109,7 +109,12 @@ def __init__( else: self.atp_medias.append([media, 0.01]) self.media_hash[media.id] = media - + if "empty" not in self.media_hash: + media = MSMedia.from_dict({}) + media.id = "empty" + media.name = "empty" + self.media_hash[media.id] = media + self.forced_media = [] for media_id in forced_media: for media in self.atp_medias: @@ -500,11 +505,14 @@ def build_tests(self, multiplier=None): obj_value = self.model.slim_optimize() logger.debug(f"{media.name} = {obj_value};{multiplier}") logger.debug("Test:" + media.id + ";" + str(multiplier * obj_value)) + threshold = multiplier * obj_value + if threshold == 0: + threshold += 0.00001 tests.append( { "media": media, "is_max_threshold": True, - "threshold": multiplier * obj_value, + "threshold": threshold, "objective": self.atp_hydrolysis.id, } ) From 787c6bec657760a1ced0845ff8512c4922d042b1 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 6 Jul 2023 23:59:47 -0500 Subject: [PATCH 109/298] Fixing empty media --- modelseedpy/core/msatpcorrection.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index d22e816e..653de451 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -499,6 +499,11 @@ def build_tests(self, multiplier=None): "objective": self.atp_hydrolysis.id, } ) + atp_att["tests"]["empty"] = { + "threshold": 0.00001, + "objective": self.atp_hydrolysis.id, + } + self.model.objective = self.atp_hydrolysis.id for media in self.selected_media: self.modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package(media) From 2f8aeeeaf1756842f880afde103f416404ce6698 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Fri, 7 Jul 2023 11:01:24 -0500 Subject: [PATCH 110/298] Fixing git ignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index d5d6d7bd..87619079 100644 --- a/.gitignore +++ b/.gitignore @@ -132,4 +132,7 @@ dmypy.json # Pyre type checker .pyre/ +.pydevproject +.settings/* +*data/* *.lp From 91ac4998cd78a083f98131fb49a5aa2e705c6db5 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Fri, 7 Jul 2023 23:05:57 -0500 Subject: [PATCH 111/298] Making thresholds on tests more flexible, including supporting media specific multipliers for the threshold --- modelseedpy/core/msatpcorrection.py | 34 +++++++++++++++++++---------- modelseedpy/core/msbuilder.py | 7 ------ 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 31cb7905..aa10acac 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -47,6 +47,11 @@ "Pyr.SO4": 2.5, } +default_threshold_multipiers = { + "Glc": 2, + "default":1.2, +} + class MSATPCorrection: @@ -287,11 +292,11 @@ def evaluate_growth_media(self): media_list = [] min_objectives = {} for media, minimum_obj in self.atp_medias: - logger.info("evaluate media %s", media) + logger.debug("evaluate media %s", media) pkgmgr.getpkg("KBaseMediaPkg").build_package(media) - logger.info("model.medium %s", self.model.medium) + logger.debug("model.medium %s", self.model.medium) solution = self.model.optimize() - logger.info( + logger.debug( "evaluate media %s - %f (%s)", media.id, solution.objective_value, @@ -467,7 +472,7 @@ def restore_noncore_reactions(self, noncore=True, othercompartment=True): reaction.lower_bound = self.original_bounds[reaction.id][0] reaction.upper_bound = self.original_bounds[reaction.id][1] - def build_tests(self, multiplier=None): + def build_tests(self,multiplier_hash_override={}): """Build tests based on ATP media evaluations Parameters @@ -483,13 +488,16 @@ def build_tests(self, multiplier=None): Raises ------ """ + #Applying threshold multiplier + for key in default_threshold_multipiers: + if key not in multiplier_hash_override: + multiplier_hash_override[key] = default_threshold_multipiers[key] + #Initialzing atp test attributes atp_att = self.modelutl.get_attributes( "ATP_analysis", {"tests": {}, "selected_media": {}, "core_atp_gapfilling": {}}, ) - - if multiplier is None: - multiplier = self.multiplier + #Initializing tests and adding empty media every time tests = [] if "empty" in self.media_hash: tests.append( @@ -504,13 +512,18 @@ def build_tests(self, multiplier=None): "threshold": 0.00001, "objective": self.atp_hydrolysis.id, } - + #Setting objective to ATP hydrolysis self.model.objective = self.atp_hydrolysis.id for media in self.selected_media: + #Setting multiplier for test threshold + multiplier = multiplier_hash_override["default"] + if media.id in multiplier_hash_override: + multiplier = multiplier_hash_override[media.id] + #Constraining model exchanges for media self.modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package(media) + #Computing core ATP production obj_value = self.model.slim_optimize() logger.debug(f"{media.name} = {obj_value};{multiplier}") - logger.debug("Test:" + media.id + ";" + str(multiplier * obj_value)) threshold = multiplier * obj_value if threshold == 0: threshold += 0.00001 @@ -527,9 +540,8 @@ def build_tests(self, multiplier=None): "threshold": multiplier * obj_value, "objective": self.atp_hydrolysis.id, } - + #Saving test attributes to the model self.modelutl.save_attributes(atp_att, "ATP_analysis") - return tests def run_atp_correction(self): diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index e376ae0b..3a78188a 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -850,22 +850,15 @@ def build( complex_groups = self.build_complex_groups( self.reaction_to_complex_sets.values() ) - if "bio1" in cobra_model.reactions: - print("1:Biomass present!!") metabolic_reactions = self.build_metabolic_reactions() cobra_model.add_reactions(metabolic_reactions) - if "bio1" in cobra_model.reactions: - print("2:Biomass present!!") non_metabolic_reactions = self.build_non_metabolite_reactions( cobra_model, allow_all_non_grp_reactions ) cobra_model.add_reactions(non_metabolic_reactions) - if "bio1" in cobra_model.reactions: - print("3:Biomass present!!") cobra_model.add_groups(list(complex_groups.values())) self.add_exchanges_to_model(cobra_model) - print("Adding biomass!!") biomass_reactions = [] for rxn_biomass in self.template.biomasses: reaction = rxn_biomass.build_biomass( From 55ae63f60d3039014187177eebfd6a8048455e67 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sun, 9 Jul 2023 23:24:28 -0500 Subject: [PATCH 112/298] Improving commenting and improving multi gapfilling --- modelseedpy/core/msatpcorrection.py | 2 +- modelseedpy/core/msgapfill.py | 46 +++++++++++++++++++++++++++-- modelseedpy/core/msmodelutl.py | 11 +++---- 3 files changed, 50 insertions(+), 9 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index aa10acac..dd381b18 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -408,7 +408,7 @@ def apply_growth_media_gapfilling(self): self.msgapfill.integrate_gapfill_solution( stats, self.cumulative_core_gapfilling, - link_gaps_to_objective=False, + link_gaps_to_objective=False ) core_gf = { "count": len(self.cumulative_core_gapfilling), diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index cb0824a4..cc17df98 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -10,7 +10,7 @@ logger = logging.getLogger(__name__) logger.setLevel( - logging.WARNING + logging.INFO#WARNING ) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO @@ -158,6 +158,22 @@ def run_gapfilling( prefilter=True, check_for_growth=True, ): + """Run gapfilling on a single media condition to force the model to achieve a nonzero specified objective + Parameters + ---------- + media : MSMedia + Media in which the model should be gapfilled + target : string + Name or expression describing the reaction or combination of reactions to the optimized + minimum_obj : double + Value to use for the minimal objective threshold that the model must be gapfilled to achieve + binary_check : bool + Indicates if the solution should be checked to ensure it is minimal in the number of reactions involved + prefilter : bool + Indicates if the gapfilling database should be prefiltered using the tests provided in the MSGapfill constructor before running gapfilling + check_for_growth : bool + Indicates if the model should be checked to ensure that the resulting gapfilling solution produces a nonzero objective + """ # Setting target and media if specified if target: self.gfmodel.objective = self.gfmodel.problem.Objective( @@ -240,6 +256,25 @@ def run_multi_gapfill( prefilter=True, check_for_growth=True, ): + """Run gapfilling across an array of media conditions ultimately using different integration policies: simultaneous gapfilling, independent gapfilling, cumulative gapfilling + Parameters + ---------- + media_list : [MSMedia] + List of the medias in which the model should be gapfilled + target : string + Name or expression describing the reaction or combination of reactions to the optimized + minimum_objectives : {string - media ID : double - minimum objective value} + Media-specific minimal objective thresholds that the model must be gapfilled to achieve + default_minimum_objective : double + Default value to use for the minimal objective threshold that the model must be gapfilled to achieve + binary_check : bool + Indicates if the solution should be checked to ensure it is minimal in the number of reactions involved + prefilter : bool + Indicates if the gapfilling database should be prefiltered using the tests provided in the MSGapfill constructor before running gapfilling + check_for_growth : bool + Indicates if the model should be checked to ensure that the resulting gapfilling solution produces a nonzero objective + """ + if not default_minimum_objective: default_minimum_objective = self.default_minimum_objective first = True @@ -250,11 +285,11 @@ def run_multi_gapfill( minimum_obj = minimum_objectives[item] if first: solution_dictionary[item] = self.run_gapfilling( - item, target, minimum_obj, binary_check, True, True + item, target, minimum_obj, binary_check, prefilter, check_for_growth ) else: solution_dictionary[item] = self.run_gapfilling( - item, None, minimum_obj, binary_check, False, True + item, None, minimum_obj, binary_check, False, check_for_growth ) false = False return solution_dictionary @@ -303,6 +338,8 @@ def integrate_gapfill_solution( cumulative_solution.append([rxn_id, "<"]) rxn.upper_bound = 0 rxn.lower_bound = -100 + + #Sometimes for whatever reason, the solution includes useless reactions that should be stripped out before saving the final model unneeded = self.mdlutl.test_solution( solution, keep_changes=True ) # Strips out unneeded reactions - which undoes some of what is done above @@ -311,8 +348,11 @@ def integrate_gapfill_solution( if item[0] == oitem[0] and item[1] == oitem[1]: cumulative_solution.remove(oitem) break + #Adding the gapfilling solution data to the model, which is needed for saving the model in KBase self.mdlutl.add_gapfilling(solution) + #Testing which gapfilled reactions are needed to produce each reactant in the objective function if link_gaps_to_objective: + logger.info("Gapfilling sensitivity analysis running on succesful run in "+solution["media"]+" for target "+solution["target"]) gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) if solution["media"] not in gf_sensitivity: gf_sensitivity[solution["media"]] = {} diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index ac232de8..3d40c60b 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -285,12 +285,13 @@ def get_attributes(self, key=None, default=None): self.attributes[key] = default return self.attributes[key] - def save_attributes(self, value, key=None): + def save_attributes(self, value=None, key=None): attributes = self.get_attributes() - if key: - attributes[key] = value - else: - self.attributes = value + if value: + if key: + attributes[key] = value + else: + self.attributes = value if hasattr(self.model, "attributes"): self.model.attributes = self.attributes From 32c590f45689a673d9acc91822a3af2418a8e70d Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 10 Jul 2023 00:46:13 -0500 Subject: [PATCH 113/298] Fixing bug in log message --- modelseedpy/core/msgapfill.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index cc17df98..10bcb9a2 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -352,7 +352,7 @@ def integrate_gapfill_solution( self.mdlutl.add_gapfilling(solution) #Testing which gapfilled reactions are needed to produce each reactant in the objective function if link_gaps_to_objective: - logger.info("Gapfilling sensitivity analysis running on succesful run in "+solution["media"]+" for target "+solution["target"]) + logger.info("Gapfilling sensitivity analysis running on succesful run in "+solution["media"].id+" for target "+solution["target"]) gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) if solution["media"] not in gf_sensitivity: gf_sensitivity[solution["media"]] = {} From 19f9f58653ff55a0a089c604de452b8761354248 Mon Sep 17 00:00:00 2001 From: jplfaria Date: Mon, 10 Jul 2023 12:47:03 -0500 Subject: [PATCH 114/298] Update atp_medias.tsv adding methanol and methylamines medias --- modelseedpy/data/atp_medias.tsv | 64 +++++++++++++++++---------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/modelseedpy/data/atp_medias.tsv b/modelseedpy/data/atp_medias.tsv index 0bf5e56c..53d15048 100644 --- a/modelseedpy/data/atp_medias.tsv +++ b/modelseedpy/data/atp_medias.tsv @@ -1,30 +1,34 @@ -seed Glc.O2 Ac.O2 Etho.O2 Pyr.O2 Glyc.O2 Fum.O2 Succ.O2 Akg.O2 LLac.O2 Dlac.O2 For.O2 Glc Ac Etho Pyr Glyc Fum Succ Akg Llac Dlac For mal-L For.NO2 For.NO3 For.NO Pyr.NO2 Pyr.NO3 Pyr.NO Ac.NO2 Ac.NO3 Ac.NO Glc.DMSO Glc.TMAO Pyr.DMSO Pyr.TMAO Pyr.SO4 Pyr.SO3 H2.CO2 H2.Ac For.SO4.H2 LLac.SO4.H2 For.SO4 LLac.SO4 H2.SO4 empty Light ANME Methane -EX_cpd00027_e0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd00024_e0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd00106_e0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd00036_e0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd00137_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd00130_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd00159_e0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 -EX_cpd00221_e0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd00020_e0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd00100_e0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd00363_e0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd00029_e0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -EX_cpd00047_e0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 -EX_cpd00204_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd00011_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 -EX_cpd00007_e0 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd11640_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 1000 1000 1000 0 0 1000 0 0 0 0 -EX_cpd00418_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 0 1000 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd00209_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 0 1000 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd00075_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 0 1000 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd00659_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd00528_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd08021_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd00811_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd00048_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 0 0 1000 1000 1000 1000 1000 0 0 0 0 -EX_cpd00081_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 -EX_cpd11632_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 -EX_cpd08701_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 -EX_cpd01024_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 +seed Glc.O2 Ac.O2 Etho.O2 Pyr.O2 Glyc.O2 Fum.O2 Succ.O2 Akg.O2 LLac.O2 Dlac.O2 For.O2 Glc Ac Etho Pyr Glyc Fum Succ Akg Llac Dlac For mal-L For.NO2 For.NO3 For.NO Pyr.NO2 Pyr.NO3 Pyr.NO Ac.NO2 Ac.NO3 Ac.NO Glc.DMSO Glc.TMAO Pyr.DMSO Pyr.TMAO Pyr.SO4 Pyr.SO3 H2.CO2 H2.Ac For.SO4.H2 LLac.SO4.H2 For.SO4 LLac.SO4 H2.SO4 empty Light ANME Methane Methanol Methanol.H2 Methanamine.H2 Dimethylamine.H2 Trimethylamine.H2 +EX_cpd00027_e0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00024_e0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00106_e0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00036_e0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00137_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00130_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00159_e0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 +EX_cpd00221_e0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00020_e0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00100_e0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00363_e0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00029_e0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00047_e0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00204_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00011_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00007_e0 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd11640_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 1000 1000 1000 0 0 1000 0 0 0 0 0 1000 1000 1000 1000 +EX_cpd00418_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 0 1000 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00209_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 0 1000 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00075_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 0 1000 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00659_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00528_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd08021_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00811_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd00048_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 0 0 1000 1000 1000 1000 1000 0 0 0 0 0 0 0 0 0 +EX_cpd00081_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +EX_cpd11632_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 +EX_cpd08701_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 0 0 0 0 0 +EX_cpd01024_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 +EX_cpd00116_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 +EX_cpd00187_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 +EX_cpd00425_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 +EX_cpd00441_e0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 From 432aaed3f70d5f3239d6c04ab1d19a54c4f4cb63 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Mon, 10 Jul 2023 13:38:38 -0500 Subject: [PATCH 115/298] build biomass index fix --- modelseedpy/core/msbuilder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index e376ae0b..f3514f7f 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -869,7 +869,7 @@ def build( biomass_reactions = [] for rxn_biomass in self.template.biomasses: reaction = rxn_biomass.build_biomass( - cobra_model, "0", biomass_classic, biomass_gc + cobra_model, index, biomass_classic, biomass_gc ) for m in reaction.metabolites: if "modelseed_template_id" in m.notes: From 239ac6eb8f1e77adf593dbd55a30cc1ca5a71c5d Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 12 Jul 2023 14:04:13 -0500 Subject: [PATCH 116/298] Fixing various media and element package --- modelseedpy/core/msmedia.py | 14 +++++++++++++- modelseedpy/core/msmodelutl.py | 4 ---- modelseedpy/fbapkg/basefbapkg.py | 9 +++++++-- modelseedpy/fbapkg/elementuptakepkg.py | 19 ++++++++++++++----- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/modelseedpy/core/msmedia.py b/modelseedpy/core/msmedia.py index 488aad57..aeac7092 100644 --- a/modelseedpy/core/msmedia.py +++ b/modelseedpy/core/msmedia.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import logging from cobra.core.dictlist import DictList +from builtins import None logger = logging.getLogger(__name__) @@ -21,7 +22,18 @@ def maxFlux(self): def minFlux(self): # TODO: will be removed later just for old methods return -self.upper_bound - + + def get_mdl_exchange_hash(self,model_or_mdlutl): + modelutl = model_or_mdlutl + if not isinstance(model_or_mdlutl, MSModelUtil): + modelutl = MSModelUtil.get(model_or_mdlutl) + mets = modelutl.find_met(self.id) + output = {} + exchange_hash = modelutl.exchange_hash() + for met in mets: + if met in exchange_hash: + output[met] = exchange_hash[met] + return output class MSMedia: def __init__(self, media_id, name=""): diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 3d40c60b..9c69a51f 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -1070,14 +1070,10 @@ def run_biomass_dependency_test( ): tempmodel.objective = original_objective objective = tempmodel.slim_optimize() - with open("FlexBiomass2.lp", "w") as out: - out.write(str(tempmodel.solver)) if objective > 0: target_rxn.lower_bound = 0.1 tempmodel.objective = min_flex_obj solution = tempmodel.optimize() - with open("FlexBiomass3.lp", "w") as out: - out.write(str(tempmodel.solver)) biocpds = [] for reaction in tempmodel.reactions: if reaction.id[0:5] == "FLEX_" and ( diff --git a/modelseedpy/fbapkg/basefbapkg.py b/modelseedpy/fbapkg/basefbapkg.py index 662696f3..77effe32 100644 --- a/modelseedpy/fbapkg/basefbapkg.py +++ b/modelseedpy/fbapkg/basefbapkg.py @@ -33,8 +33,13 @@ class BaseFBAPkg: def __init__( self, model, name, variable_types={}, constraint_types={}, reaction_types={} ): - self.model = model - self.modelutl = MSModelUtil.get(model) + if isinstance(model, MSModelUtil): + self.model = model.model + self.modelutl = model + else: + self.model = model + self.modelutl = MSModelUtil.get(model) + self.name = name self.pkgmgr = MSPackageManager.get_pkg_mgr(model) diff --git a/modelseedpy/fbapkg/elementuptakepkg.py b/modelseedpy/fbapkg/elementuptakepkg.py index 66e01035..4eb27e44 100644 --- a/modelseedpy/fbapkg/elementuptakepkg.py +++ b/modelseedpy/fbapkg/elementuptakepkg.py @@ -16,21 +16,30 @@ def __init__(self, model): {"elements": "string"}, ) - def build_package(self, element_limits): + def build_package(self, element_limits,exception_compounds=[],exception_reactions=[]): + #Converting exception compounds list into exception reaction list + exchange_hash = self.modelutl.exchange_hash() + for met in exception_compounds: + if met in exchange_hash: + exception_reactions.append(exchange_hash[met]) + #Now building or rebuilding constraints for element in element_limits: if element not in self.variables["elements"]: self.build_variable(element, element_limits[element]) - self.build_constraint(element) + for element in element_limits: + #This call will first remove existing constraints then build the new constraint + self.build_constraint(element,exception_reactions) def build_variable(self, element, limit): return BaseFBAPkg.build_variable( self, "elements", 0, limit, "continuous", element ) - def build_constraint(self, element): + def build_constraint(self, element,exception_reactions): coef = {self.variables["elements"][element]: -1} - for reaction in self.model.reactions: - if reaction.id[0:3] == "EX_": + rxnlist = self.modelutl.exchange_list() + for reaction in rxnlist: + if reaction not in exception_reactions: total = 0 for metabolite in reaction.metabolites: elements = metabolite.elements From 3f25882b8646b4f777591c5fb1a7e818c0f7aa36 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 12 Jul 2023 14:07:18 -0500 Subject: [PATCH 117/298] Fixing weird import --- modelseedpy/core/msmedia.py | 1 - 1 file changed, 1 deletion(-) diff --git a/modelseedpy/core/msmedia.py b/modelseedpy/core/msmedia.py index aeac7092..48fa90ad 100644 --- a/modelseedpy/core/msmedia.py +++ b/modelseedpy/core/msmedia.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- import logging from cobra.core.dictlist import DictList -from builtins import None logger = logging.getLogger(__name__) From b0311a317be2de2a77b008d1585deaed4e1727d0 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 12 Jul 2023 23:06:14 -0500 Subject: [PATCH 118/298] Improving phenotype simulations and gapfilling --- modelseedpy/core/msgrowthphenotypes.py | 310 +++++++++++++++++++------ 1 file changed, 238 insertions(+), 72 deletions(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 6c30bb2a..13d540b1 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -9,7 +9,9 @@ from modelseedpy.core.msgapfill import MSGapfill logger = logging.getLogger(__name__) - +logger.setLevel( + logging.INFO +) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO class MSGrowthPhenotype: def __init__( @@ -33,102 +35,186 @@ def __init__( self.additional_compounds = additional_compounds self.parent = parent - def build_media(self): + def build_media(self,include_base_media=True): + """Builds media object to use when simulating the phenotype + Parameters + ---------- + include_base_media : bool + Indicates whether to include the base media for the phenotype set in the formulation + """ cpd_hash = {} for cpd in self.additional_compounds: cpd_hash[cpd] = 100 full_media = MSMedia.from_dict(cpd_hash) - if self.media != None: + if self.media: full_media.merge(self.media, overwrite_overlap=False) - if self.parent != None and self.parent.base_media != None: - full_media.merge(parent.base_media, overwrite_overlap=False) + if full_media: + if self.parent and self.parent.base_media: + full_media.merge(parent.base_media, overwrite_overlap=False) return full_media def simulate( self, - modelutl, - growth_threshold=0.001, + model_or_modelutl, + objective, + growth_multiplier=10, add_missing_exchanges=False, save_fluxes=False, pfba=False, ): - if not isinstance(modelutl, MSModelUtil): - modelutl = MSModelUtil(modelutl) - media = self.build_media() - output = {"growth": None, "class": None, "missing_transports": []} + """Simulates a single phenotype + Parameters + ---------- + model_or_modelutl : Model | MSModelUtl + Model to use to run the simulations + add_missing_exchanges : bool + Boolean indicating if exchanges for compounds mentioned explicitly in phenotype media should be added to the model automatically + growth_multiplier : double + Indicates a multiplier to use for positive growth above the growth on baseline media + save_fluxes : bool + Indicates if the fluxes should be saved and returned with the results + pfba : bool + Runs pFBA to compute fluxes after initially solving for growth + """ + modelutl = model_or_mdlutl + if not isinstance(model_or_mdlutl, MSModelUtil): + modelutl = MSModelUtil.get(model_or_mdlutl) + + #Setting objective + if objective: + modelutl.model.objective = objective + + #Building full media and adding missing exchanges + output = {"growth": None, "class": None, "missing_transports": [], "baseline_growth": None} + full_media = self.build_media() if add_missing_exchanges: - output["missing_transports"] = modelutl.add_missing_exchanges(media) - pkgmgr = MSPackageManager.get_pkg_mgr(modelutl.model) - pkgmgr.getpkg("KBaseMediaPkg").build_package( - media, self.parent.base_uptake, self.parent.base_excretion - ) - for gene in self.gene_ko: - if gene in modelutl.model.genes: - geneobj = modelutl.model.genes.get_by_id(gene) - geneobj.knock_out() - solution = modelutl.model.optimize() - output["growth"] = solution.objective_value - if solution.objective_value > 0 and pfba: - solution = cobra.flux_analysis.pfba(modelutl.model) - if save_fluxes: - output["fluxes"] = solution.fluxes - if output["growth"] >= growth_threshold: + output["missing_transports"] = modelutl.add_missing_exchanges(full_media) + + #Getting basline growth + output["baseline_growth"] = 0.001 + if self.parent: + output["baseline_growth"] = self.parent.baseline_growth(modelutl,True) + + #Building specific media and setting compound exception list + if self.parent and self.parent.atom_limits and len(self.parent.atom_limits) > 0: + reaction_exceptions = [] + specific_media = self.build_media(False) + for mediacpd in specific_media.mediacompounds: + output = mediacpd.get_mdl_exchange_hash(self,modelutl) + for mdlcpd in output: + reaction_exceptions.append(output[mdlcpd]) + modelutl.pkgmgr.getpkg("ElementUptakePkg").build_package(self.parent.atom_limits,exception_reactions=reaction_exceptions) + + #Applying media + if self.parent: + modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package( + full_media, self.parent.base_uptake, self.parent.base_excretion + ) + else: + modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package( + full_media,0,1000 + ) + + with modelutl.model: + #Applying gene knockouts + for gene in self.gene_ko: + if gene in modelutl.model.genes: + geneobj = modelutl.model.genes.get_by_id(gene) + geneobj.knock_out() + + #Optimizing model + solution = modelutl.model.optimize() + output["growth"] = solution.objective_value + if solution.objective_value > 0 and pfba: + solution = cobra.flux_analysis.pfba(modelutl.model) + if save_fluxes: + output["fluxes"] = solution.fluxes + + #Determining phenotype class + if output["growth"] >= output["baseline_growth"]*growth_multiplier: if self.growth > 0: output["class"] = "CP" - else: + elif self.growth == 0: output["class"] = "FP" + else: + output["class"] = "GROWTH" else: if self.growth > 0: output["class"] = "FN" - else: + elif self.growth == 0: output["class"] = "CN" + else: + output["class"] = "NOGROWTH" return output def gapfill_model_for_phenotype( self, - modelutl, - default_gapfill_templates, + msgapfill, + objective, test_conditions, - default_gapfill_models=[], - blacklist=[], - growth_threshold=0.001, + growth_multiplier=10, add_missing_exchanges=False, ): - if not isinstance(modelutl, MSModelUtil): - modelutl = MSModelUtil(modelutl) - self.gapfilling = MSGapfill( - modelutl.model, - default_gapfill_templates, - default_gapfill_models, - test_conditions, - modelutl.reaction_scores(), - blacklist, - ) - media = self.build_media() - if add_missing_exchanges: - modelutl.add_missing_exchanges(media) - for gene in self.gene_ko: - if gene in modelutl.model.genes: - geneobj = modelutl.model.genes.get_by_id(gene) - geneobj.knock_out() - gfresults = self.gapfilling.run_gapfilling(media, None) - if gfresults is None: + """Gapfills the model to permit this single phenotype to be positive + Parameters + ---------- + msgapfill : MSGapfill + Fully configured gapfilling object + add_missing_exchanges : bool + Boolean indicating if exchanges for compounds mentioned explicitly in phenotype media should be added to the model automatically + growth_multiplier : double + Indicates a multiplier to use for positive growth above the growth on baseline media + objective : string + Expression for objective to be activated by gapfilling + """ + #First simulate model without gapfilling to assess ungapfilled growth + output = self.simulate(msgapfill.mdlutl,objective,growth_multiplier,add_missing_exchanges) + if output["growth"] >= output["baseline_growth"]*growth_multiplier: + #No gapfilling needed - original model grows without gapfilling + return {"reversed": {}, "new": {},"media": self.build_media(), "target":objective, "minobjective": output["baseline_growth"]*growth_multiplier, "binary_check":False} + + #Now pulling the gapfilling configured model from MSGapfill + gfmodelutl = MSModelUtil.get(msgapfill.gfmodel) + #Saving the gapfill objective because this will be replaced when the simulation runs + gfobj = gfmodelutl.model.objective + #Running simulate on gapfill model to add missing exchanges and set proper media and uptake limit constraints + output = self.simulate(modelutl,objective,growth_multiplier,add_missing_exchanges) + #If the gapfilling model fails to achieve the minimum growth, then no solution exists + if output["growth"] < output["baseline_growth"]*growth_multiplier: logger.warning( "Gapfilling failed with the specified model, media, and target reaction." ) - return self.gapfilling.integrate_gapfill_solution(gfresults) - + return None + + #Running the gapfilling itself + full_media = self.build_media() + with modelutl.model: + #Applying gene knockouts + for gene in self.gene_ko: + if gene in modelutl.model.genes: + geneobj = modelutl.model.genes.get_by_id(gene) + geneobj.knock_out() + + gfresults = self.gapfilling.run_gapfilling(media,None,minimum_obj=output["baseline_growth"]*growth_multiplier) + if gfresults is None: + logger.warning( + "Gapfilling failed with the specified model, media, and target reaction." + ) + + return gfresults class MSGrowthPhenotypes: - def __init__(self, base_media=None, base_uptake=0, base_excretion=1000): + def __init__(self, base_media=None, base_uptake=0, base_excretion=1000,global_atom_limits={}): self.base_media = base_media self.phenotypes = DictList() self.base_uptake = base_uptake self.base_excretion = base_excretion + self.atom_limits = global_atom_limits + self.baseline_growth_data = {} @staticmethod - def from_compound_hash(compounds, base_media, base_uptake=0, base_excretion=1000): - growthpheno = MSGrowthPhenotypes(base_media, base_uptake, base_excretion) + def from_compound_hash(compounds,base_media=None, base_uptake=0, base_excretion=1000,global_atom_limits={}): + growthpheno = MSGrowthPhenotypes(base_media, base_uptake, base_excretion,global_atom_limits) new_phenos = [] for cpd in compounds: newpheno = MSGrowthPhenotype(cpd, None, compounds[cpd], [], [cpd]) @@ -137,8 +223,8 @@ def from_compound_hash(compounds, base_media, base_uptake=0, base_excretion=1000 return growthpheno @staticmethod - def from_kbase_object(data, kbase_api): - growthpheno = MSGrowthPhenotypes(None, 0, 1000) + def from_kbase_object(data, kbase_api,base_media=None, base_uptake=0, base_excretion=1000,global_atom_limits={}): + growthpheno = MSGrowthPhenotypes(base_media,base_uptake, base_excretion,global_atom_limits) new_phenos = [] for pheno in data["phenotypes"]: media = kbase_api.get_from_ws(pheno["media_ref"], None) @@ -156,9 +242,9 @@ def from_kbase_object(data, kbase_api): return growthpheno @staticmethod - def from_kbase_file(filename, kbase_api): + def from_kbase_file(filename, kbase_api,base_media=None, base_uptake=0, base_excretion=1000,global_atom_limits={}): # TSV file with the following headers:media mediaws growth geneko addtlCpd - growthpheno = MSGrowthPhenotypes(base_media, 0, 1000) + growthpheno = MSGrowthPhenotypes(base_media,base_uptake, base_excretion,global_atom_limits) headings = [] new_phenos = [] with open(filename) as f: @@ -190,8 +276,8 @@ def from_kbase_file(filename, kbase_api): return growthpheno @staticmethod - def from_ms_file(filename, basemedia, base_uptake=0, base_excretion=100): - growthpheno = MSGrowthPhenotypes(base_media, base_uptake, base_excretion) + def from_ms_file(filename,base_media=None, base_uptake=0, base_excretion=100,global_atom_limits={}): + growthpheno = MSGrowthPhenotypes(base_media,base_uptake, base_excretion,global_atom_limits) df = pd.read_csv(filename) required_headers = ["Compounds", "Growth"] for item in required_headers: @@ -222,19 +308,40 @@ def add_phenotypes(self, new_phenotypes): def simulate_phenotypes( self, - model, - biomass, + model_or_modelutl, + objective, add_missing_exchanges=False, correct_false_negatives=False, template=None, - growth_threshold=0.001, - save_fluxes=False, + growth_threshold=0.01, + save_fluxes=False ): - model.objective = biomass - modelutl = MSModelUtil(model) + """Simulates all the specified phenotype conditions and saves results + Parameters + ---------- + model_or_modelutl : Model | MSModelUtl + Model to use to run the simulations + objective : string + Expression for objective to maximize in simulations + add_missing_exchanges : bool + Boolean indicating if exchanges for compounds mentioned explicitly in phenotype media should be added to the model automatically + growth_multiplier : double + Indicates a multiplier to use for positive growth above the growth on baseline media + save_fluxes : bool + Indicates if the fluxes should be saved and returned with the results + """ + # Discerning input is model or mdlutl and setting internal links + modelutl = model_or_mdlutl + if not isinstance(model_or_mdlutl, MSModelUtil): + modelutl = MSModelUtil.get(model_or_mdlutl) + #Setting objective + modelutl.objective = objective + #Getting basline growth + if self.parent + summary = { - "Label": ["Accuracy", "CP", "CN", "FP", "FN"], - "Count": [0, 0, 0, 0, 0], + "Label": ["Accuracy", "CP", "CN", "FP", "FN","Growth","No growth"], + "Count": [0, 0, 0, 0, 0,0,0], } data = { "Phenotype": [], @@ -293,3 +400,62 @@ def simulate_phenotypes( df = pd.DataFrame(data) logger.info(df) return {"details": df, "summary": sdf} + + def fit_model_to_phenotypes( + self, + model_or_mdlutl, + correct_false_negatives, + correct_false_positives, + minimize_new_false_positives, + core_template, + template, + integrate_results + ): + + """Simulates all the specified phenotype conditions and saves results + Parameters + ---------- + model_or_mdlutl : Model | MSModelUtl + Model to use to run the simulations + correct_false_negatives : bool + Indicates if false negatives should be corrected + correct_false_positives : bool + Indicates if false positives should be corrected + minimize_new_false_positives : bool + Indicates if new false positivies should be avoided + core_template : MSTemplate + Core template to use for ATP safe gapfilling if tests aren't already computed (defaults to model core template if it has one) + template : MSTemplate + The template that should be used for gapfilling (will default to model template if it has one) + integrate_results : bool + Indicates if the resulting modifications to the model should be integrated + """ + pass + + def gapfill_all_phenotypes( + self, + model_or_mdlutl, + msgapfill=None, # Needed if the gapfilling object in model utl is not initialized + growth_threshold=None, + add_missing_exchanges=False, + ): + mdlutl = MSModelUtil.get(model_or_mdlutl) + # if msgapfill: + # mdlutl.gfutl = msgapfill + # if not mdlutl.gfutl: + # logger.critical( + # "Must either provide a gapfilling object or provide a model utl with an existing gapfilling object" + # ) + # media_list = [] + # for pheno in self.phenotypes: + # + # + # output = mdlutl.gfutl.run_multi_gapfill( + # media_list, + # default_minimum_objective=growth_threshold + # target=mdlutl.primary_biomass(), + # + # binary_check=False, + # prefilter=True, + # check_for_growth=True, + # ) From ea81a98b40fe797c7e02b8b3a96843d4923cd585 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 12 Jul 2023 23:34:33 -0500 Subject: [PATCH 119/298] Fixing bug --- modelseedpy/core/msgrowthphenotypes.py | 1 - 1 file changed, 1 deletion(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 13d540b1..fffb4619 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -337,7 +337,6 @@ def simulate_phenotypes( #Setting objective modelutl.objective = objective #Getting basline growth - if self.parent summary = { "Label": ["Accuracy", "CP", "CN", "FP", "FN","Growth","No growth"], From abd998c395350695bd3516f7aac38d3a52f68cb5 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 12 Jul 2023 23:36:20 -0500 Subject: [PATCH 120/298] Adding MSGrowthPhenotype object --- modelseedpy/core/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/__init__.py b/modelseedpy/core/__init__.py index 204564ab..0b7c7b5c 100644 --- a/modelseedpy/core/__init__.py +++ b/modelseedpy/core/__init__.py @@ -9,7 +9,7 @@ from modelseedpy.core.mseditorapi import MSEditorAPI, MSEquation from modelseedpy.core.msgapfill import MSGapfill from modelseedpy.core.msatpcorrection import MSATPCorrection -from modelseedpy.core.msgrowthphenotypes import MSGrowthPhenotypes +from modelseedpy.core.msgrowthphenotypes import MSGrowthPhenotypes, MSGrowthPhenotype from modelseedpy.core.msmodelutl import MSModelUtil from modelseedpy.core.mstemplate import MSTemplateBuilder from modelseedpy.core.exceptions import * From 963f00a0ef8e1e3a812b2820cc1218628e5fec45 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 12 Jul 2023 23:39:02 -0500 Subject: [PATCH 121/298] Adding MSGrowthPhenotype --- modelseedpy/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/modelseedpy/__init__.py b/modelseedpy/__init__.py index 665f000c..dbb7c090 100644 --- a/modelseedpy/__init__.py +++ b/modelseedpy/__init__.py @@ -38,6 +38,7 @@ MSBuilder, MSMedia, MSGrowthPhenotypes, + MSGrowthPhenotype, MSModelUtil, FBAHelper, MSEditorAPI, From 0d6e7af0727907b64ba6f737f48679f9235f4f94 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 12 Jul 2023 23:47:33 -0500 Subject: [PATCH 122/298] Fixing error in simulate arguments --- modelseedpy/core/msgrowthphenotypes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index fffb4619..553b0523 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -55,7 +55,7 @@ def build_media(self,include_base_media=True): def simulate( self, - model_or_modelutl, + model_or_mdlutl, objective, growth_multiplier=10, add_missing_exchanges=False, From c0abcd166a8fcbfde702cf375fef9b604440f37a Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sun, 16 Jul 2023 22:42:19 -0500 Subject: [PATCH 123/298] Fixing attributes, improving phenotypes, improving gapfilling --- modelseedpy/core/msgapfill.py | 11 ++--- modelseedpy/core/msgrowthphenotypes.py | 57 ++++++++++++++++++-------- modelseedpy/core/msmodelutl.py | 17 ++++++-- 3 files changed, 60 insertions(+), 25 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 10bcb9a2..dde1514e 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -2,6 +2,7 @@ import logging import cobra import re +import json from optlang.symbolics import Zero, add from modelseedpy.core import FBAHelper # !!! the import is never used from modelseedpy.fbapkg.mspackagemanager import MSPackageManager @@ -354,11 +355,11 @@ def integrate_gapfill_solution( if link_gaps_to_objective: logger.info("Gapfilling sensitivity analysis running on succesful run in "+solution["media"].id+" for target "+solution["target"]) gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) - if solution["media"] not in gf_sensitivity: - gf_sensitivity[solution["media"]] = {} - if solution["target"] not in gf_sensitivity[solution["media"]]: - gf_sensitivity[solution["media"]][solution["target"]] = {} - gf_sensitivity[solution["media"]][solution["target"]][ + if solution["media"].id not in gf_sensitivity: + gf_sensitivity[solution["media"].id] = {} + if solution["target"] not in gf_sensitivity[solution["media"].id]: + gf_sensitivity[solution["media"].id][solution["target"]] = {} + gf_sensitivity[solution["media"].id][solution["target"]][ "success" ] = self.mdlutl.find_unproducible_biomass_compounds( solution["target"], cumulative_solution diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 553b0523..bc2f4f05 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -297,6 +297,15 @@ def from_ms_file(filename,base_media=None, base_uptake=0, base_excretion=100,glo growthpheno.add_phenotypes(new_phenos) return growthpheno + def build_super_media(self): + super_media = None + for pheno in self.phenotypes: + if not super_media: + super_media = pheno.build_media() + else: + super_media.merge(pheno.build_media(), overwrite_overlap=False) + return super_media + def add_phenotypes(self, new_phenotypes): keep_phenos = [] for pheno in new_phenotypes: @@ -402,34 +411,50 @@ def simulate_phenotypes( def fit_model_to_phenotypes( self, - model_or_mdlutl, - correct_false_negatives, - correct_false_positives, - minimize_new_false_positives, - core_template, - template, - integrate_results + msgapfill, + objective, + grow_multiplier, + correct_false_positives=False, + minimize_new_false_positives=True, + atp_safe=True, + integrate_results=True, + global_gapfilling=True ): """Simulates all the specified phenotype conditions and saves results Parameters ---------- - model_or_mdlutl : Model | MSModelUtl - Model to use to run the simulations - correct_false_negatives : bool - Indicates if false negatives should be corrected + msgapfill : MSGapfill + Gapfilling object used for the gapfilling process correct_false_positives : bool Indicates if false positives should be corrected minimize_new_false_positives : bool Indicates if new false positivies should be avoided - core_template : MSTemplate - Core template to use for ATP safe gapfilling if tests aren't already computed (defaults to model core template if it has one) - template : MSTemplate - The template that should be used for gapfilling (will default to model template if it has one) integrate_results : bool Indicates if the resulting modifications to the model should be integrated """ - pass + #Create super media for all + super_media = self.build_super_media() + #Adding missing exchanges + msgapfill.gfmodel.add_missing_exchanges(super_media) + #Adding elemental constraints + self.add_elemental_constraints() + #Getting ATP tests + + #Filtering database for ATP tests + + #Penalizing database to avoid creating false positives + + #Building additional tests from current correct negatives + + #Computing base-line growth + + #Computing growth threshold + + #Running global gapfill + + #Integrating solution + def gapfill_all_phenotypes( self, diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 9c69a51f..fb4c45e4 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -113,6 +113,12 @@ def __init__(self, model): self.attributes = {} if hasattr(self.model, "attributes"): self.attributes = self.model + if "pathways" not in self.attributes: + self.attributes["pathways"] = {} + if "auxotrophy" not in self.attributes: + self.attributes["auxotrophy"] = {} + if "fbas" not in self.attributes: + self.attributes["fbas"] = {} def compute_automated_reaction_scores(self): """ @@ -286,14 +292,17 @@ def get_attributes(self, key=None, default=None): return self.attributes[key] def save_attributes(self, value=None, key=None): - attributes = self.get_attributes() if value: if key: - attributes[key] = value + self.attributes[key] = value else: self.attributes = value - if hasattr(self.model, "attributes"): - self.model.attributes = self.attributes + if hasattr(self.model, "computed_attributes"): + logger.info( + "Setting FBAModel computed_attributes to mdlutl attributes" + ) + self.attributes["gene_count"] = len(self.model.genes) + self.model.computed_attributes = self.attributes def add_ms_reaction(self, rxn_dict, compartment_trans=["c0", "e0"]): modelseed = ModelSEEDBiochem.get() From de260aec2b0897fa20dbc6b0ca0981d050df0151 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sun, 16 Jul 2023 23:15:22 -0500 Subject: [PATCH 124/298] Fixing attritbute problem and fixing phenotypes --- modelseedpy/core/msatpcorrection.py | 2 +- modelseedpy/core/msgrowthphenotypes.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index dd381b18..c07cc34f 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -414,7 +414,7 @@ def apply_growth_media_gapfilling(self): "count": len(self.cumulative_core_gapfilling), "reactions": self.cumulative_core_gapfilling, } - self.modelutl.save_attributes(core_gf, "core_gapfilling") + self.modelutl.save_attributes(core_gf, "core_gapfilling_details") def expand_model_to_genome_scale(self): """Restores noncore reactions to model while filtering out reactions that break ATP diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index bc2f4f05..885e4f78 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -132,19 +132,19 @@ def simulate( #Determining phenotype class if output["growth"] >= output["baseline_growth"]*growth_multiplier: - if self.growth > 0: + if not self.growth: + output["class"] = "GROWTH" + elif self.growth > 0: output["class"] = "CP" elif self.growth == 0: output["class"] = "FP" - else: - output["class"] = "GROWTH" else: - if self.growth > 0: + if not self.growth: + output["class"] = "NOGROWTH" + elif self.growth > 0: output["class"] = "FN" elif self.growth == 0: output["class"] = "CN" - else: - output["class"] = "NOGROWTH" return output def gapfill_model_for_phenotype( From 328c57878423d89c2d48281d4b3adca606fc1bec Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 17 Jul 2023 23:23:34 -0500 Subject: [PATCH 125/298] Improving phenotype simulations and enabling use of complete media --- modelseedpy/core/msgrowthphenotypes.py | 49 ++++++++++++++++++++++---- modelseedpy/core/msmedia.py | 1 + modelseedpy/core/msmodelutl.py | 6 ++-- modelseedpy/fbapkg/kbasemediapkg.py | 2 +- 4 files changed, 47 insertions(+), 11 deletions(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 885e4f78..ebdba851 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -48,9 +48,9 @@ def build_media(self,include_base_media=True): full_media = MSMedia.from_dict(cpd_hash) if self.media: full_media.merge(self.media, overwrite_overlap=False) - if full_media: + if include_base_media: if self.parent and self.parent.base_media: - full_media.merge(parent.base_media, overwrite_overlap=False) + full_media.merge(self.parent.base_media, overwrite_overlap=False) return full_media def simulate( @@ -91,18 +91,18 @@ def simulate( output["missing_transports"] = modelutl.add_missing_exchanges(full_media) #Getting basline growth - output["baseline_growth"] = 0.001 + output["baseline_growth"] = 0.01 if self.parent: - output["baseline_growth"] = self.parent.baseline_growth(modelutl,True) + output["baseline_growth"] = self.parent.baseline_growth(modelutl,objective) #Building specific media and setting compound exception list if self.parent and self.parent.atom_limits and len(self.parent.atom_limits) > 0: reaction_exceptions = [] specific_media = self.build_media(False) for mediacpd in specific_media.mediacompounds: - output = mediacpd.get_mdl_exchange_hash(self,modelutl) - for mdlcpd in output: - reaction_exceptions.append(output[mdlcpd]) + ex_hash = mediacpd.get_mdl_exchange_hash(modelutl) + for mdlcpd in ex_hash: + reaction_exceptions.append(ex_hash[mdlcpd]) modelutl.pkgmgr.getpkg("ElementUptakePkg").build_package(self.parent.atom_limits,exception_reactions=reaction_exceptions) #Applying media @@ -211,6 +211,7 @@ def __init__(self, base_media=None, base_uptake=0, base_excretion=1000,global_at self.base_excretion = base_excretion self.atom_limits = global_atom_limits self.baseline_growth_data = {} + self.cached_based_growth = {} @staticmethod def from_compound_hash(compounds,base_media=None, base_uptake=0, base_excretion=1000,global_atom_limits={}): @@ -315,6 +316,40 @@ def add_phenotypes(self, new_phenotypes): additions = DictList(keep_phenos) self.phenotypes += additions + def baseline_growth( + self, + model_or_mdlutl, + objective + ): + """Simulates all the specified phenotype conditions and saves results + Parameters + ---------- + model_or_modelutl : Model | MSModelUtl + Model to use to run the simulations + """ + # Discerning input is model or mdlutl and setting internal links + modelutl = model_or_mdlutl + if not isinstance(model_or_mdlutl, MSModelUtil): + modelutl = MSModelUtil.get(model_or_mdlutl) + #Checking if base growth already computed + if modelutl in self.cached_based_growth: + if objective in self.cached_based_growth[modelutl]: + return self.cached_based_growth[modelutl][objective] + else: + self.cached_based_growth[modelutl] = {} + #Setting objective + modelutl.objective = objective + #Setting media + modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package( + self.base_media, self.base_uptake, self.base_excretion + ) + #Adding uptake limits + if len(self.atom_limits) > 0: + modelutl.pkgmgr.getpkg("ElementUptakePkg").build_package(self.atom_limits) + #Simulating + self.cached_based_growth[modelutl][objective] = modelutl.model.slim_optimize() + return self.cached_based_growth[modelutl][objective] + def simulate_phenotypes( self, model_or_modelutl, diff --git a/modelseedpy/core/msmedia.py b/modelseedpy/core/msmedia.py index 48fa90ad..fadc435d 100644 --- a/modelseedpy/core/msmedia.py +++ b/modelseedpy/core/msmedia.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import logging from cobra.core.dictlist import DictList +from modelseedpy.core.msmodelutl import MSModelUtil logger = logging.getLogger(__name__) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index fb4c45e4..097dc9cc 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -111,14 +111,14 @@ def __init__(self, model): self.score = None self.integrated_gapfillings = [] self.attributes = {} - if hasattr(self.model, "attributes"): - self.attributes = self.model + if hasattr(self.model, "computed_attributes"): + self.attributes = self.model.computed_attributes if "pathways" not in self.attributes: self.attributes["pathways"] = {} if "auxotrophy" not in self.attributes: self.attributes["auxotrophy"] = {} if "fbas" not in self.attributes: - self.attributes["fbas"] = {} + self.attributes["fbas"] = {} def compute_automated_reaction_scores(self): """ diff --git a/modelseedpy/fbapkg/kbasemediapkg.py b/modelseedpy/fbapkg/kbasemediapkg.py index 4dbf0779..a3c19243 100644 --- a/modelseedpy/fbapkg/kbasemediapkg.py +++ b/modelseedpy/fbapkg/kbasemediapkg.py @@ -40,7 +40,7 @@ def build_package( self.parameters["default_uptake"] = 0 if self.parameters["default_excretion"] is None: self.parameters["default_excretion"] = 100 - if self.parameters["media"] is None and self.parameters["default_uptake"] == 0: + if (self.parameters["media"] is None or self.parameters["media"].name == "Complete") and self.parameters["default_uptake"] == 0: self.parameters["default_uptake"] = 100 # First initializing all exchanges to default uptake and excretion From 084054dbb831231c324c09db35a4bff636a8bc3b Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 17 Jul 2023 23:26:23 -0500 Subject: [PATCH 126/298] Fixing issue where attributes will be none --- modelseedpy/core/msmodelutl.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 097dc9cc..ec6bc903 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -112,7 +112,8 @@ def __init__(self, model): self.integrated_gapfillings = [] self.attributes = {} if hasattr(self.model, "computed_attributes"): - self.attributes = self.model.computed_attributes + if self.model.computed_attributes: + self.attributes = self.model.computed_attributes if "pathways" not in self.attributes: self.attributes["pathways"] = {} if "auxotrophy" not in self.attributes: From 0d6149799c0e30393f9cdf0d8fc654f0bdb173f1 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Tue, 18 Jul 2023 01:48:51 -0500 Subject: [PATCH 127/298] atpcorrection --- modelseedpy/core/msatpcorrection.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 727c3e33..2f5a2774 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -161,9 +161,10 @@ def load_default_medias(self): media.id = media_id media.name = media_id min_obj = 0.01 - if media_id in min_gap: - min_obj = min_gap[media_id] - self.atp_medias.append([media, min_obj]) + self.atp_medias.append([ + media, + min_gap.get(media_d, min_obj) + ]) @staticmethod def find_reaction_in_template(model_reaction, template, compartment): From b08f8f38362c3a9140571f5ade10f8d00ab10ae6 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 18 Jul 2023 13:29:46 -0500 Subject: [PATCH 128/298] Improving phenotype simulation and making sure parameters are documented in element uptake --- modelseedpy/core/msgrowthphenotypes.py | 2 +- modelseedpy/fbapkg/elementuptakepkg.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index ebdba851..a98fd64d 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -57,7 +57,7 @@ def simulate( self, model_or_mdlutl, objective, - growth_multiplier=10, + growth_multiplier=3, add_missing_exchanges=False, save_fluxes=False, pfba=False, diff --git a/modelseedpy/fbapkg/elementuptakepkg.py b/modelseedpy/fbapkg/elementuptakepkg.py index 4eb27e44..8348e602 100644 --- a/modelseedpy/fbapkg/elementuptakepkg.py +++ b/modelseedpy/fbapkg/elementuptakepkg.py @@ -18,6 +18,11 @@ def __init__(self, model): def build_package(self, element_limits,exception_compounds=[],exception_reactions=[]): #Converting exception compounds list into exception reaction list + self.parameters = { + "element_limits" : element_limits, + "exception_compounds" : exception_compounds, + "exception_reactions" : exception_reactions + } exchange_hash = self.modelutl.exchange_hash() for met in exception_compounds: if met in exchange_hash: From c45f798ec14d8f140a9e0b0af101a49d932532ef Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Fri, 21 Jul 2023 23:11:59 -0500 Subject: [PATCH 129/298] Improved phenotype functions --- modelseedpy/core/msgrowthphenotypes.py | 122 +++++++++++++++---------- 1 file changed, 72 insertions(+), 50 deletions(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index a98fd64d..696a6b9d 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -352,25 +352,26 @@ def baseline_growth( def simulate_phenotypes( self, - model_or_modelutl, + model_or_mdlutl, objective, + growth_multiplier=3, add_missing_exchanges=False, - correct_false_negatives=False, - template=None, - growth_threshold=0.01, - save_fluxes=False + save_fluxes=False, + gapfill_negatives=False, + msgapfill=None, + test_conditions=None ): """Simulates all the specified phenotype conditions and saves results Parameters ---------- - model_or_modelutl : Model | MSModelUtl + model_or_mdlutl : Model | MSModelUtl Model to use to run the simulations objective : string Expression for objective to maximize in simulations - add_missing_exchanges : bool - Boolean indicating if exchanges for compounds mentioned explicitly in phenotype media should be added to the model automatically growth_multiplier : double Indicates a multiplier to use for positive growth above the growth on baseline media + add_missing_exchanges : bool + Boolean indicating if exchanges for compounds mentioned explicitly in phenotype media should be added to the model automatically save_fluxes : bool Indicates if the fluxes should be saved and returned with the results """ @@ -381,7 +382,8 @@ def simulate_phenotypes( #Setting objective modelutl.objective = objective #Getting basline growth - + baseline_growth = self.baseline_growth(modelutl,objective) + #Establishing output of the simulation method summary = { "Label": ["Accuracy", "CP", "CN", "FP", "FN","Growth","No growth"], "Count": [0, 0, 0, 0, 0,0,0], @@ -393,51 +395,53 @@ def simulate_phenotypes( "Class": [], "Transports missing": [], "Gapfilled reactions": [], + "Gapfilling score":None } + #Running simulations + gapfilling_solutions = {} for pheno in self.phenotypes: - with model: - result = pheno.simulate( - modelutl, growth_threshold, add_missing_exchanges, save_fluxes - ) # Result should have "growth" and "class" - if result["class"] == "FN" and correct_false_negatives: - pheno.gapfill_model_for_phenotype(modelutl, [template], None) - if pheno.gapfilling.last_solution != None: - list = [] - for rxn_id in pheno.gapfilling.last_solution["reversed"]: - list.append( - pheno.gapfilling.last_solution["reversed"][rxn_id] - + rxn_id - ) - for rxn_id in pheno.gapfilling.last_solution["new"]: - list.append( - pheno.gapfilling.last_solution["new"][rxn_id] + rxn_id - ) - data["Gapfilled reactions"].append(";".join(list)) - else: - data["Gapfilled reactions"].append(None) + result = pheno.simulate( + modelutl,objective,growth_multiplier,add_missing_exchanges,save_fluxes + ) + data["Class"].append(result["class"]) + data["Phenotype"].append(pheno.id) + data["Observed growth"].append(pheno.growth) + data["Simulated growth"].append(result["growth"]) + data["Transports missing"].append( + ";".join(result["missing_transports"]) + ) + if result["class"] == "CP": + summary["Count"][1] += 1 + summary["Count"][0] += 1 + if result["class"] == "CN": + summary["Count"][2] += 1 + summary["Count"][0] += 1 + if result["class"] == "FP": + summary["Count"][3] += 1 + if result["class"] == "FN": + summary["Count"][4] += 1 + #Gapfilling negative growth conditions + if gapfill_negatives and output["class"] in ["NOGROWTH","FN","CN"]: + gapfilling_solutions[pheno] = pheno.gapfill_model_for_phenotype(msgapfill,objective,test_conditions,growth_multiplier,add_missing_exchanges) + if gapfilling_solutions[pheno] != None: + data["Gapfilling score"] = 0 + list = [] + for rxn_id in gapfilling_solutions[pheno]["reversed"]: + list.append( + gapfilling_solutions[pheno]["reversed"][rxn_id] + + rxn_id + ) + data["Gapfilling score"] += 0.5 + for rxn_id in gapfilling_solutions[pheno]["new"]: + list.append( + gapfilling_solutions[pheno]["new"][rxn_id] + rxn_id + ) + data["Gapfilling score"] += 1 + data["Gapfilled reactions"].append(";".join(list)) else: data["Gapfilled reactions"].append(None) - result = pheno.simulate( - modelutl, growth_threshold, add_missing_exchanges, save_fluxes - ) # Result should have "growth" and "class" - data["Class"].append(result["class"]) - data["Phenotype"].append(pheno.id) - data["Observed growth"].append(pheno.growth) - data["Simulated growth"].append(result["growth"]) - data["Transports missing"].append( - ";".join(result["missing_transports"]) - ) - if result["class"] == "CP": - summary["Count"][1] += 1 - summary["Count"][0] += 1 - if result["class"] == "CN": - summary["Count"][2] += 1 - summary["Count"][0] += 1 - if result["class"] == "FP": - summary["Count"][3] += 1 - if result["class"] == "FN": - summary["Count"][4] += 1 - + else: + data["Gapfilled reactions"].append(None) summary["Count"][0] = summary["Count"][0] / len(self.phenotypes) sdf = pd.DataFrame(summary) df = pd.DataFrame(data) @@ -468,6 +472,24 @@ def fit_model_to_phenotypes( integrate_results : bool Indicates if the resulting modifications to the model should be integrated """ + + + + #Running simulations + positive_growth = [] + negative_growth = [] + for pheno in self.phenotypes: + with model: + result = pheno.simulate( + modelutl,objective,growth_multiplier,add_missing_exchanges,save_fluxes + ) + #Gapfilling negative growth conditions + if gapfill_negatives and output["class"] in ["NOGROWTH","FN","CN"]: + negative_growth.append(pheno.build_media()) + elif gapfill_negatives and output["class"] in ["GROWTH","FP","CP"]: + positive_growth.append(pheno.build_media()) + + #Create super media for all super_media = self.build_super_media() #Adding missing exchanges From a48f3987d43630142102e15c391984a7b7fbe7f8 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 24 Jul 2023 00:19:56 -0500 Subject: [PATCH 130/298] Removing failed ATP gapfillings from gapfilling sensitivity --- modelseedpy/core/msgapfill.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index dde1514e..14371e2a 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -114,7 +114,9 @@ def test_gapfill_database(self, media, target=None, before_filtering=True): target = target[13:] if self.gfpkgmgr.getpkg("GapfillingPkg").test_gapfill_database(): return True - gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) + gf_sensitivity = {} + if target != "rxn00062_c0": + gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) if media.id not in gf_sensitivity: gf_sensitivity[media.id] = {} if target not in gf_sensitivity[media.id]: @@ -127,7 +129,8 @@ def test_gapfill_database(self, media, target=None, before_filtering=True): gf_sensitivity[media.id][target][ note ] = self.mdlutl.find_unproducible_biomass_compounds(target) - self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") + if target != "rxn00062_c0": + self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") logger.warning( "No gapfilling solution found" + filter_msg From 6dca6d957466dc31785faf9ae0b235fb2e8f5a64 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 24 Jul 2023 05:27:46 +0000 Subject: [PATCH 131/298] Adding ATP gapfilled reactions to gapfilling sensitivity --- modelseedpy/core/msatpcorrection.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index c07cc34f..08540daa 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -410,11 +410,23 @@ def apply_growth_media_gapfilling(self): self.cumulative_core_gapfilling, link_gaps_to_objective=False ) - core_gf = { - "count": len(self.cumulative_core_gapfilling), - "reactions": self.cumulative_core_gapfilling, - } - self.modelutl.save_attributes(core_gf, "core_gapfilling_details") + #Adding reactions to gapfilling sensitivity structure so we can track all gapfilled reactions + gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) + if media.id not in gf_sensitivity: + gf_sensitivity[media.id] = {} + if self.atp_hydrolysis.id not in gf_sensitivity[media.id]: + gf_sensitivity[media.id][self.atp_hydrolysis.id] = {} + gf_sensitivity[media.id][self.atp_hydrolysis.id]["success"] = {} + for item in stats["new"]: + gf_sensitivity[media.id][self.atp_hydrolysis.id]["success"][item] = { + stats["new"][item] : [] + } + for item in stats["reversed"]: + gf_sensitivity[media.id][self.atp_hydrolysis.id]["success"][item] = { + stats["reversed"][item] : [] + } + self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") + self.modelutl.save_attributes(len(self.cumulative_core_gapfilling), "total_core_gapfilling") def expand_model_to_genome_scale(self): """Restores noncore reactions to model while filtering out reactions that break ATP From 1be467481a38f3782a804e9def5ad0b9a07774b0 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 25 Jul 2023 12:23:06 -0500 Subject: [PATCH 132/298] Fixing bug in gapfill --- modelseedpy/core/msmodelutl.py | 1 + 1 file changed, 1 insertion(+) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index ec6bc903..47064f05 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -1009,6 +1009,7 @@ def find_unproducible_biomass_compounds(self, target_rxn="bio1", ko_list=None): # Getting target reaction and making sure it exists if target_rxn not in tempmodel.reactions: logger.critical(target_rxn + " not in model!") + return None target_rxn_obj = tempmodel.reactions.get_by_id(target_rxn) tempmodel.objective = target_rxn original_objective = tempmodel.objective From 2db54c6d5e41965f5cd2980046d2ae2a79983d80 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 25 Jul 2023 23:20:05 -0500 Subject: [PATCH 133/298] Fixing bug in ATP media --- modelseedpy/core/msatpcorrection.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 08540daa..18c3d40f 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -122,9 +122,9 @@ def __init__( self.forced_media = [] for media_id in forced_media: - for media in self.atp_medias: - if media.id == media_id: - self.forced_media.append(media) + for item in self.atp_medias: + if item[0].id == media_id: + self.forced_media.append(item[0]) break self.max_gapfilling = max_gapfilling From ca7cc5054f4f9acb76d4163fab090e7391420b62 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 26 Jul 2023 04:51:17 +0000 Subject: [PATCH 134/298] Fixing ATP correction --- modelseedpy/core/msatpcorrection.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 08540daa..8b173161 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -411,7 +411,7 @@ def apply_growth_media_gapfilling(self): link_gaps_to_objective=False ) #Adding reactions to gapfilling sensitivity structure so we can track all gapfilled reactions - gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) + gf_sensitivity = self.modelutl.get_attributes("gf_sensitivity", {}) if media.id not in gf_sensitivity: gf_sensitivity[media.id] = {} if self.atp_hydrolysis.id not in gf_sensitivity[media.id]: @@ -425,7 +425,7 @@ def apply_growth_media_gapfilling(self): gf_sensitivity[media.id][self.atp_hydrolysis.id]["success"][item] = { stats["reversed"][item] : [] } - self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") + self.modelutl.save_attributes(gf_sensitivity, "gf_sensitivity") self.modelutl.save_attributes(len(self.cumulative_core_gapfilling), "total_core_gapfilling") def expand_model_to_genome_scale(self): From 03ad8cc36b04c4d2fc8960131f5a862df4581e7d Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 26 Jul 2023 13:18:19 -0500 Subject: [PATCH 135/298] Adding MSModelReport object with Jose's report code --- modelseedpy/__init__.py | 1 + modelseedpy/core/__init__.py | 1 + modelseedpy/core/msmodelreport.py | 272 ++++++++++++++++++++++++++++++ 3 files changed, 274 insertions(+) create mode 100644 modelseedpy/core/msmodelreport.py diff --git a/modelseedpy/__init__.py b/modelseedpy/__init__.py index dbb7c090..551f617d 100644 --- a/modelseedpy/__init__.py +++ b/modelseedpy/__init__.py @@ -45,6 +45,7 @@ MSATPCorrection, MSGapfill, MSEquation, + MSModelReport ) from modelseedpy.core.exceptions import * diff --git a/modelseedpy/core/__init__.py b/modelseedpy/core/__init__.py index 0b7c7b5c..eb4d02a2 100644 --- a/modelseedpy/core/__init__.py +++ b/modelseedpy/core/__init__.py @@ -12,4 +12,5 @@ from modelseedpy.core.msgrowthphenotypes import MSGrowthPhenotypes, MSGrowthPhenotype from modelseedpy.core.msmodelutl import MSModelUtil from modelseedpy.core.mstemplate import MSTemplateBuilder +from modelseedpy.core.msmodelreport import MSModelReport from modelseedpy.core.exceptions import * diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py new file mode 100644 index 00000000..dccc658b --- /dev/null +++ b/modelseedpy/core/msmodelreport.py @@ -0,0 +1,272 @@ +# -*- coding: utf-8 -*- +import pandas as pd +import logging +import matplotlib.cm as cm +from modelseedpy.core.msmodelutl import MSModelUtil + +logger = logging.getLogger(__name__) +logger.setLevel( + logging.INFO +) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO + +class MSModelReport: + def __init__( + self + ): + pass + + def build_report( + self, + model_or_mdlutl + ): + """Builds model HTML report + Parameters + ---------- + model_or_modelutl : Model | MSModelUtl + Model to use to run the simulations + """ + modelutl = model_or_mdlutl + if not isinstance(model_or_mdlutl, MSModelUtil): + modelutl = MSModelUtil.get(model_or_mdlutl) + + # Process the data + attributes = modelutl.get_attributes() + + selected_media_data = attributes['ATP_analysis']['selected_media'] + core_atp_gapfilling_data = attributes['ATP_analysis']['core_atp_gapfilling'] + gf_filter_data = attributes['gf_filter'] + gf_sensitivity_data = attributes.get('gf_sensitivity') # Get 'gf_sensitivity_data' if available, otherwise it will be None + + # Get the names of 'Core Gapfilling Media' and 'Gapfilling Media' + core_gapfilling_media = [media for media, media_data in (gf_sensitivity_data or {}).items() if 'rxn00062_c0' in media_data] + gapfilling_media = [media for media, media_data in (gf_sensitivity_data or {}).items() if 'bio1' in media_data] + core_gapfilling_media_text = ', '.join(core_gapfilling_media) + gapfilling_media_text = ', '.join(gapfilling_media) + + bio_count = 0 + for rxn in modelutl.model.reactions: + if rxn.id[0:3] == "bio": + bio_count += 1 + + # Create the Model Summary table data + model_summary_data = [ + ('Model ID', modelutl.wsid), + ('Genome Scale Template', modelutl.model.template_ref), + #('Core Template', modelutl.model.core_template_ref), + ('Core Gapfilling Media', core_gapfilling_media_text), + ('Gapfilling Media', gapfilling_media_text), + ('Source Genome',modelutl.model.name), + ('Total Number of reactions', str(len(modelutl.model.reactions))), + # ('Number of reactions in Core', 'TBD - attributes require changes things to support this'), + # ('Number of reactions in Genome Scale', 'TBD - attributes require changes things to support this'), + ('Number compounds', str(len(modelutl.model.metabolites))), + ('Number compartments', str(len(modelutl.model.compartments))), + ('Number biomass', str(bio_count)), + ('Number gapfills', str(len(gf_sensitivity_data))), + ] + + # Create the DataFrame for Model Summary + model_summary_df = pd.DataFrame(model_summary_data, columns=['', '']) + + # Process core_atp_gapfilling_data and gf_filter_data into a list of dictionaries + gapfilling_list = [] + for media in core_atp_gapfilling_data: + core_atp_gapfilling_media = core_atp_gapfilling_data[media] + row = { + 'no of gapfilled reactions': int(core_atp_gapfilling_media['score']), + 'media': media, + 'ATP Production': f"{round(selected_media_data.get(media, 0), 2):.2f}" if media in selected_media_data else '', + 'gapfilled reactions': '', + 'reversed reaction by gapfilling': '', + 'Filtered Reactions': '', + } + if 'new' in core_atp_gapfilling_media: + gapfilled_reactions = core_atp_gapfilling_media['new'] + if gapfilled_reactions: + reactions = [f'{rxn} : {direction}' if not rxn.startswith("EX") else f'EX_{rxn} : {direction}' for rxn, direction in gapfilled_reactions.items()] + row['gapfilled reactions'] = ' | '.join(reactions) + if 'failed' in core_atp_gapfilling_media and core_atp_gapfilling_media['failed']: + row['gapfilled reactions'] = 'Failed' + if 'reversed' in core_atp_gapfilling_media: + reversed_reactions = core_atp_gapfilling_media['reversed'] + if reversed_reactions: + reactions = [f'{rxn} : {direction}' if not rxn.startswith("EX") else f'EX_{rxn} : {direction}' for rxn, direction in reversed_reactions.items()] + row['reversed reaction by gapfilling'] = ' | '.join(reactions) + if media in gf_filter_data: + gf_filter_media_data = gf_filter_data[media] + atp_production_values = list(gf_filter_media_data.values()) + if atp_production_values: + atp_prod_reaction_pairs = list(atp_production_values[0].items()) + if atp_prod_reaction_pairs: + _, reactions = atp_prod_reaction_pairs[0] + if reactions: + filtered_reactions = ' | '.join([f'{rxn} : {list(value.keys())[0]}' if not rxn.startswith("EX") else f'EX_{rxn} : {list(value.keys())[0]}' for rxn, value in reactions.items()]) + row['Filtered Reactions'] = filtered_reactions if filtered_reactions else '' + if not row['reversed reaction by gapfilling']: + row['reversed reaction by gapfilling'] = '' + gapfilling_list.append(row) + + + + gapfilling_df = pd.DataFrame(gapfilling_list, columns=['no of gapfilled reactions', 'media', 'ATP Production', 'gapfilled reactions', 'reversed reaction by gapfilling', 'Filtered Reactions']) + gapfilling_df['no of gapfilled reactions'] = pd.to_numeric(gapfilling_df['no of gapfilled reactions']) + gapfilling_df = gapfilling_df.sort_values('no of gapfilled reactions') + + + reaction_names = {} + for rxn in modelutl.model.reactions: + reaction_id = rxn.id + reaction_name = rxn.name + reaction_names[reaction_id] = reaction_name + + # Gapfillings Analysis DataFrame + gapfillings_list = [] + if gf_sensitivity_data: + for media, media_data in gf_sensitivity_data.items(): + for target, target_data in media_data.items(): # Iterate through each target for the current media + for status, status_data in target_data.items(): + if isinstance(status_data, dict): + for reaction_id, reaction_directions in status_data.items(): + for direction, gapfilling_sensitivity in reaction_directions.items(): + if status == 'success': + if isinstance(gapfilling_sensitivity, list): + gapfilling_sensitivity = ', '.join(gapfilling_sensitivity) + gapfillings_list.append({ + 'Reaction ID': reaction_id, + 'Reaction Name': reaction_names.get(reaction_id, ''), # Get reaction name from the dictionary + 'Media': media, + 'Direction': direction, + 'Target': target, + 'Gapfilling Sensitivity': gapfilling_sensitivity + }) + else: + # Handle cases where status_data is null + gapfillings_list.append({ + 'Reaction ID': '', # No data available for Reaction ID + 'Reaction Name': '', # No data available for Reaction Name + 'Media': media, + 'Direction': '', # No data available for Direction + 'Target': target, + 'Gapfilling Sensitivity': 'Failed Before Filtering' if status == 'FBF' else 'Failed After Filtering' if status == 'FAF' else status # Status is the 'FBF' or other labels in this case + }) + + gapfillings_analysis_df = pd.DataFrame(gapfillings_list, columns=['Reaction ID', 'Reaction Name', 'Media', 'Direction', 'Target', 'Gapfilling Sensitivity']) + + + # Define the custom color mapping function + def color_gradient(val): + if val == 0: + return 'background-color: green' + else: + color_map = cm.get_cmap('YlOrRd') # Choose the color map + norm_val = val / gapfilling_df['no of gapfilled reactions'].max() # Normalize the value between 0 and 1 + color = color_map(norm_val) + r, g, b, _ = color + return f'background-color: rgb({int(r * 255)}, {int(g * 255)}, {int(b * 255)})' + + # Apply the default style to the Model Summary DataFrame + model_summary_df_styled = ( + model_summary_df.style + .hide_index() + .set_table_styles([ + {'selector': 'th', 'props': [('border', 'none'), ('background-color', 'white'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, + {'selector': 'td', 'props': [('border', 'none'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, + {'selector': 'tr:nth-child(even)', 'props': [('background-color', 'white')]}, + {'selector': 'tr:nth-child(odd)', 'props': [('background-color', '#f2f2f2')]}, + ]) + ) + + + # Apply the default style to the Gapfillings Analysis DataFrame + # Apply the default style to the Gapfillings Analysis DataFrame + gapfillings_analysis_df_styled = ( + gapfillings_analysis_df.style + .hide_index() + .format({ + 'Reaction ID': lambda x: f'{x}' if not x.startswith("EX") else f'{x}', # Add hyperlink to Reaction ID + 'Gapfilling Sensitivity': lambda x: ', '.join([f'{i}' for i in x.split(', ')]) if x and not x.startswith('Failed') else x # Add hyperlinks to Gapfilling Sensitivity + }) + .set_table_styles([ + {'selector': 'th', 'props': [('border', 'none'), ('background-color', 'white'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, + {'selector': 'td', 'props': [('border', 'none'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, + {'selector': 'tr:nth-child(even)', 'props': [('background-color', 'white')]}, + {'selector': 'tr:nth-child(odd)', 'props': [('background-color', '#f2f2f2')]}, + ]) + ) + + + # Apply the default style with alternating row colors, Oxygen font, adjusted font size and line height, + # and switched order of light grey and white backgrounds in the header column for Core ATP Gapfilling Analysis + gapfilling_df_styled = ( + gapfilling_df.style + .applymap(color_gradient, subset=['no of gapfilled reactions']) + .hide_index() + .format({'Filtered Reactions': lambda x: f'{x}'}) + .format({'gapfilled reactions': lambda x: f'{x}'}) + .set_table_styles([ + {'selector': 'th', 'props': [('border', 'none'), ('background-color', 'white'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, + {'selector': 'td', 'props': [('border', 'none'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, + {'selector': 'tr:nth-child(even)', 'props': [('background-color', 'white')]}, + {'selector': 'tr:nth-child(odd)', 'props': [('background-color', '#f2f2f2')]}, + ]) + ) + + + # Legend text for Table 1 + annotations_text_1 = """ +
    +
  • Reaction ID: The identifier of the reaction.
  • +
  • Reaction Name: The name of the reaction.
  • +
  • Media: The media used by gap filling.
  • +
  • Direction: The direction of the reaction. Can be ">" for forward, "<" for reverse, or "=" for both directions.
  • +
  • Target: The reaction selected as the objective function target for the gapfilling optimization problem. Targets here can be the model’s biomass reaction, commonly named “bio1” for models created by this app. + Alternatively, “rxn00062” (ATP Production) reaction is shown for cases where gapfilling was applied to guarantee ATP production in a given media. + When reactions are gapfilled for ATP production, we recommend checking the full Core ATP Analysis in Table 2 below.
  • +
  • Gapfilling Sensitivity: Gapfilling is necessary when compounds in the biomass objective function can not be produced by the model. + For each reaction we list the biomass compound(s) that can not be synthesized by the model without gapfilling. + In cases where gap filling fails there are two possible scenarios: + 1) FBF (failed before filtering) : the gapfilling immediately failed, even before we filtered out the ATP breaking reactions. This means this objective CANNOT be satisfied with the entire current database. + 2) FAF (failed after filtering): the gapfilling succeeded before filtering, but failed after filtering out reactions that break ATP. This tells you definitively if the ATP filtering caused the gapfilling to fail
  • +
+ """ + #table 2 intro text + introductory_text = """ +

During model reconstruction, we analyze the genome’s core metabolism draft model (model without gapfilling) to assess energy biosynthesis capabilities. + The goal of this analysis is to ensure the core metabolism model is able to produce ATP before we expand the model to the genome-scale. + This step is designed to prevent gapfilling from introducing reactions that create energy-generating loops. + The tests are conducted on a large collection of minimal conditions, with the goal of simulating the model’s capability to produce energy with different electron donor, electron acceptor, and carbon source combinations.

+

When the draft model of the core metabolism is capable of producing ATP in at least one of the test media, no gapfilling reactions part of this analysis will be added to the model. While we still report the gapfilling requirements for the test media formulations that fail to produce ATP with that draft core model, we only integrate these solutions in the model when no test media succeeds in producing ATP. + In this case, the integrated gap-filling solution(s) will be displayed in “Table 1 - Gapfilling Analysis” above, with the “Target” “rxn00062” (ATP Production) objective function.

+

The goal is to display the test results for all media to provide clues for the metabolic capabilities of the genome(s). When many reactions are required for growth on the SO4 testing media conditions, this could be a good indicator that the organism is not capable of performing sulfate reduction. + On the other hand, when only one gapfill reaction is required for ATP production in a given media, multiple scenarios can be considered. + 1) Organism(s) can’t grow on test condition, and we correctly did not add the reaction to the model. 2) Possible issue with the source genome annotation missing a specific gene function 3) Possible issue with the model reconstruction database. We hope this data helps make more informed decisions on reactions that may need to be manually curated in the model. + In cases where is known from the literature or unpublished experimental results that an organism is capable of producing ATP in a given media condition that requires gapfilling in this analysis, you can use the parameter “Force ATP media” in the reconstruction app to ensure those reactions are integrated into the model. + .

+ """ + # Legend text for Table 2 + annotations_text_2 = """ +
    +
  • No. of gapfilled reactions: The number of reactions filled by the gapfilling process.
  • +
  • Media: The media in which the reaction takes place.
  • +
  • ATP Production: ATP production by the core metabolism model.
  • +
  • Gapfilled Reactions: Reactions added during the gapfilling process.
  • +
  • Reversed Reaction by Gapfilling: Reactions that have been reversed during the gapfilling process.
  • +
  • Filtered Reactions: Reactions that have been filtered out during the analysis. When a reaction addition would lead to a large increase in ATP production or an infinite energy loop, we filter that reaction out of the gapfilling database and prevent it from being added to the model.
  • +
+ """ + # Save the data to HTML with the styled DataFrames and the legends + with open('testt.html', 'w') as f: + f.write('

Model Summary

') + f.write(model_summary_df_styled.render(escape=False)) + f.write('

') + if gf_sensitivity_data: + f.write('

Table 1 - Gapfillings Analysis

') + f.write(gapfillings_analysis_df_styled.render(escape=False)) + f.write(f'

Legend:

{annotations_text_1}') + else: + f.write('Gapfilling was not selected as a parameter during reconstruction of the model. As a result your model may not grow on your media object when running Flux Balance Analysis. You can gapfill your model after reconstruction by using the bew Gapiflling Metabolic Model app curently in beta') + f.write('

') + f.write('

Table 2 - Core ATP Analysis

') + f.write(gapfilling_df_styled.render(escape=False)) + f.write(f'

Legend:

{annotations_text_2}') + f.write(introductory_text) From 81dd30c00ba00589d78b6c862cbaef7856c3ef4c Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 26 Jul 2023 13:33:09 -0500 Subject: [PATCH 136/298] Adding filename for report output --- modelseedpy/core/msmodelreport.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index dccc658b..892f3169 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -2,6 +2,8 @@ import pandas as pd import logging import matplotlib.cm as cm +import os +from os.path import dirname, exists from modelseedpy.core.msmodelutl import MSModelUtil logger = logging.getLogger(__name__) @@ -17,7 +19,8 @@ def __init__( def build_report( self, - model_or_mdlutl + model_or_mdlutl, + output_path ): """Builds model HTML report Parameters @@ -255,7 +258,9 @@ def color_gradient(val): """ # Save the data to HTML with the styled DataFrames and the legends - with open('testt.html', 'w') as f: + directory = dirname(output_path) + os.makedirs(directory, exist_ok=True) + with open(output_path, 'w') as f: f.write('

Model Summary

') f.write(model_summary_df_styled.render(escape=False)) f.write('

') From 650766662847976bd3acd17296ee0c8b07bf8e06 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 26 Jul 2023 14:06:26 -0500 Subject: [PATCH 137/298] Fixing report --- modelseedpy/core/msmodelreport.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index 892f3169..e7c8b591 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -39,6 +39,9 @@ def build_report( core_atp_gapfilling_data = attributes['ATP_analysis']['core_atp_gapfilling'] gf_filter_data = attributes['gf_filter'] gf_sensitivity_data = attributes.get('gf_sensitivity') # Get 'gf_sensitivity_data' if available, otherwise it will be None + number_gapfills = 0 + if gf_sensitivity_data: + number_gapfills = len(gf_sensitivity_data) # Get the names of 'Core Gapfilling Media' and 'Gapfilling Media' core_gapfilling_media = [media for media, media_data in (gf_sensitivity_data or {}).items() if 'rxn00062_c0' in media_data] @@ -65,7 +68,7 @@ def build_report( ('Number compounds', str(len(modelutl.model.metabolites))), ('Number compartments', str(len(modelutl.model.compartments))), ('Number biomass', str(bio_count)), - ('Number gapfills', str(len(gf_sensitivity_data))), + ('Number gapfills', str(number_gapfills)), ] # Create the DataFrame for Model Summary From 28c7028a275ea50ac3085cb14255ddc2a32286f7 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 2 Aug 2023 08:57:41 -0500 Subject: [PATCH 138/298] Fixing accuracy and output and baseline growth --- modelseedpy/core/msgrowthphenotypes.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 696a6b9d..c5149923 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -94,7 +94,9 @@ def simulate( output["baseline_growth"] = 0.01 if self.parent: output["baseline_growth"] = self.parent.baseline_growth(modelutl,objective) - + if output["baseline_growth"] < 1e-5: + output["baseline_growth"] = 0.01 + #Building specific media and setting compound exception list if self.parent and self.parent.atom_limits and len(self.parent.atom_limits) > 0: reaction_exceptions = [] @@ -131,7 +133,9 @@ def simulate( output["fluxes"] = solution.fluxes #Determining phenotype class + if output["growth"] >= output["baseline_growth"]*growth_multiplier: + output["GROWING"] = True if not self.growth: output["class"] = "GROWTH" elif self.growth > 0: @@ -139,6 +143,7 @@ def simulate( elif self.growth == 0: output["class"] = "FP" else: + output["GROWING"] = False if not self.growth: output["class"] = "NOGROWTH" elif self.growth > 0: @@ -399,6 +404,7 @@ def simulate_phenotypes( } #Running simulations gapfilling_solutions = {} + totalcount = 0 for pheno in self.phenotypes: result = pheno.simulate( modelutl,objective,growth_multiplier,add_missing_exchanges,save_fluxes @@ -413,13 +419,21 @@ def simulate_phenotypes( if result["class"] == "CP": summary["Count"][1] += 1 summary["Count"][0] += 1 - if result["class"] == "CN": + totalcount += 1 + elif result["class"] == "CN": summary["Count"][2] += 1 summary["Count"][0] += 1 - if result["class"] == "FP": + totalcount += 1 + elif result["class"] == "FP": summary["Count"][3] += 1 - if result["class"] == "FN": + totalcount += 1 + elif result["class"] == "FN": summary["Count"][4] += 1 + totalcount += 1 + elif result["class"] == "GROWTH": + summary["Count"][5] += 1 + elif result["class"] == "NOGROWTH": + summary["Count"][6] += 1 #Gapfilling negative growth conditions if gapfill_negatives and output["class"] in ["NOGROWTH","FN","CN"]: gapfilling_solutions[pheno] = pheno.gapfill_model_for_phenotype(msgapfill,objective,test_conditions,growth_multiplier,add_missing_exchanges) @@ -442,10 +456,9 @@ def simulate_phenotypes( data["Gapfilled reactions"].append(None) else: data["Gapfilled reactions"].append(None) - summary["Count"][0] = summary["Count"][0] / len(self.phenotypes) + summary["Count"][0] = summary["Count"][0] / totalcount sdf = pd.DataFrame(summary) df = pd.DataFrame(data) - logger.info(df) return {"details": df, "summary": sdf} def fit_model_to_phenotypes( From 21efcbc0a7d68b6a8b21f28397f9912ca8b784a1 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 2 Aug 2023 09:20:11 -0500 Subject: [PATCH 139/298] Fixing gapfilling filter saving and complete media --- modelseedpy/core/msgapfill.py | 6 +++++- modelseedpy/fbapkg/kbasemediapkg.py | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 14371e2a..f983750a 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -57,8 +57,9 @@ def __init__( ] # the cpd11416 compound is filtered during model extension with templates # Cloning model to create gapfilling model self.gfmodel = cobra.io.json.from_json(cobra.io.json.to_json(self.model)) + self.gfmodelutl = MSModelUtil.get(self.gfmodel) # Getting package manager for gapfilling model - self.gfpkgmgr = MSPackageManager.get_pkg_mgr(self.gfmodel) + self.gfpkgmgr = MSPackageManager.get_pkg_mgr(self.gfmodelutl) # Setting target from input if default_target: self.default_target = default_target @@ -147,6 +148,9 @@ def prefilter(self, media, target): self.gfpkgmgr.getpkg("GapfillingPkg").filter_database_based_on_tests( self.test_conditions ) + base_filter = self.mdlutl.get_attributes("gf_filter") + gf_filter = self.gfmodelutl.get_attributes("gf_filter") + base_filter[media.id] = gf_filter[media.id] # Testing if gapfilling can work after filtering if not self.test_gapfill_database(media, target, before_filtering=False): diff --git a/modelseedpy/fbapkg/kbasemediapkg.py b/modelseedpy/fbapkg/kbasemediapkg.py index a3c19243..b377547e 100644 --- a/modelseedpy/fbapkg/kbasemediapkg.py +++ b/modelseedpy/fbapkg/kbasemediapkg.py @@ -40,7 +40,7 @@ def build_package( self.parameters["default_uptake"] = 0 if self.parameters["default_excretion"] is None: self.parameters["default_excretion"] = 100 - if (self.parameters["media"] is None or self.parameters["media"].name == "Complete") and self.parameters["default_uptake"] == 0: + if (self.parameters["media"] and self.parameters["media"].name == "Complete") and self.parameters["default_uptake"] == 0: self.parameters["default_uptake"] = 100 # First initializing all exchanges to default uptake and excretion From ed045508254722f2170c62b6c2cac7a93c16e605 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 3 Aug 2023 00:17:49 -0400 Subject: [PATCH 140/298] Fixing bug in phenotype accuracy computation --- modelseedpy/core/msgrowthphenotypes.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index c5149923..b0d3b2b6 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -456,7 +456,10 @@ def simulate_phenotypes( data["Gapfilled reactions"].append(None) else: data["Gapfilled reactions"].append(None) - summary["Count"][0] = summary["Count"][0] / totalcount + if totalcount == 0: + summary["Count"][0] = None + else: + summary["Count"][0] = summary["Count"][0] / totalcount sdf = pd.DataFrame(summary) df = pd.DataFrame(data) return {"details": df, "summary": sdf} From 26495773c9e27c1047b6d35f3ff9b25edaf15b35 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 3 Aug 2023 00:28:19 -0400 Subject: [PATCH 141/298] Fixing gapfilling filter attribute --- modelseedpy/core/msatpcorrection.py | 2 +- modelseedpy/core/msgapfill.py | 8 +++++--- modelseedpy/core/msmodelutl.py | 11 +++++++++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 35ee409e..59055ca6 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -444,7 +444,7 @@ def expand_model_to_genome_scale(self): self.restore_noncore_reactions(noncore=True, othercompartment=False) # Extending model with non core reactions while retaining ATP accuracy self.filtered_noncore = self.modelutl.reaction_expansion_test( - self.noncore_reactions, tests + self.noncore_reactions, tests,atp_expansion=True ) # Removing filtered reactions for item in self.filtered_noncore: diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index f983750a..575fb5b5 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -148,9 +148,11 @@ def prefilter(self, media, target): self.gfpkgmgr.getpkg("GapfillingPkg").filter_database_based_on_tests( self.test_conditions ) - base_filter = self.mdlutl.get_attributes("gf_filter") - gf_filter = self.gfmodelutl.get_attributes("gf_filter") - base_filter[media.id] = gf_filter[media.id] + gf_filter = self.gfpkgmgr.getpkg("GapfillingPkg").modelutl.get_attributes("gf_filter", {}) + base_filter = self.mdlutl.get_attributes("gf_filter", {}) + for media_id in gf_filter: + base_filter[media_id] = gf_filter[media_id] + base_filter = self.save_attributes(base_filter, "gf_filter") # Testing if gapfilling can work after filtering if not self.test_gapfill_database(media, target, before_filtering=False): diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 47064f05..607095c2 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -902,7 +902,7 @@ def binary_expansion_test(self, reaction_list, condition, currmodel, depth=0): return filtered_list def reaction_expansion_test( - self, reaction_list, condition_list, binary_search=True + self, reaction_list, condition_list, binary_search=True,atp_expansion=False ): """Adds reactions in reaction list one by one and appplies tests, filtering reactions that fail @@ -962,6 +962,10 @@ def reaction_expansion_test( ) # Adding filter results to attributes gf_filter_att = self.get_attributes("gf_filter", {}) + if atp_expansion: + atp_analysis = self.get_attributes("ATP_analysis", {}) + atp_analysis["atp_expansion_filter"] = {} + gf_filter_att = atp_analysis["atp_expansion_filter"] if condition["media"].id not in gf_filter_att: gf_filter_att[condition["media"].id] = {} if condition["objective"] not in gf_filter_att[condition["media"].id]: @@ -997,7 +1001,10 @@ def reaction_expansion_test( gf_filter_att[condition["media"].id][condition["objective"]][ condition["threshold"] ][item[0].id][item[1]] = item[2] - gf_filter_att = self.save_attributes(gf_filter_att, "gf_filter") + if atp_expansion: + atp_analysis = self.save_attributes(atp_analysis, "ATP_analysis") + else: + gf_filter_att = self.save_attributes(gf_filter_att, "gf_filter") return filtered_list ################################################################################# From 8c704488c184b6e1d31ddd43e5398eddd1644dac Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 3 Aug 2023 09:22:49 -0400 Subject: [PATCH 142/298] Fixing bug in saving of gapfilling filtering --- modelseedpy/core/msgapfill.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 575fb5b5..a3d5c5f3 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -152,7 +152,7 @@ def prefilter(self, media, target): base_filter = self.mdlutl.get_attributes("gf_filter", {}) for media_id in gf_filter: base_filter[media_id] = gf_filter[media_id] - base_filter = self.save_attributes(base_filter, "gf_filter") + base_filter = self.mdlutl.save_attributes(base_filter, "gf_filter") # Testing if gapfilling can work after filtering if not self.test_gapfill_database(media, target, before_filtering=False): From f02a4a775b85b722188400e808080f9a15084d8b Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 3 Aug 2023 23:21:23 -0400 Subject: [PATCH 143/298] fixing filter saving in attributes --- modelseedpy/core/msatpcorrection.py | 2 +- modelseedpy/core/msgapfill.py | 7 ++++++- modelseedpy/core/msmodelutl.py | 12 ++---------- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 59055ca6..6a0fcec2 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -444,7 +444,7 @@ def expand_model_to_genome_scale(self): self.restore_noncore_reactions(noncore=True, othercompartment=False) # Extending model with non core reactions while retaining ATP accuracy self.filtered_noncore = self.modelutl.reaction_expansion_test( - self.noncore_reactions, tests,atp_expansion=True + self.noncore_reactions, tests,attribute_label="atp_expansion_filter" ) # Removing filtered reactions for item in self.filtered_noncore: diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index a3d5c5f3..f716c1fd 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -148,11 +148,16 @@ def prefilter(self, media, target): self.gfpkgmgr.getpkg("GapfillingPkg").filter_database_based_on_tests( self.test_conditions ) + with open("OriginalAttributes.json", 'w') as f: + json.dump(self.mdlutl.get_attributes(), f,indent=4,skipkeys=True) + with open("GapfillingAttributes.json", 'w') as f: + json.dump(self.gfpkgmgr.getpkg("GapfillingPkg").modelutl.get_attributes(), f,indent=4,skipkeys=True) gf_filter = self.gfpkgmgr.getpkg("GapfillingPkg").modelutl.get_attributes("gf_filter", {}) base_filter = self.mdlutl.get_attributes("gf_filter", {}) for media_id in gf_filter: base_filter[media_id] = gf_filter[media_id] - base_filter = self.mdlutl.save_attributes(base_filter, "gf_filter") + with open("FinalAttributes.json", 'w') as f: + json.dump(self.mdlutl.get_attributes(), f,indent=4,skipkeys=True) # Testing if gapfilling can work after filtering if not self.test_gapfill_database(media, target, before_filtering=False): diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 607095c2..785c4f9c 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -902,7 +902,7 @@ def binary_expansion_test(self, reaction_list, condition, currmodel, depth=0): return filtered_list def reaction_expansion_test( - self, reaction_list, condition_list, binary_search=True,atp_expansion=False + self, reaction_list, condition_list, binary_search=True,attribute_label="gf_filter" ): """Adds reactions in reaction list one by one and appplies tests, filtering reactions that fail @@ -961,11 +961,7 @@ def reaction_expansion_test( + str(len(reaction_list)) ) # Adding filter results to attributes - gf_filter_att = self.get_attributes("gf_filter", {}) - if atp_expansion: - atp_analysis = self.get_attributes("ATP_analysis", {}) - atp_analysis["atp_expansion_filter"] = {} - gf_filter_att = atp_analysis["atp_expansion_filter"] + gf_filter_att = self.get_attributes(attribute_label, {}) if condition["media"].id not in gf_filter_att: gf_filter_att[condition["media"].id] = {} if condition["objective"] not in gf_filter_att[condition["media"].id]: @@ -1001,10 +997,6 @@ def reaction_expansion_test( gf_filter_att[condition["media"].id][condition["objective"]][ condition["threshold"] ][item[0].id][item[1]] = item[2] - if atp_expansion: - atp_analysis = self.save_attributes(atp_analysis, "ATP_analysis") - else: - gf_filter_att = self.save_attributes(gf_filter_att, "gf_filter") return filtered_list ################################################################################# From ca7dee2488a83d848929af8c4c3e7df6a1222d14 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Fri, 4 Aug 2023 08:44:40 -0400 Subject: [PATCH 144/298] Removing debugging from filtering code --- modelseedpy/core/msgapfill.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index f716c1fd..16634707 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -148,17 +148,11 @@ def prefilter(self, media, target): self.gfpkgmgr.getpkg("GapfillingPkg").filter_database_based_on_tests( self.test_conditions ) - with open("OriginalAttributes.json", 'w') as f: - json.dump(self.mdlutl.get_attributes(), f,indent=4,skipkeys=True) - with open("GapfillingAttributes.json", 'w') as f: - json.dump(self.gfpkgmgr.getpkg("GapfillingPkg").modelutl.get_attributes(), f,indent=4,skipkeys=True) gf_filter = self.gfpkgmgr.getpkg("GapfillingPkg").modelutl.get_attributes("gf_filter", {}) base_filter = self.mdlutl.get_attributes("gf_filter", {}) for media_id in gf_filter: base_filter[media_id] = gf_filter[media_id] - with open("FinalAttributes.json", 'w') as f: - json.dump(self.mdlutl.get_attributes(), f,indent=4,skipkeys=True) - + # Testing if gapfilling can work after filtering if not self.test_gapfill_database(media, target, before_filtering=False): return False From 0cdba7c2742d63abf6c4dc30271ec0a02293188c Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 8 Aug 2023 12:22:11 -0500 Subject: [PATCH 145/298] Adding support for building models from multiple annotations --- modelseedpy/biochem/modelseed_biochem.py | 2 +- modelseedpy/core/annotationontology.py | 275 +++++++++++++++++++++++ modelseedpy/core/msbuilder.py | 79 ++++++- 3 files changed, 353 insertions(+), 3 deletions(-) create mode 100644 modelseedpy/core/annotationontology.py diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index 287ce470..80594e0e 100644 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -495,7 +495,7 @@ class ModelSEEDBiochem: @staticmethod def get(create_if_missing=True): if not ModelSEEDBiochem.default_biochemistry: - ModelSEEDBiochem.default_biochemistry = from_local2( + ModelSEEDBiochem.default_biochemistry = from_local( config.get("biochem", "path") ) return ModelSEEDBiochem.default_biochemistry diff --git a/modelseedpy/core/annotationontology.py b/modelseedpy/core/annotationontology.py new file mode 100644 index 00000000..6685bb0a --- /dev/null +++ b/modelseedpy/core/annotationontology.py @@ -0,0 +1,275 @@ +# -*- coding: utf-8 -*- +import logging +import re +import time +import json +import sys +import pandas as pd +import cobra +from cobra import DictList + +# from builtins import None + +logger = logging.getLogger(__name__) +logger.setLevel( + logging.INFO +) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO + +#Class structure +#AnnotationOntology -> Features/Events/Terms/Ontologies +# AnnotationOntologyOntology -> Events/Terms +# AnnotationOntologyEvent -> Features/Ontology +# AnnotationOntologyFeature -> Term+Event->Evidence +# AnnotationOntologyTerm -> Ontology/Events/Featurs +# AnnotationOntologyEvidence -> -- + +allowable_score_types = ["probability","evalue","bitscore","identity","qalignstart","qalignstop","salignstart","salignstop","kmerhits","tmscore","rmsd","hmmscore"] + +class AnnotationOntologyEvidence: + def __init__(self,scores={},ref_entity=None,entity_type=None): + self.ref_entity=ref_entity + self.entity_type=entity_type + self.scores=scores + for item in self.scores: + if item not in allowable_score_types: + logger.warning(item+" not an allowable score type!") + + def to_data(self): + return { + "ref_entity":self.ref_entity, + "entity_type":self.entity_type, + "scores":self.scores + } + +class AnnotationOntologyTerm: + def __init__(self,parent,term_id,ontology): + self.id = term_id + self.parent = parent + self.ontology = ontology + self.ontology.add_term(self) + self.parent.add_term(self) + self.msrxns = set() + self.events = {} + self.features = {} + + def add_msrxns(self,rxn_ids): + for rxn_id in rxn_ids: + if rxn_id[0:6] == "MSRXN:": + rxn_id = rxn_id[6:] + self.msrxns.update([rxn_id]) + + def add_event(self,event): + self.events[event.id] = event + + def add_feature(self,feature): + self.features[feature.id] = feature + +class AnnotationOntologyOntology: + def __init__(self,parent,ontology_id): + self.id = ontology_id + self.parent = parent + self.events = {} + self.terms = {} + + def add_event(self,event): + self.events[event.id] = event + + def add_term(self,term): + self.terms[term.id] = term + +class AnnotationOntologyFeature: + def __init__(self,parent,feature_id,type=None): + self.id = feature_id + self.parent = parent + parent.add_feature(self) + self.type = type + self.event_terms = {} + self.term_events = {} + + def add_event_term(self,event,term,scores={},ref_entity=None,entity_type=None): + if event.id not in self.event_terms: + self.event_terms[event.id] = {} + self.event_terms[event.id][term.id] = AnnotationOntologyEvidence(scores,ref_entity,entity_type) + if term.id not in self.term_events: + self.term_events[term.id] = {} + self.term_events[term.id][event.id] = self.event_terms[event.id][term.id] + + def get_associated_terms(self,event_list=None,ontologies=None): + output = {} + for term in self.term_events: + if not ontologies or term.ontology.id in ontologies: + for event in self.term_events[term]: + if not event_list or event.id in event_list: + if term.id not in output: + output[term.id] = [] + output[term.id].append(self.term_events[term][event].to_data()) + return output + + def get_associated_reactions(self,prioritized_event_list=None,ontologies=None,merge_all=False): + output = {} + for term_id in self.term_events: + if not ontologies or self.parent.terms[term_id].ontology.id in ontologies: + if merge_all or not prioritized_event_list: + for event_id in self.term_events[term_id]: + if not prioritized_event_list or event_id in prioritized_event_list: + rxns = self.parent.terms[term_id].msrxns; + for rxn_id in rxns: + if rxn_id not in output: + output[rxn_id] = [] + output[rxn_id].append(self.term_events[term_id][event_id].to_data()) + else: + for event_id in prioritized_event_list: + if event_id in self.term_events[term_id]: + rxns = self.parent.terms[term_id].msrxns; + for rxn_id in rxns: + if rxn_id not in output: + output[rxn_id] = [] + output[rxn_id].append(self.term_events[term_id][event_id].to_data()) + if len(rxns) > 0: + break + return output + +class AnnotationOntologyEvent: + def __init__(self,parent,event_id,ontology_id,method,method_version=None,description=None,timestamp=None): + self.id = event_id + self.parent = parent + #Linking ontology + self.ontology = self.parent.add_ontology(ontology_id) + self.ontology.add_event(self) + if not description: + self.description = ""#TODO + else: + self.description = description + self.method = method + self.method_version = method_version + self.timestamp = timestamp + self.features = {} + + @staticmethod + def from_data(data,parent): + if "method_version" not in data: + data["method_version"] = None + if "description" not in data: + data["description"] = None + if "timestamp" not in data: + data["timestamp"] = None + self = AnnotationOntologyEvent(parent,data["event_id"],data["ontology_id"],data["method"],data["method_version"],data["description"],data["timestamp"]) + if "ontology_terms" in data: + for feature_id in data["ontology_terms"]: + feature = self.parent.add_feature(feature_id) + self.add_feature(feature) + for item in data["ontology_terms"][feature_id]: + term = self.parent.add_term(item["term"],self.ontology) + scores = {} + ref_entity = None + entity_type = None + if "evidence" in item: + if "scores" in item["evidence"]: + scores = item["evidence"]["scores"] + if "reference" in item["evidence"]: + ref_entity = item["evidence"]["reference"][1] + entity_type = item["evidence"]["reference"][0] + feature.add_event_term(self,term,scores,ref_entity,entity_type) + if "modelseed_ids" in item: + term.add_msrxns(item["modelseed_ids"]) + return self + + def add_feature(self,feature): + self.features[feature.id] = feature + + def to_data(self): + data = { + "event_id" : self.event_id, + "description" : self.event_id, + "ontology_id" : self.ontology_id, + "method" : self.method, + "method_version" : self.method_version, + "timestamp" : self.timestamp, + "ontology_terms" : {} + } + for feature in self.features: + data["ontology_terms"][feature] = { + "term":None#TODO + } + +class AnnotationOntology: + mdlutls = {} + + @staticmethod + def from_kbase_data(data,genome_ref=None): + self = AnnotationOntology(genome_ref) + if "feature_types" in data: + self.feature_types = data["feature_types"] + if "events" in data: + for event in data["events"]: + self.events += [AnnotationOntologyEvent.from_data(event,self)] + return self + + def __init__(self,genome_ref): + self.genome_ref = genome_ref + self.events = DictList() + self.terms = {} + self.ontologies = {} + self.genes = {} + self.cdss = {} + self.noncodings = {} + self.feature_types = {} + + def get_reaction_gene_hash(self,prioritized_event_list=None,ontologies=None,merge_all=False,type="genes"): + output = {} + if type == "genes" and len(self.genes) > 0: + for feature_id in self.genes: + output[feature_id] = self.genes[feature_id].get_associated_reactions(prioritized_event_list,ontologies,merge_all) + elif len(self.cdss) > 0: + for feature_id in self.cdss: + output[feature_id] = self.cdss[feature_id].get_associated_reactions(prioritized_event_list,ontologies,merge_all) + return output + + def add_term(self,term_or_id,ontology=None): + if not isinstance(term_or_id, AnnotationOntologyTerm): + if term_or_id in self.terms: + return self.terms[term_or_id] + else: + return AnnotationOntologyTerm(self,term_or_id,ontology) + if term_or_id.id in self.terms: + logger.critical("Term with id "+term_or_id.id+" already in annotation!") + return self.terms[term_or_id.id] + else: + self.terms[term_or_id.id] = term_or_id + + def add_ontology(self,ontology_or_id): + if not isinstance(ontology_or_id, AnnotationOntologyOntology): + if ontology_or_id in self.ontologies: + return self.ontologies[ontology_or_id] + else: + return AnnotationOntologyOntology(self,ontology_or_id) + if ontology_or_id.id in self.ontologies: + logger.critical("Ontology with id "+ontology_or_id.id+" already in annotation!") + return self.ontologies[ontology_or_id.id] + else: + self.ontologies[ontology_or_id.id] = ontology_or_id + + def get_feature_hash(self,feature_id): + feature_hash = self.genes + if feature_id in self.feature_types: + if self.feature_types[feature_id] == "cds": + feature_hash = self.cdss + elif self.feature_types[feature_id] == "noncoding": + feature_hash = self.noncodings + return feature_hash + + def add_feature(self,feature_or_id): + feature_hash = None + if not isinstance(feature_or_id, AnnotationOntologyFeature): + feature_hash = self.get_feature_hash(feature_or_id) + if feature_or_id in feature_hash: + return feature_hash[feature_or_id] + else: + feature_or_id = AnnotationOntologyFeature(self,feature_or_id) + if not feature_hash: + feature_hash = self.get_feature_hash(feature_or_id.id) + if feature_or_id.id in feature_hash: + logger.critical("Feature with id "+feature_or_id.id+" already in annotation!") + else: + feature_hash[feature_or_id.id] = feature_or_id + return feature_hash[feature_or_id.id] diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 3a78188a..2825fdea 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -13,6 +13,8 @@ from cobra.core import Gene, Metabolite, Model, Reaction, Group from modelseedpy.core import FBAHelper from modelseedpy.fbapkg.mspackagemanager import MSPackageManager +from modelseedpy.biochem.modelseed_biochem import ModelSEEDBiochem +from modelseedpy.biochem.modelseed_to_cobra import modelseed_to_cobra_reaction SBO_ANNOTATION = "sbo" @@ -728,6 +730,75 @@ def build_metabolic_reactions(self): reactions.append(reaction) return reactions + + def build_from_annotaton_ontology( + self, + model_or_id, + anno_ont, + index="0", + allow_all_non_grp_reactions=False, + annotate_with_rast=True, + biomass_classic=False, + biomass_gc=0.5, + add_non_template_reactions=True, + prioritized_event_list=None, + ontologies=None, + merge_all=False + ): + #Build base model without annotation + model_or_id = self.build(model_or_id,index,allow_all_non_grp_reactions,annotate_with_rast,biomass_classic,biomass_gc) + + gene_associated_reactions = self.build_reactions_from_annotaton_ontology(anno_ont,add_non_template_reactions,prioritized_event_list,ontologies,merge_all) + cobra_model.add_reactions(gene_associated_reactions) + return cobra_model + + def build_reactions_from_annotaton_ontology( + self, + anno_ont, + add_non_template_reactions=True, + prioritized_event_list=None, + ontologies=None, + merge_all=False + ): + if self.base_model is None: + raise ModelSEEDError( + "unable to generate metabolic reactions without base model" + ) + + reactions = [] + rxn_gene_hash = anno_ont.get_reaction_gene_hash(prioritized_event_list,ontologies,merge_all) + modelseeddb = ModelSEEDBiochem.get() + for rxn_id in rxn_gene_hash: + reaction = None + template_reaction = None + if rxn_id+"_c" in self.template.reactions: + template_reaction = self.template.reactions.get_by_id(rxn_id+"_c") + elif rxn_id in modelseeddb.reactions: + msrxn = modelseeddb.reactions.get_by_id(rxn_id) + template_reaction = msrxn.to_template_reaction({0:"c",1:"e"}) + if template_reaction: + for m in template_reaction.metabolites: + if m.compartment not in self.compartments: + self.compartments[ + m.compartment + ] = self.template.compartments.get_by_id(m.compartment) + if m.id not in self.template_species_to_model_species: + model_metabolite = m.to_metabolite(self.index) + self.template_species_to_model_species[m.id] = model_metabolite + self.base_model.add_metabolites([model_metabolite]) + reaction = template_reaction.to_reaction(self.base_model, self.index) + gpr = "" + for gene_id in rxn_gene_hash[rxn_id]: + if len(gpr) > 0: + gpr += " or " + gpr += gene_id + reaction.gpr(gpr) + reaction.annotation[SBO_ANNOTATION] = "SBO:0000176" + reactions.append(reaction) + else: + print("Reaction ",rxn_id," not found in template or database!") + + return reactions def build_non_metabolite_reactions( self, cobra_model, allow_all_non_grp_reactions=False @@ -813,6 +884,7 @@ def build( annotate_with_rast=True, biomass_classic=False, biomass_gc=0.5, + add_reaction_from_rast_annotation=True ): """ @@ -850,8 +922,11 @@ def build( complex_groups = self.build_complex_groups( self.reaction_to_complex_sets.values() ) - metabolic_reactions = self.build_metabolic_reactions() - cobra_model.add_reactions(metabolic_reactions) + + if add_reaction_from_rast_annotation: + metabolic_reactions = self.build_metabolic_reactions() + cobra_model.add_reactions(metabolic_reactions) + non_metabolic_reactions = self.build_non_metabolite_reactions( cobra_model, allow_all_non_grp_reactions ) From cdea5d6fa20302c0cdd87c249f5b523b0c63ebbf Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 8 Aug 2023 12:27:08 -0500 Subject: [PATCH 146/298] Fixing gene hash function --- modelseedpy/core/annotationontology.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/modelseedpy/core/annotationontology.py b/modelseedpy/core/annotationontology.py index 6685bb0a..7bb56793 100644 --- a/modelseedpy/core/annotationontology.py +++ b/modelseedpy/core/annotationontology.py @@ -215,14 +215,19 @@ def __init__(self,genome_ref): self.noncodings = {} self.feature_types = {} - def get_reaction_gene_hash(self,prioritized_event_list=None,ontologies=None,merge_all=False,type="genes"): + def get_reaction_gene_hash(self,prioritized_event_list=None,ontologies=None,merge_all=False,cds_features=False): output = {} - if type == "genes" and len(self.genes) > 0: - for feature_id in self.genes: - output[feature_id] = self.genes[feature_id].get_associated_reactions(prioritized_event_list,ontologies,merge_all) - elif len(self.cdss) > 0: - for feature_id in self.cdss: - output[feature_id] = self.cdss[feature_id].get_associated_reactions(prioritized_event_list,ontologies,merge_all) + feature_hash = self.genes + if len(self.genes) == 0 or (cds_features and len(self.cdss) == 0): + feature_hash = self.cdss + for feature_id in feature_hash: + reactions = feature_hash[feature_id].get_associated_reactions(prioritized_event_list,ontologies,merge_all) + for rxn_id in reactions: + if rxn_id not in output: + output[rxn_id] = {} + if feature_id not in output[rxn_id]: + output[rxn_id][feature_id] = [] + output[rxn_id][feature_id].append(reactions[rxn_id]) return output def add_term(self,term_or_id,ontology=None): From 894cee0946b6b77e2c643bb9cc709340adb250c4 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 8 Aug 2023 12:33:19 -0500 Subject: [PATCH 147/298] Fixing add feature function --- modelseedpy/core/annotationontology.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modelseedpy/core/annotationontology.py b/modelseedpy/core/annotationontology.py index 7bb56793..e75a14ca 100644 --- a/modelseedpy/core/annotationontology.py +++ b/modelseedpy/core/annotationontology.py @@ -273,8 +273,6 @@ def add_feature(self,feature_or_id): feature_or_id = AnnotationOntologyFeature(self,feature_or_id) if not feature_hash: feature_hash = self.get_feature_hash(feature_or_id.id) - if feature_or_id.id in feature_hash: - logger.critical("Feature with id "+feature_or_id.id+" already in annotation!") - else: + if feature_or_id.id not in feature_hash: feature_hash[feature_or_id.id] = feature_or_id return feature_hash[feature_or_id.id] From 47de2c8719b676d5c69fb861d00aaa1cb3bf1e08 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 8 Aug 2023 12:45:44 -0500 Subject: [PATCH 148/298] Fixing problem with ModelSEEDDatabase reactions --- modelseedpy/core/msbuilder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 2825fdea..5e80774a 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -774,7 +774,7 @@ def build_reactions_from_annotaton_ontology( if rxn_id+"_c" in self.template.reactions: template_reaction = self.template.reactions.get_by_id(rxn_id+"_c") elif rxn_id in modelseeddb.reactions: - msrxn = modelseeddb.reactions.get_by_id(rxn_id) + msrxn = modelseeddb.reactions[rxn_id] template_reaction = msrxn.to_template_reaction({0:"c",1:"e"}) if template_reaction: for m in template_reaction.metabolites: From 951bce1cb092cf8cb98906bdfed63849c0ef0935 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 10 Aug 2023 07:06:24 -0700 Subject: [PATCH 149/298] Fixing annotation ontology and build from annotation ontology --- modelseedpy/core/annotationontology.py | 59 +++++++++++--- modelseedpy/core/msbuilder.py | 102 +++++++++++++------------ 2 files changed, 102 insertions(+), 59 deletions(-) diff --git a/modelseedpy/core/annotationontology.py b/modelseedpy/core/annotationontology.py index e75a14ca..4750ed13 100644 --- a/modelseedpy/core/annotationontology.py +++ b/modelseedpy/core/annotationontology.py @@ -94,17 +94,28 @@ def add_event_term(self,event,term,scores={},ref_entity=None,entity_type=None): self.term_events[term.id] = {} self.term_events[term.id][event.id] = self.event_terms[event.id][term.id] - def get_associated_terms(self,event_list=None,ontologies=None): + def get_associated_terms(self,prioritized_event_list=None,ontologies=None,merge_all=False,translate_to_rast=False): output = {} - for term in self.term_events: + for term_id in self.term_events: + term = self.parent.terms[term_id] if not ontologies or term.ontology.id in ontologies: - for event in self.term_events[term]: - if not event_list or event.id in event_list: - if term.id not in output: - output[term.id] = [] - output[term.id].append(self.term_events[term][event].to_data()) + if merge_all or not prioritized_event_list: + for event_id in self.term_events[term_id]: + if not prioritized_event_list or event_id in prioritized_event_list: + if term not in output: + output[term] = [] + output[term].append(self.term_events[term_id][event_id].to_data()) + else: + for event_id in prioritized_event_list: + if event_id in self.term_events[term_id]: + rxns = self.parent.terms[term_id].msrxns; + if len(rxns) > 0: + if term not in output: + output[term] = [] + output[term].append(self.term_events[term_id][event_id].to_data()) + break return output - + def get_associated_reactions(self,prioritized_event_list=None,ontologies=None,merge_all=False): output = {} for term_id in self.term_events: @@ -196,8 +207,8 @@ class AnnotationOntology: mdlutls = {} @staticmethod - def from_kbase_data(data,genome_ref=None): - self = AnnotationOntology(genome_ref) + def from_kbase_data(data,genome_ref=None,data_dir=None): + self = AnnotationOntology(genome_ref,data_dir) if "feature_types" in data: self.feature_types = data["feature_types"] if "events" in data: @@ -205,15 +216,41 @@ def from_kbase_data(data,genome_ref=None): self.events += [AnnotationOntologyEvent.from_data(event,self)] return self - def __init__(self,genome_ref): + def __init__(self,genome_ref,data_dir): self.genome_ref = genome_ref self.events = DictList() self.terms = {} self.ontologies = {} self.genes = {} self.cdss = {} + self.data_dir = data_dir self.noncodings = {} self.feature_types = {} + self.term_names = {} + + def get_term_name(self,term): + if term.ontology.id not in self.term_names: + self.term_names[term.ontology.id] = {} + if term.ontology.id in ["SSO","AntiSmash","EC","TC","META","RO","KO","GO"]: + with open(self.data_dir + "/"+term.ontology.id+"_dictionary.json") as json_file: + ontology = json.load(json_file) + for item in ontology["term_hash"]: + self.term_names[term.ontology.id][item] = ontology["term_hash"][item]["name"] + if term.id not in self.term_names[term.ontology.id]: + return "Unknown" + return self.term_names[term.ontology.id][term.id] + + def get_gene_term_hash(self,prioritized_event_list=None,ontologies=None,merge_all=False,cds_features=False,translate_to_rast=True): + output = {} + feature_hash = self.genes + if len(self.genes) == 0 or (cds_features and len(self.cdss) == 0): + feature_hash = self.cdss + for feature_id in feature_hash: + feature = feature_hash[feature_id] + if feature not in output: + output[feature] = {} + output[feature] = feature.get_associated_terms(prioritized_event_list,ontologies,merge_all,translate_to_rast) + return output def get_reaction_gene_hash(self,prioritized_event_list=None,ontologies=None,merge_all=False,cds_features=False): output = {} diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 5e80774a..005dc9ee 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -737,68 +737,74 @@ def build_from_annotaton_ontology( anno_ont, index="0", allow_all_non_grp_reactions=False, - annotate_with_rast=True, + annotate_with_rast=False, biomass_classic=False, biomass_gc=0.5, add_non_template_reactions=True, prioritized_event_list=None, ontologies=None, - merge_all=False + merge_all=True, + convert_to_sso=True ): #Build base model without annotation - model_or_id = self.build(model_or_id,index,allow_all_non_grp_reactions,annotate_with_rast,biomass_classic,biomass_gc) - - gene_associated_reactions = self.build_reactions_from_annotaton_ontology(anno_ont,add_non_template_reactions,prioritized_event_list,ontologies,merge_all) - cobra_model.add_reactions(gene_associated_reactions) - return cobra_model - - def build_reactions_from_annotaton_ontology( - self, - anno_ont, - add_non_template_reactions=True, - prioritized_event_list=None, - ontologies=None, - merge_all=False - ): - if self.base_model is None: - raise ModelSEEDError( - "unable to generate metabolic reactions without base model" - ) + self.search_name_to_orginal = {} + self.search_name_to_genes = {} + gene_term_hash = anno_ont.get_gene_term_hash(prioritized_event_list,ontologies,merge_all,convert_to_sso) + residual_reaction_gene_hash = {} + for gene in gene_term_hash: + for term in gene_term_hash[gene]: + if term.ontology.id == "SSO": + name = anno_ont.get_term_name(term) + f_norm = normalize_role(name) + if f_norm not in self.search_name_to_genes: + self.search_name_to_genes[f_norm] = set() + self.search_name_to_orginal[f_norm] = set() + self.search_name_to_orginal[f_norm].add(name) + self.search_name_to_genes[f_norm].add(gene.id) + else: + for rxn_id in term.msrxns: + if rxn_id not in residual_reaction_gene_hash: + residual_reaction_gene_hash[rxn_id] = {} + if gene not in residual_reaction_gene_hash[rxn_id]: + residual_reaction_gene_hash[rxn_id][gene] = [] + residual_reaction_gene_hash[rxn_id][gene] = gene_term_hash[gene][term] + model_or_id = self.build(model_or_id,index,allow_all_non_grp_reactions,annotate_with_rast,biomass_classic,biomass_gc) reactions = [] - rxn_gene_hash = anno_ont.get_reaction_gene_hash(prioritized_event_list,ontologies,merge_all) modelseeddb = ModelSEEDBiochem.get() - for rxn_id in rxn_gene_hash: - reaction = None - template_reaction = None - if rxn_id+"_c" in self.template.reactions: - template_reaction = self.template.reactions.get_by_id(rxn_id+"_c") - elif rxn_id in modelseeddb.reactions: - msrxn = modelseeddb.reactions[rxn_id] - template_reaction = msrxn.to_template_reaction({0:"c",1:"e"}) - if template_reaction: - for m in template_reaction.metabolites: - if m.compartment not in self.compartments: - self.compartments[ - m.compartment - ] = self.template.compartments.get_by_id(m.compartment) - if m.id not in self.template_species_to_model_species: - model_metabolite = m.to_metabolite(self.index) - self.template_species_to_model_species[m.id] = model_metabolite - self.base_model.add_metabolites([model_metabolite]) + for rxn_id in residual_reaction_gene_hash: + if rxn_id+"_c0" not in model_or_id.reactions: + reaction = None + template_reaction = None + if rxn_id+"_c" in self.template.reactions: + template_reaction = self.template.reactions.get_by_id(rxn_id+"_c") + elif rxn_id in modelseeddb.reactions: + msrxn = modelseeddb.reactions.get_by_id(rxn_id) + template_reaction = msrxn.to_template_reaction({0:"c",1:"e"}) + if template_reaction: + for m in template_reaction.metabolites: + if m.compartment not in self.compartments: + self.compartments[ + m.compartment + ] = self.template.compartments.get_by_id(m.compartment) + if m.id not in self.template_species_to_model_species: + model_metabolite = m.to_metabolite(self.index) + self.template_species_to_model_species[m.id] = model_metabolite + self.base_model.add_metabolites([model_metabolite]) reaction = template_reaction.to_reaction(self.base_model, self.index) - gpr = "" - for gene_id in rxn_gene_hash[rxn_id]: - if len(gpr) > 0: - gpr += " or " - gpr += gene_id - reaction.gpr(gpr) - reaction.annotation[SBO_ANNOTATION] = "SBO:0000176" - reactions.append(reaction) + gpr = "" + for gene in residual_reaction_gene_hash[rxn_id]: + if len(gpr) > 0: + gpr += " or " + gpr += gene.id + reaction.gene_reaction_rule = gpr + reaction.annotation[SBO_ANNOTATION] = "SBO:0000176" + reactions.append(reaction) else: print("Reaction ",rxn_id," not found in template or database!") - return reactions + model_or_id.add_reactions(reactions) + return model_or_id def build_non_metabolite_reactions( self, cobra_model, allow_all_non_grp_reactions=False From be8dcd1778c2bead9b509fd735b41a89d427ec88 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 10 Aug 2023 08:23:00 -0700 Subject: [PATCH 150/298] Correcting message output in ontology builder --- modelseedpy/core/msbuilder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 005dc9ee..2c2ffc9d 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -800,8 +800,8 @@ def build_from_annotaton_ontology( reaction.gene_reaction_rule = gpr reaction.annotation[SBO_ANNOTATION] = "SBO:0000176" reactions.append(reaction) - else: - print("Reaction ",rxn_id," not found in template or database!") + if not reaction: + print("Reaction ",rxn_id," not found in template or database!") model_or_id.add_reactions(reactions) return model_or_id From 0af0299b5708e06005e574ae626260d8e3aee07a Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 17 Aug 2023 14:32:43 -0500 Subject: [PATCH 151/298] Checking in first draft of tempalte --- modelseedpy/data/ModelReportTemplate.html | 138 ++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 modelseedpy/data/ModelReportTemplate.html diff --git a/modelseedpy/data/ModelReportTemplate.html b/modelseedpy/data/ModelReportTemplate.html new file mode 100644 index 00000000..ca506882 --- /dev/null +++ b/modelseedpy/data/ModelReportTemplate.html @@ -0,0 +1,138 @@ + +
+ModelSEED Reconstruction + + + +
+ +
+ + + + + + + + \ No newline at end of file From 58cc3c2f6ecc0cbfc0aa6d3eac83e49c4b71ae56 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 17 Aug 2023 14:35:36 -0500 Subject: [PATCH 152/298] Fixing template --- modelseedpy/data/ModelReportTemplate.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modelseedpy/data/ModelReportTemplate.html b/modelseedpy/data/ModelReportTemplate.html index ca506882..738eb5e6 100644 --- a/modelseedpy/data/ModelReportTemplate.html +++ b/modelseedpy/data/ModelReportTemplate.html @@ -89,8 +89,7 @@ From de30b92e605b4f5ac6eaf4f03f854b5e318b252a Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 23 Aug 2023 23:30:16 -0500 Subject: [PATCH 154/298] Adding probabilities for ensemble models --- modelseedpy/core/msbuilder.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 2c2ffc9d..8879cf5e 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -770,6 +770,20 @@ def build_from_annotaton_ontology( residual_reaction_gene_hash[rxn_id][gene] = gene_term_hash[gene][term] model_or_id = self.build(model_or_id,index,allow_all_non_grp_reactions,annotate_with_rast,biomass_classic,biomass_gc) + for rxn in model_or_id.reactions: + probability = None + for gene in rxn.genes(): + annoont_gene = anno_ont.get_feature(gene.id) + if annoont_gene and annoont_gene in gene_term_hash: + for term in gene_term_hash[annoont_gene]: + if rxn.id[0:-3] in term.msrxns: + for item in gene_term_hash[gene][term]: + if "probability" in item.scores: + if not probability or item.scores["probability"] > probability: + probability = item.scores["probability"] + if hasattr(rxn, "probability"): + rxn.probability = probability + reactions = [] modelseeddb = ModelSEEDBiochem.get() for rxn_id in residual_reaction_gene_hash: @@ -793,10 +807,17 @@ def build_from_annotaton_ontology( self.base_model.add_metabolites([model_metabolite]) reaction = template_reaction.to_reaction(self.base_model, self.index) gpr = "" + probability = None for gene in residual_reaction_gene_hash[rxn_id]: + for item in residual_reaction_gene_hash[rxn_id][gene]: + if "probability" in item["scores"]: + if not probability or item["scores"]["probability"] > probability + probability = item["scores"]["probability"] if len(gpr) > 0: gpr += " or " gpr += gene.id + if hasattr(rxn, "probability"): + reaction.probability = probability reaction.gene_reaction_rule = gpr reaction.annotation[SBO_ANNOTATION] = "SBO:0000176" reactions.append(reaction) From 6ee54a2c7b6381b7e9c89c7d27ef95fa4179e1ee Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 23 Aug 2023 23:49:56 -0500 Subject: [PATCH 155/298] Fixing bug --- modelseedpy/core/msbuilder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 8879cf5e..9953f2a9 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -811,7 +811,7 @@ def build_from_annotaton_ontology( for gene in residual_reaction_gene_hash[rxn_id]: for item in residual_reaction_gene_hash[rxn_id][gene]: if "probability" in item["scores"]: - if not probability or item["scores"]["probability"] > probability + if not probability or item["scores"]["probability"] > probability: probability = item["scores"]["probability"] if len(gpr) > 0: gpr += " or " From 9c2cff13cba1ae2ffdd3b09da843f3aa49f4fb94 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 24 Aug 2023 17:21:50 -0500 Subject: [PATCH 156/298] Fixing bug in report when gapfilling isn't run --- modelseedpy/core/msmodelreport.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index e7c8b591..2a635dc0 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -34,14 +34,22 @@ def build_report( # Process the data attributes = modelutl.get_attributes() + gf_filter_data = {} + selected_media_data = {} + core_atp_gapfilling_data = {} - selected_media_data = attributes['ATP_analysis']['selected_media'] - core_atp_gapfilling_data = attributes['ATP_analysis']['core_atp_gapfilling'] - gf_filter_data = attributes['gf_filter'] gf_sensitivity_data = attributes.get('gf_sensitivity') # Get 'gf_sensitivity_data' if available, otherwise it will be None number_gapfills = 0 if gf_sensitivity_data: number_gapfills = len(gf_sensitivity_data) + if 'ATP_analysis' in attributes: + if 'selected_media' in attributes['ATP_analysis']: + selected_media_data = attributes['ATP_analysis']['selected_media'] + if 'core_atp_gapfilling' in attributes['ATP_analysis']: + core_atp_gapfilling_data = attributes['ATP_analysis']['core_atp_gapfilling'] + gf_filter_data = attributes['gf_filter'] + if 'gf_filter' in attributes: + gf_filter_data = attributes['gf_filter'] # Get the names of 'Core Gapfilling Media' and 'Gapfilling Media' core_gapfilling_media = [media for media, media_data in (gf_sensitivity_data or {}).items() if 'rxn00062_c0' in media_data] From 645be000d1e8e3792cd2e2ea4b34b59064e6b212 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 24 Aug 2023 22:27:13 +0000 Subject: [PATCH 157/298] Updates to report code --- modelseedpy/core/msmodelreport.py | 139 ++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index e7c8b591..10510a96 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -3,8 +3,10 @@ import logging import matplotlib.cm as cm import os +import jinja2 from os.path import dirname, exists from modelseedpy.core.msmodelutl import MSModelUtil +module_path = dirname(os.path.abspath(__file__)) logger = logging.getLogger(__name__) logger.setLevel( @@ -17,6 +19,143 @@ def __init__( ): pass + def build_multitab_report(self, model_or_mdlutl, output_path): + + # Helper function for extracting gapfilling data + def extract_gapfilling_data(gf_sensitivity, model): + gapfilling_entries = [] + + if not gf_sensitivity: + return [] + + for media, media_data in gf_sensitivity.items(): + for target, target_data in media_data.items(): + for reaction_id, reaction_data in target_data.get('success', {}).items(): + for direction, metabolites in reaction_data.items(): + entry = { + "reaction_id": reaction_id, + "reaction_name": model.reactions.get_by_id(reaction_id).name if reaction_id in model.reactions else reaction_id, + "media": media, + "direction": direction, + "target": target, + "gapfilling_sensitivity": "; ".join(metabolites) if isinstance(metabolites, (list, tuple)) else str(metabolites) + } + gapfilling_entries.append(entry) + + return gapfilling_entries + + context = { + "overview": [{"Model": "Model 3", "Genome": "Genome C"}, {"Model": "Model 4", "Genome": "Genome D"}], + "reactions": [], + "compounds": [], + "genes": [], + "biomass": [], + "gapfilling": [], + "atpanalysis": [{'no_of_gapfilled_reactions': 5, 'media': 'LB', 'atp_production': 'High', 'gapfilled_reactions': 'R005; R006', 'reversed_reaction_by_gapfilling': 'R007', 'filtered_reactions': 'R008; R009'}], + } + + print("Module Path:", module_path + "/../data/") + + exchanges = {r.id for r in model_or_mdlutl.exchanges} + + # Identify biomass reactions using SBO annotation + biomass_reactions_ids = {rxn.id for rxn in model_or_mdlutl.reactions if rxn.annotation.get('sbo') == 'SBO:0000629'} + + # Reactions Tab + for rxn in model_or_mdlutl.reactions: + if rxn.id not in exchanges and rxn.id not in biomass_reactions_ids: + equation = rxn.build_reaction_string(use_metabolite_names=True) + rxn_data = { + "id": rxn.id, + "name": rxn.name, + "equation": equation, + "genes": rxn.gene_reaction_rule, + "gapfilling": "TBD" + } + context["reactions"].append(rxn_data) + + # Compounds Tab + for cpd in model_or_mdlutl.metabolites: + cpd_data = { + "id": cpd.id, + "name": cpd.name, + "formula": cpd.formula, + "charge": cpd.charge, + "compartment": cpd.compartment + } + context["compounds"].append(cpd_data) + + # Genes Tab + for gene in model_or_mdlutl.genes: + gene_data = { + "gene": gene.id, + "reactions": "; ".join([rxn.id for rxn in gene.reactions]) + } + context["genes"].append(gene_data) + + # Biomass Tab + if biomass_reactions_ids: + for biomass_rxn_id in biomass_reactions_ids: + biomass_rxn = model_or_mdlutl.reactions.get_by_id(biomass_rxn_id) + for metabolite, coefficient in biomass_rxn.metabolites.items(): + compound_id = metabolite.id + compound_name = metabolite.name.split('_')[0] + compartment = compound_id.split('_')[-1] + + biomass_data = { + "biomass_reaction_id": biomass_rxn.id, + "biomass_compound_id": compound_id, + "name": compound_name, + "coefficient": coefficient, + "compartment": compartment + } + context["biomass"].append(biomass_data) + else: + print("No biomass reactions found in the model.") + + # Gapfilling Tab + gf_sensitivity = model_or_mdlutl.attributes.get('gf_sensitivity', None) + gapfilling_data = extract_gapfilling_data(gf_sensitivity, model_or_mdlutl) + context["gapfilling"] = gapfilling_data + + # Diagnostics + unique_biomass_rxns = biomass_reactions_ids + print(f"Unique biomass reactions identified: {len(unique_biomass_rxns)}") + print(f"Biomass Reaction IDs: {', '.join(unique_biomass_rxns)}") + + print("\nFirst 2 reactions:") + for rxn in context["reactions"][:2]: + print(rxn) + + print("\nFirst 2 compounds:") + for cpd in context["compounds"][:2]: + print(cpd) + + print("\nFirst 2 genes:") + for gene in context["genes"][:2]: + print(gene) + + print("\nFirst 2 biomass compounds:") + for bm in context["biomass"][:2]: + print(bm) + + print("\nFirst 2 gapfilling entries:") + for gf in context["gapfilling"][:2]: + print(gf) + + # Render with template + env = jinja2.Environment( + loader=jinja2.FileSystemLoader(module_path + "/../data/"), + autoescape=jinja2.select_autoescape(['html', 'xml']) + ) + html = env.get_template("ModelReportTemplate.html").render(context) + directory = dirname(output_path) + os.makedirs(directory, exist_ok=True) + with open(output_path, 'w') as f: + f.write(html) + + + def build_report( self, model_or_mdlutl, From ec198d8d8fb606ee06e8b8fef20cb9ade6a08c6d Mon Sep 17 00:00:00 2001 From: jplfaria Date: Fri, 25 Aug 2023 16:19:34 +0000 Subject: [PATCH 158/298] adding multi tab model report --- modelseedpy/core/msmodelreport.py | 137 ++++++- modelseedpy/data/ModelReportTemplate.html | 476 ++++++++++++++++------ 2 files changed, 469 insertions(+), 144 deletions(-) diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index b4a73815..e7521dcc 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -23,35 +23,135 @@ def build_multitab_report(self, model_or_mdlutl, output_path): # Helper function for extracting gapfilling data def extract_gapfilling_data(gf_sensitivity, model): - gapfilling_entries = [] + if gf_sensitivity is None: + return [], {} - if not gf_sensitivity: - return [] + gapfilling_dict = {} + gapfilling_summary = {} for media, media_data in gf_sensitivity.items(): for target, target_data in media_data.items(): for reaction_id, reaction_data in target_data.get('success', {}).items(): for direction, metabolites in reaction_data.items(): + # If metabolites is None, set to empty string + if metabolites is None: + metabolites = "" + + # Extract both IDs and Names for Gapfilling Sensitivity + sensitivity_ids = [] + sensitivity_names = [] + if isinstance(metabolites, (list, tuple)): + for met_id in metabolites: + sensitivity_ids.append(met_id) + met_name = model.metabolites.get_by_id(met_id).name if met_id in model.metabolites else met_id + sensitivity_names.append(met_name) + else: + metabolites = str(metabolites) entry = { "reaction_id": reaction_id, "reaction_name": model.reactions.get_by_id(reaction_id).name if reaction_id in model.reactions else reaction_id, "media": media, "direction": direction, "target": target, - "gapfilling_sensitivity": "; ".join(metabolites) if isinstance(metabolites, (list, tuple)) else str(metabolites) + "gapfilling_sensitivity_id": "; ".join(sensitivity_ids) if sensitivity_ids else metabolites, + "gapfilling_sensitivity_name": "; ".join(sensitivity_names) if sensitivity_names else metabolites } - gapfilling_entries.append(entry) + + # Update the summary dictionary + if reaction_id not in gapfilling_summary: + gapfilling_summary[reaction_id] = [] + gapfilling_summary[reaction_id].append(f"{media}: {direction}") + + # Check if reaction_id is already in dictionary + if reaction_id in gapfilling_dict: + # Update the media + existing_entry = gapfilling_dict[reaction_id] + existing_media = existing_entry["media"].split("; ") + if media not in existing_media: + existing_media.append(media) + existing_entry["media"] = "; ".join(existing_media) + else: + gapfilling_dict[reaction_id] = entry + + return list(gapfilling_dict.values()), gapfilling_summary + + # Extract ATP analysis data + def extract_atp_analysis_data(atp_analysis, atp_expansion_filter): + entries = [] + if atp_analysis and 'core_atp_gapfilling' in atp_analysis: + for media, data in atp_analysis['core_atp_gapfilling'].items(): + score = data.get('score', None) + new_reactions = ["{}: {}".format(k, v) for k, v in data.get('new', {}).items()] + reversed_reactions = ["{}: {}".format(k, v) for k, v in data.get('reversed', {}).items()] + + # Extracting the "Filtered Reactions" in the required format + filtered_reactions = [] + for k, v in atp_expansion_filter.get(media, {}).items(): + if isinstance(v, dict): + for sub_k, sub_v in v.items(): + if isinstance(sub_v, dict): + for reaction, direction_dict in sub_v.items(): + direction = list(direction_dict.keys())[0] + filtered_reactions.append(f"{reaction}: {direction}") + filtered_reactions_str = "; ".join(filtered_reactions) + + if score is not None: + entries.append({ + 'media': media, + 'no_of_gapfilled_reactions': score, + 'gapfilled_reactions': "; ".join(new_reactions), + 'reversed_reaction_by_gapfilling': "; ".join(reversed_reactions), + 'filtered_reactions': filtered_reactions_str + }) + # Sorting the entries based on the 'no_of_gapfilled_reactions' column + entries.sort(key=lambda x: x['no_of_gapfilled_reactions']) + return entries - return gapfilling_entries + # Extract ATP production data for the ATP Analysis tab + def extract_atp_production_data(atp_analysis): + atp_production_dict = {} + if atp_analysis: + selected_media = atp_analysis.get('selected_media', {}) + core_atp_gapfilling = atp_analysis.get('core_atp_gapfilling', {}) + # First, process selected_media + for media, value in selected_media.items(): + atp_production_dict[media] = round(value, 2) + + # Next, process core_atp_gapfilling for media not in selected_media + for media, data in core_atp_gapfilling.items(): + if media not in atp_production_dict: + if data.get('failed'): + atp_production_dict[media] = 'failed' + else: + # If the media was not processed in selected_media and it's not failed, set as 'Not Integrated' + atp_production_dict[media] = 'Not Integrated' + + return atp_production_dict + + # Get gf_sensitivity attribute from the model + gf_sensitivity = model_or_mdlutl.attributes.get('gf_sensitivity', None) + + # Extract gapfilling data + gapfilling_entries, gapfilling_reaction_summary = extract_gapfilling_data(gf_sensitivity, model_or_mdlutl) + + # Check if ATP_analysis attribute is present in the model + atp_analysis = model_or_mdlutl.attributes.get('ATP_analysis', None) + if atp_analysis: + atp_expansion_filter = model_or_mdlutl.attributes.get('atp_expansion_filter', {}) + atp_analysis_entries = extract_atp_analysis_data(atp_analysis, atp_expansion_filter) + else: + atp_analysis_entries = [] + + # Initialize context dictionary context = { - "overview": [{"Model": "Model 3", "Genome": "Genome C"}, {"Model": "Model 4", "Genome": "Genome D"}], + "overview": [{"Model": "Model 5", "Genome": "Genome C"}, {"Model": "Model 5", "Genome": "Genome D"}], "reactions": [], "compounds": [], "genes": [], "biomass": [], - "gapfilling": [], - "atpanalysis": [{'no_of_gapfilled_reactions': 5, 'media': 'LB', 'atp_production': 'High', 'gapfilled_reactions': 'R005; R006', 'reversed_reaction_by_gapfilling': 'R007', 'filtered_reactions': 'R008; R009'}], + "gapfilling": gapfilling_entries, # Populated with gapfilling data + "atpanalysis": atp_analysis_entries # Populated with ATP analysis data } print("Module Path:", module_path + "/../data/") @@ -70,10 +170,11 @@ def extract_gapfilling_data(gf_sensitivity, model): "name": rxn.name, "equation": equation, "genes": rxn.gene_reaction_rule, - "gapfilling": "TBD" + "gapfilling": "; ".join(gapfilling_reaction_summary.get(rxn.id, [])) # Empty list results in an empty string } context["reactions"].append(rxn_data) + # Compounds Tab for cpd in model_or_mdlutl.metabolites: cpd_data = { @@ -116,7 +217,15 @@ def extract_gapfilling_data(gf_sensitivity, model): # Gapfilling Tab gf_sensitivity = model_or_mdlutl.attributes.get('gf_sensitivity', None) gapfilling_data = extract_gapfilling_data(gf_sensitivity, model_or_mdlutl) - context["gapfilling"] = gapfilling_data + context["gapfilling"] = gapfilling_entries + + # Extract ATP Production Data + atp_production_data = extract_atp_production_data(atp_analysis) + + # Populate the 'atpanalysis' context with ATP production data + for entry in context["atpanalysis"]: + media = entry['media'] + entry['atp_production'] = atp_production_data.get(media, None) # Diagnostics unique_biomass_rxns = biomass_reactions_ids @@ -142,6 +251,10 @@ def extract_gapfilling_data(gf_sensitivity, model): print("\nFirst 2 gapfilling entries:") for gf in context["gapfilling"][:2]: print(gf) + + print("\nFirst 2 ATP Analysis entries:") + for entry in context["atpanalysis"][:2]: + print(entry) # Render with template env = jinja2.Environment( @@ -153,8 +266,6 @@ def extract_gapfilling_data(gf_sensitivity, model): os.makedirs(directory, exist_ok=True) with open(output_path, 'w') as f: f.write(html) - - def build_report( self, diff --git a/modelseedpy/data/ModelReportTemplate.html b/modelseedpy/data/ModelReportTemplate.html index 6ae79ea0..bd0a1c1c 100644 --- a/modelseedpy/data/ModelReportTemplate.html +++ b/modelseedpy/data/ModelReportTemplate.html @@ -1,135 +1,349 @@ + -
-ModelSEED Reconstruction - - - -
+ + + ModelSEED Reconstruction + + + + + -
- - +
+ + - - - - + \ No newline at end of file From 61ecda1c30f5e204125c8f62b2c7825e300e1321 Mon Sep 17 00:00:00 2001 From: jplfaria Date: Mon, 28 Aug 2023 19:46:33 +0000 Subject: [PATCH 159/298] changes to multitab report and redoing gapfilling and atp analysis report --- modelseedpy/core/msmodelreport.py | 611 ++++++++++------------ modelseedpy/data/ModelReportTemplate.html | 2 +- 2 files changed, 278 insertions(+), 335 deletions(-) diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index e7521dcc..c5274fcd 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -1,11 +1,13 @@ # -*- coding: utf-8 -*- import pandas as pd import logging -import matplotlib.cm as cm import os +import re import jinja2 -from os.path import dirname, exists +from os.path import dirname +from pandas.io.formats.style import Styler from modelseedpy.core.msmodelutl import MSModelUtil + module_path = dirname(os.path.abspath(__file__)) logger = logging.getLogger(__name__) @@ -19,133 +21,202 @@ def __init__( ): pass - def build_multitab_report(self, model_or_mdlutl, output_path): - - # Helper function for extracting gapfilling data - def extract_gapfilling_data(gf_sensitivity, model): - if gf_sensitivity is None: - return [], {} - - gapfilling_dict = {} - gapfilling_summary = {} - - for media, media_data in gf_sensitivity.items(): - for target, target_data in media_data.items(): - for reaction_id, reaction_data in target_data.get('success', {}).items(): - for direction, metabolites in reaction_data.items(): - # If metabolites is None, set to empty string - if metabolites is None: - metabolites = "" - - # Extract both IDs and Names for Gapfilling Sensitivity - sensitivity_ids = [] - sensitivity_names = [] - if isinstance(metabolites, (list, tuple)): - for met_id in metabolites: - sensitivity_ids.append(met_id) - met_name = model.metabolites.get_by_id(met_id).name if met_id in model.metabolites else met_id - sensitivity_names.append(met_name) - else: - metabolites = str(metabolites) - entry = { - "reaction_id": reaction_id, - "reaction_name": model.reactions.get_by_id(reaction_id).name if reaction_id in model.reactions else reaction_id, - "media": media, - "direction": direction, - "target": target, - "gapfilling_sensitivity_id": "; ".join(sensitivity_ids) if sensitivity_ids else metabolites, - "gapfilling_sensitivity_name": "; ".join(sensitivity_names) if sensitivity_names else metabolites - } - - # Update the summary dictionary - if reaction_id not in gapfilling_summary: - gapfilling_summary[reaction_id] = [] - gapfilling_summary[reaction_id].append(f"{media}: {direction}") - - # Check if reaction_id is already in dictionary - if reaction_id in gapfilling_dict: - # Update the media - existing_entry = gapfilling_dict[reaction_id] - existing_media = existing_entry["media"].split("; ") - if media not in existing_media: - existing_media.append(media) - existing_entry["media"] = "; ".join(existing_media) - else: - gapfilling_dict[reaction_id] = entry - - return list(gapfilling_dict.values()), gapfilling_summary - - # Extract ATP analysis data - def extract_atp_analysis_data(atp_analysis, atp_expansion_filter): - entries = [] - if atp_analysis and 'core_atp_gapfilling' in atp_analysis: - for media, data in atp_analysis['core_atp_gapfilling'].items(): - score = data.get('score', None) - new_reactions = ["{}: {}".format(k, v) for k, v in data.get('new', {}).items()] - reversed_reactions = ["{}: {}".format(k, v) for k, v in data.get('reversed', {}).items()] - - # Extracting the "Filtered Reactions" in the required format - filtered_reactions = [] - for k, v in atp_expansion_filter.get(media, {}).items(): - if isinstance(v, dict): - for sub_k, sub_v in v.items(): - if isinstance(sub_v, dict): - for reaction, direction_dict in sub_v.items(): - direction = list(direction_dict.keys())[0] - filtered_reactions.append(f"{reaction}: {direction}") - filtered_reactions_str = "; ".join(filtered_reactions) - - if score is not None: - entries.append({ - 'media': media, - 'no_of_gapfilled_reactions': score, - 'gapfilled_reactions': "; ".join(new_reactions), - 'reversed_reaction_by_gapfilling': "; ".join(reversed_reactions), - 'filtered_reactions': filtered_reactions_str - }) - # Sorting the entries based on the 'no_of_gapfilled_reactions' column - entries.sort(key=lambda x: x['no_of_gapfilled_reactions']) - return entries - - # Extract ATP production data for the ATP Analysis tab - def extract_atp_production_data(atp_analysis): - atp_production_dict = {} - if atp_analysis: - selected_media = atp_analysis.get('selected_media', {}) - core_atp_gapfilling = atp_analysis.get('core_atp_gapfilling', {}) - - # First, process selected_media - for media, value in selected_media.items(): - atp_production_dict[media] = round(value, 2) - - # Next, process core_atp_gapfilling for media not in selected_media - for media, data in core_atp_gapfilling.items(): - if media not in atp_production_dict: - if data.get('failed'): - atp_production_dict[media] = 'failed' + def generate_reports(self, model, report_path, multi_tab_report_path): + self.build_report(model, report_path) + self.build_multitab_report(model, multi_tab_report_path) + + # Helper function to build overview data + def build_overview_data(self, model): + # Get the number of compartments + number_compartments = len(set([metabolite.compartment for metabolite in model.metabolites])) + + # Extract gapfilling information + gapfillings_str = model.notes.get('kbase_gapfillings', '[]') + pattern = r"\{.*?\}" + gapfilling_matches = re.findall(pattern, gapfillings_str) + gapfillings = [eval(gapfilling.replace('false', 'False').replace('true', 'True').replace('null', 'None')) for gapfilling in gapfilling_matches] + + core_gapfilling_media = [] + gapfilling_media = [] + + for gapfilling in gapfillings: + media_name = gapfilling.get('id', '').replace('ATP-', '') + target = gapfilling.get('target', '') + + if target == "rxn00062_c0": + core_gapfilling_media.append(media_name) + elif target.startswith('bio'): + gapfilling_media.append(media_name) + + # Count the number of gapfills + number_gapfills = gapfillings_str.count('"media_ref"') + + # Convert the lists to strings + core_gapfilling_str = "; ".join(core_gapfilling_media) if core_gapfilling_media else "No core gapfilling data found!" + gapfilling_media_str = "; ".join(gapfilling_media) if gapfilling_media else "No genome-scale gapfilling data found!" + + overview = { + 'Model ID': model.id, + 'Full Gapfilling and ATP Analysis Report': 'TBD', # You may replace 'TBD' with actual data when available + 'Genome Scale Template': model.notes.get('kbase_template_refs', 'Data Not Available'), + 'Core Gapfilling Media': core_gapfilling_str, + 'Gapfilling Media': gapfilling_media_str, + 'Source Genome': model.notes.get('kbase_genome_ref', 'Data Not Available'), + 'Total Number of reactions': len(model.reactions), + 'Number compounds': len(model.metabolites), + 'Number compartments': number_compartments, + 'Number biomass': len([rxn for rxn in model.reactions if rxn.annotation.get('sbo') == 'SBO:0000629']), + 'Number gapfills': number_gapfills + } + return overview + + # Helper function for extracting gapfilling data + def extract_gapfilling_data(self, gf_sensitivity, model): + if gf_sensitivity is None: + return [], {} + + gapfilling_dict = {} + gapfilling_summary = {} + + for media, media_data in gf_sensitivity.items(): + for target, target_data in media_data.items(): + for reaction_id, reaction_data in target_data.get('success', {}).items(): + for direction, metabolites in reaction_data.items(): + # If metabolites is None, set to empty string + if metabolites is None: + metabolites = "" + + # Extract both IDs and Names for Gapfilling Sensitivity + sensitivity_ids = [] + sensitivity_names = [] + if isinstance(metabolites, (list, tuple)): + for met_id in metabolites: + sensitivity_ids.append(met_id) + met_name = model.metabolites.get_by_id(met_id).name if met_id in model.metabolites else met_id + sensitivity_names.append(met_name) else: - # If the media was not processed in selected_media and it's not failed, set as 'Not Integrated' - atp_production_dict[media] = 'Not Integrated' - - return atp_production_dict + metabolites = str(metabolites) + entry = { + "reaction_id": reaction_id, + "reaction_name": model.reactions.get_by_id(reaction_id).name if reaction_id in model.reactions else reaction_id, + "media": media, + "direction": direction, + "target": target, + "gapfilling_sensitivity_id": "; ".join(sensitivity_ids) if sensitivity_ids else metabolites, + "gapfilling_sensitivity_name": "; ".join(sensitivity_names) if sensitivity_names else metabolites + } + + # Update the summary dictionary + if reaction_id not in gapfilling_summary: + gapfilling_summary[reaction_id] = [] + gapfilling_summary[reaction_id].append(f"{media}: {direction}") + + # Check if reaction_id is already in dictionary + if reaction_id in gapfilling_dict: + # Update the media + existing_entry = gapfilling_dict[reaction_id] + existing_media = existing_entry["media"].split("; ") + if media not in existing_media: + existing_media.append(media) + existing_entry["media"] = "; ".join(existing_media) + else: + gapfilling_dict[reaction_id] = entry + + return list(gapfilling_dict.values()), gapfilling_summary + + #transform data to be used in tabular format to use in build_model_report + def transform_gapfilling_data(self, gapfilling_data): + transformed_data = [] + for entry in gapfilling_data: + row = [ + entry["reaction_id"], + entry["reaction_name"], + entry["media"], + entry["direction"], + entry["target"], + entry["gapfilling_sensitivity_id"], + entry["gapfilling_sensitivity_name"] + ] + transformed_data.append(row) + return transformed_data + + + # Extract ATP analysis data + def extract_atp_analysis_data(self, atp_analysis, atp_expansion_filter): + entries = [] + if atp_analysis and 'core_atp_gapfilling' in atp_analysis: + for media, data in atp_analysis['core_atp_gapfilling'].items(): + score = data.get('score', None) + new_reactions = ["{}: {}".format(k, v) for k, v in data.get('new', {}).items()] + reversed_reactions = ["{}: {}".format(k, v) for k, v in data.get('reversed', {}).items()] + + # Extracting the "Filtered Reactions" in the required format + filtered_reactions = [] + for k, v in atp_expansion_filter.get(media, {}).items(): + if isinstance(v, dict): + for sub_k, sub_v in v.items(): + if isinstance(sub_v, dict): + for reaction, direction_dict in sub_v.items(): + direction = list(direction_dict.keys())[0] + filtered_reactions.append(f"{reaction}: {direction}") + filtered_reactions_str = "; ".join(filtered_reactions) + + if score is not None: + entries.append({ + 'media': media, + 'no_of_gapfilled_reactions': score, + 'gapfilled_reactions': "; ".join(new_reactions), + 'reversed_reaction_by_gapfilling': "; ".join(reversed_reactions), + 'filtered_reactions': filtered_reactions_str + }) + # Sorting the entries based on the 'no_of_gapfilled_reactions' column + entries.sort(key=lambda x: x['no_of_gapfilled_reactions']) + return entries + + # Extract ATP production data for the ATP Analysis tab + def extract_atp_production_data(self, atp_analysis): + atp_production_dict = {} + if atp_analysis: + selected_media = atp_analysis.get('selected_media', {}) + core_atp_gapfilling = atp_analysis.get('core_atp_gapfilling', {}) + + # First, process selected_media + for media, value in selected_media.items(): + atp_production_dict[media] = round(value, 2) + + # Next, process core_atp_gapfilling for media not in selected_media + for media, data in core_atp_gapfilling.items(): + if media not in atp_production_dict: + if data.get('failed'): + atp_production_dict[media] = 'failed' + else: + # If the media was not processed in selected_media and it's not failed, set as 'Not Integrated' + atp_production_dict[media] = 'Not Integrated' + + return atp_production_dict + + def build_multitab_report(self, model_or_mdlutl, output_path): + + # Build overview data + overview_data = self.build_overview_data(model_or_mdlutl) # Get gf_sensitivity attribute from the model gf_sensitivity = model_or_mdlutl.attributes.get('gf_sensitivity', None) # Extract gapfilling data - gapfilling_entries, gapfilling_reaction_summary = extract_gapfilling_data(gf_sensitivity, model_or_mdlutl) + gapfilling_entries, gapfilling_reaction_summary = self.extract_gapfilling_data(gf_sensitivity, model_or_mdlutl) # Check if ATP_analysis attribute is present in the model atp_analysis = model_or_mdlutl.attributes.get('ATP_analysis', None) if atp_analysis: atp_expansion_filter = model_or_mdlutl.attributes.get('atp_expansion_filter', {}) - atp_analysis_entries = extract_atp_analysis_data(atp_analysis, atp_expansion_filter) + atp_analysis_entries = self.extract_atp_analysis_data(atp_analysis, atp_expansion_filter) else: atp_analysis_entries = [] # Initialize context dictionary context = { - "overview": [{"Model": "Model 5", "Genome": "Genome C"}, {"Model": "Model 5", "Genome": "Genome D"}], + "overview": overview_data, "reactions": [], "compounds": [], "genes": [], @@ -216,11 +287,11 @@ def extract_atp_production_data(atp_analysis): # Gapfilling Tab gf_sensitivity = model_or_mdlutl.attributes.get('gf_sensitivity', None) - gapfilling_data = extract_gapfilling_data(gf_sensitivity, model_or_mdlutl) + gapfilling_data = self.extract_gapfilling_data(gf_sensitivity, model_or_mdlutl) context["gapfilling"] = gapfilling_entries # Extract ATP Production Data - atp_production_data = extract_atp_production_data(atp_analysis) + atp_production_data = self.extract_atp_production_data(atp_analysis) # Populate the 'atpanalysis' context with ATP production data for entry in context["atpanalysis"]: @@ -267,171 +338,27 @@ def extract_atp_production_data(atp_analysis): with open(output_path, 'w') as f: f.write(html) - def build_report( - self, - model_or_mdlutl, - output_path - ): - """Builds model HTML report + + def build_report(self, model, output_path): + """Builds model HTML report for the Model Summary table Parameters ---------- - model_or_modelutl : Model | MSModelUtl - Model to use to run the simulations + model : cobra.Model + Model to use to build the report """ - modelutl = model_or_mdlutl - if not isinstance(model_or_mdlutl, MSModelUtil): - modelutl = MSModelUtil.get(model_or_mdlutl) - - # Process the data - attributes = modelutl.get_attributes() - gf_filter_data = {} - selected_media_data = {} - core_atp_gapfilling_data = {} - - gf_sensitivity_data = attributes.get('gf_sensitivity') # Get 'gf_sensitivity_data' if available, otherwise it will be None - number_gapfills = 0 - if gf_sensitivity_data: - number_gapfills = len(gf_sensitivity_data) - if 'ATP_analysis' in attributes: - if 'selected_media' in attributes['ATP_analysis']: - selected_media_data = attributes['ATP_analysis']['selected_media'] - if 'core_atp_gapfilling' in attributes['ATP_analysis']: - core_atp_gapfilling_data = attributes['ATP_analysis']['core_atp_gapfilling'] - gf_filter_data = attributes['gf_filter'] - if 'gf_filter' in attributes: - gf_filter_data = attributes['gf_filter'] - - # Get the names of 'Core Gapfilling Media' and 'Gapfilling Media' - core_gapfilling_media = [media for media, media_data in (gf_sensitivity_data or {}).items() if 'rxn00062_c0' in media_data] - gapfilling_media = [media for media, media_data in (gf_sensitivity_data or {}).items() if 'bio1' in media_data] - core_gapfilling_media_text = ', '.join(core_gapfilling_media) - gapfilling_media_text = ', '.join(gapfilling_media) - - bio_count = 0 - for rxn in modelutl.model.reactions: - if rxn.id[0:3] == "bio": - bio_count += 1 - - # Create the Model Summary table data - model_summary_data = [ - ('Model ID', modelutl.wsid), - ('Genome Scale Template', modelutl.model.template_ref), - #('Core Template', modelutl.model.core_template_ref), - ('Core Gapfilling Media', core_gapfilling_media_text), - ('Gapfilling Media', gapfilling_media_text), - ('Source Genome',modelutl.model.name), - ('Total Number of reactions', str(len(modelutl.model.reactions))), - # ('Number of reactions in Core', 'TBD - attributes require changes things to support this'), - # ('Number of reactions in Genome Scale', 'TBD - attributes require changes things to support this'), - ('Number compounds', str(len(modelutl.model.metabolites))), - ('Number compartments', str(len(modelutl.model.compartments))), - ('Number biomass', str(bio_count)), - ('Number gapfills', str(number_gapfills)), - ] - - # Create the DataFrame for Model Summary - model_summary_df = pd.DataFrame(model_summary_data, columns=['', '']) - - # Process core_atp_gapfilling_data and gf_filter_data into a list of dictionaries - gapfilling_list = [] - for media in core_atp_gapfilling_data: - core_atp_gapfilling_media = core_atp_gapfilling_data[media] - row = { - 'no of gapfilled reactions': int(core_atp_gapfilling_media['score']), - 'media': media, - 'ATP Production': f"{round(selected_media_data.get(media, 0), 2):.2f}" if media in selected_media_data else '', - 'gapfilled reactions': '', - 'reversed reaction by gapfilling': '', - 'Filtered Reactions': '', - } - if 'new' in core_atp_gapfilling_media: - gapfilled_reactions = core_atp_gapfilling_media['new'] - if gapfilled_reactions: - reactions = [f'{rxn} : {direction}' if not rxn.startswith("EX") else f'EX_{rxn} : {direction}' for rxn, direction in gapfilled_reactions.items()] - row['gapfilled reactions'] = ' | '.join(reactions) - if 'failed' in core_atp_gapfilling_media and core_atp_gapfilling_media['failed']: - row['gapfilled reactions'] = 'Failed' - if 'reversed' in core_atp_gapfilling_media: - reversed_reactions = core_atp_gapfilling_media['reversed'] - if reversed_reactions: - reactions = [f'{rxn} : {direction}' if not rxn.startswith("EX") else f'EX_{rxn} : {direction}' for rxn, direction in reversed_reactions.items()] - row['reversed reaction by gapfilling'] = ' | '.join(reactions) - if media in gf_filter_data: - gf_filter_media_data = gf_filter_data[media] - atp_production_values = list(gf_filter_media_data.values()) - if atp_production_values: - atp_prod_reaction_pairs = list(atp_production_values[0].items()) - if atp_prod_reaction_pairs: - _, reactions = atp_prod_reaction_pairs[0] - if reactions: - filtered_reactions = ' | '.join([f'{rxn} : {list(value.keys())[0]}' if not rxn.startswith("EX") else f'EX_{rxn} : {list(value.keys())[0]}' for rxn, value in reactions.items()]) - row['Filtered Reactions'] = filtered_reactions if filtered_reactions else '' - if not row['reversed reaction by gapfilling']: - row['reversed reaction by gapfilling'] = '' - gapfilling_list.append(row) - - - - gapfilling_df = pd.DataFrame(gapfilling_list, columns=['no of gapfilled reactions', 'media', 'ATP Production', 'gapfilled reactions', 'reversed reaction by gapfilling', 'Filtered Reactions']) - gapfilling_df['no of gapfilled reactions'] = pd.to_numeric(gapfilling_df['no of gapfilled reactions']) - gapfilling_df = gapfilling_df.sort_values('no of gapfilled reactions') - - - reaction_names = {} - for rxn in modelutl.model.reactions: - reaction_id = rxn.id - reaction_name = rxn.name - reaction_names[reaction_id] = reaction_name - - # Gapfillings Analysis DataFrame - gapfillings_list = [] - if gf_sensitivity_data: - for media, media_data in gf_sensitivity_data.items(): - for target, target_data in media_data.items(): # Iterate through each target for the current media - for status, status_data in target_data.items(): - if isinstance(status_data, dict): - for reaction_id, reaction_directions in status_data.items(): - for direction, gapfilling_sensitivity in reaction_directions.items(): - if status == 'success': - if isinstance(gapfilling_sensitivity, list): - gapfilling_sensitivity = ', '.join(gapfilling_sensitivity) - gapfillings_list.append({ - 'Reaction ID': reaction_id, - 'Reaction Name': reaction_names.get(reaction_id, ''), # Get reaction name from the dictionary - 'Media': media, - 'Direction': direction, - 'Target': target, - 'Gapfilling Sensitivity': gapfilling_sensitivity - }) - else: - # Handle cases where status_data is null - gapfillings_list.append({ - 'Reaction ID': '', # No data available for Reaction ID - 'Reaction Name': '', # No data available for Reaction Name - 'Media': media, - 'Direction': '', # No data available for Direction - 'Target': target, - 'Gapfilling Sensitivity': 'Failed Before Filtering' if status == 'FBF' else 'Failed After Filtering' if status == 'FAF' else status # Status is the 'FBF' or other labels in this case - }) - - gapfillings_analysis_df = pd.DataFrame(gapfillings_list, columns=['Reaction ID', 'Reaction Name', 'Media', 'Direction', 'Target', 'Gapfilling Sensitivity']) - - - # Define the custom color mapping function - def color_gradient(val): - if val == 0: - return 'background-color: green' - else: - color_map = cm.get_cmap('YlOrRd') # Choose the color map - norm_val = val / gapfilling_df['no of gapfilled reactions'].max() # Normalize the value between 0 and 1 - color = color_map(norm_val) - r, g, b, _ = color - return f'background-color: rgb({int(r * 255)}, {int(g * 255)}, {int(b * 255)})' - - # Apply the default style to the Model Summary DataFrame + + # 1. Utilize the build_overview_data method + model_summary_data = self.build_overview_data(model) + # Remove the unwanted entry + model_summary_data.pop("Full Gapfilling and ATP Analysis Report", None) + # 2. Transform the dictionary into a list of tuples + model_summary_list = [(key, value) for key, value in model_summary_data.items()] + # 3. Convert to DataFrame + model_summary_df = pd.DataFrame(model_summary_list, columns=['', '']) + + # Style the DataFrame (as was done previously) model_summary_df_styled = ( - model_summary_df.style - .hide_index() + model_summary_df.style.hide(axis="index") .set_table_styles([ {'selector': 'th', 'props': [('border', 'none'), ('background-color', 'white'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, {'selector': 'td', 'props': [('border', 'none'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, @@ -439,34 +366,22 @@ def color_gradient(val): {'selector': 'tr:nth-child(odd)', 'props': [('background-color', '#f2f2f2')]}, ]) ) - - - # Apply the default style to the Gapfillings Analysis DataFrame - # Apply the default style to the Gapfillings Analysis DataFrame - gapfillings_analysis_df_styled = ( - gapfillings_analysis_df.style - .hide_index() - .format({ - 'Reaction ID': lambda x: f'{x}' if not x.startswith("EX") else f'{x}', # Add hyperlink to Reaction ID - 'Gapfilling Sensitivity': lambda x: ', '.join([f'{i}' for i in x.split(', ')]) if x and not x.startswith('Failed') else x # Add hyperlinks to Gapfilling Sensitivity - }) - .set_table_styles([ - {'selector': 'th', 'props': [('border', 'none'), ('background-color', 'white'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, - {'selector': 'td', 'props': [('border', 'none'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, - {'selector': 'tr:nth-child(even)', 'props': [('background-color', 'white')]}, - {'selector': 'tr:nth-child(odd)', 'props': [('background-color', '#f2f2f2')]}, - ]) + + # Fetching the gapfilling sensitivity data + gf_sensitivity = model.attributes.get('gf_sensitivity', None) + gapfilling_data = self.extract_gapfilling_data(gf_sensitivity, model) + gapfilling_list = self.transform_gapfilling_data(gapfilling_data[0]) + + # Convert the gapfilling_list to a DataFrame + gapfillings_analysis_df = pd.DataFrame( + gapfilling_list, + columns=[ + "Reaction ID", "Reaction Name", "Media", "Direction", "Target", "Gapfilling Sensitivity ID", "Gapfilling Sensitivity Name"] ) - - - # Apply the default style with alternating row colors, Oxygen font, adjusted font size and line height, - # and switched order of light grey and white backgrounds in the header column for Core ATP Gapfilling Analysis - gapfilling_df_styled = ( - gapfilling_df.style - .applymap(color_gradient, subset=['no of gapfilled reactions']) - .hide_index() - .format({'Filtered Reactions': lambda x: f'{x}'}) - .format({'gapfilled reactions': lambda x: f'{x}'}) + + # Apply style to Gapfillings Analysis DataFrame + gapfillings_analysis_df_styled = ( + gapfillings_analysis_df.style.hide(axis="index") .set_table_styles([ {'selector': 'th', 'props': [('border', 'none'), ('background-color', 'white'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, {'selector': 'td', 'props': [('border', 'none'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, @@ -474,10 +389,9 @@ def color_gradient(val): {'selector': 'tr:nth-child(odd)', 'props': [('background-color', '#f2f2f2')]}, ]) ) - - - # Legend text for Table 1 - annotations_text_1 = """ + + # Legend for Gapfillings Analysis + annotations_text_gapfillings = """
  • Reaction ID: The identifier of the reaction.
  • Reaction Name: The name of the reaction.
  • @@ -485,54 +399,83 @@ def color_gradient(val):
  • Direction: The direction of the reaction. Can be ">" for forward, "<" for reverse, or "=" for both directions.
  • Target: The reaction selected as the objective function target for the gapfilling optimization problem. Targets here can be the model’s biomass reaction, commonly named “bio1” for models created by this app. Alternatively, “rxn00062” (ATP Production) reaction is shown for cases where gapfilling was applied to guarantee ATP production in a given media. - When reactions are gapfilled for ATP production, we recommend checking the full Core ATP Analysis in Table 2 below.
  • -
  • Gapfilling Sensitivity: Gapfilling is necessary when compounds in the biomass objective function can not be produced by the model. + When reactions are gapfilled for ATP production, we recommend checking the full Core ATP Analysis in the table below.
  • +
  • Gapfilling Sensitivity ID and Name: Gapfilling is necessary when compounds in the biomass objective function can not be produced by the model. For each reaction we list the biomass compound(s) that can not be synthesized by the model without gapfilling. In cases where gap filling fails there are two possible scenarios: 1) FBF (failed before filtering) : the gapfilling immediately failed, even before we filtered out the ATP breaking reactions. This means this objective CANNOT be satisfied with the entire current database. 2) FAF (failed after filtering): the gapfilling succeeded before filtering, but failed after filtering out reactions that break ATP. This tells you definitively if the ATP filtering caused the gapfilling to fail
""" - #table 2 intro text - introductory_text = """ + + # Extract ATP analysis data + atp_analysis = model.attributes.get('ATP_analysis', None) + atp_expansion_filter = model.attributes.get('atp_expansion_filter', {}) + atp_analysis_entries = self.extract_atp_analysis_data(atp_analysis, atp_expansion_filter) + + # Convert the atp_analysis_entries list to a DataFrame + atp_analysis_df = pd.DataFrame(atp_analysis_entries) + + # Apply style to ATP Analysis DataFrame + atp_analysis_df_styled = ( + atp_analysis_df.style.hide(axis="index") + .set_table_styles([ + {'selector': 'th', 'props': [('border', 'none'), ('background-color', 'white'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, + {'selector': 'td', 'props': [('border', 'none'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, + {'selector': 'tr:nth-child(even)', 'props': [('background-color', 'white')]}, + {'selector': 'tr:nth-child(odd)', 'props': [('background-color', '#f2f2f2')]}, + ]) + ) + + # Legend for ATP Analysis + annotations_text_atp_analysis = """ +
    +
  • No. of gapfilled reactions: The number of reactions filled by the gapfilling process.
  • +
  • Media: The media in which the reaction takes place.
  • +
  • ATP Production: ATP production by the core metabolism model.
  • +
  • Gapfilled Reactions: Reactions added during the gapfilling process.
  • +
  • Reversed Reaction by Gapfilling: Reactions that have been reversed during the gapfilling process.
  • +
  • Filtered Reactions: Reactions that have been filtered out during the analysis. When a reaction addition would lead to a large increase in ATP production or an infinite energy loop, we filter that reaction out of the gapfilling database and prevent it from being added to the model.
  • +
+ """ + + #ATP analysis explanation text + explanation_text_atp_analysis = """

During model reconstruction, we analyze the genome’s core metabolism draft model (model without gapfilling) to assess energy biosynthesis capabilities. The goal of this analysis is to ensure the core metabolism model is able to produce ATP before we expand the model to the genome-scale. This step is designed to prevent gapfilling from introducing reactions that create energy-generating loops. The tests are conducted on a large collection of minimal conditions, with the goal of simulating the model’s capability to produce energy with different electron donor, electron acceptor, and carbon source combinations.

When the draft model of the core metabolism is capable of producing ATP in at least one of the test media, no gapfilling reactions part of this analysis will be added to the model. While we still report the gapfilling requirements for the test media formulations that fail to produce ATP with that draft core model, we only integrate these solutions in the model when no test media succeeds in producing ATP. - In this case, the integrated gap-filling solution(s) will be displayed in “Table 1 - Gapfilling Analysis” above, with the “Target” “rxn00062” (ATP Production) objective function.

+ In this case, the integrated gap-filling solution(s) will be displayed in the “Gapfilling Analysis” table above, with the “Target” “rxn00062” (ATP Production) objective function.

The goal is to display the test results for all media to provide clues for the metabolic capabilities of the genome(s). When many reactions are required for growth on the SO4 testing media conditions, this could be a good indicator that the organism is not capable of performing sulfate reduction. On the other hand, when only one gapfill reaction is required for ATP production in a given media, multiple scenarios can be considered. 1) Organism(s) can’t grow on test condition, and we correctly did not add the reaction to the model. 2) Possible issue with the source genome annotation missing a specific gene function 3) Possible issue with the model reconstruction database. We hope this data helps make more informed decisions on reactions that may need to be manually curated in the model. In cases where is known from the literature or unpublished experimental results that an organism is capable of producing ATP in a given media condition that requires gapfilling in this analysis, you can use the parameter “Force ATP media” in the reconstruction app to ensure those reactions are integrated into the model. .

""" - # Legend text for Table 2 - annotations_text_2 = """ -
    -
  • No. of gapfilled reactions: The number of reactions filled by the gapfilling process.
  • -
  • Media: The media in which the reaction takes place.
  • -
  • ATP Production: ATP production by the core metabolism model.
  • -
  • Gapfilled Reactions: Reactions added during the gapfilling process.
  • -
  • Reversed Reaction by Gapfilling: Reactions that have been reversed during the gapfilling process.
  • -
  • Filtered Reactions: Reactions that have been filtered out during the analysis. When a reaction addition would lead to a large increase in ATP production or an infinite energy loop, we filter that reaction out of the gapfilling database and prevent it from being added to the model.
  • -
- """ + # Save the data to HTML with the styled DataFrames and the legends - directory = dirname(output_path) + directory = os.path.dirname(output_path) os.makedirs(directory, exist_ok=True) - with open(output_path, 'w') as f: + with open(output_path, 'w', encoding='utf-8') as f: f.write('

Model Summary

') f.write(model_summary_df_styled.render(escape=False)) f.write('

') - if gf_sensitivity_data: - f.write('

Table 1 - Gapfillings Analysis

') + f.write('

Gapfillings Analysis

') + + # Check for Gapfillings Analysis data + if not gapfillings_analysis_df.empty: f.write(gapfillings_analysis_df_styled.render(escape=False)) - f.write(f'

Legend:

{annotations_text_1}') + f.write(f'

Legend:

{annotations_text_gapfillings}') else: - f.write('Gapfilling was not selected as a parameter during reconstruction of the model. As a result your model may not grow on your media object when running Flux Balance Analysis. You can gapfill your model after reconstruction by using the bew Gapiflling Metabolic Model app curently in beta') - f.write('

') - f.write('

Table 2 - Core ATP Analysis

') - f.write(gapfilling_df_styled.render(escape=False)) - f.write(f'

Legend:

{annotations_text_2}') - f.write(introductory_text) + f.write('

Warning: No Gapfillings Analysis data available for this model.

') + + f.write('

Core ATP Analysis

') + + # Check for ATP Analysis data + if not atp_analysis_df.empty: + f.write(atp_analysis_df_styled.render(escape=False)) + f.write(f'

Legend:

{annotations_text_atp_analysis}') + f.write(explanation_text_atp_analysis) + else: + f.write('

Warning: No Core ATP Analysis data available for this model.

') \ No newline at end of file diff --git a/modelseedpy/data/ModelReportTemplate.html b/modelseedpy/data/ModelReportTemplate.html index bd0a1c1c..c382c8fc 100644 --- a/modelseedpy/data/ModelReportTemplate.html +++ b/modelseedpy/data/ModelReportTemplate.html @@ -80,7 +80,7 @@ Full Gapfilling and ATP Analysis Report - {{ overview['Full Gapfilling and ATP Analysis Report'] }} + VIEW REPORT IN SEPARATE WINDOW Genome Scale Template From 1f0ec94ea21a75a1d8227fdf53403fc8c4f96608 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 29 Aug 2023 23:52:19 -0500 Subject: [PATCH 160/298] Fixing bug in report --- modelseedpy/core/msmodelreport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index c5274fcd..bdce7695 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -348,7 +348,7 @@ def build_report(self, model, output_path): """ # 1. Utilize the build_overview_data method - model_summary_data = self.build_overview_data(model) + model_summary_data = self.build_overview_data(model.model) # Remove the unwanted entry model_summary_data.pop("Full Gapfilling and ATP Analysis Report", None) # 2. Transform the dictionary into a list of tuples From 6496f651f8ec23977fbfce0d07e7d9478f775b5e Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 29 Aug 2023 23:58:24 -0500 Subject: [PATCH 161/298] Fixing report bug --- modelseedpy/core/msmodelreport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index bdce7695..d86065bf 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -369,7 +369,7 @@ def build_report(self, model, output_path): # Fetching the gapfilling sensitivity data gf_sensitivity = model.attributes.get('gf_sensitivity', None) - gapfilling_data = self.extract_gapfilling_data(gf_sensitivity, model) + gapfilling_data = self.extract_gapfilling_data(gf_sensitivity, model.model) gapfilling_list = self.transform_gapfilling_data(gapfilling_data[0]) # Convert the gapfilling_list to a DataFrame From c5b1f4f23f090374c31379479a21fe78cd59382f Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 6 Sep 2023 23:34:31 -0500 Subject: [PATCH 162/298] Debugging media --- modelseedpy/core/msatpcorrection.py | 1 + 1 file changed, 1 insertion(+) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 6a0fcec2..a0ecba66 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -173,6 +173,7 @@ def load_default_medias(self): min_obj = 0.01 if media_id in min_gap: min_obj = min_gap[media_id] + print(media.id) self.atp_medias.append([media, min_obj]) @staticmethod From ea4117a14178004684b40af088fd1b63622b400a Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 6 Sep 2023 23:54:51 -0500 Subject: [PATCH 163/298] Removing debugging --- modelseedpy/core/msatpcorrection.py | 1 - 1 file changed, 1 deletion(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index a0ecba66..6a0fcec2 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -173,7 +173,6 @@ def load_default_medias(self): min_obj = 0.01 if media_id in min_gap: min_obj = min_gap[media_id] - print(media.id) self.atp_medias.append([media, min_obj]) @staticmethod From cfc3bec92860de50b34709db351b9915b27953ba Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 9 Sep 2023 00:47:10 -0500 Subject: [PATCH 164/298] Fixing report --- modelseedpy/core/msmodelreport.py | 100 +++++++++++++++--------------- 1 file changed, 49 insertions(+), 51 deletions(-) diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index d86065bf..af594528 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -17,61 +17,59 @@ class MSModelReport: def __init__( - self + self, + model_or_mdlutl ): - pass + if isinstance(model_or_mdlutl, MSModelUtil): + self.model = model_or_mdlutl.model + self.modelutl = model_or_mdlutl + else: + self.model = model_or_mdlutl + self.modelutl = MSModelUtil.get(model_or_mdlutl) - def generate_reports(self, model, report_path, multi_tab_report_path): - self.build_report(model, report_path) - self.build_multitab_report(model, multi_tab_report_path) + def generate_reports(self,report_path, multi_tab_report_path): + self.build_report(report_path) + self.build_multitab_report(multi_tab_report_path) # Helper function to build overview data - def build_overview_data(self, model): + def build_overview_data(self): # Get the number of compartments - number_compartments = len(set([metabolite.compartment for metabolite in model.metabolites])) + number_compartments = len(set([metabolite.compartment for metabolite in self.model.metabolites])) # Extract gapfilling information - gapfillings_str = model.notes.get('kbase_gapfillings', '[]') - pattern = r"\{.*?\}" - gapfilling_matches = re.findall(pattern, gapfillings_str) - gapfillings = [eval(gapfilling.replace('false', 'False').replace('true', 'True').replace('null', 'None')) for gapfilling in gapfilling_matches] - core_gapfilling_media = [] gapfilling_media = [] - - for gapfilling in gapfillings: - media_name = gapfilling.get('id', '').replace('ATP-', '') - target = gapfilling.get('target', '') - - if target == "rxn00062_c0": - core_gapfilling_media.append(media_name) - elif target.startswith('bio'): + gf_sensitivity = self.modelutl.attributes.get('gf_sensitivity', None) + for media in gf_sensitivity: + if "bio1" in attributes["gf_sensitivity"][media] and "success" in attributes["gf_sensitivity"][media]["bio1"]: gapfilling_media.append(media_name) - + if "rxn00062_c0" in attributes["gf_sensitivity"][media] and "success" in attributes["gf_sensitivity"][media]["rxn00062_c0"]: + core_gapfilling_media.append(media) + # Count the number of gapfills - number_gapfills = gapfillings_str.count('"media_ref"') + number_gapfills = len(gapfilling_media) # Convert the lists to strings core_gapfilling_str = "; ".join(core_gapfilling_media) if core_gapfilling_media else "No core gapfilling data found!" gapfilling_media_str = "; ".join(gapfilling_media) if gapfilling_media else "No genome-scale gapfilling data found!" overview = { - 'Model ID': model.id, + 'Model ID': self.model.id, 'Full Gapfilling and ATP Analysis Report': 'TBD', # You may replace 'TBD' with actual data when available - 'Genome Scale Template': model.notes.get('kbase_template_refs', 'Data Not Available'), + 'Genome Scale Template': self.model.notes.get('kbase_template_refs', 'Data Not Available'), 'Core Gapfilling Media': core_gapfilling_str, 'Gapfilling Media': gapfilling_media_str, - 'Source Genome': model.notes.get('kbase_genome_ref', 'Data Not Available'), - 'Total Number of reactions': len(model.reactions), - 'Number compounds': len(model.metabolites), + 'Source Genome': self.model.notes.get('kbase_genome_ref', 'Data Not Available'), + 'Total Number of reactions': len(self.model.reactions), + 'Number compounds': len(self.model.metabolites), 'Number compartments': number_compartments, - 'Number biomass': len([rxn for rxn in model.reactions if rxn.annotation.get('sbo') == 'SBO:0000629']), + 'Number biomass': len([rxn for rxn in self.model.reactions if rxn.annotation.get('sbo') == 'SBO:0000629']), 'Number gapfills': number_gapfills } return overview # Helper function for extracting gapfilling data - def extract_gapfilling_data(self, gf_sensitivity, model): + def extract_gapfilling_data(self, gf_sensitivity): if gf_sensitivity is None: return [], {} @@ -92,13 +90,13 @@ def extract_gapfilling_data(self, gf_sensitivity, model): if isinstance(metabolites, (list, tuple)): for met_id in metabolites: sensitivity_ids.append(met_id) - met_name = model.metabolites.get_by_id(met_id).name if met_id in model.metabolites else met_id + met_name = self.model.metabolites.get_by_id(met_id).name if met_id in self.model.metabolites else met_id sensitivity_names.append(met_name) else: metabolites = str(metabolites) entry = { "reaction_id": reaction_id, - "reaction_name": model.reactions.get_by_id(reaction_id).name if reaction_id in model.reactions else reaction_id, + "reaction_name": self.model.reactions.get_by_id(reaction_id).name if reaction_id in self.model.reactions else reaction_id, "media": media, "direction": direction, "target": target, @@ -195,21 +193,21 @@ def extract_atp_production_data(self, atp_analysis): return atp_production_dict - def build_multitab_report(self, model_or_mdlutl, output_path): + def build_multitab_report(self, output_path): # Build overview data - overview_data = self.build_overview_data(model_or_mdlutl) + overview_data = self.build_overview_data() # Get gf_sensitivity attribute from the model - gf_sensitivity = model_or_mdlutl.attributes.get('gf_sensitivity', None) + gf_sensitivity = self.modelutl.attributes.get('gf_sensitivity', None) # Extract gapfilling data - gapfilling_entries, gapfilling_reaction_summary = self.extract_gapfilling_data(gf_sensitivity, model_or_mdlutl) + gapfilling_entries, gapfilling_reaction_summary = self.extract_gapfilling_data(gf_sensitivity) # Check if ATP_analysis attribute is present in the model - atp_analysis = model_or_mdlutl.attributes.get('ATP_analysis', None) + atp_analysis = self.modelutl.attributes.get('ATP_analysis', None) if atp_analysis: - atp_expansion_filter = model_or_mdlutl.attributes.get('atp_expansion_filter', {}) + atp_expansion_filter = self.modelutl.attributes.get('atp_expansion_filter', {}) atp_analysis_entries = self.extract_atp_analysis_data(atp_analysis, atp_expansion_filter) else: atp_analysis_entries = [] @@ -227,13 +225,13 @@ def build_multitab_report(self, model_or_mdlutl, output_path): print("Module Path:", module_path + "/../data/") - exchanges = {r.id for r in model_or_mdlutl.exchanges} + exchanges = {r.id for r in self.modelutl.exchanges} # Identify biomass reactions using SBO annotation - biomass_reactions_ids = {rxn.id for rxn in model_or_mdlutl.reactions if rxn.annotation.get('sbo') == 'SBO:0000629'} + biomass_reactions_ids = {rxn.id for rxn in self.model.reactions if rxn.annotation.get('sbo') == 'SBO:0000629'} # Reactions Tab - for rxn in model_or_mdlutl.reactions: + for rxn in self.model.reactions: if rxn.id not in exchanges and rxn.id not in biomass_reactions_ids: equation = rxn.build_reaction_string(use_metabolite_names=True) rxn_data = { @@ -247,7 +245,7 @@ def build_multitab_report(self, model_or_mdlutl, output_path): # Compounds Tab - for cpd in model_or_mdlutl.metabolites: + for cpd in self.model.metabolites: cpd_data = { "id": cpd.id, "name": cpd.name, @@ -258,7 +256,7 @@ def build_multitab_report(self, model_or_mdlutl, output_path): context["compounds"].append(cpd_data) # Genes Tab - for gene in model_or_mdlutl.genes: + for gene in self.model.genes: gene_data = { "gene": gene.id, "reactions": "; ".join([rxn.id for rxn in gene.reactions]) @@ -268,7 +266,7 @@ def build_multitab_report(self, model_or_mdlutl, output_path): # Biomass Tab if biomass_reactions_ids: for biomass_rxn_id in biomass_reactions_ids: - biomass_rxn = model_or_mdlutl.reactions.get_by_id(biomass_rxn_id) + biomass_rxn = self.model.reactions.get_by_id(biomass_rxn_id) for metabolite, coefficient in biomass_rxn.metabolites.items(): compound_id = metabolite.id compound_name = metabolite.name.split('_')[0] @@ -286,8 +284,8 @@ def build_multitab_report(self, model_or_mdlutl, output_path): print("No biomass reactions found in the model.") # Gapfilling Tab - gf_sensitivity = model_or_mdlutl.attributes.get('gf_sensitivity', None) - gapfilling_data = self.extract_gapfilling_data(gf_sensitivity, model_or_mdlutl) + gf_sensitivity = self.modelutl.attributes.get('gf_sensitivity', None) + gapfilling_data = self.extract_gapfilling_data(gf_sensitivity) context["gapfilling"] = gapfilling_entries # Extract ATP Production Data @@ -339,7 +337,7 @@ def build_multitab_report(self, model_or_mdlutl, output_path): f.write(html) - def build_report(self, model, output_path): + def build_report(self, output_path): """Builds model HTML report for the Model Summary table Parameters ---------- @@ -348,7 +346,7 @@ def build_report(self, model, output_path): """ # 1. Utilize the build_overview_data method - model_summary_data = self.build_overview_data(model.model) + model_summary_data = self.build_overview_data() # Remove the unwanted entry model_summary_data.pop("Full Gapfilling and ATP Analysis Report", None) # 2. Transform the dictionary into a list of tuples @@ -368,8 +366,8 @@ def build_report(self, model, output_path): ) # Fetching the gapfilling sensitivity data - gf_sensitivity = model.attributes.get('gf_sensitivity', None) - gapfilling_data = self.extract_gapfilling_data(gf_sensitivity, model.model) + gf_sensitivity = self.modelutl.attributes.get('gf_sensitivity', None) + gapfilling_data = self.extract_gapfilling_data(gf_sensitivity) gapfilling_list = self.transform_gapfilling_data(gapfilling_data[0]) # Convert the gapfilling_list to a DataFrame @@ -409,8 +407,8 @@ def build_report(self, model, output_path): """ # Extract ATP analysis data - atp_analysis = model.attributes.get('ATP_analysis', None) - atp_expansion_filter = model.attributes.get('atp_expansion_filter', {}) + atp_analysis = self.modelutl.attributes.get('ATP_analysis', None) + atp_expansion_filter = self.modelutl.attributes.get('atp_expansion_filter', {}) atp_analysis_entries = self.extract_atp_analysis_data(atp_analysis, atp_expansion_filter) # Convert the atp_analysis_entries list to a DataFrame From 1b038fd7c35e4376e8dcd43798e1d4cd26940f78 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 9 Sep 2023 01:19:52 -0500 Subject: [PATCH 165/298] Fixing report --- modelseedpy/core/msmodelreport.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index af594528..45ac5710 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -41,9 +41,9 @@ def build_overview_data(self): gapfilling_media = [] gf_sensitivity = self.modelutl.attributes.get('gf_sensitivity', None) for media in gf_sensitivity: - if "bio1" in attributes["gf_sensitivity"][media] and "success" in attributes["gf_sensitivity"][media]["bio1"]: + if "bio1" in self.modelutl.attributes["gf_sensitivity"][media] and "success" in self.modelutl.attributes["gf_sensitivity"][media]["bio1"]: gapfilling_media.append(media_name) - if "rxn00062_c0" in attributes["gf_sensitivity"][media] and "success" in attributes["gf_sensitivity"][media]["rxn00062_c0"]: + if "rxn00062_c0" in self.modelutl.attributes["gf_sensitivity"][media] and "success" in self.modelutl.attributes["gf_sensitivity"][media]["rxn00062_c0"]: core_gapfilling_media.append(media) # Count the number of gapfills From 46323032ccb6a7d8e078fcaefeb62df169e3e092 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 9 Sep 2023 10:55:36 -0500 Subject: [PATCH 166/298] Fixing report --- modelseedpy/core/msmodelreport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index 45ac5710..1007a245 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -42,7 +42,7 @@ def build_overview_data(self): gf_sensitivity = self.modelutl.attributes.get('gf_sensitivity', None) for media in gf_sensitivity: if "bio1" in self.modelutl.attributes["gf_sensitivity"][media] and "success" in self.modelutl.attributes["gf_sensitivity"][media]["bio1"]: - gapfilling_media.append(media_name) + gapfilling_media.append(media) if "rxn00062_c0" in self.modelutl.attributes["gf_sensitivity"][media] and "success" in self.modelutl.attributes["gf_sensitivity"][media]["rxn00062_c0"]: core_gapfilling_media.append(media) From 4b5f573cccb763369c77599f6b4bf8e197cf2131 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 9 Sep 2023 11:33:52 -0500 Subject: [PATCH 167/298] Fixing report --- modelseedpy/core/msmodelreport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index 1007a245..675e1b68 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -225,7 +225,7 @@ def build_multitab_report(self, output_path): print("Module Path:", module_path + "/../data/") - exchanges = {r.id for r in self.modelutl.exchanges} + exchanges = {r.id for r in self.model.exchanges} # Identify biomass reactions using SBO annotation biomass_reactions_ids = {rxn.id for rxn in self.model.reactions if rxn.annotation.get('sbo') == 'SBO:0000629'} From c9ce4709c12f37bf220c9b3951afe4c8473fb13f Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 9 Sep 2023 12:31:18 -0500 Subject: [PATCH 168/298] Slight report correction --- modelseedpy/core/msmodelreport.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index 675e1b68..1e682c3c 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -50,8 +50,8 @@ def build_overview_data(self): number_gapfills = len(gapfilling_media) # Convert the lists to strings - core_gapfilling_str = "; ".join(core_gapfilling_media) if core_gapfilling_media else "No core gapfilling data found!" - gapfilling_media_str = "; ".join(gapfilling_media) if gapfilling_media else "No genome-scale gapfilling data found!" + core_gapfilling_str = "; ".join(core_gapfilling_media) if core_gapfilling_media else "No core gapfilling needed." + gapfilling_media_str = "; ".join(gapfilling_media) if gapfilling_media else "No genome-scale gapfilling." overview = { 'Model ID': self.model.id, From de064ab7536f141626550ce230579c24a4ad3317 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sun, 10 Sep 2023 23:38:18 -0500 Subject: [PATCH 169/298] Fixing report bugs --- modelseedpy/core/msmodelreport.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index 1e682c3c..b0058a36 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -60,7 +60,7 @@ def build_overview_data(self): 'Core Gapfilling Media': core_gapfilling_str, 'Gapfilling Media': gapfilling_media_str, 'Source Genome': self.model.notes.get('kbase_genome_ref', 'Data Not Available'), - 'Total Number of reactions': len(self.model.reactions), + 'Total Number of reactions': self.modelutl.nonexchange_reaction_count(), 'Number compounds': len(self.model.metabolites), 'Number compartments': number_compartments, 'Number biomass': len([rxn for rxn in self.model.reactions if rxn.annotation.get('sbo') == 'SBO:0000629']), @@ -147,6 +147,9 @@ def extract_atp_analysis_data(self, atp_analysis, atp_expansion_filter): score = data.get('score', None) new_reactions = ["{}: {}".format(k, v) for k, v in data.get('new', {}).items()] reversed_reactions = ["{}: {}".format(k, v) for k, v in data.get('reversed', {}).items()] + atp_production = "Not integrated" + if "selected_media" in atp_analysis and media in atp_analysis["selected_media"]: + atp_production = atp_analysis["selected_media"][media] # Extracting the "Filtered Reactions" in the required format filtered_reactions = [] @@ -163,6 +166,7 @@ def extract_atp_analysis_data(self, atp_analysis, atp_expansion_filter): entries.append({ 'media': media, 'no_of_gapfilled_reactions': score, + 'atp_production': atp_production, 'gapfilled_reactions': "; ".join(new_reactions), 'reversed_reaction_by_gapfilling': "; ".join(reversed_reactions), 'filtered_reactions': filtered_reactions_str From 481d914c8618456bfa0f49c488def57dd42b590c Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 12 Sep 2023 23:30:36 -0500 Subject: [PATCH 170/298] Fixing model report encoding --- modelseedpy/core/msmodelreport.py | 1 + 1 file changed, 1 insertion(+) diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index b0058a36..f08bfa04 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -460,6 +460,7 @@ def build_report(self, output_path): directory = os.path.dirname(output_path) os.makedirs(directory, exist_ok=True) with open(output_path, 'w', encoding='utf-8') as f: + f.write('') f.write('

Model Summary

') f.write(model_summary_df_styled.render(escape=False)) f.write('

') From df44d598137c889f87f2216e443be0b7be73c3d3 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 13 Sep 2023 00:06:22 -0500 Subject: [PATCH 171/298] Fixing report for empty gapfillling data --- modelseedpy/core/msmodelreport.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index f08bfa04..0e6f580e 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -40,11 +40,12 @@ def build_overview_data(self): core_gapfilling_media = [] gapfilling_media = [] gf_sensitivity = self.modelutl.attributes.get('gf_sensitivity', None) - for media in gf_sensitivity: - if "bio1" in self.modelutl.attributes["gf_sensitivity"][media] and "success" in self.modelutl.attributes["gf_sensitivity"][media]["bio1"]: - gapfilling_media.append(media) - if "rxn00062_c0" in self.modelutl.attributes["gf_sensitivity"][media] and "success" in self.modelutl.attributes["gf_sensitivity"][media]["rxn00062_c0"]: - core_gapfilling_media.append(media) + if gf_sensitivity: + for media in gf_sensitivity: + if "bio1" in self.modelutl.attributes["gf_sensitivity"][media] and "success" in self.modelutl.attributes["gf_sensitivity"][media]["bio1"]: + gapfilling_media.append(media) + if "rxn00062_c0" in self.modelutl.attributes["gf_sensitivity"][media] and "success" in self.modelutl.attributes["gf_sensitivity"][media]["rxn00062_c0"]: + core_gapfilling_media.append(media) # Count the number of gapfills number_gapfills = len(gapfilling_media) From b4a62f4213ffa657c4b2d21944a2eb3f1a4f5fbf Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 13 Sep 2023 01:24:05 -0500 Subject: [PATCH 172/298] Adding annotationontology class to module --- modelseedpy/__init__.py | 3 ++- modelseedpy/core/__init__.py | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/modelseedpy/__init__.py b/modelseedpy/__init__.py index 551f617d..efd16995 100644 --- a/modelseedpy/__init__.py +++ b/modelseedpy/__init__.py @@ -45,7 +45,8 @@ MSATPCorrection, MSGapfill, MSEquation, - MSModelReport + MSModelReport, + AnnotationOntology ) from modelseedpy.core.exceptions import * diff --git a/modelseedpy/core/__init__.py b/modelseedpy/core/__init__.py index eb4d02a2..bd374a03 100644 --- a/modelseedpy/core/__init__.py +++ b/modelseedpy/core/__init__.py @@ -13,4 +13,5 @@ from modelseedpy.core.msmodelutl import MSModelUtil from modelseedpy.core.mstemplate import MSTemplateBuilder from modelseedpy.core.msmodelreport import MSModelReport +from modelseedpy.core.annotationontology import AnnotationOntology from modelseedpy.core.exceptions import * From 2818366204ba871eea96f0356e2039acbdab497a Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 13 Sep 2023 01:37:58 -0500 Subject: [PATCH 173/298] Fixing report for models where gapfilling has an empty solution --- modelseedpy/core/msmodelreport.py | 84 ++++++++++++++++--------------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index 0e6f580e..78595f1c 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -79,47 +79,49 @@ def extract_gapfilling_data(self, gf_sensitivity): for media, media_data in gf_sensitivity.items(): for target, target_data in media_data.items(): - for reaction_id, reaction_data in target_data.get('success', {}).items(): - for direction, metabolites in reaction_data.items(): - # If metabolites is None, set to empty string - if metabolites is None: - metabolites = "" - - # Extract both IDs and Names for Gapfilling Sensitivity - sensitivity_ids = [] - sensitivity_names = [] - if isinstance(metabolites, (list, tuple)): - for met_id in metabolites: - sensitivity_ids.append(met_id) - met_name = self.model.metabolites.get_by_id(met_id).name if met_id in self.model.metabolites else met_id - sensitivity_names.append(met_name) - else: - metabolites = str(metabolites) - entry = { - "reaction_id": reaction_id, - "reaction_name": self.model.reactions.get_by_id(reaction_id).name if reaction_id in self.model.reactions else reaction_id, - "media": media, - "direction": direction, - "target": target, - "gapfilling_sensitivity_id": "; ".join(sensitivity_ids) if sensitivity_ids else metabolites, - "gapfilling_sensitivity_name": "; ".join(sensitivity_names) if sensitivity_names else metabolites - } - - # Update the summary dictionary - if reaction_id not in gapfilling_summary: - gapfilling_summary[reaction_id] = [] - gapfilling_summary[reaction_id].append(f"{media}: {direction}") - - # Check if reaction_id is already in dictionary - if reaction_id in gapfilling_dict: - # Update the media - existing_entry = gapfilling_dict[reaction_id] - existing_media = existing_entry["media"].split("; ") - if media not in existing_media: - existing_media.append(media) - existing_entry["media"] = "; ".join(existing_media) - else: - gapfilling_dict[reaction_id] = entry + gf_data = target_data.get('success', {}) + if isinstance(gf_data, dict): + for reaction_id, reaction_data in gf_data.items(): + for direction, metabolites in reaction_data.items(): + # If metabolites is None, set to empty string + if metabolites is None: + metabolites = "" + + # Extract both IDs and Names for Gapfilling Sensitivity + sensitivity_ids = [] + sensitivity_names = [] + if isinstance(metabolites, (list, tuple)): + for met_id in metabolites: + sensitivity_ids.append(met_id) + met_name = self.model.metabolites.get_by_id(met_id).name if met_id in self.model.metabolites else met_id + sensitivity_names.append(met_name) + else: + metabolites = str(metabolites) + entry = { + "reaction_id": reaction_id, + "reaction_name": self.model.reactions.get_by_id(reaction_id).name if reaction_id in self.model.reactions else reaction_id, + "media": media, + "direction": direction, + "target": target, + "gapfilling_sensitivity_id": "; ".join(sensitivity_ids) if sensitivity_ids else metabolites, + "gapfilling_sensitivity_name": "; ".join(sensitivity_names) if sensitivity_names else metabolites + } + + # Update the summary dictionary + if reaction_id not in gapfilling_summary: + gapfilling_summary[reaction_id] = [] + gapfilling_summary[reaction_id].append(f"{media}: {direction}") + + # Check if reaction_id is already in dictionary + if reaction_id in gapfilling_dict: + # Update the media + existing_entry = gapfilling_dict[reaction_id] + existing_media = existing_entry["media"].split("; ") + if media not in existing_media: + existing_media.append(media) + existing_entry["media"] = "; ".join(existing_media) + else: + gapfilling_dict[reaction_id] = entry return list(gapfilling_dict.values()), gapfilling_summary From 1dd84b3c2d9de98653e30100a4e9c9ddbd5e4c0b Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Thu, 14 Sep 2023 14:05:37 -0500 Subject: [PATCH 174/298] utl --- modelseedpy/core/msmodelutl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index ac232de8..d828b569 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -729,7 +729,7 @@ def test_single_condition(self, condition, apply_condition=True, model=None): if model.solver.status != "optimal": self.printlp(condition["media"].id + "-Testing-Infeasible.lp") logger.critical( - ondition["media"].id + condition["media"].id + "testing leads to infeasible problem. LP file printed to debug!" ) return False From 7112e17246407d31c85d47a4c3a343643047a064 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Thu, 14 Sep 2023 14:08:22 -0500 Subject: [PATCH 175/298] balck --- modelseedpy/__init__.py | 2 +- modelseedpy/core/annotationontology.py | 288 +++++++++++------- modelseedpy/core/msatpcorrection.py | 55 ++-- modelseedpy/core/msbuilder.py | 89 +++--- modelseedpy/core/msgapfill.py | 29 +- modelseedpy/core/msgrowthphenotypes.py | 287 ++++++++++-------- modelseedpy/core/msmedia.py | 7 +- modelseedpy/core/msmodelreport.py | 386 +++++++++++++++++-------- modelseedpy/core/msmodelutl.py | 10 +- modelseedpy/fbapkg/elementuptakepkg.py | 20 +- modelseedpy/fbapkg/kbasemediapkg.py | 4 +- 11 files changed, 748 insertions(+), 429 deletions(-) diff --git a/modelseedpy/__init__.py b/modelseedpy/__init__.py index 551f617d..75c94ad8 100644 --- a/modelseedpy/__init__.py +++ b/modelseedpy/__init__.py @@ -45,7 +45,7 @@ MSATPCorrection, MSGapfill, MSEquation, - MSModelReport + MSModelReport, ) from modelseedpy.core.exceptions import * diff --git a/modelseedpy/core/annotationontology.py b/modelseedpy/core/annotationontology.py index 4750ed13..db64a981 100644 --- a/modelseedpy/core/annotationontology.py +++ b/modelseedpy/core/annotationontology.py @@ -15,34 +15,49 @@ logging.INFO ) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO -#Class structure -#AnnotationOntology -> Features/Events/Terms/Ontologies +# Class structure +# AnnotationOntology -> Features/Events/Terms/Ontologies # AnnotationOntologyOntology -> Events/Terms # AnnotationOntologyEvent -> Features/Ontology # AnnotationOntologyFeature -> Term+Event->Evidence # AnnotationOntologyTerm -> Ontology/Events/Featurs # AnnotationOntologyEvidence -> -- -allowable_score_types = ["probability","evalue","bitscore","identity","qalignstart","qalignstop","salignstart","salignstop","kmerhits","tmscore","rmsd","hmmscore"] +allowable_score_types = [ + "probability", + "evalue", + "bitscore", + "identity", + "qalignstart", + "qalignstop", + "salignstart", + "salignstop", + "kmerhits", + "tmscore", + "rmsd", + "hmmscore", +] + class AnnotationOntologyEvidence: - def __init__(self,scores={},ref_entity=None,entity_type=None): - self.ref_entity=ref_entity - self.entity_type=entity_type - self.scores=scores + def __init__(self, scores={}, ref_entity=None, entity_type=None): + self.ref_entity = ref_entity + self.entity_type = entity_type + self.scores = scores for item in self.scores: if item not in allowable_score_types: - logger.warning(item+" not an allowable score type!") - + logger.warning(item + " not an allowable score type!") + def to_data(self): return { - "ref_entity":self.ref_entity, - "entity_type":self.entity_type, - "scores":self.scores + "ref_entity": self.ref_entity, + "entity_type": self.entity_type, + "scores": self.scores, } - + + class AnnotationOntologyTerm: - def __init__(self,parent,term_id,ontology): + def __init__(self, parent, term_id, ontology): self.id = term_id self.parent = parent self.ontology = ontology @@ -51,126 +66,170 @@ def __init__(self,parent,term_id,ontology): self.msrxns = set() self.events = {} self.features = {} - - def add_msrxns(self,rxn_ids): + + def add_msrxns(self, rxn_ids): for rxn_id in rxn_ids: if rxn_id[0:6] == "MSRXN:": - rxn_id = rxn_id[6:] - self.msrxns.update([rxn_id]) - - def add_event(self,event): + rxn_id = rxn_id[6:] + self.msrxns.update([rxn_id]) + + def add_event(self, event): self.events[event.id] = event - - def add_feature(self,feature): + + def add_feature(self, feature): self.features[feature.id] = feature - + + class AnnotationOntologyOntology: - def __init__(self,parent,ontology_id): + def __init__(self, parent, ontology_id): self.id = ontology_id self.parent = parent self.events = {} self.terms = {} - - def add_event(self,event): + + def add_event(self, event): self.events[event.id] = event - - def add_term(self,term): + + def add_term(self, term): self.terms[term.id] = term + class AnnotationOntologyFeature: - def __init__(self,parent,feature_id,type=None): + def __init__(self, parent, feature_id, type=None): self.id = feature_id self.parent = parent parent.add_feature(self) self.type = type self.event_terms = {} self.term_events = {} - - def add_event_term(self,event,term,scores={},ref_entity=None,entity_type=None): + + def add_event_term(self, event, term, scores={}, ref_entity=None, entity_type=None): if event.id not in self.event_terms: self.event_terms[event.id] = {} - self.event_terms[event.id][term.id] = AnnotationOntologyEvidence(scores,ref_entity,entity_type) + self.event_terms[event.id][term.id] = AnnotationOntologyEvidence( + scores, ref_entity, entity_type + ) if term.id not in self.term_events: self.term_events[term.id] = {} self.term_events[term.id][event.id] = self.event_terms[event.id][term.id] - - def get_associated_terms(self,prioritized_event_list=None,ontologies=None,merge_all=False,translate_to_rast=False): + + def get_associated_terms( + self, + prioritized_event_list=None, + ontologies=None, + merge_all=False, + translate_to_rast=False, + ): output = {} for term_id in self.term_events: term = self.parent.terms[term_id] if not ontologies or term.ontology.id in ontologies: if merge_all or not prioritized_event_list: for event_id in self.term_events[term_id]: - if not prioritized_event_list or event_id in prioritized_event_list: + if ( + not prioritized_event_list + or event_id in prioritized_event_list + ): if term not in output: output[term] = [] - output[term].append(self.term_events[term_id][event_id].to_data()) + output[term].append( + self.term_events[term_id][event_id].to_data() + ) else: for event_id in prioritized_event_list: if event_id in self.term_events[term_id]: - rxns = self.parent.terms[term_id].msrxns; + rxns = self.parent.terms[term_id].msrxns if len(rxns) > 0: if term not in output: output[term] = [] - output[term].append(self.term_events[term_id][event_id].to_data()) + output[term].append( + self.term_events[term_id][event_id].to_data() + ) break return output - - def get_associated_reactions(self,prioritized_event_list=None,ontologies=None,merge_all=False): + + def get_associated_reactions( + self, prioritized_event_list=None, ontologies=None, merge_all=False + ): output = {} for term_id in self.term_events: if not ontologies or self.parent.terms[term_id].ontology.id in ontologies: if merge_all or not prioritized_event_list: for event_id in self.term_events[term_id]: - if not prioritized_event_list or event_id in prioritized_event_list: - rxns = self.parent.terms[term_id].msrxns; + if ( + not prioritized_event_list + or event_id in prioritized_event_list + ): + rxns = self.parent.terms[term_id].msrxns for rxn_id in rxns: if rxn_id not in output: output[rxn_id] = [] - output[rxn_id].append(self.term_events[term_id][event_id].to_data()) + output[rxn_id].append( + self.term_events[term_id][event_id].to_data() + ) else: for event_id in prioritized_event_list: if event_id in self.term_events[term_id]: - rxns = self.parent.terms[term_id].msrxns; + rxns = self.parent.terms[term_id].msrxns for rxn_id in rxns: if rxn_id not in output: output[rxn_id] = [] - output[rxn_id].append(self.term_events[term_id][event_id].to_data()) + output[rxn_id].append( + self.term_events[term_id][event_id].to_data() + ) if len(rxns) > 0: break return output - + + class AnnotationOntologyEvent: - def __init__(self,parent,event_id,ontology_id,method,method_version=None,description=None,timestamp=None): + def __init__( + self, + parent, + event_id, + ontology_id, + method, + method_version=None, + description=None, + timestamp=None, + ): self.id = event_id self.parent = parent - #Linking ontology + # Linking ontology self.ontology = self.parent.add_ontology(ontology_id) self.ontology.add_event(self) if not description: - self.description = ""#TODO + self.description = "" # TODO else: self.description = description self.method = method self.method_version = method_version self.timestamp = timestamp self.features = {} - + @staticmethod - def from_data(data,parent): + def from_data(data, parent): if "method_version" not in data: data["method_version"] = None if "description" not in data: data["description"] = None if "timestamp" not in data: - data["timestamp"] = None - self = AnnotationOntologyEvent(parent,data["event_id"],data["ontology_id"],data["method"],data["method_version"],data["description"],data["timestamp"]) + data["timestamp"] = None + self = AnnotationOntologyEvent( + parent, + data["event_id"], + data["ontology_id"], + data["method"], + data["method_version"], + data["description"], + data["timestamp"], + ) if "ontology_terms" in data: for feature_id in data["ontology_terms"]: feature = self.parent.add_feature(feature_id) self.add_feature(feature) for item in data["ontology_terms"][feature_id]: - term = self.parent.add_term(item["term"],self.ontology) + term = self.parent.add_term(item["term"], self.ontology) scores = {} ref_entity = None entity_type = None @@ -180,43 +239,42 @@ def from_data(data,parent): if "reference" in item["evidence"]: ref_entity = item["evidence"]["reference"][1] entity_type = item["evidence"]["reference"][0] - feature.add_event_term(self,term,scores,ref_entity,entity_type) + feature.add_event_term(self, term, scores, ref_entity, entity_type) if "modelseed_ids" in item: term.add_msrxns(item["modelseed_ids"]) return self - - def add_feature(self,feature): + + def add_feature(self, feature): self.features[feature.id] = feature - + def to_data(self): data = { - "event_id" : self.event_id, - "description" : self.event_id, - "ontology_id" : self.ontology_id, - "method" : self.method, - "method_version" : self.method_version, - "timestamp" : self.timestamp, - "ontology_terms" : {} + "event_id": self.event_id, + "description": self.event_id, + "ontology_id": self.ontology_id, + "method": self.method, + "method_version": self.method_version, + "timestamp": self.timestamp, + "ontology_terms": {}, } for feature in self.features: - data["ontology_terms"][feature] = { - "term":None#TODO - } - + data["ontology_terms"][feature] = {"term": None} # TODO + + class AnnotationOntology: mdlutls = {} @staticmethod - def from_kbase_data(data,genome_ref=None,data_dir=None): - self = AnnotationOntology(genome_ref,data_dir) + def from_kbase_data(data, genome_ref=None, data_dir=None): + self = AnnotationOntology(genome_ref, data_dir) if "feature_types" in data: self.feature_types = data["feature_types"] if "events" in data: for event in data["events"]: - self.events += [AnnotationOntologyEvent.from_data(event,self)] + self.events += [AnnotationOntologyEvent.from_data(event, self)] return self - - def __init__(self,genome_ref,data_dir): + + def __init__(self, genome_ref, data_dir): self.genome_ref = genome_ref self.events = DictList() self.terms = {} @@ -227,20 +285,40 @@ def __init__(self,genome_ref,data_dir): self.noncodings = {} self.feature_types = {} self.term_names = {} - - def get_term_name(self,term): + + def get_term_name(self, term): if term.ontology.id not in self.term_names: self.term_names[term.ontology.id] = {} - if term.ontology.id in ["SSO","AntiSmash","EC","TC","META","RO","KO","GO"]: - with open(self.data_dir + "/"+term.ontology.id+"_dictionary.json") as json_file: + if term.ontology.id in [ + "SSO", + "AntiSmash", + "EC", + "TC", + "META", + "RO", + "KO", + "GO", + ]: + with open( + self.data_dir + "/" + term.ontology.id + "_dictionary.json" + ) as json_file: ontology = json.load(json_file) for item in ontology["term_hash"]: - self.term_names[term.ontology.id][item] = ontology["term_hash"][item]["name"] + self.term_names[term.ontology.id][item] = ontology["term_hash"][ + item + ]["name"] if term.id not in self.term_names[term.ontology.id]: return "Unknown" return self.term_names[term.ontology.id][term.id] - - def get_gene_term_hash(self,prioritized_event_list=None,ontologies=None,merge_all=False,cds_features=False,translate_to_rast=True): + + def get_gene_term_hash( + self, + prioritized_event_list=None, + ontologies=None, + merge_all=False, + cds_features=False, + translate_to_rast=True, + ): output = {} feature_hash = self.genes if len(self.genes) == 0 or (cds_features and len(self.cdss) == 0): @@ -249,16 +327,26 @@ def get_gene_term_hash(self,prioritized_event_list=None,ontologies=None,merge_al feature = feature_hash[feature_id] if feature not in output: output[feature] = {} - output[feature] = feature.get_associated_terms(prioritized_event_list,ontologies,merge_all,translate_to_rast) + output[feature] = feature.get_associated_terms( + prioritized_event_list, ontologies, merge_all, translate_to_rast + ) return output - - def get_reaction_gene_hash(self,prioritized_event_list=None,ontologies=None,merge_all=False,cds_features=False): + + def get_reaction_gene_hash( + self, + prioritized_event_list=None, + ontologies=None, + merge_all=False, + cds_features=False, + ): output = {} feature_hash = self.genes if len(self.genes) == 0 or (cds_features and len(self.cdss) == 0): feature_hash = self.cdss for feature_id in feature_hash: - reactions = feature_hash[feature_id].get_associated_reactions(prioritized_event_list,ontologies,merge_all) + reactions = feature_hash[feature_id].get_associated_reactions( + prioritized_event_list, ontologies, merge_all + ) for rxn_id in reactions: if rxn_id not in output: output[rxn_id] = {} @@ -266,32 +354,34 @@ def get_reaction_gene_hash(self,prioritized_event_list=None,ontologies=None,merg output[rxn_id][feature_id] = [] output[rxn_id][feature_id].append(reactions[rxn_id]) return output - - def add_term(self,term_or_id,ontology=None): + + def add_term(self, term_or_id, ontology=None): if not isinstance(term_or_id, AnnotationOntologyTerm): if term_or_id in self.terms: return self.terms[term_or_id] else: - return AnnotationOntologyTerm(self,term_or_id,ontology) + return AnnotationOntologyTerm(self, term_or_id, ontology) if term_or_id.id in self.terms: - logger.critical("Term with id "+term_or_id.id+" already in annotation!") + logger.critical("Term with id " + term_or_id.id + " already in annotation!") return self.terms[term_or_id.id] else: - self.terms[term_or_id.id] = term_or_id - - def add_ontology(self,ontology_or_id): + self.terms[term_or_id.id] = term_or_id + + def add_ontology(self, ontology_or_id): if not isinstance(ontology_or_id, AnnotationOntologyOntology): if ontology_or_id in self.ontologies: return self.ontologies[ontology_or_id] else: - return AnnotationOntologyOntology(self,ontology_or_id) + return AnnotationOntologyOntology(self, ontology_or_id) if ontology_or_id.id in self.ontologies: - logger.critical("Ontology with id "+ontology_or_id.id+" already in annotation!") + logger.critical( + "Ontology with id " + ontology_or_id.id + " already in annotation!" + ) return self.ontologies[ontology_or_id.id] else: self.ontologies[ontology_or_id.id] = ontology_or_id - - def get_feature_hash(self,feature_id): + + def get_feature_hash(self, feature_id): feature_hash = self.genes if feature_id in self.feature_types: if self.feature_types[feature_id] == "cds": @@ -299,15 +389,15 @@ def get_feature_hash(self,feature_id): elif self.feature_types[feature_id] == "noncoding": feature_hash = self.noncodings return feature_hash - - def add_feature(self,feature_or_id): + + def add_feature(self, feature_or_id): feature_hash = None if not isinstance(feature_or_id, AnnotationOntologyFeature): feature_hash = self.get_feature_hash(feature_or_id) if feature_or_id in feature_hash: return feature_hash[feature_or_id] else: - feature_or_id = AnnotationOntologyFeature(self,feature_or_id) + feature_or_id = AnnotationOntologyFeature(self, feature_or_id) if not feature_hash: feature_hash = self.get_feature_hash(feature_or_id.id) if feature_or_id.id not in feature_hash: diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 93319808..d3321d6a 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -49,7 +49,7 @@ default_threshold_multipiers = { "Glc": 2, - "default":1.2, + "default": 1.2, } @@ -119,7 +119,7 @@ def __init__( media.id = "empty" media.name = "empty" self.media_hash[media.id] = media - + self.forced_media = [] for media_id in forced_media: for item in self.atp_medias: @@ -171,10 +171,7 @@ def load_default_medias(self): media.id = media_id media.name = media_id min_obj = 0.01 - self.atp_medias.append([ - media, - min_gap.get(media_d, min_obj) - ]) + self.atp_medias.append([media, min_gap.get(media_d, min_obj)]) @staticmethod def find_reaction_in_template(model_reaction, template, compartment): @@ -407,11 +404,9 @@ def apply_growth_media_gapfilling(self): and MSGapfill.gapfill_count(self.media_gapfill_stats[media]) > 0 ): self.msgapfill.integrate_gapfill_solution( - stats, - self.cumulative_core_gapfilling, - link_gaps_to_objective=False + stats, self.cumulative_core_gapfilling, link_gaps_to_objective=False ) - #Adding reactions to gapfilling sensitivity structure so we can track all gapfilled reactions + # Adding reactions to gapfilling sensitivity structure so we can track all gapfilled reactions gf_sensitivity = self.modelutl.get_attributes("gf_sensitivity", {}) if media.id not in gf_sensitivity: gf_sensitivity[media.id] = {} @@ -419,15 +414,17 @@ def apply_growth_media_gapfilling(self): gf_sensitivity[media.id][self.atp_hydrolysis.id] = {} gf_sensitivity[media.id][self.atp_hydrolysis.id]["success"] = {} for item in stats["new"]: - gf_sensitivity[media.id][self.atp_hydrolysis.id]["success"][item] = { - stats["new"][item] : [] - } + gf_sensitivity[media.id][self.atp_hydrolysis.id]["success"][ + item + ] = {stats["new"][item]: []} for item in stats["reversed"]: - gf_sensitivity[media.id][self.atp_hydrolysis.id]["success"][item] = { - stats["reversed"][item] : [] - } - self.modelutl.save_attributes(gf_sensitivity, "gf_sensitivity") - self.modelutl.save_attributes(len(self.cumulative_core_gapfilling), "total_core_gapfilling") + gf_sensitivity[media.id][self.atp_hydrolysis.id]["success"][ + item + ] = {stats["reversed"][item]: []} + self.modelutl.save_attributes(gf_sensitivity, "gf_sensitivity") + self.modelutl.save_attributes( + len(self.cumulative_core_gapfilling), "total_core_gapfilling" + ) def expand_model_to_genome_scale(self): """Restores noncore reactions to model while filtering out reactions that break ATP @@ -445,7 +442,7 @@ def expand_model_to_genome_scale(self): self.restore_noncore_reactions(noncore=True, othercompartment=False) # Extending model with non core reactions while retaining ATP accuracy self.filtered_noncore = self.modelutl.reaction_expansion_test( - self.noncore_reactions, tests,attribute_label="atp_expansion_filter" + self.noncore_reactions, tests, attribute_label="atp_expansion_filter" ) # Removing filtered reactions for item in self.filtered_noncore: @@ -485,7 +482,7 @@ def restore_noncore_reactions(self, noncore=True, othercompartment=True): reaction.lower_bound = self.original_bounds[reaction.id][0] reaction.upper_bound = self.original_bounds[reaction.id][1] - def build_tests(self,multiplier_hash_override={}): + def build_tests(self, multiplier_hash_override={}): """Build tests based on ATP media evaluations Parameters @@ -501,16 +498,16 @@ def build_tests(self,multiplier_hash_override={}): Raises ------ """ - #Applying threshold multiplier + # Applying threshold multiplier for key in default_threshold_multipiers: if key not in multiplier_hash_override: multiplier_hash_override[key] = default_threshold_multipiers[key] - #Initialzing atp test attributes + # Initialzing atp test attributes atp_att = self.modelutl.get_attributes( "ATP_analysis", {"tests": {}, "selected_media": {}, "core_atp_gapfilling": {}}, ) - #Initializing tests and adding empty media every time + # Initializing tests and adding empty media every time tests = [] if "empty" in self.media_hash: tests.append( @@ -525,16 +522,16 @@ def build_tests(self,multiplier_hash_override={}): "threshold": 0.00001, "objective": self.atp_hydrolysis.id, } - #Setting objective to ATP hydrolysis + # Setting objective to ATP hydrolysis self.model.objective = self.atp_hydrolysis.id for media in self.selected_media: - #Setting multiplier for test threshold + # Setting multiplier for test threshold multiplier = multiplier_hash_override["default"] if media.id in multiplier_hash_override: - multiplier = multiplier_hash_override[media.id] - #Constraining model exchanges for media + multiplier = multiplier_hash_override[media.id] + # Constraining model exchanges for media self.modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package(media) - #Computing core ATP production + # Computing core ATP production obj_value = self.model.slim_optimize() logger.debug(f"{media.name} = {obj_value};{multiplier}") threshold = multiplier * obj_value @@ -553,7 +550,7 @@ def build_tests(self,multiplier_hash_override={}): "threshold": multiplier * obj_value, "objective": self.atp_hydrolysis.id, } - #Saving test attributes to the model + # Saving test attributes to the model self.modelutl.save_attributes(atp_att, "ATP_analysis") return tests diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 7f079234..bca4a0f8 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -730,26 +730,28 @@ def build_metabolic_reactions(self): reactions.append(reaction) return reactions - + def build_from_annotaton_ontology( - self, - model_or_id, - anno_ont, - index="0", - allow_all_non_grp_reactions=False, - annotate_with_rast=False, - biomass_classic=False, - biomass_gc=0.5, - add_non_template_reactions=True, - prioritized_event_list=None, - ontologies=None, - merge_all=True, - convert_to_sso=True - ): - #Build base model without annotation + self, + model_or_id, + anno_ont, + index="0", + allow_all_non_grp_reactions=False, + annotate_with_rast=False, + biomass_classic=False, + biomass_gc=0.5, + add_non_template_reactions=True, + prioritized_event_list=None, + ontologies=None, + merge_all=True, + convert_to_sso=True, + ): + # Build base model without annotation self.search_name_to_orginal = {} self.search_name_to_genes = {} - gene_term_hash = anno_ont.get_gene_term_hash(prioritized_event_list,ontologies,merge_all,convert_to_sso) + gene_term_hash = anno_ont.get_gene_term_hash( + prioritized_event_list, ontologies, merge_all, convert_to_sso + ) residual_reaction_gene_hash = {} for gene in gene_term_hash: for term in gene_term_hash[gene]: @@ -767,9 +769,18 @@ def build_from_annotaton_ontology( residual_reaction_gene_hash[rxn_id] = {} if gene not in residual_reaction_gene_hash[rxn_id]: residual_reaction_gene_hash[rxn_id][gene] = [] - residual_reaction_gene_hash[rxn_id][gene] = gene_term_hash[gene][term] - - model_or_id = self.build(model_or_id,index,allow_all_non_grp_reactions,annotate_with_rast,biomass_classic,biomass_gc) + residual_reaction_gene_hash[rxn_id][gene] = gene_term_hash[ + gene + ][term] + + model_or_id = self.build( + model_or_id, + index, + allow_all_non_grp_reactions, + annotate_with_rast, + biomass_classic, + biomass_gc, + ) for rxn in model_or_id.reactions: probability = None for gene in rxn.genes(): @@ -779,22 +790,25 @@ def build_from_annotaton_ontology( if rxn.id[0:-3] in term.msrxns: for item in gene_term_hash[gene][term]: if "probability" in item.scores: - if not probability or item.scores["probability"] > probability: + if ( + not probability + or item.scores["probability"] > probability + ): probability = item.scores["probability"] if hasattr(rxn, "probability"): - rxn.probability = probability - + rxn.probability = probability + reactions = [] modelseeddb = ModelSEEDBiochem.get() for rxn_id in residual_reaction_gene_hash: - if rxn_id+"_c0" not in model_or_id.reactions: + if rxn_id + "_c0" not in model_or_id.reactions: reaction = None template_reaction = None - if rxn_id+"_c" in self.template.reactions: - template_reaction = self.template.reactions.get_by_id(rxn_id+"_c") + if rxn_id + "_c" in self.template.reactions: + template_reaction = self.template.reactions.get_by_id(rxn_id + "_c") elif rxn_id in modelseeddb.reactions: msrxn = modelseeddb.reactions.get_by_id(rxn_id) - template_reaction = msrxn.to_template_reaction({0:"c",1:"e"}) + template_reaction = msrxn.to_template_reaction({0: "c", 1: "e"}) if template_reaction: for m in template_reaction.metabolites: if m.compartment not in self.compartments: @@ -803,15 +817,22 @@ def build_from_annotaton_ontology( ] = self.template.compartments.get_by_id(m.compartment) if m.id not in self.template_species_to_model_species: model_metabolite = m.to_metabolite(self.index) - self.template_species_to_model_species[m.id] = model_metabolite + self.template_species_to_model_species[ + m.id + ] = model_metabolite self.base_model.add_metabolites([model_metabolite]) - reaction = template_reaction.to_reaction(self.base_model, self.index) + reaction = template_reaction.to_reaction( + self.base_model, self.index + ) gpr = "" probability = None for gene in residual_reaction_gene_hash[rxn_id]: for item in residual_reaction_gene_hash[rxn_id][gene]: if "probability" in item["scores"]: - if not probability or item["scores"]["probability"] > probability: + if ( + not probability + or item["scores"]["probability"] > probability + ): probability = item["scores"]["probability"] if len(gpr) > 0: gpr += " or " @@ -822,7 +843,7 @@ def build_from_annotaton_ontology( reaction.annotation[SBO_ANNOTATION] = "SBO:0000176" reactions.append(reaction) if not reaction: - print("Reaction ",rxn_id," not found in template or database!") + print("Reaction ", rxn_id, " not found in template or database!") model_or_id.add_reactions(reactions) return model_or_id @@ -911,7 +932,7 @@ def build( annotate_with_rast=True, biomass_classic=False, biomass_gc=0.5, - add_reaction_from_rast_annotation=True + add_reaction_from_rast_annotation=True, ): """ @@ -949,11 +970,11 @@ def build( complex_groups = self.build_complex_groups( self.reaction_to_complex_sets.values() ) - + if add_reaction_from_rast_annotation: metabolic_reactions = self.build_metabolic_reactions() cobra_model.add_reactions(metabolic_reactions) - + non_metabolic_reactions = self.build_non_metabolite_reactions( cobra_model, allow_all_non_grp_reactions ) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 16634707..ba0c1704 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -11,7 +11,7 @@ logger = logging.getLogger(__name__) logger.setLevel( - logging.INFO#WARNING + logging.INFO # WARNING ) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO @@ -148,11 +148,13 @@ def prefilter(self, media, target): self.gfpkgmgr.getpkg("GapfillingPkg").filter_database_based_on_tests( self.test_conditions ) - gf_filter = self.gfpkgmgr.getpkg("GapfillingPkg").modelutl.get_attributes("gf_filter", {}) + gf_filter = self.gfpkgmgr.getpkg("GapfillingPkg").modelutl.get_attributes( + "gf_filter", {} + ) base_filter = self.mdlutl.get_attributes("gf_filter", {}) for media_id in gf_filter: base_filter[media_id] = gf_filter[media_id] - + # Testing if gapfilling can work after filtering if not self.test_gapfill_database(media, target, before_filtering=False): return False @@ -176,7 +178,7 @@ def run_gapfilling( Name or expression describing the reaction or combination of reactions to the optimized minimum_obj : double Value to use for the minimal objective threshold that the model must be gapfilled to achieve - binary_check : bool + binary_check : bool Indicates if the solution should be checked to ensure it is minimal in the number of reactions involved prefilter : bool Indicates if the gapfilling database should be prefiltered using the tests provided in the MSGapfill constructor before running gapfilling @@ -276,14 +278,14 @@ def run_multi_gapfill( Media-specific minimal objective thresholds that the model must be gapfilled to achieve default_minimum_objective : double Default value to use for the minimal objective threshold that the model must be gapfilled to achieve - binary_check : bool + binary_check : bool Indicates if the solution should be checked to ensure it is minimal in the number of reactions involved prefilter : bool Indicates if the gapfilling database should be prefiltered using the tests provided in the MSGapfill constructor before running gapfilling check_for_growth : bool Indicates if the model should be checked to ensure that the resulting gapfilling solution produces a nonzero objective """ - + if not default_minimum_objective: default_minimum_objective = self.default_minimum_objective first = True @@ -347,8 +349,8 @@ def integrate_gapfill_solution( cumulative_solution.append([rxn_id, "<"]) rxn.upper_bound = 0 rxn.lower_bound = -100 - - #Sometimes for whatever reason, the solution includes useless reactions that should be stripped out before saving the final model + + # Sometimes for whatever reason, the solution includes useless reactions that should be stripped out before saving the final model unneeded = self.mdlutl.test_solution( solution, keep_changes=True ) # Strips out unneeded reactions - which undoes some of what is done above @@ -357,11 +359,16 @@ def integrate_gapfill_solution( if item[0] == oitem[0] and item[1] == oitem[1]: cumulative_solution.remove(oitem) break - #Adding the gapfilling solution data to the model, which is needed for saving the model in KBase + # Adding the gapfilling solution data to the model, which is needed for saving the model in KBase self.mdlutl.add_gapfilling(solution) - #Testing which gapfilled reactions are needed to produce each reactant in the objective function + # Testing which gapfilled reactions are needed to produce each reactant in the objective function if link_gaps_to_objective: - logger.info("Gapfilling sensitivity analysis running on succesful run in "+solution["media"].id+" for target "+solution["target"]) + logger.info( + "Gapfilling sensitivity analysis running on succesful run in " + + solution["media"].id + + " for target " + + solution["target"] + ) gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) if solution["media"].id not in gf_sensitivity: gf_sensitivity[solution["media"].id] = {} diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index b0d3b2b6..75e356c4 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -13,6 +13,7 @@ logging.INFO ) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO + class MSGrowthPhenotype: def __init__( self, @@ -35,7 +36,7 @@ def __init__( self.additional_compounds = additional_compounds self.parent = parent - def build_media(self,include_base_media=True): + def build_media(self, include_base_media=True): """Builds media object to use when simulating the phenotype Parameters ---------- @@ -79,25 +80,30 @@ def simulate( modelutl = model_or_mdlutl if not isinstance(model_or_mdlutl, MSModelUtil): modelutl = MSModelUtil.get(model_or_mdlutl) - - #Setting objective + + # Setting objective if objective: modelutl.model.objective = objective - - #Building full media and adding missing exchanges - output = {"growth": None, "class": None, "missing_transports": [], "baseline_growth": None} + + # Building full media and adding missing exchanges + output = { + "growth": None, + "class": None, + "missing_transports": [], + "baseline_growth": None, + } full_media = self.build_media() if add_missing_exchanges: output["missing_transports"] = modelutl.add_missing_exchanges(full_media) - - #Getting basline growth + + # Getting basline growth output["baseline_growth"] = 0.01 if self.parent: - output["baseline_growth"] = self.parent.baseline_growth(modelutl,objective) + output["baseline_growth"] = self.parent.baseline_growth(modelutl, objective) if output["baseline_growth"] < 1e-5: output["baseline_growth"] = 0.01 - - #Building specific media and setting compound exception list + + # Building specific media and setting compound exception list if self.parent and self.parent.atom_limits and len(self.parent.atom_limits) > 0: reaction_exceptions = [] specific_media = self.build_media(False) @@ -105,36 +111,36 @@ def simulate( ex_hash = mediacpd.get_mdl_exchange_hash(modelutl) for mdlcpd in ex_hash: reaction_exceptions.append(ex_hash[mdlcpd]) - modelutl.pkgmgr.getpkg("ElementUptakePkg").build_package(self.parent.atom_limits,exception_reactions=reaction_exceptions) - - #Applying media + modelutl.pkgmgr.getpkg("ElementUptakePkg").build_package( + self.parent.atom_limits, exception_reactions=reaction_exceptions + ) + + # Applying media if self.parent: modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package( full_media, self.parent.base_uptake, self.parent.base_excretion ) else: - modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package( - full_media,0,1000 - ) - + modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package(full_media, 0, 1000) + with modelutl.model: - #Applying gene knockouts + # Applying gene knockouts for gene in self.gene_ko: if gene in modelutl.model.genes: geneobj = modelutl.model.genes.get_by_id(gene) geneobj.knock_out() - - #Optimizing model + + # Optimizing model solution = modelutl.model.optimize() output["growth"] = solution.objective_value if solution.objective_value > 0 and pfba: solution = cobra.flux_analysis.pfba(modelutl.model) if save_fluxes: output["fluxes"] = solution.fluxes - - #Determining phenotype class - - if output["growth"] >= output["baseline_growth"]*growth_multiplier: + + # Determining phenotype class + + if output["growth"] >= output["baseline_growth"] * growth_multiplier: output["GROWING"] = True if not self.growth: output["class"] = "GROWTH" @@ -172,44 +178,60 @@ def gapfill_model_for_phenotype( objective : string Expression for objective to be activated by gapfilling """ - #First simulate model without gapfilling to assess ungapfilled growth - output = self.simulate(msgapfill.mdlutl,objective,growth_multiplier,add_missing_exchanges) - if output["growth"] >= output["baseline_growth"]*growth_multiplier: - #No gapfilling needed - original model grows without gapfilling - return {"reversed": {}, "new": {},"media": self.build_media(), "target":objective, "minobjective": output["baseline_growth"]*growth_multiplier, "binary_check":False} - - #Now pulling the gapfilling configured model from MSGapfill + # First simulate model without gapfilling to assess ungapfilled growth + output = self.simulate( + msgapfill.mdlutl, objective, growth_multiplier, add_missing_exchanges + ) + if output["growth"] >= output["baseline_growth"] * growth_multiplier: + # No gapfilling needed - original model grows without gapfilling + return { + "reversed": {}, + "new": {}, + "media": self.build_media(), + "target": objective, + "minobjective": output["baseline_growth"] * growth_multiplier, + "binary_check": False, + } + + # Now pulling the gapfilling configured model from MSGapfill gfmodelutl = MSModelUtil.get(msgapfill.gfmodel) - #Saving the gapfill objective because this will be replaced when the simulation runs + # Saving the gapfill objective because this will be replaced when the simulation runs gfobj = gfmodelutl.model.objective - #Running simulate on gapfill model to add missing exchanges and set proper media and uptake limit constraints - output = self.simulate(modelutl,objective,growth_multiplier,add_missing_exchanges) - #If the gapfilling model fails to achieve the minimum growth, then no solution exists - if output["growth"] < output["baseline_growth"]*growth_multiplier: + # Running simulate on gapfill model to add missing exchanges and set proper media and uptake limit constraints + output = self.simulate( + modelutl, objective, growth_multiplier, add_missing_exchanges + ) + # If the gapfilling model fails to achieve the minimum growth, then no solution exists + if output["growth"] < output["baseline_growth"] * growth_multiplier: logger.warning( "Gapfilling failed with the specified model, media, and target reaction." ) return None - - #Running the gapfilling itself + + # Running the gapfilling itself full_media = self.build_media() with modelutl.model: - #Applying gene knockouts + # Applying gene knockouts for gene in self.gene_ko: if gene in modelutl.model.genes: geneobj = modelutl.model.genes.get_by_id(gene) geneobj.knock_out() - - gfresults = self.gapfilling.run_gapfilling(media,None,minimum_obj=output["baseline_growth"]*growth_multiplier) + + gfresults = self.gapfilling.run_gapfilling( + media, None, minimum_obj=output["baseline_growth"] * growth_multiplier + ) if gfresults is None: logger.warning( "Gapfilling failed with the specified model, media, and target reaction." ) - + return gfresults + class MSGrowthPhenotypes: - def __init__(self, base_media=None, base_uptake=0, base_excretion=1000,global_atom_limits={}): + def __init__( + self, base_media=None, base_uptake=0, base_excretion=1000, global_atom_limits={} + ): self.base_media = base_media self.phenotypes = DictList() self.base_uptake = base_uptake @@ -219,8 +241,16 @@ def __init__(self, base_media=None, base_uptake=0, base_excretion=1000,global_at self.cached_based_growth = {} @staticmethod - def from_compound_hash(compounds,base_media=None, base_uptake=0, base_excretion=1000,global_atom_limits={}): - growthpheno = MSGrowthPhenotypes(base_media, base_uptake, base_excretion,global_atom_limits) + def from_compound_hash( + compounds, + base_media=None, + base_uptake=0, + base_excretion=1000, + global_atom_limits={}, + ): + growthpheno = MSGrowthPhenotypes( + base_media, base_uptake, base_excretion, global_atom_limits + ) new_phenos = [] for cpd in compounds: newpheno = MSGrowthPhenotype(cpd, None, compounds[cpd], [], [cpd]) @@ -229,8 +259,17 @@ def from_compound_hash(compounds,base_media=None, base_uptake=0, base_excretion= return growthpheno @staticmethod - def from_kbase_object(data, kbase_api,base_media=None, base_uptake=0, base_excretion=1000,global_atom_limits={}): - growthpheno = MSGrowthPhenotypes(base_media,base_uptake, base_excretion,global_atom_limits) + def from_kbase_object( + data, + kbase_api, + base_media=None, + base_uptake=0, + base_excretion=1000, + global_atom_limits={}, + ): + growthpheno = MSGrowthPhenotypes( + base_media, base_uptake, base_excretion, global_atom_limits + ) new_phenos = [] for pheno in data["phenotypes"]: media = kbase_api.get_from_ws(pheno["media_ref"], None) @@ -248,9 +287,18 @@ def from_kbase_object(data, kbase_api,base_media=None, base_uptake=0, base_excre return growthpheno @staticmethod - def from_kbase_file(filename, kbase_api,base_media=None, base_uptake=0, base_excretion=1000,global_atom_limits={}): + def from_kbase_file( + filename, + kbase_api, + base_media=None, + base_uptake=0, + base_excretion=1000, + global_atom_limits={}, + ): # TSV file with the following headers:media mediaws growth geneko addtlCpd - growthpheno = MSGrowthPhenotypes(base_media,base_uptake, base_excretion,global_atom_limits) + growthpheno = MSGrowthPhenotypes( + base_media, base_uptake, base_excretion, global_atom_limits + ) headings = [] new_phenos = [] with open(filename) as f: @@ -282,8 +330,16 @@ def from_kbase_file(filename, kbase_api,base_media=None, base_uptake=0, base_exc return growthpheno @staticmethod - def from_ms_file(filename,base_media=None, base_uptake=0, base_excretion=100,global_atom_limits={}): - growthpheno = MSGrowthPhenotypes(base_media,base_uptake, base_excretion,global_atom_limits) + def from_ms_file( + filename, + base_media=None, + base_uptake=0, + base_excretion=100, + global_atom_limits={}, + ): + growthpheno = MSGrowthPhenotypes( + base_media, base_uptake, base_excretion, global_atom_limits + ) df = pd.read_csv(filename) required_headers = ["Compounds", "Growth"] for item in required_headers: @@ -311,7 +367,7 @@ def build_super_media(self): else: super_media.merge(pheno.build_media(), overwrite_overlap=False) return super_media - + def add_phenotypes(self, new_phenotypes): keep_phenos = [] for pheno in new_phenotypes: @@ -321,11 +377,7 @@ def add_phenotypes(self, new_phenotypes): additions = DictList(keep_phenos) self.phenotypes += additions - def baseline_growth( - self, - model_or_mdlutl, - objective - ): + def baseline_growth(self, model_or_mdlutl, objective): """Simulates all the specified phenotype conditions and saves results Parameters ---------- @@ -336,22 +388,22 @@ def baseline_growth( modelutl = model_or_mdlutl if not isinstance(model_or_mdlutl, MSModelUtil): modelutl = MSModelUtil.get(model_or_mdlutl) - #Checking if base growth already computed + # Checking if base growth already computed if modelutl in self.cached_based_growth: if objective in self.cached_based_growth[modelutl]: return self.cached_based_growth[modelutl][objective] else: self.cached_based_growth[modelutl] = {} - #Setting objective + # Setting objective modelutl.objective = objective - #Setting media + # Setting media modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package( self.base_media, self.base_uptake, self.base_excretion ) - #Adding uptake limits + # Adding uptake limits if len(self.atom_limits) > 0: modelutl.pkgmgr.getpkg("ElementUptakePkg").build_package(self.atom_limits) - #Simulating + # Simulating self.cached_based_growth[modelutl][objective] = modelutl.model.slim_optimize() return self.cached_based_growth[modelutl][objective] @@ -364,7 +416,7 @@ def simulate_phenotypes( save_fluxes=False, gapfill_negatives=False, msgapfill=None, - test_conditions=None + test_conditions=None, ): """Simulates all the specified phenotype conditions and saves results Parameters @@ -384,14 +436,14 @@ def simulate_phenotypes( modelutl = model_or_mdlutl if not isinstance(model_or_mdlutl, MSModelUtil): modelutl = MSModelUtil.get(model_or_mdlutl) - #Setting objective + # Setting objective modelutl.objective = objective - #Getting basline growth - baseline_growth = self.baseline_growth(modelutl,objective) - #Establishing output of the simulation method + # Getting basline growth + baseline_growth = self.baseline_growth(modelutl, objective) + # Establishing output of the simulation method summary = { - "Label": ["Accuracy", "CP", "CN", "FP", "FN","Growth","No growth"], - "Count": [0, 0, 0, 0, 0,0,0], + "Label": ["Accuracy", "CP", "CN", "FP", "FN", "Growth", "No growth"], + "Count": [0, 0, 0, 0, 0, 0, 0], } data = { "Phenotype": [], @@ -400,22 +452,24 @@ def simulate_phenotypes( "Class": [], "Transports missing": [], "Gapfilled reactions": [], - "Gapfilling score":None + "Gapfilling score": None, } - #Running simulations + # Running simulations gapfilling_solutions = {} totalcount = 0 for pheno in self.phenotypes: result = pheno.simulate( - modelutl,objective,growth_multiplier,add_missing_exchanges,save_fluxes + modelutl, + objective, + growth_multiplier, + add_missing_exchanges, + save_fluxes, ) data["Class"].append(result["class"]) data["Phenotype"].append(pheno.id) data["Observed growth"].append(pheno.growth) data["Simulated growth"].append(result["growth"]) - data["Transports missing"].append( - ";".join(result["missing_transports"]) - ) + data["Transports missing"].append(";".join(result["missing_transports"])) if result["class"] == "CP": summary["Count"][1] += 1 summary["Count"][0] += 1 @@ -434,22 +488,25 @@ def simulate_phenotypes( summary["Count"][5] += 1 elif result["class"] == "NOGROWTH": summary["Count"][6] += 1 - #Gapfilling negative growth conditions - if gapfill_negatives and output["class"] in ["NOGROWTH","FN","CN"]: - gapfilling_solutions[pheno] = pheno.gapfill_model_for_phenotype(msgapfill,objective,test_conditions,growth_multiplier,add_missing_exchanges) + # Gapfilling negative growth conditions + if gapfill_negatives and output["class"] in ["NOGROWTH", "FN", "CN"]: + gapfilling_solutions[pheno] = pheno.gapfill_model_for_phenotype( + msgapfill, + objective, + test_conditions, + growth_multiplier, + add_missing_exchanges, + ) if gapfilling_solutions[pheno] != None: data["Gapfilling score"] = 0 list = [] for rxn_id in gapfilling_solutions[pheno]["reversed"]: list.append( - gapfilling_solutions[pheno]["reversed"][rxn_id] - + rxn_id + gapfilling_solutions[pheno]["reversed"][rxn_id] + rxn_id ) data["Gapfilling score"] += 0.5 for rxn_id in gapfilling_solutions[pheno]["new"]: - list.append( - gapfilling_solutions[pheno]["new"][rxn_id] + rxn_id - ) + list.append(gapfilling_solutions[pheno]["new"][rxn_id] + rxn_id) data["Gapfilling score"] += 1 data["Gapfilled reactions"].append(";".join(list)) else: @@ -473,9 +530,9 @@ def fit_model_to_phenotypes( minimize_new_false_positives=True, atp_safe=True, integrate_results=True, - global_gapfilling=True + global_gapfilling=True, ): - + """Simulates all the specified phenotype conditions and saves results Parameters ---------- @@ -488,46 +545,46 @@ def fit_model_to_phenotypes( integrate_results : bool Indicates if the resulting modifications to the model should be integrated """ - - - - #Running simulations + + # Running simulations positive_growth = [] negative_growth = [] for pheno in self.phenotypes: with model: result = pheno.simulate( - modelutl,objective,growth_multiplier,add_missing_exchanges,save_fluxes + modelutl, + objective, + growth_multiplier, + add_missing_exchanges, + save_fluxes, ) - #Gapfilling negative growth conditions - if gapfill_negatives and output["class"] in ["NOGROWTH","FN","CN"]: + # Gapfilling negative growth conditions + if gapfill_negatives and output["class"] in ["NOGROWTH", "FN", "CN"]: negative_growth.append(pheno.build_media()) - elif gapfill_negatives and output["class"] in ["GROWTH","FP","CP"]: + elif gapfill_negatives and output["class"] in ["GROWTH", "FP", "CP"]: positive_growth.append(pheno.build_media()) - - - #Create super media for all + + # Create super media for all super_media = self.build_super_media() - #Adding missing exchanges + # Adding missing exchanges msgapfill.gfmodel.add_missing_exchanges(super_media) - #Adding elemental constraints + # Adding elemental constraints self.add_elemental_constraints() - #Getting ATP tests - - #Filtering database for ATP tests - - #Penalizing database to avoid creating false positives - - #Building additional tests from current correct negatives - - #Computing base-line growth - - #Computing growth threshold - - #Running global gapfill - - #Integrating solution - + # Getting ATP tests + + # Filtering database for ATP tests + + # Penalizing database to avoid creating false positives + + # Building additional tests from current correct negatives + + # Computing base-line growth + + # Computing growth threshold + + # Running global gapfill + + # Integrating solution def gapfill_all_phenotypes( self, diff --git a/modelseedpy/core/msmedia.py b/modelseedpy/core/msmedia.py index fadc435d..960e82d1 100644 --- a/modelseedpy/core/msmedia.py +++ b/modelseedpy/core/msmedia.py @@ -22,8 +22,8 @@ def maxFlux(self): def minFlux(self): # TODO: will be removed later just for old methods return -self.upper_bound - - def get_mdl_exchange_hash(self,model_or_mdlutl): + + def get_mdl_exchange_hash(self, model_or_mdlutl): modelutl = model_or_mdlutl if not isinstance(model_or_mdlutl, MSModelUtil): modelutl = MSModelUtil.get(model_or_mdlutl) @@ -33,7 +33,8 @@ def get_mdl_exchange_hash(self,model_or_mdlutl): for met in mets: if met in exchange_hash: output[met] = exchange_hash[met] - return output + return output + class MSMedia: def __init__(self, media_id, name=""): diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index c5274fcd..ca83533f 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -15,58 +15,82 @@ logging.INFO ) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO + class MSModelReport: - def __init__( - self - ): + def __init__(self): pass def generate_reports(self, model, report_path, multi_tab_report_path): self.build_report(model, report_path) self.build_multitab_report(model, multi_tab_report_path) - + # Helper function to build overview data def build_overview_data(self, model): # Get the number of compartments - number_compartments = len(set([metabolite.compartment for metabolite in model.metabolites])) + number_compartments = len( + set([metabolite.compartment for metabolite in model.metabolites]) + ) # Extract gapfilling information - gapfillings_str = model.notes.get('kbase_gapfillings', '[]') + gapfillings_str = model.notes.get("kbase_gapfillings", "[]") pattern = r"\{.*?\}" gapfilling_matches = re.findall(pattern, gapfillings_str) - gapfillings = [eval(gapfilling.replace('false', 'False').replace('true', 'True').replace('null', 'None')) for gapfilling in gapfilling_matches] + gapfillings = [ + eval( + gapfilling.replace("false", "False") + .replace("true", "True") + .replace("null", "None") + ) + for gapfilling in gapfilling_matches + ] core_gapfilling_media = [] gapfilling_media = [] for gapfilling in gapfillings: - media_name = gapfilling.get('id', '').replace('ATP-', '') - target = gapfilling.get('target', '') + media_name = gapfilling.get("id", "").replace("ATP-", "") + target = gapfilling.get("target", "") if target == "rxn00062_c0": core_gapfilling_media.append(media_name) - elif target.startswith('bio'): + elif target.startswith("bio"): gapfilling_media.append(media_name) # Count the number of gapfills number_gapfills = gapfillings_str.count('"media_ref"') # Convert the lists to strings - core_gapfilling_str = "; ".join(core_gapfilling_media) if core_gapfilling_media else "No core gapfilling data found!" - gapfilling_media_str = "; ".join(gapfilling_media) if gapfilling_media else "No genome-scale gapfilling data found!" + core_gapfilling_str = ( + "; ".join(core_gapfilling_media) + if core_gapfilling_media + else "No core gapfilling data found!" + ) + gapfilling_media_str = ( + "; ".join(gapfilling_media) + if gapfilling_media + else "No genome-scale gapfilling data found!" + ) overview = { - 'Model ID': model.id, - 'Full Gapfilling and ATP Analysis Report': 'TBD', # You may replace 'TBD' with actual data when available - 'Genome Scale Template': model.notes.get('kbase_template_refs', 'Data Not Available'), - 'Core Gapfilling Media': core_gapfilling_str, - 'Gapfilling Media': gapfilling_media_str, - 'Source Genome': model.notes.get('kbase_genome_ref', 'Data Not Available'), - 'Total Number of reactions': len(model.reactions), - 'Number compounds': len(model.metabolites), - 'Number compartments': number_compartments, - 'Number biomass': len([rxn for rxn in model.reactions if rxn.annotation.get('sbo') == 'SBO:0000629']), - 'Number gapfills': number_gapfills + "Model ID": model.id, + "Full Gapfilling and ATP Analysis Report": "TBD", # You may replace 'TBD' with actual data when available + "Genome Scale Template": model.notes.get( + "kbase_template_refs", "Data Not Available" + ), + "Core Gapfilling Media": core_gapfilling_str, + "Gapfilling Media": gapfilling_media_str, + "Source Genome": model.notes.get("kbase_genome_ref", "Data Not Available"), + "Total Number of reactions": len(model.reactions), + "Number compounds": len(model.metabolites), + "Number compartments": number_compartments, + "Number biomass": len( + [ + rxn + for rxn in model.reactions + if rxn.annotation.get("sbo") == "SBO:0000629" + ] + ), + "Number gapfills": number_gapfills, } return overview @@ -80,7 +104,9 @@ def extract_gapfilling_data(self, gf_sensitivity, model): for media, media_data in gf_sensitivity.items(): for target, target_data in media_data.items(): - for reaction_id, reaction_data in target_data.get('success', {}).items(): + for reaction_id, reaction_data in target_data.get( + "success", {} + ).items(): for direction, metabolites in reaction_data.items(): # If metabolites is None, set to empty string if metabolites is None: @@ -92,18 +118,28 @@ def extract_gapfilling_data(self, gf_sensitivity, model): if isinstance(metabolites, (list, tuple)): for met_id in metabolites: sensitivity_ids.append(met_id) - met_name = model.metabolites.get_by_id(met_id).name if met_id in model.metabolites else met_id + met_name = ( + model.metabolites.get_by_id(met_id).name + if met_id in model.metabolites + else met_id + ) sensitivity_names.append(met_name) else: - metabolites = str(metabolites) + metabolites = str(metabolites) entry = { "reaction_id": reaction_id, - "reaction_name": model.reactions.get_by_id(reaction_id).name if reaction_id in model.reactions else reaction_id, + "reaction_name": model.reactions.get_by_id(reaction_id).name + if reaction_id in model.reactions + else reaction_id, "media": media, "direction": direction, "target": target, - "gapfilling_sensitivity_id": "; ".join(sensitivity_ids) if sensitivity_ids else metabolites, - "gapfilling_sensitivity_name": "; ".join(sensitivity_names) if sensitivity_names else metabolites + "gapfilling_sensitivity_id": "; ".join(sensitivity_ids) + if sensitivity_ids + else metabolites, + "gapfilling_sensitivity_name": "; ".join(sensitivity_names) + if sensitivity_names + else metabolites, } # Update the summary dictionary @@ -122,9 +158,9 @@ def extract_gapfilling_data(self, gf_sensitivity, model): else: gapfilling_dict[reaction_id] = entry - return list(gapfilling_dict.values()), gapfilling_summary + return list(gapfilling_dict.values()), gapfilling_summary - #transform data to be used in tabular format to use in build_model_report + # transform data to be used in tabular format to use in build_model_report def transform_gapfilling_data(self, gapfilling_data): transformed_data = [] for entry in gapfilling_data: @@ -135,20 +171,23 @@ def transform_gapfilling_data(self, gapfilling_data): entry["direction"], entry["target"], entry["gapfilling_sensitivity_id"], - entry["gapfilling_sensitivity_name"] + entry["gapfilling_sensitivity_name"], ] transformed_data.append(row) return transformed_data - - + # Extract ATP analysis data def extract_atp_analysis_data(self, atp_analysis, atp_expansion_filter): entries = [] - if atp_analysis and 'core_atp_gapfilling' in atp_analysis: - for media, data in atp_analysis['core_atp_gapfilling'].items(): - score = data.get('score', None) - new_reactions = ["{}: {}".format(k, v) for k, v in data.get('new', {}).items()] - reversed_reactions = ["{}: {}".format(k, v) for k, v in data.get('reversed', {}).items()] + if atp_analysis and "core_atp_gapfilling" in atp_analysis: + for media, data in atp_analysis["core_atp_gapfilling"].items(): + score = data.get("score", None) + new_reactions = [ + "{}: {}".format(k, v) for k, v in data.get("new", {}).items() + ] + reversed_reactions = [ + "{}: {}".format(k, v) for k, v in data.get("reversed", {}).items() + ] # Extracting the "Filtered Reactions" in the required format filtered_reactions = [] @@ -158,27 +197,33 @@ def extract_atp_analysis_data(self, atp_analysis, atp_expansion_filter): if isinstance(sub_v, dict): for reaction, direction_dict in sub_v.items(): direction = list(direction_dict.keys())[0] - filtered_reactions.append(f"{reaction}: {direction}") + filtered_reactions.append( + f"{reaction}: {direction}" + ) filtered_reactions_str = "; ".join(filtered_reactions) if score is not None: - entries.append({ - 'media': media, - 'no_of_gapfilled_reactions': score, - 'gapfilled_reactions': "; ".join(new_reactions), - 'reversed_reaction_by_gapfilling': "; ".join(reversed_reactions), - 'filtered_reactions': filtered_reactions_str - }) + entries.append( + { + "media": media, + "no_of_gapfilled_reactions": score, + "gapfilled_reactions": "; ".join(new_reactions), + "reversed_reaction_by_gapfilling": "; ".join( + reversed_reactions + ), + "filtered_reactions": filtered_reactions_str, + } + ) # Sorting the entries based on the 'no_of_gapfilled_reactions' column - entries.sort(key=lambda x: x['no_of_gapfilled_reactions']) + entries.sort(key=lambda x: x["no_of_gapfilled_reactions"]) return entries # Extract ATP production data for the ATP Analysis tab def extract_atp_production_data(self, atp_analysis): atp_production_dict = {} if atp_analysis: - selected_media = atp_analysis.get('selected_media', {}) - core_atp_gapfilling = atp_analysis.get('core_atp_gapfilling', {}) + selected_media = atp_analysis.get("selected_media", {}) + core_atp_gapfilling = atp_analysis.get("core_atp_gapfilling", {}) # First, process selected_media for media, value in selected_media.items(): @@ -187,30 +232,36 @@ def extract_atp_production_data(self, atp_analysis): # Next, process core_atp_gapfilling for media not in selected_media for media, data in core_atp_gapfilling.items(): if media not in atp_production_dict: - if data.get('failed'): - atp_production_dict[media] = 'failed' + if data.get("failed"): + atp_production_dict[media] = "failed" else: # If the media was not processed in selected_media and it's not failed, set as 'Not Integrated' - atp_production_dict[media] = 'Not Integrated' + atp_production_dict[media] = "Not Integrated" + + return atp_production_dict - return atp_production_dict - def build_multitab_report(self, model_or_mdlutl, output_path): - + # Build overview data overview_data = self.build_overview_data(model_or_mdlutl) - + # Get gf_sensitivity attribute from the model - gf_sensitivity = model_or_mdlutl.attributes.get('gf_sensitivity', None) + gf_sensitivity = model_or_mdlutl.attributes.get("gf_sensitivity", None) # Extract gapfilling data - gapfilling_entries, gapfilling_reaction_summary = self.extract_gapfilling_data(gf_sensitivity, model_or_mdlutl) + gapfilling_entries, gapfilling_reaction_summary = self.extract_gapfilling_data( + gf_sensitivity, model_or_mdlutl + ) # Check if ATP_analysis attribute is present in the model - atp_analysis = model_or_mdlutl.attributes.get('ATP_analysis', None) + atp_analysis = model_or_mdlutl.attributes.get("ATP_analysis", None) if atp_analysis: - atp_expansion_filter = model_or_mdlutl.attributes.get('atp_expansion_filter', {}) - atp_analysis_entries = self.extract_atp_analysis_data(atp_analysis, atp_expansion_filter) + atp_expansion_filter = model_or_mdlutl.attributes.get( + "atp_expansion_filter", {} + ) + atp_analysis_entries = self.extract_atp_analysis_data( + atp_analysis, atp_expansion_filter + ) else: atp_analysis_entries = [] @@ -222,7 +273,7 @@ def build_multitab_report(self, model_or_mdlutl, output_path): "genes": [], "biomass": [], "gapfilling": gapfilling_entries, # Populated with gapfilling data - "atpanalysis": atp_analysis_entries # Populated with ATP analysis data + "atpanalysis": atp_analysis_entries, # Populated with ATP analysis data } print("Module Path:", module_path + "/../data/") @@ -230,7 +281,11 @@ def build_multitab_report(self, model_or_mdlutl, output_path): exchanges = {r.id for r in model_or_mdlutl.exchanges} # Identify biomass reactions using SBO annotation - biomass_reactions_ids = {rxn.id for rxn in model_or_mdlutl.reactions if rxn.annotation.get('sbo') == 'SBO:0000629'} + biomass_reactions_ids = { + rxn.id + for rxn in model_or_mdlutl.reactions + if rxn.annotation.get("sbo") == "SBO:0000629" + } # Reactions Tab for rxn in model_or_mdlutl.reactions: @@ -241,11 +296,12 @@ def build_multitab_report(self, model_or_mdlutl, output_path): "name": rxn.name, "equation": equation, "genes": rxn.gene_reaction_rule, - "gapfilling": "; ".join(gapfilling_reaction_summary.get(rxn.id, [])) # Empty list results in an empty string + "gapfilling": "; ".join( + gapfilling_reaction_summary.get(rxn.id, []) + ), # Empty list results in an empty string } context["reactions"].append(rxn_data) - # Compounds Tab for cpd in model_or_mdlutl.metabolites: cpd_data = { @@ -253,7 +309,7 @@ def build_multitab_report(self, model_or_mdlutl, output_path): "name": cpd.name, "formula": cpd.formula, "charge": cpd.charge, - "compartment": cpd.compartment + "compartment": cpd.compartment, } context["compounds"].append(cpd_data) @@ -261,7 +317,7 @@ def build_multitab_report(self, model_or_mdlutl, output_path): for gene in model_or_mdlutl.genes: gene_data = { "gene": gene.id, - "reactions": "; ".join([rxn.id for rxn in gene.reactions]) + "reactions": "; ".join([rxn.id for rxn in gene.reactions]), } context["genes"].append(gene_data) @@ -271,22 +327,22 @@ def build_multitab_report(self, model_or_mdlutl, output_path): biomass_rxn = model_or_mdlutl.reactions.get_by_id(biomass_rxn_id) for metabolite, coefficient in biomass_rxn.metabolites.items(): compound_id = metabolite.id - compound_name = metabolite.name.split('_')[0] - compartment = compound_id.split('_')[-1] + compound_name = metabolite.name.split("_")[0] + compartment = compound_id.split("_")[-1] biomass_data = { "biomass_reaction_id": biomass_rxn.id, "biomass_compound_id": compound_id, "name": compound_name, "coefficient": coefficient, - "compartment": compartment + "compartment": compartment, } context["biomass"].append(biomass_data) else: print("No biomass reactions found in the model.") # Gapfilling Tab - gf_sensitivity = model_or_mdlutl.attributes.get('gf_sensitivity', None) + gf_sensitivity = model_or_mdlutl.attributes.get("gf_sensitivity", None) gapfilling_data = self.extract_gapfilling_data(gf_sensitivity, model_or_mdlutl) context["gapfilling"] = gapfilling_entries @@ -295,8 +351,8 @@ def build_multitab_report(self, model_or_mdlutl, output_path): # Populate the 'atpanalysis' context with ATP production data for entry in context["atpanalysis"]: - media = entry['media'] - entry['atp_production'] = atp_production_data.get(media, None) + media = entry["media"] + entry["atp_production"] = atp_production_data.get(media, None) # Diagnostics unique_biomass_rxns = biomass_reactions_ids @@ -322,7 +378,7 @@ def build_multitab_report(self, model_or_mdlutl, output_path): print("\nFirst 2 gapfilling entries:") for gf in context["gapfilling"][:2]: print(gf) - + print("\nFirst 2 ATP Analysis entries:") for entry in context["atpanalysis"][:2]: print(entry) @@ -330,15 +386,14 @@ def build_multitab_report(self, model_or_mdlutl, output_path): # Render with template env = jinja2.Environment( loader=jinja2.FileSystemLoader(module_path + "/../data/"), - autoescape=jinja2.select_autoescape(['html', 'xml']) + autoescape=jinja2.select_autoescape(["html", "xml"]), ) html = env.get_template("ModelReportTemplate.html").render(context) directory = dirname(output_path) os.makedirs(directory, exist_ok=True) - with open(output_path, 'w') as f: + with open(output_path, "w") as f: f.write(html) - - + def build_report(self, model, output_path): """Builds model HTML report for the Model Summary table Parameters @@ -354,40 +409,95 @@ def build_report(self, model, output_path): # 2. Transform the dictionary into a list of tuples model_summary_list = [(key, value) for key, value in model_summary_data.items()] # 3. Convert to DataFrame - model_summary_df = pd.DataFrame(model_summary_list, columns=['', '']) + model_summary_df = pd.DataFrame(model_summary_list, columns=["", ""]) # Style the DataFrame (as was done previously) - model_summary_df_styled = ( - model_summary_df.style.hide(axis="index") - .set_table_styles([ - {'selector': 'th', 'props': [('border', 'none'), ('background-color', 'white'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, - {'selector': 'td', 'props': [('border', 'none'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, - {'selector': 'tr:nth-child(even)', 'props': [('background-color', 'white')]}, - {'selector': 'tr:nth-child(odd)', 'props': [('background-color', '#f2f2f2')]}, - ]) + model_summary_df_styled = model_summary_df.style.hide( + axis="index" + ).set_table_styles( + [ + { + "selector": "th", + "props": [ + ("border", "none"), + ("background-color", "white"), + ("font-family", "Oxygen"), + ("font-size", "14px"), + ("line-height", "20px"), + ], + }, + { + "selector": "td", + "props": [ + ("border", "none"), + ("font-family", "Oxygen"), + ("font-size", "14px"), + ("line-height", "20px"), + ], + }, + { + "selector": "tr:nth-child(even)", + "props": [("background-color", "white")], + }, + { + "selector": "tr:nth-child(odd)", + "props": [("background-color", "#f2f2f2")], + }, + ] ) # Fetching the gapfilling sensitivity data - gf_sensitivity = model.attributes.get('gf_sensitivity', None) + gf_sensitivity = model.attributes.get("gf_sensitivity", None) gapfilling_data = self.extract_gapfilling_data(gf_sensitivity, model) gapfilling_list = self.transform_gapfilling_data(gapfilling_data[0]) # Convert the gapfilling_list to a DataFrame gapfillings_analysis_df = pd.DataFrame( - gapfilling_list, + gapfilling_list, columns=[ - "Reaction ID", "Reaction Name", "Media", "Direction", "Target", "Gapfilling Sensitivity ID", "Gapfilling Sensitivity Name"] + "Reaction ID", + "Reaction Name", + "Media", + "Direction", + "Target", + "Gapfilling Sensitivity ID", + "Gapfilling Sensitivity Name", + ], ) # Apply style to Gapfillings Analysis DataFrame - gapfillings_analysis_df_styled = ( - gapfillings_analysis_df.style.hide(axis="index") - .set_table_styles([ - {'selector': 'th', 'props': [('border', 'none'), ('background-color', 'white'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, - {'selector': 'td', 'props': [('border', 'none'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, - {'selector': 'tr:nth-child(even)', 'props': [('background-color', 'white')]}, - {'selector': 'tr:nth-child(odd)', 'props': [('background-color', '#f2f2f2')]}, - ]) + gapfillings_analysis_df_styled = gapfillings_analysis_df.style.hide( + axis="index" + ).set_table_styles( + [ + { + "selector": "th", + "props": [ + ("border", "none"), + ("background-color", "white"), + ("font-family", "Oxygen"), + ("font-size", "14px"), + ("line-height", "20px"), + ], + }, + { + "selector": "td", + "props": [ + ("border", "none"), + ("font-family", "Oxygen"), + ("font-size", "14px"), + ("line-height", "20px"), + ], + }, + { + "selector": "tr:nth-child(even)", + "props": [("background-color", "white")], + }, + { + "selector": "tr:nth-child(odd)", + "props": [("background-color", "#f2f2f2")], + }, + ] ) # Legend for Gapfillings Analysis @@ -409,22 +519,48 @@ def build_report(self, model, output_path): """ # Extract ATP analysis data - atp_analysis = model.attributes.get('ATP_analysis', None) - atp_expansion_filter = model.attributes.get('atp_expansion_filter', {}) - atp_analysis_entries = self.extract_atp_analysis_data(atp_analysis, atp_expansion_filter) + atp_analysis = model.attributes.get("ATP_analysis", None) + atp_expansion_filter = model.attributes.get("atp_expansion_filter", {}) + atp_analysis_entries = self.extract_atp_analysis_data( + atp_analysis, atp_expansion_filter + ) # Convert the atp_analysis_entries list to a DataFrame atp_analysis_df = pd.DataFrame(atp_analysis_entries) # Apply style to ATP Analysis DataFrame - atp_analysis_df_styled = ( - atp_analysis_df.style.hide(axis="index") - .set_table_styles([ - {'selector': 'th', 'props': [('border', 'none'), ('background-color', 'white'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, - {'selector': 'td', 'props': [('border', 'none'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, - {'selector': 'tr:nth-child(even)', 'props': [('background-color', 'white')]}, - {'selector': 'tr:nth-child(odd)', 'props': [('background-color', '#f2f2f2')]}, - ]) + atp_analysis_df_styled = atp_analysis_df.style.hide( + axis="index" + ).set_table_styles( + [ + { + "selector": "th", + "props": [ + ("border", "none"), + ("background-color", "white"), + ("font-family", "Oxygen"), + ("font-size", "14px"), + ("line-height", "20px"), + ], + }, + { + "selector": "td", + "props": [ + ("border", "none"), + ("font-family", "Oxygen"), + ("font-size", "14px"), + ("line-height", "20px"), + ], + }, + { + "selector": "tr:nth-child(even)", + "props": [("background-color", "white")], + }, + { + "selector": "tr:nth-child(odd)", + "props": [("background-color", "#f2f2f2")], + }, + ] ) # Legend for ATP Analysis @@ -437,9 +573,9 @@ def build_report(self, model, output_path):
  • Reversed Reaction by Gapfilling: Reactions that have been reversed during the gapfilling process.
  • Filtered Reactions: Reactions that have been filtered out during the analysis. When a reaction addition would lead to a large increase in ATP production or an infinite energy loop, we filter that reaction out of the gapfilling database and prevent it from being added to the model.
  • - """ - - #ATP analysis explanation text + """ + + # ATP analysis explanation text explanation_text_atp_analysis = """

    During model reconstruction, we analyze the genome’s core metabolism draft model (model without gapfilling) to assess energy biosynthesis capabilities. The goal of this analysis is to ensure the core metabolism model is able to produce ATP before we expand the model to the genome-scale. @@ -453,29 +589,33 @@ def build_report(self, model, output_path): In cases where is known from the literature or unpublished experimental results that an organism is capable of producing ATP in a given media condition that requires gapfilling in this analysis, you can use the parameter “Force ATP media” in the reconstruction app to ensure those reactions are integrated into the model. .

    """ - + # Save the data to HTML with the styled DataFrames and the legends directory = os.path.dirname(output_path) os.makedirs(directory, exist_ok=True) - with open(output_path, 'w', encoding='utf-8') as f: - f.write('

    Model Summary

    ') + with open(output_path, "w", encoding="utf-8") as f: + f.write("

    Model Summary

    ") f.write(model_summary_df_styled.render(escape=False)) - f.write('

    ') - f.write('

    Gapfillings Analysis

    ') + f.write("

    ") + f.write("

    Gapfillings Analysis

    ") # Check for Gapfillings Analysis data if not gapfillings_analysis_df.empty: f.write(gapfillings_analysis_df_styled.render(escape=False)) - f.write(f'

    Legend:

    {annotations_text_gapfillings}') + f.write(f"

    Legend:

    {annotations_text_gapfillings}") else: - f.write('

    Warning: No Gapfillings Analysis data available for this model.

    ') + f.write( + "

    Warning: No Gapfillings Analysis data available for this model.

    " + ) - f.write('

    Core ATP Analysis

    ') + f.write("

    Core ATP Analysis

    ") # Check for ATP Analysis data if not atp_analysis_df.empty: f.write(atp_analysis_df_styled.render(escape=False)) - f.write(f'

    Legend:

    {annotations_text_atp_analysis}') + f.write(f"

    Legend:

    {annotations_text_atp_analysis}") f.write(explanation_text_atp_analysis) else: - f.write('

    Warning: No Core ATP Analysis data available for this model.

    ') \ No newline at end of file + f.write( + "

    Warning: No Core ATP Analysis data available for this model.

    " + ) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 69d70616..610724dd 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -299,9 +299,7 @@ def save_attributes(self, value=None, key=None): else: self.attributes = value if hasattr(self.model, "computed_attributes"): - logger.info( - "Setting FBAModel computed_attributes to mdlutl attributes" - ) + logger.info("Setting FBAModel computed_attributes to mdlutl attributes") self.attributes["gene_count"] = len(self.model.genes) self.model.computed_attributes = self.attributes @@ -902,7 +900,11 @@ def binary_expansion_test(self, reaction_list, condition, currmodel, depth=0): return filtered_list def reaction_expansion_test( - self, reaction_list, condition_list, binary_search=True,attribute_label="gf_filter" + self, + reaction_list, + condition_list, + binary_search=True, + attribute_label="gf_filter", ): """Adds reactions in reaction list one by one and appplies tests, filtering reactions that fail diff --git a/modelseedpy/fbapkg/elementuptakepkg.py b/modelseedpy/fbapkg/elementuptakepkg.py index 8348e602..1f61f7a8 100644 --- a/modelseedpy/fbapkg/elementuptakepkg.py +++ b/modelseedpy/fbapkg/elementuptakepkg.py @@ -16,31 +16,33 @@ def __init__(self, model): {"elements": "string"}, ) - def build_package(self, element_limits,exception_compounds=[],exception_reactions=[]): - #Converting exception compounds list into exception reaction list + def build_package( + self, element_limits, exception_compounds=[], exception_reactions=[] + ): + # Converting exception compounds list into exception reaction list self.parameters = { - "element_limits" : element_limits, - "exception_compounds" : exception_compounds, - "exception_reactions" : exception_reactions + "element_limits": element_limits, + "exception_compounds": exception_compounds, + "exception_reactions": exception_reactions, } exchange_hash = self.modelutl.exchange_hash() for met in exception_compounds: if met in exchange_hash: exception_reactions.append(exchange_hash[met]) - #Now building or rebuilding constraints + # Now building or rebuilding constraints for element in element_limits: if element not in self.variables["elements"]: self.build_variable(element, element_limits[element]) for element in element_limits: - #This call will first remove existing constraints then build the new constraint - self.build_constraint(element,exception_reactions) + # This call will first remove existing constraints then build the new constraint + self.build_constraint(element, exception_reactions) def build_variable(self, element, limit): return BaseFBAPkg.build_variable( self, "elements", 0, limit, "continuous", element ) - def build_constraint(self, element,exception_reactions): + def build_constraint(self, element, exception_reactions): coef = {self.variables["elements"][element]: -1} rxnlist = self.modelutl.exchange_list() for reaction in rxnlist: diff --git a/modelseedpy/fbapkg/kbasemediapkg.py b/modelseedpy/fbapkg/kbasemediapkg.py index b377547e..9dc9b315 100644 --- a/modelseedpy/fbapkg/kbasemediapkg.py +++ b/modelseedpy/fbapkg/kbasemediapkg.py @@ -40,7 +40,9 @@ def build_package( self.parameters["default_uptake"] = 0 if self.parameters["default_excretion"] is None: self.parameters["default_excretion"] = 100 - if (self.parameters["media"] and self.parameters["media"].name == "Complete") and self.parameters["default_uptake"] == 0: + if ( + self.parameters["media"] and self.parameters["media"].name == "Complete" + ) and self.parameters["default_uptake"] == 0: self.parameters["default_uptake"] = 100 # First initializing all exchanges to default uptake and excretion From 722d4dda489d134be096c3b497d27cd97891dfcc Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Thu, 14 Sep 2023 14:14:27 -0500 Subject: [PATCH 176/298] precommit --- modelseedpy/core/msmodelreport.py | 24 +++++++++++------------ modelseedpy/data/ModelReportTemplate.html | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index ca83533f..6faa728b 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -507,13 +507,13 @@ def build_report(self, model, output_path):
  • Reaction Name: The name of the reaction.
  • Media: The media used by gap filling.
  • Direction: The direction of the reaction. Can be ">" for forward, "<" for reverse, or "=" for both directions.
  • -
  • Target: The reaction selected as the objective function target for the gapfilling optimization problem. Targets here can be the model’s biomass reaction, commonly named “bio1” for models created by this app. - Alternatively, “rxn00062” (ATP Production) reaction is shown for cases where gapfilling was applied to guarantee ATP production in a given media. +
  • Target: The reaction selected as the objective function target for the gapfilling optimization problem. Targets here can be the model’s biomass reaction, commonly named “bio1” for models created by this app. + Alternatively, “rxn00062” (ATP Production) reaction is shown for cases where gapfilling was applied to guarantee ATP production in a given media. When reactions are gapfilled for ATP production, we recommend checking the full Core ATP Analysis in the table below.
  • -
  • Gapfilling Sensitivity ID and Name: Gapfilling is necessary when compounds in the biomass objective function can not be produced by the model. +
  • Gapfilling Sensitivity ID and Name: Gapfilling is necessary when compounds in the biomass objective function can not be produced by the model. For each reaction we list the biomass compound(s) that can not be synthesized by the model without gapfilling. In cases where gap filling fails there are two possible scenarios: - 1) FBF (failed before filtering) : the gapfilling immediately failed, even before we filtered out the ATP breaking reactions. This means this objective CANNOT be satisfied with the entire current database. + 1) FBF (failed before filtering) : the gapfilling immediately failed, even before we filtered out the ATP breaking reactions. This means this objective CANNOT be satisfied with the entire current database. 2) FAF (failed after filtering): the gapfilling succeeded before filtering, but failed after filtering out reactions that break ATP. This tells you definitively if the ATP filtering caused the gapfilling to fail
  • """ @@ -577,15 +577,15 @@ def build_report(self, model, output_path): # ATP analysis explanation text explanation_text_atp_analysis = """ -

    During model reconstruction, we analyze the genome’s core metabolism draft model (model without gapfilling) to assess energy biosynthesis capabilities. - The goal of this analysis is to ensure the core metabolism model is able to produce ATP before we expand the model to the genome-scale. - This step is designed to prevent gapfilling from introducing reactions that create energy-generating loops. +

    During model reconstruction, we analyze the genome’s core metabolism draft model (model without gapfilling) to assess energy biosynthesis capabilities. + The goal of this analysis is to ensure the core metabolism model is able to produce ATP before we expand the model to the genome-scale. + This step is designed to prevent gapfilling from introducing reactions that create energy-generating loops. The tests are conducted on a large collection of minimal conditions, with the goal of simulating the model’s capability to produce energy with different electron donor, electron acceptor, and carbon source combinations.

    -

    When the draft model of the core metabolism is capable of producing ATP in at least one of the test media, no gapfilling reactions part of this analysis will be added to the model. While we still report the gapfilling requirements for the test media formulations that fail to produce ATP with that draft core model, we only integrate these solutions in the model when no test media succeeds in producing ATP. - In this case, the integrated gap-filling solution(s) will be displayed in the “Gapfilling Analysis” table above, with the “Target” “rxn00062” (ATP Production) objective function.

    -

    The goal is to display the test results for all media to provide clues for the metabolic capabilities of the genome(s). When many reactions are required for growth on the SO4 testing media conditions, this could be a good indicator that the organism is not capable of performing sulfate reduction. - On the other hand, when only one gapfill reaction is required for ATP production in a given media, multiple scenarios can be considered. - 1) Organism(s) can’t grow on test condition, and we correctly did not add the reaction to the model. 2) Possible issue with the source genome annotation missing a specific gene function 3) Possible issue with the model reconstruction database. We hope this data helps make more informed decisions on reactions that may need to be manually curated in the model. +

    When the draft model of the core metabolism is capable of producing ATP in at least one of the test media, no gapfilling reactions part of this analysis will be added to the model. While we still report the gapfilling requirements for the test media formulations that fail to produce ATP with that draft core model, we only integrate these solutions in the model when no test media succeeds in producing ATP. + In this case, the integrated gap-filling solution(s) will be displayed in the “Gapfilling Analysis” table above, with the “Target” “rxn00062” (ATP Production) objective function.

    +

    The goal is to display the test results for all media to provide clues for the metabolic capabilities of the genome(s). When many reactions are required for growth on the SO4 testing media conditions, this could be a good indicator that the organism is not capable of performing sulfate reduction. + On the other hand, when only one gapfill reaction is required for ATP production in a given media, multiple scenarios can be considered. + 1) Organism(s) can’t grow on test condition, and we correctly did not add the reaction to the model. 2) Possible issue with the source genome annotation missing a specific gene function 3) Possible issue with the model reconstruction database. We hope this data helps make more informed decisions on reactions that may need to be manually curated in the model. In cases where is known from the literature or unpublished experimental results that an organism is capable of producing ATP in a given media condition that requires gapfilling in this analysis, you can use the parameter “Force ATP media” in the reconstruction app to ensure those reactions are integrated into the model. .

    """ diff --git a/modelseedpy/data/ModelReportTemplate.html b/modelseedpy/data/ModelReportTemplate.html index c382c8fc..cab60a0b 100644 --- a/modelseedpy/data/ModelReportTemplate.html +++ b/modelseedpy/data/ModelReportTemplate.html @@ -346,4 +346,4 @@
    - \ No newline at end of file + From 6151d17dbdb0124502649cb2f1f05deca6d34f6d Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Thu, 14 Sep 2023 14:50:36 -0500 Subject: [PATCH 177/298] ignore examples --- .github/workflows/pre-commit.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 87de0099..6b54b4a0 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -3,6 +3,8 @@ name: Run Pre-Commit on: pull_request: {} push: + paths-ignore: + - 'examples/**' branches: - dev - main From 06e05f3d470e8a64707c1f36772134285561aab4 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Thu, 14 Sep 2023 15:16:58 -0500 Subject: [PATCH 178/298] no examples --- .pre-commit-config.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 04cde634..325706ab 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,7 +21,9 @@ repos: args: - --pytest-test-first - id: check-json + exclude: examples/ - id: pretty-format-json + exclude: examples/ args: - --autofix - --top-keys=_id From 9bcc3b425858a103e2f72ce38b3935771a0ecd80 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Fri, 15 Sep 2023 16:28:52 -0500 Subject: [PATCH 179/298] version bump and atpcorrection media id check --- .../Model Reconstruction/ATPGapfilling.ipynb | 362 ++++++++++++++++-- modelseedpy/__init__.py | 2 +- modelseedpy/core/msatpcorrection.py | 10 +- setup.py | 2 +- tests/core/test_msatpcorreption.py | 33 +- 5 files changed, 365 insertions(+), 44 deletions(-) diff --git a/examples/Model Reconstruction/ATPGapfilling.ipynb b/examples/Model Reconstruction/ATPGapfilling.ipynb index f0116989..d236d609 100644 --- a/examples/Model Reconstruction/ATPGapfilling.ipynb +++ b/examples/Model Reconstruction/ATPGapfilling.ipynb @@ -526,7 +526,13 @@ "cell_type": "code", "execution_count": 60, "id": "6ade9096-f3f4-40f8-a1ea-53b5b63ec2c0", - "metadata": {}, + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, "outputs": [ { "name": "stderr", @@ -1174,123 +1180,417 @@ }, { "cell_type": "code", - "execution_count": 67, - "id": "7aba6de8-9252-4980-95b0-bd1a72db2e05", + "execution_count": 1, + "id": "e24d8e82-357a-4658-9362-6073f502b6bc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "modelseedpy 0.2.2\n" + ] + } + ], + "source": [ + "import modelseedpy" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1080bc7b-58c2-4105-91a2-2defaa8a1c92", "metadata": {}, "outputs": [], "source": [ - "atp_correction.apply_growth_media_gapfilling()" + "%run /home/fliu/workspace/python3/ModelSEEDpy/tests/core/test_msatpcorreption.py" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "3ee9a1dd-9b8c-4204-b846-609cecebffc7", + "metadata": {}, + "outputs": [], + "source": [ + "def get_model(ko):\n", + " def _method(ko=ko, added_compounds=None, added_reactions=None):\n", + " if ko is None:\n", + " ko = []\n", + " with open(\n", + " '/home/fliu/workspace/python3/ModelSEEDpy/tests/test_data/e_coli_core.json',\n", + " \"r\",\n", + " ) as fh:\n", + " model_json = json.load(fh)\n", + " model_json[\"compartments\"] = {\n", + " k + \"0\": v for (k, v) in model_json[\"compartments\"].items()\n", + " }\n", + " metabolites = {}\n", + " for m in model_json[\"metabolites\"]:\n", + " m[\"id\"] += \"0\"\n", + " m[\"compartment\"] += \"0\"\n", + " metabolites[m[\"id\"]] = m\n", + " for r in model_json[\"reactions\"]:\n", + " r[\"metabolites\"] = {i + \"0\": v for (i, v) in r[\"metabolites\"].items()}\n", + " compartments = set(\n", + " [metabolites[k][\"compartment\"] for k in r[\"metabolites\"].keys()]\n", + " )\n", + " if r[\"id\"].endswith(\"_e\"):\n", + " r[\"id\"] += \"0\"\n", + " elif len(compartments) == 1:\n", + " r[\"id\"] += \"_\" + list(compartments)[0]\n", + " else:\n", + " r[\"id\"] += (\n", + " \"_\" + \"c0\"\n", + " ) # hack cause there is only combo between e0 and c0\n", + "\n", + " model_json[\"reactions\"] = [\n", + " x for x in model_json[\"reactions\"] if x[\"id\"] not in ko\n", + " ]\n", + "\n", + " if added_compounds:\n", + " for o in added_compounds:\n", + " model_json[\"metabolites\"].append(o)\n", + " if added_reactions:\n", + " for o in added_reactions:\n", + " model_json[\"reactions\"].append(o)\n", + " model = cobra.io.from_json(json.dumps(model_json))\n", + " model.reactions.ATPM_c0.lower_bound = 0\n", + " model.reactions.ATPM_c0.upper_bound = 1000\n", + " return model\n", + "\n", + " return _method(ko)" ] }, { "cell_type": "code", - "execution_count": 18, - "id": "e8107ba2-f470-4e05-8b80-731fc00febe7", + "execution_count": 45, + "id": "928bb140-9110-4a1a-b750-dbd9d6a2acc6", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "logger = logging.getLogger(__name__)" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "id": "95db6e6f-bedc-4c0d-9e73-c6eec5365c16", + "metadata": {}, + "outputs": [], + "source": [ + "model = get_model([\"NADH16_c0\", \"CYTBD_c0\", \"O2t_c0\", \"GLCpts_c0\"])\n", + "with open('/home/fliu/workspace/python3/ModelSEEDpy/tests/test_data/template_core_bigg.json', 'r') as fh:\n", + " template = MSTemplateBuilder.from_dict(json.load(fh)).build()\n", + "media_glucose_aerobic = MSMedia.from_dict(\n", + " {\n", + " \"glc__D\": (-1, 1000),\n", + " \"o2\": (-1000, 1000),\n", + " \"h\": (-1000, 1000),\n", + " \"h2o\": (-1000, 1000),\n", + " }\n", + " )\n", + "media_glucose_aerobic.id = 'glc/o2'\n", + "media_acetate_aerobic = MSMedia.from_dict(\n", + " {\n", + " \"ac\": (-1, 1000),\n", + " \"o2\": (-1000, 1000),\n", + " \"h\": (-1000, 1000),\n", + " \"h2o\": (-1000, 1000),\n", + " }\n", + " )\n", + "media_acetate_aerobic.id = 'ac/o2'\n", + "medias = [media_glucose_aerobic, media_acetate_aerobic]" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "id": "8fdc8faf-fcc8-45cd-b775-e6bc143a42cc", + "metadata": {}, + "outputs": [], + "source": [ + "%run /home/fliu/workspace/python3/ModelSEEDpy/modelseedpy/core/msatpcorrection.py\n", + "atp_correction = MSATPCorrection(\n", + " model,\n", + " template,\n", + " medias,\n", + " atp_hydrolysis_id=\"ATPM_c0\",\n", + " load_default_medias=False,\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "fc07b43d-88f5-477c-9149-28756a5cd926", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "0" + "[[, 0.01],\n", + " [, 0.01]]" ] }, - "execution_count": 18, + "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "atp_correction.max_gapfilling" + "atp_correction.atp_medias" ] }, { "cell_type": "code", - "execution_count": 19, - "id": "1af1e574-76b2-40f7-82f8-4ffd1bb2c442", + "execution_count": 99, + "id": "369ef2d4-f696-4762-9370-d91276e3b95f", "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    Namee_coli_core
    Memory address7ff258653370
    Number of metabolites72
    Number of reactions91
    Number of genes137
    Number of groups0
    Objective expression1.0*BIOMASS_Ecoli_core_w_GAM_c0 - 1.0*BIOMASS_Ecoli_core_w_GAM_c0_reverse_70c47
    Compartmentsextracellular space, cytosol
    " + ], "text/plain": [ - "0" + "" ] }, - "execution_count": 19, + "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "atp_correction.gapfilling_delta" + "model" ] }, { "cell_type": "code", - "execution_count": 43, - "id": "0a344084-edad-456f-9e88-064a404039d4", + "execution_count": 100, + "id": "62862b90-d73b-4597-8e3f-c8bf55e9090e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[]" + "{'glc/o2': 0.0, 'ac/o2': 0.0}" ] }, - "execution_count": 43, + "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "atp_correction.gapfilling_tests" + "atp_correction.evaluate_growth_media()" ] }, { "cell_type": "code", - "execution_count": 44, - "id": "9e78779d-b7e7-4e73-a77c-9813bee3c6a9", + "execution_count": 101, + "id": "e67db875-e06f-464c-b96c-8e4ce7eb6324", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[]" + "{: {'reversed': {},\n", + " 'new': {'GLCpts_c0': '>'},\n", + " 'media': ,\n", + " 'target': 'ATPM_c0',\n", + " 'minobjective': 0.01,\n", + " 'binary_check': False},\n", + " : {'reversed': {},\n", + " 'new': {'CYTBD_c0': '>', 'NADH16_c0': '>', 'O2t_c0': '>'},\n", + " 'media': ,\n", + " 'target': 'ATPM_c0',\n", + " 'minobjective': 0.01,\n", + " 'binary_check': False}}" ] }, - "execution_count": 44, + "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "atp_correction.gapfilling_tests" + "atp_correction.media_gapfill_stats" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "id": "47da598f-b3cd-423d-93eb-0e68f11eaef9", + "metadata": {}, + "outputs": [], + "source": [ + "atp_correction.determine_growth_media()" ] }, { "cell_type": "code", - "execution_count": 68, - "id": "669e1ddb-493b-461e-bef9-d19cb1f5e542", + "execution_count": 105, + "id": "42673388-2500-4922-83b9-3e4dfa7acb17", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[]" + "'glc/o2'" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "atp_correction.selected_media[0].id" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "id": "c0e29cc8-85d5-450e-a3d6-c1207d297963", + "metadata": {}, + "outputs": [], + "source": [ + "atp_correction.apply_growth_media_gapfilling()" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "id": "43f29d4f-30b3-452f-a5f9-49489b97d646", + "metadata": {}, + "outputs": [], + "source": [ + "media_eval = atp_correction.evaluate_growth_media()" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "id": "f8044fd4-70f1-4082-9316-e601ac06ac7e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'glc/o2': 2.75, 'ac/o2': 0.0}" ] }, - "execution_count": 68, + "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "atp_correction.gapfilling_tests" + "media_eval" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "id": "db1e8df2-4a86-408b-a479-5eebf13e9971", + "metadata": {}, + "outputs": [], + "source": [ + "atp_correction.expand_model_to_genome_scale()" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "id": "d76dcb54-1ea2-4e53-8853-521790cd8300", + "metadata": {}, + "outputs": [], + "source": [ + "tests = atp_correction.build_tests()" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "id": "f30e70fa-5258-42fd-b624-aafdce509b80", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "empty {'media': , 'is_max_threshold': True, 'threshold': 1e-05, 'objective': 'ATPM_c0'}\n", + "glc/o2 {'media': , 'is_max_threshold': True, 'threshold': 3.3, 'objective': 'ATPM_c0'}\n" + ] + } + ], + "source": [ + "for t in tests:\n", + " print(t['media'].id, t)" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "id": "c35d3047-da1f-4331-a907-765c2b43048d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'media': ,\n", + " 'is_max_threshold': True,\n", + " 'threshold': 1e-05,\n", + " 'objective': 'ATPM_c0'},\n", + " {'media': ,\n", + " 'is_max_threshold': True,\n", + " 'threshold': 3.3,\n", + " 'objective': 'ATPM_c0'}]" + ] + }, + "execution_count": 114, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tests" ] }, { "cell_type": "code", "execution_count": null, - "id": "e24d8e82-357a-4658-9362-6073f502b6bc", + "id": "7b718e1d-059d-410b-bf1a-05a734f09e0d", "metadata": {}, "outputs": [], "source": [] @@ -1298,7 +1598,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, diff --git a/modelseedpy/__init__.py b/modelseedpy/__init__.py index 75c94ad8..88c0ae64 100644 --- a/modelseedpy/__init__.py +++ b/modelseedpy/__init__.py @@ -14,7 +14,7 @@ __author__ = "Christopher Henry" __email__ = "chenry@anl.gov" -__version__ = "0.2.2" +__version__ = "0.3.3" logger = logging.getLogger(__name__) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index d3321d6a..0007cc96 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -108,10 +108,18 @@ def __init__( self.atp_medias = [] if load_default_medias: self.load_default_medias() + + media_ids = set() for media in atp_medias: if isinstance(media, list): + if media[0].id in media_ids: + raise ValueError('media ids not unique') + media_ids.add(media[0].id) self.atp_medias.append(media) else: + if media.id in media_ids: + raise ValueError('media ids not unique') + media_ids.add(media.id) self.atp_medias.append([media, 0.01]) self.media_hash[media.id] = media if "empty" not in self.media_hash: @@ -290,6 +298,7 @@ def evaluate_growth_media(self): media_list = [] min_objectives = {} for media, minimum_obj in self.atp_medias: + logger.debug("evaluate media %s", media) pkgmgr.getpkg("KBaseMediaPkg").build_package(media) logger.debug("model.medium %s", self.model.medium) @@ -300,7 +309,6 @@ def evaluate_growth_media(self): solution.objective_value, solution.status, ) - self.media_gapfill_stats[media] = None output[media.id] = solution.objective_value diff --git a/setup.py b/setup.py index a7555b97..2fb97221 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ setup( name="ModelSEEDpy", - version="0.3.1", + version="0.3.3", description="Python package for building and analyzing models using ModelSEED", long_description_content_type="text/x-rst", long_description=readme, diff --git a/tests/core/test_msatpcorreption.py b/tests/core/test_msatpcorreption.py index 3d036193..8ee5dceb 100644 --- a/tests/core/test_msatpcorreption.py +++ b/tests/core/test_msatpcorreption.py @@ -108,7 +108,7 @@ def media_acetate_aerobic(): "h2o": (-1000, 1000), } ) - media.id = "glc/o2" + media.id = "ac/o2" return media @@ -205,12 +205,13 @@ def test_infinite_atp_model_growth_boost( def test_ms_atp_correction1(get_model, template, media_all_aerobic): + atp_hydrolysis_id = 'ATPM_c0' model = get_model(["GLCpts_c0", "NADH16_c0", "CYTBD_c0", "O2t_c0"]) atp_correction = MSATPCorrection( model, template, media_all_aerobic, - atp_hydrolysis_id="ATPM_c0", + atp_hydrolysis_id=atp_hydrolysis_id, load_default_medias=False, ) atp_correction.evaluate_growth_media() @@ -234,9 +235,14 @@ def test_ms_atp_correction1(get_model, template, media_all_aerobic): tests = atp_correction.build_tests() assert tests - assert len(tests) == 1 - assert tests[0]["threshold"] > 0 - assert tests[0]["objective"] == "ATPM_c0" + assert len(tests) == 2 # glucose and empty + for t in tests: + if t['media'].id == 'empty': + assert t["threshold"] <= 1e-05 + else: + assert t["threshold"] > 1e-05 + assert t["objective"] == atp_hydrolysis_id + assert t["is_max_threshold"] is True def test_ms_atp_correction_and_gap_fill1( @@ -248,24 +254,31 @@ def test_ms_atp_correction_and_gap_fill1( ): from modelseedpy import MSGapfill + atp_hydrolysis_id = 'ATPM_c0' + model = get_model_with_infinite_atp_loop(["GLCpts_c0", "GLUSy_c0", "GLUDy_c0"]) model.reactions.ATPM_c0.lower_bound = 0 model.reactions.ATPM_c0.upper_bound = 1000 - model.objective = "ATPM_c0" + model.objective = atp_hydrolysis_id atp_correction = MSATPCorrection( model, template, [media_glucose_aerobic], - atp_hydrolysis_id="ATPM_c0", + atp_hydrolysis_id=atp_hydrolysis_id, load_default_medias=False, ) tests = atp_correction.run_atp_correction() # expected tests = [{'media': MSMedia object, 'is_max_threshold': True, 'threshold': 21.0, 'objective': 'ATPM_c0'}] assert tests - assert len(tests) == 1 - assert tests[0]["threshold"] > 0 - assert tests[0]["objective"] == "ATPM_c0" + assert len(tests) == 2 + for t in tests: + if t['media'].id == 'empty': + assert t["threshold"] <= 1e-05 + else: + assert t["threshold"] > 1e-05 + assert t["objective"] == atp_hydrolysis_id + assert t["is_max_threshold"] is True model.objective = "BIOMASS_Ecoli_core_w_GAM_c0" gap_fill = MSGapfill(model, [template_genome_scale], [], tests, {}, []) From a7de5496e575761ffb54414e6d8ba319ce9d5735 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Fri, 15 Sep 2023 16:30:37 -0500 Subject: [PATCH 180/298] black --- modelseedpy/core/msatpcorrection.py | 4 ++-- tests/core/test_msatpcorreption.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 0007cc96..083fc719 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -113,12 +113,12 @@ def __init__( for media in atp_medias: if isinstance(media, list): if media[0].id in media_ids: - raise ValueError('media ids not unique') + raise ValueError("media ids not unique") media_ids.add(media[0].id) self.atp_medias.append(media) else: if media.id in media_ids: - raise ValueError('media ids not unique') + raise ValueError("media ids not unique") media_ids.add(media.id) self.atp_medias.append([media, 0.01]) self.media_hash[media.id] = media diff --git a/tests/core/test_msatpcorreption.py b/tests/core/test_msatpcorreption.py index 8ee5dceb..a60d33ec 100644 --- a/tests/core/test_msatpcorreption.py +++ b/tests/core/test_msatpcorreption.py @@ -205,7 +205,7 @@ def test_infinite_atp_model_growth_boost( def test_ms_atp_correction1(get_model, template, media_all_aerobic): - atp_hydrolysis_id = 'ATPM_c0' + atp_hydrolysis_id = "ATPM_c0" model = get_model(["GLCpts_c0", "NADH16_c0", "CYTBD_c0", "O2t_c0"]) atp_correction = MSATPCorrection( model, @@ -237,7 +237,7 @@ def test_ms_atp_correction1(get_model, template, media_all_aerobic): assert tests assert len(tests) == 2 # glucose and empty for t in tests: - if t['media'].id == 'empty': + if t["media"].id == "empty": assert t["threshold"] <= 1e-05 else: assert t["threshold"] > 1e-05 @@ -254,7 +254,7 @@ def test_ms_atp_correction_and_gap_fill1( ): from modelseedpy import MSGapfill - atp_hydrolysis_id = 'ATPM_c0' + atp_hydrolysis_id = "ATPM_c0" model = get_model_with_infinite_atp_loop(["GLCpts_c0", "GLUSy_c0", "GLUDy_c0"]) model.reactions.ATPM_c0.lower_bound = 0 @@ -273,7 +273,7 @@ def test_ms_atp_correction_and_gap_fill1( assert tests assert len(tests) == 2 for t in tests: - if t['media'].id == 'empty': + if t["media"].id == "empty": assert t["threshold"] <= 1e-05 else: assert t["threshold"] > 1e-05 From 640118c1e2cfa676006f626687414681a3ad23f4 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 21 Sep 2023 10:17:33 -0500 Subject: [PATCH 181/298] Adding function template for gapfilling function from PNNL team --- modelseedpy/core/msgapfill.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 16634707..39de2e3e 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -375,6 +375,27 @@ def integrate_gapfill_solution( self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") self.cumulative_gapfilling.extend(cumulative_solution) + def compute_reaction_weights_from_expression_data( + self, omics_data, conditions=[] + ): + """Computing reaction weights based on input gene-level omics data + Parameters + ---------- + omics_data : pandas dataframe with genes as rows and conditions as columns + Specifies the reactions to be added to the model to implement the gapfilling solution + conditions : list + Optional array containing the IDs of the columns in omics_data from which data should be used. + If an empty array (or no array) is supplied, data from all columns will be used. When multiple columns are + used, the data from those columns should be normalized first, then added together + """ + #Validitions: + #1.) An conditions listed in the conditions argument should match the columns in the omics_data dataframe + #2.) Most (~80%) of the genes in the model should match genes in the omics_data dataframe + #3.) The omics_data dataframe should have at least 2 columns + #4.) The omics_data dataframe should have at least 2 rows + #5.) Logging should be used to report out which genes in the model don't match any genes in the omics_data dataframe + pass + @staticmethod def gapfill( model, From 7debbb4de5e37322a22912e30495ec3795cfc2de Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Fri, 22 Sep 2023 23:48:07 -0500 Subject: [PATCH 182/298] Fixing bug in model reconstruction --- modelseedpy/core/msmodelutl.py | 53 +++++++++++++++++----------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 785c4f9c..19b3497a 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -1046,33 +1046,34 @@ def find_unproducible_biomass_compounds(self, target_rxn="bio1", ko_list=None): output = {} for item in ko_list: logger.debug("KO:" + item[0] + item[1]) - rxnobj = tempmodel.reactions.get_by_id(item[0]) - if item[1] == ">": - original_bound = rxnobj.upper_bound - rxnobj.upper_bound = 0 - if item[0] not in output: - output[item[0]] = {} - output[item[0]][item[1]] = self.run_biomass_dependency_test( - target_rxn_obj, - tempmodel, - original_objective, - min_flex_obj, - rxn_list, - ) - rxnobj.upper_bound = original_bound + if item[0] not in output: + output[item[0]] = {} + if item[0] in tempmodel.reactions: + rxnobj = tempmodel.reactions.get_by_id(item[0]) + if item[1] == ">": + original_bound = rxnobj.upper_bound + rxnobj.upper_bound = 0 + output[item[0]][item[1]] = self.run_biomass_dependency_test( + target_rxn_obj, + tempmodel, + original_objective, + min_flex_obj, + rxn_list, + ) + rxnobj.upper_bound = original_bound + else: + original_bound = rxnobj.lower_bound + rxnobj.lower_bound = 0 + output[item[0]][item[1]] = self.run_biomass_dependency_test( + target_rxn_obj, + tempmodel, + original_objective, + min_flex_obj, + rxn_list, + ) + rxnobj.lower_bound = original_bound else: - original_bound = rxnobj.lower_bound - rxnobj.lower_bound = 0 - if item[0] not in output: - output[item[0]] = {} - output[item[0]][item[1]] = self.run_biomass_dependency_test( - target_rxn_obj, - tempmodel, - original_objective, - min_flex_obj, - rxn_list, - ) - rxnobj.lower_bound = original_bound + output[item[0]][item[1]] = [] return output def run_biomass_dependency_test( From 144946445649f60d457fc494d4d19327f2f64183 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 23 Sep 2023 00:01:09 -0500 Subject: [PATCH 183/298] Running black --- modelseedpy/__init__.py | 2 +- modelseedpy/core/annotationontology.py | 288 +++++++++++------ modelseedpy/core/msatpcorrection.py | 50 +-- modelseedpy/core/msbuilder.py | 89 ++++-- modelseedpy/core/msgrowthphenotypes.py | 287 ++++++++++------- modelseedpy/core/msmedia.py | 7 +- modelseedpy/core/msmodelreport.py | 409 +++++++++++++++++-------- modelseedpy/core/msmodelutl.py | 10 +- modelseedpy/fbapkg/elementuptakepkg.py | 20 +- modelseedpy/fbapkg/kbasemediapkg.py | 4 +- 10 files changed, 745 insertions(+), 421 deletions(-) diff --git a/modelseedpy/__init__.py b/modelseedpy/__init__.py index efd16995..6409bd1f 100644 --- a/modelseedpy/__init__.py +++ b/modelseedpy/__init__.py @@ -46,7 +46,7 @@ MSGapfill, MSEquation, MSModelReport, - AnnotationOntology + AnnotationOntology, ) from modelseedpy.core.exceptions import * diff --git a/modelseedpy/core/annotationontology.py b/modelseedpy/core/annotationontology.py index 4750ed13..db64a981 100644 --- a/modelseedpy/core/annotationontology.py +++ b/modelseedpy/core/annotationontology.py @@ -15,34 +15,49 @@ logging.INFO ) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO -#Class structure -#AnnotationOntology -> Features/Events/Terms/Ontologies +# Class structure +# AnnotationOntology -> Features/Events/Terms/Ontologies # AnnotationOntologyOntology -> Events/Terms # AnnotationOntologyEvent -> Features/Ontology # AnnotationOntologyFeature -> Term+Event->Evidence # AnnotationOntologyTerm -> Ontology/Events/Featurs # AnnotationOntologyEvidence -> -- -allowable_score_types = ["probability","evalue","bitscore","identity","qalignstart","qalignstop","salignstart","salignstop","kmerhits","tmscore","rmsd","hmmscore"] +allowable_score_types = [ + "probability", + "evalue", + "bitscore", + "identity", + "qalignstart", + "qalignstop", + "salignstart", + "salignstop", + "kmerhits", + "tmscore", + "rmsd", + "hmmscore", +] + class AnnotationOntologyEvidence: - def __init__(self,scores={},ref_entity=None,entity_type=None): - self.ref_entity=ref_entity - self.entity_type=entity_type - self.scores=scores + def __init__(self, scores={}, ref_entity=None, entity_type=None): + self.ref_entity = ref_entity + self.entity_type = entity_type + self.scores = scores for item in self.scores: if item not in allowable_score_types: - logger.warning(item+" not an allowable score type!") - + logger.warning(item + " not an allowable score type!") + def to_data(self): return { - "ref_entity":self.ref_entity, - "entity_type":self.entity_type, - "scores":self.scores + "ref_entity": self.ref_entity, + "entity_type": self.entity_type, + "scores": self.scores, } - + + class AnnotationOntologyTerm: - def __init__(self,parent,term_id,ontology): + def __init__(self, parent, term_id, ontology): self.id = term_id self.parent = parent self.ontology = ontology @@ -51,126 +66,170 @@ def __init__(self,parent,term_id,ontology): self.msrxns = set() self.events = {} self.features = {} - - def add_msrxns(self,rxn_ids): + + def add_msrxns(self, rxn_ids): for rxn_id in rxn_ids: if rxn_id[0:6] == "MSRXN:": - rxn_id = rxn_id[6:] - self.msrxns.update([rxn_id]) - - def add_event(self,event): + rxn_id = rxn_id[6:] + self.msrxns.update([rxn_id]) + + def add_event(self, event): self.events[event.id] = event - - def add_feature(self,feature): + + def add_feature(self, feature): self.features[feature.id] = feature - + + class AnnotationOntologyOntology: - def __init__(self,parent,ontology_id): + def __init__(self, parent, ontology_id): self.id = ontology_id self.parent = parent self.events = {} self.terms = {} - - def add_event(self,event): + + def add_event(self, event): self.events[event.id] = event - - def add_term(self,term): + + def add_term(self, term): self.terms[term.id] = term + class AnnotationOntologyFeature: - def __init__(self,parent,feature_id,type=None): + def __init__(self, parent, feature_id, type=None): self.id = feature_id self.parent = parent parent.add_feature(self) self.type = type self.event_terms = {} self.term_events = {} - - def add_event_term(self,event,term,scores={},ref_entity=None,entity_type=None): + + def add_event_term(self, event, term, scores={}, ref_entity=None, entity_type=None): if event.id not in self.event_terms: self.event_terms[event.id] = {} - self.event_terms[event.id][term.id] = AnnotationOntologyEvidence(scores,ref_entity,entity_type) + self.event_terms[event.id][term.id] = AnnotationOntologyEvidence( + scores, ref_entity, entity_type + ) if term.id not in self.term_events: self.term_events[term.id] = {} self.term_events[term.id][event.id] = self.event_terms[event.id][term.id] - - def get_associated_terms(self,prioritized_event_list=None,ontologies=None,merge_all=False,translate_to_rast=False): + + def get_associated_terms( + self, + prioritized_event_list=None, + ontologies=None, + merge_all=False, + translate_to_rast=False, + ): output = {} for term_id in self.term_events: term = self.parent.terms[term_id] if not ontologies or term.ontology.id in ontologies: if merge_all or not prioritized_event_list: for event_id in self.term_events[term_id]: - if not prioritized_event_list or event_id in prioritized_event_list: + if ( + not prioritized_event_list + or event_id in prioritized_event_list + ): if term not in output: output[term] = [] - output[term].append(self.term_events[term_id][event_id].to_data()) + output[term].append( + self.term_events[term_id][event_id].to_data() + ) else: for event_id in prioritized_event_list: if event_id in self.term_events[term_id]: - rxns = self.parent.terms[term_id].msrxns; + rxns = self.parent.terms[term_id].msrxns if len(rxns) > 0: if term not in output: output[term] = [] - output[term].append(self.term_events[term_id][event_id].to_data()) + output[term].append( + self.term_events[term_id][event_id].to_data() + ) break return output - - def get_associated_reactions(self,prioritized_event_list=None,ontologies=None,merge_all=False): + + def get_associated_reactions( + self, prioritized_event_list=None, ontologies=None, merge_all=False + ): output = {} for term_id in self.term_events: if not ontologies or self.parent.terms[term_id].ontology.id in ontologies: if merge_all or not prioritized_event_list: for event_id in self.term_events[term_id]: - if not prioritized_event_list or event_id in prioritized_event_list: - rxns = self.parent.terms[term_id].msrxns; + if ( + not prioritized_event_list + or event_id in prioritized_event_list + ): + rxns = self.parent.terms[term_id].msrxns for rxn_id in rxns: if rxn_id not in output: output[rxn_id] = [] - output[rxn_id].append(self.term_events[term_id][event_id].to_data()) + output[rxn_id].append( + self.term_events[term_id][event_id].to_data() + ) else: for event_id in prioritized_event_list: if event_id in self.term_events[term_id]: - rxns = self.parent.terms[term_id].msrxns; + rxns = self.parent.terms[term_id].msrxns for rxn_id in rxns: if rxn_id not in output: output[rxn_id] = [] - output[rxn_id].append(self.term_events[term_id][event_id].to_data()) + output[rxn_id].append( + self.term_events[term_id][event_id].to_data() + ) if len(rxns) > 0: break return output - + + class AnnotationOntologyEvent: - def __init__(self,parent,event_id,ontology_id,method,method_version=None,description=None,timestamp=None): + def __init__( + self, + parent, + event_id, + ontology_id, + method, + method_version=None, + description=None, + timestamp=None, + ): self.id = event_id self.parent = parent - #Linking ontology + # Linking ontology self.ontology = self.parent.add_ontology(ontology_id) self.ontology.add_event(self) if not description: - self.description = ""#TODO + self.description = "" # TODO else: self.description = description self.method = method self.method_version = method_version self.timestamp = timestamp self.features = {} - + @staticmethod - def from_data(data,parent): + def from_data(data, parent): if "method_version" not in data: data["method_version"] = None if "description" not in data: data["description"] = None if "timestamp" not in data: - data["timestamp"] = None - self = AnnotationOntologyEvent(parent,data["event_id"],data["ontology_id"],data["method"],data["method_version"],data["description"],data["timestamp"]) + data["timestamp"] = None + self = AnnotationOntologyEvent( + parent, + data["event_id"], + data["ontology_id"], + data["method"], + data["method_version"], + data["description"], + data["timestamp"], + ) if "ontology_terms" in data: for feature_id in data["ontology_terms"]: feature = self.parent.add_feature(feature_id) self.add_feature(feature) for item in data["ontology_terms"][feature_id]: - term = self.parent.add_term(item["term"],self.ontology) + term = self.parent.add_term(item["term"], self.ontology) scores = {} ref_entity = None entity_type = None @@ -180,43 +239,42 @@ def from_data(data,parent): if "reference" in item["evidence"]: ref_entity = item["evidence"]["reference"][1] entity_type = item["evidence"]["reference"][0] - feature.add_event_term(self,term,scores,ref_entity,entity_type) + feature.add_event_term(self, term, scores, ref_entity, entity_type) if "modelseed_ids" in item: term.add_msrxns(item["modelseed_ids"]) return self - - def add_feature(self,feature): + + def add_feature(self, feature): self.features[feature.id] = feature - + def to_data(self): data = { - "event_id" : self.event_id, - "description" : self.event_id, - "ontology_id" : self.ontology_id, - "method" : self.method, - "method_version" : self.method_version, - "timestamp" : self.timestamp, - "ontology_terms" : {} + "event_id": self.event_id, + "description": self.event_id, + "ontology_id": self.ontology_id, + "method": self.method, + "method_version": self.method_version, + "timestamp": self.timestamp, + "ontology_terms": {}, } for feature in self.features: - data["ontology_terms"][feature] = { - "term":None#TODO - } - + data["ontology_terms"][feature] = {"term": None} # TODO + + class AnnotationOntology: mdlutls = {} @staticmethod - def from_kbase_data(data,genome_ref=None,data_dir=None): - self = AnnotationOntology(genome_ref,data_dir) + def from_kbase_data(data, genome_ref=None, data_dir=None): + self = AnnotationOntology(genome_ref, data_dir) if "feature_types" in data: self.feature_types = data["feature_types"] if "events" in data: for event in data["events"]: - self.events += [AnnotationOntologyEvent.from_data(event,self)] + self.events += [AnnotationOntologyEvent.from_data(event, self)] return self - - def __init__(self,genome_ref,data_dir): + + def __init__(self, genome_ref, data_dir): self.genome_ref = genome_ref self.events = DictList() self.terms = {} @@ -227,20 +285,40 @@ def __init__(self,genome_ref,data_dir): self.noncodings = {} self.feature_types = {} self.term_names = {} - - def get_term_name(self,term): + + def get_term_name(self, term): if term.ontology.id not in self.term_names: self.term_names[term.ontology.id] = {} - if term.ontology.id in ["SSO","AntiSmash","EC","TC","META","RO","KO","GO"]: - with open(self.data_dir + "/"+term.ontology.id+"_dictionary.json") as json_file: + if term.ontology.id in [ + "SSO", + "AntiSmash", + "EC", + "TC", + "META", + "RO", + "KO", + "GO", + ]: + with open( + self.data_dir + "/" + term.ontology.id + "_dictionary.json" + ) as json_file: ontology = json.load(json_file) for item in ontology["term_hash"]: - self.term_names[term.ontology.id][item] = ontology["term_hash"][item]["name"] + self.term_names[term.ontology.id][item] = ontology["term_hash"][ + item + ]["name"] if term.id not in self.term_names[term.ontology.id]: return "Unknown" return self.term_names[term.ontology.id][term.id] - - def get_gene_term_hash(self,prioritized_event_list=None,ontologies=None,merge_all=False,cds_features=False,translate_to_rast=True): + + def get_gene_term_hash( + self, + prioritized_event_list=None, + ontologies=None, + merge_all=False, + cds_features=False, + translate_to_rast=True, + ): output = {} feature_hash = self.genes if len(self.genes) == 0 or (cds_features and len(self.cdss) == 0): @@ -249,16 +327,26 @@ def get_gene_term_hash(self,prioritized_event_list=None,ontologies=None,merge_al feature = feature_hash[feature_id] if feature not in output: output[feature] = {} - output[feature] = feature.get_associated_terms(prioritized_event_list,ontologies,merge_all,translate_to_rast) + output[feature] = feature.get_associated_terms( + prioritized_event_list, ontologies, merge_all, translate_to_rast + ) return output - - def get_reaction_gene_hash(self,prioritized_event_list=None,ontologies=None,merge_all=False,cds_features=False): + + def get_reaction_gene_hash( + self, + prioritized_event_list=None, + ontologies=None, + merge_all=False, + cds_features=False, + ): output = {} feature_hash = self.genes if len(self.genes) == 0 or (cds_features and len(self.cdss) == 0): feature_hash = self.cdss for feature_id in feature_hash: - reactions = feature_hash[feature_id].get_associated_reactions(prioritized_event_list,ontologies,merge_all) + reactions = feature_hash[feature_id].get_associated_reactions( + prioritized_event_list, ontologies, merge_all + ) for rxn_id in reactions: if rxn_id not in output: output[rxn_id] = {} @@ -266,32 +354,34 @@ def get_reaction_gene_hash(self,prioritized_event_list=None,ontologies=None,merg output[rxn_id][feature_id] = [] output[rxn_id][feature_id].append(reactions[rxn_id]) return output - - def add_term(self,term_or_id,ontology=None): + + def add_term(self, term_or_id, ontology=None): if not isinstance(term_or_id, AnnotationOntologyTerm): if term_or_id in self.terms: return self.terms[term_or_id] else: - return AnnotationOntologyTerm(self,term_or_id,ontology) + return AnnotationOntologyTerm(self, term_or_id, ontology) if term_or_id.id in self.terms: - logger.critical("Term with id "+term_or_id.id+" already in annotation!") + logger.critical("Term with id " + term_or_id.id + " already in annotation!") return self.terms[term_or_id.id] else: - self.terms[term_or_id.id] = term_or_id - - def add_ontology(self,ontology_or_id): + self.terms[term_or_id.id] = term_or_id + + def add_ontology(self, ontology_or_id): if not isinstance(ontology_or_id, AnnotationOntologyOntology): if ontology_or_id in self.ontologies: return self.ontologies[ontology_or_id] else: - return AnnotationOntologyOntology(self,ontology_or_id) + return AnnotationOntologyOntology(self, ontology_or_id) if ontology_or_id.id in self.ontologies: - logger.critical("Ontology with id "+ontology_or_id.id+" already in annotation!") + logger.critical( + "Ontology with id " + ontology_or_id.id + " already in annotation!" + ) return self.ontologies[ontology_or_id.id] else: self.ontologies[ontology_or_id.id] = ontology_or_id - - def get_feature_hash(self,feature_id): + + def get_feature_hash(self, feature_id): feature_hash = self.genes if feature_id in self.feature_types: if self.feature_types[feature_id] == "cds": @@ -299,15 +389,15 @@ def get_feature_hash(self,feature_id): elif self.feature_types[feature_id] == "noncoding": feature_hash = self.noncodings return feature_hash - - def add_feature(self,feature_or_id): + + def add_feature(self, feature_or_id): feature_hash = None if not isinstance(feature_or_id, AnnotationOntologyFeature): feature_hash = self.get_feature_hash(feature_or_id) if feature_or_id in feature_hash: return feature_hash[feature_or_id] else: - feature_or_id = AnnotationOntologyFeature(self,feature_or_id) + feature_or_id = AnnotationOntologyFeature(self, feature_or_id) if not feature_hash: feature_hash = self.get_feature_hash(feature_or_id.id) if feature_or_id.id not in feature_hash: diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 6a0fcec2..d5af6b97 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -49,7 +49,7 @@ default_threshold_multipiers = { "Glc": 2, - "default":1.2, + "default": 1.2, } @@ -119,7 +119,7 @@ def __init__( media.id = "empty" media.name = "empty" self.media_hash[media.id] = media - + self.forced_media = [] for media_id in forced_media: for item in self.atp_medias: @@ -406,11 +406,9 @@ def apply_growth_media_gapfilling(self): and MSGapfill.gapfill_count(self.media_gapfill_stats[media]) > 0 ): self.msgapfill.integrate_gapfill_solution( - stats, - self.cumulative_core_gapfilling, - link_gaps_to_objective=False + stats, self.cumulative_core_gapfilling, link_gaps_to_objective=False ) - #Adding reactions to gapfilling sensitivity structure so we can track all gapfilled reactions + # Adding reactions to gapfilling sensitivity structure so we can track all gapfilled reactions gf_sensitivity = self.modelutl.get_attributes("gf_sensitivity", {}) if media.id not in gf_sensitivity: gf_sensitivity[media.id] = {} @@ -418,15 +416,17 @@ def apply_growth_media_gapfilling(self): gf_sensitivity[media.id][self.atp_hydrolysis.id] = {} gf_sensitivity[media.id][self.atp_hydrolysis.id]["success"] = {} for item in stats["new"]: - gf_sensitivity[media.id][self.atp_hydrolysis.id]["success"][item] = { - stats["new"][item] : [] - } + gf_sensitivity[media.id][self.atp_hydrolysis.id]["success"][ + item + ] = {stats["new"][item]: []} for item in stats["reversed"]: - gf_sensitivity[media.id][self.atp_hydrolysis.id]["success"][item] = { - stats["reversed"][item] : [] - } - self.modelutl.save_attributes(gf_sensitivity, "gf_sensitivity") - self.modelutl.save_attributes(len(self.cumulative_core_gapfilling), "total_core_gapfilling") + gf_sensitivity[media.id][self.atp_hydrolysis.id]["success"][ + item + ] = {stats["reversed"][item]: []} + self.modelutl.save_attributes(gf_sensitivity, "gf_sensitivity") + self.modelutl.save_attributes( + len(self.cumulative_core_gapfilling), "total_core_gapfilling" + ) def expand_model_to_genome_scale(self): """Restores noncore reactions to model while filtering out reactions that break ATP @@ -444,7 +444,7 @@ def expand_model_to_genome_scale(self): self.restore_noncore_reactions(noncore=True, othercompartment=False) # Extending model with non core reactions while retaining ATP accuracy self.filtered_noncore = self.modelutl.reaction_expansion_test( - self.noncore_reactions, tests,attribute_label="atp_expansion_filter" + self.noncore_reactions, tests, attribute_label="atp_expansion_filter" ) # Removing filtered reactions for item in self.filtered_noncore: @@ -484,7 +484,7 @@ def restore_noncore_reactions(self, noncore=True, othercompartment=True): reaction.lower_bound = self.original_bounds[reaction.id][0] reaction.upper_bound = self.original_bounds[reaction.id][1] - def build_tests(self,multiplier_hash_override={}): + def build_tests(self, multiplier_hash_override={}): """Build tests based on ATP media evaluations Parameters @@ -500,16 +500,16 @@ def build_tests(self,multiplier_hash_override={}): Raises ------ """ - #Applying threshold multiplier + # Applying threshold multiplier for key in default_threshold_multipiers: if key not in multiplier_hash_override: multiplier_hash_override[key] = default_threshold_multipiers[key] - #Initialzing atp test attributes + # Initialzing atp test attributes atp_att = self.modelutl.get_attributes( "ATP_analysis", {"tests": {}, "selected_media": {}, "core_atp_gapfilling": {}}, ) - #Initializing tests and adding empty media every time + # Initializing tests and adding empty media every time tests = [] if "empty" in self.media_hash: tests.append( @@ -524,16 +524,16 @@ def build_tests(self,multiplier_hash_override={}): "threshold": 0.00001, "objective": self.atp_hydrolysis.id, } - #Setting objective to ATP hydrolysis + # Setting objective to ATP hydrolysis self.model.objective = self.atp_hydrolysis.id for media in self.selected_media: - #Setting multiplier for test threshold + # Setting multiplier for test threshold multiplier = multiplier_hash_override["default"] if media.id in multiplier_hash_override: - multiplier = multiplier_hash_override[media.id] - #Constraining model exchanges for media + multiplier = multiplier_hash_override[media.id] + # Constraining model exchanges for media self.modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package(media) - #Computing core ATP production + # Computing core ATP production obj_value = self.model.slim_optimize() logger.debug(f"{media.name} = {obj_value};{multiplier}") threshold = multiplier * obj_value @@ -552,7 +552,7 @@ def build_tests(self,multiplier_hash_override={}): "threshold": multiplier * obj_value, "objective": self.atp_hydrolysis.id, } - #Saving test attributes to the model + # Saving test attributes to the model self.modelutl.save_attributes(atp_att, "ATP_analysis") return tests diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 7f079234..bca4a0f8 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -730,26 +730,28 @@ def build_metabolic_reactions(self): reactions.append(reaction) return reactions - + def build_from_annotaton_ontology( - self, - model_or_id, - anno_ont, - index="0", - allow_all_non_grp_reactions=False, - annotate_with_rast=False, - biomass_classic=False, - biomass_gc=0.5, - add_non_template_reactions=True, - prioritized_event_list=None, - ontologies=None, - merge_all=True, - convert_to_sso=True - ): - #Build base model without annotation + self, + model_or_id, + anno_ont, + index="0", + allow_all_non_grp_reactions=False, + annotate_with_rast=False, + biomass_classic=False, + biomass_gc=0.5, + add_non_template_reactions=True, + prioritized_event_list=None, + ontologies=None, + merge_all=True, + convert_to_sso=True, + ): + # Build base model without annotation self.search_name_to_orginal = {} self.search_name_to_genes = {} - gene_term_hash = anno_ont.get_gene_term_hash(prioritized_event_list,ontologies,merge_all,convert_to_sso) + gene_term_hash = anno_ont.get_gene_term_hash( + prioritized_event_list, ontologies, merge_all, convert_to_sso + ) residual_reaction_gene_hash = {} for gene in gene_term_hash: for term in gene_term_hash[gene]: @@ -767,9 +769,18 @@ def build_from_annotaton_ontology( residual_reaction_gene_hash[rxn_id] = {} if gene not in residual_reaction_gene_hash[rxn_id]: residual_reaction_gene_hash[rxn_id][gene] = [] - residual_reaction_gene_hash[rxn_id][gene] = gene_term_hash[gene][term] - - model_or_id = self.build(model_or_id,index,allow_all_non_grp_reactions,annotate_with_rast,biomass_classic,biomass_gc) + residual_reaction_gene_hash[rxn_id][gene] = gene_term_hash[ + gene + ][term] + + model_or_id = self.build( + model_or_id, + index, + allow_all_non_grp_reactions, + annotate_with_rast, + biomass_classic, + biomass_gc, + ) for rxn in model_or_id.reactions: probability = None for gene in rxn.genes(): @@ -779,22 +790,25 @@ def build_from_annotaton_ontology( if rxn.id[0:-3] in term.msrxns: for item in gene_term_hash[gene][term]: if "probability" in item.scores: - if not probability or item.scores["probability"] > probability: + if ( + not probability + or item.scores["probability"] > probability + ): probability = item.scores["probability"] if hasattr(rxn, "probability"): - rxn.probability = probability - + rxn.probability = probability + reactions = [] modelseeddb = ModelSEEDBiochem.get() for rxn_id in residual_reaction_gene_hash: - if rxn_id+"_c0" not in model_or_id.reactions: + if rxn_id + "_c0" not in model_or_id.reactions: reaction = None template_reaction = None - if rxn_id+"_c" in self.template.reactions: - template_reaction = self.template.reactions.get_by_id(rxn_id+"_c") + if rxn_id + "_c" in self.template.reactions: + template_reaction = self.template.reactions.get_by_id(rxn_id + "_c") elif rxn_id in modelseeddb.reactions: msrxn = modelseeddb.reactions.get_by_id(rxn_id) - template_reaction = msrxn.to_template_reaction({0:"c",1:"e"}) + template_reaction = msrxn.to_template_reaction({0: "c", 1: "e"}) if template_reaction: for m in template_reaction.metabolites: if m.compartment not in self.compartments: @@ -803,15 +817,22 @@ def build_from_annotaton_ontology( ] = self.template.compartments.get_by_id(m.compartment) if m.id not in self.template_species_to_model_species: model_metabolite = m.to_metabolite(self.index) - self.template_species_to_model_species[m.id] = model_metabolite + self.template_species_to_model_species[ + m.id + ] = model_metabolite self.base_model.add_metabolites([model_metabolite]) - reaction = template_reaction.to_reaction(self.base_model, self.index) + reaction = template_reaction.to_reaction( + self.base_model, self.index + ) gpr = "" probability = None for gene in residual_reaction_gene_hash[rxn_id]: for item in residual_reaction_gene_hash[rxn_id][gene]: if "probability" in item["scores"]: - if not probability or item["scores"]["probability"] > probability: + if ( + not probability + or item["scores"]["probability"] > probability + ): probability = item["scores"]["probability"] if len(gpr) > 0: gpr += " or " @@ -822,7 +843,7 @@ def build_from_annotaton_ontology( reaction.annotation[SBO_ANNOTATION] = "SBO:0000176" reactions.append(reaction) if not reaction: - print("Reaction ",rxn_id," not found in template or database!") + print("Reaction ", rxn_id, " not found in template or database!") model_or_id.add_reactions(reactions) return model_or_id @@ -911,7 +932,7 @@ def build( annotate_with_rast=True, biomass_classic=False, biomass_gc=0.5, - add_reaction_from_rast_annotation=True + add_reaction_from_rast_annotation=True, ): """ @@ -949,11 +970,11 @@ def build( complex_groups = self.build_complex_groups( self.reaction_to_complex_sets.values() ) - + if add_reaction_from_rast_annotation: metabolic_reactions = self.build_metabolic_reactions() cobra_model.add_reactions(metabolic_reactions) - + non_metabolic_reactions = self.build_non_metabolite_reactions( cobra_model, allow_all_non_grp_reactions ) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index b0d3b2b6..75e356c4 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -13,6 +13,7 @@ logging.INFO ) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO + class MSGrowthPhenotype: def __init__( self, @@ -35,7 +36,7 @@ def __init__( self.additional_compounds = additional_compounds self.parent = parent - def build_media(self,include_base_media=True): + def build_media(self, include_base_media=True): """Builds media object to use when simulating the phenotype Parameters ---------- @@ -79,25 +80,30 @@ def simulate( modelutl = model_or_mdlutl if not isinstance(model_or_mdlutl, MSModelUtil): modelutl = MSModelUtil.get(model_or_mdlutl) - - #Setting objective + + # Setting objective if objective: modelutl.model.objective = objective - - #Building full media and adding missing exchanges - output = {"growth": None, "class": None, "missing_transports": [], "baseline_growth": None} + + # Building full media and adding missing exchanges + output = { + "growth": None, + "class": None, + "missing_transports": [], + "baseline_growth": None, + } full_media = self.build_media() if add_missing_exchanges: output["missing_transports"] = modelutl.add_missing_exchanges(full_media) - - #Getting basline growth + + # Getting basline growth output["baseline_growth"] = 0.01 if self.parent: - output["baseline_growth"] = self.parent.baseline_growth(modelutl,objective) + output["baseline_growth"] = self.parent.baseline_growth(modelutl, objective) if output["baseline_growth"] < 1e-5: output["baseline_growth"] = 0.01 - - #Building specific media and setting compound exception list + + # Building specific media and setting compound exception list if self.parent and self.parent.atom_limits and len(self.parent.atom_limits) > 0: reaction_exceptions = [] specific_media = self.build_media(False) @@ -105,36 +111,36 @@ def simulate( ex_hash = mediacpd.get_mdl_exchange_hash(modelutl) for mdlcpd in ex_hash: reaction_exceptions.append(ex_hash[mdlcpd]) - modelutl.pkgmgr.getpkg("ElementUptakePkg").build_package(self.parent.atom_limits,exception_reactions=reaction_exceptions) - - #Applying media + modelutl.pkgmgr.getpkg("ElementUptakePkg").build_package( + self.parent.atom_limits, exception_reactions=reaction_exceptions + ) + + # Applying media if self.parent: modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package( full_media, self.parent.base_uptake, self.parent.base_excretion ) else: - modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package( - full_media,0,1000 - ) - + modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package(full_media, 0, 1000) + with modelutl.model: - #Applying gene knockouts + # Applying gene knockouts for gene in self.gene_ko: if gene in modelutl.model.genes: geneobj = modelutl.model.genes.get_by_id(gene) geneobj.knock_out() - - #Optimizing model + + # Optimizing model solution = modelutl.model.optimize() output["growth"] = solution.objective_value if solution.objective_value > 0 and pfba: solution = cobra.flux_analysis.pfba(modelutl.model) if save_fluxes: output["fluxes"] = solution.fluxes - - #Determining phenotype class - - if output["growth"] >= output["baseline_growth"]*growth_multiplier: + + # Determining phenotype class + + if output["growth"] >= output["baseline_growth"] * growth_multiplier: output["GROWING"] = True if not self.growth: output["class"] = "GROWTH" @@ -172,44 +178,60 @@ def gapfill_model_for_phenotype( objective : string Expression for objective to be activated by gapfilling """ - #First simulate model without gapfilling to assess ungapfilled growth - output = self.simulate(msgapfill.mdlutl,objective,growth_multiplier,add_missing_exchanges) - if output["growth"] >= output["baseline_growth"]*growth_multiplier: - #No gapfilling needed - original model grows without gapfilling - return {"reversed": {}, "new": {},"media": self.build_media(), "target":objective, "minobjective": output["baseline_growth"]*growth_multiplier, "binary_check":False} - - #Now pulling the gapfilling configured model from MSGapfill + # First simulate model without gapfilling to assess ungapfilled growth + output = self.simulate( + msgapfill.mdlutl, objective, growth_multiplier, add_missing_exchanges + ) + if output["growth"] >= output["baseline_growth"] * growth_multiplier: + # No gapfilling needed - original model grows without gapfilling + return { + "reversed": {}, + "new": {}, + "media": self.build_media(), + "target": objective, + "minobjective": output["baseline_growth"] * growth_multiplier, + "binary_check": False, + } + + # Now pulling the gapfilling configured model from MSGapfill gfmodelutl = MSModelUtil.get(msgapfill.gfmodel) - #Saving the gapfill objective because this will be replaced when the simulation runs + # Saving the gapfill objective because this will be replaced when the simulation runs gfobj = gfmodelutl.model.objective - #Running simulate on gapfill model to add missing exchanges and set proper media and uptake limit constraints - output = self.simulate(modelutl,objective,growth_multiplier,add_missing_exchanges) - #If the gapfilling model fails to achieve the minimum growth, then no solution exists - if output["growth"] < output["baseline_growth"]*growth_multiplier: + # Running simulate on gapfill model to add missing exchanges and set proper media and uptake limit constraints + output = self.simulate( + modelutl, objective, growth_multiplier, add_missing_exchanges + ) + # If the gapfilling model fails to achieve the minimum growth, then no solution exists + if output["growth"] < output["baseline_growth"] * growth_multiplier: logger.warning( "Gapfilling failed with the specified model, media, and target reaction." ) return None - - #Running the gapfilling itself + + # Running the gapfilling itself full_media = self.build_media() with modelutl.model: - #Applying gene knockouts + # Applying gene knockouts for gene in self.gene_ko: if gene in modelutl.model.genes: geneobj = modelutl.model.genes.get_by_id(gene) geneobj.knock_out() - - gfresults = self.gapfilling.run_gapfilling(media,None,minimum_obj=output["baseline_growth"]*growth_multiplier) + + gfresults = self.gapfilling.run_gapfilling( + media, None, minimum_obj=output["baseline_growth"] * growth_multiplier + ) if gfresults is None: logger.warning( "Gapfilling failed with the specified model, media, and target reaction." ) - + return gfresults + class MSGrowthPhenotypes: - def __init__(self, base_media=None, base_uptake=0, base_excretion=1000,global_atom_limits={}): + def __init__( + self, base_media=None, base_uptake=0, base_excretion=1000, global_atom_limits={} + ): self.base_media = base_media self.phenotypes = DictList() self.base_uptake = base_uptake @@ -219,8 +241,16 @@ def __init__(self, base_media=None, base_uptake=0, base_excretion=1000,global_at self.cached_based_growth = {} @staticmethod - def from_compound_hash(compounds,base_media=None, base_uptake=0, base_excretion=1000,global_atom_limits={}): - growthpheno = MSGrowthPhenotypes(base_media, base_uptake, base_excretion,global_atom_limits) + def from_compound_hash( + compounds, + base_media=None, + base_uptake=0, + base_excretion=1000, + global_atom_limits={}, + ): + growthpheno = MSGrowthPhenotypes( + base_media, base_uptake, base_excretion, global_atom_limits + ) new_phenos = [] for cpd in compounds: newpheno = MSGrowthPhenotype(cpd, None, compounds[cpd], [], [cpd]) @@ -229,8 +259,17 @@ def from_compound_hash(compounds,base_media=None, base_uptake=0, base_excretion= return growthpheno @staticmethod - def from_kbase_object(data, kbase_api,base_media=None, base_uptake=0, base_excretion=1000,global_atom_limits={}): - growthpheno = MSGrowthPhenotypes(base_media,base_uptake, base_excretion,global_atom_limits) + def from_kbase_object( + data, + kbase_api, + base_media=None, + base_uptake=0, + base_excretion=1000, + global_atom_limits={}, + ): + growthpheno = MSGrowthPhenotypes( + base_media, base_uptake, base_excretion, global_atom_limits + ) new_phenos = [] for pheno in data["phenotypes"]: media = kbase_api.get_from_ws(pheno["media_ref"], None) @@ -248,9 +287,18 @@ def from_kbase_object(data, kbase_api,base_media=None, base_uptake=0, base_excre return growthpheno @staticmethod - def from_kbase_file(filename, kbase_api,base_media=None, base_uptake=0, base_excretion=1000,global_atom_limits={}): + def from_kbase_file( + filename, + kbase_api, + base_media=None, + base_uptake=0, + base_excretion=1000, + global_atom_limits={}, + ): # TSV file with the following headers:media mediaws growth geneko addtlCpd - growthpheno = MSGrowthPhenotypes(base_media,base_uptake, base_excretion,global_atom_limits) + growthpheno = MSGrowthPhenotypes( + base_media, base_uptake, base_excretion, global_atom_limits + ) headings = [] new_phenos = [] with open(filename) as f: @@ -282,8 +330,16 @@ def from_kbase_file(filename, kbase_api,base_media=None, base_uptake=0, base_exc return growthpheno @staticmethod - def from_ms_file(filename,base_media=None, base_uptake=0, base_excretion=100,global_atom_limits={}): - growthpheno = MSGrowthPhenotypes(base_media,base_uptake, base_excretion,global_atom_limits) + def from_ms_file( + filename, + base_media=None, + base_uptake=0, + base_excretion=100, + global_atom_limits={}, + ): + growthpheno = MSGrowthPhenotypes( + base_media, base_uptake, base_excretion, global_atom_limits + ) df = pd.read_csv(filename) required_headers = ["Compounds", "Growth"] for item in required_headers: @@ -311,7 +367,7 @@ def build_super_media(self): else: super_media.merge(pheno.build_media(), overwrite_overlap=False) return super_media - + def add_phenotypes(self, new_phenotypes): keep_phenos = [] for pheno in new_phenotypes: @@ -321,11 +377,7 @@ def add_phenotypes(self, new_phenotypes): additions = DictList(keep_phenos) self.phenotypes += additions - def baseline_growth( - self, - model_or_mdlutl, - objective - ): + def baseline_growth(self, model_or_mdlutl, objective): """Simulates all the specified phenotype conditions and saves results Parameters ---------- @@ -336,22 +388,22 @@ def baseline_growth( modelutl = model_or_mdlutl if not isinstance(model_or_mdlutl, MSModelUtil): modelutl = MSModelUtil.get(model_or_mdlutl) - #Checking if base growth already computed + # Checking if base growth already computed if modelutl in self.cached_based_growth: if objective in self.cached_based_growth[modelutl]: return self.cached_based_growth[modelutl][objective] else: self.cached_based_growth[modelutl] = {} - #Setting objective + # Setting objective modelutl.objective = objective - #Setting media + # Setting media modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package( self.base_media, self.base_uptake, self.base_excretion ) - #Adding uptake limits + # Adding uptake limits if len(self.atom_limits) > 0: modelutl.pkgmgr.getpkg("ElementUptakePkg").build_package(self.atom_limits) - #Simulating + # Simulating self.cached_based_growth[modelutl][objective] = modelutl.model.slim_optimize() return self.cached_based_growth[modelutl][objective] @@ -364,7 +416,7 @@ def simulate_phenotypes( save_fluxes=False, gapfill_negatives=False, msgapfill=None, - test_conditions=None + test_conditions=None, ): """Simulates all the specified phenotype conditions and saves results Parameters @@ -384,14 +436,14 @@ def simulate_phenotypes( modelutl = model_or_mdlutl if not isinstance(model_or_mdlutl, MSModelUtil): modelutl = MSModelUtil.get(model_or_mdlutl) - #Setting objective + # Setting objective modelutl.objective = objective - #Getting basline growth - baseline_growth = self.baseline_growth(modelutl,objective) - #Establishing output of the simulation method + # Getting basline growth + baseline_growth = self.baseline_growth(modelutl, objective) + # Establishing output of the simulation method summary = { - "Label": ["Accuracy", "CP", "CN", "FP", "FN","Growth","No growth"], - "Count": [0, 0, 0, 0, 0,0,0], + "Label": ["Accuracy", "CP", "CN", "FP", "FN", "Growth", "No growth"], + "Count": [0, 0, 0, 0, 0, 0, 0], } data = { "Phenotype": [], @@ -400,22 +452,24 @@ def simulate_phenotypes( "Class": [], "Transports missing": [], "Gapfilled reactions": [], - "Gapfilling score":None + "Gapfilling score": None, } - #Running simulations + # Running simulations gapfilling_solutions = {} totalcount = 0 for pheno in self.phenotypes: result = pheno.simulate( - modelutl,objective,growth_multiplier,add_missing_exchanges,save_fluxes + modelutl, + objective, + growth_multiplier, + add_missing_exchanges, + save_fluxes, ) data["Class"].append(result["class"]) data["Phenotype"].append(pheno.id) data["Observed growth"].append(pheno.growth) data["Simulated growth"].append(result["growth"]) - data["Transports missing"].append( - ";".join(result["missing_transports"]) - ) + data["Transports missing"].append(";".join(result["missing_transports"])) if result["class"] == "CP": summary["Count"][1] += 1 summary["Count"][0] += 1 @@ -434,22 +488,25 @@ def simulate_phenotypes( summary["Count"][5] += 1 elif result["class"] == "NOGROWTH": summary["Count"][6] += 1 - #Gapfilling negative growth conditions - if gapfill_negatives and output["class"] in ["NOGROWTH","FN","CN"]: - gapfilling_solutions[pheno] = pheno.gapfill_model_for_phenotype(msgapfill,objective,test_conditions,growth_multiplier,add_missing_exchanges) + # Gapfilling negative growth conditions + if gapfill_negatives and output["class"] in ["NOGROWTH", "FN", "CN"]: + gapfilling_solutions[pheno] = pheno.gapfill_model_for_phenotype( + msgapfill, + objective, + test_conditions, + growth_multiplier, + add_missing_exchanges, + ) if gapfilling_solutions[pheno] != None: data["Gapfilling score"] = 0 list = [] for rxn_id in gapfilling_solutions[pheno]["reversed"]: list.append( - gapfilling_solutions[pheno]["reversed"][rxn_id] - + rxn_id + gapfilling_solutions[pheno]["reversed"][rxn_id] + rxn_id ) data["Gapfilling score"] += 0.5 for rxn_id in gapfilling_solutions[pheno]["new"]: - list.append( - gapfilling_solutions[pheno]["new"][rxn_id] + rxn_id - ) + list.append(gapfilling_solutions[pheno]["new"][rxn_id] + rxn_id) data["Gapfilling score"] += 1 data["Gapfilled reactions"].append(";".join(list)) else: @@ -473,9 +530,9 @@ def fit_model_to_phenotypes( minimize_new_false_positives=True, atp_safe=True, integrate_results=True, - global_gapfilling=True + global_gapfilling=True, ): - + """Simulates all the specified phenotype conditions and saves results Parameters ---------- @@ -488,46 +545,46 @@ def fit_model_to_phenotypes( integrate_results : bool Indicates if the resulting modifications to the model should be integrated """ - - - - #Running simulations + + # Running simulations positive_growth = [] negative_growth = [] for pheno in self.phenotypes: with model: result = pheno.simulate( - modelutl,objective,growth_multiplier,add_missing_exchanges,save_fluxes + modelutl, + objective, + growth_multiplier, + add_missing_exchanges, + save_fluxes, ) - #Gapfilling negative growth conditions - if gapfill_negatives and output["class"] in ["NOGROWTH","FN","CN"]: + # Gapfilling negative growth conditions + if gapfill_negatives and output["class"] in ["NOGROWTH", "FN", "CN"]: negative_growth.append(pheno.build_media()) - elif gapfill_negatives and output["class"] in ["GROWTH","FP","CP"]: + elif gapfill_negatives and output["class"] in ["GROWTH", "FP", "CP"]: positive_growth.append(pheno.build_media()) - - - #Create super media for all + + # Create super media for all super_media = self.build_super_media() - #Adding missing exchanges + # Adding missing exchanges msgapfill.gfmodel.add_missing_exchanges(super_media) - #Adding elemental constraints + # Adding elemental constraints self.add_elemental_constraints() - #Getting ATP tests - - #Filtering database for ATP tests - - #Penalizing database to avoid creating false positives - - #Building additional tests from current correct negatives - - #Computing base-line growth - - #Computing growth threshold - - #Running global gapfill - - #Integrating solution - + # Getting ATP tests + + # Filtering database for ATP tests + + # Penalizing database to avoid creating false positives + + # Building additional tests from current correct negatives + + # Computing base-line growth + + # Computing growth threshold + + # Running global gapfill + + # Integrating solution def gapfill_all_phenotypes( self, diff --git a/modelseedpy/core/msmedia.py b/modelseedpy/core/msmedia.py index fadc435d..960e82d1 100644 --- a/modelseedpy/core/msmedia.py +++ b/modelseedpy/core/msmedia.py @@ -22,8 +22,8 @@ def maxFlux(self): def minFlux(self): # TODO: will be removed later just for old methods return -self.upper_bound - - def get_mdl_exchange_hash(self,model_or_mdlutl): + + def get_mdl_exchange_hash(self, model_or_mdlutl): modelutl = model_or_mdlutl if not isinstance(model_or_mdlutl, MSModelUtil): modelutl = MSModelUtil.get(model_or_mdlutl) @@ -33,7 +33,8 @@ def get_mdl_exchange_hash(self,model_or_mdlutl): for met in mets: if met in exchange_hash: output[met] = exchange_hash[met] - return output + return output + class MSMedia: def __init__(self, media_id, name=""): diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index 78595f1c..1435468c 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -15,11 +15,9 @@ logging.INFO ) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO + class MSModelReport: - def __init__( - self, - model_or_mdlutl - ): + def __init__(self, model_or_mdlutl): if isinstance(model_or_mdlutl, MSModelUtil): self.model = model_or_mdlutl.model self.modelutl = model_or_mdlutl @@ -27,45 +25,73 @@ def __init__( self.model = model_or_mdlutl self.modelutl = MSModelUtil.get(model_or_mdlutl) - def generate_reports(self,report_path, multi_tab_report_path): + def generate_reports(self, report_path, multi_tab_report_path): self.build_report(report_path) self.build_multitab_report(multi_tab_report_path) - + # Helper function to build overview data def build_overview_data(self): # Get the number of compartments - number_compartments = len(set([metabolite.compartment for metabolite in self.model.metabolites])) + number_compartments = len( + set([metabolite.compartment for metabolite in self.model.metabolites]) + ) # Extract gapfilling information core_gapfilling_media = [] gapfilling_media = [] - gf_sensitivity = self.modelutl.attributes.get('gf_sensitivity', None) + gf_sensitivity = self.modelutl.attributes.get("gf_sensitivity", None) if gf_sensitivity: for media in gf_sensitivity: - if "bio1" in self.modelutl.attributes["gf_sensitivity"][media] and "success" in self.modelutl.attributes["gf_sensitivity"][media]["bio1"]: + if ( + "bio1" in self.modelutl.attributes["gf_sensitivity"][media] + and "success" + in self.modelutl.attributes["gf_sensitivity"][media]["bio1"] + ): gapfilling_media.append(media) - if "rxn00062_c0" in self.modelutl.attributes["gf_sensitivity"][media] and "success" in self.modelutl.attributes["gf_sensitivity"][media]["rxn00062_c0"]: + if ( + "rxn00062_c0" in self.modelutl.attributes["gf_sensitivity"][media] + and "success" + in self.modelutl.attributes["gf_sensitivity"][media]["rxn00062_c0"] + ): core_gapfilling_media.append(media) - + # Count the number of gapfills number_gapfills = len(gapfilling_media) # Convert the lists to strings - core_gapfilling_str = "; ".join(core_gapfilling_media) if core_gapfilling_media else "No core gapfilling needed." - gapfilling_media_str = "; ".join(gapfilling_media) if gapfilling_media else "No genome-scale gapfilling." + core_gapfilling_str = ( + "; ".join(core_gapfilling_media) + if core_gapfilling_media + else "No core gapfilling needed." + ) + gapfilling_media_str = ( + "; ".join(gapfilling_media) + if gapfilling_media + else "No genome-scale gapfilling." + ) overview = { - 'Model ID': self.model.id, - 'Full Gapfilling and ATP Analysis Report': 'TBD', # You may replace 'TBD' with actual data when available - 'Genome Scale Template': self.model.notes.get('kbase_template_refs', 'Data Not Available'), - 'Core Gapfilling Media': core_gapfilling_str, - 'Gapfilling Media': gapfilling_media_str, - 'Source Genome': self.model.notes.get('kbase_genome_ref', 'Data Not Available'), - 'Total Number of reactions': self.modelutl.nonexchange_reaction_count(), - 'Number compounds': len(self.model.metabolites), - 'Number compartments': number_compartments, - 'Number biomass': len([rxn for rxn in self.model.reactions if rxn.annotation.get('sbo') == 'SBO:0000629']), - 'Number gapfills': number_gapfills + "Model ID": self.model.id, + "Full Gapfilling and ATP Analysis Report": "TBD", # You may replace 'TBD' with actual data when available + "Genome Scale Template": self.model.notes.get( + "kbase_template_refs", "Data Not Available" + ), + "Core Gapfilling Media": core_gapfilling_str, + "Gapfilling Media": gapfilling_media_str, + "Source Genome": self.model.notes.get( + "kbase_genome_ref", "Data Not Available" + ), + "Total Number of reactions": self.modelutl.nonexchange_reaction_count(), + "Number compounds": len(self.model.metabolites), + "Number compartments": number_compartments, + "Number biomass": len( + [ + rxn + for rxn in self.model.reactions + if rxn.annotation.get("sbo") == "SBO:0000629" + ] + ), + "Number gapfills": number_gapfills, } return overview @@ -79,39 +105,55 @@ def extract_gapfilling_data(self, gf_sensitivity): for media, media_data in gf_sensitivity.items(): for target, target_data in media_data.items(): - gf_data = target_data.get('success', {}) + gf_data = target_data.get("success", {}) if isinstance(gf_data, dict): for reaction_id, reaction_data in gf_data.items(): for direction, metabolites in reaction_data.items(): # If metabolites is None, set to empty string if metabolites is None: metabolites = "" - + # Extract both IDs and Names for Gapfilling Sensitivity sensitivity_ids = [] sensitivity_names = [] if isinstance(metabolites, (list, tuple)): for met_id in metabolites: sensitivity_ids.append(met_id) - met_name = self.model.metabolites.get_by_id(met_id).name if met_id in self.model.metabolites else met_id + met_name = ( + self.model.metabolites.get_by_id(met_id).name + if met_id in self.model.metabolites + else met_id + ) sensitivity_names.append(met_name) else: - metabolites = str(metabolites) + metabolites = str(metabolites) entry = { "reaction_id": reaction_id, - "reaction_name": self.model.reactions.get_by_id(reaction_id).name if reaction_id in self.model.reactions else reaction_id, + "reaction_name": self.model.reactions.get_by_id( + reaction_id + ).name + if reaction_id in self.model.reactions + else reaction_id, "media": media, "direction": direction, "target": target, - "gapfilling_sensitivity_id": "; ".join(sensitivity_ids) if sensitivity_ids else metabolites, - "gapfilling_sensitivity_name": "; ".join(sensitivity_names) if sensitivity_names else metabolites + "gapfilling_sensitivity_id": "; ".join(sensitivity_ids) + if sensitivity_ids + else metabolites, + "gapfilling_sensitivity_name": "; ".join( + sensitivity_names + ) + if sensitivity_names + else metabolites, } - + # Update the summary dictionary if reaction_id not in gapfilling_summary: gapfilling_summary[reaction_id] = [] - gapfilling_summary[reaction_id].append(f"{media}: {direction}") - + gapfilling_summary[reaction_id].append( + f"{media}: {direction}" + ) + # Check if reaction_id is already in dictionary if reaction_id in gapfilling_dict: # Update the media @@ -123,9 +165,9 @@ def extract_gapfilling_data(self, gf_sensitivity): else: gapfilling_dict[reaction_id] = entry - return list(gapfilling_dict.values()), gapfilling_summary + return list(gapfilling_dict.values()), gapfilling_summary - #transform data to be used in tabular format to use in build_model_report + # transform data to be used in tabular format to use in build_model_report def transform_gapfilling_data(self, gapfilling_data): transformed_data = [] for entry in gapfilling_data: @@ -136,22 +178,28 @@ def transform_gapfilling_data(self, gapfilling_data): entry["direction"], entry["target"], entry["gapfilling_sensitivity_id"], - entry["gapfilling_sensitivity_name"] + entry["gapfilling_sensitivity_name"], ] transformed_data.append(row) return transformed_data - - + # Extract ATP analysis data def extract_atp_analysis_data(self, atp_analysis, atp_expansion_filter): entries = [] - if atp_analysis and 'core_atp_gapfilling' in atp_analysis: - for media, data in atp_analysis['core_atp_gapfilling'].items(): - score = data.get('score', None) - new_reactions = ["{}: {}".format(k, v) for k, v in data.get('new', {}).items()] - reversed_reactions = ["{}: {}".format(k, v) for k, v in data.get('reversed', {}).items()] + if atp_analysis and "core_atp_gapfilling" in atp_analysis: + for media, data in atp_analysis["core_atp_gapfilling"].items(): + score = data.get("score", None) + new_reactions = [ + "{}: {}".format(k, v) for k, v in data.get("new", {}).items() + ] + reversed_reactions = [ + "{}: {}".format(k, v) for k, v in data.get("reversed", {}).items() + ] atp_production = "Not integrated" - if "selected_media" in atp_analysis and media in atp_analysis["selected_media"]: + if ( + "selected_media" in atp_analysis + and media in atp_analysis["selected_media"] + ): atp_production = atp_analysis["selected_media"][media] # Extracting the "Filtered Reactions" in the required format @@ -162,28 +210,34 @@ def extract_atp_analysis_data(self, atp_analysis, atp_expansion_filter): if isinstance(sub_v, dict): for reaction, direction_dict in sub_v.items(): direction = list(direction_dict.keys())[0] - filtered_reactions.append(f"{reaction}: {direction}") + filtered_reactions.append( + f"{reaction}: {direction}" + ) filtered_reactions_str = "; ".join(filtered_reactions) if score is not None: - entries.append({ - 'media': media, - 'no_of_gapfilled_reactions': score, - 'atp_production': atp_production, - 'gapfilled_reactions': "; ".join(new_reactions), - 'reversed_reaction_by_gapfilling': "; ".join(reversed_reactions), - 'filtered_reactions': filtered_reactions_str - }) + entries.append( + { + "media": media, + "no_of_gapfilled_reactions": score, + "atp_production": atp_production, + "gapfilled_reactions": "; ".join(new_reactions), + "reversed_reaction_by_gapfilling": "; ".join( + reversed_reactions + ), + "filtered_reactions": filtered_reactions_str, + } + ) # Sorting the entries based on the 'no_of_gapfilled_reactions' column - entries.sort(key=lambda x: x['no_of_gapfilled_reactions']) + entries.sort(key=lambda x: x["no_of_gapfilled_reactions"]) return entries # Extract ATP production data for the ATP Analysis tab def extract_atp_production_data(self, atp_analysis): atp_production_dict = {} if atp_analysis: - selected_media = atp_analysis.get('selected_media', {}) - core_atp_gapfilling = atp_analysis.get('core_atp_gapfilling', {}) + selected_media = atp_analysis.get("selected_media", {}) + core_atp_gapfilling = atp_analysis.get("core_atp_gapfilling", {}) # First, process selected_media for media, value in selected_media.items(): @@ -192,30 +246,36 @@ def extract_atp_production_data(self, atp_analysis): # Next, process core_atp_gapfilling for media not in selected_media for media, data in core_atp_gapfilling.items(): if media not in atp_production_dict: - if data.get('failed'): - atp_production_dict[media] = 'failed' + if data.get("failed"): + atp_production_dict[media] = "failed" else: # If the media was not processed in selected_media and it's not failed, set as 'Not Integrated' - atp_production_dict[media] = 'Not Integrated' + atp_production_dict[media] = "Not Integrated" + + return atp_production_dict - return atp_production_dict - def build_multitab_report(self, output_path): - + # Build overview data overview_data = self.build_overview_data() - + # Get gf_sensitivity attribute from the model - gf_sensitivity = self.modelutl.attributes.get('gf_sensitivity', None) + gf_sensitivity = self.modelutl.attributes.get("gf_sensitivity", None) # Extract gapfilling data - gapfilling_entries, gapfilling_reaction_summary = self.extract_gapfilling_data(gf_sensitivity) + gapfilling_entries, gapfilling_reaction_summary = self.extract_gapfilling_data( + gf_sensitivity + ) # Check if ATP_analysis attribute is present in the model - atp_analysis = self.modelutl.attributes.get('ATP_analysis', None) + atp_analysis = self.modelutl.attributes.get("ATP_analysis", None) if atp_analysis: - atp_expansion_filter = self.modelutl.attributes.get('atp_expansion_filter', {}) - atp_analysis_entries = self.extract_atp_analysis_data(atp_analysis, atp_expansion_filter) + atp_expansion_filter = self.modelutl.attributes.get( + "atp_expansion_filter", {} + ) + atp_analysis_entries = self.extract_atp_analysis_data( + atp_analysis, atp_expansion_filter + ) else: atp_analysis_entries = [] @@ -227,7 +287,7 @@ def build_multitab_report(self, output_path): "genes": [], "biomass": [], "gapfilling": gapfilling_entries, # Populated with gapfilling data - "atpanalysis": atp_analysis_entries # Populated with ATP analysis data + "atpanalysis": atp_analysis_entries, # Populated with ATP analysis data } print("Module Path:", module_path + "/../data/") @@ -235,7 +295,11 @@ def build_multitab_report(self, output_path): exchanges = {r.id for r in self.model.exchanges} # Identify biomass reactions using SBO annotation - biomass_reactions_ids = {rxn.id for rxn in self.model.reactions if rxn.annotation.get('sbo') == 'SBO:0000629'} + biomass_reactions_ids = { + rxn.id + for rxn in self.model.reactions + if rxn.annotation.get("sbo") == "SBO:0000629" + } # Reactions Tab for rxn in self.model.reactions: @@ -246,11 +310,12 @@ def build_multitab_report(self, output_path): "name": rxn.name, "equation": equation, "genes": rxn.gene_reaction_rule, - "gapfilling": "; ".join(gapfilling_reaction_summary.get(rxn.id, [])) # Empty list results in an empty string + "gapfilling": "; ".join( + gapfilling_reaction_summary.get(rxn.id, []) + ), # Empty list results in an empty string } context["reactions"].append(rxn_data) - # Compounds Tab for cpd in self.model.metabolites: cpd_data = { @@ -258,7 +323,7 @@ def build_multitab_report(self, output_path): "name": cpd.name, "formula": cpd.formula, "charge": cpd.charge, - "compartment": cpd.compartment + "compartment": cpd.compartment, } context["compounds"].append(cpd_data) @@ -266,7 +331,7 @@ def build_multitab_report(self, output_path): for gene in self.model.genes: gene_data = { "gene": gene.id, - "reactions": "; ".join([rxn.id for rxn in gene.reactions]) + "reactions": "; ".join([rxn.id for rxn in gene.reactions]), } context["genes"].append(gene_data) @@ -276,22 +341,22 @@ def build_multitab_report(self, output_path): biomass_rxn = self.model.reactions.get_by_id(biomass_rxn_id) for metabolite, coefficient in biomass_rxn.metabolites.items(): compound_id = metabolite.id - compound_name = metabolite.name.split('_')[0] - compartment = compound_id.split('_')[-1] + compound_name = metabolite.name.split("_")[0] + compartment = compound_id.split("_")[-1] biomass_data = { "biomass_reaction_id": biomass_rxn.id, "biomass_compound_id": compound_id, "name": compound_name, "coefficient": coefficient, - "compartment": compartment + "compartment": compartment, } context["biomass"].append(biomass_data) else: print("No biomass reactions found in the model.") # Gapfilling Tab - gf_sensitivity = self.modelutl.attributes.get('gf_sensitivity', None) + gf_sensitivity = self.modelutl.attributes.get("gf_sensitivity", None) gapfilling_data = self.extract_gapfilling_data(gf_sensitivity) context["gapfilling"] = gapfilling_entries @@ -300,8 +365,8 @@ def build_multitab_report(self, output_path): # Populate the 'atpanalysis' context with ATP production data for entry in context["atpanalysis"]: - media = entry['media'] - entry['atp_production'] = atp_production_data.get(media, None) + media = entry["media"] + entry["atp_production"] = atp_production_data.get(media, None) # Diagnostics unique_biomass_rxns = biomass_reactions_ids @@ -327,7 +392,7 @@ def build_multitab_report(self, output_path): print("\nFirst 2 gapfilling entries:") for gf in context["gapfilling"][:2]: print(gf) - + print("\nFirst 2 ATP Analysis entries:") for entry in context["atpanalysis"][:2]: print(entry) @@ -335,15 +400,14 @@ def build_multitab_report(self, output_path): # Render with template env = jinja2.Environment( loader=jinja2.FileSystemLoader(module_path + "/../data/"), - autoescape=jinja2.select_autoescape(['html', 'xml']) + autoescape=jinja2.select_autoescape(["html", "xml"]), ) html = env.get_template("ModelReportTemplate.html").render(context) directory = dirname(output_path) os.makedirs(directory, exist_ok=True) - with open(output_path, 'w') as f: + with open(output_path, "w") as f: f.write(html) - - + def build_report(self, output_path): """Builds model HTML report for the Model Summary table Parameters @@ -359,40 +423,95 @@ def build_report(self, output_path): # 2. Transform the dictionary into a list of tuples model_summary_list = [(key, value) for key, value in model_summary_data.items()] # 3. Convert to DataFrame - model_summary_df = pd.DataFrame(model_summary_list, columns=['', '']) + model_summary_df = pd.DataFrame(model_summary_list, columns=["", ""]) # Style the DataFrame (as was done previously) - model_summary_df_styled = ( - model_summary_df.style.hide(axis="index") - .set_table_styles([ - {'selector': 'th', 'props': [('border', 'none'), ('background-color', 'white'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, - {'selector': 'td', 'props': [('border', 'none'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, - {'selector': 'tr:nth-child(even)', 'props': [('background-color', 'white')]}, - {'selector': 'tr:nth-child(odd)', 'props': [('background-color', '#f2f2f2')]}, - ]) + model_summary_df_styled = model_summary_df.style.hide( + axis="index" + ).set_table_styles( + [ + { + "selector": "th", + "props": [ + ("border", "none"), + ("background-color", "white"), + ("font-family", "Oxygen"), + ("font-size", "14px"), + ("line-height", "20px"), + ], + }, + { + "selector": "td", + "props": [ + ("border", "none"), + ("font-family", "Oxygen"), + ("font-size", "14px"), + ("line-height", "20px"), + ], + }, + { + "selector": "tr:nth-child(even)", + "props": [("background-color", "white")], + }, + { + "selector": "tr:nth-child(odd)", + "props": [("background-color", "#f2f2f2")], + }, + ] ) # Fetching the gapfilling sensitivity data - gf_sensitivity = self.modelutl.attributes.get('gf_sensitivity', None) + gf_sensitivity = self.modelutl.attributes.get("gf_sensitivity", None) gapfilling_data = self.extract_gapfilling_data(gf_sensitivity) gapfilling_list = self.transform_gapfilling_data(gapfilling_data[0]) # Convert the gapfilling_list to a DataFrame gapfillings_analysis_df = pd.DataFrame( - gapfilling_list, + gapfilling_list, columns=[ - "Reaction ID", "Reaction Name", "Media", "Direction", "Target", "Gapfilling Sensitivity ID", "Gapfilling Sensitivity Name"] + "Reaction ID", + "Reaction Name", + "Media", + "Direction", + "Target", + "Gapfilling Sensitivity ID", + "Gapfilling Sensitivity Name", + ], ) # Apply style to Gapfillings Analysis DataFrame - gapfillings_analysis_df_styled = ( - gapfillings_analysis_df.style.hide(axis="index") - .set_table_styles([ - {'selector': 'th', 'props': [('border', 'none'), ('background-color', 'white'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, - {'selector': 'td', 'props': [('border', 'none'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, - {'selector': 'tr:nth-child(even)', 'props': [('background-color', 'white')]}, - {'selector': 'tr:nth-child(odd)', 'props': [('background-color', '#f2f2f2')]}, - ]) + gapfillings_analysis_df_styled = gapfillings_analysis_df.style.hide( + axis="index" + ).set_table_styles( + [ + { + "selector": "th", + "props": [ + ("border", "none"), + ("background-color", "white"), + ("font-family", "Oxygen"), + ("font-size", "14px"), + ("line-height", "20px"), + ], + }, + { + "selector": "td", + "props": [ + ("border", "none"), + ("font-family", "Oxygen"), + ("font-size", "14px"), + ("line-height", "20px"), + ], + }, + { + "selector": "tr:nth-child(even)", + "props": [("background-color", "white")], + }, + { + "selector": "tr:nth-child(odd)", + "props": [("background-color", "#f2f2f2")], + }, + ] ) # Legend for Gapfillings Analysis @@ -414,22 +533,48 @@ def build_report(self, output_path): """ # Extract ATP analysis data - atp_analysis = self.modelutl.attributes.get('ATP_analysis', None) - atp_expansion_filter = self.modelutl.attributes.get('atp_expansion_filter', {}) - atp_analysis_entries = self.extract_atp_analysis_data(atp_analysis, atp_expansion_filter) + atp_analysis = self.modelutl.attributes.get("ATP_analysis", None) + atp_expansion_filter = self.modelutl.attributes.get("atp_expansion_filter", {}) + atp_analysis_entries = self.extract_atp_analysis_data( + atp_analysis, atp_expansion_filter + ) # Convert the atp_analysis_entries list to a DataFrame atp_analysis_df = pd.DataFrame(atp_analysis_entries) # Apply style to ATP Analysis DataFrame - atp_analysis_df_styled = ( - atp_analysis_df.style.hide(axis="index") - .set_table_styles([ - {'selector': 'th', 'props': [('border', 'none'), ('background-color', 'white'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, - {'selector': 'td', 'props': [('border', 'none'), ('font-family', 'Oxygen'), ('font-size', '14px'), ('line-height', '20px')]}, - {'selector': 'tr:nth-child(even)', 'props': [('background-color', 'white')]}, - {'selector': 'tr:nth-child(odd)', 'props': [('background-color', '#f2f2f2')]}, - ]) + atp_analysis_df_styled = atp_analysis_df.style.hide( + axis="index" + ).set_table_styles( + [ + { + "selector": "th", + "props": [ + ("border", "none"), + ("background-color", "white"), + ("font-family", "Oxygen"), + ("font-size", "14px"), + ("line-height", "20px"), + ], + }, + { + "selector": "td", + "props": [ + ("border", "none"), + ("font-family", "Oxygen"), + ("font-size", "14px"), + ("line-height", "20px"), + ], + }, + { + "selector": "tr:nth-child(even)", + "props": [("background-color", "white")], + }, + { + "selector": "tr:nth-child(odd)", + "props": [("background-color", "#f2f2f2")], + }, + ] ) # Legend for ATP Analysis @@ -442,9 +587,9 @@ def build_report(self, output_path):
  • Reversed Reaction by Gapfilling: Reactions that have been reversed during the gapfilling process.
  • Filtered Reactions: Reactions that have been filtered out during the analysis. When a reaction addition would lead to a large increase in ATP production or an infinite energy loop, we filter that reaction out of the gapfilling database and prevent it from being added to the model.
  • - """ - - #ATP analysis explanation text + """ + + # ATP analysis explanation text explanation_text_atp_analysis = """

    During model reconstruction, we analyze the genome’s core metabolism draft model (model without gapfilling) to assess energy biosynthesis capabilities. The goal of this analysis is to ensure the core metabolism model is able to produce ATP before we expand the model to the genome-scale. @@ -458,30 +603,34 @@ def build_report(self, output_path): In cases where is known from the literature or unpublished experimental results that an organism is capable of producing ATP in a given media condition that requires gapfilling in this analysis, you can use the parameter “Force ATP media” in the reconstruction app to ensure those reactions are integrated into the model. .

    """ - + # Save the data to HTML with the styled DataFrames and the legends directory = os.path.dirname(output_path) os.makedirs(directory, exist_ok=True) - with open(output_path, 'w', encoding='utf-8') as f: + with open(output_path, "w", encoding="utf-8") as f: f.write('') - f.write('

    Model Summary

    ') + f.write("

    Model Summary

    ") f.write(model_summary_df_styled.render(escape=False)) - f.write('

    ') - f.write('

    Gapfillings Analysis

    ') + f.write("

    ") + f.write("

    Gapfillings Analysis

    ") # Check for Gapfillings Analysis data if not gapfillings_analysis_df.empty: f.write(gapfillings_analysis_df_styled.render(escape=False)) - f.write(f'

    Legend:

    {annotations_text_gapfillings}') + f.write(f"

    Legend:

    {annotations_text_gapfillings}") else: - f.write('

    Warning: No Gapfillings Analysis data available for this model.

    ') + f.write( + "

    Warning: No Gapfillings Analysis data available for this model.

    " + ) - f.write('

    Core ATP Analysis

    ') + f.write("

    Core ATP Analysis

    ") # Check for ATP Analysis data if not atp_analysis_df.empty: f.write(atp_analysis_df_styled.render(escape=False)) - f.write(f'

    Legend:

    {annotations_text_atp_analysis}') + f.write(f"

    Legend:

    {annotations_text_atp_analysis}") f.write(explanation_text_atp_analysis) else: - f.write('

    Warning: No Core ATP Analysis data available for this model.

    ') \ No newline at end of file + f.write( + "

    Warning: No Core ATP Analysis data available for this model.

    " + ) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 19b3497a..5f6440ce 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -299,9 +299,7 @@ def save_attributes(self, value=None, key=None): else: self.attributes = value if hasattr(self.model, "computed_attributes"): - logger.info( - "Setting FBAModel computed_attributes to mdlutl attributes" - ) + logger.info("Setting FBAModel computed_attributes to mdlutl attributes") self.attributes["gene_count"] = len(self.model.genes) self.model.computed_attributes = self.attributes @@ -902,7 +900,11 @@ def binary_expansion_test(self, reaction_list, condition, currmodel, depth=0): return filtered_list def reaction_expansion_test( - self, reaction_list, condition_list, binary_search=True,attribute_label="gf_filter" + self, + reaction_list, + condition_list, + binary_search=True, + attribute_label="gf_filter", ): """Adds reactions in reaction list one by one and appplies tests, filtering reactions that fail diff --git a/modelseedpy/fbapkg/elementuptakepkg.py b/modelseedpy/fbapkg/elementuptakepkg.py index 8348e602..1f61f7a8 100644 --- a/modelseedpy/fbapkg/elementuptakepkg.py +++ b/modelseedpy/fbapkg/elementuptakepkg.py @@ -16,31 +16,33 @@ def __init__(self, model): {"elements": "string"}, ) - def build_package(self, element_limits,exception_compounds=[],exception_reactions=[]): - #Converting exception compounds list into exception reaction list + def build_package( + self, element_limits, exception_compounds=[], exception_reactions=[] + ): + # Converting exception compounds list into exception reaction list self.parameters = { - "element_limits" : element_limits, - "exception_compounds" : exception_compounds, - "exception_reactions" : exception_reactions + "element_limits": element_limits, + "exception_compounds": exception_compounds, + "exception_reactions": exception_reactions, } exchange_hash = self.modelutl.exchange_hash() for met in exception_compounds: if met in exchange_hash: exception_reactions.append(exchange_hash[met]) - #Now building or rebuilding constraints + # Now building or rebuilding constraints for element in element_limits: if element not in self.variables["elements"]: self.build_variable(element, element_limits[element]) for element in element_limits: - #This call will first remove existing constraints then build the new constraint - self.build_constraint(element,exception_reactions) + # This call will first remove existing constraints then build the new constraint + self.build_constraint(element, exception_reactions) def build_variable(self, element, limit): return BaseFBAPkg.build_variable( self, "elements", 0, limit, "continuous", element ) - def build_constraint(self, element,exception_reactions): + def build_constraint(self, element, exception_reactions): coef = {self.variables["elements"][element]: -1} rxnlist = self.modelutl.exchange_list() for reaction in rxnlist: diff --git a/modelseedpy/fbapkg/kbasemediapkg.py b/modelseedpy/fbapkg/kbasemediapkg.py index b377547e..9dc9b315 100644 --- a/modelseedpy/fbapkg/kbasemediapkg.py +++ b/modelseedpy/fbapkg/kbasemediapkg.py @@ -40,7 +40,9 @@ def build_package( self.parameters["default_uptake"] = 0 if self.parameters["default_excretion"] is None: self.parameters["default_excretion"] = 100 - if (self.parameters["media"] and self.parameters["media"].name == "Complete") and self.parameters["default_uptake"] == 0: + if ( + self.parameters["media"] and self.parameters["media"].name == "Complete" + ) and self.parameters["default_uptake"] == 0: self.parameters["default_uptake"] = 100 # First initializing all exchanges to default uptake and excretion From 67eb8c2be275e3cab7a7f95aee013aa8bda389be Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 23 Sep 2023 12:04:01 -0500 Subject: [PATCH 184/298] Beginning implementation of global gapfill method --- modelseedpy/core/msgapfill.py | 87 +++++++++++++++++------------ modelseedpy/fbapkg/gapfillingpkg.py | 48 +++++++++++++++- 2 files changed, 98 insertions(+), 37 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 39de2e3e..db3ed703 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -11,7 +11,7 @@ logger = logging.getLogger(__name__) logger.setLevel( - logging.INFO#WARNING + logging.INFO # WARNING ) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO @@ -148,11 +148,13 @@ def prefilter(self, media, target): self.gfpkgmgr.getpkg("GapfillingPkg").filter_database_based_on_tests( self.test_conditions ) - gf_filter = self.gfpkgmgr.getpkg("GapfillingPkg").modelutl.get_attributes("gf_filter", {}) + gf_filter = self.gfpkgmgr.getpkg("GapfillingPkg").modelutl.get_attributes( + "gf_filter", {} + ) base_filter = self.mdlutl.get_attributes("gf_filter", {}) for media_id in gf_filter: base_filter[media_id] = gf_filter[media_id] - + # Testing if gapfilling can work after filtering if not self.test_gapfill_database(media, target, before_filtering=False): return False @@ -176,7 +178,7 @@ def run_gapfilling( Name or expression describing the reaction or combination of reactions to the optimized minimum_obj : double Value to use for the minimal objective threshold that the model must be gapfilled to achieve - binary_check : bool + binary_check : bool Indicates if the solution should be checked to ensure it is minimal in the number of reactions involved prefilter : bool Indicates if the gapfilling database should be prefiltered using the tests provided in the MSGapfill constructor before running gapfilling @@ -264,6 +266,7 @@ def run_multi_gapfill( binary_check=False, prefilter=True, check_for_growth=True, + simultaneous_gapfilling=False, ): """Run gapfilling across an array of media conditions ultimately using different integration policies: simultaneous gapfilling, independent gapfilling, cumulative gapfilling Parameters @@ -276,32 +279,41 @@ def run_multi_gapfill( Media-specific minimal objective thresholds that the model must be gapfilled to achieve default_minimum_objective : double Default value to use for the minimal objective threshold that the model must be gapfilled to achieve - binary_check : bool + binary_check : bool Indicates if the solution should be checked to ensure it is minimal in the number of reactions involved prefilter : bool Indicates if the gapfilling database should be prefiltered using the tests provided in the MSGapfill constructor before running gapfilling check_for_growth : bool Indicates if the model should be checked to ensure that the resulting gapfilling solution produces a nonzero objective """ - + if not default_minimum_objective: default_minimum_objective = self.default_minimum_objective - first = True solution_dictionary = {} - for item in media_list: - minimum_obj = default_minimum_objective - if item in minimum_objectives: - minimum_obj = minimum_objectives[item] - if first: - solution_dictionary[item] = self.run_gapfilling( - item, target, minimum_obj, binary_check, prefilter, check_for_growth - ) - else: - solution_dictionary[item] = self.run_gapfilling( - item, None, minimum_obj, binary_check, False, check_for_growth - ) - false = False - return solution_dictionary + if simultaneous_gapfilling: + for item in media_list: + pass + else: + first = True + for item in media_list: + minimum_obj = default_minimum_objective + if item in minimum_objectives: + minimum_obj = minimum_objectives[item] + if first: + solution_dictionary[item] = self.run_gapfilling( + item, + target, + minimum_obj, + binary_check, + prefilter, + check_for_growth, + ) + else: + solution_dictionary[item] = self.run_gapfilling( + item, None, minimum_obj, binary_check, False, check_for_growth + ) + false = False + return solution_dictionary def integrate_gapfill_solution( self, solution, cumulative_solution=[], link_gaps_to_objective=True @@ -347,8 +359,8 @@ def integrate_gapfill_solution( cumulative_solution.append([rxn_id, "<"]) rxn.upper_bound = 0 rxn.lower_bound = -100 - - #Sometimes for whatever reason, the solution includes useless reactions that should be stripped out before saving the final model + + # Sometimes for whatever reason, the solution includes useless reactions that should be stripped out before saving the final model unneeded = self.mdlutl.test_solution( solution, keep_changes=True ) # Strips out unneeded reactions - which undoes some of what is done above @@ -357,11 +369,16 @@ def integrate_gapfill_solution( if item[0] == oitem[0] and item[1] == oitem[1]: cumulative_solution.remove(oitem) break - #Adding the gapfilling solution data to the model, which is needed for saving the model in KBase + # Adding the gapfilling solution data to the model, which is needed for saving the model in KBase self.mdlutl.add_gapfilling(solution) - #Testing which gapfilled reactions are needed to produce each reactant in the objective function + # Testing which gapfilled reactions are needed to produce each reactant in the objective function if link_gaps_to_objective: - logger.info("Gapfilling sensitivity analysis running on succesful run in "+solution["media"].id+" for target "+solution["target"]) + logger.info( + "Gapfilling sensitivity analysis running on succesful run in " + + solution["media"].id + + " for target " + + solution["target"] + ) gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) if solution["media"].id not in gf_sensitivity: gf_sensitivity[solution["media"].id] = {} @@ -375,25 +392,23 @@ def integrate_gapfill_solution( self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") self.cumulative_gapfilling.extend(cumulative_solution) - def compute_reaction_weights_from_expression_data( - self, omics_data, conditions=[] - ): + def compute_reaction_weights_from_expression_data(self, omics_data, conditions=[]): """Computing reaction weights based on input gene-level omics data Parameters ---------- omics_data : pandas dataframe with genes as rows and conditions as columns Specifies the reactions to be added to the model to implement the gapfilling solution conditions : list - Optional array containing the IDs of the columns in omics_data from which data should be used. + Optional array containing the IDs of the columns in omics_data from which data should be used. If an empty array (or no array) is supplied, data from all columns will be used. When multiple columns are used, the data from those columns should be normalized first, then added together """ - #Validitions: - #1.) An conditions listed in the conditions argument should match the columns in the omics_data dataframe - #2.) Most (~80%) of the genes in the model should match genes in the omics_data dataframe - #3.) The omics_data dataframe should have at least 2 columns - #4.) The omics_data dataframe should have at least 2 rows - #5.) Logging should be used to report out which genes in the model don't match any genes in the omics_data dataframe + # Validitions: + # 1.) An conditions listed in the conditions argument should match the columns in the omics_data dataframe + # 2.) Most (~80%) of the genes in the model should match genes in the omics_data dataframe + # 3.) The omics_data dataframe should have at least 2 columns + # 4.) The omics_data dataframe should have at least 2 rows + # 5.) Logging should be used to report out which genes in the model don't match any genes in the omics_data dataframe pass @staticmethod diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index 74a097df..dbc1441e 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -32,8 +32,15 @@ class GapfillingPkg(BaseFBAPkg): """ """ def __init__(self, model): - BaseFBAPkg.__init__(self, model, "gapfilling", {}, {}) + BaseFBAPkg.__init__( + self, + model, + "gapfilling", + {"rmaxf": "reaction", "fmaxf": "reaction"}, + {"rmaxfc": "reaction", "fmaxfc": "reaction"}, + ) self.gapfilling_penalties = None + self.maxflux_variables = {} def build(self, template, minimum_objective=0.01): parameters = { @@ -81,6 +88,7 @@ def build_package(self, parameters): "default_uptake": 100, "minimum_obj": 0.01, "minimize_exchanges": False, + "add_max_flux_variables": False, "blacklist": [], }, ) @@ -165,6 +173,44 @@ def build_package(self, parameters): self.model.solver.update() + # Creating max flux variables and constraints to be used for global gapfilling and other formulations + if self.parameters["add_max_flux_variables"]: + for reaction in self.model.reactions: + if reaction.id in self.gapfilling_penalties: + if "reverse" in self.gapfilling_penalties[reaction.id]: + self.maxflux_variables[reaction.id][ + "reverse" + ] = self.build_variable( + "rmaxf", 0, 1000, "continuous", reaction + ) + self.build_constraint( + "rmaxfc", + 0, + None, + { + reaction.reverse_variable: -1, + self.maxflux_variables[reaction.id]["reverse"]: 1, + }, + reaction, + ) + if "forward" in self.gapfilling_penalties[reaction.id]: + self.maxflux_variables[reaction.id][ + "forward" + ] = self.build_variable( + "fmaxf", 0, 1000, "continuous", reaction + ) + self.build_constraint( + "fmaxfc", + 0, + None, + { + reaction.forward_variable: -1, + self.maxflux_variables[reaction.id]["forward"]: 1, + }, + reaction, + ) + + # Creating the gapfilling objective function and saving it under self.parameters["gfobj"] reaction_objective = self.model.problem.Objective(Zero, direction="min") obj_coef = dict() for reaction in self.model.reactions: From 9de1e73654b74f40fe012cb911c7dbbc6fb0db58 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 23 Sep 2023 23:36:18 -0500 Subject: [PATCH 185/298] Enabling phenotypes to ignore growth data --- modelseedpy/core/msgrowthphenotypes.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 75e356c4..51d25a92 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -62,6 +62,7 @@ def simulate( add_missing_exchanges=False, save_fluxes=False, pfba=False, + ignore_growth_data=False, ): """Simulates a single phenotype Parameters @@ -76,6 +77,8 @@ def simulate( Indicates if the fluxes should be saved and returned with the results pfba : bool Runs pFBA to compute fluxes after initially solving for growth + ignore_growth_data : bool + Indicates if existing growth data in the phenotype should be ignored when computing the class of the simulated phenotype """ modelutl = model_or_mdlutl if not isinstance(model_or_mdlutl, MSModelUtil): @@ -142,7 +145,7 @@ def simulate( if output["growth"] >= output["baseline_growth"] * growth_multiplier: output["GROWING"] = True - if not self.growth: + if not self.growth or ignore_growth_data: output["class"] = "GROWTH" elif self.growth > 0: output["class"] = "CP" @@ -150,7 +153,7 @@ def simulate( output["class"] = "FP" else: output["GROWING"] = False - if not self.growth: + if not self.growth or ignore_growth_data: output["class"] = "NOGROWTH" elif self.growth > 0: output["class"] = "FN" @@ -417,6 +420,7 @@ def simulate_phenotypes( gapfill_negatives=False, msgapfill=None, test_conditions=None, + ignore_growth_data=False ): """Simulates all the specified phenotype conditions and saves results Parameters @@ -431,6 +435,8 @@ def simulate_phenotypes( Boolean indicating if exchanges for compounds mentioned explicitly in phenotype media should be added to the model automatically save_fluxes : bool Indicates if the fluxes should be saved and returned with the results + ignore_growth_data : bool + Indicates if existing growth data in the phenotype set should be ignored when computing the class of a simulated phenotype """ # Discerning input is model or mdlutl and setting internal links modelutl = model_or_mdlutl @@ -464,6 +470,7 @@ def simulate_phenotypes( growth_multiplier, add_missing_exchanges, save_fluxes, + ignore_growth_data=ignore_growth_data, ) data["Class"].append(result["class"]) data["Phenotype"].append(pheno.id) From 0f8ddc8c617babdf761d2545261966b8bf2f3058 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 4 Oct 2023 16:03:21 -0500 Subject: [PATCH 186/298] fixing bug in msatpcorrection --- modelseedpy/core/msatpcorrection.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 083fc719..8c717f87 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -178,8 +178,7 @@ def load_default_medias(self): media = MSMedia.from_dict(media_d) media.id = media_id media.name = media_id - min_obj = 0.01 - self.atp_medias.append([media, min_gap.get(media_d, min_obj)]) + self.atp_medias.append([media, min_gap.get(media_id, 0.01)]) @staticmethod def find_reaction_in_template(model_reaction, template, compartment): From 1e7b63ae2a1882092ebed4851b0e30a5a2cbf7f3 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 4 Oct 2023 16:14:37 -0500 Subject: [PATCH 187/298] Fixing ID in phenotype simulation output --- modelseedpy/core/msgrowthphenotypes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 51d25a92..5e05b72c 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -283,7 +283,7 @@ def from_kbase_object( for added_cpd in pheno["additionalcompound_refs"]: added_compounds.append(added_cpd.split("/").pop()) newpheno = MSGrowthPhenotype( - pheno["id"], media, pheno["normalizedGrowth"], geneko, added_compounds + media.info[1], media, pheno["normalizedGrowth"], geneko, added_compounds ) new_phenos.append(newpheno) growthpheno.add_phenotypes(new_phenos) From a3d13c72b2736bd43181004efd52be5b69c39e6b Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 4 Oct 2023 16:39:07 -0500 Subject: [PATCH 188/298] Fixing threshold for pyruvate and fixing bug in multigapfilling --- modelseedpy/core/msatpcorrection.py | 1 + modelseedpy/core/msgapfill.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 8c717f87..cac50863 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -48,6 +48,7 @@ } default_threshold_multipiers = { + "Pyr": 2, "Glc": 2, "default": 1.2, } diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index db3ed703..f3487dcb 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -312,7 +312,7 @@ def run_multi_gapfill( solution_dictionary[item] = self.run_gapfilling( item, None, minimum_obj, binary_check, False, check_for_growth ) - false = False + first = False return solution_dictionary def integrate_gapfill_solution( From 967239d1d16a62955455de777e486092ba60bf7c Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 4 Oct 2023 23:24:49 -0500 Subject: [PATCH 189/298] Fixing phenotype id code --- modelseedpy/core/msgrowthphenotypes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 5e05b72c..ce6fbdff 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -283,7 +283,7 @@ def from_kbase_object( for added_cpd in pheno["additionalcompound_refs"]: added_compounds.append(added_cpd.split("/").pop()) newpheno = MSGrowthPhenotype( - media.info[1], media, pheno["normalizedGrowth"], geneko, added_compounds + media.info.id, media, pheno["normalizedGrowth"], geneko, added_compounds ) new_phenos.append(newpheno) growthpheno.add_phenotypes(new_phenos) From 5b321eec3c61c70ff66d8d02d22e5f220ec955a4 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 5 Oct 2023 23:04:48 -0500 Subject: [PATCH 190/298] Setting debug messages to understanding hanging during sensitivity analysis --- modelseedpy/core/msmodelutl.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index a8c836ee..57e3871a 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -1047,7 +1047,7 @@ def find_unproducible_biomass_compounds(self, target_rxn="bio1", ko_list=None): else: output = {} for item in ko_list: - logger.debug("KO:" + item[0] + item[1]) + logger.info("KO:" + item[0] + item[1]) if item[0] not in output: output[item[0]] = {} if item[0] in tempmodel.reactions: @@ -1086,6 +1086,7 @@ def run_biomass_dependency_test( if objective > 0: target_rxn.lower_bound = 0.1 tempmodel.objective = min_flex_obj + logger.info("Optimizing with min flex objective") solution = tempmodel.optimize() biocpds = [] for reaction in tempmodel.reactions: @@ -1093,7 +1094,7 @@ def run_biomass_dependency_test( reaction.forward_variable.primal > Zero or reaction.reverse_variable.primal > Zero ): - logger.debug("Depends on:" + reaction.id) + logger.info("Depends on:" + reaction.id) label = reaction.id[5:] for item in rxn_list: if label[0 : len(item)] == item: From a523de85fbae530323c6a60056316fbbc8aa4246 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sun, 8 Oct 2023 00:11:02 -0500 Subject: [PATCH 191/298] Fixing problem with solution integration during multigapfill --- modelseedpy/core/msgapfill.py | 21 ++++++++++++++---- modelseedpy/core/msmodelutl.py | 40 ++++++++++++++++++++++++---------- 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index f3487dcb..c57f56f9 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -325,7 +325,12 @@ def integrate_gapfill_solution( Specifies the reactions to be added to the model to implement the gapfilling solution cumulative_solution : list Optional array to cumulatively track all reactions added to the model when integrating multiple solutions + link_gaps_to_objective : bool + Indicates if biomass sensitivity analysis should be run on the specified gapfilling solution """ + #Computing the initial length of cumulative solution before integrating current solution + starting_length = len(cumulative_solution) + #Reversing reactions reported by gapfilling solution in the model for rxn_id in solution["reversed"]: rxn = self.model.reactions.get_by_id(rxn_id) if solution["reversed"][rxn_id] == ">" and rxn.upper_bound <= 0: @@ -334,6 +339,8 @@ def integrate_gapfill_solution( elif solution["reversed"][rxn_id] == "<" and rxn.lower_bound >= 0: cumulative_solution.append([rxn_id, "<"]) rxn.lower_bound = -100 + + #Adding new reactions from the gapfilling solution into the model for rxn_id in solution["new"]: if rxn_id not in self.model.reactions: rxn = self.gfmodel.reactions.get_by_id(rxn_id) @@ -362,11 +369,12 @@ def integrate_gapfill_solution( # Sometimes for whatever reason, the solution includes useless reactions that should be stripped out before saving the final model unneeded = self.mdlutl.test_solution( - solution, keep_changes=True + solution, keep_changes=True, cumulative_solution=cumulative_solution, starting_cumulative_solution_length=starting_length ) # Strips out unneeded reactions - which undoes some of what is done above for item in unneeded: - for oitem in cumulative_solution: - if item[0] == oitem[0] and item[1] == oitem[1]: + for i,oitem in enumerate(cumulative_solution): + #Only remove unneeded from cumulative solution if it was added in this specific solution + if i >= starting_length and item[0] == oitem[0] and item[1] == oitem[1]: cumulative_solution.remove(oitem) break # Adding the gapfilling solution data to the model, which is needed for saving the model in KBase @@ -379,6 +387,11 @@ def integrate_gapfill_solution( + " for target " + solution["target"] ) + test_solution = [] + for rxn_id in solution["reversed"]: + test_solution.append([rxn_id, solution["reversed"][rxn_id]]) + for rxn_id in solution["new"]: + test_solution.append([rxn_id, solution["new"][rxn_id]]) gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) if solution["media"].id not in gf_sensitivity: gf_sensitivity[solution["media"].id] = {} @@ -387,7 +400,7 @@ def integrate_gapfill_solution( gf_sensitivity[solution["media"].id][solution["target"]][ "success" ] = self.mdlutl.find_unproducible_biomass_compounds( - solution["target"], cumulative_solution + solution["target"], test_solution ) self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") self.cumulative_gapfilling.extend(cumulative_solution) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 57e3871a..95cb75bc 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -519,16 +519,22 @@ def convert_cobra_reaction_to_kbreaction( ################################################################################# # Functions related to gapfilling of models ################################################################################# - """Tests if every reaction in a given gapfilling solution is actually needed for growth + def test_solution(self, solution, keep_changes=False,cumulative_solution=[], starting_cumulative_solution_length=0): + """Tests if every reaction in a given gapfilling solution is actually needed for growth Optionally can remove unneeded reactions from the model AND the solution object. Note, this code assumes the gapfilling solution is already integrated. Parameters ---------- - {"new":{string reaction_id: string direction},"reversed":{string reaction_id: string direction}} - solution + solution : {"new":{string reaction_id: string direction},"reversed":{string reaction_id: string direction}} Data for gapfilling solution to be tested - bool - keep_changes + keep_changes : bool Set this bool to True to remove the unneeded reactions from the solution and model + cumulative_solution : + List of reactions already loaded into the model across multiple gapfilling runs + starting_cumulative_solution_length : int + Position in the cumulative solution where the current solution starts (should not remove previously integrated reactions) + Returns ------- list> @@ -537,8 +543,6 @@ def convert_cobra_reaction_to_kbreaction( Raises ------ """ - - def test_solution(self, solution, keep_changes=False): unneeded = [] removed_rxns = [] tempmodel = self.model @@ -568,8 +572,7 @@ def test_solution(self, solution, keep_changes=False): ) rxnobj.upper_bound = original_bound else: - removed_rxns.append(rxnobj) - unneeded.append([rxn_id, solution[key][rxn_id], key]) + unneeded.append([rxn_id, solution[key][rxn_id], key,original_bound]) logger.info( rxn_id + solution[key][rxn_id] @@ -591,14 +594,27 @@ def test_solution(self, solution, keep_changes=False): ) rxnobj.lower_bound = original_bound else: - removed_rxns.append(rxnobj) - unneeded.append([rxn_id, solution[key][rxn_id], key]) + unneeded.append([rxn_id, solution[key][rxn_id], key,original_bound]) logger.info( rxn_id + solution[key][rxn_id] + " not needed:" + str(objective) ) + #Iterating over unneeded reactions, and if they are not in the previous cumulative solution, then we add them to the remove list + for item in unneeded: + rxnobj = tempmodel.reactions.get_by_id(item[0]) + found = False + for i in range(0,starting_cumulative_solution_length): + if item[0] in cumulative_solution[i][0] and item[1] in cumulative_solution[i][1]: + found = True + if item[1] == ">": + rxnobj.upper_bound = item[3] + else: + rxnobj.lower_bound = item[3] + break + if not found and rxnobj.lower_bound == 0 and rxnobj.upper_bound == 0: + removed_rxns.append(rxnobj) if keep_changes: tempmodel.remove_reactions(removed_rxns) for items in unneeded: @@ -1047,7 +1063,7 @@ def find_unproducible_biomass_compounds(self, target_rxn="bio1", ko_list=None): else: output = {} for item in ko_list: - logger.info("KO:" + item[0] + item[1]) + logger.debug("KO:" + item[0] + item[1]) if item[0] not in output: output[item[0]] = {} if item[0] in tempmodel.reactions: @@ -1075,6 +1091,7 @@ def find_unproducible_biomass_compounds(self, target_rxn="bio1", ko_list=None): ) rxnobj.lower_bound = original_bound else: + logger.info("Reaction "+item[0]+" not in model during sensitivity analysis!") output[item[0]][item[1]] = [] return output @@ -1086,7 +1103,6 @@ def run_biomass_dependency_test( if objective > 0: target_rxn.lower_bound = 0.1 tempmodel.objective = min_flex_obj - logger.info("Optimizing with min flex objective") solution = tempmodel.optimize() biocpds = [] for reaction in tempmodel.reactions: @@ -1094,7 +1110,7 @@ def run_biomass_dependency_test( reaction.forward_variable.primal > Zero or reaction.reverse_variable.primal > Zero ): - logger.info("Depends on:" + reaction.id) + logger.debug("Depends on:" + reaction.id) label = reaction.id[5:] for item in rxn_list: if label[0 : len(item)] == item: From dfca4627b620d9e2f90ee499152bf6f5e68c7da4 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Mon, 9 Oct 2023 23:43:58 -0500 Subject: [PATCH 192/298] update rast call --- modelseedpy/core/rast_client.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modelseedpy/core/rast_client.py b/modelseedpy/core/rast_client.py index ebe06cb5..fc575237 100644 --- a/modelseedpy/core/rast_client.py +++ b/modelseedpy/core/rast_client.py @@ -52,10 +52,8 @@ def __init__(self): ) self.stages = [ {"name": "annotate_proteins_kmer_v2", "kmer_v2_parameters": {}}, - { - "name": "annotate_proteins_kmer_v1", - "kmer_v1_parameters": {"annotate_hypothetical_only": 1}, - }, + # {"name": "annotate_proteins_kmer_v1", + # "kmer_v1_parameters": {"annotate_hypothetical_only": 1},}, { "name": "annotate_proteins_similarity", "similarity_parameters": {"annotate_hypothetical_only": 1}, From 7aa4d4610827c85302a6c9b27ff5dc9339fa4b8d Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 11 Oct 2023 14:06:27 -0500 Subject: [PATCH 193/298] Adding function to build modelutl from file --- modelseedpy/core/msmodelutl.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 95cb75bc..cdd9b680 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -98,6 +98,22 @@ def get(model, create_if_missing=True): else: return None + @staticmethod + def build_from_kbase_json_file(filename, kbaseapi): + """ + Builds an MSModelUtil object from a KBase JSON file. + + Args: + filename (str): The path to the KBase JSON file. + kbaseapi (KBaseAPI): An instance of the KBase API. + + Returns: + An MSModelUtil object representing the contents of the KBase JSON file. + """ + factory = kbaseapi.KBaseObjectFactory() + model = factory.build_object_from_file(filename, "KBaseFBA.FBAModel") + return MSModelUtil(model) + def __init__(self, model): self.model = model self.pkgmgr = MSPackageManager.get_pkg_mgr(model) From d99441a7e81ca636812a551316ba3a76dba57a9a Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 12 Oct 2023 22:44:58 -0500 Subject: [PATCH 194/298] Adding some utility functions and adding current_media to KBase media package --- modelseedpy/biochem/modelseed_biochem.py | 23 +++++++++++++++++++++++ modelseedpy/core/annotationontology.py | 8 ++++++++ modelseedpy/fbapkg/kbasemediapkg.py | 2 ++ 3 files changed, 33 insertions(+) diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index 80594e0e..2f8b8da4 100644 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -60,6 +60,29 @@ "TS_Athaliana", } +def convert_to_searchname(name): + OriginalName = name + ending = ""; + if name[-1] == "-": + ending = "-" + name = name.lower() + name.replace(" ","") + name.replace(",","") + name.replace("-","") + name.replace("_","") + name.replace("(","") + name.replace(")","") + name.replace("}","") + name.replace("{","") + name.replace("[","") + name.replace("]","") + name.replace(":","") + name.replace("�","") + name.replace("'","") + name.replace("_","") + name += ending + name.replace("icacid","ate") + return name; def get_low(ids): low = None diff --git a/modelseedpy/core/annotationontology.py b/modelseedpy/core/annotationontology.py index db64a981..c5f7ef06 100644 --- a/modelseedpy/core/annotationontology.py +++ b/modelseedpy/core/annotationontology.py @@ -38,6 +38,14 @@ "hmmscore", ] +def convert_to_search_role(role): + role = role.lower() + role = re.sub("\s","",role) + role = re.sub("[\d\-]+\.[\d\-]+\.[\d\-]+\.[\d\-]*","",role) + role = re.sub("\#.*$","",role) + role = re.sub("\(ec:*\)","",role) + role = re.sub("[\(\)\[\],-]","",role) + return role class AnnotationOntologyEvidence: def __init__(self, scores={}, ref_entity=None, entity_type=None): diff --git a/modelseedpy/fbapkg/kbasemediapkg.py b/modelseedpy/fbapkg/kbasemediapkg.py index 9dc9b315..7e53a0af 100644 --- a/modelseedpy/fbapkg/kbasemediapkg.py +++ b/modelseedpy/fbapkg/kbasemediapkg.py @@ -16,6 +16,7 @@ class KBaseMediaPkg(BaseFBAPkg): def __init__(self, model): BaseFBAPkg.__init__(self, model, "kbase media", {}, {}) + self.current_media = None def build_package( self, media_or_parameters, default_uptake=None, default_excretion=None @@ -40,6 +41,7 @@ def build_package( self.parameters["default_uptake"] = 0 if self.parameters["default_excretion"] is None: self.parameters["default_excretion"] = 100 + self.current_media = self.parameters["media"] if ( self.parameters["media"] and self.parameters["media"].name == "Complete" ) and self.parameters["default_uptake"] == 0: From f5d1d3dbe146e1c570f2212859b97e9604b000d1 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 12 Oct 2023 23:05:40 -0500 Subject: [PATCH 195/298] Adding reaction links for obsolete reactions to reaction annotations --- modelseedpy/biochem/modelseed_biochem.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index 2f8b8da4..daed51ce 100644 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -331,6 +331,9 @@ def _load_reactions( o.get("status"), o.get("source"), ) + if "linked_reaction" in o: + ids = o.get("linked_reaction").split(";") + rxn.annotation["modelseed"] = ids[0] rxn.add_metabolites(reaction_metabolites) if rxn.id in aliases: rxn.annotation.update(aliases[rxn.id]) From d0376449fa5d904f63543e2ccfceeb0e6795ebfe Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 12 Oct 2023 23:08:47 -0500 Subject: [PATCH 196/298] Fixing none linked reactions --- modelseedpy/biochem/modelseed_biochem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index daed51ce..882d0bfb 100644 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -331,7 +331,7 @@ def _load_reactions( o.get("status"), o.get("source"), ) - if "linked_reaction" in o: + if "linked_reaction" in o and o.get("linked_reaction"): ids = o.get("linked_reaction").split(";") rxn.annotation["modelseed"] = ids[0] rxn.add_metabolites(reaction_metabolites) From 8951c965a3db7e77cc3f4e602d91ad33c40d905c Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Fri, 13 Oct 2023 10:46:39 -0500 Subject: [PATCH 197/298] adding another utility function --- modelseedpy/core/annotationontology.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modelseedpy/core/annotationontology.py b/modelseedpy/core/annotationontology.py index c5f7ef06..eabc87f9 100644 --- a/modelseedpy/core/annotationontology.py +++ b/modelseedpy/core/annotationontology.py @@ -47,6 +47,9 @@ def convert_to_search_role(role): role = re.sub("[\(\)\[\],-]","",role) return role +def split_role(role): + return re.split("\s*;\s+|\s+[\@\/]\s+",role) + class AnnotationOntologyEvidence: def __init__(self, scores={}, ref_entity=None, entity_type=None): self.ref_entity = ref_entity From 4b6520c8389554c8a9d401e97a4f2cca5aad990f Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 9 Nov 2023 22:11:13 -0600 Subject: [PATCH 198/298] Checking in improved gapfilling --- modelseedpy/core/msatpcorrection.py | 8 +- modelseedpy/core/msgapfill.py | 360 +++++++++++++++++++++------- modelseedpy/core/msmodelutl.py | 195 ++++++++------- modelseedpy/fbapkg/gapfillingpkg.py | 118 +++++---- 4 files changed, 467 insertions(+), 214 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index cac50863..f4601219 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -325,9 +325,13 @@ def evaluate_growth_media(self): # Now running gapfilling on all conditions where initially there was no growth all_solutions = self.msgapfill.run_multi_gapfill( media_list, - self.atp_hydrolysis.id, - min_objectives, + target=self.atp_hydrolysis.id, + minimum_objectives=min_objectives, + prefilter=False, check_for_growth=False, + gapfilling_mode="Independent", + run_sensitivity_analysis=False, + integrate_solutions=False, ) # Adding the new solutions to the media gapfill stats diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index c57f56f9..d3e99220 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -142,8 +142,15 @@ def test_gapfill_database(self, media, target=None, before_filtering=True): ) return False - def prefilter(self, media, target): - # Filtering breaking reactions out of the database + def prefilter(self,test_conditions=None): + """Prefilters the database by removing any reactions that break specified ATP tests + Parameters + ---------- + test_conditions : [] + List of conditions to be tested when filtering the gapfilling database. If not specified, the test_conditions attribute will be used + """ + if not test_conditions: + test_conditions = self.test_conditions if self.test_conditions: self.gfpkgmgr.getpkg("GapfillingPkg").filter_database_based_on_tests( self.test_conditions @@ -155,11 +162,6 @@ def prefilter(self, media, target): for media_id in gf_filter: base_filter[media_id] = gf_filter[media_id] - # Testing if gapfilling can work after filtering - if not self.test_gapfill_database(media, target, before_filtering=False): - return False - return True - def run_gapfilling( self, media=None, @@ -167,7 +169,6 @@ def run_gapfilling( minimum_obj=None, binary_check=False, prefilter=True, - check_for_growth=True, ): """Run gapfilling on a single media condition to force the model to achieve a nonzero specified objective Parameters @@ -182,8 +183,6 @@ def run_gapfilling( Indicates if the solution should be checked to ensure it is minimal in the number of reactions involved prefilter : bool Indicates if the gapfilling database should be prefiltered using the tests provided in the MSGapfill constructor before running gapfilling - check_for_growth : bool - Indicates if the model should be checked to ensure that the resulting gapfilling solution produces a nonzero objective """ # Setting target and media if specified if target: @@ -202,12 +201,13 @@ def run_gapfilling( self.gfpkgmgr.getpkg("GapfillingPkg").set_min_objective(minimum_obj) # Testing if gapfilling can work before filtering - if not self.test_gapfill_database(media, before_filtering=True): + if not self.test_gapfill_database(media,target,before_filtering=prefilter): return None # Filtering if prefilter: - if not self.prefilter(media, target): + self.prefilter() + if not self.test_gapfill_database(media,target,before_filtering=False): return None # Printing the gapfilling LP file @@ -256,6 +256,125 @@ def run_gapfilling( ).parameters["minimum_obj"] self.last_solution["binary_check"] = binary_check return self.last_solution + + def run_global_gapfilling( + self, + medias, + targets, + thresholds, + binary_check=False, + prefilter=True, + ): + """Run gapfilling on a single media condition to force the model to achieve a nonzero specified objective + Parameters + ---------- + medias : [MSMedia] + Media in which the model should be gapfilled + targets : [string] + Name or expression describing the reaction or combination of reactions to the optimized + thresholds : [double] + Value to use for the minimal objective threshold that the model must be gapfilled to achieve + binary_check : bool + Indicates if the solution should be checked to ensure it is minimal in the number of reactions involved + prefilter : bool + Indicates if the gapfilling database should be prefiltered using the tests provided in the MSGapfill constructor before running gapfilling + check_for_growth : bool + Indicates if the model should be checked to ensure that the resulting gapfilling solution produces a nonzero objective + """ + # Testing if gapfilling can work before filtering + final_media = [] + final_targets = [] + final_thresholds = [] + for i,media in enumerate(medias): + if self.test_gapfill_database(media,targets[i],before_filtering=True): + final_media.append(media) + final_targets.append(targets[i]) + final_thresholds.append(thresholds[i]) + # Filtering + if prefilter: + self.prefilter() + medias = [] + targets = [] + thresholds = [] + for i,media in enumerate(final_media): + if self.test_gapfill_database(media,final_targets[i],before_filtering=True): + medias.append(media) + targets.append(targets[i]) + thresholds.append(thresholds[i]) + #If none of the media conditions can be gapfilled, then return None + if len(medias) == 0: + return None + #Instantiating all models to be merged + merged_model = None + model_list = [] + pkgmgrs = {} + for i,media in enumerate(medias): + model_cpy = self.gfmodel.copy() + pkgmgrs[model_cpy] = MSPackageManager.get_pkg_mgr(model_cpy) + #Creating max flux variables + pkgmgrs[model_cpy].getpkg("GapfillingPkg").create_max_flux_variables() + #Setting the objective + model_cpy.objective = self.gfmodel.problem.Objective( + self.gfmodel.reactions.get_by_id(targets[i]).flux_expression, + direction="max", + ) + pkgmgrs[model_cpy].getpkg("GapfillingPkg").reset_original_objective() + #Setting the media + pkgmgrs[model_cpy].getpkg("KBaseMediaPkg").build_package(media) + #Setting the minimum objective + pkgmgrs[model_cpy].getpkg("GapfillingPkg").set_min_objective(thresholds[i]) + if i == 0: + merged_model = model_cpy + else: + model_list.append(model_cpy) + #Merging all models + gfpkg = pkgmgrs[merged_model].getpkg("GapfillingPkg") + pkgmgrs[merged_model].getpkg("ProblemReplicationPkg").build_package({ + "models":model_list, + "shared_variable_packages":{ + gfpkg : ["rmaxf","fmaxf"] + } + }) + #Setting the objective + reaction_objective = merged_model.problem.Objective(Zero, direction="min") + obj_coef = dict() + for reaction in merged_model.reactions: + if reaction.id in gfpkg.gapfilling_penalties: + if reaction.id[0:3] != "EX_": + if "reverse" in gfpkg.gapfilling_penalties[reaction.id]: + if reaction.id in gfpkg.maxflux_variables: + if "reverse" in gfpkg.maxflux_variables[reaction.id]: + obj_coef[gfpkg.maxflux_variables[reaction.id]["reverse"]] = abs( + gfpkg.gapfilling_penalties[reaction.id]["reverse"] + ) + if "forward" in gfpkg.gapfilling_penalties[reaction.id]: + if reaction.id in gfpkg.maxflux_variables: + if "forward" in gfpkg.maxflux_variables[reaction.id]: + obj_coef[gfpkg.maxflux_variables[reaction.id]["forward"]] = abs( + gfpkg.gapfilling_penalties[reaction.id]["forward"] + ) + merged_model.objective = reaction_objective + reaction_objective.set_linear_coefficients(obj_coef) + gfpkg.parameters["gfobj"] = self.model.objective + + # Printing the gapfilling LP file + if self.lp_filename: + with open(self.lp_filename, "w") as out: + out.write(str(merged_model.solver)) + + # Running gapfilling and checking solution + sol = merged_model.optimize() + logger.debug( + f"gapfill solution objective value {sol.objective_value} ({sol.status}) for media {media}" + ) + if sol.status != "optimal": + logger.warning("No solution found for %s", media) + return None + + # Computing solution and ensuring all tests still pass + self.last_solution = {"new":{},"reversed":{},"media":medias[0],"target":targets[0],"minobjective":thresholds[0],"binary_check":False} + #TODO : compute solution + return self.last_solution def run_multi_gapfill( self, @@ -266,7 +385,9 @@ def run_multi_gapfill( binary_check=False, prefilter=True, check_for_growth=True, - simultaneous_gapfilling=False, + gapfilling_mode="Independent", + run_sensitivity_analysis=True, + integrate_solutions=True ): """Run gapfilling across an array of media conditions ultimately using different integration policies: simultaneous gapfilling, independent gapfilling, cumulative gapfilling Parameters @@ -285,38 +406,117 @@ def run_multi_gapfill( Indicates if the gapfilling database should be prefiltered using the tests provided in the MSGapfill constructor before running gapfilling check_for_growth : bool Indicates if the model should be checked to ensure that the resulting gapfilling solution produces a nonzero objective + gapfilling_mode : string + Indicates the integration policy to be used: simultaneous gapfilling, independent gapfilling, cumulative gapfilling + run_sensitivity_analysis : bool + Indicates if sensitivity analysis should be run on the gapfilling solution to determine biomass dependency """ - + #If not integrating, backing up and replacing self.mdlutl + oldmdlutl = self.mdlutl + if not integrate_solutions: + self.model = self.model.copy() + self.mdlutl = MSModelUtil.get(self.model) + #Setting the default minimum objective if not default_minimum_objective: default_minimum_objective = self.default_minimum_objective + #Running prefiltering once for all media if specified. Rememeber - filtering does not care about the target or media - it is just a set of tests that are run on the database + if prefilter: + self.prefilter() + #Iterating over all media and running gapfilling solution_dictionary = {} - if simultaneous_gapfilling: - for item in media_list: - pass - else: - first = True - for item in media_list: - minimum_obj = default_minimum_objective - if item in minimum_objectives: - minimum_obj = minimum_objectives[item] - if first: - solution_dictionary[item] = self.run_gapfilling( - item, - target, - minimum_obj, - binary_check, - prefilter, - check_for_growth, - ) - else: - solution_dictionary[item] = self.run_gapfilling( - item, None, minimum_obj, binary_check, False, check_for_growth + cumulative_solution = [] + targets = [] + thresholds = [] + for item in media_list: + targets.append(target) + #Determining the minimum objective for the current media + minimum_obj = default_minimum_objective + if item in minimum_objectives: + minimum_obj = minimum_objectives[item] + thresholds.append(minimum_obj) + #Implementing specified gapfilling mode + if gapfilling_mode == "Independent" or gapfilling_mode == "Cumulative": + solution = self.run_gapfilling( + item, + target, + minimum_obj, + binary_check, + False, + ) + #If there is a solution, go ahead and integrate it into the model + if solution: + solution_dictionary[item] = self.integrate_gapfill_solution( + solution, + cumulative_solution=cumulative_solution, + remove_unneeded_reactions=True, + check_for_growth=check_for_growth, ) - first = False - return solution_dictionary - + #If we are doing cumulative gapfilling, then we need adjust the gapfilling objective so it no longer penalizes using the current solution reactions + if gapfilling_mode == "Cumulative": + self.gfpkgmgr.getpkg("GapfillingPkg").compute_gapfilling_penalties(cumulative_solution) + self.gfpkgmgr.getpkg("GapfillingPkg").build_gapfilling_objective_function() + if gapfilling_mode == "Simultaneous": + #Now we run simultaneous gapfilling on a combination of all our various gapfilled models + full_solution = self.run_global_gapfilling( + media_list, + targets, + thresholds, + binary_check, + False, + check_for_growth, + ) + #Now we integrate the full solution into the model for every media which effectively determines which reactions are needed for each media + for i,item in enumerate(media_list): + full_solution["media"] = item + full_solution["target"] = targets[i] + full_solution["minobjective"] = thresholds[i] + #In this case we donot remove unnneeded reactions from the model because they may be needed for other media + solution_dictionary[item] = self.integrate_gapfill_solution( + full_solution, + cumulative_solution=cumulative_solution, + remove_unneeded_reactions=False, + check_for_growth=check_for_growth, + ) + #Now we remove reactions uneeded for any of the specified media conditions + #These is a danger here that the integration step will put a reaction into a solution that subsequently gets removed at this step. This is something to look out for + unneeded = self.mdlutl.test_solution(cumulative_solution,targets,media_list,thresholds,True)#Returns reactions in cumulative solution that are not needed for growth + elif gapfilling_mode == "Cumulative": + #Restoring the gapfilling objective function + self.gfpkgmgr.getpkg("GapfillingPkg").compute_gapfilling_penalties() + self.gfpkgmgr.getpkg("GapfillingPkg").build_gapfilling_objective_function() + #Running sensitivity analysis once on the cumulative solution for all media + """ + if run_sensitivity_analysis:#TODO - need to redesign this run operate on multiple solutions at once... + logger.info( + "Gapfilling sensitivity analysis running on succesful run in " + + solution["media"].id + + " for target " + + solution["target"] + ) + test_solution = [] + for rxn_id in solution["reversed"]: + test_solution.append([rxn_id, solution["reversed"][rxn_id]]) + for rxn_id in solution["new"]: + test_solution.append([rxn_id, solution["new"][rxn_id]]) + gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) + if solution["media"].id not in gf_sensitivity: + gf_sensitivity[solution["media"].id] = {} + if solution["target"] not in gf_sensitivity[solution["media"].id]: + gf_sensitivity[solution["media"].id][solution["target"]] = {} + gf_sensitivity[solution["media"].id][solution["target"]][ + "success" + ] = self.mdlutl.find_unproducible_biomass_compounds( + solution["target"], test_solution + ) + self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") """ + #Restoring backedup model + self.mdlutl = oldmdlutl + self.model = oldmdlutl.model + #Returning the solution dictionary + return solution_dictionary + def integrate_gapfill_solution( - self, solution, cumulative_solution=[], link_gaps_to_objective=True + self,solution,cumulative_solution=[],remove_unneeded_reactions=False,check_for_growth=True ): """Integrating gapfilling solution into model Parameters @@ -325,21 +525,19 @@ def integrate_gapfill_solution( Specifies the reactions to be added to the model to implement the gapfilling solution cumulative_solution : list Optional array to cumulatively track all reactions added to the model when integrating multiple solutions - link_gaps_to_objective : bool - Indicates if biomass sensitivity analysis should be run on the specified gapfilling solution """ #Computing the initial length of cumulative solution before integrating current solution starting_length = len(cumulative_solution) + new_cumulative_reactions = [] #Reversing reactions reported by gapfilling solution in the model for rxn_id in solution["reversed"]: rxn = self.model.reactions.get_by_id(rxn_id) if solution["reversed"][rxn_id] == ">" and rxn.upper_bound <= 0: - cumulative_solution.append([rxn_id, ">"]) + new_cumulative_reactions.append([rxn_id, ">","reversed"]) rxn.upper_bound = 100 elif solution["reversed"][rxn_id] == "<" and rxn.lower_bound >= 0: - cumulative_solution.append([rxn_id, "<"]) + new_cumulative_reactions.append([rxn_id, "<","reversed"]) rxn.lower_bound = -100 - #Adding new reactions from the gapfilling solution into the model for rxn_id in solution["new"]: if rxn_id not in self.model.reactions: @@ -359,51 +557,49 @@ def integrate_gapfill_solution( rxn = self.model.reactions.get_by_id(rxn_id) rxn.gene_reaction_rule = bestgene if solution["new"][rxn_id] == ">": - cumulative_solution.append([rxn_id, ">"]) + new_cumulative_reactions.append([rxn_id, ">","new"]) rxn.upper_bound = 100 rxn.lower_bound = 0 else: - cumulative_solution.append([rxn_id, "<"]) + new_cumulative_reactions.append([rxn_id, "<","new"]) rxn.upper_bound = 0 rxn.lower_bound = -100 - - # Sometimes for whatever reason, the solution includes useless reactions that should be stripped out before saving the final model - unneeded = self.mdlutl.test_solution( - solution, keep_changes=True, cumulative_solution=cumulative_solution, starting_cumulative_solution_length=starting_length - ) # Strips out unneeded reactions - which undoes some of what is done above - for item in unneeded: - for i,oitem in enumerate(cumulative_solution): - #Only remove unneeded from cumulative solution if it was added in this specific solution - if i >= starting_length and item[0] == oitem[0] and item[1] == oitem[1]: - cumulative_solution.remove(oitem) + #Testing the full cumulative solution to see which reactions are needed for current media/target + #Note - thus function does NOT change the bounds on the unneeded reactions + #Also, we run this only on the current solution target and media for now + full_solution = cumulative_solution + new_cumulative_reactions + unneeded = self.mdlutl.test_solution(full_solution,[solution["target"]],[solution["media"]],[solution["minobjective"]],remove_unneeded_reactions,do_not_remove_list=cumulative_solution)#Returns reactions in cumulative solution that are not needed for growth + #We cannot assume unneeded reactions are truly unneeded because they may be needed for other media/target combinations + #But we still want to track them so we can remove them from the model if they are not needed for any media/target combination + #We also want to track which reactions are needed for the current media/target combination + current_media_target_solution = {"growth":0,"media":solution["media"],"target":solution["target"],"minobjective":solution["minobjective"],"binary_check":solution["binary_check"] ,"new":{},"reversed":{}} + for item in cumulative_solution: + found = False + for oitem in unneeded: + if item[0] == oitem[0] and item[1] == oitem[1]: + found = True break + if not found: + current_media_target_solution[item[2]][item[0]] = item[1] + for item in new_cumulative_reactions: + found = False + for oitem in unneeded: + if item[0] == oitem[0] and item[1] == oitem[1]: + found = True + break + if not found: + current_media_target_solution[item[2]][item[0]] = item[1] + cumulative_solution.append(item) + elif not remove_unneeded_reactions: + cumulative_solution.append(item) + #Checking that the final integrated model grows + if check_for_growth: + self.mdlutl.pkgmgr.getpkg("KBaseMediaPkg").build_package(solution["media"]) + current_media_target_solution["growth"] = self.mdlutl.model.slim_optimize() # Adding the gapfilling solution data to the model, which is needed for saving the model in KBase - self.mdlutl.add_gapfilling(solution) - # Testing which gapfilled reactions are needed to produce each reactant in the objective function - if link_gaps_to_objective: - logger.info( - "Gapfilling sensitivity analysis running on succesful run in " - + solution["media"].id - + " for target " - + solution["target"] - ) - test_solution = [] - for rxn_id in solution["reversed"]: - test_solution.append([rxn_id, solution["reversed"][rxn_id]]) - for rxn_id in solution["new"]: - test_solution.append([rxn_id, solution["new"][rxn_id]]) - gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) - if solution["media"].id not in gf_sensitivity: - gf_sensitivity[solution["media"].id] = {} - if solution["target"] not in gf_sensitivity[solution["media"].id]: - gf_sensitivity[solution["media"].id][solution["target"]] = {} - gf_sensitivity[solution["media"].id][solution["target"]][ - "success" - ] = self.mdlutl.find_unproducible_biomass_compounds( - solution["target"], test_solution - ) - self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") - self.cumulative_gapfilling.extend(cumulative_solution) + self.mdlutl.add_gapfilling(current_media_target_solution) + #Return the stripped down solution object containing only needed reactions + return current_media_target_solution def compute_reaction_weights_from_expression_data(self, omics_data, conditions=[]): """Computing reaction weights based on input gene-level omics data diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index cdd9b680..5788665e 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -535,21 +535,18 @@ def convert_cobra_reaction_to_kbreaction( ################################################################################# # Functions related to gapfilling of models ################################################################################# - def test_solution(self, solution, keep_changes=False,cumulative_solution=[], starting_cumulative_solution_length=0): - """Tests if every reaction in a given gapfilling solution is actually needed for growth - Optionally can remove unneeded reactions from the model AND the solution object. - Note, this code assumes the gapfilling solution is already integrated. + def test_solution(self,solution,targets,medias,thresholds=[0.1],remove_unneeded_reactions=False,do_not_remove_list=[]): + """Tests if every reaction in a given gapfilling solution is actually needed for growth. Note, this code assumes the gapfilling solution is already integrated. Parameters ---------- solution : {"new":{string reaction_id: string direction},"reversed":{string reaction_id: string direction}} + or + list> Data for gapfilling solution to be tested - keep_changes : bool - Set this bool to True to remove the unneeded reactions from the solution and model - cumulative_solution : - List of reactions already loaded into the model across multiple gapfilling runs - starting_cumulative_solution_length : int - Position in the cumulative solution where the current solution starts (should not remove previously integrated reactions) + target : string, + media : MSMedia, + threshold : float, default 0.1 Returns ------- @@ -559,82 +556,112 @@ def test_solution(self, solution, keep_changes=False,cumulative_solution=[], sta Raises ------ """ + #Saving the current objective + current_objective = self.model.objective + #Saving the current media + current_media = self.pkgmgr.getpkg("KBaseMediaPkg").current_media + #Computing the initial objective values + initial_objectives = [] + for (i,target) in enumerate(targets): + #Setting the media + self.pkgmgr.getpkg("KBaseMediaPkg").build_package(medias[i]) + #Setting the objective + self.model.objective = target + #Computing the objective value + objective = self.model.slim_optimize() + initial_objectives.append(objective) + logger.debug("Starting objective for " + medias[i].id + "/"+target+" = " + str(objective)) + #Iterating through solution reactions and flagging them if they are unneeded to achieve the specified minimum objective unneeded = [] - removed_rxns = [] - tempmodel = self.model - if not keep_changes: - tempmodel = cobra.io.json.from_json(cobra.io.json.to_json(self.model)) - tempmodel.objective = solution["target"] - pkgmgr = MSPackageManager.get_pkg_mgr(tempmodel) - pkgmgr.getpkg("KBaseMediaPkg").build_package(solution["media"]) - objective = tempmodel.slim_optimize() - logger.debug("Starting objective:" + str(objective)) - types = ["new", "reversed"] - for key in types: - for rxn_id in solution[key]: - rxnobj = tempmodel.reactions.get_by_id(rxn_id) - if solution[key][rxn_id] == ">": - original_bound = rxnobj.upper_bound - rxnobj.upper_bound = 0 - objective = tempmodel.slim_optimize() - if objective < solution["minobjective"]: - logger.info( - rxn_id - + solution[key][rxn_id] - + " needed:" - + str(objective) - + " with min obj:" - + str(solution["minobjective"]) - ) - rxnobj.upper_bound = original_bound - else: - unneeded.append([rxn_id, solution[key][rxn_id], key,original_bound]) - logger.info( - rxn_id - + solution[key][rxn_id] - + " not needed:" - + str(objective) - ) + #If object is a dictionary, convert to a list + if isinstance(solution,dict): + converted_solution = [] + types = ["new", "reversed"] + for key in types: + for rxn_id in solution[key]: + converted_solution.append([rxn_id, solution[key][rxn_id], key]) + solution = converted_solution + #Processing solution in standardized format + for item in solution: + rxn_id = item[0] + rxnobj = self.model.reactions.get_by_id(rxn_id) + #Knocking out the reaction to test for the impact on the objective + if item[1] == ">": + original_bound = rxnobj.upper_bound + rxnobj.upper_bound = 0 + else: + original_bound = rxnobj.lower_bound + rxnobj.lower_bound = 0 + #Testing all media and target and threshold combinations to see if the reaction is needed + needed = False + for (i,target) in enumerate(targets): + if len(targets) > 1:#If there's only one target, then these steps were done earlier already + #Setting the media + self.pkgmgr.getpkg("KBaseMediaPkg").build_package(medias[i]) + #Setting the objective + self.model.objective = target + #Computing the objective value + objective = self.model.slim_optimize() + if objective < thresholds[i]: + needed = True + logger.info( + medias[i].id + "/" + target + ":" +rxn_id + + item[1] + + " needed:" + + str(objective) + + " with min obj:" + + str(thresholds[i]) + ) + #If the reaction isn't needed for any media and target combinations, add it to the unneeded list + if not needed: + unneeded.append([rxn_id, item[1], item[2],original_bound]) + logger.info( + rxn_id + + item[1] + + " not needed:" + + str(objective) + ) + #VERY IMPORTANT: Leave the reaction knocked out for now so we screen for combinatorial effects + else: + #Restore the reaction if it is needed + if item[1] == ">": + rxnobj.upper_bound = original_bound else: - original_bound = rxnobj.lower_bound - rxnobj.lower_bound = 0 - objective = tempmodel.slim_optimize() - if objective < solution["minobjective"]: - logger.info( - rxn_id - + solution[key][rxn_id] - + " needed:" - + str(objective) - + " with min obj:" - + str(solution["minobjective"]) - ) - rxnobj.lower_bound = original_bound - else: - unneeded.append([rxn_id, solution[key][rxn_id], key,original_bound]) - logger.info( - rxn_id - + solution[key][rxn_id] - + " not needed:" - + str(objective) - ) - #Iterating over unneeded reactions, and if they are not in the previous cumulative solution, then we add them to the remove list - for item in unneeded: - rxnobj = tempmodel.reactions.get_by_id(item[0]) - found = False - for i in range(0,starting_cumulative_solution_length): - if item[0] in cumulative_solution[i][0] and item[1] in cumulative_solution[i][1]: - found = True - if item[1] == ">": - rxnobj.upper_bound = item[3] - else: - rxnobj.lower_bound = item[3] - break - if not found and rxnobj.lower_bound == 0 and rxnobj.upper_bound == 0: - removed_rxns.append(rxnobj) - if keep_changes: - tempmodel.remove_reactions(removed_rxns) - for items in unneeded: - del solution[items[2]][items[0]] + rxnobj.lower_bound = original_bound + if not remove_unneeded_reactions: + #Restoring the bounds on the unneeded reactions + for item in unneeded: + rxnobj = self.model.reactions.get_by_id(item[0]) + if item[1] == ">": + rxnobj.upper_bound = item[3] + else: + rxnobj.lower_bound = item[3] + else: + #Do not restore bounds on unneeded reactions and remove reactions from model if their bounds are zero + removed_rxns = [] + for item in unneeded: + dnr = False + for dnr_item in do_not_remove_list: + if item[0] == dnr_item[0] and item[1] == dnr_item[1]: + #Restoring bounds on reactions that should not be removed + dnr = True + rxnobj = self.model.reactions.get_by_id(item[0]) + if item[1] == ">": + rxnobj.upper_bound = item[3] + else: + rxnobj.lower_bound = item[3] + if not dnr: + rxnobj = self.model.reactions.get_by_id(item[0]) + if rxnobj.lower_bound == 0 and rxnobj.upper_bound == 0: + removed_rxns.append(rxnobj) + if len(removed_rxns) > 0: + self.model.remove_reactions(removed_rxns) + #Restoring the original objective + self.model.objective = current_objective + #Restoring the original media + if current_media: + self.pkgmgr.getpkg("KBaseMediaPkg").build_package(current_media) + #Returning the unneeded list return unneeded def add_gapfilling(self, solution): diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index dbc1441e..2ce3aebd 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -88,10 +88,10 @@ def build_package(self, parameters): "default_uptake": 100, "minimum_obj": 0.01, "minimize_exchanges": False, - "add_max_flux_variables": False, "blacklist": [], }, ) + # Adding model reactions to original reaction list self.parameters["original_reactions"] = [] for rxn in self.model.reactions: @@ -103,15 +103,28 @@ def build_package(self, parameters): self.parameters["original_reactions"].append([rxn, "<"]) if rxn.upper_bound > 0: self.parameters["original_reactions"].append([rxn, ">"]) + # Adding constraint for target reaction self.parameters["origobj"] = self.model.objective self.pkgmgr.getpkg("ObjConstPkg").build_package( self.parameters["minimum_obj"], None ) + #Computing gapfilling penalties + self.compute_gapfilling_penalties() + + # Creating the gapfilling objective function and saving it under self.parameters["gfobj"] + self.build_gapfilling_objective_function() + + def compute_gapfilling_penalties(self,exclusion_solution=None,reaction_scores=None): + """Builds gapfilling objective function for model + Parameters + ---------- + exclusion_solution : [string rxn_id,string direction] + Solution with reaction directions that should be removed from the gapfilling objective function + """ # Determine all indecies that should be gapfilled indexhash = self.get_model_index_hash() - # Iterating over all indecies with more than 10 intracellular compounds: self.gapfilling_penalties = dict() for index in indexhash: @@ -153,14 +166,24 @@ def build_package(self, parameters): gfmdl, index ) self.gapfilling_penalties.update(new_penalties) + #Removing exclusion solution reactions from penalties dictionary + if exclusion_solution: + for item in exclusion_solution: + if item[0] in self.gapfilling_penalties: + if item[1] == ">" and "forward" in self.gapfilling_penalties[item[0]]: + del self.gapfilling_penalties[item[0]]["forward"] + elif item[1] == "<" and "reverse" in self.gapfilling_penalties[item[0]]: + del self.gapfilling_penalties[item[0]]["reverse"] # Rescaling penalties by reaction scores and saving genes + if not reaction_scores: + reaction_scores = self.parameters["reaction_scores"] for reaction in self.gapfilling_penalties: rxnid = reaction.split("_")[0] - if rxnid in self.parameters["reaction_scores"]: + if rxnid in reaction_scores: highest_score = 0 - for gene in self.parameters["reaction_scores"][rxnid]: - if highest_score < self.parameters["reaction_scores"][rxnid][gene]: - highest_score = self.parameters["reaction_scores"][rxnid][gene] + for gene in reaction_scores[rxnid]: + if highest_score < reaction_scores[rxnid][gene]: + highest_score = reaction_scores[rxnid][gene] factor = 0.1 if "reverse" in self.gapfilling_penalties[reaction]: self.gapfilling_penalties[reaction]["reverse"] = ( @@ -171,46 +194,9 @@ def build_package(self, parameters): factor * self.gapfilling_penalties[reaction]["forward"] ) - self.model.solver.update() - - # Creating max flux variables and constraints to be used for global gapfilling and other formulations - if self.parameters["add_max_flux_variables"]: - for reaction in self.model.reactions: - if reaction.id in self.gapfilling_penalties: - if "reverse" in self.gapfilling_penalties[reaction.id]: - self.maxflux_variables[reaction.id][ - "reverse" - ] = self.build_variable( - "rmaxf", 0, 1000, "continuous", reaction - ) - self.build_constraint( - "rmaxfc", - 0, - None, - { - reaction.reverse_variable: -1, - self.maxflux_variables[reaction.id]["reverse"]: 1, - }, - reaction, - ) - if "forward" in self.gapfilling_penalties[reaction.id]: - self.maxflux_variables[reaction.id][ - "forward" - ] = self.build_variable( - "fmaxf", 0, 1000, "continuous", reaction - ) - self.build_constraint( - "fmaxfc", - 0, - None, - { - reaction.forward_variable: -1, - self.maxflux_variables[reaction.id]["forward"]: 1, - }, - reaction, - ) - - # Creating the gapfilling objective function and saving it under self.parameters["gfobj"] + def build_gapfilling_objective_function(self): + """Builds gapfilling objective function for model + """ reaction_objective = self.model.problem.Objective(Zero, direction="min") obj_coef = dict() for reaction in self.model.reactions: @@ -232,6 +218,46 @@ def build_package(self, parameters): reaction_objective.set_linear_coefficients(obj_coef) self.parameters["gfobj"] = self.model.objective + def create_max_flux_variables(self): + """Creates max flux variables needed for the global gapfilling formulation + Parameters + ---------- + """ + for reaction in self.model.reactions: + if reaction.id in self.gapfilling_penalties: + if "reverse" in self.gapfilling_penalties[reaction.id]: + self.maxflux_variables[reaction.id][ + "reverse" + ] = self.build_variable( + "rmaxf", 0, 1000, "continuous", reaction + ) + self.build_constraint( + "rmaxfc", + 0, + None, + { + reaction.reverse_variable: -1, + self.maxflux_variables[reaction.id]["reverse"]: 1, + }, + reaction, + ) + if "forward" in self.gapfilling_penalties[reaction.id]: + self.maxflux_variables[reaction.id][ + "forward" + ] = self.build_variable( + "fmaxf", 0, 1000, "continuous", reaction + ) + self.build_constraint( + "fmaxfc", + 0, + None, + { + reaction.forward_variable: -1, + self.maxflux_variables[reaction.id]["forward"]: 1, + }, + reaction, + ) + def reset_original_objective(self): self.parameters["origobj"] = self.model.objective From 7b1a0fa898dff1848fc43dbb73842e719ca6dd7f Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 9 Nov 2023 22:46:01 -0600 Subject: [PATCH 199/298] Fixing bug in ATP code --- modelseedpy/core/msatpcorrection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index f4601219..75939512 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -416,7 +416,7 @@ def apply_growth_media_gapfilling(self): and MSGapfill.gapfill_count(self.media_gapfill_stats[media]) > 0 ): self.msgapfill.integrate_gapfill_solution( - stats, self.cumulative_core_gapfilling, link_gaps_to_objective=False + stats, self.cumulative_core_gapfilling,check_for_growth=False ) # Adding reactions to gapfilling sensitivity structure so we can track all gapfilled reactions gf_sensitivity = self.modelutl.get_attributes("gf_sensitivity", {}) From 017859055703731823e366b46c2c7205ded67623 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Mon, 4 Dec 2023 14:50:18 -0800 Subject: [PATCH 200/298] Created Weighting function for gap fill. Example data required for testing. --- modelseedpy/core/msgapfill.py | 84 ++++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index db3ed703..8fe5d505 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -3,6 +3,8 @@ import cobra import re import json +import numpy as np +import pandas as pd from optlang.symbolics import Zero, add from modelseedpy.core import FBAHelper # !!! the import is never used from modelseedpy.fbapkg.mspackagemanager import MSPackageManager @@ -402,6 +404,8 @@ def compute_reaction_weights_from_expression_data(self, omics_data, conditions=[ Optional array containing the IDs of the columns in omics_data from which data should be used. If an empty array (or no array) is supplied, data from all columns will be used. When multiple columns are used, the data from those columns should be normalized first, then added together + Returns : + A dictionary with Rxns as the keys and calculated result as the value. """ # Validitions: # 1.) An conditions listed in the conditions argument should match the columns in the omics_data dataframe @@ -409,7 +413,85 @@ def compute_reaction_weights_from_expression_data(self, omics_data, conditions=[ # 3.) The omics_data dataframe should have at least 2 columns # 4.) The omics_data dataframe should have at least 2 rows # 5.) Logging should be used to report out which genes in the model don't match any genes in the omics_data dataframe - pass + + # Assumptions: + # omics_data is an input with the following columns: + # Col 1: Gene + # Col 2: Reactions + # Cols 3-9: Annotations + # Unlike with the MATLAB code, this will not check if rxn is not in draft - this is only making calculations based on the columns in omics_data. + + + # Notes: + # This has only been tested on dummy data and in this case python performs the same as MATLAB. However, this needs to be tested with an example input. + # Two outputs are currently created. + # A table that matches with t in the MATLAB code. + # The requested hash (dictionary) with Rxns and floats. + # Many more inputs were required with the MATLAB code, this has attempted to condense everything to handle the single input. + # Conditions has not been added yet. I think as other questions are answered, the use for this will be more clear. + + #Questions + # When might the example data be updated? + # Are other inputs required? + # Is this output (Dictionary with RXN: Value), correct? + # When will the next steps for setting up the kbase jupyter notebook be ready? + + measuredGeneScore = np.zeros((omics_data.shape[0], len(omics_data.columns[3:10]))) + num_cols = len(omics_data.columns[3:10]) + w = np.full((num_cols, 1), 1/num_cols) + p = np.zeros(len(omics_data["Reactions"])) + + # t is table to match and check against MatLab code. + t = pd.DataFrame() + # rxn_hash is the desired output + rxn_hash = {} + + for rxn in range(0,len(omics_data)): + substr_rxns = [rxn for rxn in omics_data["Reactions"][[rxn]]] + # Get the indices of the rows where the condition is True + mask = omics_data['Reactions'].apply(lambda x: any(substr in x for substr in substr_rxns)) + idx_gene = mask[mask].index + nAG = 0 + nMG = 0 + nCG = 0 + + if len(idx_gene) > 0: + #number of genes that map to a reaction + nAG = len(idx_gene) + for iGene in range(0,nAG): + subset = omics_data.iloc[idx_gene[iGene], 3:9].to_numpy() + # Checking for non-empty elements in the subset + non_empty_check = np.vectorize(lambda x: x is not None and x == x)(subset) # x == x checks for NaN + # Finding the maximum value between the non-empty check and the corresponding row in measuredGeneScore + max_value = np.maximum(non_empty_check, measuredGeneScore[idx_gene[iGene], :]) + # Multiplying by the weight and adding to nMG + nMG += max(sum((max_value * w))) + selected_gene = omics_data['Gene'].iloc[idx_gene[iGene]] + + # Finding reactions associated with genes that contain the selected gene + associated_reactions = omics_data['Reactions'][omics_data['Gene'].str.contains(selected_gene)] + # Checking if there are more than one unique reactions + if len(associated_reactions.unique()) > 1: + nCG +=1 + + p[rxn] = (nMG/nAG) * (1 / (1 + (nCG/nAG))) + + #format table + new_row = { + 'iRxn': rxn, + 'nMG': nMG, + 'nCG': nCG, + 'nAG': nAG, + 'Values': p[rxn] #Values is equivalent to Var5 in the MatLab Code + } + + # Append the new row to the table + t = t.append(new_row, ignore_index=True) + # Add item to output rxn dictionary + rxn_hash[omics_data.iloc[rxn, 0]] = p[rxn] + + return rxn_hash + @staticmethod def gapfill( From fb9f1166c83300dc9ba7747234c91a337392980d Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Thu, 7 Dec 2023 17:40:45 -0600 Subject: [PATCH 201/298] updated cobra version and template reaction type fix --- modelseedpy/core/msbuilder.py | 8 ++++++-- modelseedpy/core/msgenome.py | 1 + modelseedpy/core/mstemplate.py | 2 +- setup.py | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index bca4a0f8..c180cc6f 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -6,6 +6,7 @@ from modelseedpy.core.exceptions import ModelSEEDError from modelseedpy.core.rast_client import RastClient from modelseedpy.core.msgenome import normalize_role +from modelseedpy.core.mstemplate import TemplateReactionType from modelseedpy.core.msmodel import ( get_gpr_string, get_reaction_constraints_from_direction, @@ -867,9 +868,12 @@ def build_non_metabolite_reactions( reactions = [] for template_reaction in self.template.reactions: + rxn_type = template_reaction.type if ( - template_reaction.type == "universal" - or template_reaction.type == "spontaneous" + rxn_type == "universal" + or rxn_type == "spontaneous" + or rxn_type == TemplateReactionType.UNIVERSAL + or rxn_type == TemplateReactionType.SPONTANEOUS ): reaction_metabolite_ids = {m.id for m in template_reaction.metabolites} if ( diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index 78f1e004..f79165fb 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -82,6 +82,7 @@ def add_ontology_term(self, ontology_term, value): class MSGenome: + def __init__(self): self.features = DictList() diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 49fd98c3..dccdce4e 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -438,7 +438,7 @@ def get_data(self): map(lambda x: "~/complexes/id/" + x.id, self.complexes) ), # 'status': self.status, - "type": self.type, + "type": self.type if type(self.type) is str else self.type.value, } # def build_reaction_string(self, use_metabolite_names=False, use_compartment_names=None): diff --git a/setup.py b/setup.py index 2fb97221..f2fe0b3b 100644 --- a/setup.py +++ b/setup.py @@ -35,7 +35,7 @@ ], install_requires=[ "networkx >= 2.4", - "cobra >= 0.17.1", + "cobra >= 0.28.0", "scikit-learn == 1.2.0", # version lock for pickle ML models "scipy >= 1.5.4", "chemicals >= 1.0.13", From ea79000cb87a86cffe66ad2b856cf90f49f2e324 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Thu, 7 Dec 2023 17:41:14 -0600 Subject: [PATCH 202/298] format --- modelseedpy/core/msgenome.py | 1 - 1 file changed, 1 deletion(-) diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index f79165fb..78f1e004 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -82,7 +82,6 @@ def add_ontology_term(self, ontology_term, value): class MSGenome: - def __init__(self): self.features = DictList() From b06d221abd922ef35e27e0d1f6638a55a63cd32c Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 21 Dec 2023 00:26:27 -0600 Subject: [PATCH 203/298] Fixing phenotype calling --- modelseedpy/core/msgrowthphenotypes.py | 35 +++++++++++++++++++++++++- modelseedpy/core/msmedia.py | 6 +++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index ce6fbdff..a8939713 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -142,7 +142,6 @@ def simulate( output["fluxes"] = solution.fluxes # Determining phenotype class - if output["growth"] >= output["baseline_growth"] * growth_multiplier: output["GROWING"] = True if not self.growth or ignore_growth_data: @@ -526,8 +525,42 @@ def simulate_phenotypes( summary["Count"][0] = summary["Count"][0] / totalcount sdf = pd.DataFrame(summary) df = pd.DataFrame(data) + self.adjust_phenotype_calls(df) return {"details": df, "summary": sdf} + def adjust_phenotype_calls(self,data): + lowest = data["Simulated growth"].min() + highest = data["Simulated growth"].max() + threshold = (highest-lowest)/2+lowest + if highest/(lowest+0.000001) < 1.5: + threshold = highest + grow = 0 + nogrow = 0 + change = 0 + for (i,item) in data.iterrows(): + if item["Simulated growth"] >= threshold: + grow += 1 + if item["Class"] == "NOGROWTH": + data.loc[i, 'Class'] = "GROWTH" + change += 1 + elif item["Class"] == "FN": + data.loc[i, 'Class'] = "TP" + change += 1 + elif item["Class"] == "CN": + data.loc[i, 'Class'] = "FP" + change += 1 + else: + nogrow += 1 + if item["Class"] == "GROWTH": + data.loc[i, 'Class'] = "NOGROWTH" + change += 1 + elif item["Class"] == "TP": + data.loc[i, 'Class'] = "FN" + change += 1 + elif item["Class"] == "FP": + data.loc[i, 'Class'] = "CN" + change += 1 + def fit_model_to_phenotypes( self, msgapfill, diff --git a/modelseedpy/core/msmedia.py b/modelseedpy/core/msmedia.py index 960e82d1..22fa91f3 100644 --- a/modelseedpy/core/msmedia.py +++ b/modelseedpy/core/msmedia.py @@ -75,6 +75,12 @@ def get_media_constraints(self, cmp="e0"): media[met_id] = (compound.lower_bound, compound.upper_bound) return media + def find_mediacpd(self, cpd_id): + for cpd in self.mediacompounds: + if cpd.id == cpd_id: + return cpd + return None + def merge(self, media, overwrite_overlap=False): new_cpds = [] for cpd in media.mediacompounds: From 76d20130150df09bf9beba2925a47e62f49356fb Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 21 Dec 2023 09:54:19 -0600 Subject: [PATCH 204/298] debugging growth calls --- modelseedpy/core/msgrowthphenotypes.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index a8939713..2a4c257d 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -158,6 +158,7 @@ def simulate( output["class"] = "FN" elif self.growth == 0: output["class"] = "CN" + print(self.id,output["GROWING"],output["class"],output["growth"],output["baseline_growth"],growth_multiplier) return output def gapfill_model_for_phenotype( @@ -525,26 +526,30 @@ def simulate_phenotypes( summary["Count"][0] = summary["Count"][0] / totalcount sdf = pd.DataFrame(summary) df = pd.DataFrame(data) - self.adjust_phenotype_calls(df) + self.adjust_phenotype_calls(df,baseline_growth) return {"details": df, "summary": sdf} - def adjust_phenotype_calls(self,data): + def adjust_phenotype_calls(self,data,basline_growth): lowest = data["Simulated growth"].min() + if basline_growth < lowest: + lowest = basline_growth highest = data["Simulated growth"].max() threshold = (highest-lowest)/2+lowest if highest/(lowest+0.000001) < 1.5: threshold = highest + print("Adjusting:",basline_growth,lowest,highest,threshold) grow = 0 nogrow = 0 change = 0 for (i,item) in data.iterrows(): + oldclass = item["Class"] if item["Simulated growth"] >= threshold: grow += 1 if item["Class"] == "NOGROWTH": data.loc[i, 'Class'] = "GROWTH" change += 1 elif item["Class"] == "FN": - data.loc[i, 'Class'] = "TP" + data.loc[i, 'Class'] = "CP" change += 1 elif item["Class"] == "CN": data.loc[i, 'Class'] = "FP" @@ -554,12 +559,14 @@ def adjust_phenotype_calls(self,data): if item["Class"] == "GROWTH": data.loc[i, 'Class'] = "NOGROWTH" change += 1 - elif item["Class"] == "TP": + elif item["Class"] == "CP": data.loc[i, 'Class'] = "FN" change += 1 elif item["Class"] == "FP": data.loc[i, 'Class'] = "CN" change += 1 + if oldclass != item["Class"]: + print("Adjusting",item["Phenotype"],"from",oldclass,"to",item["Class"]) def fit_model_to_phenotypes( self, From 74a333e58b92f06d6f9ef5b71c963ae9525ed2de Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 28 Dec 2023 00:34:28 -0600 Subject: [PATCH 205/298] Fixing FBA package and phenotyping --- modelseedpy/core/msgrowthphenotypes.py | 2 +- modelseedpy/fbapkg/basefbapkg.py | 7 +- modelseedpy/fbapkg/gapfillingpkg.py | 164 +++++++++++++++++-------- 3 files changed, 117 insertions(+), 56 deletions(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 2a4c257d..735807a0 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -152,7 +152,7 @@ def simulate( output["class"] = "FP" else: output["GROWING"] = False - if not self.growth or ignore_growth_data: + if self.growth == None or ignore_growth_data: output["class"] = "NOGROWTH" elif self.growth > 0: output["class"] = "FN" diff --git a/modelseedpy/fbapkg/basefbapkg.py b/modelseedpy/fbapkg/basefbapkg.py index 77effe32..f5a216f0 100644 --- a/modelseedpy/fbapkg/basefbapkg.py +++ b/modelseedpy/fbapkg/basefbapkg.py @@ -73,12 +73,12 @@ def clear(self): for obj_type in self.variables: for cobra_obj in self.variables[obj_type]: cobra_objs.append(self.variables[obj_type][cobra_obj]) + self.variables[obj_type] = {} for obj_type in self.constraints: for cobra_obj in self.constraints[obj_type]: cobra_objs.append(self.constraints[obj_type][cobra_obj]) + self.constraints[obj_type] = {} self.model.remove_cons_vars(cobra_objs) - self.variables = {} - self.constraints = {} def build_variable( self, obj_type, lower_bound, upper_bound, vartype, cobra_obj=None @@ -153,3 +153,6 @@ def add_constraint_type(self, name, type): self.constraints[name] = dict() if name not in self.constraint_types: self.constraint_types[name] = type + + def current_media(self): + return self.pkgmgr.getpkg("KBaseMediaPkg").current_media diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index 2ce3aebd..054845bd 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -85,11 +85,15 @@ def build_package(self, parameters): "gapfill_all_indecies_with_default_templates": 1, "gapfill_all_indecies_with_default_models": 1, "default_excretion": 100, - "default_uptake": 100, + "default_uptake": 0, "minimum_obj": 0.01, "minimize_exchanges": False, "blacklist": [], - }, + "base_media": None, + "objective":self.model.objective, + "base_media_target_element": "C", + "default_exchange_penalty":0.1 + } ) # Adding model reactions to original reaction list @@ -105,28 +109,27 @@ def build_package(self, parameters): self.parameters["original_reactions"].append([rxn, ">"]) # Adding constraint for target reaction - self.parameters["origobj"] = self.model.objective - self.pkgmgr.getpkg("ObjConstPkg").build_package( - self.parameters["minimum_obj"], None - ) + self.set_base_objective(self.parameters["objective"],self.parameters["minimum_obj"]) + #Extending model + self.extend_model_for_gapfilling() + #Computing gapfilling penalties self.compute_gapfilling_penalties() # Creating the gapfilling objective function and saving it under self.parameters["gfobj"] self.build_gapfilling_objective_function() - def compute_gapfilling_penalties(self,exclusion_solution=None,reaction_scores=None): - """Builds gapfilling objective function for model + def extend_model_for_gapfilling(self): + """Extends the model for gapfilling Parameters ---------- - exclusion_solution : [string rxn_id,string direction] - Solution with reaction directions that should be removed from the gapfilling objective function + None """ # Determine all indecies that should be gapfilled indexhash = self.get_model_index_hash() # Iterating over all indecies with more than 10 intracellular compounds: - self.gapfilling_penalties = dict() + self.base_gapfilling_penalties = dict() for index in indexhash: if indexhash[index] > 10: if index == "none": @@ -134,12 +137,12 @@ def compute_gapfilling_penalties(self,exclusion_solution=None,reaction_scores=No new_penalties = self.extend_model_with_template_for_gapfilling( template, index ) - self.gapfilling_penalties.update(new_penalties) + self.base_gapfilling_penalties.update(new_penalties) for gfmdl in self.parameters["default_gapfill_models"]: new_penalties = self.extend_model_with_model_for_gapfilling( gfmdl, index ) - self.gapfilling_penalties.update(new_penalties) + self.base_gapfilling_penalties.update(new_penalties) if index in self.parameters["gapfill_templates_by_index"]: for template in self.parameters["gapfill_templates_by_index"][ index @@ -147,25 +150,34 @@ def compute_gapfilling_penalties(self,exclusion_solution=None,reaction_scores=No new_penalties = self.extend_model_with_template_for_gapfilling( template, index ) - self.gapfilling_penalties.update(new_penalties) + self.base_gapfilling_penalties.update(new_penalties) if index in self.parameters["gapfill_models_by_index"]: for gfmdl in self.parameters["gapfill_models_by_index"]: new_penalties = self.extend_model_with_model_for_gapfilling( gfmdl, index ) - self.gapfilling_penalties.update(new_penalties) + self.base_gapfilling_penalties.update(new_penalties) if self.parameters["gapfill_all_indecies_with_default_templates"]: for template in self.parameters["default_gapfill_templates"]: new_penalties = self.extend_model_with_template_for_gapfilling( template, index ) - self.gapfilling_penalties.update(new_penalties) + self.base_gapfilling_penalties.update(new_penalties) if self.parameters["gapfill_all_indecies_with_default_models"]: for gfmdl in self.parameters["default_gapfill_models"]: new_penalties = self.extend_model_with_model_for_gapfilling( gfmdl, index ) - self.gapfilling_penalties.update(new_penalties) + self.base_gapfilling_penalties.update(new_penalties) + + def compute_gapfilling_penalties(self,exclusion_solution=None,reaction_scores=None): + """Builds gapfilling objective function for model + Parameters + ---------- + exclusion_solution : [string rxn_id,string direction] + Solution with reaction directions that should be removed from the gapfilling objective function + """ + self.gapfilling_penalties = self.base_gapfilling_penalties.copy() #Removing exclusion solution reactions from penalties dictionary if exclusion_solution: for item in exclusion_solution: @@ -201,16 +213,15 @@ def build_gapfilling_objective_function(self): obj_coef = dict() for reaction in self.model.reactions: if reaction.id in self.gapfilling_penalties: - if self.parameters["minimize_exchanges"] or reaction.id[0:3] != "EX_": - # Minimizing gapfilled reactions - if "reverse" in self.gapfilling_penalties[reaction.id]: - obj_coef[reaction.reverse_variable] = abs( - self.gapfilling_penalties[reaction.id]["reverse"] - ) - if "forward" in self.gapfilling_penalties[reaction.id]: - obj_coef[reaction.forward_variable] = abs( - self.gapfilling_penalties[reaction.id]["forward"] - ) + # Minimizing gapfilled reactions + if "reverse" in self.gapfilling_penalties[reaction.id]: + obj_coef[reaction.reverse_variable] = abs( + self.gapfilling_penalties[reaction.id]["reverse"] + ) + if "forward" in self.gapfilling_penalties[reaction.id]: + obj_coef[reaction.forward_variable] = abs( + self.gapfilling_penalties[reaction.id]["forward"] + ) else: obj_coef[reaction.forward_variable] = 0 obj_coef[reaction.reverse_variable] = 0 @@ -258,8 +269,34 @@ def create_max_flux_variables(self): reaction, ) - def reset_original_objective(self): - self.parameters["origobj"] = self.model.objective + def set_base_objective(self,objective,minobjective): + """Sets the base objective for the model + Parameters + ---------- + objective : string | model.objective + ID of reaction to be maximized as the objective or model objective object + minobjective : float + Minimal objective value to be used + """ + #Setting the objective based on the objective argument + if isinstance(objective, str): + self.model.objective = self.model.reactions.get_by_id(objective).flux_expression + self.model.objective.direction = "max" + else: + self.model.objective = objective + #Setting original objective field + self.original_objective = self.model.objective + #Setting minimal objective constraint + self.pkgmgr.getpkg("ObjConstPkg").clear() + if minobjective: + if self.model.objective.direction == "max": + self.pkgmgr.getpkg("ObjConstPkg").build_package( + minobjective, None + ) + else: + self.pkgmgr.getpkg("ObjConstPkg").build_package( + None, minobjective + ) def extend_model_with_model_for_gapfilling(self, source_model, index): new_metabolites = {} @@ -480,7 +517,7 @@ def extend_model_with_template_for_gapfilling(self, template, index): self.parameters["default_excretion"], ) for ex in exchanges: - new_penalties[ex.id] = {"added": 1, "reverse": 1, "forward": 1} + new_penalties[ex.id] = {"added": 1, "reverse": self.parameters["default_exchange_penalty"], "forward": self.parameters["default_exchange_penalty"]} # Only run this on new demands so we don't readd for all exchanges exchanges = self.modelutl.add_exchanges_for_metabolites( @@ -490,7 +527,7 @@ def extend_model_with_template_for_gapfilling(self, template, index): "DM_", ) for ex in exchanges: - new_penalties[ex.id] = {"added": 1, "reverse": 1, "forward": 1} + new_penalties[ex.id] = {"added": 1, "reverse": self.parameters["default_exchange_penalty"], "forward": self.parameters["default_exchange_penalty"]} # Adding all new reactions to the model at once (much faster than one at a time) self.model.add_reactions(new_reactions.values()) @@ -564,6 +601,19 @@ def convert_template_reaction( return cobra_reaction + def set_media(self, media): + if self.parameters["base_media"]: + reaction_exceptions = [] + for mediacpd in media.mediacompounds: + if not self.parameters["base_media"].find_mediacpd(mediacpd.id): + ex_hash = mediacpd.get_mdl_exchange_hash(self.modelutl) + for mdlcpd in ex_hash: + reaction_exceptions.append(ex_hash[mdlcpd]) + self.modelutl.pkgmgr.getpkg("ElementUptakePkg").build_package( + {self.parameters["base_media_target_element"]:1}, exception_reactions=reaction_exceptions + ) + self.modelutl.pkgmgr.getpkg("KBaseMediaPkg").build_package(media, self.parameters["default_uptake"], self.parameters["default_excretion"]) + def binary_check_gapfilling_solution(self, solution=None, flux_values=None): if solution is None: solution = self.compute_gapfilled_solution() @@ -631,7 +681,7 @@ def run_test_conditions(self, condition_list, solution=None, max_iterations=10): with self.model: # Setting all gapfilled reactions not in the solution to zero self.knockout_gf_reactions_outside_solution(solution) - self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = 0 + self.reset_objective_minimum(0,False) for condition in condition_list: condition["change"] = True filtered_list = self.modelutl.reaction_expansion_test( @@ -649,9 +699,7 @@ def run_test_conditions(self, condition_list, solution=None, max_iterations=10): else: self.model.reactions.get_by_id(item[0].id).lower_bound = 0 # Restoring lower bound on biomass constraint - self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"][ - "1" - ].lb = self.parameters["minimum_obj"] + self.reset_objective_minimum(self.parameters["minimum_obj"]) # Reoptimizing self.model.optimize() return self.run_test_conditions( @@ -661,8 +709,8 @@ def run_test_conditions(self, condition_list, solution=None, max_iterations=10): return solution def test_gapfill_database(self): - self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = 0 - self.model.objective = self.parameters["origobj"] + self.reset_objective_minimum(0,False) + self.model.objective = self.original_objective solution = self.model.optimize() logger.debug( "Objective with gapfill database:" @@ -670,23 +718,35 @@ def test_gapfill_database(self): + "; min objective:" + str(self.parameters["minimum_obj"]) ) - self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = self.parameters[ - "minimum_obj" - ] + self.reset_objective_minimum(self.parameters["minimum_obj"]) self.model.objective = self.parameters["gfobj"] if solution.objective_value < self.parameters["minimum_obj"]: return False return True - def set_min_objective(self, min_objective): - self.parameters["minimum_obj"] = min_objective - self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = self.parameters[ - "minimum_obj" - ] + def reset_objective_minimum(self, min_objective,reset_params=True): + if reset_params and min_objective != 0: + self.parameters["minimum_obj"] = min_objective + if "1" not in self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]: + self.pkgmgr.getpkg("ObjConstPkg").build_package(min_objective, None) + if min_objective == 0: + if self.parameters["minimum_obj"] > 0: + self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = 0 + if self.parameters["minimum_obj"] < 0: + self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].ub = 0 + else: + if min_objective > 0: + self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = min_objective + if min_objective < 0: + self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].ub = min_objective def filter_database_based_on_tests(self, test_conditions): + #Saving the current media + current_media = self.current_media() + #Clearing element uptake constraints + self.pkgmgr.getpkg("ElementUptakePkg").clear() # Setting the minimal growth constraint to zero - self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = 0 + self.reset_objective_minimum(0,False) # Filtering the database of any reactions that violate the specified tests filetered_list = [] with self.model: @@ -712,9 +772,7 @@ def filter_database_based_on_tests(self, test_conditions): if not self.test_gapfill_database(): # Now we need to restore a minimal set of filtered reactions such that we permit the minimum objective to be reached # Restoring the minimum objective constraint - self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"][ - "1" - ].lb = self.parameters["minimum_obj"] + self.reset_objective_minimum(self.parameters["minimum_obj"]) new_objective = self.model.problem.Objective(Zero, direction="min") filterobjcoef = dict() for item in filtered_list: @@ -748,7 +806,7 @@ def filter_database_based_on_tests(self, test_conditions): rxn.lower_bound = 0 logger.debug("Reactions unfiltered:" + str(count)) # Checking for model reactions that can be removed to enable all tests to pass - self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = 0 + self.reset_objective_minimum(0,False) filtered_list = self.modelutl.reaction_expansion_test( self.parameters["original_reactions"], test_conditions ) @@ -759,10 +817,10 @@ def filter_database_based_on_tests(self, test_conditions): else: self.model.reactions.get_by_id(item[0].id).lower_bound = 0 # Restoring gapfilling objective function and minimal objective constraint - self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].lb = self.parameters[ - "minimum_obj" - ] + self.reset_objective_minimum(self.parameters["minimum_obj"]) self.model.objective = self.parameters["gfobj"] + if current_media: + self.set_media(current_media) return True def compute_gapfilled_solution(self, flux_values=None): From 7132c50cbfbc10bdffb3e6778f47900ad3276dd8 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Thu, 4 Jan 2024 15:59:47 -0800 Subject: [PATCH 206/298] Linted --- modelseedpy/core/msgapfill.py | 87 +++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 39 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 8fe5d505..53a52b07 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -1,9 +1,10 @@ +#!/usr/bin/python # -*- coding: utf-8 -*- import logging import cobra import re import json -import numpy as np +import numpy as np import pandas as pd from optlang.symbolics import Zero, add from modelseedpy.core import FBAHelper # !!! the import is never used @@ -405,7 +406,7 @@ def compute_reaction_weights_from_expression_data(self, omics_data, conditions=[ If an empty array (or no array) is supplied, data from all columns will be used. When multiple columns are used, the data from those columns should be normalized first, then added together Returns : - A dictionary with Rxns as the keys and calculated result as the value. + A dictionary with Rxns as the keys and calculated result as the value. """ # Validitions: # 1.) An conditions listed in the conditions argument should match the columns in the omics_data dataframe @@ -413,85 +414,93 @@ def compute_reaction_weights_from_expression_data(self, omics_data, conditions=[ # 3.) The omics_data dataframe should have at least 2 columns # 4.) The omics_data dataframe should have at least 2 rows # 5.) Logging should be used to report out which genes in the model don't match any genes in the omics_data dataframe - - # Assumptions: + + # Assumptions: # omics_data is an input with the following columns: - # Col 1: Gene - # Col 2: Reactions - # Cols 3-9: Annotations + # Col 1: Gene + # Col 2: Reactions + # Cols 3-9: Annotations # Unlike with the MATLAB code, this will not check if rxn is not in draft - this is only making calculations based on the columns in omics_data. - - + # Notes: # This has only been tested on dummy data and in this case python performs the same as MATLAB. However, this needs to be tested with an example input. # Two outputs are currently created. - # A table that matches with t in the MATLAB code. - # The requested hash (dictionary) with Rxns and floats. + # A table that matches with t in the MATLAB code. + # The requested hash (dictionary) with Rxns and floats. # Many more inputs were required with the MATLAB code, this has attempted to condense everything to handle the single input. # Conditions has not been added yet. I think as other questions are answered, the use for this will be more clear. - - #Questions + + # Questions # When might the example data be updated? # Are other inputs required? # Is this output (Dictionary with RXN: Value), correct? # When will the next steps for setting up the kbase jupyter notebook be ready? - - measuredGeneScore = np.zeros((omics_data.shape[0], len(omics_data.columns[3:10]))) + + measuredGeneScore = np.zeros( + (omics_data.shape[0], len(omics_data.columns[3:10])) + ) num_cols = len(omics_data.columns[3:10]) - w = np.full((num_cols, 1), 1/num_cols) + w = np.full((num_cols, 1), 1 / num_cols) p = np.zeros(len(omics_data["Reactions"])) - # t is table to match and check against MatLab code. + # t is table to match and check against MatLab code. t = pd.DataFrame() # rxn_hash is the desired output rxn_hash = {} - for rxn in range(0,len(omics_data)): + for rxn in range(0, len(omics_data)): substr_rxns = [rxn for rxn in omics_data["Reactions"][[rxn]]] # Get the indices of the rows where the condition is True - mask = omics_data['Reactions'].apply(lambda x: any(substr in x for substr in substr_rxns)) + mask = omics_data["Reactions"].apply( + lambda x: any(substr in x for substr in substr_rxns) + ) idx_gene = mask[mask].index nAG = 0 nMG = 0 nCG = 0 - + if len(idx_gene) > 0: - #number of genes that map to a reaction + # number of genes that map to a reaction nAG = len(idx_gene) - for iGene in range(0,nAG): + for iGene in range(0, nAG): subset = omics_data.iloc[idx_gene[iGene], 3:9].to_numpy() # Checking for non-empty elements in the subset - non_empty_check = np.vectorize(lambda x: x is not None and x == x)(subset) # x == x checks for NaN + non_empty_check = np.vectorize(lambda x: x is not None and x == x)( + subset + ) # x == x checks for NaN # Finding the maximum value between the non-empty check and the corresponding row in measuredGeneScore - max_value = np.maximum(non_empty_check, measuredGeneScore[idx_gene[iGene], :]) + max_value = np.maximum( + non_empty_check, measuredGeneScore[idx_gene[iGene], :] + ) # Multiplying by the weight and adding to nMG nMG += max(sum((max_value * w))) - selected_gene = omics_data['Gene'].iloc[idx_gene[iGene]] + selected_gene = omics_data["Gene"].iloc[idx_gene[iGene]] # Finding reactions associated with genes that contain the selected gene - associated_reactions = omics_data['Reactions'][omics_data['Gene'].str.contains(selected_gene)] + associated_reactions = omics_data["Reactions"][ + omics_data["Gene"].str.contains(selected_gene) + ] # Checking if there are more than one unique reactions if len(associated_reactions.unique()) > 1: - nCG +=1 - - p[rxn] = (nMG/nAG) * (1 / (1 + (nCG/nAG))) - - #format table + nCG += 1 + + p[rxn] = (nMG / nAG) * (1 / (1 + (nCG / nAG))) + + # format table new_row = { - 'iRxn': rxn, - 'nMG': nMG, - 'nCG': nCG, - 'nAG': nAG, - 'Values': p[rxn] #Values is equivalent to Var5 in the MatLab Code + "iRxn": rxn, + "nMG": nMG, + "nCG": nCG, + "nAG": nAG, + "Values": p[rxn], # Values is equivalent to Var5 in the MatLab Code } - + # Append the new row to the table t = t.append(new_row, ignore_index=True) # Add item to output rxn dictionary rxn_hash[omics_data.iloc[rxn, 0]] = p[rxn] - + return rxn_hash - @staticmethod def gapfill( From d36463fb29eb76d2e633a8e9387f6b702d629df4 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 25 Jan 2024 12:54:09 -0600 Subject: [PATCH 207/298] Checking in gapfilling improvements for PNNL use in developing gapfilling method --- modelseedpy/core/msgapfill.py | 200 ++++++++++++++++++--------------- modelseedpy/core/msmodel.py | 1 + modelseedpy/core/msmodelutl.py | 68 ++++++----- 3 files changed, 152 insertions(+), 117 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index d3e99220..36045c8b 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -36,8 +36,10 @@ def __init__( atp_gapfilling=False, minimum_obj=0.01, default_excretion=100, - default_uptake=100, + default_uptake=0, default_target=None, + base_media = None, + base_media_target_element = "C" ): # Discerning input is model or mdlutl and setting internal links if isinstance(model_or_mdlutl, MSModelUtil): @@ -98,17 +100,15 @@ def __init__( "blacklist": self.blacklist, "reaction_scores": self.reaction_scores, "set_objective": 1, + "base_media": base_media, + "base_media_target_element":base_media_target_element } ) def test_gapfill_database(self, media, target=None, before_filtering=True): # Testing if gapfilling can work before filtering if target: - self.gfmodel.objective = self.gfmodel.problem.Objective( - self.gfmodel.reactions.get_by_id(target).flux_expression, - direction="max", - ) - self.gfpkgmgr.getpkg("GapfillingPkg").reset_original_objective() + self.gfpkgmgr.getpkg("GapfillingPkg").set_base_objective(target,None) else: target = str(self.gfmodel.objective) target = target.split(" ")[0] @@ -185,20 +185,13 @@ def run_gapfilling( Indicates if the gapfilling database should be prefiltered using the tests provided in the MSGapfill constructor before running gapfilling """ # Setting target and media if specified - if target: - self.gfmodel.objective = self.gfmodel.problem.Objective( - self.gfmodel.reactions.get_by_id(target).flux_expression, - direction="max", - ) - self.gfpkgmgr.getpkg("GapfillingPkg").reset_original_objective() - else: + if not target: target = self.default_target - if media: - self.gfpkgmgr.getpkg("KBaseMediaPkg").build_package(media) if not minimum_obj: minimum_obj = self.default_minimum_objective - if minimum_obj: - self.gfpkgmgr.getpkg("GapfillingPkg").set_min_objective(minimum_obj) + self.gfpkgmgr.getpkg("GapfillingPkg").set_base_objective(target,minimum_obj) + if media: + self.gfpkgmgr.getpkg("GapfillingPkg").set_media(media) # Testing if gapfilling can work before filtering if not self.test_gapfill_database(media,target,before_filtering=prefilter): @@ -251,9 +244,7 @@ def run_gapfilling( # Setting last solution data self.last_solution["media"] = media self.last_solution["target"] = target - self.last_solution["minobjective"] = self.gfpkgmgr.getpkg( - "GapfillingPkg" - ).parameters["minimum_obj"] + self.last_solution["minobjective"] = minimum_obj self.last_solution["binary_check"] = binary_check return self.last_solution @@ -314,15 +305,9 @@ def run_global_gapfilling( #Creating max flux variables pkgmgrs[model_cpy].getpkg("GapfillingPkg").create_max_flux_variables() #Setting the objective - model_cpy.objective = self.gfmodel.problem.Objective( - self.gfmodel.reactions.get_by_id(targets[i]).flux_expression, - direction="max", - ) - pkgmgrs[model_cpy].getpkg("GapfillingPkg").reset_original_objective() + pkgmgrs[model_cpy].getpkg("GapfillingPkg").set_base_objective(targets[i],thresholds[i]) #Setting the media - pkgmgrs[model_cpy].getpkg("KBaseMediaPkg").build_package(media) - #Setting the minimum objective - pkgmgrs[model_cpy].getpkg("GapfillingPkg").set_min_objective(thresholds[i]) + pkgmgrs[model_cpy].getpkg("GapfillingPkg").set_media(media) if i == 0: merged_model = model_cpy else: @@ -373,7 +358,13 @@ def run_global_gapfilling( # Computing solution and ensuring all tests still pass self.last_solution = {"new":{},"reversed":{},"media":medias[0],"target":targets[0],"minobjective":thresholds[0],"binary_check":False} - #TODO : compute solution + flux_values = {} + for rxn in self.model.reactions: + flux_values[rxn.id] = { + "reverse": self.gfpkgmgr.getpkg("GapfillingPkg").maxflux_variables[reaction.id]["reverse"].primal, + "forward": self.gfpkgmgr.getpkg("GapfillingPkg").maxflux_variables[reaction.id]["forward"].primal + } + self.gfpkgmgr.getpkg("GapfillingPkg").compute_gapfilled_solution(flux_values) return self.last_solution def run_multi_gapfill( @@ -385,7 +376,7 @@ def run_multi_gapfill( binary_check=False, prefilter=True, check_for_growth=True, - gapfilling_mode="Independent", + gapfilling_mode="Cumulative", run_sensitivity_analysis=True, integrate_solutions=True ): @@ -407,14 +398,14 @@ def run_multi_gapfill( check_for_growth : bool Indicates if the model should be checked to ensure that the resulting gapfilling solution produces a nonzero objective gapfilling_mode : string - Indicates the integration policy to be used: simultaneous gapfilling, independent gapfilling, cumulative gapfilling + Indicates the integration policy to be used: Global, Independent, and Cumulative run_sensitivity_analysis : bool Indicates if sensitivity analysis should be run on the gapfilling solution to determine biomass dependency """ #If not integrating, backing up and replacing self.mdlutl oldmdlutl = self.mdlutl if not integrate_solutions: - self.model = self.model.copy() + self.model = cobra.io.json.from_json(cobra.io.json.to_json(self.model)) self.mdlutl = MSModelUtil.get(self.model) #Setting the default minimum objective if not default_minimum_objective: @@ -436,6 +427,7 @@ def run_multi_gapfill( thresholds.append(minimum_obj) #Implementing specified gapfilling mode if gapfilling_mode == "Independent" or gapfilling_mode == "Cumulative": + self.lp_filename = item.id+"-gf.lp" solution = self.run_gapfilling( item, target, @@ -450,12 +442,13 @@ def run_multi_gapfill( cumulative_solution=cumulative_solution, remove_unneeded_reactions=True, check_for_growth=check_for_growth, + gapfilling_mode=gapfilling_mode ) #If we are doing cumulative gapfilling, then we need adjust the gapfilling objective so it no longer penalizes using the current solution reactions if gapfilling_mode == "Cumulative": - self.gfpkgmgr.getpkg("GapfillingPkg").compute_gapfilling_penalties(cumulative_solution) + self.gfpkgmgr.getpkg("GapfillingPkg").compute_gapfilling_penalties(exclusion_solution=cumulative_solution,reaction_scores=self.reaction_scores) self.gfpkgmgr.getpkg("GapfillingPkg").build_gapfilling_objective_function() - if gapfilling_mode == "Simultaneous": + if gapfilling_mode == "Global": #Now we run simultaneous gapfilling on a combination of all our various gapfilled models full_solution = self.run_global_gapfilling( media_list, @@ -476,13 +469,21 @@ def run_multi_gapfill( cumulative_solution=cumulative_solution, remove_unneeded_reactions=False, check_for_growth=check_for_growth, + gapfilling_mode=gapfilling_mode ) #Now we remove reactions uneeded for any of the specified media conditions #These is a danger here that the integration step will put a reaction into a solution that subsequently gets removed at this step. This is something to look out for - unneeded = self.mdlutl.test_solution(cumulative_solution,targets,media_list,thresholds,True)#Returns reactions in cumulative solution that are not needed for growth + unneeded = self.mdlutl.test_solution( + cumulative_solution, + targets, + media_list, + thresholds=[0.1], + remove_unneeded_reactions=True, + do_not_remove_list=[] + )#Returns reactions in cumulative solution that are not needed for growth elif gapfilling_mode == "Cumulative": #Restoring the gapfilling objective function - self.gfpkgmgr.getpkg("GapfillingPkg").compute_gapfilling_penalties() + self.gfpkgmgr.getpkg("GapfillingPkg").compute_gapfilling_penalties(reaction_scores=self.reaction_scores) self.gfpkgmgr.getpkg("GapfillingPkg").build_gapfilling_objective_function() #Running sensitivity analysis once on the cumulative solution for all media """ @@ -514,9 +515,9 @@ def run_multi_gapfill( self.model = oldmdlutl.model #Returning the solution dictionary return solution_dictionary - + def integrate_gapfill_solution( - self,solution,cumulative_solution=[],remove_unneeded_reactions=False,check_for_growth=True + self,solution,cumulative_solution=[],remove_unneeded_reactions=False,check_for_growth=True,gapfilling_mode="Cumulative" ): """Integrating gapfilling solution into model Parameters @@ -525,26 +526,39 @@ def integrate_gapfill_solution( Specifies the reactions to be added to the model to implement the gapfilling solution cumulative_solution : list Optional array to cumulatively track all reactions added to the model when integrating multiple solutions + remove_unneeded_reactions : bool + Indicate where unneeded reactions should be removed from the model + check_for_growth : bool + Indicate if the model should be checked to ensure that the resulting gapfilling solution produces a nonzero objective + gapfilling_mode : Cumulative, Independent, Simultaneous + Specify what the gapfilling mode is because this determines how integration is performed """ - #Computing the initial length of cumulative solution before integrating current solution - starting_length = len(cumulative_solution) + print("Initial solution:",str(solution)) + original_objective = self.mdlutl.model.objective + self.mdlutl.model.objective = solution["target"] + self.mdlutl.model.objective.direction = "max" + #If gapfilling mode is independent, we should remove the cumulative solution from the model before integrating the current solution + if gapfilling_mode == "Independent": + for item in cumulative_solution: + rxn = self.model.reactions.get_by_id(item[0]) + if item[1] == ">": + rxn.upper_bound = 0 + else: + rxn.lower_bound = 0 new_cumulative_reactions = [] - #Reversing reactions reported by gapfilling solution in the model - for rxn_id in solution["reversed"]: - rxn = self.model.reactions.get_by_id(rxn_id) - if solution["reversed"][rxn_id] == ">" and rxn.upper_bound <= 0: - new_cumulative_reactions.append([rxn_id, ">","reversed"]) - rxn.upper_bound = 100 - elif solution["reversed"][rxn_id] == "<" and rxn.lower_bound >= 0: - new_cumulative_reactions.append([rxn_id, "<","reversed"]) - rxn.lower_bound = -100 - #Adding new reactions from the gapfilling solution into the model - for rxn_id in solution["new"]: - if rxn_id not in self.model.reactions: - rxn = self.gfmodel.reactions.get_by_id(rxn_id) + #Converting the solution to list + list_solution = self.mdlutl.convert_solution_to_list(solution) + for item in list_solution: + if item[0] not in self.model.reactions: + #Copying and adding the reaction to the model + rxn = self.gfmodel.reactions.get_by_id(item[0]) rxn = rxn.copy() self.model.add_reactions([rxn]) - coreid = re.sub(r"_[a-z]\d+$", "", rxn_id) + #Clearing current bounds because we only want to add reaction in the direction it was gapfilled in + rxn.upper_bound = 0 + rxn.lower_bound = 0 + #Setting genes from reaction scores in we have them + coreid = re.sub(r"_[a-z]\d+$", "", item[0]) if coreid in self.reaction_scores: bestgene = None for gene in self.reaction_scores[coreid]: @@ -554,50 +568,60 @@ def integrate_gapfill_solution( > self.reaction_scores[coreid][bestgene] ): bestgene = gene - rxn = self.model.reactions.get_by_id(rxn_id) + rxn = self.model.reactions.get_by_id(item[0]) rxn.gene_reaction_rule = bestgene - if solution["new"][rxn_id] == ">": - new_cumulative_reactions.append([rxn_id, ">","new"]) - rxn.upper_bound = 100 - rxn.lower_bound = 0 - else: - new_cumulative_reactions.append([rxn_id, "<","new"]) - rxn.upper_bound = 0 - rxn.lower_bound = -100 + rxn = self.model.reactions.get_by_id(item[0]) + #Setting bounds according to the direction the reaction was gapfilled in + if item[1] == ">": + rxn.upper_bound = 100 + else: + rxn.lower_bound = -100 + #Adding reaction to cumulative solution if it is not already there + if not self.mdlutl.find_item_in_solution(cumulative_solution,item): + new_cumulative_reactions.append([item[0], item[1],item[2]]) #Testing the full cumulative solution to see which reactions are needed for current media/target - #Note - thus function does NOT change the bounds on the unneeded reactions - #Also, we run this only on the current solution target and media for now full_solution = cumulative_solution + new_cumulative_reactions - unneeded = self.mdlutl.test_solution(full_solution,[solution["target"]],[solution["media"]],[solution["minobjective"]],remove_unneeded_reactions,do_not_remove_list=cumulative_solution)#Returns reactions in cumulative solution that are not needed for growth - #We cannot assume unneeded reactions are truly unneeded because they may be needed for other media/target combinations - #But we still want to track them so we can remove them from the model if they are not needed for any media/target combination - #We also want to track which reactions are needed for the current media/target combination + #Setting up structure to store the finalized solution for this media/target current_media_target_solution = {"growth":0,"media":solution["media"],"target":solution["target"],"minobjective":solution["minobjective"],"binary_check":solution["binary_check"] ,"new":{},"reversed":{}} - for item in cumulative_solution: - found = False - for oitem in unneeded: - if item[0] == oitem[0] and item[1] == oitem[1]: - found = True - break - if not found: - current_media_target_solution[item[2]][item[0]] = item[1] - for item in new_cumulative_reactions: - found = False - for oitem in unneeded: - if item[0] == oitem[0] and item[1] == oitem[1]: - found = True - break - if not found: - current_media_target_solution[item[2]][item[0]] = item[1] - cumulative_solution.append(item) - elif not remove_unneeded_reactions: - cumulative_solution.append(item) + #If gapfilling is independent, we only check the specific solution + if gapfilling_mode == "Independent": + unneeded = self.mdlutl.test_solution(list_solution,[solution["target"]],[solution["media"]],[solution["minobjective"]],remove_unneeded_reactions,do_not_remove_list=cumulative_solution)#Returns reactions in input solution that are not needed for growth + for item in list_solution: + if not self.mdlutl.find_item_in_solution(unneeded,item): + current_media_target_solution[item[2]][item[0]] = item[1] + if not self.mdlutl.find_item_in_solution(cumulative_solution,item): + cumulative_solution.append(item) + #elif not remove_unneeded_reactions and not self.mdlutl.find_item_in_solution(cumulative_solution,item): + # cumulative_solution.append(item) + else: + unneeded = self.mdlutl.test_solution(full_solution,[solution["target"]],[solution["media"]],[solution["minobjective"]],remove_unneeded_reactions,do_not_remove_list=cumulative_solution)#Returns reactions in input solution that are not needed for growth + for item in cumulative_solution: + if not self.mdlutl.find_item_in_solution(unneeded,item): + current_media_target_solution[item[2]][item[0]] = item[1] + for item in new_cumulative_reactions: + if not self.mdlutl.find_item_in_solution(unneeded,item): + current_media_target_solution[item[2]][item[0]] = item[1] + cumulative_solution.append(item) + #elif not remove_unneeded_reactions: + # cumulative_solution.append(item) + print("Unneeded:",str(unneeded)) #Checking that the final integrated model grows if check_for_growth: self.mdlutl.pkgmgr.getpkg("KBaseMediaPkg").build_package(solution["media"]) current_media_target_solution["growth"] = self.mdlutl.model.slim_optimize() + print("Growth:",str(current_media_target_solution["growth"]),solution["media"].id) # Adding the gapfilling solution data to the model, which is needed for saving the model in KBase self.mdlutl.add_gapfilling(current_media_target_solution) + #If gapfilling mode is independent, restoring cumulative solution to the model + if gapfilling_mode == "Independent": + for item in cumulative_solution: + rxn = self.model.reactions.get_by_id(item[0]) + if item[1] == ">": + rxn.upper_bound = 100 + else: + rxn.lower_bound = -100 + #Restoring the original objective + self.mdlutl.model.objective = original_objective #Return the stripped down solution object containing only needed reactions return current_media_target_solution diff --git a/modelseedpy/core/msmodel.py b/modelseedpy/core/msmodel.py index 36bfdc7c..c6634fd3 100644 --- a/modelseedpy/core/msmodel.py +++ b/modelseedpy/core/msmodel.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import logging import re +import traceback from cobra.core import Model from pyeda.inter import ( expr, diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 5788665e..0d50cc9d 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -352,8 +352,6 @@ def add_ms_reaction(self, rxn_dict, compartment_trans=["c0", "e0"]): metabolites_to_add[cobramet] = stoich cobra_reaction.add_metabolites(metabolites_to_add) cobra_reaction.reaction - print(cobra_reaction.id) - print(len(output)) self.model.add_reactions(output) return output @@ -535,6 +533,27 @@ def convert_cobra_reaction_to_kbreaction( ################################################################################# # Functions related to gapfilling of models ################################################################################# + def convert_solution_to_list(self,solution): + """Converting solution to list format, which is easier to work with + Parameters + ---------- + solution : dict + Specifies the reactions to be added to the model to implement the gapfilling solution + """ + output = [] + for label in ["new","reversed"]: + for rxn_id in solution[label]: + output.append([rxn_id, solution[label][rxn_id],label]) + return output + + def find_item_in_solution(self,input_list,input,ignore_dir=False): + for item in input_list: + if input[0] == item[0] and input[1] == item[1]: + return True + elif ignore_dir and input[0] == item[0]: + return True + return False + def test_solution(self,solution,targets,medias,thresholds=[0.1],remove_unneeded_reactions=False,do_not_remove_list=[]): """Tests if every reaction in a given gapfilling solution is actually needed for growth. Note, this code assumes the gapfilling solution is already integrated. @@ -575,23 +594,11 @@ def test_solution(self,solution,targets,medias,thresholds=[0.1],remove_unneeded_ unneeded = [] #If object is a dictionary, convert to a list if isinstance(solution,dict): - converted_solution = [] - types = ["new", "reversed"] - for key in types: - for rxn_id in solution[key]: - converted_solution.append([rxn_id, solution[key][rxn_id], key]) - solution = converted_solution + solution = self.convert_solution_to_list(solution) #Processing solution in standardized format for item in solution: rxn_id = item[0] rxnobj = self.model.reactions.get_by_id(rxn_id) - #Knocking out the reaction to test for the impact on the objective - if item[1] == ">": - original_bound = rxnobj.upper_bound - rxnobj.upper_bound = 0 - else: - original_bound = rxnobj.lower_bound - rxnobj.lower_bound = 0 #Testing all media and target and threshold combinations to see if the reaction is needed needed = False for (i,target) in enumerate(targets): @@ -600,6 +607,14 @@ def test_solution(self,solution,targets,medias,thresholds=[0.1],remove_unneeded_ self.pkgmgr.getpkg("KBaseMediaPkg").build_package(medias[i]) #Setting the objective self.model.objective = target + #Knocking out the reaction to test for the impact on the objective + #This has to happen after media is applied in case the reaction is an exchange + if item[1] == ">": + original_bound = rxnobj.upper_bound + rxnobj.upper_bound = 0 + else: + original_bound = rxnobj.lower_bound + rxnobj.lower_bound = 0 #Computing the objective value objective = self.model.slim_optimize() if objective < thresholds[i]: @@ -640,20 +655,14 @@ def test_solution(self,solution,targets,medias,thresholds=[0.1],remove_unneeded_ #Do not restore bounds on unneeded reactions and remove reactions from model if their bounds are zero removed_rxns = [] for item in unneeded: - dnr = False - for dnr_item in do_not_remove_list: - if item[0] == dnr_item[0] and item[1] == dnr_item[1]: - #Restoring bounds on reactions that should not be removed - dnr = True - rxnobj = self.model.reactions.get_by_id(item[0]) - if item[1] == ">": - rxnobj.upper_bound = item[3] - else: - rxnobj.lower_bound = item[3] - if not dnr: - rxnobj = self.model.reactions.get_by_id(item[0]) - if rxnobj.lower_bound == 0 and rxnobj.upper_bound == 0: - removed_rxns.append(rxnobj) + rxnobj = self.model.reactions.get_by_id(item[0]) + if self.find_item_in_solution(do_not_remove_list,item): + if item[1] == ">": + rxnobj.upper_bound = item[3] + else: + rxnobj.lower_bound = item[3] + elif rxnobj.lower_bound == 0 and rxnobj.upper_bound == 0 and not self.find_item_in_solution(do_not_remove_list,item,ignore_dir=True): + removed_rxns.append(rxnobj) if len(removed_rxns) > 0: self.model.remove_reactions(removed_rxns) #Restoring the original objective @@ -665,6 +674,7 @@ def test_solution(self,solution,targets,medias,thresholds=[0.1],remove_unneeded_ return unneeded def add_gapfilling(self, solution): + print("Adding gapfilling",str(solution)) self.integrated_gapfillings.append(solution) def create_kb_gapfilling_data(self, kbmodel, atpmedia_ws="94026"): From ebaaaf7155f06265d883199b01d7239b02ded214 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 6 Feb 2024 16:23:41 -0600 Subject: [PATCH 208/298] Updating code for gapfilling and annotation ontology support --- modelseedpy/core/annotationontology.py | 62 +++++--- modelseedpy/core/msatpcorrection.py | 103 +++++++------ modelseedpy/core/msgapfill.py | 35 ++++- modelseedpy/core/msmodelutl.py | 196 +++++++++++++++++++++---- modelseedpy/core/mstemplate.py | 58 ++++++++ modelseedpy/fbapkg/gapfillingpkg.py | 4 +- 6 files changed, 364 insertions(+), 94 deletions(-) diff --git a/modelseedpy/core/annotationontology.py b/modelseedpy/core/annotationontology.py index eabc87f9..d781a70f 100644 --- a/modelseedpy/core/annotationontology.py +++ b/modelseedpy/core/annotationontology.py @@ -51,7 +51,11 @@ def split_role(role): return re.split("\s*;\s+|\s+[\@\/]\s+",role) class AnnotationOntologyEvidence: - def __init__(self, scores={}, ref_entity=None, entity_type=None): + def __init__(self, parent, event, term, probability=1, scores={}, ref_entity=None, entity_type=None): + self.parent = parent + self.event = event + self.term = term + self.probability = probability self.ref_entity = ref_entity self.entity_type = entity_type self.scores = scores @@ -60,11 +64,19 @@ def __init__(self, scores={}, ref_entity=None, entity_type=None): logger.warning(item + " not an allowable score type!") def to_data(self): - return { - "ref_entity": self.ref_entity, - "entity_type": self.entity_type, - "scores": self.scores, + output = { + "event":self.event.method, + "term":self.term.id, + "ontology":self.term.ontology.id, + "probability":self.probability } + if self.ref_entity: + output["ref_entity"] = self.ref_entity + if self.entity_type: + output["entity_type"] = self.entity_type + if self.scores: + output["scores"] = self.scores + return output class AnnotationOntologyTerm: @@ -114,11 +126,11 @@ def __init__(self, parent, feature_id, type=None): self.event_terms = {} self.term_events = {} - def add_event_term(self, event, term, scores={}, ref_entity=None, entity_type=None): + def add_event_term(self, event, term, scores={}, ref_entity=None, entity_type=None,probability=1): if event.id not in self.event_terms: self.event_terms[event.id] = {} self.event_terms[event.id][term.id] = AnnotationOntologyEvidence( - scores, ref_entity, entity_type + self,event,term,probability=probability,scores=scores,ref_entity=ref_entity,entity_type=entity_type ) if term.id not in self.term_events: self.term_events[term.id] = {} @@ -250,7 +262,8 @@ def from_data(data, parent): if "reference" in item["evidence"]: ref_entity = item["evidence"]["reference"][1] entity_type = item["evidence"]["reference"][0] - feature.add_event_term(self, term, scores, ref_entity, entity_type) + probability = 1/len(data["ontology_terms"][feature_id]) + feature.add_event_term(self, term, scores, ref_entity, entity_type,probability) if "modelseed_ids" in item: term.add_msrxns(item["modelseed_ids"]) return self @@ -349,21 +362,36 @@ def get_reaction_gene_hash( ontologies=None, merge_all=False, cds_features=False, + feature_type=None ): output = {} feature_hash = self.genes if len(self.genes) == 0 or (cds_features and len(self.cdss) == 0): feature_hash = self.cdss for feature_id in feature_hash: - reactions = feature_hash[feature_id].get_associated_reactions( - prioritized_event_list, ontologies, merge_all - ) - for rxn_id in reactions: - if rxn_id not in output: - output[rxn_id] = {} - if feature_id not in output[rxn_id]: - output[rxn_id][feature_id] = [] - output[rxn_id][feature_id].append(reactions[rxn_id]) + if not feature_type or feature_type == self.feature_types[feature_id]: + reactions = feature_hash[feature_id].get_associated_reactions( + prioritized_event_list, ontologies, merge_all + ) + for rxn_id in reactions: + if rxn_id not in output: + output[rxn_id] = {} + if feature_id not in output[rxn_id]: + output[rxn_id][feature_id] = {"probability": 0, "evidence": []} + for item in reactions[rxn_id]: + output[rxn_id][feature_id]["evidence"].append(item) + for rxn_id in output: + total_prob = 0 + for feature_id in output[rxn_id]: + sub_total_prob = 0 + for evidence in output[rxn_id][feature_id]["evidence"]: + sub_total_prob += evidence["probability"] + output[rxn_id][feature_id]["probability"] = sub_total_prob + total_prob += sub_total_prob + for feature_id in output[rxn_id]: + output[rxn_id][feature_id]["probability"] = ( + output[rxn_id][feature_id]["probability"] / total_prob + ) return output def add_term(self, term_or_id, ontology=None): diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 75939512..f9373bef 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -91,7 +91,7 @@ def __init__( self.modelutl = MSModelUtil.get(model_or_mdlutl) # Setting atpcorrection attribute in model utl so link is bidirectional self.modelutl.atputl = self - + if default_media_path: self.default_media_path = default_media_path else: @@ -110,25 +110,6 @@ def __init__( if load_default_medias: self.load_default_medias() - media_ids = set() - for media in atp_medias: - if isinstance(media, list): - if media[0].id in media_ids: - raise ValueError("media ids not unique") - media_ids.add(media[0].id) - self.atp_medias.append(media) - else: - if media.id in media_ids: - raise ValueError("media ids not unique") - media_ids.add(media.id) - self.atp_medias.append([media, 0.01]) - self.media_hash[media.id] = media - if "empty" not in self.media_hash: - media = MSMedia.from_dict({}) - media.id = "empty" - media.name = "empty" - self.media_hash[media.id] = media - self.forced_media = [] for media_id in forced_media: for item in self.atp_medias: @@ -144,12 +125,8 @@ def __init__( else: self.coretemplate = core_template - self.msgapfill = MSGapfill( - self.modelutl, - default_gapfill_templates=[core_template], - default_target=self.atp_hydrolysis.id, - ) # These should stay as None until atp correction is actually run + self.msgapfill = None self.cumulative_core_gapfilling = None self.selected_media = None self.original_bounds = {} @@ -160,6 +137,15 @@ def __init__( self.lp_filename = None self.multiplier = 1.2 + def get_msgapfill(self): + if self.msgapfill is None: + self.msgapfill = MSGapfill( + self.modelutl, + default_gapfill_templates=[self.coretemplate], + default_target=self.atp_hydrolysis.id, + ) + return self.msgapfill + def load_default_template(self): self.coretemplate = MSTemplateBuilder.from_dict( get_template("template_core"), None @@ -180,6 +166,28 @@ def load_default_medias(self): media.id = media_id media.name = media_id self.atp_medias.append([media, min_gap.get(media_id, 0.01)]) + + media_ids = set() + temp_medias = self.atp_medias + self.atp_medias = [] + for media in temp_medias: + if isinstance(media, list): + if media[0].id in media_ids: + raise ValueError("media ids not unique") + media_ids.add(media[0].id) + self.atp_medias.append(media) + self.media_hash[media[0].id] = media[0] + else: + if media.id in media_ids: + raise ValueError("media ids not unique") + media_ids.add(media.id) + self.atp_medias.append([media, 0.01]) + self.media_hash[media.id] = media + if "empty" not in self.media_hash: + media = MSMedia.from_dict({}) + media.id = "empty" + media.name = "empty" + self.media_hash[media.id] = media @staticmethod def find_reaction_in_template(model_reaction, template, compartment): @@ -231,7 +239,7 @@ def disable_noncore_reactions(self): self.other_compartments = [] # Iterating through reactions and disabling for reaction in self.model.reactions: - gfrxn = self.msgapfill.gfmodel.reactions.get_by_id(reaction.id) + gfrxn = self.get_msgapfill().gfmodel.reactions.get_by_id(reaction.id) if reaction.id == self.atp_hydrolysis.id: continue if FBAHelper.is_ex(reaction): @@ -279,7 +287,7 @@ def disable_noncore_reactions(self): gfrxn.lower_bound = 0 gfrxn.upper_bound = 0 - def evaluate_growth_media(self): + def evaluate_growth_media(self,no_gapfilling=False): """ Determines how much gap filling each input test media requires to make ATP @@ -287,9 +295,9 @@ def evaluate_growth_media(self): """ self.disable_noncore_reactions() self.media_gapfill_stats = {} - self.msgapfill.default_gapfill_templates = [self.coretemplate] + self.get_msgapfill().default_gapfill_templates = [self.coretemplate] if self.lp_filename: - self.msgapfill.lp_filename = self.lp_filename + self.get_msgapfill().lp_filename = self.lp_filename output = {} with self.model: self.model.objective = self.atp_hydrolysis.id @@ -323,20 +331,21 @@ def evaluate_growth_media(self): self.media_gapfill_stats[media] = {"reversed": {}, "new": {}} # Now running gapfilling on all conditions where initially there was no growth - all_solutions = self.msgapfill.run_multi_gapfill( - media_list, - target=self.atp_hydrolysis.id, - minimum_objectives=min_objectives, - prefilter=False, - check_for_growth=False, - gapfilling_mode="Independent", - run_sensitivity_analysis=False, - integrate_solutions=False, - ) - - # Adding the new solutions to the media gapfill stats - for media in all_solutions: - self.media_gapfill_stats[media] = all_solutions[media] + if not no_gapfilling: + all_solutions = self.get_msgapfill().run_multi_gapfill( + media_list, + target=self.atp_hydrolysis.id, + minimum_objectives=min_objectives, + prefilter=False, + check_for_growth=False, + gapfilling_mode="Independent", + run_sensitivity_analysis=False, + integrate_solutions=False, + ) + print(str(all_solutions)) + # Adding the new solutions to the media gapfill stats + for media in all_solutions: + self.media_gapfill_stats[media] = all_solutions[media] if MSATPCorrection.DEBUG: export_data = {} @@ -415,7 +424,7 @@ def apply_growth_media_gapfilling(self): stats is not None and MSGapfill.gapfill_count(self.media_gapfill_stats[media]) > 0 ): - self.msgapfill.integrate_gapfill_solution( + self.get_msgapfill().integrate_gapfill_solution( stats, self.cumulative_core_gapfilling,check_for_growth=False ) # Adding reactions to gapfilling sensitivity structure so we can track all gapfilled reactions @@ -510,6 +519,12 @@ def build_tests(self, multiplier_hash_override={}): Raises ------ """ + #Checking if ATP stats have been run yet and if not, running them + if not self.selected_media: + logger.warning("ATP tests not yet computed - running without allowing for model changes!") + self.evaluate_growth_media(no_gapfilling=True) + self.determine_growth_media() + self.restore_noncore_reactions() # Applying threshold multiplier for key in default_threshold_multipiers: if key not in multiplier_hash_override: diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 36045c8b..65092334 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -142,7 +142,7 @@ def test_gapfill_database(self, media, target=None, before_filtering=True): ) return False - def prefilter(self,test_conditions=None): + def prefilter(self,test_conditions=None,growth_conditions=[]): """Prefilters the database by removing any reactions that break specified ATP tests Parameters ---------- @@ -152,8 +152,10 @@ def prefilter(self,test_conditions=None): if not test_conditions: test_conditions = self.test_conditions if self.test_conditions: + print("PREFILTERING WITH "+str(len(growth_conditions))+" GROWTH CONDITIONS") self.gfpkgmgr.getpkg("GapfillingPkg").filter_database_based_on_tests( - self.test_conditions + self.test_conditions, + growth_conditions ) gf_filter = self.gfpkgmgr.getpkg("GapfillingPkg").modelutl.get_attributes( "gf_filter", {} @@ -199,7 +201,12 @@ def run_gapfilling( # Filtering if prefilter: - self.prefilter() + self.prefilter(growth_conditions=[{ + "media": media, + "is_max_threshold": False, + "threshold": minimum_obj, + "objective": target, + }]) if not self.test_gapfill_database(media,target,before_filtering=False): return None @@ -276,14 +283,21 @@ def run_global_gapfilling( final_media = [] final_targets = [] final_thresholds = [] + growth_conditions = [] for i,media in enumerate(medias): if self.test_gapfill_database(media,targets[i],before_filtering=True): final_media.append(media) final_targets.append(targets[i]) final_thresholds.append(thresholds[i]) + growth_conditions.append({ + "media": media, + "is_max_threshold": False, + "threshold": thresholds[i], + "objective": targets[i], + }) # Filtering if prefilter: - self.prefilter() + self.prefilter(growth_conditions=growth_conditions) medias = [] targets = [] thresholds = [] @@ -412,7 +426,18 @@ def run_multi_gapfill( default_minimum_objective = self.default_minimum_objective #Running prefiltering once for all media if specified. Rememeber - filtering does not care about the target or media - it is just a set of tests that are run on the database if prefilter: - self.prefilter() + growth_conditions=[] + for media in media_list: + minimum_obj = default_minimum_objective + if media in minimum_objectives: + minimum_obj = minimum_objectives[media] + growth_conditions.append({ + "media": media, + "is_max_threshold": False, + "threshold": minimum_obj, + "objective": target, + }) + self.prefilter(growth_conditions=growth_conditions) #Iterating over all media and running gapfilling solution_dictionary = {} cumulative_solution = [] diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 0d50cc9d..0a84d01a 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -125,8 +125,10 @@ def __init__(self, model): self.test_objective = None self.reaction_scores = None self.score = None + self.breaking_reaction = None self.integrated_gapfillings = [] self.attributes = {} + self.atp_tests = None if hasattr(self.model, "computed_attributes"): if self.model.computed_attributes: self.attributes = self.model.computed_attributes @@ -137,6 +139,88 @@ def __init__(self, model): if "fbas" not in self.attributes: self.attributes["fbas"] = {} + ########Functions related to ATP gapfilling method + def get_atputl(self,atp_media_filename=None,core_template=None,gapfilling_delta=0,max_gapfilling=0,forced_media=[],remake_atputil=False): + """ + Returns and creates, if needed, an atp correction object for the model + + Parameters + ---------- + core_template (optional) : MSTemplate object with core reactions + atp_media_filename (optional) : string to tsv file with ATP media formulations + gapfilling_delta (optional) : maximum difference in gapfilling to accept ATP condition + max_gapfilling (optional) : maximum gapfilling allowable to accept an ATP growth condition + forced_media (optional) : list of media in which model MUST make ATP + + Returns + ------- + MSATPCorrection : Object for ATP correction + + Raises + ------ + """ + if not self.atputl or remake_atputil: + from modelseedpy.core.msatpcorrection import MSATPCorrection + self.atputl = MSATPCorrection( + self,core_template,[], + load_default_medias=True, + max_gapfilling=max_gapfilling, + gapfilling_delta=gapfilling_delta, + forced_media=forced_media, + default_media_path=atp_media_filename + ) + self.atputl = MSATPCorrection(self.model) + return self.atputl + + def get_atp_tests(self,core_template=None,atp_media_filename=None,recompute=False,remake_atputil=False): + """ + Attempts to get ATP tests from attributes and failing that compute denovo using MSATPCorrection + + Parameters + ---------- + core_template (optional) : MSTemplate object with core reactions + atp_media_filename (optional) : string to tsv file with ATP media formulations + + Returns + ------- + list<{"media":obj media,"is_max_threshold":bool,"threshold":float,"objective":string}> + List of test specifications + + Raises + ------ + """ + #Creating MSATPCorrection object which we need regardless + atpcorrection = self.get_atputl(core_template=core_template,atp_media_filename=atp_media_filename,remake_atputil=remake_atputil) + #Returning cached tests if available + if self.atp_tests and not recompute: + return self.atp_tests + #Attempting to pull ATP tests from attributes + if not recompute: + print("Getting tests from attributes") + atp_analysis = self.get_attributes("ATP_analysis",None) + if atp_analysis: + if "tests" in atp_analysis: + self.atp_tests = [] + for item in atp_analysis["tests"]: + if item in atpcorrection.media_hash: + self.atp_tests.append({ + "media":atpcorrection.media_hash[item], + "is_max_threshold":True, + "threshold":atp_analysis["tests"][item]["threshold"], + "objective":atp_analysis["tests"][item]["objective"] + }) + return self.atp_tests + else: + logger.warning("tests attribute missing in ATP analysis. Must recalculate ATP tests!") + else: + logger.warning("ATP analysis attributes missing. Must recalculate ATP tests!") + #If recompute called for or if attributes are missing, recompute tests + if not core_template: + logger.warning("Cannot recompute ATP tests without a core template!") + return None + self.atp_tests = atpcorrection.build_tests() + return self.atp_tests + def compute_automated_reaction_scores(self): """ Computes reaction scores automatically from model data @@ -758,10 +842,10 @@ def apply_test_condition(self, condition, model=None): else: pkgmgr = MSPackageManager.get_pkg_mgr(model) model.objective = condition["objective"] - if condition["is_max_threshold"]: - model.objective.direction = "max" - else: - model.objective.direction = "min" + #if condition["is_max_threshold"]: + model.objective.direction = "max" + #else: TODO - need to revisit this + # model.objective.direction = "min" pkgmgr.getpkg("KBaseMediaPkg").build_package(condition["media"]) def test_single_condition(self, condition, apply_condition=True, model=None): @@ -787,7 +871,6 @@ def test_single_condition(self, condition, apply_condition=True, model=None): if model is None: model = self.model if apply_condition: - print("applying - bad") self.apply_test_condition(condition, model) new_objective = model.slim_optimize() value = new_objective @@ -812,15 +895,16 @@ def test_single_condition(self, condition, apply_condition=True, model=None): ) return False if value >= condition["threshold"] and condition["is_max_threshold"]: - # logger.debug("Failed high:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) + logger.debug("Failed high:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) return False elif value <= condition["threshold"] and not condition["is_max_threshold"]: - # logger.debug("Failed low:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) + logger.info("Failed low:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) return False self.test_objective = new_objective + logger.debug("Passed:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) return True - def test_condition_list(self, condition_list, model=None): + def test_condition_list(self, condition_list, model=None,positive_growth=[]): """Runs a set of test conditions to determine if objective values on set medias exceed thresholds Parameters @@ -841,11 +925,11 @@ def test_condition_list(self, condition_list, model=None): if model == None: model = self.model for condition in condition_list: - if not self.test_single_condition(condition, True, model): + if not self.test_single_condition(condition,apply_condition=True,model=model): return False return True - def linear_expansion_test(self, reaction_list, condition, currmodel): + def linear_expansion_test(self, reaction_list, condition, currmodel,positive_growth=[]): """Tests addition of reactions one at a time Parameters @@ -862,7 +946,7 @@ def linear_expansion_test(self, reaction_list, condition, currmodel): ------ """ # First run the full test - if self.test_single_condition(condition, False, currmodel): + if self.test_single_condition(condition, apply_condition=False, model=currmodel,positive_growth=positive_growth): return [] # First knockout all reactions in the input list and save original bounds filtered_list = [] @@ -879,7 +963,7 @@ def linear_expansion_test(self, reaction_list, condition, currmodel): for item in reaction_list: if item[1] == ">": item[0].upper_bound = original_bound[count] - if not self.test_single_condition(condition, False, currmodel): + if not self.test_single_condition(condition, apply_condition=False, model=currmodel): # logger.debug(item[0].id+":"+item[1]) item[0].upper_bound = 0 if item not in filtered_list: @@ -888,7 +972,7 @@ def linear_expansion_test(self, reaction_list, condition, currmodel): filtered_list.append(item) else: item[0].lower_bound = original_bound[count] - if not self.test_single_condition(condition, False, currmodel): + if not self.test_single_condition(condition, apply_condition=False, model=currmodel): # logger.debug(item[0].id+":"+item[1]) item[0].lower_bound = 0 if item not in filtered_list: @@ -898,7 +982,7 @@ def linear_expansion_test(self, reaction_list, condition, currmodel): count += 1 return filtered_list - def binary_expansion_test(self, reaction_list, condition, currmodel, depth=0): + def binary_expansion_test(self, reaction_list, condition, currmodel, depth=0,positive_growth=[]): """Conducts a binary search for bad reaction combinations Parameters ---------- @@ -918,18 +1002,38 @@ def binary_expansion_test(self, reaction_list, condition, currmodel, depth=0): newdepth = depth + 1 filtered_list = [] # First run the full test - if self.test_single_condition(condition, False, currmodel): + if self.test_single_condition(condition,apply_condition=False,model=currmodel): return [] # Check if input list contains only one reaction: if len(reaction_list) == 1: + print("Failed:"+reaction_list[0][1]+reaction_list[0][0].id) if reaction_list[0][1] == ">": reaction_list[0].append(reaction_list[0][0].upper_bound) reaction_list[0][0].upper_bound = 0 else: reaction_list[0].append(reaction_list[0][0].lower_bound) reaction_list[0][0].lower_bound = 0 - reaction_list[0].append(self.score) - filtered_list.append(reaction_list[0]) + #Check if the reaction passes the positive growth test + success = True + if len(positive_growth) > 0: + #Testing positive growth conditions + for pos_condition in positive_growth: + if not self.test_single_condition(pos_condition,apply_condition=True,model=currmodel): + print("Does not pass positive growth tests:"+reaction_list[0][1]+reaction_list[0][0].id) + success = False + break + #Restoring current test condition + self.apply_test_condition(condition) + if success: + reaction_list[0].append(self.score) + filtered_list.append(reaction_list[0]) + else: + #Restoring reaction + if reaction_list[0][1] == ">": + reaction_list[0][0].upper_bound = reaction_list[0][2] + else: + reaction_list[0][0].lower_bound = reaction_list[0][2] + self.breaking_reaction = reaction_list[0][0] return filtered_list # Break reaction list into two original_bound = [] @@ -950,10 +1054,13 @@ def binary_expansion_test(self, reaction_list, condition, currmodel, depth=0): item[0].lower_bound = 0 # Submitting first half of reactions for testing new_filter = self.binary_expansion_test( - sub_lists[0], condition, currmodel, newdepth + sub_lists[0], condition, currmodel,depth=newdepth,positive_growth=positive_growth ) for item in new_filter: filtered_list.append(item) + if self.breaking_reaction != None: + print("Ending early due to breaking reaction:"+self.breaking_reaction.id) + return filtered_list # Submitting second half of reactions for testing - now only breaking reactions are removed from the first list for i, item in enumerate(reaction_list): if i >= midway_point: @@ -962,18 +1069,36 @@ def binary_expansion_test(self, reaction_list, condition, currmodel, depth=0): else: item[0].lower_bound = original_bound[i] new_filter = self.binary_expansion_test( - sub_lists[1], condition, currmodel, newdepth + sub_lists[1], condition, currmodel,depth=newdepth,positive_growth=positive_growth ) for item in new_filter: filtered_list.append(item) return filtered_list + def check_if_solution_exists(self, reaction_list, condition, model): + original_bound = [] + for i, item in enumerate(reaction_list): + if item[1] == ">": + original_bound.append(item[0].upper_bound) + item[0].upper_bound = 0 + else: + original_bound.append(item[0].lower_bound) + item[0].lower_bound = 0 + result = self.test_single_condition(condition,model=model) + for i, item in enumerate(reaction_list): + if item[1] == ">": + item[0].upper_bound = original_bound[i] + else: + item[0].lower_bound = original_bound[i] + return result + def reaction_expansion_test( self, reaction_list, condition_list, binary_search=True, attribute_label="gf_filter", + positive_growth=[] ): """Adds reactions in reaction list one by one and appplies tests, filtering reactions that fail @@ -993,24 +1118,43 @@ def reaction_expansion_test( ------ """ logger.debug(f"Expansion started! Binary = {binary_search}") + self.breaking_reaction = None filtered_list = [] for condition in condition_list: logger.debug(f"testing condition {condition}") currmodel = self.model tic = time.perf_counter() new_filtered = [] + if not self.check_if_solution_exists(reaction_list, condition, currmodel): + print("No solution exists that passes tests for condition "+condition["media"].id) + return None with currmodel: self.apply_test_condition(condition) if binary_search: - new_filtered = self.binary_expansion_test( - reaction_list, condition, currmodel - ) - for item in new_filtered: - if item not in filtered_list: - filtered_list.append(item) + done = False + while not done: + new_filtered = self.binary_expansion_test( + reaction_list, condition, currmodel,positive_growth=positive_growth + ) + for item in new_filtered: + if item not in filtered_list: + filtered_list.append(item) + if self.breaking_reaction == None: + done = True + else: + #Remove breaking reaction from reaction_list + print("Keeping breaking reaction:"+self.breaking_reaction.id) + for i in range(len(reaction_list)): + if reaction_list[i][0] == self.breaking_reaction: + del reaction_list[i] + break + self.breaking_reaction = None + if not self.check_if_solution_exists(reaction_list, condition, currmodel): + print("No solution exists after retaining breaking reaction:"+self.breaking_reaction.id) + return None else: new_filtered = self.linear_expansion_test( - reaction_list, condition, currmodel + reaction_list, condition, currmodel,positive_growth=positive_growth ) for item in new_filtered: if item not in filtered_list: diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 49fd98c3..072cb9f3 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -15,6 +15,7 @@ get_cmp_token, ) from cobra.core.dictlist import DictList +from typing import TYPE_CHECKING, Dict, Iterable, List, Optional, Tuple, Union # from gevent.libev.corecext import self @@ -1453,6 +1454,63 @@ def _repr_html_(self): num_roles=len(self.roles), num_complexes=len(self.complexes), ) + + def remove_reactions( + self, + reactions: Union[str, Reaction, List[Union[str, Reaction]]], + remove_orphans: bool = False, + ) -> None: + """Remove reactions from the template. + + The change is reverted upon exit when using the model as a context. + + Parameters + ---------- + reactions : list or reaction or str + A list with reactions (`cobra.Reaction`), or their id's, to remove. + Reaction will be placed in a list. Str will be placed in a list and used to + find the reaction in the model. + remove_orphans : bool, optional + Remove orphaned genes and metabolites from the model as + well (default False). + """ + if isinstance(reactions, str) or hasattr(reactions, "id"): + warn("need to pass in a list") + reactions = [reactions] + + for reaction in reactions: + # Make sure the reaction is in the model + try: + reaction = self.reactions[self.reactions.index(reaction)] + except ValueError: + warn(f"{reaction} not in {self}") + + else: + self.reactions.remove(reaction) + + """ for met in reaction._metabolites: + if reaction in met._reaction: + met._reaction.remove(reaction) + if context: + context(partial(met._reaction.add, reaction)) + if remove_orphans and len(met._reaction) == 0: + self.remove_metabolites(met) + + for gene in reaction._genes: + if reaction in gene._reaction: + gene._reaction.remove(reaction) + if context: + context(partial(gene._reaction.add, reaction)) + + if remove_orphans and len(gene._reaction) == 0: + self.genes.remove(gene) + if context: + context(partial(self.genes.add, gene)) + + # remove reference to the reaction in all groups + associated_groups = self.get_associated_groups(reaction) + for group in associated_groups: + group.remove_members(reaction) """ class MSTemplateBuilder: diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index 054845bd..66e44cb6 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -740,7 +740,7 @@ def reset_objective_minimum(self, min_objective,reset_params=True): if min_objective < 0: self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].ub = min_objective - def filter_database_based_on_tests(self, test_conditions): + def filter_database_based_on_tests(self, test_conditions,growth_conditions=[]): #Saving the current media current_media = self.current_media() #Clearing element uptake constraints @@ -808,7 +808,7 @@ def filter_database_based_on_tests(self, test_conditions): # Checking for model reactions that can be removed to enable all tests to pass self.reset_objective_minimum(0,False) filtered_list = self.modelutl.reaction_expansion_test( - self.parameters["original_reactions"], test_conditions + self.parameters["original_reactions"], test_conditions,positive_growth=growth_conditions ) for item in filtered_list: logger.debug("Filtering:" + item[0].id + item[1]) From 7502e5154d14602b65446a0e832fa47adafb7c5b Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Fri, 9 Feb 2024 16:14:12 -0600 Subject: [PATCH 209/298] rast regex --- modelseedpy/core/rast_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/rast_client.py b/modelseedpy/core/rast_client.py index fc575237..97211add 100644 --- a/modelseedpy/core/rast_client.py +++ b/modelseedpy/core/rast_client.py @@ -70,7 +70,7 @@ def annotate_genome(self, genome): for o in res[0]["features"]: feature = genome.features.get_by_id(o["id"]) if "function" in o: - functions = re.split("; | / | @ | => ", o["function"]) + functions = re.split("; | / | @", o["function"]) for function in functions: feature.add_ontology_term("RAST", function) From 491a200662b98100b5db45d875bc99bbd56bf22b Mon Sep 17 00:00:00 2001 From: Jeremy Date: Wed, 14 Feb 2024 12:23:29 -0800 Subject: [PATCH 210/298] Major updates to weighting / expression data function --- modelseedpy/core/msgapfill.py | 132 ++++++++++++++++------------------ 1 file changed, 60 insertions(+), 72 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 53a52b07..5c79fb9c 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -130,9 +130,9 @@ def test_gapfill_database(self, media, target=None, before_filtering=True): if before_filtering: filter_msg = " before filtering " note = "FBF" - gf_sensitivity[media.id][target][ - note - ] = self.mdlutl.find_unproducible_biomass_compounds(target) + gf_sensitivity[media.id][target][note] = ( + self.mdlutl.find_unproducible_biomass_compounds(target) + ) if target != "rxn00062_c0": self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") logger.warning( @@ -387,71 +387,70 @@ def integrate_gapfill_solution( gf_sensitivity[solution["media"].id] = {} if solution["target"] not in gf_sensitivity[solution["media"].id]: gf_sensitivity[solution["media"].id][solution["target"]] = {} - gf_sensitivity[solution["media"].id][solution["target"]][ - "success" - ] = self.mdlutl.find_unproducible_biomass_compounds( - solution["target"], cumulative_solution + gf_sensitivity[solution["media"].id][solution["target"]]["success"] = ( + self.mdlutl.find_unproducible_biomass_compounds( + solution["target"], cumulative_solution + ) ) self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") self.cumulative_gapfilling.extend(cumulative_solution) - def compute_reaction_weights_from_expression_data(self, omics_data, conditions=[]): + def compute_reaction_weights_from_expression_data(self, omics_data, annoont): """Computing reaction weights based on input gene-level omics data Parameters ---------- omics_data : pandas dataframe with genes as rows and conditions as columns Specifies the reactions to be added to the model to implement the gapfilling solution - conditions : list - Optional array containing the IDs of the columns in omics_data from which data should be used. - If an empty array (or no array) is supplied, data from all columns will be used. When multiple columns are - used, the data from those columns should be normalized first, then added together + annoont : annoont object + Contains reaction, feature id, ontologies, probabilities. Restructured into dataframe in function Returns : A dictionary with Rxns as the keys and calculated result as the value. """ - # Validitions: - # 1.) An conditions listed in the conditions argument should match the columns in the omics_data dataframe - # 2.) Most (~80%) of the genes in the model should match genes in the omics_data dataframe - # 3.) The omics_data dataframe should have at least 2 columns - # 4.) The omics_data dataframe should have at least 2 rows - # 5.) Logging should be used to report out which genes in the model don't match any genes in the omics_data dataframe - - # Assumptions: - # omics_data is an input with the following columns: - # Col 1: Gene - # Col 2: Reactions - # Cols 3-9: Annotations - # Unlike with the MATLAB code, this will not check if rxn is not in draft - this is only making calculations based on the columns in omics_data. - # Notes: - # This has only been tested on dummy data and in this case python performs the same as MATLAB. However, this needs to be tested with an example input. - # Two outputs are currently created. - # A table that matches with t in the MATLAB code. - # The requested hash (dictionary) with Rxns and floats. - # Many more inputs were required with the MATLAB code, this has attempted to condense everything to handle the single input. - # Conditions has not been added yet. I think as other questions are answered, the use for this will be more clear. - - # Questions - # When might the example data be updated? - # Are other inputs required? - # Is this output (Dictionary with RXN: Value), correct? - # When will the next steps for setting up the kbase jupyter notebook be ready? - - measuredGeneScore = np.zeros( - (omics_data.shape[0], len(omics_data.columns[3:10])) - ) - num_cols = len(omics_data.columns[3:10]) + ### Restructure annoont into Dataframe + rows_list = [] + for reaction, genes in annoont.get_reaction_gene_hash().items(): + for gene, gene_info in genes.items(): + # Initialize the row with 'Gene' and 'Reactions' + row = {"Gene": gene, "Reactions": reaction} + # Loop through each evidence in the gene's evidence list + for evidence in gene_info["evidence"]: + # Construct column name from the event and ontology for uniqueness + column_name = f"{evidence['ontology']}" + if column_name in row: + row[column_name] = f"{row[column_name]}, {evidence['term']}" + else: + row[column_name] = evidence["term"] + rows_list.append(row) + restructured_anoot = pd.DataFrame(rows_list) + + ### Integrate Omics, set weights, find indexes for features + feature_ids_set = set(omics_data["feature_ids"]) + + # Find indices where 'Gene' values are in 'feature_ids' + # isin method returns a boolean series that is True where tbl_supAno['Gene'] is in feature_ids_set + mask = restructured_anoot["Gene"].isin(feature_ids_set) + # Get the indices of True values in the mask + idx_measuredGene = mask[mask].index.tolist() + # Calculate the dimensions for the measuredGeneScore array + num_genes = len(restructured_anoot["Gene"]) + num_columns = len(restructured_anoot.columns[2:]) + # Initialize the measuredGeneScore array with zeros + measuredGeneScore = np.zeros((num_genes, num_columns)) + measuredGeneScore[idx_measuredGene, :] = 1 + num_weights = len(restructured_anoot.columns[3:]) + w = np.repeat(1 / num_weights, num_weights) + + ### Calculate Weights and generate the reaction/weight hash + num_cols = len(restructured_anoot.columns[2:]) w = np.full((num_cols, 1), 1 / num_cols) - p = np.zeros(len(omics_data["Reactions"])) - - # t is table to match and check against MatLab code. - t = pd.DataFrame() - # rxn_hash is the desired output - rxn_hash = {} - - for rxn in range(0, len(omics_data)): - substr_rxns = [rxn for rxn in omics_data["Reactions"][[rxn]]] + p = np.zeros(len(restructured_anoot["Reactions"])) + # computed_weights is the rxn_hash ({rxn: weight, ...}) + computed_weights = {} + for rxn in range(0, len(restructured_anoot)): + substr_rxns = [rxn for rxn in restructured_anoot["Reactions"][[rxn]]] # Get the indices of the rows where the condition is True - mask = omics_data["Reactions"].apply( + mask = restructured_anoot["Reactions"].apply( lambda x: any(substr in x for substr in substr_rxns) ) idx_gene = mask[mask].index @@ -463,22 +462,22 @@ def compute_reaction_weights_from_expression_data(self, omics_data, conditions=[ # number of genes that map to a reaction nAG = len(idx_gene) for iGene in range(0, nAG): - subset = omics_data.iloc[idx_gene[iGene], 3:9].to_numpy() + subset = restructured_anoot.iloc[idx_gene[iGene], 2:].to_numpy() # Checking for non-empty elements in the subset non_empty_check = np.vectorize(lambda x: x is not None and x == x)( subset - ) # x == x checks for NaN + ) # Finding the maximum value between the non-empty check and the corresponding row in measuredGeneScore max_value = np.maximum( non_empty_check, measuredGeneScore[idx_gene[iGene], :] ) # Multiplying by the weight and adding to nMG nMG += max(sum((max_value * w))) - selected_gene = omics_data["Gene"].iloc[idx_gene[iGene]] + selected_gene = restructured_anoot["Gene"].iloc[idx_gene[iGene]] # Finding reactions associated with genes that contain the selected gene - associated_reactions = omics_data["Reactions"][ - omics_data["Gene"].str.contains(selected_gene) + associated_reactions = restructured_anoot["Reactions"][ + restructured_anoot["Gene"].str.contains(selected_gene) ] # Checking if there are more than one unique reactions if len(associated_reactions.unique()) > 1: @@ -486,21 +485,10 @@ def compute_reaction_weights_from_expression_data(self, omics_data, conditions=[ p[rxn] = (nMG / nAG) * (1 / (1 + (nCG / nAG))) - # format table - new_row = { - "iRxn": rxn, - "nMG": nMG, - "nCG": nCG, - "nAG": nAG, - "Values": p[rxn], # Values is equivalent to Var5 in the MatLab Code - } - - # Append the new row to the table - t = t.append(new_row, ignore_index=True) - # Add item to output rxn dictionary - rxn_hash[omics_data.iloc[rxn, 0]] = p[rxn] + # Add item to output rxn hash dictionary + computed_weights[restructured_anoot.iloc[rxn, 0]] = p[rxn] - return rxn_hash + return computed_weights @staticmethod def gapfill( From 0a45528cb5471b3efc36a786f78c64946c7ec020 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 11 Mar 2024 13:10:56 -0500 Subject: [PATCH 211/298] Adding ensemble class and uploading fixes to gapfilling --- modelseedpy/core/msensemble.py | 266 ++++++++++++++++++++++++++++ modelseedpy/core/msgapfill.py | 43 ++++- modelseedpy/core/msmodelutl.py | 12 +- modelseedpy/fbapkg/gapfillingpkg.py | 43 +++-- 4 files changed, 333 insertions(+), 31 deletions(-) create mode 100644 modelseedpy/core/msensemble.py diff --git a/modelseedpy/core/msensemble.py b/modelseedpy/core/msensemble.py new file mode 100644 index 00000000..d7ea2b37 --- /dev/null +++ b/modelseedpy/core/msensemble.py @@ -0,0 +1,266 @@ +# -*- coding: utf-8 -*- +import logging +import re +import time +import json +import sys +import pandas as pd +import cobra +import random +from cobra.core.dictlist import DictList +from optlang.symbolics import Zero, add +from modelseedpy.fbapkg.mspackagemanager import MSPackageManager +from modelseedpy.core.msmodelutl import MSModelUtil +from modelseedpy.core.msfba import MSFBA +from modelseedpy.core.msatpcorrection import MSATPCorrection + +# from builtins import None + +logger = logging.getLogger(__name__) +logger.setLevel( + logging.INFO +) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO + +class MSEnsemble: + @staticmethod + def from_models(models): + #Converting models to MSModelUtil + if not isinstance(model_or_mdlutl, MSModelUtil): + for (i,mdl) in enumerate(models): + models[i] = MSModelUtil.get(mdl) + #Cloning the first model as a starting point + clone_model = cobra.io.json.from_json(cobra.io.json.to_json(models[0].model)) + clone_mdlutl = MSModelUtil.get(clone_model) + ensemble = MSEnsemble(clone_mdlutl) + ensemble.rebuild_from_models(models) + + def from_annotation(model_or_mdlutl,reaction_probability_hash,sample_count=100): + #Create genome from probabilities + mdl = MSBuilder(genome,template).build(base_model, '0', False, False) + mdl.template = self.gs_template + mdlutl = MSModelUtil.get(mdl) + ensemble = MSEnsemble(mdlutl) + ensemble.build_ensemble(reaction_probability_hash, gpr_level_sampling, sample_count) + + def __init__(self,model_or_mdlutl): + # Discerning input is model or mdlutl and setting internal links + if isinstance(model_or_mdlutl, MSModelUtil): + self.model = model_or_mdlutl.model + self.mdlutl = model_or_mdlutl + else: + self.model = model_or_mdlutl + self.mdlutl = MSModelUtil.get(model_or_mdlutl) + self.data = { + "size": self.size, + "reactions": {} + } + attributes = self.mdlutl.get_attributes() + if "ensemble" not in attributes: + for rxn in self.model.reactions: + self.data["reactions"][rxn.id] = { + "presence": "", + "gapfilling":"", + "genes": {} + } + for gene in rxn.genes: + self.data["reactions"][rxn.id]["genes"][gene.id] = { + "presence": "" + } + logger.warning("Input model is not an ensemble model. You will need to run build_ensemble() to create an ensemble model.") + else: + self.data = attributes["ensemble"] + + def rebuild_from_models(self,models):#DONE + #Clearing existing data + self.data["ATP_analysis"] = {"core_atp_gapfilling":{},"selected_media":{},"tests":{}} + for rxnid in self.data["reactions"]: + self.data["reactions"][rxnid]["presence"] = "" + self.data["reactions"][rxnid]["gapfilling"] = "" + if "genes" in self.data["reactions"][rxnid]: + for geneid in self.data["reactions"][rxnid]["genes"]: + self.data["reactions"][rxnid]["genes"][geneid]["presence"] = "" + else: + self.data["reactions"][rxnid]["genes"] = {} + #Building presence strings from models + self.data["size"] = len(models) + for (i,mdlutl) in enumerate(models): + attributes = mdlutl.get_attributes() + if "ATP_analysis" in attributes: + if "core_atp_gapfilling" in attributes["ATP_analysis"]: + for media in attributes["ATP_analysis"]["core_atp_gapfilling"]: + if media not in self.data["ATP_analysis"]["core_atp_gapfilling"]: + self.data["ATP_analysis"]["core_atp_gapfilling"][media] = [] + for j in range(i): + self.data["ATP_analysis"]["core_atp_gapfilling"][media].append(None) + self.data["ATP_analysis"]["core_atp_gapfilling"][media].append(attributes["ATP_analysis"]["core_atp_gapfilling"][media]) + + if "selected_media" in attributes["ATP_analysis"]: + for media in attributes["ATP_analysis"]["selected_media"]: + if media not in self.data["ATP_analysis"]["selected_media"]: + self.data["ATP_analysis"]["selected_media"][media] = [] + for j in range(i): + self.data["ATP_analysis"]["selected_media"][media].append(None) + self.data["ATP_analysis"]["selected_media"][media].append(attributes["ATP_analysis"]["selected_media"][media]) + if "tests" in attributes["ATP_analysis"]: + for media in attributes["ATP_analysis"]["tests"]: + if media not in self.data["ATP_analysis"]["tests"]: + self.data["ATP_analysis"]["tests"][media] = {"objective":attributes["ATP_analysis"]["tests"][media]["objective"],"threshold":[]} + for j in range(i): + self.data["ATP_analysis"]["tests"][media]["threshold"].append(None) + self.data["ATP_analysis"]["tests"][media]["threshold"].append(attributes["ATP_analysis"]["tests"][media]["threshold"]) + add_reactions = [] + for rxn in mdlutl.model.reactions: + if rxn.id not in self.mdlutl.model.reactions: + add_reactions.append(rxn) + if rxn.id not in self.data["reactions"]: + self.data["reactions"][rxn.id] = { + "presence":'0' * i, + "genes":{} + } + self.data["reactions"][rxn.id]["presence"] += "1" + for gene in rxn.genes: + if gene.id not in self.data["reactions"][rxn.id]["genes"]: + self.data["reactions"][rxn.id]["genes"][gene.id] = '0' * i + self.data["reactions"][rxn.id]["genes"][gene.id] += "1" + self.mdlutl.model.add_reactions(add_reactions) + #Updating GPR of base model + for rxnid in self.data["reactions"]: + rxn = self.mdlutl.model.reactions.get_by_id(rxnid) + rxn.gene_reaction_rule = " or ".join(self.data["reactions"][rxnid]["genes"].keys()) + #Computing probabilities from presence if missing + for rxnid in self.ensemble_data["reactions"]: + if "probabilty" not in self.ensemble_data["reactions"][rxnid]: + self.ensemble_data["reactions"][rxnid]["probabilty"] = self.ensemble_data["reactions"][rxnid]["presence"].count('1')/len(self.ensemble_data["reactions"][rxnid]["presence"]) + for geneid in self.ensemble_data["reactions"][rxnid]["genes"]: + if "probabilty" not in self.ensemble_data["reactions"][rxnid]["genes"][geneid]: + self.ensemble_data["reactions"][rxnid]["genes"][geneid]["probabilty"] = self.ensemble_data["reactions"][rxnid]["genes"][geneid]["presence"].count('1')/len(self.ensemble_data["reactions"][rxnid]["genes"][geneid]["presence"]) + + def sample_from_probabilities(self,from_reaction_probabilities=False,sample_count=1000): + #Scrolling through ensemble data with probabilities + for rxnid in self.data["reactions"]: + if "probability" not in self.data["reactions"][rxnid]: + logger.critical("Reaction probability missing for "+rxnid+"!") + return None + if rxnid not in self.mdlutl.model.reactions: + logger.critical("Reaction probability for "+rxnid+" but reaction not in base model!") + return None + rxn = self.mdlutl.model.reactions.get_by_id(rxnid) + #Clearing existing data + self.data["reactions"][rxnid]["presence"] = "" + self.data["reactions"][rxnid]["gapfilling"] = "" + #Loading gene-level data + if "genes" not in self.data["reactions"][rxnid]: + self.data["reactions"][rxnid]["genes"] = {} + for gene in rxn.genes: + if gene.id not in self.data["reactions"][rxnid]["genes"] or "probability" not in self.data["reactions"][rxnid]["genes"][gene.id]: + logger.warning("Reaction "+rxnid+" has gene "+gene.id+" but no associated probability data!") + self.data["reactions"][rxnid]["genes"][gene.id] = {"presence":"","probablity":1} + self.data["reactions"][rxnid]["genes"][gene.id]["presence"] = "" + #Sampling from probabilities + for i in range(sample_count): + if from_reaction_probabilities: + for rxnid in self.data["reactions"]: + if random.uniform(0,1) < self.data["reactions"][rxnid]["probability"]: + self.data["reactions"][rxnid]["presence"] += "1" + else: + self.data["reactions"][rxnid]["presence"] += "0" + for geneid in self.data["reactions"][rxnid]["genes"]: + self.data["reactions"][rxnid]["genes"][geneid]["presence"] += "1" + else: + present = False + for geneid in self.data["reactions"][rxnid]["genes"]: + if random.uniform(0,1) < self.data["reactions"][rxnid]["genes"][geneid]["probability"]: + present = True + self.data["reactions"][rxnid]["genes"][geneid]["presence"] += "1" + else: + self.data["reactions"][rxnid]["genes"][geneid]["presence"] += "0" + if present: + self.data["reactions"][rxnid]["presence"] += "1" + else: + self.data["reactions"][rxnid]["presence"] += "0" + + def unpack_models(self,model_list=None): + output_models = [None]*self.size + for i in range(self.size): + if not model_list or i in model_list: + clone_mdl = cobra.io.json.from_json(cobra.io.json.to_json(self.model)) + clone_mdl_utl = MSModelUtil.get(clone_mdl) + remove_reactions = [] + for rxn in clone_mdl_utl.model.reactions: + if rxn.id in self.data["reactions"]: + if self.data["reactions"][rxn.id][i] == "0": + remove_reactions.append(rxn) + else: + new_genes = [] + for gene in rxn.genes: + if gene.id in self.data["reactions"][rxn.id]["genes"]: + if self.data["reactions"][rxn.id]["genes"][gene.id][i] == "1": + new_genes.append(gene) + rxn.gene_reaction_rule = " or ".join([gene.id for gene in new_genes]) + else: + logger.warning("Ensemble model contains reaction not included in ensemble data. Removing reaction "+rxn.id+" from ensemble model.") + remove_reactions.append(rxn) + clone_mdl.remove_reactions(remove_reactions) + if "ATP_analysis" in self.data: + attributes = clone_mdl_utl.get_attributes() + attributes["ATP_analysis"] = {"core_atp_gapfilling":{},"selected_media":{},"tests":{}} + for media in self.data["ATP_analysis"]["core_atp_gapfilling"]: + if self.data["ATP_analysis"]["core_atp_gapfilling"][media][i] != None: + attributes["ATP_analysis"]["core_atp_gapfilling"][media] = self.data["ATP_analysis"]["core_atp_gapfilling"][media][i] + for media in self.data["ATP_analysis"]["selected_media"]: + if self.data["ATP_analysis"]["selected_media"][media][i] != None: + attributes["ATP_analysis"]["selected_media"][media] = self.data["ATP_analysis"]["selected_media"][media][i] + for media in self.data["ATP_analysis"]["tests"]: + if self.data["ATP_analysis"]["tests"][media]["threshold"][i] != None: + attributes["ATP_analysis"]["tests"][media] = { + "objective":self.data["ATP_analysis"]["tests"][media]["objective"], + "threshold":self.data["ATP_analysis"]["tests"]["threshold"][media][i] + } + clone_mdl_utl.save_attributes(attributes) + output_models[i] = clone_mdl_utl + return output_models + + def save_ensemble_model(self): + self.mdlutl.save_attributes(self.data,"ensemble") + return self.mdlutl + + def run_fba(self,media,objective,maximize,gene_ko=[],reaction_ko=[],pfba=True,fva=True): + msfba = MSFBA(self.model,media,objective,maximize,gene_ko,reaction_ko,pfba,fva,clone=True) + msfba.run() + models = self.unpack_models() + #Iterating over each model to run FBA on each + for mdlutl in models: + subfba = MSFBA(mdlutl,media,objective,maximize,gene_ko,reaction_ko,pfba,fva,clone=False) + subfba.run() + msfba.add_secondary_solution(subfba.primary_solution,subfba.fva_results) + return msfba + + def run_atp_method( + self, + core_template=None, + atp_medias=[], + compartment="c0", + max_gapfilling=10, + gapfilling_delta=0, + atp_hydrolysis_id=None, + load_default_medias=True, + forced_media=[], + default_media_path=None, + ): + models = self.unpack_models() + for mdlutl in models: + atpcorrection = MSATPCorrection( + core_template, + atp_medias, + compartment, + max_gapfilling, + gapfilling_delta, + atp_hydrolysis_id, + load_default_medias, + forced_media, + default_media_path + ) + tests = atpcorrection.run_atp_correction() + self.rebuild_from_models(models) + + def run_gapfilling(self): diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 65092334..ad365946 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -52,6 +52,7 @@ def __init__( if not atp_gapfilling: self.mdlutl.gfutl = self self.auto_sink = [ + "cpd01042", "cpd02701", "cpd11416", "cpd15302", @@ -113,6 +114,8 @@ def test_gapfill_database(self, media, target=None, before_filtering=True): target = str(self.gfmodel.objective) target = target.split(" ")[0] target = target[13:] + #Setting media + self.gfpkgmgr.getpkg("KBaseMediaPkg").build_package(media) if self.gfpkgmgr.getpkg("GapfillingPkg").test_gapfill_database(): return True gf_sensitivity = {} @@ -152,7 +155,7 @@ def prefilter(self,test_conditions=None,growth_conditions=[]): if not test_conditions: test_conditions = self.test_conditions if self.test_conditions: - print("PREFILTERING WITH "+str(len(growth_conditions))+" GROWTH CONDITIONS") + logger.debug(f"PREFILTERING WITH {str(len(growth_conditions))} GROWTH CONDITIONS") self.gfpkgmgr.getpkg("GapfillingPkg").filter_database_based_on_tests( self.test_conditions, growth_conditions @@ -215,7 +218,7 @@ def run_gapfilling( with open(self.lp_filename, "w") as out: out.write(str(self.gfmodel.solver)) - # Running gapfilling and checking solution + # Running gapfil/ling and checking solution sol = self.gfmodel.optimize() logger.debug( f"gapfill solution objective value {sol.objective_value} ({sol.status}) for media {media}" @@ -424,6 +427,15 @@ def run_multi_gapfill( #Setting the default minimum objective if not default_minimum_objective: default_minimum_objective = self.default_minimum_objective + #Checking that each media to ensure gapfilling works before filtering + for media in media_list: + if not self.test_gapfill_database(media,target,before_filtering=True): + #Remove media that fail initial test + print("Removing ungapfillable media "+media.id) + media_list.remove(media) + #If there are no media left, don't run gapfilling + if len(media_list) == 0: + return None #Running prefiltering once for all media if specified. Rememeber - filtering does not care about the target or media - it is just a set of tests that are run on the database if prefilter: growth_conditions=[] @@ -473,7 +485,7 @@ def run_multi_gapfill( if gapfilling_mode == "Cumulative": self.gfpkgmgr.getpkg("GapfillingPkg").compute_gapfilling_penalties(exclusion_solution=cumulative_solution,reaction_scores=self.reaction_scores) self.gfpkgmgr.getpkg("GapfillingPkg").build_gapfilling_objective_function() - if gapfilling_mode == "Global": + if gapfilling_mode == "Global":b #Now we run simultaneous gapfilling on a combination of all our various gapfilled models full_solution = self.run_global_gapfilling( media_list, @@ -558,7 +570,7 @@ def integrate_gapfill_solution( gapfilling_mode : Cumulative, Independent, Simultaneous Specify what the gapfilling mode is because this determines how integration is performed """ - print("Initial solution:",str(solution)) + logger.debug(f"Initial solution: {str(solution)}") original_objective = self.mdlutl.model.objective self.mdlutl.model.objective = solution["target"] self.mdlutl.model.objective.direction = "max" @@ -575,6 +587,7 @@ def integrate_gapfill_solution( list_solution = self.mdlutl.convert_solution_to_list(solution) for item in list_solution: if item[0] not in self.model.reactions: + logger.debug(f"adding reaction: {str(item[0])}") #Copying and adding the reaction to the model rxn = self.gfmodel.reactions.get_by_id(item[0]) rxn = rxn.copy() @@ -582,20 +595,32 @@ def integrate_gapfill_solution( #Clearing current bounds because we only want to add reaction in the direction it was gapfilled in rxn.upper_bound = 0 rxn.lower_bound = 0 + logger.debug(f"integrating rxn: {item[0]}") + rxn = self.model.reactions.get_by_id(item[0]) + #Setting genes if the reaction has no genes + if len(rxn.genes) == 0: #Setting genes from reaction scores in we have them coreid = re.sub(r"_[a-z]\d+$", "", item[0]) if coreid in self.reaction_scores: + logger.debug(f"Found reaction scores for coreid: {coreid}") bestgene = None + bestscore = None for gene in self.reaction_scores[coreid]: + score = None + if isinstance(self.reaction_scores[coreid][gene], dict): + score = self.reaction_scores[coreid][gene]["probability"] + else: + score = self.reaction_scores[coreid][gene] if ( not bestgene - or self.reaction_scores[coreid][gene] - > self.reaction_scores[coreid][bestgene] + or score + > bestscore ): bestgene = gene + bestscore = score rxn = self.model.reactions.get_by_id(item[0]) + logger.debug(f"Assigning gene to reaction: {item[0]} {bestgene}") rxn.gene_reaction_rule = bestgene - rxn = self.model.reactions.get_by_id(item[0]) #Setting bounds according to the direction the reaction was gapfilled in if item[1] == ">": rxn.upper_bound = 100 @@ -629,12 +654,12 @@ def integrate_gapfill_solution( cumulative_solution.append(item) #elif not remove_unneeded_reactions: # cumulative_solution.append(item) - print("Unneeded:",str(unneeded)) + logger.debug(f"Unneeded: {str(unneeded)}") #Checking that the final integrated model grows if check_for_growth: self.mdlutl.pkgmgr.getpkg("KBaseMediaPkg").build_package(solution["media"]) current_media_target_solution["growth"] = self.mdlutl.model.slim_optimize() - print("Growth:",str(current_media_target_solution["growth"]),solution["media"].id) + logger.debug(f"Growth: {str(current_media_target_solution['growth'])} {solution['media'].id}") # Adding the gapfilling solution data to the model, which is needed for saving the model in KBase self.mdlutl.add_gapfilling(current_media_target_solution) #If gapfilling mode is independent, restoring cumulative solution to the model diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 0a84d01a..b93671ae 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -236,6 +236,8 @@ def build_metabolite_hash(self): self.metabolite_hash = {} self.search_metabolite_hash = {} for met in self.model.metabolites: + if len(met.id.split("_")) == 2: + self.add_name_to_metabolite_hash(met.id.split("_")[0],met) self.add_name_to_metabolite_hash(met.id, met) self.add_name_to_metabolite_hash(met.name, met) for anno in met.annotation: @@ -248,11 +250,13 @@ def build_metabolite_hash(self): def add_name_to_metabolite_hash(self, name, met): if name not in self.metabolite_hash: self.metabolite_hash[name] = [] - self.metabolite_hash[name].append(met) + if met not in self.metabolite_hash[name]: + self.metabolite_hash[name].append(met) sname = MSModelUtil.search_name(name) if sname not in self.search_metabolite_hash: self.search_metabolite_hash[sname] = [] - self.search_metabolite_hash[sname].append(met) + if met not in self.search_metabolite_hash[sname]: + self.search_metabolite_hash[sname].append(met) def find_met(self, name, compartment=None): if self.metabolite_hash == None: @@ -898,7 +902,7 @@ def test_single_condition(self, condition, apply_condition=True, model=None): logger.debug("Failed high:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) return False elif value <= condition["threshold"] and not condition["is_max_threshold"]: - logger.info("Failed low:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) + print("Failed low:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) return False self.test_objective = new_objective logger.debug("Passed:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) @@ -1148,10 +1152,10 @@ def reaction_expansion_test( if reaction_list[i][0] == self.breaking_reaction: del reaction_list[i] break - self.breaking_reaction = None if not self.check_if_solution_exists(reaction_list, condition, currmodel): print("No solution exists after retaining breaking reaction:"+self.breaking_reaction.id) return None + self.breaking_reaction = None else: new_filtered = self.linear_expansion_test( reaction_list, condition, currmodel,positive_growth=positive_growth diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index 66e44cb6..c4a73794 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -21,10 +21,10 @@ logger = logging.getLogger(__name__) logger.setLevel( - logging.WARNING + logging.INFO ) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO -base_blacklist = {} +base_blacklist = {}#{"rxn00062":"="} zero_threshold = 1e-8 @@ -74,7 +74,7 @@ def build_package(self, parameters): parameters, [], { - "auto_sink": ["cpd02701", "cpd11416", "cpd15302", "cpd03091"], + "auto_sink": ["cpd01042","cpd02701", "cpd11416", "cpd15302", "cpd03091"], "extend_with_template": 1, "model_penalty": 1, "default_gapfill_models": [], @@ -119,7 +119,7 @@ def build_package(self, parameters): # Creating the gapfilling objective function and saving it under self.parameters["gfobj"] self.build_gapfilling_objective_function() - + def extend_model_for_gapfilling(self): """Extends the model for gapfilling Parameters @@ -191,20 +191,25 @@ def compute_gapfilling_penalties(self,exclusion_solution=None,reaction_scores=No reaction_scores = self.parameters["reaction_scores"] for reaction in self.gapfilling_penalties: rxnid = reaction.split("_")[0] + highest_score = 0 if rxnid in reaction_scores: - highest_score = 0 for gene in reaction_scores[rxnid]: - if highest_score < reaction_scores[rxnid][gene]: - highest_score = reaction_scores[rxnid][gene] - factor = 0.1 - if "reverse" in self.gapfilling_penalties[reaction]: - self.gapfilling_penalties[reaction]["reverse"] = ( - factor * self.gapfilling_penalties[reaction]["reverse"] - ) - if "forward" in self.gapfilling_penalties[reaction]: - self.gapfilling_penalties[reaction]["forward"] = ( - factor * self.gapfilling_penalties[reaction]["forward"] - ) + score = None + if isinstance(reaction_scores[rxnid][gene], dict): + score = reaction_scores[rxnid][gene]["probability"] + else: + score = reaction_scores[rxnid][gene] + if highest_score < score: + highest_score = score + factor = 2-highest_score + if "reverse" in self.gapfilling_penalties[reaction]: + self.gapfilling_penalties[reaction]["reverse"] = ( + factor * self.gapfilling_penalties[reaction]["reverse"] + ) + if "forward" in self.gapfilling_penalties[reaction]: + self.gapfilling_penalties[reaction]["forward"] = ( + factor * self.gapfilling_penalties[reaction]["forward"] + ) def build_gapfilling_objective_function(self): """Builds gapfilling objective function for model @@ -460,7 +465,7 @@ def extend_model_with_template_for_gapfilling(self, template, index): new_exchange, new_demand = self.extend_model_with_template_metabolites( template, index ) - + for template_reaction in template.reactions: if template_reaction.reference_id in self.parameters["blacklist"]: continue @@ -711,8 +716,10 @@ def run_test_conditions(self, condition_list, solution=None, max_iterations=10): def test_gapfill_database(self): self.reset_objective_minimum(0,False) self.model.objective = self.original_objective + with open("test_gapfill_database.lp", "w") as out: + out.write(str(self.model.solver)) solution = self.model.optimize() - logger.debug( + logger.info( "Objective with gapfill database:" + str(solution.objective_value) + "; min objective:" From c68740c1372f179ce688ab7da771283b069d59d8 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 11 Mar 2024 13:13:00 -0500 Subject: [PATCH 212/298] Adding fba object and fixing ontology object --- modelseedpy/core/annotationontology.py | 17 +- modelseedpy/core/msfba.py | 233 +++++++++++++++++++++++++ 2 files changed, 242 insertions(+), 8 deletions(-) create mode 100644 modelseedpy/core/msfba.py diff --git a/modelseedpy/core/annotationontology.py b/modelseedpy/core/annotationontology.py index d781a70f..dc52ab55 100644 --- a/modelseedpy/core/annotationontology.py +++ b/modelseedpy/core/annotationontology.py @@ -340,20 +340,21 @@ def get_gene_term_hash( prioritized_event_list=None, ontologies=None, merge_all=False, - cds_features=False, + feature_type=None, translate_to_rast=True, ): output = {} feature_hash = self.genes - if len(self.genes) == 0 or (cds_features and len(self.cdss) == 0): + if len(self.genes) == 0 or (feature_type == "cds" and len(self.cdss) > 0): feature_hash = self.cdss for feature_id in feature_hash: - feature = feature_hash[feature_id] - if feature not in output: - output[feature] = {} - output[feature] = feature.get_associated_terms( - prioritized_event_list, ontologies, merge_all, translate_to_rast - ) + if not feature_type or feature_type == self.feature_types[feature_id]: + feature = feature_hash[feature_id] + if feature not in output: + output[feature] = {} + output[feature] = feature.get_associated_terms( + prioritized_event_list, ontologies, merge_all, translate_to_rast + ) return output def get_reaction_gene_hash( diff --git a/modelseedpy/core/msfba.py b/modelseedpy/core/msfba.py new file mode 100644 index 00000000..d9936977 --- /dev/null +++ b/modelseedpy/core/msfba.py @@ -0,0 +1,233 @@ +# -*- coding: utf-8 -*- +import logging +import re +import traceback +import cobra +from cobra.flux_analysis import pfba +from cobra.flux_analysis import flux_variability_analysis +from modelseedpy.core.msmodelutl import MSModelUtil + +logger = logging.getLogger(__name__) + +class MSFBA: + def __init__(self,model_or_mdlutl,media,objective_reactions,maximize,gene_ko=[],reaction_ko=[],pfba=True,fva=True,clone=True): + if isinstance(model_or_mdlutl, MSModelUtil): + model_or_mdlutl = model_or_mdlutl.model + if clone: + model_or_mdlutl = cobra.io.json.from_json(cobra.io.json.to_json(model_or_mdlutl)) + self.model = model_or_mdlutl + self.mdlutl = MSModelUtil.get(model_or_mdlutl) + self.media = media + self.objective_reactions = objective_reactions + self.maximize = maximize + self.gene_ko = gene_ko + self.reaction_ko = reaction_ko + self.pkgmgr = self.mdlutl.pkgmgr + self.apply_parameters() + self.primary_solution = None + self.secondary_solutions = None + self.fva = fva + self.pfba = pfba + self.fva_results = None + self.secondary_fva = None + + def build_objective(self): + sense = "max" + if not self.maximize: + sense = "min" + obj = self.model.problem.Objective(0, direction=sense) + objcoef = {} + for rxnid in self.objective: + if rxnid in self.model.reactions: + rxn = self.model.reactions.get_by_id(rxnid) + objcoef[rxn.forward_variable] = self.objective[rxnid] + objcoef[rxn.reverse_variable] = -1*self.objective[rxnid] + else: + logger.warning(f"KO reaction {rxnid} not found in model") + obj.set_linear_coefficients(objcoef) + + def apply_parameters(self): + self.pkgmgr.getpkg("KBaseMediaPkg").build_package(self.media) + for gene in self.gene_ko: + if gene in self.model.genes: + self.model.genes.get_by_id(gene).knock_out() + else: + logger.warning(f"KO gene {gene} not found in model") + for rxn in self.reaction_ko: + if rxn in self.model.reactions: + self.model.reactions.get_by_id(rxn).knock_out() + else: + logger.warning(f"KO reaction {rxn} not found in model") + + def run(self): + if self.pfba: + self.primary_solution = pfba(self.model) + else: + self.primary_solution = self.model.optimize() + if self.fva: + self.fva_results = flux_variability_analysis(self.model) + + def add_secondary_solution(self,solution,fva=None): + if self.secondary_solutions == None: + self.secondary_solutions = [] + self.secondary_solutions.append(solution) + if fva: + if self.secondary_fva == None: + self.secondary_fva = [] + self.secondary_fva.append(fva) + + def get_variable_class(variable_min, variable_max): + variable_class = "Unknown" + if variable_min is None or variable_max is None: + return variable_class + if variable_min == 0 and variable_max == 0: + variable_class = "Blocked" + elif variable_min > 0 and variable_max > 0: + variable_class = "Positive" + elif variable_min >= 0 and variable_max > 0: + variable_class = "Positive variable" + elif variable_min < 0 and variable_max < 0: + variable_class = "Negative" + elif variable_min < 0 and variable_max <= 0: + variable_class = "Negative variable" + else: + variable_class = "Variable" + return variable_class + + def generate_kbase_data(self): + output = { + "FBABiomassVariables": [], + "FBACompoundBounds": [], + "FBACompoundVariables": [], + "FBAConstraints": [], + "FBADeletionResults": [], + "FBAMetaboliteProductionResults": [], + "FBAMinimalMediaResults": [], + "FBAMinimalReactionsResults": [], + "FBAPromResults": [], + "FBAReactionBounds": [], + "FBAReactionVariables": [], + "FBATintleResults": [], + "MFALog": "", + "PROMKappa": 1, + "QuantitativeOptimizationSolutions": [], + "__VERSION__": 1, + "additionalCpd_refs": [], + "allReversible": 0, + "biomassRemovals": {}, + "biomassflux_objterms": {"bio1": 1}, + "calculateReactionKnockoutSensitivity": 0, + "comboDeletions": 0, + "compoundflux_objterms": {}, + "decomposeReversibleDrainFlux": 0, + "decomposeReversibleFlux": 0, + "defaultMaxDrainFlux": 0, + "defaultMaxFlux": 1000, + "defaultMinDrainFlux": -1000, + "drainfluxUseVariables": 0, + "fbamodel_ref": self.fbamodel_ref, + "findMinimalMedia": 0, + "fluxMinimization": 1, + "fluxUseVariables": 0, + "fva": 0, + "gapfillingSolutions": [], + "geneKO_refs": [], + "id": self.id, + "inputfiles": {}, + "maximizeActiveReactions": 0, + "maximizeObjective": 1, + "media_list_refs": [], + "media_ref": self.media_ref, + "minimizeErrorThermodynamicConstraints": 0, + "minimize_reaction_costs": {}, + "minimize_reactions": 0, + "noErrorThermodynamicConstraints": 0, + "numberOfSolutions": 1, + "objectiveConstraintFraction": 0.1, + "objectiveValue": self.objective_value, + "other_objectives": [], + "outputfiles": {}, + "parameters": { + "Auxotrophy metabolite list": "", + "Beachhead metabolite list": "", + "minimum_target_flux": "0.01", + "save phenotype fluxes": "0", + "suboptimal solutions": "1", + }, + "quantitativeOptimization": 0, + "reactionKO_refs": [], + "reactionflux_objterms": {}, + "simpleThermoConstraints": 0, + "thermodynamicConstraints": 0, + "uptakeLimits": {}, + } + + for rxn in self.model.reactions: + flux = 0 + if rxn.id in self.primary_solution.fluxes: + flux = self.primary_solution.fluxes[rxn.id] + min_flux = rxn.lower_bound + max_flux = rxn.upper_bound + if self.fva_results and rxn.id in self.fva_results: + min_flux, max_flux = self.fva_results[rxn.id] + other_mins= [] + other_maxes = [] + other_fluxes = [] + if self.secondary_solutions: + for sol in self.secondary_solutions: + if rxn.id in sol.fluxes: + other_fluxes.append(sol.fluxes[rxn.id]) + else: + other_fluxes.append(0) + if self.secondary_fva: + othermin = rxn.lower_bound + othermax = rxn.upper_bound + for fva in self.secondary_fva: + if rxn.id in fva: + othermin, othermax = fva[rxn.id] + other_mins.append(othermin) + other_maxes.append(othermax) + variable_class = self.get_variable_class(min_flux, max_flux) + variable_data = { + "class": variable_class, + "lowerBound": rxn.lower_bound, + "max": max_flux, + "min": min_flux, + "upperBound": rxn.upper_bound, + "other_max": other_maxes, + "other_min": other_mins, + "other_values": other_fluxes, + "value": flux, + "variableType": "flux" + } + variable_key = "FBAReactionVariables" + if rxn.id.startswith("EX_"): + lower = variable_data["lowerBound"] + variable_data["lowerBound"] = -1 * variable_data["upperBound"] + variable_data["upperBound"] = -1 * lower + lower = variable_data["min"] + variable_data["min"] = -1 * variable_data["max"] + variable_data["max"] = -1 * lower + variable_data["value"] = -1 * variable_data["value"] + variable_data["variableType"] = "drainflux" + variable_data["modelcompound_ref"] = ( + "~/fbamodel/modelcompounds/id/" + rxn.id[3:], + ) + variable_key = "FBACompoundVariables" + elif rxn.id.startswith("bio"): + variable_data["variableType"] = "biomassflux" + variable_data["biomass_ref"] = ( + "~/fbamodel/biomasses/id/" + rxn.id, + ) + variable_key = "FBABiomassVariables" + else: + variable_data["modelreaction_ref"] = ( + "~/fbamodel/modelreactions/id/" + rxn.id + ) + variable_data["exp_state"] = "unknown" + variable_data["biomass_dependencies"] = [] + variable_data["coupled_reactions"] = [] + variable_data["expression"] = 0 + variable_data["scaled_exp"] = 0 + output[variable_key].append(variable_data) + return output \ No newline at end of file From d38ce28d6fcd6190027816b391e804ce2a158513 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 11 Mar 2024 13:31:55 -0500 Subject: [PATCH 213/298] Integrating Andrew Freiburger's community modeling code for GROW project. --- modelseedpy/community/__init__.py | 8 +- modelseedpy/community/commhelper.py | 530 ++++ modelseedpy/community/commphitting.py | 2538 +++++++++++++++++ modelseedpy/community/commscores_old.py | 1856 ++++++++++++ .../community/commscores_template.html | 157 + modelseedpy/community/datastandardization.py | 1194 ++++++++ modelseedpy/community/get_ncbi_gbff.pl | 13 + modelseedpy/community/metquest_code.py | 1162 ++++++++ modelseedpy/community/mscommfitting.py | 1091 +++++++ modelseedpy/community/mscommunity.py | 909 ++---- modelseedpy/community/mskineticsfba.py | 444 +++ modelseedpy/community/mssteadycom.py | 440 +++ modelseedpy/community/steadycom_template.html | 54 + 13 files changed, 9767 insertions(+), 629 deletions(-) create mode 100644 modelseedpy/community/commhelper.py create mode 100644 modelseedpy/community/commphitting.py create mode 100644 modelseedpy/community/commscores_old.py create mode 100644 modelseedpy/community/commscores_template.html create mode 100644 modelseedpy/community/datastandardization.py create mode 100644 modelseedpy/community/get_ncbi_gbff.pl create mode 100644 modelseedpy/community/metquest_code.py create mode 100644 modelseedpy/community/mscommfitting.py create mode 100644 modelseedpy/community/mskineticsfba.py create mode 100644 modelseedpy/community/mssteadycom.py create mode 100644 modelseedpy/community/steadycom_template.html diff --git a/modelseedpy/community/__init__.py b/modelseedpy/community/__init__.py index ebf07888..b844cb34 100644 --- a/modelseedpy/community/__init__.py +++ b/modelseedpy/community/__init__.py @@ -5,6 +5,8 @@ # import pyximport; pyximport.install(language_level=3) # improve computational speed from modelseedpy.community.mscommunity import * -from modelseedpy.community.dfbapkg import dFBAPkg -from modelseedpy.community.mscompatibility import MSCompatibility -from modelseedpy.community.commkineticpkg import CommKineticPkg +from modelseedpy.community.datastandardization import * +from modelseedpy.community.mssteadycom import MSSteadyCom +from modelseedpy.community.commphitting import CommPhitting +from modelseedpy.community.commhelper import build_from_species_models, phenotypes +from modelseedpy.community.mskineticsfba import MSKineticsFBA diff --git a/modelseedpy/community/commhelper.py b/modelseedpy/community/commhelper.py new file mode 100644 index 00000000..b17f8867 --- /dev/null +++ b/modelseedpy/community/commhelper.py @@ -0,0 +1,530 @@ +from modelseedpy.core.msminimalmedia import minimizeFlux_withGrowth, bioFlux_check +from modelseedpy.core.exceptions import NoFluxError, ObjectiveError +from modelseedpy.fbapkg.mspackagemanager import MSPackageManager +from modelseedpy.core.msmodelutl import MSModelUtil +from modelseedpy.core.fbahelper import FBAHelper +from cobra import Model, Reaction, Metabolite +from cobra.medium import minimal_medium + +# from commscores import GEMCompatibility +from cobra.flux_analysis import pfba +from collections import OrderedDict +from optlang.symbolics import Zero +from optlang import Constraint +from math import inf, isclose +from pandas import DataFrame +from pprint import pprint +from numpy import mean +import re + + +def strip_comp(ID): + ID = ID.replace("-", "~") + return re.sub("(\_\w\d)", "", ID) + + +def export_lp(model, name): + with open(f"{name}.lp", "w") as out: + out.write(model.solver.to_lp()) + + +def correct_nonMSID(nonMSobject, output, model_index): + name, compartment = output + index = 0 if compartment == "e" else model_index + nonMSobject.compartment = compartment + str(index) + comp = re.search(r"(_[a-z]\d+$)", nonMSobject.id) + if comp is None and rf"[{compartment}]" in nonMSobject.id: + return nonMSobject.id.replace( + rf"[{compartment}]", f"_{nonMSobject.compartment}" + ) + elif comp is None: + return nonMSobject.id + f"_{nonMSobject.compartment}" + return "_".join([nonMSobject.id.replace(comp.group(), ""), nonMSobject.compartment]) + + +def build_from_species_models( + org_models, + model_id=None, + name=None, + abundances=None, + standardize=False, + MSmodel=True, + commkinetics=True, + copy_models=True, + printing=False, +): + """Merges the input list of single species metabolic models into a community metabolic model + + Parameters + ---------- + org_models : list to be merged into a community model + model_id : string specifying community model ID + name : string specifying community model name + names : list human-readable names for models being merged + abundances : dict relative abundances for input models in community model + cobra_model : bool for whether the raw COBRA model is returned + standardize: bool for whether the exchanges of each member model will be standardized (True) or just aligned. + + Returns + ------- + Cobra.Model for the desired Community + + Raises + ------ + """ + # construct the new model + models = org_models # if not standardize else GEMCompatibility.standardize( + # org_models, exchanges=True, conflicts_file_name='exchanges_conflicts.json') + biomass_indices = [] + biomass_index = minimal_biomass_index = 2 + new_metabolites, new_reactions = set(), set() + member_biomasses = {} + for model_index, org_model in enumerate(models): + model_util = MSModelUtil(org_model, copy=copy_models) + model_reaction_ids = [rxn.id for rxn in model_util.model.reactions] + model_index += 1 + # if MSmodel: + # Rename metabolites + for met in model_util.model.metabolites: + # Renaming compartments + output = MSModelUtil.parse_id(met) + if printing: + print(met, output) + if output is None: + if printing: + print( + f"The {met.id} ({output}; {hasattr(met, 'compartment')}) is unpredictable." + ) + met.id = correct_nonMSID(met, (met.id, "c"), model_index) + elif len(output) == 2: + met.id = correct_nonMSID(met, output, model_index) + elif len(output) == 3: + name, compartment, out_index = output + index = 0 if compartment == "e" else model_index + if out_index == "": + met.id += str(index) + met.compartment += str(index) + elif compartment == "e": + met.compartment = "e0" + else: + met.compartment = compartment + str(index) + met.id = name + "_" + met.compartment + new_metabolites.add(met) + if "cpd11416_c" in met.id or "biomass" in met.id: + member_biomasses[org_model.id] = met + # Rename reactions + for ( + rxn + ) in ( + model_util.model.reactions + ): # !!! all reactions should have a non-zero compartment index + if rxn.id[0:3] != "EX_": + ## biomass reactions + if re.search("^(bio)(\d+)$", rxn.id): + index = int(re.sub(r"(^bio)", "", rxn.id)) + if biomass_index == 2: + while f"bio{biomass_index}" in model_reaction_ids: + biomass_index += 1 + if index not in biomass_indices and index >= minimal_biomass_index: + biomass_indices.append(index) + else: # biomass indices can be decoupled from the respective reaction indices of the same model + rxn.id = "bio" + str(biomass_index) + if rxn.id not in model_reaction_ids: + biomass_indices.append(biomass_index) + else: + index = minimal_biomass_index + rxn.id = "bio" + str(index) + while ( + rxn.id not in model_reaction_ids + and index not in biomass_indices + ): + index += 1 + rxn.id = "bio" + str(index) + biomass_indices.append(index) + biomass_index += 1 + ## non-biomass reactions + else: + initialID = str(rxn.id) + output = MSModelUtil.parse_id(rxn) + if output is None: + if printing: + print( + f"The {rxn.id} ({output}; {hasattr(rxn, 'compartment')}) is unpredictable." + ) + try: + rxn.id = correct_nonMSID(rxn, (rxn.id, "c"), model_index) + except ValueError: + pass + elif len(output) == 2: + rxn.id = correct_nonMSID(rxn, output, model_index) + elif len(output) == 3: + name, compartment, index = output + if compartment != "e": + rxn.name = f"{name}_{compartment}{model_index}" + rxn_id = re.search(r"(.+\_\w)(?=\d+)", rxn.id).group() + if index == "": + rxn.id += str(model_index) + else: + rxn.id = rxn_id + str(model_index) + finalID = str(rxn.id) + string_diff = "" + for index, let in enumerate(finalID): + if ( + index >= len(initialID) + or index < len(initialID) + and let != initialID[index] + ): + string_diff += let + if string_diff != f"_{compartment}{model_index}" and printing: + print( + f"The ID {initialID} is changed with {string_diff} to create the final ID {finalID}" + ) + new_reactions.add(rxn) + # else: + # # TODO develop a method for compartmentalizing models without editing all reaction IDs or assuming their syntax + # pass + # adds only unique reactions and metabolites to the community model + newmodel = Model( + model_id or "+".join([model.id for model in models]), + name or "+".join([model.name for model in models]), + ) + newmodel.add_reactions(FBAHelper.filter_cobra_set(new_reactions)) + newmodel.add_metabolites(FBAHelper.filter_cobra_set(new_metabolites)) + + # Create community biomass + comm_biomass = Metabolite("cpd11416_c0", None, "Community biomass", 0, "c0") + metabolites = {comm_biomass: 1} + ## constrain the community abundances + if abundances: + abundances = { + met: abundances[memberID] for memberID, met in member_biomasses.items() + } + else: + abundances = { + cpd: -1 / len(member_biomasses) for cpd in member_biomasses.values() + } + ## define community biomass components + metabolites.update(abundances) + comm_biorxn = Reaction(id="bio1", name="bio1", lower_bound=0, upper_bound=1000) + comm_biorxn.add_metabolites(metabolites) + newmodel.add_reactions([comm_biorxn]) + # update model components + newutl = MSModelUtil(newmodel) + newutl.add_objective(comm_biorxn.flux_expression) + newutl.model.add_boundary( + comm_biomass, "sink" + ) # Is a sink reaction for reversible cpd11416_c0 consumption necessary? + ## proportionally limit the fluxes to their abundances + if commkinetics: + add_commkinetics(newutl, models, member_biomasses, abundances) + # add the metadata of community composition + if hasattr(newutl.model, "_context"): + newutl.model._contents.append(member_biomasses) + elif hasattr(newutl.model, "notes"): + newutl.model.notes.update(member_biomasses) + # print([cons.name for cons in newutl.model.constraints]) + return newutl.model + + +def add_commkinetics(util, models, member_biomasses, abundances): + # TODO this creates an error with the member biomass reactions not being identified in the model + coef = {} + for model in models: + coef[member_biomasses[model.id]] = -abundances[member_biomasses[model.id]] + for rxn in model.reactions: + if rxn.id[:3] == "rxn": + coef[rxn.forward_variable] = coef[rxn.reverse_variable] = 1 + util.create_constraint( + Constraint(Zero, name="member_flux_limit"), coef=coef, printing=True + ) + + +def phenotypes(community_members, phenotype_flux_threshold=0.1, solver: str = "glpk"): + # log information of each respective model + models = OrderedDict() + solutions = [] + media_conc = set() + # calculate all phenotype profiles for all members + comm_members = community_members.copy() + # print(community_members) + for ( + org_model, + content, + ) in ( + community_members.items() + ): # community_members excludes the stationary phenotype + print("\n", org_model.id) + org_model.solver = solver + all_phenotypes = "phenotypes" not in content + model_util = MSModelUtil(org_model, True) + if "org_coef" not in locals(): + org_coef = { + model_util.model.reactions.get_by_id( + "EX_cpd00007_e0" + ).reverse_variable: -1 + } + model_util.standard_exchanges() + models[org_model.id] = { + "exchanges": model_util.exchange_list(), + "solutions": {}, + "name": content["name"], + } + phenotypes = ( + { + met.name: {"consumed": met.id.replace("EX_", "").replace("_e0", "")} + for met in model_util.carbon_exchange_mets_list(include_unknown=False) + } + if all_phenotypes + else content["phenotypes"] + ) + # print(phenotypes) + models[org_model.id]["phenotypes"] = ["stationary"] + [ + content["phenotypes"].keys() for member, content in comm_members.items() + ] + phenoRXNs = [ + pheno_cpd + for pheno, pheno_cpds in content["phenotypes"].items() + for pheno_cpd in pheno_cpds["consumed"] + ] + media = {cpd: 100 for cpd, flux in model_util.model.medium.items()} + # TODO correct or remove the media, since it seems to be overwritten by the optimization of all carbon exchanges + ### eliminate hydrogen absorption + media.update({"EX_cpd11640_e0": 0}) + past_phenoRXNs = [] + for name, phenoCPDs in phenotypes.items(): + pheno_util = MSModelUtil(model_util.model, True) + metID = phenoCPDs["consumed"][0] + try: + phenoRXN = pheno_util.model.reactions.get_by_id(f"EX_{metID}_e0") + if past_phenoRXNs: + del media[past_phenoRXNs[-1]] + except Exception as e: + print(e, f"\nEX_{metID}_e0 is not in the model {org_model.id}") + continue + media.update({phenoRXN.id: 100}) + pheno_util.add_medium(media) + print(phenoRXN.id) + pheno_util.model.solver = solver + ### define an oxygen absorption relative to the phenotype carbon source + # O2_consumption: EX_cpd00007_e0 <= phenotype carbon source # formerly <= 2 * sum(primary carbon fluxes) + coef = org_coef.copy() + coef.update({phenoRXN.reverse_variable: 1}) + pheno_util.create_constraint( + Constraint(Zero, lb=0, ub=None, name="EX_cpd00007_e0_limitation"), + coef=coef, + ) + + ## minimize the influx of all carbonaceous exchanges, mostly non-phenotype compounds, at a fixed biomass growth + min_growth = float(1) # arbitrarily assigned minimal growth + pheno_util.add_minimal_objective_cons(min_growth) + phenoRXN.upper_bound = 0 + for ex in pheno_util.carbon_exchange_list(): + exMet = ex.id.replace("EX_", "").replace("_e0", "") + if exMet in phenoRXNs and exMet != metID: + ex.lower_bound = 0 + # print(f"The new bounds of {exMet} exchange are: {ex.bounds}") + pheno_util.add_objective( + Zero, + "min", + coef={ + ex.reverse_variable: 1000 if ex.id != phenoRXN.id else 1 + for ex in pheno_util.carbon_exchange_list() + }, + ) + # export_lp(pheno_util.model, f"minimize_cInFlux_{phenoRXN.id}") + sol = pheno_util.model.optimize() + if sol.status != "optimal": + pheno_util.model.remove_cons_vars(["EX_cpd00007_e0_limitation"]) + coef.update({phenoRXN.reverse_variable: 5}) + pheno_util.create_constraint( + Constraint(Zero, lb=0, ub=None, name="EX_cpd00007_e0_limitation"), + coef=coef, + ) + sol = pheno_util.model.optimize() + bioFlux_check(pheno_util.model, sol) + ### limit maximum consumption to the values from the previous minimization + for ex in pheno_util.carbon_exchange_list(): + #### (limiting the reverse_variable is more restrictive than the net flux variable) + if ex.id != phenoRXN.id: + ex.reverse_variable.ub = abs(min(0, sol.fluxes[ex.id])) + + ## maximize the phenotype yield with the previously defined growth and constraints + pheno_util.add_objective(phenoRXN.reverse_variable, "min") + # export_lp(pheno_util.model, f"maximize_phenoYield_{phenoRXN.id}") + pheno_sol = pheno_util.model.optimize() + bioFlux_check(pheno_util.model, pheno_sol) + pheno_influx = pheno_sol.fluxes[phenoRXN.id] + if pheno_influx >= 0: + if not all_phenotypes: + print( + f"The phenotype carbon source has a flux of {pheno_sol.fluxes[phenoRXN.id]}." + ) + pprint( + { + rxn: flux + for rxn, flux in pheno_sol.fluxes.items() + if flux != 0 + } + ) + # TODO gapfill the model in media the non-functioning carbon source + raise NoFluxError( + f"The (+) net flux of {pheno_influx} for the {phenoRXN.id} phenotype" + f" indicates that it is an implausible phenotype." + ) + print( + f"NoFluxError: The (+) net flux of {pheno_influx} for the {phenoRXN.id}" + " phenotype indicates that it is an implausible phenotype." + ) + continue + phenoRXN.lower_bound = phenoRXN.upper_bound = pheno_influx + + ## maximize excretion of all potential carbon byproducts whose #C's < phenotype source #C's + phenotype_source_carbons = FBAHelper.rxn_mets_list(phenoRXN)[0].elements[ + "C" + ] + minimum_fluxes = {} + for carbon_source in pheno_util.carbon_exchange_list(include_unknown=False): + if ( + 0 + < FBAHelper.rxn_mets_list(carbon_source)[0].elements["C"] + < phenotype_source_carbons + ): + pheno_util.add_objective(carbon_source.flux_expression, "max") + minObj = pheno_util.model.slim_optimize() + # print(carbon_source.reaction, "\t", carbon_source.flux_expression, "\t", minObj) + if minObj > phenotype_flux_threshold: + minimum_fluxes[carbon_source.id] = minObj + # TODO limit the possible excreted compounds to only those that are defined in the media + excreted_compounds = list( + [exID for exID in minimum_fluxes.keys() if exID != "EX_cpd00011_e0"] + ) + # minimum_fluxes_df = DataFrame(data=list(minimum_fluxes.values()), index=excreted_compounds, columns=["min_flux"]) + # max_excretion_cpd = minimum_fluxes_df["minimum"].idxmin() + ### optimize the excretion of the discovered phenotype excreta + if "excreted" in phenoCPDs: + phenoCPDs["excreted"] = [ + f"EX_{cpd}_e0" for cpd in phenoCPDs["excreted"] + ] + phenoCPDs["excreted"].extend(excreted_compounds) + else: + phenoCPDs["excreted"] = excreted_compounds + pheno_excreta = [ + pheno_util.model.reactions.get_by_id(excreta) + for excreta in phenoCPDs["excreted"] + ] + pheno_util.add_objective( + sum([ex.flux_expression for ex in pheno_excreta]), "max" + ) + # export_lp(pheno_util.model, "maximize_excreta") + sol = pheno_util.model.optimize() + bioFlux_check(pheno_util.model, sol) + for ex in pheno_excreta: + ex.lower_bound = ex.upper_bound = sol.fluxes[ex.id] + + ## minimize flux of the total simulation flux through pFBA + # TODO discover why some phenotypes are infeasible with pFBA + try: + pheno_sol = pfba(pheno_util.model) + # pheno_util.add_objective(sum([rxn.flux_expression for rxn in pheno_util.e]), "min") + # pheno_sol = pheno_util.model.optimize() + except Exception as e: + print( + f"The {phenoRXN.id} phenotype of the {pheno_util.model} model is " + f"unable to be simulated with pFBA and yields a < {e} > error." + ) + sol_dict = FBAHelper.solution_to_variables_dict(pheno_sol, pheno_util.model) + simulated_growth = sum( + [ + flux + for var, flux in sol_dict.items() + if re.search(r"(^bio\d+$)", var.name) + ] + ) + if not isclose(simulated_growth, min_growth): + display( + [ + (rxn, flux) + for rxn, flux in pheno_sol.fluxes.items() + if "EX_" in rxn and flux != 0 + ] + ) + raise ObjectiveError( + f"The assigned minimal_growth of {min_growth} was not optimized" + f" during the simulation, where the observed growth was {simulated_growth}." + ) + + ## store solution fluxes and update the community_members phenotypes + met_name = strip_comp(name).replace(" ", "-") + col = content["name"] + "_" + met_name + models[pheno_util.model.id]["solutions"][col] = pheno_sol + solutions.append( + models[pheno_util.model.id]["solutions"][col].objective_value + ) + met_name = met_name.replace("_", "-").replace("~", "-") + if all_phenotypes: + if "phenotypes" not in comm_members[org_model]: + comm_members[org_model]["phenotypes"] = { + met_name: {"consumed": [strip_comp(metID)]} + } + if met_name not in comm_members[org_model]["phenotypes"]: + comm_members[org_model]["phenotypes"].update( + {met_name: {"consumed": [strip_comp(metID)]}} + ) + else: + comm_members[org_model]["phenotypes"][met_name]["consumed"] = [ + strip_comp(metID) + ] + met_pheno = content["phenotypes"][met_name] + if ( + "excreted" in met_pheno + and strip_comp(metID) in met_pheno["excreted"] + ): + comm_members[org_model]["phenotypes"][met_name].update( + {"excreted": met_pheno} + ) + past_phenoRXNs.append(phenoRXN.id) + + # construct the parsed table of all exchange fluxes for each phenotype + cols = {} + ## biomass row + cols["rxn"] = ["bio"] + for content in models.values(): + for col in content["solutions"]: + cols[col] = [0] + if col not in content["solutions"]: + continue + bio_rxns = [x for x in content["solutions"][col].fluxes.index if "bio" in x] + flux = mean( + [ + content["solutions"][col].fluxes[rxn] + for rxn in bio_rxns + if content["solutions"][col].fluxes[rxn] != 0 + ] + ) + cols[col] = [flux] + ## exchange reactions rows + looped_cols = cols.copy() + looped_cols.pop("rxn") + for content in models.values(): + for ex_rxn in content["exchanges"]: + cols["rxn"].append(ex_rxn.id) + for col in looped_cols: + ### reactions that are not present in the columns are ignored + flux = ( + 0 + if ( + col not in content["solutions"] + or ex_rxn.id not in list(content["solutions"][col].fluxes.index) + ) + else content["solutions"][col].fluxes[ex_rxn.id] + ) + cols[col].append(flux) + ## construct the DataFrame + fluxes_df = DataFrame(data=cols) + fluxes_df.index = fluxes_df["rxn"] + fluxes_df.drop("rxn", axis=1, inplace=True) + fluxes_df = fluxes_df.groupby(fluxes_df.index).sum() + fluxes_df = fluxes_df.loc[(fluxes_df != 0).any(axis=1)] + fluxes_df.astype(str) + # fluxes_df.to_csv("fluxes.csv") + return fluxes_df, comm_members diff --git a/modelseedpy/community/commphitting.py b/modelseedpy/community/commphitting.py new file mode 100644 index 00000000..645cc97c --- /dev/null +++ b/modelseedpy/community/commphitting.py @@ -0,0 +1,2538 @@ +# -*- coding: utf-8 -*- +# from modelseedpy.fbapkg.mspackagemanager import MSPackageManager +from modelseedpy.core.exceptions import ( + FeasibilityError, + ParameterError, + ObjectAlreadyDefinedError, + NoFluxError, +) +from modelseedpy.core.optlanghelper import ( + OptlangHelper, + Bounds, + tupVariable, + tupConstraint, + tupObjective, + isIterable, + define_term, +) +from modelseedpy.community.datastandardization import GrowthData +from modelseedpy.core.fbahelper import FBAHelper +from modelseedpy.biochem import from_local +from scipy.constants import hour, minute +from zipfile import ZipFile, ZIP_LZMA +from optlang import Model, Objective +from time import sleep, process_time +from typing import Union, Iterable +from optlang.symbolics import Zero +from scipy.optimize import newton +from matplotlib import pyplot +from math import inf, isclose +from deepdiff import DeepDiff +from pandas import DataFrame +from itertools import chain +from pprint import pprint +from h5py import File +from icecream import ic +import numpy as np +import cobra.io + +# from cplex import Cplex +import warnings, logging, json, os, re + +logger = logging.getLogger(__name__) + + +def dict_keys_exists(dic, *keys): + result = keys[0] in dic + if keys[0] in dic: + remainingKeys = keys[1:] + if len(remainingKeys) > 0: + result = dict_keys_exists(dic[keys[0]], *remainingKeys) + return result + return result + + +def find_dic_number(dic): + for k, v in dic.items(): + if FBAHelper.isnumber(v): + return v + num = find_dic_number(dic[k]) + return num + + +def trial_contents(short_code, indices_tup, values): + matches = [ele == short_code for ele in indices_tup] + return np.array(values)[matches] + + +def dic_keys(dic): + keys = [] + if isinstance(dic, dict): + for key, value in dic.items(): + keys.append(key) + keys.extend(dic_keys(value)) + return keys + + +# define data objects +def _name(name, suffix, short_code, timestep, names): + name = "-".join( + [x for x in list(map(str, [name + suffix, short_code, timestep])) if x] + ) + if name not in names: + names.append(name) + return name + else: + pprint(names) + raise ObjectAlreadyDefinedError( + f"The object {name} is already defined for the problem." + ) + + +def _export_model_json(json_model, path): + with open(path, "w") as lp: + json.dump(json_model, lp, indent=3) + + +def _met_id_parser(met): + met_id = re.sub("(\_\w\d+)", "", met) + met_id = met_id.replace("EX_", "", 1) + met_id = met_id.replace("c_", "", 1) + return met_id + + +# define an entity as a variable or a constant +def _obj_val( + primal, name, pheno, short_code, timestep, bounds, data_timestep_hr, names +): + time_hr = int(timestep) * data_timestep_hr + return ( + tupVariable(_name(name, pheno, short_code, timestep, names), Bounds=bounds) + if not primal + else primal[short_code][name + pheno][time_hr] + ) + + +def _michaelis_menten(conc, vmax, km): + return (conc * vmax) / (km + conc) + + +def clamp(val, minimum, maximum): + return min(max(val, minimum), maximum) + + +# parse primal values for use in the optimization loops +def parse_primals(primal_values, entity_labels=None, coefs=None, kcat_vals=None): + if kcat_vals: + kcat_primal = {} + for trial, content in primal_values.items(): + for primal, time_value in content.items(): + if "bin" not in primal: + continue + name, trial = primal.split("-") + number = re.search(r"(\d)", name).group() + species, pheno = re.sub(r"(bin\d_)", "", name).split("_") + if "stationary" in pheno: + continue + if species not in kcat_primal: + kcat_primal[species] = {} + if pheno not in kcat_primal[species]: + kcat_primal[species][pheno] = 0 + # kcat_(k,new) = sum_z^Z ( kcat_z * bin_k^z ) * kcat_(k,old) < 10 + if time_value == 0 and kcat_primal[species][pheno] < 10: + kcat_primal[species][pheno] += ( + coefs[int(number) - 1] * kcat_vals[species][pheno] + ) + kcat_primal[species][pheno] = clamp( + kcat_primal[species][pheno], 1e-4, 10 + ) + return kcat_primal + select_primals = {} + for trial, entities in primal_values.items(): + select_primals[trial] = {} + for entity, times in entities.items(): + # a poor man's dictionary copy + if any([label in entity for label in entity_labels]): + select_primals[trial][entity] = dict(list(times.items())) + return select_primals + + +def signal_species(signal): + return signal.split(":")[0].replace(" ", "_") + + +def _partition_coefs(initial_val, divisor): + return ( + initial_val, + initial_val / divisor, + initial_val / divisor**2, + initial_val / divisor**3, + initial_val / divisor**4, + ) + + +biomass_partition_coefs = [ + _partition_coefs(10, 10), + _partition_coefs(2, 2), + _partition_coefs(1, 3), +] + + +class CommPhitting: + + def __init__( + self, + msdb_path, + community_members: dict = None, + fluxes_df=None, + data_df=None, + carbon_conc=None, + media_conc=None, + experimental_metadata=None, + base_media=None, + solver: str = "glpk", + all_phenotypes=True, + data_paths: dict = None, + species_abundances: str = None, + ignore_trials: Union[dict, list] = None, + ignore_timesteps: list = None, + species_identities_rows=None, + significant_deviation: float = 2, + extract_zip_path: str = None, + determine_requisite_biomass: bool = True, + consumed_mets: iter = None, + ): + self.msdb = from_local(msdb_path) + self.msdb_path = msdb_path + self.solver = solver + self.all_phenotypes = all_phenotypes + self.data_paths = data_paths + self.species_abundances = species_abundances + self.ignore_trials = ignore_trials + self.ignore_timesteps = ignore_timesteps + self.species_identities_rows = species_identities_rows + self.significant_deviation = significant_deviation + self.extract_zip_path = extract_zip_path + + self.community_members = community_members + self.consumed_mets = consumed_mets or set( + [ + met + for content in community_members.values() + for met in content["phenotypes"] + ] + ) + if community_members is not None or any( + [x is None for x in [fluxes_df, data_df]] + ): + ( + self.experimental_metadata, + data_df, + fluxes_df, + carbon_conc, + self.requisite_biomass, + self.trial_name_conversion, + self.data_timestep_hr, + simulation_timestep, + media_conc, + ) = GrowthData.process( + community_members, + base_media, + solver, + all_phenotypes, + data_paths, + species_abundances, + carbon_conc, + ignore_trials, + ignore_timesteps, + species_identities_rows, + significant_deviation, + extract_zip_path, + determine_requisite_biomass, + ) + # for content in community_members.values() for met in content["phenotypes"]] + self.fluxes_tup = FBAHelper.parse_df(fluxes_df) + self.fluxes_df = fluxes_df + self.data_df = data_df + self.default_excreta = [ + index for index, row in fluxes_df.iterrows() if any(row > 1) + ] + self.parameters, self.variables, self.constraints = {}, {}, {} + self.zipped_output, self.plots, self.names = [], [], [] + self.experimental_metadata = experimental_metadata + self.carbon_conc = carbon_conc + self.media_conc = media_conc + + #################### FITTING PHASE METHODS #################### + + def fit_kcat( + self, + parameters: dict = None, + mets_to_track: list = None, + rel_final_conc: dict = None, + zero_start: list = None, + abs_final_conc: dict = None, + graphs: list = None, + data_timesteps: dict = None, + export_zip_name: str = None, + export_parameters: bool = True, + requisite_biomass: dict = None, + export_lp: str = f"solveKcat.lp", + figures_zip_name: str = None, + publishing=True, + primals_export_path=None, + ): + if export_zip_name and os.path.exists(export_zip_name): + os.remove(export_zip_name) + kcat_primal = None + requisite_biomass = requisite_biomass or self.requisite_biomass + for index, coefs in enumerate(biomass_partition_coefs): + # solve for growth rate constants with the previously solved biomasses + newSim = CommPhitting( + self.msdb_path, + None, + self.fluxes_df, + self.data_df, + self.carbon_conc, + self.media_conc, + self.experimental_metadata, + None, + self.solver, + self.all_phenotypes, + self.data_paths, + self.species_abundances, + self.ignore_trials, + self.ignore_timesteps, + self.species_identities_rows, + self.significant_deviation, + self.extract_zip_path, + True, + self.consumed_mets, + ) + newSim.define_problem( + parameters, + mets_to_track, + rel_final_conc, + zero_start, + abs_final_conc, + data_timesteps, + export_zip_name, + export_parameters, + export_lp, + kcat_primal, + coefs, + requisite_biomass, + ) + newSim.compute( + graphs, + export_zip_name, + figures_zip_name, + publishing, + primals_export_path or re.sub(r"(.lp)", ".json", export_lp), + ) + kcat_primal = parse_primals( + newSim.values, coefs=coefs, kcat_vals=newSim.parameters["kcat"] + ) + pprint(kcat_primal) + print(f"Interation {index+1} is complete\n") + kcats = {k: val for k, val in newSim.values.items() if "kcat" in k} + DataFrame(kcats).T.to_csv("pheno_growth_kcat.tsv", sep="\t") + return kcats + + def fit( + self, + parameters: dict = None, + mets_to_track: list = None, + rel_final_conc: dict = None, + zero_start: list = None, + abs_final_conc: dict = None, + graphs: list = None, + data_timesteps: dict = None, + export_zip_name: str = None, + export_parameters: bool = True, + requisite_biomass: dict = None, + export_lp: str = "CommPhitting.lp", + figures_zip_name: str = None, + publishing: bool = False, + primals_export_path=None, + ): + if hasattr(self, "requisite_biomass"): + requisite_biomass = self.requisite_biomass + self.define_problem( + parameters, + mets_to_track, + rel_final_conc, + zero_start, + abs_final_conc, + data_timesteps, + export_zip_name, + export_parameters, + export_lp, + None, + None, + requisite_biomass, + ) + self.compute( + graphs, + export_zip_name, + figures_zip_name, + publishing, + primals_export_path or re.sub(r"(.lp)", ".json", export_lp), + ) + + def define_b_vars(self, pheno, short_code, timestep, variables): + self.variables["b_" + pheno][short_code][timestep] = tupVariable( + _name("b_", pheno, short_code, timestep, self.names), Bounds(0, 1000) + ) + self.variables["b1_" + pheno][short_code][timestep] = tupVariable( + _name("b1_", pheno, short_code, timestep, self.names), Bounds(0, 1000) + ) + self.variables["b2_" + pheno][short_code][timestep] = tupVariable( + _name("b2_", pheno, short_code, timestep, self.names), Bounds(0, 1000) + ) + self.variables["b3_" + pheno][short_code][timestep] = tupVariable( + _name("b3_", pheno, short_code, timestep, self.names), Bounds(0, 1000) + ) + self.variables["b4_" + pheno][short_code][timestep] = tupVariable( + _name("b4_", pheno, short_code, timestep, self.names), Bounds(0, 1000) + ) + self.variables["b5_" + pheno][short_code][timestep] = tupVariable( + _name("b5_", pheno, short_code, timestep, self.names), Bounds(0, 1000) + ) + variables.extend( + [ + self.variables["b_" + pheno][short_code][timestep], + self.variables["b1_" + pheno][short_code][timestep], + self.variables["b2_" + pheno][short_code][timestep], + self.variables["b3_" + pheno][short_code][timestep], + self.variables["b4_" + pheno][short_code][timestep], + self.variables["b5_" + pheno][short_code][timestep], + ] + ) + if short_code not in self.variables[f"bin1_{pheno}"]: + self.variables[f"bin1_{pheno}"][short_code] = tupVariable( + _name("bin1_", pheno, short_code, "", self.names), + Bounds(0, 1), + "binary", + ) + self.variables[f"bin2_{pheno}"][short_code] = tupVariable( + _name("bin2_", pheno, short_code, "", self.names), + Bounds(0, 1), + "binary", + ) + self.variables[f"bin3_{pheno}"][short_code] = tupVariable( + _name("bin3_", pheno, short_code, "", self.names), + Bounds(0, 1), + "binary", + ) + self.variables[f"bin4_{pheno}"][short_code] = tupVariable( + _name("bin4_", pheno, short_code, "", self.names), + Bounds(0, 1), + "binary", + ) + self.variables[f"bin5_{pheno}"][short_code] = tupVariable( + _name("bin5_", pheno, short_code, "", self.names), + Bounds(0, 1), + "binary", + ) + variables.extend( + [ + self.variables[f"bin1_{pheno}"][short_code], + self.variables[f"bin2_{pheno}"][short_code], + self.variables[f"bin3_{pheno}"][short_code], + self.variables[f"bin4_{pheno}"][short_code], + self.variables[f"bin5_{pheno}"][short_code], + ] + ) + return variables + + def define_b_cons(self, pheno, short_code, timestep, biomass_coefs): + biomass_coefs = biomass_coefs or biomass_partition_coefs[-1] + # define the partitioned biomass groups + ## b_n{pheno,t} <= coef*b_tot{pheno,t} + self.constraints["b1c_" + pheno][short_code][timestep] = tupConstraint( + _name("b1c_", pheno, short_code, timestep, self.names), + Bounds(0, None), + { + "elements": [ + { + "elements": [ + biomass_coefs[0], + self.variables["b_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1, + self.variables["b1_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + ], + "operation": "Add", + }, + ) + self.constraints["b2c_" + pheno][short_code][timestep] = tupConstraint( + _name("b2c_", pheno, short_code, timestep, self.names), + Bounds(0, None), + { + "elements": [ + { + "elements": [ + biomass_coefs[1], + self.variables["b_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1, + self.variables["b2_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + ], + "operation": "Add", + }, + ) + self.constraints["b3c_" + pheno][short_code][timestep] = tupConstraint( + _name("b3c_", pheno, short_code, timestep, self.names), + Bounds(0, None), + { + "elements": [ + { + "elements": [ + biomass_coefs[2], + self.variables["b_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1, + self.variables["b3_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + ], + "operation": "Add", + }, + ) + self.constraints["b4c_" + pheno][short_code][timestep] = tupConstraint( + _name("b4c_", pheno, short_code, timestep, self.names), + Bounds(0, None), + { + "elements": [ + { + "elements": [ + biomass_coefs[3], + self.variables["b_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1, + self.variables["b4_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + ], + "operation": "Add", + }, + ) + self.constraints["b5c_" + pheno][short_code][timestep] = tupConstraint( + _name("b5c_", pheno, short_code, timestep, self.names), + Bounds(0, None), + { + "elements": [ + { + "elements": [ + biomass_coefs[4], + self.variables["b_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1, + self.variables["b5_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + ], + "operation": "Add", + }, + ) + + # define the comprehensive biomass constraints + ## coef*b{pheno,t} - b_n{pheno,t} - 1000*bin_n{pheno} <= 0 + self.constraints["b1c_control_" + pheno][short_code][timestep] = tupConstraint( + _name("b1c_control_", pheno, short_code, timestep, self.names), + Bounds(None, 0), + { + "elements": [ + { + "elements": [ + biomass_coefs[0], + self.variables["b_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1, + self.variables["b1_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1000, + self.variables[f"bin1_{pheno}"][short_code].name, + ], + "operation": "Mul", + }, + ], + "operation": "Add", + }, + ) + self.constraints["b2c_control_" + pheno][short_code][timestep] = tupConstraint( + _name("b2c_control_", pheno, short_code, timestep, self.names), + Bounds(None, 0), + { + "elements": [ + { + "elements": [ + biomass_coefs[1], + self.variables["b_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1, + self.variables["b2_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1000, + self.variables[f"bin2_{pheno}"][short_code].name, + ], + "operation": "Mul", + }, + ], + "operation": "Add", + }, + ) + self.constraints["b3c_control_" + pheno][short_code][timestep] = tupConstraint( + _name("b3c_control_", pheno, short_code, timestep, self.names), + Bounds(None, 0), + { + "elements": [ + { + "elements": [ + biomass_coefs[2], + self.variables["b_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1, + self.variables["b3_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1000, + self.variables[f"bin3_{pheno}"][short_code].name, + ], + "operation": "Mul", + }, + ], + "operation": "Add", + }, + ) + self.constraints["b4c_control_" + pheno][short_code][timestep] = tupConstraint( + _name("b4c_control_", pheno, short_code, timestep, self.names), + Bounds(None, 0), + { + "elements": [ + { + "elements": [ + biomass_coefs[3], + self.variables["b_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1, + self.variables["b4_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1000, + self.variables[f"bin4_{pheno}"][short_code].name, + ], + "operation": "Mul", + }, + ], + "operation": "Add", + }, + ) + self.constraints["b5c_control_" + pheno][short_code][timestep] = tupConstraint( + _name("b5c_control_", pheno, short_code, timestep, self.names), + Bounds(None, 0), + { + "elements": [ + { + "elements": [ + biomass_coefs[4], + self.variables["b_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1, + self.variables["b5_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1000, + self.variables[f"bin5_{pheno}"][short_code].name, + ], + "operation": "Mul", + }, + ], + "operation": "Add", + }, + ) + + # define the binary constraints + ## b_n{pheno,t} <= 1000 - 1000*bin_n{pheno} + self.constraints["bin1c_" + pheno][short_code][timestep] = tupConstraint( + _name("bin1c_", pheno, short_code, timestep, self.names), + Bounds(0, None), + { + "elements": [ + 1000, + { + "elements": [ + -1, + self.variables["b1_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1000, + self.variables[f"bin1_{pheno}"][short_code].name, + ], + "operation": "Mul", + }, + ], + "operation": "Add", + }, + ) + self.constraints["bin2c_" + pheno][short_code][timestep] = tupConstraint( + _name("bin2c_", pheno, short_code, timestep, self.names), + Bounds(0, None), + { + "elements": [ + 1000, + { + "elements": [ + -1, + self.variables["b2_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1000, + self.variables[f"bin2_{pheno}"][short_code].name, + ], + "operation": "Mul", + }, + ], + "operation": "Add", + }, + ) + self.constraints["bin3c_" + pheno][short_code][timestep] = tupConstraint( + _name("bin3c_", pheno, short_code, timestep, self.names), + Bounds(0, None), + { + "elements": [ + 1000, + { + "elements": [ + -1, + self.variables["b3_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1000, + self.variables[f"bin3_{pheno}"][short_code].name, + ], + "operation": "Mul", + }, + ], + "operation": "Add", + }, + ) + self.constraints["bin4c_" + pheno][short_code][timestep] = tupConstraint( + _name("bin4c_", pheno, short_code, timestep, self.names), + Bounds(0, None), + { + "elements": [ + 1000, + { + "elements": [ + -1, + self.variables["b4_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1000, + self.variables[f"bin4_{pheno}"][short_code].name, + ], + "operation": "Mul", + }, + ], + "operation": "Add", + }, + ) + self.constraints["bin5c_" + pheno][short_code][timestep] = tupConstraint( + _name("bin5c_", pheno, short_code, timestep, self.names), + Bounds(0, None), + { + "elements": [ + 1000, + { + "elements": [ + -1, + self.variables["b5_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1000, + self.variables[f"bin5_{pheno}"][short_code].name, + ], + "operation": "Mul", + }, + ], + "operation": "Add", + }, + ) + + # load the constraints to the model + return [ + self.constraints["b1c_" + pheno][short_code][timestep], + self.constraints["b2c_" + pheno][short_code][timestep], + self.constraints["b3c_" + pheno][short_code][timestep], + self.constraints["b4c_" + pheno][short_code][timestep], + self.constraints["b5c_" + pheno][short_code][timestep], + self.constraints["b1c_control_" + pheno][short_code][timestep], + self.constraints["b2c_control_" + pheno][short_code][timestep], + self.constraints["b3c_control_" + pheno][short_code][timestep], + self.constraints["b4c_control_" + pheno][short_code][timestep], + self.constraints["b5c_control_" + pheno][short_code][timestep], + self.constraints["bin1c_" + pheno][short_code][timestep], + self.constraints["bin2c_" + pheno][short_code][timestep], + self.constraints["bin3c_" + pheno][short_code][timestep], + self.constraints["bin4c_" + pheno][short_code][timestep], + self.constraints["bin5c_" + pheno][short_code][timestep], + ] + + def initialize_vars_cons(self, pheno, short_code): + # cvt and cvf + self.variables["cvt_" + pheno] = {} + self.variables["cvf_" + pheno] = {} + self.variables["cvt_" + pheno][short_code] = {} + self.variables["cvf_" + pheno][short_code] = {} + # total biomass and growth + self.variables["b_" + pheno] = {} + self.variables["g_" + pheno] = {} + self.variables["b_" + pheno][short_code] = {} + self.variables["g_" + pheno][short_code] = {} + self.constraints["gc_" + pheno] = {} + self.constraints["cvc_" + pheno] = {} + self.constraints["gc_" + pheno][short_code] = {} + self.constraints["cvc_" + pheno][short_code] = {} + # partitioned biomasses + self.variables["b1_" + pheno] = {} + self.variables["b2_" + pheno] = {} + self.variables["b3_" + pheno] = {} + self.variables["b4_" + pheno] = {} + self.variables["b5_" + pheno] = {} + self.variables["b1_" + pheno][short_code] = {} + self.variables["b2_" + pheno][short_code] = {} + self.variables["b3_" + pheno][short_code] = {} + self.variables["b4_" + pheno][short_code] = {} + self.variables["b5_" + pheno][short_code] = {} + ## biomass binary variables + self.variables[f"bin1_{pheno}"] = {} + self.variables[f"bin2_{pheno}"] = {} + self.variables[f"bin3_{pheno}"] = {} + self.variables[f"bin4_{pheno}"] = {} + self.variables[f"bin5_{pheno}"] = {} + self.variables[f"bin1_{pheno}"][short_code] = {} + self.variables[f"bin2_{pheno}"][short_code] = {} + self.variables[f"bin3_{pheno}"][short_code] = {} + self.variables[f"bin4_{pheno}"][short_code] = {} + self.variables[f"bin5_{pheno}"][short_code] = {} + ## biomass partition constraints + self.constraints["b1c_" + pheno] = {} + self.constraints["b2c_" + pheno] = {} + self.constraints["b3c_" + pheno] = {} + self.constraints["b4c_" + pheno] = {} + self.constraints["b5c_" + pheno] = {} + self.constraints["b1c_" + pheno][short_code] = {} + self.constraints["b2c_" + pheno][short_code] = {} + self.constraints["b3c_" + pheno][short_code] = {} + self.constraints["b4c_" + pheno][short_code] = {} + self.constraints["b5c_" + pheno][short_code] = {} + self.constraints["b1c_control_" + pheno] = {} + self.constraints["b2c_control_" + pheno] = {} + self.constraints["b3c_control_" + pheno] = {} + self.constraints["b4c_control_" + pheno] = {} + self.constraints["b5c_control_" + pheno] = {} + self.constraints["b1c_control_" + pheno][short_code] = {} + self.constraints["b2c_control_" + pheno][short_code] = {} + self.constraints["b3c_control_" + pheno][short_code] = {} + self.constraints["b4c_control_" + pheno][short_code] = {} + self.constraints["b5c_control_" + pheno][short_code] = {} + self.constraints[f"binc_{pheno}"] = {} + self.constraints[f"binc_{pheno}"][short_code] = {} + self.constraints["bin1c_" + pheno] = {} + self.constraints["bin2c_" + pheno] = {} + self.constraints["bin3c_" + pheno] = {} + self.constraints["bin4c_" + pheno] = {} + self.constraints["bin5c_" + pheno] = {} + self.constraints["bin1c_" + pheno][short_code] = {} + self.constraints["bin2c_" + pheno][short_code] = {} + self.constraints["bin3c_" + pheno][short_code] = {} + self.constraints["bin4c_" + pheno][short_code] = {} + self.constraints["bin5c_" + pheno][short_code] = {} + + def get_timestep_bin(self, timestep): + if timestep < self.first: + return 0 + elif timestep < self.second: + return 1 + elif timestep < self.third: + return 2 + elif timestep < self.fourth: + return 3 + return 4 + + def define_problem( + self, + parameters=None, + mets_to_track=None, + rel_final_conc=None, + zero_start=None, + abs_final_conc=None, + data_timesteps=None, + export_zip_name: str = None, + export_parameters: bool = True, + export_lp: str = "CommPhitting.lp", + primal_values=None, + biomass_coefs=None, + requisite_biomass: dict = None, + biolog_simulation=False, + export_phenotype_profiles=True, + ): + # parse the growth data + growth_tup = FBAHelper.parse_df(self.data_df, False) + self.phenotypes = list(self.fluxes_tup.columns) + self.phenotypes.extend( + [ + signal_species(signal) + "_stationary" + for signal in growth_tup.columns + if (":" in signal and "OD" not in signal) + ] + ) + self.species_list = [ + signal_species(signal) for signal in growth_tup.columns if ":" in signal + ] + num_sorted = np.sort(np.array([int(obj[1:]) for obj in set(growth_tup.index)])) + # TODO - short_codes must be distinguished for different conditions + unique_short_codes = [ + f"{growth_tup.index[0][0]}{num}" for num in map(str, num_sorted) + ] + full_times = growth_tup.values[:, growth_tup.columns.index("Time (s)")] + self.times = { + short_code: trial_contents(short_code, growth_tup.index, full_times) + for short_code in unique_short_codes + } + average_time_series = np.mean(list(self.times.values()), axis=0) + points = len(average_time_series) + self.first, self.second, self.third, self.fourth = ( + int(points * 0.1), + int(points * 0.25), + int(points * 0.45), + int(points * 0.7), + ) + self.time_ranges = { + 0: average_time_series[: self.first], + 1: average_time_series[self.first : self.second], + 2: average_time_series[self.second : self.third], + 3: average_time_series[self.third : self.fourth], + 4: average_time_series[self.fourth :], + } + + # define default values + # TODO render bcv and cvmin dependent upon temperature, and possibly trained on Carlson's data + parameters, data_timesteps = parameters or {}, data_timesteps or {} + self.parameters["data_timestep_hr"] = ( + np.mean(np.diff(np.array(list(self.times.values())).flatten())) / hour + if not hasattr(self, "data_timestep_hr") + else self.data_timestep_hr + ) + self.parameters.update( + { + "timestep_hr": self.parameters["data_timestep_hr"], + "cvct": 0.01, + "cvcf": 0.01, + "bcv": 0.01, + "cvmin": 0.01, + "kcat": 0.33, + "diffpos": 1, + "diffneg": 1, # coefficients that weight difference between experimental and predicted biomass + "stationary": 10, # the penalty coefficient for the stationary phenotype + } + ) + self.parameters.update(parameters) + # distribute kcat values to all phenotypes of all species and update from previous simulations where necessary + self.parameters.update( + self._universalize(self.parameters, "kcat", exclude=["stationary"]) + ) + if primal_values is not None: + for species, content in self.parameters["kcat"].items(): + if species not in primal_values: + continue + for pheno, content2 in content.items(): + if pheno not in primal_values[species]: + continue + for time, val in content2.items(): + if time not in primal_values[species][pheno]: + continue + self.parameters["kcat"][species][pheno][time] = val + print(self.parameters["kcat"]) + # define the metabolites that are tracked, exchanged, and not available in the media + # TODO the default zero_start logic appears to be incorrect + self.zero_start = zero_start or [ + met + for met in self.consumed_mets + if (met not in self.carbon_conc or self.carbon_conc[met] == 0) + ] + self.rel_final_conc = rel_final_conc or { + met: 0.1 + for met, concs in self.carbon_conc.items() + if any( + [concs[short_code] > 0 for short_code in self.data_df.index.unique()] + ) + and met not in self.zero_start + } + self.abs_final_conc = abs_final_conc or {} + if mets_to_track: + self.mets_to_track = mets_to_track + elif not isinstance(rel_final_conc, dict): + self.mets_to_track = self.fluxes_tup.index + else: + self.mets_to_track = list(self.rel_final_conc.keys()) + self.zero_start + print(self.mets_to_track) + + ts_to_delete = ( + {} + ) # {short_code: full_times for short_code in unique_short_codes} + if data_timesteps: # {short_code:[times]} + for short_code, times in data_timesteps.items(): + ts_to_delete[short_code] = set(list(range(len(full_times)))) - set( + times + ) + self.times[short_code] = np.delete( + self.times[short_code], list(ts_to_delete[short_code]) + ) + + # construct the problem + objective = tupObjective( + "minimize variance and phenotypic transitions", [], "min" + ) + constraints, variables, simulated_mets = [], [], [] + time_1 = process_time() + for exID in self.fluxes_tup.index: + if exID == "bio": + continue + met_id = re.search(r"(cpd\d{5})", exID).group() + met = self.msdb.compounds.get_by_id(met_id) + if "C" not in met.elements: + continue + concID = f"c_{met_id}_e0" + simulated_mets.append(met_id) + self.variables[concID] = {} + self.constraints["dcc_" + met_id] = {} + + # define the growth rate for each metabolite and concentrations + # TODO the MM parameters may be deletable once the binned kcat method is refined + if "Vmax" and "Km" in self.parameters: + self.parameters["Vmax"].update( + self._universalize(self.parameters["Vmax"], met_id) + ) + self.parameters["Km"].update( + self._universalize(self.parameters["Km"], met_id) + ) + for short_code in unique_short_codes: + self.variables[concID][short_code] = {} + self.constraints["dcc_" + met_id][short_code] = {} + timesteps = list(range(1, len(self.times[short_code]) + 1)) + for timestep in timesteps: + ## define the concentration variables + conc_var = tupVariable( + _name(concID, "", short_code, timestep, self.names) + ) + ## constrain initial time concentrations to the media or a large default + if timestep == timesteps[0]: + initial_val = None + if met_id in self.media_conc: + initial_val = self.media_conc[met_id] + if met_id in self.zero_start: + initial_val = 0 + if dict_keys_exists(self.carbon_conc, met_id, short_code): + initial_val = self.carbon_conc[met_id][short_code] + if initial_val is not None: + conc_var = conc_var._replace( + bounds=Bounds(initial_val, initial_val) + ) + if biolog_simulation: + conc_var = conc_var._replace(bounds=Bounds(1, None)) + ## mandate complete carbon consumption + elif timestep == timesteps[-1] and ( + met_id in self.rel_final_conc or met_id in self.abs_final_conc + ): + if met_id in self.rel_final_conc: + final_bound = ( + self.variables[concID][short_code][1].bounds.lb + * self.rel_final_conc[met_id] + ) + if ( + met_id in self.abs_final_conc + ): # this intentionally overwrites rel_final_conc + final_bound = self.abs_final_conc[met_id] + conc_var = conc_var._replace(bounds=Bounds(0, final_bound)) + if met_id in self.zero_start: + conc_var = conc_var._replace( + bounds=Bounds(final_bound, final_bound) + ) + self.variables[concID][short_code][timestep] = conc_var + variables.append(self.variables[concID][short_code][timestep]) + for pheno in self.phenotypes: + self.constraints["dbc_" + pheno] = { + short_code: {} for short_code in unique_short_codes + } + + # define growth and biomass variables and constraints + for pheno in self.phenotypes: + for short_code in unique_short_codes: + self.initialize_vars_cons(pheno, short_code) + timesteps = list(range(1, len(self.times[short_code]) + 1)) + nth_percentile_timestep = timesteps[int(0.90 * len(timesteps))] + penalty_range = np.linspace( + self.parameters["stationary"], + self.parameters["stationary"] / 10, + len(timesteps[nth_percentile_timestep:]), + ) + timestep_excess_count = 0 + for timestep in map(int, timesteps): + variables = self.define_b_vars( + pheno, short_code, timestep, variables + ) + if short_code not in self.constraints[f"binc_{pheno}"]: + self.constraints[f"binc_{pheno}"][short_code] = tupConstraint( + _name("binc_", pheno, short_code, "", self.names), + Bounds(0, 4), + { + "elements": [ + self.variables[f"bin1_{pheno}"][short_code].name, + self.variables[f"bin2_{pheno}"][short_code].name, + self.variables[f"bin3_{pheno}"][short_code].name, + self.variables[f"bin4_{pheno}"][short_code].name, + self.variables[f"bin5_{pheno}"][short_code].name, + ], + "operation": "Add", + }, + ) + constraints.append( + self.constraints[f"binc_{pheno}"][short_code] + ) + constraints.extend( + self.define_b_cons(pheno, short_code, timestep, biomass_coefs) + ) + + ## define the growth rate variable or primal value + species, phenotype = pheno.split("_") + self.variables["g_" + pheno][short_code][timestep] = tupVariable( + _name("g_", pheno, short_code, timestep, self.names) + ) + variables.append(self.variables["g_" + pheno][short_code][timestep]) + + if "stationary" in pheno: + weight = self.parameters["stationary"] + if timestep > nth_percentile_timestep: + weight = penalty_range[timestep_excess_count] + timestep_excess_count += 1 + objective.expr.extend( + [ + { + "elements": [ + { + "elements": [ + weight, + self.variables["b_" + pheno][ + short_code + ][timestep].name, + ], + "operation": "Mul", + } + ], + "operation": "Add", + } + ] + ) + continue + # the conversion rates to and from the stationary phase + self.variables["cvt_" + pheno][short_code][timestep] = tupVariable( + _name("cvt_", pheno, short_code, timestep, self.names), + Bounds(0, 100), + ) + self.variables["cvf_" + pheno][short_code][timestep] = tupVariable( + _name("cvf_", pheno, short_code, timestep, self.names), + Bounds(0, 100), + ) + variables.extend( + [ + self.variables["cvf_" + pheno][short_code][timestep], + self.variables["cvt_" + pheno][short_code][timestep], + ] + ) + + # cvt <= bcv*b_{pheno} + cvmin + self.constraints["cvc_" + pheno][short_code][timestep] = ( + tupConstraint( + _name("cvc_", pheno, short_code, timestep, self.names), + (0, None), + { + "elements": [ + { + "elements": [ + -1, + self.variables["cvt_" + pheno][short_code][ + timestep + ].name, + ], + "operation": "Mul", + } + ], + "operation": "Add", + }, + ) + ) + # biomass_term = [self.parameters['bcv']*b_value + self.parameters['cvmin']] if FBAHelper.isnumber(b_value) else [ + biomass_term = [ + self.parameters["cvmin"], + { + "elements": [ + self.parameters["bcv"], + self.variables["b_" + pheno][short_code][timestep].name, + ], + "operation": "Mul", + }, + ] + self.constraints["cvc_" + pheno][short_code][timestep].expr[ + "elements" + ].extend(biomass_term) + + # g_{pheno} = b_{pheno}*v_{pheno} + b_values = [ + self.variables["b1_" + pheno][short_code][timestep].name, + self.variables["b2_" + pheno][short_code][timestep].name, + self.variables["b3_" + pheno][short_code][timestep].name, + self.variables["b4_" + pheno][short_code][timestep].name, + self.variables["b5_" + pheno][short_code][timestep].name, + ] + self.constraints["gc_" + pheno][short_code][timestep] = ( + tupConstraint( + name=_name("gc_", pheno, short_code, timestep, self.names), + expr={ + "elements": [ + *[ + { + "elements": [ + -self.parameters["kcat"][species][ + phenotype + ], + b, + ], + "operation": "Mul", + } + for b in b_values + ], + self.variables["g_" + pheno][short_code][ + timestep + ].name, + ], + "operation": "Add", + }, + ) + ) + + constraints.extend( + [ + self.constraints["cvc_" + pheno][short_code][timestep], + self.constraints["gc_" + pheno][short_code][timestep], + ] + ) + # self.constraints["binTot_" + pheno][short_code]]) + + # define the concentration constraint + half_dt = self.parameters["data_timestep_hr"] / 2 + time_2 = process_time() + print( + f"Done with concentrations and biomass loops: {(time_2 - time_1) / 60} min" + ) + for r_index, met in enumerate(self.fluxes_tup.index): + met_id = _met_id_parser(met) + if met_id not in simulated_mets: + continue + concID = f"c_{met_id}_e0" + for short_code in unique_short_codes: + timesteps = list(range(1, len(self.times[short_code]) + 1)) + for timestep in timesteps[:-1]: + # c_{met} + dt/2*sum_k^K(n_{k,met} * (g_{pheno}+g+1_{pheno})) = c+1_{met} + next_timestep = timestep + 1 + growth_phenos = [ + [ + self.variables["g_" + pheno][short_code][ + next_timestep + ].name, + self.variables["g_" + pheno][short_code][timestep].name, + ] + for pheno in self.fluxes_tup.columns + ] + self.constraints["dcc_" + met_id][short_code][timestep] = ( + tupConstraint( + name=_name( + "dcc_", met_id, short_code, timestep, self.names + ), + expr={ + "elements": [ + self.variables[concID][short_code][timestep].name, + { + "elements": [ + -1, + self.variables[concID][short_code][ + next_timestep + ].name, + ], + "operation": "Mul", + }, + *OptlangHelper.dot_product( + growth_phenos, + heuns_coefs=half_dt + * self.fluxes_tup.values[r_index], + ), + ], + "operation": "Add", + }, + ) + ) + constraints.append( + self.constraints["dcc_" + met_id][short_code][timestep] + ) + + # define the conversion variables of every signal for every phenotype + # for signal in growth_tup.columns[2:]: + # for pheno in self.fluxes_tup.columns: + # conversion_name = "_".join([signal, pheno, "__conversion"]) + # self.variables[conversion_name] = tupVariable(conversion_name) + # variables.append(self.variables[conversion_name]) + + time_3 = process_time() + print(f"Done with DCC loop: {(time_3 - time_2) / 60} min") + species_phenos = {} + self.conversion_bounds = [5e-6, 50] + for index, org_signal in enumerate(growth_tup.columns[2:]): + # signal = org_signal.split(":")[1] + signal = org_signal.replace(":", "|") + species = signal_species(org_signal) + species_phenos[species] = { + None if "OD" in species else f"{species}_stationary" + } + signal_column_index = index + 2 + data_timestep = 1 + self.variables[signal + "|conversion"] = tupVariable( + signal + "|conversion", bounds=Bounds(*self.conversion_bounds) + ) + variables.append(self.variables[signal + "|conversion"]) + + self.variables[signal + "|bio"] = {} + self.variables[signal + "|diffpos"] = {} + self.variables[signal + "|diffneg"] = {} + self.variables["g_" + species] = {} + self.constraints[signal + "|bioc"] = {} + self.constraints[signal + "|diffc"] = {} + self.constraints["gc_" + species] = {} + self.constraints["totVc_" + species] = {} + self.constraints["totGc_" + species] = {} + self.constraints[signal + "|bio_finalc"] = {} + for short_code in unique_short_codes: + self.variables[signal + "|bio"][short_code] = {} + self.variables[signal + "|diffpos"][short_code] = {} + self.variables[signal + "|diffneg"][short_code] = {} + self.variables["g_" + species][short_code] = {} + self.constraints[signal + "|bioc"][short_code] = {} + self.constraints[signal + "|diffc"][short_code] = {} + self.constraints["gc_" + species][short_code] = {} + self.constraints["totVc_" + species][short_code] = {} + self.constraints["totGc_" + species][short_code] = {} + # self.constraints[signal + '|bio_finalc'][short_code] = {} + # the value entries are matched to only the timesteps that are condoned by data_timesteps + values_slice = trial_contents( + short_code, growth_tup.index, growth_tup.values + ) + if ts_to_delete: + values_slice = np.delete( + values_slice, list(ts_to_delete[short_code]), axis=0 + ) + timesteps = list(range(1, len(values_slice) + 1)) + # the last timestep is omitted since Heun's method in the modelled biomass + ## requires a future timestep, which does not exist for the last timestep + for timestep in timesteps[:-1]: + ## the user timestep and data timestep must be synchronized + if ( + int(timestep) * self.parameters["timestep_hr"] + < data_timestep * self.parameters["data_timestep_hr"] + ): + print( + f"Skipping timestep {timestep} that does not align with the user's timestep" + ) + continue + data_timestep += 1 + if data_timestep > int( + self.times[short_code][-1] / self.parameters["data_timestep_hr"] + ): + print( + f"The user-defined time exceeds the simulation time, so the DBC & diff loop is broken." + ) + break + next_timestep = int(timestep) + 1 + ## the phenotype transition terms are aggregated + total_biomass, signal_sum, from_sum, to_sum = [], [], [], [] + for pheno_index, pheno in enumerate(self.phenotypes): + ### define the collections of signal and pheno terms + if species in pheno or "OD" in signal: + # if not FBAHelper.isnumber(b_values[pheno][short_code][timestep]): + signal_sum.append( + { + "operation": "Mul", + "elements": [ + -1, + self.variables["b_" + pheno][short_code][ + timestep + ].name, + ], + } + ) + # else: + # signal_sum.append(-b_values[pheno][short_code][timestep]) + ### total_biomass.append(self.variables["b_"+pheno][short_code][timestep].name) + if all( + [ + "OD" not in signal, + species in pheno, + "stationary" not in pheno, + ] + ): + species_phenos[species].add(pheno) + from_sum.append( + { + "operation": "Mul", + "elements": [ + -1, + self.variables["cvf_" + pheno][short_code][ + timestep + ].name, + ], + } + ) + to_sum.append( + self.variables["cvt_" + pheno][short_code][ + timestep + ].name + ) + for pheno in species_phenos[species]: + if "OD" in signal: + continue + # print(pheno, timestep, b_values[pheno][short_code][timestep], b_values[pheno][short_code][next_timestep]) + if "stationary" in pheno: + # b_{phenotype} - sum_k^K(es_k*cvf) + sum_k^K(pheno_bool*cvt) = b+1_{phenotype} + self.constraints["dbc_" + pheno][short_code][timestep] = ( + tupConstraint( + name=_name( + "dbc_", pheno, short_code, timestep, self.names + ), + expr={ + "elements": [*from_sum, *to_sum], + "operation": "Add", + }, + ) + ) + else: + # b_{phenotype} + dt/2*(g_{phenotype} + g+1_{phenotype}) + cvf-cvt = b+1_{phenotype} + self.constraints["dbc_" + pheno][short_code][timestep] = ( + tupConstraint( + name=_name( + "dbc_", pheno, short_code, timestep, self.names + ), + expr={ + "elements": [ + self.variables["cvf_" + pheno][short_code][ + timestep + ].name, + { + "elements": [ + half_dt, + self.variables["g_" + pheno][ + short_code + ][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + half_dt, + self.variables["g_" + pheno][ + short_code + ][next_timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + -1, + self.variables["cvt_" + pheno][ + short_code + ][timestep].name, + ], + "operation": "Mul", + }, + ], + "operation": "Add", + }, + ) + ) + # if not FBAHelper.isnumber(self.variables['b_' + pheno][short_code][timestep]): + biomass_term = [ + self.variables["b_" + pheno][short_code][timestep].name, + { + "elements": [ + -1, + self.variables["b_" + pheno][short_code][ + next_timestep + ].name, + ], + "operation": "Mul", + }, + ] + # else: + # biomass_term = [b_values[pheno][short_code][timestep]-b_values[pheno][short_code][next_timestep]] + self.constraints["dbc_" + pheno][short_code][timestep].expr[ + "elements" + ].extend(biomass_term) + constraints.append( + self.constraints["dbc_" + pheno][short_code][timestep] + ) + + if not requisite_biomass or any( + [ + timestep != timesteps[-2], + signal not in requisite_biomass[short_code], + ] + ): + self.variables[signal + "|bio"][short_code][timestep] = ( + tupVariable( + _name(signal, "|bio", short_code, timestep, self.names) + ) + ) + else: + biomass_flux = requisite_biomass[short_code][signal]["bio"] + estimated_biomass = biomass_flux # * int(timestep)*self.parameters['data_timestep_hr'] + self.variables[signal + "|bio"][short_code][timestep] = ( + tupVariable( + _name(signal, "|bio", short_code, timestep, self.names), + Bounds(estimated_biomass, None), + ) + ) + self.variables[signal + "|diffpos"][short_code][timestep] = ( + tupVariable( + _name(signal, "|diffpos", short_code, timestep, self.names), + Bounds(0, 100), + ) + ) + self.variables[signal + "|diffneg"][short_code][timestep] = ( + tupVariable( + _name(signal, "|diffneg", short_code, timestep, self.names), + Bounds(0, 100), + ) + ) + variables.extend( + [ + self.variables[signal + "|bio"][short_code][timestep], + self.variables[signal + "|diffpos"][short_code][timestep], + self.variables[signal + "|diffneg"][short_code][timestep], + ] + ) + + # {signal}__conversion*datum = {signal}__bio + # TODO - the conversion variable must be a constant for BIOLOG conditions + self.constraints[signal + "|bioc"][short_code][timestep] = ( + tupConstraint( + name=_name( + signal, "|bioc", short_code, timestep, self.names + ), + expr={ + "elements": [ + { + "elements": [ + -1, + self.variables[signal + "|bio"][short_code][ + timestep + ].name, + ], + "operation": "Mul", + }, + { + "elements": [ + self.variables[signal + "|conversion"].name, + values_slice[timestep, signal_column_index], + ], + "operation": "Mul", + }, + ], + "operation": "Add", + }, + ) + ) + constraints.append( + self.constraints[signal + "|bioc"][short_code][timestep] + ) + + # {speces}_bio + {signal}_diffneg-{signal}_diffpos = sum_k^K(es_k*b_{phenotype}) + self.constraints[signal + "|diffc"][short_code][timestep] = ( + tupConstraint( + name=_name( + signal, "|diffc", short_code, timestep, self.names + ), + expr={ + "elements": [ + self.variables[signal + "|bio"][short_code][ + timestep + ].name, + self.variables[signal + "|diffneg"][short_code][ + timestep + ].name, + { + "elements": [ + -1, + self.variables[signal + "|diffpos"][ + short_code + ][timestep].name, + ], + "operation": "Mul", + }, + ], + "operation": "Add", + }, + ) + ) + if all([isinstance(val, dict) for val in signal_sum]): + self.constraints[signal + "|diffc"][short_code][timestep].expr[ + "elements" + ].extend(signal_sum) + else: + raise ValueError( + f"The {signal_sum} value has unexpected contents." + ) + constraints.append( + self.constraints[signal + "|diffc"][short_code][timestep] + ) + + objective.expr.extend( + [ + { + "elements": [ + { + "elements": [ + self.parameters["diffpos"], + self.variables[f"{signal}|diffpos"][ + short_code + ][timestep].name, + ], + "operation": "Mul", + }, + { + "elements": [ + self.parameters["diffneg"], + self.variables[f"{signal}|diffneg"][ + short_code + ][timestep].name, + ], + "operation": "Mul", + }, + ], + "operation": "Add", + } + ] + ) + + time_4 = process_time() + print(f"Done with the DBC & diffc loop: {(time_4 - time_3) / 60} min") + + # construct the problem + self.problem = OptlangHelper.define_model( + "CommPhitting model", variables, constraints, objective, True + ) + self.hdf5_name = export_lp.replace(".lp", ".h5") + self.hdf5_file = File(self.hdf5_name, "w") + time_5 = process_time() + print( + f"Done with constructing the {type(self.problem)} model: {(time_5 - time_4) / 60} min" + ) + + # export contents + if export_phenotype_profiles: + phenotype_profiles_name = "phenotype_profiles.tsv" + self.fluxes_df.to_csv(phenotype_profiles_name, sep="\t") + self.zipped_output.append(phenotype_profiles_name) + if export_parameters: + parameter_name = "parameters.tsv" + DataFrame( + data=list(self.parameters.values()), + index=list(self.parameters.keys()), + columns=["values"], + ).to_csv(parameter_name, sep="\t") + self.zipped_output.append(parameter_name) + if export_lp: + if re.search(r"(\\\\/)", export_lp): + os.makedirs(os.path.dirname(export_lp), exist_ok=True) + with open(export_lp, "w") as lp: + lp.write(self.problem.to_lp()) + model_name = "CommPhitting.json" + _export_model_json(self.problem.to_json(), model_name) + self.zipped_output.extend([export_lp, model_name]) + if export_zip_name: + self.zip_name = export_zip_name + sleep(2) + with ZipFile(self.zip_name, "a", compression=ZIP_LZMA) as zp: + for file in self.zipped_output: + zp.write(file) + os.remove(file) + self.zipped_output.remove(file) + time_6 = process_time() + print(f"Done exporting the content: {(time_6 - time_5) / 60} min") + + def compute( + self, + graphs: list = None, + export_zip_name=None, + figures_zip_name=None, + publishing=False, + primals_export_path: str = "primal_values.json", + remove_empty_plots=False, + ): + print("starting optimization") + time1 = process_time() + self.values = {} + solution = self.problem.optimize() + timesteps = min(list(map(len, self.times.values()))) + fit_quality = self.problem.objective.value / timesteps + print(f"The optimization fit quality is {fit_quality}") + if "parameters.tsv" in self.zipped_output: + self.parameters["fit"] = fit_quality + parameter_name = "parameters.tsv" + DataFrame( + data=list(self.parameters.values()), + index=list(self.parameters.keys()), + columns=["values"], + ).to_csv(parameter_name, sep="\t") + with ZipFile(self.zip_name, "a", compression=ZIP_LZMA) as zp: + for file in self.zipped_output: + zp.write(file) + os.remove(file) + + # TODO approximate a threshold of good fits, and trigger black box optimization for bad fits + ## that iteratively adjust parameters until the fit metric surmounts the threshold. + + # categorize the primal values by trial and time + if "optimal" not in solution: + raise FeasibilityError( + f"The solution is sub-optimal, with a(n) {solution} status." + ) + if all(np.array(list(self.problem.primal_values.values())) == 0): + raise NoFluxError("The simulation lacks any flux.") + for variable, value in self.problem.primal_values.items(): + if "v_" in variable: + self.values[variable] = value + elif "conversion" in variable or re.search(r"(bin\d)", variable): + self.values[short_code].update({variable: value}) + if value in self.conversion_bounds: + warnings.warn( + f"The conversion factor {value} optimized to a bound, which may be " + f"indicative of an error, such as improper kinetic rates." + ) + else: + basename, short_code, timestep = variable.split("-") + time_hr = int(timestep) * self.parameters["data_timestep_hr"] + self.values[short_code] = self.values.get(short_code, {}) + self.values[short_code][basename] = self.values[short_code].get( + basename, {} + ) + self.values[short_code][basename][time_hr] = value + + # export the processed primal values for graphing + # with open(primals_export_path, 'w') as out: + # json.dump(self.values, out, indent=3) + # if not export_zip_name and hasattr(self, 'zip_name'): + # export_zip_name = self.zip_name + # if export_zip_name: + # with ZipFile(export_zip_name, 'a', compression=ZIP_LZMA) as zp: + # zp.write(primals_export_path) + # os.remove(primals_export_path) + # visualize the specified information + time2 = process_time() + if graphs: + self.graph( + graphs, + export_zip_name=figures_zip_name or export_zip_name, + publishing=publishing, + remove_empty_plots=remove_empty_plots, + ) + + # parse the primal values + values_df = DataFrame(self.values) + values_index = values_df.index.tolist() + for col in values_df.columns: + trial_values = values_df[col].tolist() + ## process the times + times = [list(ele.keys()) for ele in trial_values if isinstance(ele, dict)] + max_time = max(list(map(len, times))) + for max_time_series in times: + if len(max_time_series) == max_time: + break + trial_path = f"results/primals/{col}/" + self.hdf5_file.create_dataset(f"{trial_path}/times", data=max_time_series) + ## process the data values + for index, ele in enumerate(trial_values): + dataset_name = f"{trial_path}/{values_index[index]}" + if FBAHelper.isnumber(ele): + self.hdf5_file.create_dataset(dataset_name, data=[float(ele)]) + elif isinstance(ele, dict): + self.hdf5_file.create_dataset( + dataset_name, data=list(map(float, ele.values())) + ) + self.hdf5_file[dataset_name].attrs["full_time"] = ( + len(ele.values()) == max_time + ) + + self.hdf5_file.close() + with ZipFile(self.zip_name, "a", compression=ZIP_LZMA) as zp: + zp.write(self.hdf5_name) + os.remove(self.hdf5_name) + + time3 = process_time() + print(f"Optimization completed in {(time2-time1)/60} minutes") + print(f"Graphing completed in {(time3-time2)/60} minutes") + + def load_model( + self, + mscomfit_json_path: str = None, + zip_name: str = None, + model_to_load: dict = None, + ): + if zip_name: + with ZipFile(zip_name, "r") as zp: + zp.extract(mscomfit_json_path) + if mscomfit_json_path: + with open(mscomfit_json_path, "r") as mscmft: + return json.load(mscmft) + if model_to_load: + self.problem = Model.from_json(model_to_load) + + @staticmethod + def assign_values(param, var, next_dimension, kcat=True): + dic = {var: {}} + for dim1, dim2_list in next_dimension.items(): + if isinstance(dim2_list, dict): + dic[var].update(CommPhitting.assign_values(param, dim1, dim2_list)) + else: + if kcat: + dic[var][dim1] = param + else: + dic[var][dim1] = {dim2: param for dim2 in dim2_list} + return dic + + def _universalize(self, param, var, next_dimension=None, exclude=None, tsBin=False): + if not next_dimension: + next_dimension = {} + for organism in self.fluxes_tup.columns: + species, pheno = organism.split("_") + if pheno in exclude: + continue + if not tsBin: + if species in next_dimension: + next_dimension[species].append(pheno) + else: + next_dimension[species] = [pheno] + else: + if species in next_dimension: + next_dimension[species].update({pheno: self.time_ranges}) + else: + next_dimension[species] = {pheno: self.time_ranges} + if FBAHelper.isnumber(param): + return CommPhitting.assign_values(param, var, next_dimension) + elif FBAHelper.isnumber(param[var]): + return CommPhitting.assign_values(param[var], var, next_dimension) + elif isinstance(param[var], dict): + return { + var: { + dim1: {dim2: param[var][dim1] for dim2 in dim2_list} + for dim1, dim2_list in next_dimension.items() + } + } + else: + logger.critical( + f"The param (with keys {dic_keys(param)}) and var {var} are not amenable" + " with the parameterizing a universal value." + ) + # {short_code: {list(timestep_info.keys())[0]: find_dic_number(param)} for short_code, timestep_info in variable.items()}} + + def adjust_color(self, color, amount=0.5): + """ + Lightens the given color by multiplying (1-luminosity) by the given amount. + Input can be matplotlib color string, hex string, or RGB tuple. + + Examples: + >> lighten_color('g', 0.3) + >> lighten_color('#F034A3', 0.6) + >> lighten_color((.3,.55,.1), 0.5) + """ + import colorsys + import matplotlib.colors as mc + + try: + c = mc.cnames[color] + except: + c = color + c = colorsys.rgb_to_hls(*mc.to_rgb(c)) + return colorsys.hls_to_rgb(c[0], max(0, min(1, amount * c[1])), c[2]) + + def _add_plot( + self, + ax, + labels, + label, + basename, + trial, + x_axis_split, + linestyle="solid", + scatter=False, + color=None, + xs=None, + ys=None, + ): + labels.append(label or basename.split("-")[-1]) + xs = ( + xs + if xs is not None + else list(map(float, self.values[trial][basename].keys())) + ) + ys = ( + ys + if ys is not None + else list(map(float, self.values[trial][basename].values())) + ) + if scatter: + ax.scatter(xs, ys, s=10, label=labels[-1], color=color or None) + else: + ax.plot(xs, ys, label=labels[-1], linestyle=linestyle, color=color or None) + ax.set_xticks(list(map(int, xs))[::x_axis_split]) + return ax, labels + + def graph( + self, + graphs, + primal_values_filename: str = None, + primal_values_zip_path: str = None, + export_zip_name: str = None, + data_timestep_hr: float = 0.163, + publishing: bool = False, + title: str = None, + remove_empty_plots: bool = False, + ): + print(export_zip_name) + # define the default timestep ratio as 1 + data_timestep_hr = self.parameters.get("data_timestep_hr", data_timestep_hr) + timestep_ratio = data_timestep_hr / self.parameters.get( + "timestep_hr", data_timestep_hr + ) + if primal_values_filename: + if primal_values_zip_path: + with ZipFile(primal_values_zip_path, "r") as zp: + zp.extract(primal_values_filename) + with open(primal_values_filename, "r", encoding="utf-8") as primal: + self.values = json.load(primal) + + # plot the content for desired trials + x_axis_split = int(3 / data_timestep_hr / timestep_ratio) + self.plots = set() + contents = {"biomass": "b_", "all_biomass": "b_", "growth": "g_", "conc": "c_"} + mM_threshold = 1e-3 + for graph_index, graph in enumerate(graphs): + content = contents.get(graph["content"], graph["content"]) + y_label = "Variable value" + x_label = r"Time ($hr$)" + if any([x in graph["content"] for x in ["biomass", "OD"]]): + total_biomasses = {name: [] for name in self.species_list} + total_biomasses.update({"OD": []}) + if "species" not in graph: + graph["species"] = self.species_list + if "biomass" in graph["content"]: + y_label = r"Biomass ($\frac{g}{L}$)" + elif "growth" in graph["content"]: + y_label = r"Biomass growth ($\frac{g}{hr}$)" + graph["experimental_data"] = graph.get("experimental_data", False) + if "painting" not in graph: + graph["painting"] = { + "OD": { + "color": "blue", + "linestyle": "solid", + "name": "Total biomass", + }, + "ecoli": {"color": "red", "linestyle": "dashed", "name": "E. coli"}, + "pf": { + "color": "green", + "linestyle": "dotted", + "name": "P. fluorescens", + }, + } + graph["parsed"] = graph.get("parsed", False) + if "phenotype" in graph and graph["phenotype"] == "*": + if "species" not in graph: + graph["species"] = self.species_list + graph["phenotype"] = set( + [ + pheno.split("_")[-1] + for pheno in self.phenotypes + if pheno.split("_")[0] in graph["species"] + ] + ) + # TODO - a species-resolved option must be developed for the paper figure + if "species" in graph and graph["species"] == "*": + graph["species"] = self.species_list + elif content == "c_" and "mets" not in graph: + print(self.mets_to_track) + graph["mets"] = self.mets_to_track + elif not any(["species" in graph, "mets" in graph]): + raise ValueError( + f"The specified graph {graph} must define species for which data will be plotted." + ) + print(f"graph_{graph_index}") + pprint(graph) + + # define figure specifications + if publishing: + pyplot.rc("axes", titlesize=22, labelsize=28) + pyplot.rc("xtick", labelsize=24) + pyplot.rc("ytick", labelsize=24) + pyplot.rc("legend", fontsize=18) + if graph["parsed"]: + parsed_graphs = {} + for species in graph["species"]: + parsed_graphs[species] = pyplot.subplots(dpi=200, figsize=(11, 7)) + else: + fig, ax = pyplot.subplots(dpi=200, figsize=(11, 7)) + yscale = "linear" + + # populate the figures + for trial, basenames in self.values.items(): + if trial not in graph["trial"]: + continue + labels = [] + for basename, values in basenames.items(): + # graph experimental and total simulated biomasses + if any([x in graph["content"] for x in ["biomass", "OD"]]): + if "b_" in basename: + vals = list(map(float, values.values())) + var_name, species, phenotype = basename.split("_") + # ic(basename) + label = f"{species}_biomass (model)" + if publishing: + species_name = graph["painting"][species]["name"] + label = f"{species_name} total (model)" + labels.append({species: label}) + if remove_empty_plots and all([v == 0 for v in vals]): + print(f"The {basename} is empty and thus is removed.") + continue + if ( + any( + [ + x in graph["content"] + for x in ["total", "biomass", "OD"] + ] + ) + or graph["species"] == self.species_list + ): # and not graph["parsed"]: + total_biomasses["OD"].append(vals) + if "OD" not in graph["content"]: + total_biomasses[species].append(vals) + if all( + [ + graph["experimental_data"], + "|bio" in basename, + ] + ): + # any([content in basename])]): # TODO - any() must include all_biomass and total + species, signal, phenotype = basename.split("|") + label = basename + if publishing: + species_name = ( + "total" + if "OD" in signal + else graph["painting"][species]["name"] + ) + label = f"Experimental {species_name} (from {signal})" + # print(basename, label, self.values[trial][basename].values()) + if remove_empty_plots and all( + self.values[trial][basename].values() == 0 + ): + print(f"The {basename} is empty and thus is removed.") + continue + ax, labels = self._add_plot( + ax, + labels, + label, + basename, + trial, + x_axis_split, + scatter=True, + color=self.adjust_color( + graph["painting"][species]["color"], 1.5 + ), + ) + + if content not in basename: + continue + # graph individual phenotypes + if "phenotype" in graph: + # print(graph['phenotype']) + for specie in graph["species"]: + if specie not in basename: + continue + if not any([p in basename for p in graph["phenotype"]]): + print(f"{basename} data with unknown phenotype.") + continue + if remove_empty_plots and all( + self.values[trial][basename].values() == 0 + ): + print(f"The {specie} is empty and thus is removed.") + continue + if graph["parsed"]: + fig, ax = parsed_graphs[specie] + ## define graph characteristics + label = basename.split("_")[-1] + style = "solid" + if len(graph["species"]) > 1: + label = re.sub(r"(^[a-b]+\_)", "", basename) + style = graph["painting"][specie]["linestyle"] + ax, labels = self._add_plot( + ax, labels, label, basename, trial, x_axis_split, style + ) + if graph["parsed"]: + parsed_graphs[specie] = (fig, ax) + # graph media concentration plots + elif "mets" in graph and all( + [ + any([x in basename for x in graph["mets"]]), + "c_cpd" in basename, + ] + ): + if not any( + np.array(list(self.values[trial][basename].values())) + > mM_threshold + ): + continue + if remove_empty_plots and all( + self.values[trial][basename].values() == 0 + ): + continue + label = self.msdb.compounds.get_by_id( + re.search(r"(cpd\d+)", basename).group() + ).name + ax, labels = self._add_plot( + ax, labels, label, basename, trial, x_axis_split + ) + yscale = "log" + y_label = r"Concentration ($mM$)" + + if labels: # assesses whether graph(s) were created + ## graph all of the total biomasses + if any([x in graph["content"] for x in ["OD", "biomass", "total"]]): + labeled_species = [ + label for label in labels if isinstance(label, dict) + ] + for name, vals in total_biomasses.items(): + # ic(name) + if not vals or ( + len(total_biomasses) == 2 and "OD" not in name + ): + continue + if len(total_biomasses) == 2: + specie_label = [ + graph["painting"][name]["name"] + for name in total_biomasses + if "OD" not in name + ][0] + label = f"{graph['painting'][name]['name']} ({specie_label})" + else: + label = f"{name}_biomass (model)" + if labeled_species: + for label_specie in labeled_species: + if name in label_specie: + label = label_specie[name] + break + style = ( + "solid" + if ( + len(graph["species"]) < 1 + or name not in graph["painting"] + ) + else graph["painting"][name]["linestyle"] + ) + style = "dashdot" if "model" in label else style + style = ( + "solid" + if ( + "OD" in name + and not graph["experimental_data"] + or "total" in graph["content"] + ) + else style + ) + total_biomass = sum(np.array(vals))[:-1] + xs = list(map(float, values.keys())) + if graph["parsed"]: + fig, ax = parsed_graphs[name] + self._add_plot( + ax, + labels, + label, + None, + None, + x_axis_split, + style, + False, + graph["painting"][name]["color"], + xs, + total_biomass, + ) + if graph["parsed"]: + ## process and export the parsed figures + ax.set_xlabel(x_label) + ax.set_ylabel(y_label) + ax.grid(axis="y") + ax.set_yscale(yscale) + ax.legend() + phenotype_id = graph.get("phenotype", "") + if "phenotype" in graph and not isinstance( + graph["phenotype"], str + ): + phenotype_id = ( + f"{','.join(graph['phenotype'])} phenotypes" + ) + fig_name = f'{"_".join([trial, name, phenotype_id, content])}.jpg' + fig.savefig( + fig_name, bbox_inches="tight", transparent=True + ) + self.plots.add(fig_name) + + if graph["parsed"]: + continue + ## process and export the non-parsed figures + phenotype_id = graph.get("phenotype", "") + if "phenotype" in graph and not isinstance(graph["phenotype"], str): + phenotype_id = f"{','.join(graph['phenotype'])} phenotypes" + + species_id = "" + if "mets" not in graph and content != "c_": + species_id = ( + graph["species"] + if isinstance(graph["species"], str) + else ",".join(graph["species"]) + ) + if "species" in graph and graph["species"] == self.species_list: + species_id = "all species" + else: + phenotype_id = f"{','.join(graph['species'])} species" + if species_id == "all species" and not phenotype_id: + phenotype_id = ",".join(graph["species"]) + + ax.set_xlabel(x_label) + ax.set_ylabel(y_label) + if "mets" in graph: + ax.set_ylim(mM_threshold) + ax.grid(axis="y") + if len(labels) > 1: + ax.legend() + else: + yscale = "linear" + ax.set_yscale(yscale) + if not publishing: + if not title: + org_content = ( + content + if content not in contents.values() + else list(contents.keys())[ + list(contents.values()).index(content) + ] + ) + this_title = f"{org_content} of {species_id} ({phenotype_id}) in the {trial} trial" + if content == "c_": + this_title = f"{org_content} in the {trial} trial" + ax.set_title(this_title) + else: + ax.set_title(title) + fig_name = ( + f'{"_".join([trial, species_id, phenotype_id, content])}.jpg' + ) + if "mets" in graph: + fig_name = f"{trial}_{','.join(graph['mets'])}_c.jpg" + fig.savefig(fig_name, bbox_inches="tight", transparent=True) + + self.plots.add(fig_name) + + # export the figures with other simulation content + if export_zip_name: + with ZipFile(export_zip_name, "a", compression=ZIP_LZMA) as zp: + for plot in self.plots: + zp.write(plot) + os.remove(plot) + + #################### ENGINEERING PHASE METHODS #################### + + def engineering(self): + if not hasattr(self, "problem"): + self.fit() # TODO - accommodate both fitting a new model and loading an existing model + + # This will capture biomass variables at all times and trials, which seems undesirable + self.problem.objective = Objective( + sum([x for x in self.problem.variables if "bio" in x.name]) + ) + + # Use a community COBRA model and CommKinetics with the fitted kinetic parameters? + + def _add_phenotypes(self): + pass + + def _change_obj(self): + pass + + +class BIOLOGPhitting(CommPhitting): + def __init__( + self, + carbon_conc, + media_conc, + biolog_df, + fluxes_df, + experimental_metadata, + msdb_path, + community_members, + ): + self.biolog_df = biolog_df + self.experimental_metadata = experimental_metadata + self.carbon_conc = carbon_conc + self.media_conc = media_conc or [] + self.fluxes_df = fluxes_df + self.phenotypes = list(self.fluxes_df.columns) + self.phenotypes.extend( + [ + signal_species(signal) + "_stationary" + for signal in self.biolog_df + if ":" in signal + ] + ) + self.community_members = community_members + # import os + from modelseedpy.biochem import from_local + + self.msdb_path = msdb_path + self.msdb = from_local(msdb_path) + + def fitAll( + self, + parameters: dict = None, + rel_final_conc: float = None, + abs_final_conc: dict = None, + graphs: list = None, + data_timesteps: dict = None, + export_zip_name: str = None, + export_parameters: bool = True, + requisite_biomass: dict = None, + figures_zip_name: str = None, + publishing: bool = False, + ): + # simulate each condition + if export_zip_name and os.path.exists(export_zip_name): + os.remove(export_zip_name) + org_rel_final_conc = rel_final_conc + # total_reactions = set(list(chain.from_iterable([model.reactions for model in models_dict.values()]))) + model_abbreviations = ",".join( + [content["name"] for content in self.community_members.values()] + ) + for exp_index, experiment in self.experimental_metadata.iterrows(): + print(f"\n{exp_index} {experiment}") + display(experiment) + pheno = experiment["ModelSEED_ID"] + if not pheno: + print("The BIOLOG condition is not defined.") + continue + for model in self.community_members: + cpd = self.msdb.compounds.get_by_id(pheno) + if "C" not in cpd.elements or not any( + [re.search(pheno, rxn.id) for rxn in model.reactions] + ): + if "valid_condition" not in locals(): + valid_condition = False + continue + exp_list = [pheno] if isinstance(pheno, str) else pheno + self.community_members[model].update( + { + "phenotypes": { + re.sub(r"(-|\s)", "", experiment["condition"]): { + "consumed": exp_list + } + } + } + ) + # determine the requisite biomass for each condition based on which member consumes the compound + valid_condition = True + # proceed if none of the members can utilize the phenotype condition + if not valid_condition: + print( + f"The BIOLOG condition with {experiment['ModelSEED_ID']} is not" + f" absorbed by the {model_abbreviations} model(s)." + ) + continue + print( + f"The {experiment['ModelSEED_ID']} ({cpd.formula}) metabolite of the " + f"{experiment['condition']} condition may feed the {model_abbreviations} model(s)." + ) + if not any( + [experiment["ModelSEED_ID"] in pheno for pheno in self.phenotypes] + ): + print(e) + print( + f"The {experiment['ModelSEED_ID']} ({cpd.formula}) metabolite of the " + f"{experiment['condition']} condition is not a suitable phenotype for " + f"the {model_abbreviations} model(s)." + ) + continue + + # for exp_index, experiment in self.experimental_metadata.iterrows(): + # the model(s) for which the condition is a suitable carbon source must be defined here + # simulate through the kinetics ranges with conditions that can be used by one of members + rel_final_conc = {experiment["ModelSEED_ID"]: org_rel_final_conc} + export_path = os.path.join( + os.getcwd(), "BIOLOG_LPs", f"{exp_index}_{','.join(exp_list)}.lp" + ) + kcat_primal = None + for coef_index, coefs in enumerate(biomass_partition_coefs): + # solve for growth rate constants with the previously solved biomasses + new_simulation = CommPhitting( + self.fluxes_df, + self.carbon_conc, + self.media_conc, + self.msdb_path, + self.biolog_df.loc[exp_index, :], + self.experimental_metadata, + ) + new_simulation.define_problem( + parameters, + exp_list, + rel_final_conc, + set( + list( + chain.from_iterable( + [ + content["excretions"] + for content in self.community_members.values() + ] + ) + ) + ), + abs_final_conc, + data_timesteps, + export_zip_name, + export_parameters, + export_path, + kcat_primal, + coefs, + requisite_biomass, + True, + ) + time1 = process_time() + primals_export_path = ( + primals_export_path or f"BIOLOG_{experiment['ModelSEED_ID']}.json" + ) + try: + new_simulation.compute( + graphs, + export_zip_name, + None, + publishing, + primals_export_path, + True, + ) + except NoFluxError as e: + print(e) + kcat_primal = parse_primals( + new_simulation.values, + coefs=coefs, + kcat_vals=new_simulation.parameters["kcat"], + ) + time2 = process_time() + print( + f"Done simulating with the coefficients for biomass partitions: {coef_index}" + f"\n{(time2 - time1) / 60} minutes" + ) + pprint(kcat_primal) + print("\n\n\n") + return {k: val for k, val in new_simulation.values.items() if "kcat" in k} diff --git a/modelseedpy/community/commscores_old.py b/modelseedpy/community/commscores_old.py new file mode 100644 index 00000000..ed0f2eed --- /dev/null +++ b/modelseedpy/community/commscores_old.py @@ -0,0 +1,1856 @@ +from modelseedpy.core.exceptions import ObjectiveError, ParameterError +from modelseedpy.community.commhelper import build_from_species_models +from modelseedpy.community.mscompatibility import MSCompatibility +from modelseedpy.core.msminimalmedia import MSMinimalMedia +from modelseedpy.community.mscommunity import MSCommunity +from modelseedpy.core.msmodelutl import MSModelUtil +from modelseedpy.core.fbahelper import FBAHelper +from modelseedpy.core.msgapfill import MSGapfill +from itertools import combinations, permutations, chain +from optlang import Variable, Constraint, Objective +from numpy import array, unique, ndarray, where, sort, array_split, nan +from collections import Counter +from deepdiff import DeepDiff # (old, new) +from typing import Iterable, Union +from pprint import pprint +from numpy.random import shuffle +from multiprocess import current_process +from math import inf +import sigfig + +# from icecream import ic +import re + +# from math import prod + +# silence deprecation warnings from DeepDiff parsing the syntrophy +import warnings + +warnings.simplefilter("ignore", category=DeprecationWarning) + +rm_comp = FBAHelper.remove_compartment + + +def _compatibilize(member_models: Iterable, printing=False): + # return member_models + models = MSCompatibility.standardize( + member_models, conflicts_file_name="exchanges_conflicts.json", printing=printing + ) + if not isinstance(member_models, (set, list, tuple)): + return models[0] + return models + + +def _load_models( + member_models: Iterable, com_model=None, compatibilize=True, printing=False +): + # ic(member_models, com_model, compatibilize) + if not com_model and member_models: + model = build_from_species_models(member_models, name="SMETANA_pair") + return member_models, model # (model, names=names, abundances=abundances) + # models = PARSING_FUNCTION(community_model) # TODO the individual models of a community model can be parsed + if compatibilize: + return ( + _compatibilize(member_models, printing), + _compatibilize([com_model], printing)[0], + ) + return member_models, com_model + + +def _get_media( + media=None, + com_model=None, + model_s_=None, + min_growth=None, + environment=None, + interacting=True, + printing=False, + minimization_method="minFlux", + skip_bad_media=False, +): + # ic(media, com_model, model_s_) + if com_model is None and model_s_ is None: + raise TypeError("< com_model > or < model_s_ > must be parameterized.") + if media is not None: + if model_s_ is not None and not isinstance(model_s_, (list, set, tuple)): + return media["members"][model_s_.id]["media"] + elif com_model is not None: + return media["community_media"] + return media + # model_s_ is either a singular model or a list of models + if com_model is not None: + try: + com_media, media_sol = MSMinimalMedia.determine_min_media( + com_model, + minimization_method, + min_growth, + None, + interacting, + 5, + printing, + ) + except Exception as e: + if skip_bad_media: + com_media, media_sol = None, None + else: + print(e) + if model_s_ is not None: + if not isinstance(model_s_, (list, set, tuple, ndarray)): + try: + return MSMinimalMedia.determine_min_media( + model_s_, + minimization_method, + min_growth, + environment, + interacting, + printing, + ) + except Exception as e: + if not skip_bad_media: + print(e) + return None + members_media = {} + for model in model_s_: + try: + members_media[model.id] = { + "media": MSMinimalMedia.determine_min_media( + model, + minimization_method, + min_growth, + environment, + interacting, + printing, + )[0] + } + continue + except Exception as e: + if skip_bad_media: + continue + else: + print(e) + # print(members_media) + if com_model is None: + return members_media + else: + return com_media, media_sol + return {"community_media": com_media, "members": members_media} + + +def _sigfig_check(value, sigfigs, default): + if str(value) in ["inf", "nan"]: + value = "" + if FBAHelper.isnumber(value): + return sigfig.round(value, sigfigs) + else: + return default + + +def nanFilter(value, string=True): + if isinstance(value, str) or value is None: + if string: + return value + else: + return nan + if any([value < 0, value > 1e5]): + return "" if string else nan + return value + + +class CommScores: + def __init__( + self, + member_models, + min_growth=0.1, + n_solutions=100, + environment=None, + abstol=1e-3, + media_dict=None, + printing=True, + raw_content=False, + antismash_json_path: str = None, + antismash_zip_path: str = None, + minimal_media_method="minFlux", + ): + self.min_growth = min_growth + self.abstol = abstol + self.n_solutions = n_solutions + self.printing = printing + self.raw_content = raw_content + self.antismash_json_path = antismash_json_path + self.antismash_zip_path = antismash_zip_path + + # process the models + self.models = _compatibilize(member_models) + self.community = MSModelUtil(build_from_species_models(self.models)) + ## define the environment + if environment: + if hasattr(environment, "get_media_constraints"): + ### standardize modelseed media into COBRApy media + environment = { + "EX_" + exID: -bound[0] + for exID, bound in environment.get_media_constraints().items() + } + self.community.add_medium(environment) + self.environment = environment + ## test growth + for model in self.models: + if model.slim_optimize() == 0: + raise ObjectiveError( + f"The model {model.id} possesses an objective value of 0 in complete media, " + "which is incompatible with minimal media computations and hence SMETANA." + ) + if self.community.model.slim_optimize() == 0: + raise ObjectiveError( + f"The community model {self.community.model.id} possesses an objective " + "value of 0 in complete media, which is incompatible with minimal " + "media computations and hence SMETANA." + ) + ## determine the minimal media for each model, including the community + self.media = ( + media_dict + if media_dict + else MSMinimalMedia.comm_media_est( + member_models, + self.community.model, + minimal_media_method, + min_growth, + self.environment, + True, + n_solutions, + printing, + ) + ) + + def all_scores( + self, + mp_score=True, + kbase_obj=None, + cobrakbase_path: str = None, + kbase_token_path: str = None, + annotated_genomes: dict = None, + ): + mro = self.mro_score() + mip = self.mip_score(interacting_media=self.media) + mp = None if not mp_score else self.mp_score() + mu = None # self.mu_score() + sc = None # self.sc_score() + smetana = None # self.smetana_score() + gyd = self.gyd_score() + fs = ( + self.fs_score() + if any( + [ + kbase_obj is not None, + annotated_genomes != [], + cobrakbase_path is not None and kbase_token_path is not None, + ] + ) + else None + ) + return { + "mro": mro, + "mip": mip, + "mp": mp, + "mu": mu, + "sc": sc, + "smetana": smetana, + "gyd": gyd, + "fs": fs, + } + + def mro_score(self): + self.mro_val = CommScores.mro( + self.models, + self.media["members"], + self.min_growth, + self.media, + self.raw_content, + self.environment, + self.printing, + True, + ) + if not self.printing: + return self.mro_val + if self.raw_content: + for pair, (interaction, media) in self.mro_val.items(): + newcomer, established = pair.split("---") + print( + f"\n(MRO) The {newcomer} media {media} possesses {interaction} shared " + f"requirements with the {established} established member." + ) + return self.mro_val + for pair, mro in self.mro_val.items(): + newcomer, established = pair.split("---") + print( + f"\nThe {newcomer} on {established} MRO score: {mro[0]} ({mro[0]*100:.2f}%). " + f"This is the percent of nutritional requirements in {newcomer} " + f"that overlap with {established} ({mro[1]}/{mro[2]})." + ) + return self.mro_val + + def mip_score( + self, interacting_media: dict = None, noninteracting_media: dict = None + ): + interacting_media = interacting_media or self.media or None + diff, self.mip_val = CommScores.mip( + self.models, + self.community.model, + self.min_growth, + interacting_media, + noninteracting_media, + self.environment, + self.printing, + True, + ) + if not self.printing: + return self.mip_val + print( + f"\nMIP score: {self.mip_val}\t\t\t{self.mip_val} required compound(s) can be sourced via syntrophy:" + ) + if self.raw_content: + pprint(diff) + return self.mip_val + + def gyd_score(self, coculture_growth=False): + self.gyd_val = CommScores.gyd( + self.models, environment=self.environment, coculture_growth=coculture_growth + ) + if not self.printing: + return self.gyd + growth_type = "monocultural" if not coculture_growth else "cocultural" + for pair, score in self.gyd_val.items(): + print( + f"\nGYD score: The {growth_type} growth difference between the {pair} member models" + f" is {score} times greater than the growth of the slower member." + ) + return self.gyd + + def fs_score( + self, + kbase_obj=None, + cobrakbase_path: str = None, + kbase_token_path: str = None, + annotated_genomes: dict = None, + ): + self.fs_val = CommScores.fs( + self.models, kbase_obj, cobrakbase_path, kbase_token_path, annotated_genomes + ) + if not self.printing: + return self.fs + for pair, score in self.fs_val.items(): + print( + f"\nFS Score: The similarity of RAST functional SSO ontology " + f"terms between the {pair} members is {score}." + ) + return self.fs + + def mp_score(self): + print("executing MP") + self.mp_val = CommScores.mp( + self.models, + self.environment, + self.community.model, + None, + self.abstol, + self.printing, + ) + if not self.printing: + return self.mp_val + if self.raw_content: + print( + "\n(MP) The possible contributions of each member in the member media include:\n" + ) + pprint(self.mp_val) + else: + print( + "\nMP score:\t\t\tEach member can possibly contribute the following to the community:\n" + ) + for member, contributions in self.mp_val.items(): + print(member, "\t", len(contributions)) + return self.mp_val + + def mu_score(self): + member_excreta = self.mp_score() if not hasattr(self, "mp_val") else self.mp_val + self.mu_val = CommScores.mu( + self.models, + self.environment, + member_excreta, + self.n_solutions, + self.abstol, + True, + self.printing, + ) + if not self.printing: + return self.mu_val + print( + "\nMU score:\t\t\tThe fraction of solutions in which each member is the " + "syntrophic receiver that contain a respective metabolite:\n" + ) + pprint(self.mu_val) + return self.mu_val + + def sc_score(self): + self.sc_val = CommScores.sc( + self.models, + self.community.model, + self.min_growth, + self.n_solutions, + self.abstol, + True, + self.printing, + ) + if not self.printing: + return self.sc_val + print( + "\nSC score:\t\t\tThe fraction of community members who syntrophically contribute to each species:\n" + ) + pprint(self.sc_val) + return self.sc_val + + def smetana_score(self): + if not hasattr(self, "sc_val"): + self.sc_val = self.sc_score() + sc_coupling = all(array(list(self.sc.values())) is not None) + if not hasattr(self, "mu_val"): + self.mu_val = self.mu_score() + if not hasattr(self, "mp_val"): + self.mp_val = self.mp_score() + + self.smetana = CommScores.smetana( + self.models, + self.community.model, + self.min_growth, + self.n_solutions, + self.abstol, + (self.sc_val, self.mu_val, self.mp_val), + True, + sc_coupling, + self.printing, + ) + if self.printing: + print("\nsmetana score:\n") + pprint(self.smetana) + return self.smetana + + def antiSMASH_scores(self, antismash_json_path=None): + self.antismash = CommScores.antiSMASH( + antismash_json_path or self.antismash_json_path + ) + if not self.printing: + return self.antismash + if self.raw_content: + print( + "\n(antismash) The biosynthetic_areas, BGCs, protein_annotations, clusterBlast, and " + "num_clusterBlast from the provided antiSMASH results:\n" + ) + print( + "The 'areas' that antiSMASH determines produce biosynthetic products:" + ) + pprint(self.antismash[0]) + print("The set of biosynthetic gene clusters:") + pprint(self.antismash[1]) + print("The set of clusterblast protein annotations:") + pprint(self.antismash[2]) + print("Resistance information from clusterblast") + pprint(self.antismash[3]) + print("The number of proteins associated with resistance") + pprint(self.antismash[4]) + return self.antismash + print("\nantiSMASH scores:\n") + print( + "The community exhibited:" + f"- {len(self.antismash[0])}'areas' that antiSMASH determines produce biosynthetic products." + f"- {len(self.antismash[1])} biosynthetic gene clusters." + f"- {len(self.antismash[2])} clusterblast protein annotations." + f"- {len(self.antismash[3])} parcels of resistance information from clusterblast." + f"- {self.antismash[4]} proteins associated with resistance." + ) + return list(map(len, self.antismash[:4])) + [self.antismash[4]] + + ###### STATIC METHODS OF THE SMETANA SCORES, WHICH ARE APPLIED IN THE ABOVE CLASS OBJECT ###### + + @staticmethod + def _check_model(model_util, media, model_str, skip_bad_media): + default_media = model_util.model.medium + if media is not None: + model_util.add_medium(media) + obj_val = model_util.model.slim_optimize() + if obj_val == 0 or not FBAHelper.isnumber(obj_val): + print( + f"The {model_str} model input does not yield an operational model, and will therefore be gapfilled." + ) + # if not skip_bad_media: return MSGapfill.gapfill(model_util.model, media) + model_util.add_medium(default_media) + return model_util.model + + @staticmethod + def _load(model, kbase_obj): + model_str = model + if len(model) == 2: + model = kbase_obj.get_from_ws(*model) + else: + model = kbase_obj.get_from_ws(model) + return model, model_str + + @staticmethod + def _determine_growths(modelUtils): + return [util.model.slim_optimize() for util in modelUtils] + + @staticmethod + def calculate_scores( + pairs, + models_media=None, + environments=None, + annotated_genomes=True, + lazy_load=False, + kbase_obj=None, + cip_score=True, + costless=True, + skip_bad_media=False, + anme_comm=False, + print_progress=False, + ): + from pandas import Series + + if isinstance(pairs, list): + ( + pairs, + models_media, + environments, + annotated_genomes, + lazy_load, + kbase_obj, + ) = pairs + series, mets = [], [] + if not isinstance(environments, (list, tuple)): + environments = [environments] + if isinstance(environments, (list, tuple)) and hasattr(environments[0], "name"): + environments = { + m.name: FBAHelper.convert_kbase_media(m, 1000) for m in environments + } + elif not isinstance(environments, dict): + environments = {f"media{i}": m for i, m in enumerate(environments)} + pid = current_process().name + model_utils = {} + count = 0 + for model1, models in pairs.items(): + if model1.id == "": + model1.id = "model1" + if lazy_load: + model1, model1_str = CommScores._load(model1, kbase_obj) + else: + model1_str = model1.id + if model1.id not in models_media: + models_media[model1.id] = { + "media": _get_media(model_s_=model1, skip_bad_media=skip_bad_media) + } + if models_media[model1.id] is None: + continue + if model1.id not in model_utils: + model_utils[model1.id] = MSModelUtil(model1) + # print(pid, model1) + for model_index, model2 in enumerate(models): + if model2.id == "": + model2.id = "model2" + if lazy_load: + model2, model2_str = CommScores._load(model2, kbase_obj) + else: + model2_str = model2.id + if model2.id not in models_media: + models_media[model2.id] = { + "media": _get_media( + model_s_=model2, skip_bad_media=skip_bad_media + ) + } + if models_media[model2.id] is None: + continue + if model2.id not in model_utils: + model_utils[model2.id] = MSModelUtil(model2) + grouping = [model1, model2] + grouping_utils = [model_utils[model1.id], model_utils[model2.id]] + modelIDs = [model.id for model in grouping] + comm_model = build_from_species_models(grouping) + community = MSCommunity(comm_model, ids=modelIDs) + comm_sol = comm_model.optimize() + print(f"{pid}~~{count}\t{modelIDs}") + for environName, environ in environments.items(): + if print_progress: + print(f"\tEnvironment\t{environName}", end="\t") + if not anme_comm: + model1 = CommScores._check_model( + model_utils[model1.id], environ, model1_str, skip_bad_media + ) + model2 = CommScores._check_model( + model_utils[model2.id], environ, model2_str, skip_bad_media + ) + # initiate the KBase output + report_dic = { + f"model{i+1}": modelID for i, modelID in enumerate(modelIDs) + } + g1, g2, comm = CommScores._determine_growths( + [model_utils[model1.id], model_utils[model2.id], community.util] + ) + g1, g2, comm = ( + _sigfig_check(g1, 5, ""), + _sigfig_check(g2, 5, ""), + _sigfig_check(comm, 5, ""), + ) + report_dic.update( + { + "media": environName, + "model1 growth": g1, + "model2 growth": g2, + "community growth": comm, + } + ) + coculture_growths = { + mem.id: comm_sol.fluxes[mem.primary_biomass.id] + for mem in community.members + } + report_dic.update( + { + f"coculture growth model{modelIDs.index(memID)}": growth + for memID, growth in coculture_growths.items() + } + ) + # define the MRO content + mro_values = CommScores.mro( + grouping, models_media, raw_content=True, environment=environ + ) + report_dic.update( + { + f"MRO_model{modelIDs.index(models_string.split('--')[0])+1}": f"{100*len(intersection)/len(memMedia):.3f}% ({len(intersection)}/{len(memMedia)})" + for models_string, ( + intersection, + memMedia, + ) in mro_values.items() + } + ) + mets.append({"MRO metabolites": list(mro_values.values())[0][0]}) + if print_progress: + print("MRO done", end="\t") + # define the CIP content + if cip_score: + cip_values = CommScores.cip( + modelutils=[model_utils[mem.id] for mem in grouping] + ) + report_dic.update({"CIP": cip_values[1]}) + mets[-1].update({"CIP metabolites": list(cip_values[0])}) + if print_progress: + print("CIP done", end="\t") + # define the MIP content + mip_values = CommScores.mip( + grouping, + comm_model, + 0.1, + None, + None, + environ, + print_progress, + True, + costless, + costless, + skip_bad_media, + ) + # print(mip_values) + if mip_values is not None: + report_dic.update( + { + f"MIP_model{modelIDs.index(models_name)+1}": str( + len(received) + ) + for models_name, received in mip_values[0].items() + } + ) + mets[-1].update( + { + "MIP model1 metabolites": list(mip_values[0].values())[ + 0 + ], + "MIP model2 metabolites": list(mip_values[0].values())[ + 1 + ], + } + ) + if costless: + for models_name, received in mip_values[1].items(): + report_dic[ + f"MIP_model{modelIDs.index(models_name)+1} (costless)" + ] = ( + report_dic[ + f"MIP_model{modelIDs.index(models_name)+1}" + ] + + f" ({len(received)})" + ) + del report_dic[ + f"MIP_model{modelIDs.index(models_name)+1}" + ] + if print_progress: + print("costless_MIP done", end="\t") + else: + report_dic.update( + {f"MIP_model1 (costless)": "", f"MIP_model2 (costless)": ""} + ) + mets[-1].update( + { + "MIP model1 metabolites": [None], + "MIP model2 metabolites": [None], + } + ) + if print_progress: + print("MIP done", end="\t") + # define the BSS content + bss_values = CommScores.bss( + grouping, + grouping_utils, + environments, + models_media, + skip_bad_media, + ) + report_dic.update( + { + f"BSS_model{modelIDs.index(name.split(' supporting ')[0])+1}": f"{_sigfig_check(100*val, 5, '')}%" + for name, (mets, val) in bss_values.items() + } + ) + mets[-1].update( + { + "BSS model1 metabolites": [ + met_set for met_set, val in bss_values.values() + ][0], + "BSS model2 metabolites": [ + met_set for met_set, val in bss_values.values() + ][1], + } + ) + # mets[-1].update({"bss_mets": list(bss_values[0].values())}) + if print_progress: + print("BSS done", end="\t") + # define the PC content + pc_values = CommScores.pc( + grouping, + grouping_utils, + comm_model, + None, + comm_sol, + environ, + True, + community, + ) + report_dic.update( + { + "PC_comm": _sigfig_check(pc_values[0], 5, ""), + "PC_model1": _sigfig_check( + list(pc_values[1].values())[0], 5, "" + ), + "PC_model2": _sigfig_check( + list(pc_values[1].values())[1], 5, "" + ), + "BIT": pc_values[3], + } + ) + if print_progress: + print("PC done\tBIT done", end="\t") + # print([mem.slim_optimize() for mem in grouping]) + # define the GYD content + gyd1, gyd2, g1, g2 = list( + CommScores.gyd( + grouping, + grouping_utils, + environ, + False, + community, + anme_comm, + ).values() + )[0] + report_dic.update( + { + "GYD1": _sigfig_check(gyd1, 5, ""), + "GYD2": _sigfig_check(gyd2, 5, ""), + } + ) + if print_progress: + print("GYD done\t\t", end="\t" if annotated_genomes else "\n") + # define the FS content + if kbase_obj is not None and annotated_genomes and not anme_comm: + fs_values = list( + CommScores.fs( + grouping, kbase_obj, annotated_genomes=annotated_genomes + ).values() + )[0] + print( + len(fs_values[0]) if fs_values[0] is not None else "NaN", + fs_values[1], + ) + report_dic.update({"FS": sigfig.round(fs_values[1], 5)}) + if fs_values is not None: + mets[-1].update({"FS features": fs_values[0]}) + if print_progress: + print("FS done\t\t") + # return a pandas Series, which can be easily aggregated with other results into a DataFrame + series.append(Series(report_dic)) + count += 1 + return series, mets + + @staticmethod + def html_report( + df, mets, export_html_path="commscores_report.html", msdb_path=None + ): + from modelseedpy.core.report import commscores_report + + return commscores_report(df, mets, export_html_path, msdb_path) + + @staticmethod + def report_generation( + all_models: iter = None, # a list of distinct lists is provided for specifying exclusive groups + pairs: dict = None, + mem_media: dict = None, + pair_limit: int = None, + exclude_pairs: list = None, + kbase_obj=None, + annotated_genomes: dict = True, # True triggers internal acquisition of the genomes, where None skips + see_media=True, + environments: iter = None, # a collection of environment dicts or KBase media objects + pool_size: int = None, + cip_score=True, + costless=True, + skip_bad_media=False, + anme_comm=False, + print_progress=False, + ): + from pandas import concat + + if pairs: + model_pairs = unique( + [ + {model1, model2} + for model1, models in pairs.items() + for model2 in models + ] + ) + elif all_models is not None: + if not isinstance(all_models[0], list): + all_models = list(set(all_models)) + model_pairs = array(list(combinations(all_models, 2))) + else: + model_pairs = [] + for models1, models2 in combinations(all_models, 2): + models1 = set(models1) + models2 = set(models2) + if len(models1) > len(models2): + larger_list = models1 + smaller_list = models2 + else: + larger_list = models2 + smaller_list = models1 + model_pairs.append( + [ + list(zip(combin, smaller_list)) + for combin in permutations(larger_list, len(smaller_list)) + ] + ) + # flatten the assembled pairs and filter duplicates + model_pairs = array( + [ + x + for x in set( + tuple(x) + for x in [ + i + for y in list(chain.from_iterable(model_pairs)) + for i in y + ] + ) + ] + ) + all_models = list(chain.from_iterable(all_models)) + if pair_limit is not None: + shuffle(model_pairs) + new_pairs = [] + for index, pair in enumerate(model_pairs): + if set(pair) not in exclude_pairs and index < pair_limit: + new_pairs.append(pair) + elif index >= pair_limit: + break + model_pairs = array(new_pairs) + if isinstance(model_pairs[0], str): + model_pairs = unique(sort(model_pairs, axis=1)) + pairs = { + first: model_pairs[where(model_pairs[:, 0] == first)][:, 1] + for first in model_pairs[:, 0] + } + else: + raise ValueError( + "Either < all_models > or < pairs > must be defined to simulate interactions." + ) + if not all_models: + all_models = list( + chain(*[list(values) for values in pairs.values()]) + ) + list(pairs.keys()) + lazy_load = len(model_pairs) > 10000 # all_models[0], (list,set,tuple)) + if lazy_load and not kbase_obj: + ValueError( + "The < kbase_obj > argument must be provided to lazy load models." + ) + new_models = [] + for index, model in enumerate(all_models): + if model.id == "": + model.id = f"model_index{index}" + new_models.append(model) + all_models = new_models[:] + if not mem_media: + models_media = _get_media( + model_s_=all_models, skip_bad_media=skip_bad_media + ) + else: + models_media = mem_media.copy() + missing_models = set() + missing_modelID = [] + for model in all_models: + if model is not None and model.id not in models_media: + missing_models.add(model) + missing_modelID.append( + model if not hasattr(model, "id") else model.id + ) + if missing_models != set(): + print( + f"Media of the {missing_modelID} models are not defined, and will be calculated separately." + ) + models_media.update( + _get_media(model_s_=missing_models), skip_bad_media=skip_bad_media + ) + if see_media: + print(f"The minimal media of all members:\n{models_media}") + print(f"\nExamining the {len(list(model_pairs))} model pairs") + if pool_size is not None: + from datetime import datetime + from multiprocess import Pool + + print( + f"Loading {int(pool_size)} workers and computing the scores", + datetime.now(), + ) + pool = Pool( + int(pool_size) + ) # .map(calculate_scores, [{k: v} for k,v in pairs.items()]) + args = [ + [ + dict([pair]), + models_media, + environments, + annotated_genomes, + lazy_load, + kbase_obj, + ] + for pair in list(pairs.items()) + ] + output = pool.map(CommScores.calculate_scores, args) + series = chain.from_iterable([ele[0] for ele in output]) + mets = chain.from_iterable([ele[1] for ele in output]) + else: + series, mets = CommScores.calculate_scores( + pairs, + models_media, + environments, + annotated_genomes, + lazy_load, + kbase_obj, + cip_score, + costless, + skip_bad_media, + anme_comm, + print_progress, + ) + return concat(series, axis=1).T, mets + + @staticmethod + def mro( + member_models: Iterable = None, + mem_media: dict = None, + min_growth=0.1, + media_dict=None, + raw_content=False, + environment=None, + skip_bad_media=False, + printing=False, + compatibilized=False, + ): + """Determine the overlap of nutritional requirements (minimal media) between member organisms.""" + # determine the member minimal media if they are not parameterized + if not mem_media: + if not member_models: + raise ParameterError( + "The either member_models or minimal_media parameter must be defined." + ) + member_models = ( + member_models + if compatibilized + else _compatibilize(member_models, printing) + ) + mem_media = _get_media( + media_dict, + None, + member_models, + min_growth, + environment, + printing=printing, + skip_bad_media=skip_bad_media, + ) + if "community_media" in mem_media: + mem_media = mem_media["members"] + # MROs = array(list(map(len, pairs.values()))) / array(list(map(len, mem_media.values()))) + mro_values = {} + for model1, model2 in combinations(member_models, 2): + intersection = set(mem_media[model1.id]["media"].keys()) & set( + mem_media[model2.id]["media"].keys() + ) + inter = [ex.replace("EX_", "").replace("_e0", "") for ex in intersection] + m1_media = mem_media[model1.id]["media"] + m2_media = mem_media[model2.id]["media"] + if raw_content: + mro_values.update( + { + f"{model1.id}---{model2.id})": (inter, m1_media), + f"{model2.id}---{model1.id})": (inter, m2_media), + } + ) + else: + mro_values.update( + { + f"{model1.id}---{model2.id})": 100 + * (len(inter) / len(m1_media), len(inter), len(m1_media)), + f"{model2.id}---{model1.id})": 100 + * (len(inter) / len(m2_media), len(inter), len(m2_media)), + "mets": inter, + } + ) + return mro_values + # return mean(list(map(len, pairs.values()))) / mean(list(map(len, mem_media.values()))) + + @staticmethod + def mip( + member_models: Iterable, + com_model=None, + min_growth=0.1, + interacting_media_dict=None, + noninteracting_media_dict=None, + environment=None, + printing=False, + compatibilized=False, + costless=False, + multi_output=False, + skip_bad_media=False, + ): + """Determine the quantity of nutrients that can be potentially sourced through syntrophy""" + member_models, community = _load_models( + member_models, com_model, not compatibilized, printing=printing + ) + # determine the interacting and non-interacting media for the specified community .util.model + noninteracting_medium, noninteracting_sol = _get_media( + noninteracting_media_dict, + community, + None, + min_growth, + environment, + False, + skip_bad_media=skip_bad_media, + ) + if noninteracting_medium is None: + return None + if "community_media" in noninteracting_medium: + noninteracting_medium = noninteracting_medium["community_media"] + interacting_medium, interacting_sol = _get_media( + interacting_media_dict, + community, + None, + min_growth, + environment, + True, + skip_bad_media=skip_bad_media, + ) + if interacting_medium is None: + return None + if "community_media" in interacting_medium: + interacting_medium = interacting_medium["community_media"] + interact_diff = DeepDiff(noninteracting_medium, interacting_medium) + if "dictionary_item_removed" not in interact_diff: + return None + cross_fed_exIDs = [ + re.sub("(root\['|'\])", "", x) + for x in interact_diff["dictionary_item_removed"] + ] + # Determine each direction of the MIP score interactions + comm_util = MSModelUtil(community) + cross_fed_metIDs = [ + ex.replace("EX_", "").replace("_e0", "") for ex in cross_fed_exIDs + ] + cross_fed_copy = cross_fed_metIDs[:] + directionalMIP = {mem.id: [] for mem in member_models} + for rxn in comm_util.transport_list(): + # print(rxn.reaction, "\t", [met.id for met in rxn.metabolites if "_e0" in met.id]) + metIDs = list( + set([met.id.split("_")[0] for met in rxn.reactants]).intersection( + set([met.id.split("_")[0] for met in rxn.products]) + ) + ) + if len(metIDs) == 1: + metID = metIDs[0] + else: + if "cpd00067" in metIDs: + metIDs.remove("cpd00067") + metID = metIDs[0] + if metID not in cross_fed_metIDs: + continue + rxn_index = FBAHelper.compartment_index(rxn.id.split("_")[-1]) + if rxn_index == 0: + continue + mets = [met for met in rxn.metabolites if met.id == f"{metID}_c{rxn_index}"] + if mets == []: + print(f"The {metID}_c{rxn_index} is missing in {rxn.reaction}.") + continue + rxn_model = member_models[rxn_index - 1] + # comm_trans[metID] = comm_trans.get(f"{metID}_c{rxn_index}", {}) + if ( + rxn.metabolites[mets[0]] > 0 + and interacting_sol.fluxes[rxn.id] > 0 + or rxn.metabolites[mets[0]] < 0 + and interacting_sol.fluxes[rxn.id] < 0 + ): # donor + directionalMIP[rxn_model.id].append(metID) + if metID in cross_fed_copy: + cross_fed_copy.remove(metID) + continue + # if printing: print(f"{mets[0]} in {rxn.id} ({rxn.reaction}) is not assigned a receiving member.") + if cross_fed_copy != [] and printing: + print(f"Missing directions for the {cross_fed_copy} cross-fed metabolites") + outputs = [directionalMIP] + # TODO categorize all of the cross-fed substrates to examine potential associations of specific compounds + if costless: + costless_mets, numExs = CommScores.cip(member_models=member_models) + # print(list(directionalMIP.values()), costless_mets) + costlessDirectionalMIP = { + member_name: set(receive_mets).intersection(costless_mets) + for member_name, receive_mets in directionalMIP.items() + } + if not multi_output: + return costlessDirectionalMIP + outputs.append(costlessDirectionalMIP) + return outputs + + @staticmethod + def cip(modelutils=None, member_models=None): # costless interaction potential + if not modelutils: + modelutils = {MSModelUtil(model) for model in member_models} + costless_mets = set( + chain.from_iterable( + [modelutil.costless_excreta() for modelutil in modelutils] + ) + ) + return costless_mets, len(costless_mets) + + @staticmethod + def contributions(org_possible_contributions, scores, model_util, abstol): + # identify and log excreta from the solution + model_util.add_objective( + sum(ex_rxn.flux_expression for ex_rxn in org_possible_contributions) + ) + sol = model_util.model.optimize() + if sol.status != "optimal": + # exit the while loop by returning the original possible_contributions, + ## hence DeepDiff == {} and the while loop terminates + return scores, org_possible_contributions + # identify and log excreta from the solution + possible_contributions = org_possible_contributions[:] + for ex in org_possible_contributions: + if ex.id in sol.fluxes.keys() and sol.fluxes[ex.id] >= abstol: + possible_contributions.remove(ex) + scores[model_util.model.id].update([met.id for met in ex.metabolites]) + return scores, possible_contributions + + @staticmethod + def mp( + member_models: Iterable, + environment, + com_model=None, + minimal_media=None, + abstol=1e-3, + printing=False, + ): + """Discover the metabolites that each species can contribute to a community""" + community = ( + _compatibilize(com_model) + if com_model + else build_from_species_models(member_models, standardize=True) + ) + community.medium = minimal_media or MSMinimalMedia.minimize_flux(community) + scores = {} + for ( + org_model + ) in ( + member_models + ): # TODO support parsing the individual members through the MSCommunity object + model_util = MSModelUtil(org_model) + model_util.compatibilize(printing=printing) + if environment: + model_util.add_medium(environment) + scores[model_util.model.id] = set() + # determines possible member contributions in the community environment, where the excretion of media compounds is irrelevant + org_possible_contr = [ + ex_rxn + for ex_rxn in model_util.exchange_list() + if (ex_rxn.id not in community.medium and ex_rxn.upper_bound > 0) + ] + # ic(org_possible_contributions, len(model_util.exchange_list()), len(community.medium)) + scores, possible_contr = CommScores.contributions( + org_possible_contr, scores, model_util, abstol + ) + while DeepDiff(org_possible_contr, possible_contr): + print("remaining possible_contributions", len(possible_contr), end="\r") + ## optimize the sum of the remaining exchanges that have not surpassed the abstol + org_possible_contr = possible_contr[:] + scores, possible_contr = CommScores.contributions( + org_possible_contr, scores, model_util, abstol + ) + + ## individually checks the remaining possible contributions + for ex_rxn in possible_contr: + model_util.model.objective = Objective(ex_rxn.flux_expression) + sol = model_util.model.optimize() + if sol.status == "optimal" or sol.objective_value > abstol: + for met in ex_rxn.metabolites: + if met.id in scores[model_util.model.id]: + scores[model_util.model.id].remove(met.id) + print("removing", met.id) + return scores + + @staticmethod + def mu( + member_models: Iterable, + environment=None, + member_excreta=None, + n_solutions=100, + abstol=1e-3, + compatibilized=False, + printing=True, + ): + """the fractional frequency of each received metabolite amongst all possible alternative syntrophic solutions""" + # member_solutions = member_solutions if member_solutions else {model.id: model.optimize() for model in member_models} + scores = {} + member_models = ( + member_models if compatibilized else _compatibilize(member_models, printing) + ) + if member_excreta: + missing_members = [ + model for model in member_models if model.id not in member_excreta + ] + if missing_members: + print( + f"The {','.join(missing_members)} members are missing from the defined " + f"excreta list and will therefore be determined through an additional MP simulation." + ) + member_excreta.update(CommScores.mp(missing_members, environment)) + else: + member_excreta = CommScores.mp( + member_models, environment, None, abstol, printing + ) + for org_model in member_models: + other_excreta = set( + chain.from_iterable( + [ + excreta + for model, excreta in member_excreta.items() + if model != org_model.id + ] + ) + ) + print(f"\n{org_model.id}\tOther Excreta", other_excreta) + model_util = MSModelUtil(org_model, True) + if environment: + model_util.add_medium(environment) + ex_rxns = { + ex_rxn: list(ex_rxn.metabolites)[0] + for ex_rxn in model_util.exchange_list() + } + print(f"\n{org_model.id}\tExtracellular reactions", ex_rxns) + variables = { + ex_rxn.id: Variable( + "___".join([model_util.model.id, ex_rxn.id]), + lb=0, + ub=1, + type="binary", + ) + for ex_rxn in ex_rxns + } + model_util.add_cons_vars(list(variables.values())) + media, solutions = [], [] + sol = model_util.model.optimize() + while sol.status == "optimal" and len(solutions) < n_solutions: + solutions.append(sol) + medium = set( + [ + ex + for ex in ex_rxns + if sol.fluxes[ex.id] < -abstol and ex in other_excreta + ] + ) + model_util.create_constraint( + Constraint( + sum([variables[ex.id] for ex in medium]), + ub=len(medium) - 1, + name=f"iteration_{len(solutions)}", + ) + ) + media.append(medium) + sol = model_util.model.optimize() + counter = Counter(chain(*media)) + scores[model_util.model.id] = { + met.id: counter[ex] / len(media) + for ex, met in ex_rxns.items() + if counter[ex] > 0 + } + return scores + + @staticmethod + def sc( + member_models: Iterable = None, + com_model=None, + min_growth=0.1, + n_solutions=100, + abstol=1e-6, + compatibilized=True, + printing=False, + ): + """Calculate the frequency of interspecies dependency in a community""" + member_models, community = _load_models( + member_models, com_model, not compatibilized, printing=printing + ) + for rxn in com_model.reactions: + rxn.lower_bound = 0 if "bio" in rxn.id else rxn.lower_bound + + # c_{rxn.id}_lb: rxn < 1000*y_{species_id} + # c_{rxn.id}_ub: rxn > -1000*y_{species_id} + variables = {} + constraints = [] + # TODO this can be converted to an MSCommunity object by looping through each index + # leverage CommKinetics + for org_model in member_models: + model_util = MSModelUtil(org_model, True) + variables[model_util.model.id] = Variable( + name=f"y_{model_util.model.id}", lb=0, ub=1, type="binary" + ) + model_util.add_cons_vars([variables[model_util.model.id]]) + for rxn in model_util.model.reactions: + if "bio" not in rxn.id: + # print(rxn.flux_expression) + lb = Constraint( + rxn.flux_expression + 1000 * variables[model_util.model.id], + name="_".join(["c", model_util.model.id, rxn.id, "lb"]), + lb=0, + ) + ub = Constraint( + rxn.flux_expression - 1000 * variables[model_util.model.id], + name="_".join(["c", model_util.model.id, rxn.id, "ub"]), + ub=0, + ) + constraints.extend([lb, ub]) + + # calculate the SCS + scores = {} + for model in member_models: + com_model_util = MSModelUtil(com_model) + com_model_util.add_cons_vars(constraints, sloppy=True) + # model growth is guaranteed while minimizing the growing members of the community + ## SMETANA_Biomass: {biomass_reactions} > {min_growth} + com_model_util.create_constraint( + Constraint( + sum( + rxn.flux_expression + for rxn in model.reactions + if "bio" in rxn.id + ), + name="SMETANA_Biomass", + lb=min_growth, + ) + ) # sloppy = True) + other_members = [other for other in member_models if other.id != model.id] + com_model_util.add_objective( + sum([variables[other.id] for other in other_members]), "min" + ) + previous_constraints, donors_list = [], [] + for i in range(n_solutions): + sol = com_model.optimize() # FIXME The solution is not optimal + if sol.status != "optimal": + scores[model.id] = None + break + donors = [ + o + for o in other_members + if com_model.solver.primal_values[f"y_{o.id}"] > abstol + ] + donors_list.append(donors) + previous_con = f"iteration_{i}" + previous_constraints.append(previous_con) + com_model_util.add_cons_vars( + [ + Constraint( + sum(variables[o.id] for o in donors), + name=previous_con, + ub=len(previous_constraints) - 1, + ) + ], + sloppy=True, + ) + if i != 0: + donors_counter = Counter(chain(*donors_list)) + scores[model.id] = { + o.id: donors_counter[o] / len(donors_list) for o in other_members + } + return scores + + @staticmethod + def gyd( + member_models: Iterable = None, + model_utils: Iterable = None, + environment=None, + coculture_growth=False, + community=None, + anme_comm=False, + ): + gyds = {} + for combination in combinations(model_utils or member_models, 2): + if model_utils is None: + model1_util = MSModelUtil(combination[0], True) + model2_util = MSModelUtil(combination[1], True) + print( + f"{model1_util.model.id} ++ {model2_util.model.id}", + model1_util.model.slim_optimize(), + model2_util.model.slim_optimize(), + ) + if environment and not anme_comm: + model1_util.add_medium(environment) + model2_util.add_medium(environment) + else: + model1_util = combination[0] + model2_util = combination[1] + if not coculture_growth: + G_m1, G_m2 = CommScores._determine_growths([model1_util, model2_util]) + G_m1, G_m2 = G_m1 if FBAHelper.isnumber(str(G_m1)) else 0, ( + G_m2 if FBAHelper.isnumber(str(G_m2)) else 0 + ) + else: + community = community or MSCommunity( + member_models=[model1_util.model, model2_util.model], + ids=[mem.id for mem in member_models], + ) + community.run_fba() + member_growths = community.parse_member_growths() + G_m1, G_m2 = ( + member_growths[model1_util.model.id], + member_growths[model2_util.model.id], + ) + if G_m2 <= 0 or G_m1 <= 0: + gyds[f"{model1_util.model.id} ++ {model2_util.model.id}"] = ( + "", + "", + G_m1, + G_m2, + ) + continue + gyds[f"{model1_util.model.id} ++ {model2_util.model.id}"] = ( + abs(G_m1 - G_m2) / G_m1, + abs(G_m2 - G_m1) / G_m2, + G_m1, + G_m2, + ) + return gyds + + @staticmethod + def pc( + member_models=None, + modelutils=None, + com_model=None, + isolate_growths=None, + comm_sol=None, + environment=None, + comm_effects=True, + community=None, + interaction_threshold=0.1, + compatibilized=False, + ): + assert member_models or modelutils or community, ( + "Members must be defined through either < member_models >" + "or < modelutils > or < community >." + ) + member_models = ( + member_models or [mem.model for mem in modelutils] or community.members + ) + if com_model is None: + member_models, com_model = _load_models( + member_models, None, not compatibilized, printing=False + ) + community = community or MSCommunity(com_model, member_models) + if comm_sol is None: + community.util.add_medium(environment) + comm_sol = community.util.model.optimize() + model_utils = modelutils or [MSModelUtil(mem, True) for mem in member_models] + modelutils = [] + for mem in model_utils: + mem.add_medium(environment) + modelutils.append(mem) + if isolate_growths is None: + isolate_growths = {mem.id: mem.model.slim_optimize() for mem in modelutils} + pc_score = comm_sol.objective_value / sum(list(isolate_growths.values())) + if not comm_effects: + return pc_score + + comm_member_growths = { + mem.id: comm_sol.fluxes[mem.primary_biomass.id] for mem in community.members + } + comm_growth_effect = { + memID: nanFilter(comm_environ / isolate_growths[memID]) + for memID, comm_environ in comm_member_growths.items() + } + growth_diffs = array( + [nanFilter(x, False) for x in list(comm_growth_effect.values())] + ) + th_pos, th_neg = 1 + interaction_threshold, 1 - interaction_threshold + if all(growth_diffs > th_pos): + bit = "mutualism" + elif all(growth_diffs < th_neg): + bit = "competitive" + elif ((th_pos > growth_diffs) & (growth_diffs > th_neg)).all(): + bit = "neutral" + elif all(growth_diffs > th_neg) and any(growth_diffs > th_pos): + bit = "commensalism" + elif all(growth_diffs < th_pos) and any(growth_diffs < th_neg): + bit = "amensalism" + elif any(growth_diffs > th_pos) and any(growth_diffs < th_neg): + bit = "parasitism" + else: + print( + f"The relative growths {comm_growth_effect} from {comm_member_growths} coculture and" + f" {isolate_growths} monoculture are not captured." + ) + bit = "" + return (pc_score, comm_growth_effect, comm_member_growths, bit) + + @staticmethod + def bss( + member_models: Iterable = None, + model_utils: Iterable = None, + environments=None, + minMedia=None, + skip_bad_media=False, + ): + def compute_score(minMedia, environment=None, index=0): + minMedia = minMedia or _get_media( + model_s_=[modelUtil.model for modelUtil in model_utils], + environment=environment, + skip_bad_media=skip_bad_media, + ) + model1_media = set( + [ + re.sub(r"(\_\w\d+$)", "", rxnID.replace("EX_", "")) + for rxnID in minMedia[model1_util.id]["media"].keys() + ] + ) + model2_media = set( + [ + re.sub(r"(\_\w\d+$)", "", rxnID.replace("EX_", "")) + for rxnID in minMedia[model2_util.id]["media"].keys() + ] + ) + model1_internal = { + rm_comp(met.id) + for rxn in model1_util.internal_list() + for met in rxn.products + } + model2_internal = { + rm_comp(met.id) + for rxn in model2_util.internal_list() + for met in rxn.products + } + bss_scores[ + f"{model1_util.id} supporting {model2_util.id} in media{index}" + ] = ( + model1_internal, + len(model2_media.intersection(model1_internal)) / len(model2_media), + ) + bss_scores[ + f"{model2_util.id} supporting {model1_util.id} in media{index}" + ] = ( + model2_internal, + len(model1_media.intersection(model2_internal)) / len(model1_media), + ) + + bss_scores = {} + for combination in combinations(model_utils or member_models, 2): + if model_utils is None: + model1_util = MSModelUtil(combination[0], True) + model2_util = MSModelUtil(combination[1], True) + model_utils = [model1_util, model2_util] + else: + model1_util = combination[0] + model2_util = combination[1] + if environments: + for index, environment in enumerate(environments): + compute_score(minMedia, environment, index) + else: + compute_score(minMedia) + return bss_scores + + @staticmethod + def mqs(): + pass + + @staticmethod + def _calculate_jaccard_score(set1, set2): + if set1 == set2: + print(f"The sets are identical, with a length of {len(set1)}.") + if len(set1.union(set2)) == 0: + return (None, None) + return ( + set1.intersection(set2), + len(set1.intersection(set2)) / len(set1.union(set2)), + ) + + @staticmethod + def get_all_genomes_from_ws( + ws_id, + kbase_object=None, + cobrakbase_repo_path: str = None, + kbase_token_path: str = None, + ): + def get_genome(genome_name): + return kbase_object.ws_client.get_objects2( + {"objects": [{"ref": f"{ws_id}/{genome_name}"}]} + )["data"][0]["data"] + + # load the kbase client instance + if not kbase_object: + import os + + os.environ["HOME"] = cobrakbase_repo_path + import cobrakbase + + with open(kbase_token_path) as token_file: + kbase_object = cobrakbase.KBaseAPI(token_file.readline()) + + # calculate the complementarity + genome_list = kbase_object.ws_client.list_objects( + { + "ids": [ws_id], + "type": "KBaseGenomes.Genome", + "minObjectID": 0, + "maxObjectID": 10000, + } + ) + genome_names = [g[1] for g in genome_list if g[1].endswith("RAST")] + return { + genome_name: set( + [ + sso + for j in get_genome(genome_name)["cdss"] + for sso in j["ontology_terms"]["SSO"].keys() + ] + ) + for genome_name in genome_names + } + + @staticmethod + def fs( + models: Iterable = None, + kbase_object=None, + cobrakbase_repo_path: str = None, + kbase_token_path: str = None, + annotated_genomes: dict = None, + printing=False, + ): + if not isinstance(annotated_genomes, dict): + if not kbase_object: + import os + + os.environ["HOME"] = cobrakbase_repo_path + import cobrakbase + + with open(kbase_token_path) as token_file: + kbase_object = cobrakbase.KBaseAPI(token_file.readline()) + annotated_genomes = { + model.id: kbase_object.get_from_ws(model.genome_ref) + for model in models + if hasattr(model, "genome_ref") + } + elif isinstance(annotated_genomes, list): + annotated_genomes = dict( + zip([model.id for model in models], annotated_genomes) + ) + elif models is not None: + annotated_genomes = { + k: v + for k, v in annotated_genomes.items() + if k in [model.id for model in models] + } + genome_combinations = list(combinations(annotated_genomes.keys(), 2)) + if printing: + print( + f"The Functionality Score (FS) will be calculated for {len(genome_combinations)} pairs." + ) + if not isinstance(list(annotated_genomes.values())[0], dict): + genome1_set, genome2_set = set(), set() + distances = {} + for genome1, genome2 in genome_combinations: + for j in annotated_genomes[genome1].features: + for key, val in j.ontology_terms.items(): + if key == "SSO": + genome1_set.update(val) + for j in annotated_genomes[genome2].features: + for key, val in j.ontology_terms.items(): + if key == "SSO": + genome2_set.update(val) + distances[f"{genome1} ++ {genome2}"] = ( + CommScores._calculate_jaccard_score(genome1_set, genome2_set) + ) + else: + distances = { + f"{genome1} ++ {genome2}": CommScores._calculate_jaccard_score( + set( + list(content["SSO"].keys())[0] + for dic in annotated_genomes[genome1]["cdss"] + for x, content in dic.items() + if x == "ontology_terms" and len(content["SSO"].keys()) > 0 + ), + set( + list(content["SSO"].keys())[0] + for dic in annotated_genomes[genome2]["cdss"] + for x, content in dic.items() + if x == "ontology_terms" and len(content["SSO"].keys()) > 0 + ), + ) + for genome1, genome2 in combinations(annotated_genomes.keys(), 2) + } + return distances + + @staticmethod + def smetana( + member_models: Iterable, + environment, + com_model=None, + min_growth=0.1, + n_solutions=100, + abstol=1e-6, + prior_values=None, + compatibilized=False, + sc_coupling=False, + printing=False, + ): + """Quantifies the extent of syntrophy as the sum of all exchanges in a given nutritional environment""" + member_models, community = _load_models( + member_models, com_model, compatibilized == False, printing=printing + ) + sc = None + if not prior_values: + mp = CommScores.mp(member_models, environment, com_model, abstol) + mu = CommScores.mu( + member_models, environment, mp, n_solutions, abstol, compatibilized + ) + if sc_coupling: + sc = CommScores.sc( + member_models, + com_model, + min_growth, + n_solutions, + abstol, + compatibilized, + ) + elif len(prior_values) == 3: + sc, mu, mp = prior_values + else: + mu, mp = prior_values + + smetana_scores = {} + for pairs in combinations(member_models, 2): + for model1, model2 in permutations(pairs): + if model1.id not in smetana_scores: + smetana_scores[model1.id] = {} + if not any([not mu[model1.id], not mp[model1.id]]): + sc_score = 1 if not sc_coupling else sc[model1.id][model2.id] + models_mets = list(model1.metabolites) + list(model2.metabolites) + unique_mets = set([met.id for met in models_mets]) + smetana_scores[model1.id][model2.id] = 0 + for met in models_mets: + if met.id in unique_mets: + mp_score = 0 if met.id not in mp[model1.id] else 1 + smetana_scores[model1.id][model2.id] += ( + mu[model1.id].get(met.id, 0) * sc_score * mp_score + ) + return smetana_scores + + @staticmethod + def antiSMASH(json_path=None, zip_path=None): + # TODO Scores 2, 4, and 5 are being explored for relevance to community formation and reveal specific member interactions/targets + # load the antiSMASH report from either the JSON or the raw ZIP, or both + from os import mkdir, listdir, path + from zipfile import ZipFile + from json import load + + if json_path: + cwd_files = listdir() + if json_path not in cwd_files and zip_path: + with ZipFile(zip_path, "r") as zip_file: + zip_file.extract(json_path) + with open(json_path, "r") as json_file: + data = load(json_file) + elif zip_path: + mkdir("extracted_antiSMASH") + with ZipFile(zip_path, "r") as zip_file: + zip_file.extractall("extracted_antiSMASH") + json_files = [ + x for x in listdir("extracted_antiSMASH") if x.endswith("json") + ] + if len(json_files) > 1: + print( + f"The antiSMASH report describes {len(json_files)} JSON files, the first of which is selected " + f"{json_files[0]} for analysis, otherwise explicitly identify the desired JSON file in the json_path parameter." + ) + with open( + path.join("extracted_antiSMASH", json_files[0]), "r" + ) as json_file: + data = load(json_file) + else: + raise ParameterError( + "Either the json_path or zip_path from the antiSMASH analysis must be provided," + " for these scores to be determined." + ) + # Parse data and scores from the antiSMASH report + biosynthetic_areas = data["records"][0]["areas"] + BGCs = set( + array( + [ + data["records"][0]["areas"][i]["products"] + for i in range(biosynthetic_areas) + ] + ).flatten() + ) + len_proteins = len( + data["records"][0]["modules"]["antismash.modules.clusterblast"][ + "knowncluster" + ]["proteins"] + ) + protein_annotations = [ + data["records"][0]["modules"]["antismash.modules.clusterblast"][ + "knowncluster" + ]["proteins"][i]["annotations"] + for i in range(len_proteins) + ] + clusterBlast = [s for s in protein_annotations if "resistance" in s] + num_clusterBlast = sum( + [item.count("resistance") for item in protein_annotations] + ) + + return ( + biosynthetic_areas, + BGCs, + protein_annotations, + clusterBlast, + num_clusterBlast, + ) diff --git a/modelseedpy/community/commscores_template.html b/modelseedpy/community/commscores_template.html new file mode 100644 index 00000000..b379568a --- /dev/null +++ b/modelseedpy/community/commscores_template.html @@ -0,0 +1,157 @@ + + + + + + CommScores Results + + + + + + + + + + + + + + + +

    CommScores Results

    + + + + \ No newline at end of file diff --git a/modelseedpy/community/datastandardization.py b/modelseedpy/community/datastandardization.py new file mode 100644 index 00000000..15dd6f15 --- /dev/null +++ b/modelseedpy/community/datastandardization.py @@ -0,0 +1,1194 @@ +# -*- coding: utf-8 -*- +""" +Created on Mon Aug 1 11:44:07 2022 + +@author: Andrew Freiburger +""" +from modelseedpy.community.commhelper import phenotypes +from modelseedpy.core.exceptions import ParameterError +from modelseedpy.core.optlanghelper import isIterable +from modelseedpy.core.fbahelper import FBAHelper +from optlang import Constraint +from optlang.symbolics import Zero +from scipy.constants import hour +from zipfile import ZipFile, ZIP_LZMA +from itertools import chain +from typing import Union, Iterable +from copy import deepcopy +from icecream import ic + +# from cplex import Cplex +import logging, json, os, re +from pandas import read_csv, DataFrame, ExcelFile +import numpy as np + + +import logging + +logger = logging.getLogger(__name__) + + +def isnumber(string): + try: + float(string) + except: + return False + return True + + +def _findDate(string, numerical=False): + monthNames = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ] + monthNums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] + days = list(range(31, 0, -1)) # [f"{num}-" for num in list(range(31,0,-1))] + years = list(range(2010, 2025)) + list( + range(10, 25) + ) # [f"-{num}" for num in list(range(2000, 2100))] + americanDates = [ + f"{mon}-{day}-{year}" for mon in monthNums for day in days for year in years + ] + + for date in americanDates: + if re.search(date, string): + month, day, year = date.split("-") + if numerical: + return "-".join([day, month, year]) + return f"{monthNames[int(month)-1][:3]} {day}, {year}" + # # determine the month + # for monName in monthNames: + # if re.search(monName, string): + # month = monName + # break + # if not month: + # for monNum in monthNums: + # if re.search(monNum, string): + # month = monNum # maybe should be converted to the Name for standardization + # # determine the day + # for dayNum in days: + # if re.search(dayNum, string): + # day = dayNum + # break + # # determine the year + # for yearNum in years: + # if re.search(yearNum, string): + # year = yearNum + # break + # return day+month+year + + +def dict_keys_exists(dic, *keys): + if keys[0] in dic: + remainingKeys = keys[1:] + if len(remainingKeys) > 0: + dict_keys_exists(dic[keys[0]], keys[1:]) + return True + return False + + +def find_dic_number(dic): + for k, v in dic.items(): + if isnumber(v): + return v + num = find_dic_number(dic[k]) + return num + + +def default_dict_values(dic, key, default): + return default if not key in dic else dic[key] + + +def trial_contents(short_code, indices_tup, values): + matches = [ele == short_code for ele in indices_tup] + return np.array(values)[matches] + + +def _spreadsheet_extension_load(path): + if ".csv" in path: + return read_csv(path) + elif ".xls" in path: + return ExcelFile(path) + + +def _spreadsheet_extension_parse(path, raw_data, org_sheet): + if ".csv" in path: + return raw_data + elif ".xls" in path: + return raw_data.parse(org_sheet) + + +def _met_id_parser(met): + met_id = re.sub("(\_\w\d+)", "", met) + met_id = met_id.replace("EX_", "", 1) + met_id = met_id.replace("c_", "", 1) + return met_id + + +def _column_reduction(org_df): + dataframe = org_df.copy() # this prevents an irrelevant warning from pandas + dataframe.columns = map(str, dataframe.columns) + dataframe.index = dataframe["Well"] + dataframe.drop("Well", axis=1, inplace=True) + for col in dataframe.columns: + if any([x in col for x in ["Plate", "Well", "Cycle"]]): + dataframe.drop(col, axis=1, inplace=True) + dataframe.columns = list(map(int, list(map(float, dataframe.columns)))) + return dataframe + + +def _remove_trials(org_df, ignore_trials, signal, name, significant_deviation): + # refine the ignore_trials parameter + if isinstance(ignore_trials, dict): + ignore_trials["columns"] = ( + list(map(str, ignore_trials["columns"])) + if "columns" in ignore_trials + else [] + ) + ignore_trials["rows"] = ( + list(map(str, ignore_trials["rows"])) if "rows" in ignore_trials else [] + ) + ignore_trials["wells"] = ( + ignore_trials["wells"] if "wells" in ignore_trials else [] + ) + elif isIterable(ignore_trials): + if ignore_trials[0][0].isalpha() and isnumber(ignore_trials[0][1:]): + short_code = True # TODO - drop trials with respect to the short codes, and not the full codes + + dataframe = org_df.copy() # this prevents an irrelevant warning from pandas + dropped_trials = [] + for trial in dataframe.index: + if ( + isinstance(ignore_trials, dict) + and any( + [ + trial[0] in ignore_trials["rows"], + trial[1:] in ignore_trials["columns"], + trial in ignore_trials["wells"], + ] + ) + or isIterable(ignore_trials) + and trial in ignore_trials + ): + dataframe.drop(trial, axis=0, inplace=True) + dropped_trials.append(trial) + elif isIterable(ignore_trials) and trial in ignore_trials: + dataframe.drop(trial, axis=0, inplace=True) + dropped_trials.append(trial) + removed_trials = [] + if "OD" not in signal: + for trial, row in dataframe.iterrows(): + row_array = np.array(row.to_list()) + ## remove trials for which the biomass growth did not change by the determined minimum deviation + if row_array[-1] / row_array[0] < significant_deviation: + dataframe.drop(trial, axis=0, inplace=True) + removed_trials.append(trial) + if removed_trials: + print( + f"The {removed_trials} trials were removed from the {name} measurements, " + f"with their deviation over time being less than the threshold of {significant_deviation}." + ) + if dropped_trials: + print( + f"The {dropped_trials} trials were dropped from the {name} measurements " + "per the ignore_trials parameter." + ) + return dataframe, dropped_trials + removed_trials + + +def _check_plateau(org_df, signal, name, significant_deviation, timesteps_len): + significant_deviation = max([2, significant_deviation]) + dataframe = org_df.copy() # this prevents an irrelevant warning from pandas + dropped = [] + for trial, row in dataframe.iterrows(): + row_array = np.array(row.to_list()) + values = [] + tracking = False + ## remove trials for which the biomass growth did not change by the determined minimum deviation + for index, val in enumerate(row_array): + if val / row_array[0] >= significant_deviation or tracking: + tracking = True + values.append(val) + if len(values) > timesteps_len: + del values[0] + remaining_values = list(dataframe.columns[index - timesteps_len + 1 :]) + if all( + [ + len(values) == timesteps_len, + values[-1] <= values[0], + remaining_values[0] <= remaining_values[-1] * 1.1, + ] + ): + # the entire plateau, minus the first point of plateau, are removed + dropped = remaining_values + break + if dropped: + break + if dropped: + content = f"{name} {signal}" if name != signal else signal + print( + f"The {dropped} timesteps (with {row_array[index-len(values)+1:]} values) were removed " + f"from the {content} data since the OD plateaued and is no longer valid." + ) + return dropped + + +def _remove_timesteps(org_df, ignore_timesteps, name, signal): + dataframe = org_df.copy() # this prevents an irrelevant warning from pandas + if ignore_timesteps: + dropped = [] + for col in dataframe: + if col in ignore_timesteps: + dataframe.drop(col, axis=1, inplace=True) + dropped.append(col) + if dropped == ignore_timesteps: + print( + f"The ignore_timesteps columns were dropped for the {name} {signal} data." + ) + else: + raise ParameterError( + f"The ignore_timesteps values {ignore_timesteps} " + f"were unsuccessfully dropped for the {name} {signal} data." + ) + return dataframe, ignore_timesteps + + +def _df_construction( + name, + df_name, + ignore_trials, + ignore_timesteps, + significant_deviation, + dataframe, + row_num, + buffer_col1=True, +): + # refine the DataFrames + time_df = _column_reduction(dataframe.iloc[0::2]) + values_df = _column_reduction(dataframe.iloc[1::2]) + # display(name, time_df, values_df) + + # remove specified data trials + if ignore_trials: + values_df, removed_trials = _remove_trials( + values_df, ignore_trials, df_name, name, significant_deviation + ) + for row in removed_trials: + time_df.drop(row, axis=0, inplace=True) + + # remove specified data timesteps + if ignore_timesteps: + values_df, removed_timesteps = _remove_timesteps( + values_df, ignore_timesteps, name, df_name + ) + for col in list(map(int, removed_timesteps)): + time_df.drop(col, axis=1, inplace=True) + + # remove undefined trials + if buffer_col1: + possible_rows = [chr(ord("A") + row) for row in range(1, row_num + 1)] + for trial_code in values_df.index: + if trial_code[0] not in possible_rows: + values_df.drop(trial_code, axis=0, inplace=True) + time_df.drop(trial_code, axis=0, inplace=True) + + # process the data for subsequent operations and optimal efficiency + values_df.astype(str) + time_df.astype(str) + return time_df, values_df + + +def _find_culture(string): + matches = re.findall(r"([A-Z]{2}\+?[A-Z]*)", string) + return [m for m in matches if not any([x in m for x in ["BIOLOG", "III"]])] + + +def reverse_strip_comp(ID): + return ID.replace("~", "-") + + +def _process_csv(self, csv_path, index_col): + self.zipped_output.append(csv_path) + csv = read_csv(csv_path) + csv.index = csv[index_col] + csv.drop(index_col, axis=1, inplace=True) + csv.astype(str) + return csv + + +def add_rel_flux_cons(model, ex, phenoRXN, carbon_ratio, rel_flux=0.2): + # {ex.id}_uptakeLimit: {net_{carbonous_ex}} >= {net_{carbon_source}}*{rel_flux}*{carbon_ratio} + # The negative flux sign of influxes specifies that the carbon_source value must be lesser than the other + # carbon influx that is being constrained. + cons = Constraint(Zero, lb=0, ub=None, name=f"{ex.id}_uptakeLimit") + model.add_cons_vars(cons) + cons.set_linear_coefficients( + { + ex.forward_variable: 1, + ex.reverse_variable: -1, + phenoRXN.forward_variable: -rel_flux * carbon_ratio, + phenoRXN.reverse_variable: rel_flux * carbon_ratio, + } + ) + return model, cons + + +class GrowthData: + + @staticmethod + def process( + community_members: dict, + base_media=None, + solver: str = "glpk", + all_phenotypes=True, + data_paths: dict = None, + species_abundances: str = None, + carbon_conc_series: dict = None, + ignore_trials: Union[dict, list] = None, + ignore_timesteps: list = None, + species_identities_rows=None, + significant_deviation: float = 2, + extract_zip_path: str = None, + determine_requisite_biomass=False, + ): # , msdb_path:str=None): + # define the number of rows in the experimental data + row_num = len(species_identities_rows) + if "rows" in carbon_conc_series and carbon_conc_series["rows"]: + row_num = len(list(carbon_conc_series["rows"].values())[0]) + # load and parse data and metadata + ( + media_conc, + data_timestep_hr, + simulation_time, + dataframes, + trials, + fluxes_df, + ) = GrowthData.load_data( + base_media, + community_members, + solver, + data_paths, + ignore_trials, + all_phenotypes, + ignore_timesteps, + significant_deviation, + row_num, + extract_zip_path, + ) + experimental_metadata, standardized_carbon_conc, trial_name_conversion = ( + GrowthData.metadata( + base_media, + community_members, + species_abundances, + carbon_conc_series, + species_identities_rows, + row_num, + _findDate(data_paths["path"]), + ) + ) + data_df = GrowthData.data_process(dataframes, trial_name_conversion) + requisite_biomass = ( + {} + if not determine_requisite_biomass + else GrowthData.biomass_growth( + carbon_conc_series, + fluxes_df, + data_df.index.unique(), + trial_name_conversion, + data_paths, + community_members if all_phenotypes else None, + ) + ) + return ( + experimental_metadata, + data_df, + fluxes_df, + standardized_carbon_conc, + requisite_biomass, + trial_name_conversion, + np.mean(data_timestep_hr), + simulation_time, + media_conc, + ) + + @staticmethod + def load_data( + base_media, + community_members, + solver, + data_paths, + ignore_trials, + all_phenotypes, + ignore_timesteps, + significant_deviation, + row_num, + extract_zip_path, + min_timesteps=False, + ): + # define default values + significant_deviation = significant_deviation or 0 + data_paths = data_paths or {} + ignore_timesteps = ignore_timesteps or "0:0" + start, end = ignore_timesteps.split(":") + raw_data = _spreadsheet_extension_load(data_paths["path"]) + for org_sheet, name in data_paths.items(): + if org_sheet == "path": + continue + df = _spreadsheet_extension_parse(data_paths["path"], raw_data, org_sheet) + df.columns = df.iloc[6] + df.drop(df.index[:7], inplace=True) + ## acquire the default start and end indices of ignore_timesteps + start = int(start or df.columns[0]) + end = int(end or df.columns[-1]) + break + ignore_timesteps = list(range(start, end + 1)) if start != end else None + if extract_zip_path: + with ZipFile(extract_zip_path, "r") as zp: + zp.extractall() + + # define only species for which data is defined + fluxes_df, comm_members = phenotypes( + community_members, all_phenotypes, solver=solver + ) + modeled_species = list( + v for v in data_paths.values() if ("OD" not in v and " " not in v) + ) + removed_phenotypes = [ + col + for col in fluxes_df + if not any([species in col for species in modeled_species]) + ] + fluxes_df.drop(removed_phenotypes, axis=1, inplace=True) + if removed_phenotypes: + print( + f"The {removed_phenotypes} phenotypes were removed " + f"since their species is not among those with data: {modeled_species}." + ) + + # determine the time range in which all datasets are significant + data_timestep_hr = [] + dataframes = {} + max_timestep_cols = [] + if min_timesteps: + for org_sheet, name in data_paths.items(): + if org_sheet == "path" or "OD" in sheet: + continue + ## define the DataFrame + sheet = org_sheet.replace(" ", "_") + df_name = f"{name}:{sheet}" + dataframes[df_name] = _spreadsheet_extension_parse( + data_paths["path"], raw_data, org_sheet + ) + dataframes[df_name].columns = dataframes[df_name].iloc[6] + dataframes[df_name].drop(dataframes[df_name].index[:7], inplace=True) + ## parse the timesteps from the DataFrame + drop_timestep_range = GrowthData._min_significant_timesteps( + dataframes[df_name], + ignore_timesteps, + significant_deviation, + ignore_trials, + df_name, + name, + ) + max_timestep_cols.append(drop_timestep_range) + ## timesteps that must be dropped for the most restrictive dataset is acquired + max_cols = max(list(map(len, max_timestep_cols))) + for ignore_timesteps in max_timestep_cols: + if len(ignore_timesteps) == max_cols: + break + + # remove trials for which the OD has plateaued + # TODO - this somehow seems to break when the requisite_biomass is ignored + for org_sheet, name in data_paths.items(): + if "OD" not in name: + continue + ## load the OD DataFrame + sheet = org_sheet.replace(" ", "_") + df_name = f"{name}:{sheet}" + dataframes[df_name] = _spreadsheet_extension_parse( + data_paths["path"], raw_data, org_sheet + ) + dataframes[df_name].columns = dataframes[df_name].iloc[6] + dataframes[df_name].drop(dataframes[df_name].index[:7], inplace=True) + ## process the OD DataFrame + data_times_df, data_values_df = _df_construction( + name, + df_name, + ignore_trials, + ignore_timesteps, + significant_deviation, + dataframes[df_name], + row_num, + ) + plateaued_times = _check_plateau( + data_values_df, name, name, significant_deviation, 3 + ) + ## define and store the final DataFrames + for col in plateaued_times: + if col in data_times_df.columns: + data_times_df.drop(col, axis=1, inplace=True) + if col in data_values_df.columns: + data_values_df.drop(col, axis=1, inplace=True) + dataframes[df_name] = (data_times_df, data_values_df) + break + + # refine the non-OD signals + for org_sheet, name in data_paths.items(): + if org_sheet == "path" or "OD" in name: + continue + sheet = org_sheet.replace(" ", "_") + df_name = f"{name}:{sheet}" + if df_name not in dataframes: + dataframes[df_name] = _spreadsheet_extension_parse( + data_paths["path"], raw_data, org_sheet + ) + dataframes[df_name].columns = dataframes[df_name].iloc[6] + dataframes[df_name].drop(dataframes[df_name].index[:7], inplace=True) + # parse the DataFrame for values + simulation_time = dataframes[df_name].iloc[0, -1] / hour + data_timestep_hr.append( + simulation_time / int(dataframes[df_name].columns[-1]) + ) + # define the times and data + data_times_df, data_values_df = _df_construction( + name, + df_name, + ignore_trials, + ignore_timesteps, + significant_deviation, + dataframes[df_name], + row_num, + ) + # display(data_times_df) ; display(data_values_df) + for col in plateaued_times: + if col in data_times_df.columns: + data_times_df.drop(col, axis=1, inplace=True) + if col in data_values_df.columns: + data_values_df.drop(col, axis=1, inplace=True) + dataframes[df_name] = (data_times_df, data_values_df) + + # differentiate the phenotypes for each species + trials = set( + chain.from_iterable( + [list(times.index) for times, values in dataframes.values()] + ) + ) + media_conc = ( + {} + if not base_media + else {cpd.id: cpd.concentration for cpd in base_media.mediacompounds} + ) + return ( + media_conc, + data_timestep_hr, + simulation_time, + dataframes, + trials, + fluxes_df, + ) + + @staticmethod + def _min_significant_timesteps( + full_df, ignore_timesteps, significant_deviation, ignore_trials, df_name, name + ): + # refine the DataFrames + values_df = _column_reduction(full_df.iloc[1::2]) + values_df, removed_trials = _remove_trials( + values_df, ignore_trials, df_name, name, significant_deviation + ) + timestep_range = list(set(list(values_df.columns)) - set(ignore_timesteps)) + start, end = ignore_timesteps[0], ignore_timesteps[-1] + start_index = list(values_df.columns).index(start) + end_index = list(values_df.columns).index(end) + ## adjust the customized range such that the threshold is reached. + for trial, row in values_df.iterrows(): + row_array = np.delete( + np.array(row.to_list()), list(range(start_index, end_index + 1)) + ) + ## remove trials for which the biomass growth did not change by the determined minimum deviation + while all( + [ + row_array[-1] / row_array[0] < significant_deviation, + end <= values_df.columns[-1], + start >= values_df.columns[0], + ] + ): + # print(timestep_range[0], values_df.columns[0], values_df.columns[-1], end, start) + if ( + timestep_range[0] == values_df.columns[0] + and start != values_df.columns[-1] + ): + timestep_range.append(timestep_range[-1] + 1) + start += 1 + print( + f"The end boundary for {name} is increased to {timestep_range[-1]}", + end="\r", + ) + elif ( + timestep_range[-1] == values_df.columns[-1] + and end != values_df.columns[0] + ): + timestep_range.append(timestep_range[0] - 1) + end -= 1 + print( + f"The start boundary for {name} is decreased to {timestep_range[0]}", + end="\r", + ) + else: + raise ParameterError( + f"All of the timesteps were omitted for {name}." + ) + row_array = np.delete( + np.array(row.to_list()), + list( + range( + list(values_df.columns).index(start), + list(values_df.columns).index(end) + 1, + ) + ), + ) + print("\n") + return list(range(start, end + 1)) + + @staticmethod + def metadata( + base_media, + community_members, + species_abundances, + carbon_conc, + species_identities_rows, + row_num, + date, + ): + # define carbon concentrations for each trial + carbon_conc = carbon_conc or {} + carbon_conc["columns"] = default_dict_values(carbon_conc, "columns", {}) + carbon_conc["rows"] = default_dict_values(carbon_conc, "rows", {}) + column_num = len(species_abundances) + + # define the metadata DataFrame and a few columns + constructed_experiments = DataFrame( + index=[f"G{x+1}" for x in list(range(column_num * row_num))] + ) + constructed_experiments.index.name = "short_code" + base_media_path = ( + "minimal components media" if not base_media else base_media.path[0] + ) + constructed_experiments["base_media"] = [base_media_path] * ( + column_num * row_num + ) + + # define community content + # species_mets = {mem["name"]: np.array([mets["consumed"] for mets in mem["phenotypes"].values()]).flatten() + # for mem in community_members.values()} + # define the strains column + strains, additional_compounds, experiment_ids = [], [], [] + trial_name_conversion = {} + count = 1 + ## apply universal values to all trials + base_row_conc = ( + [] + if "*" not in carbon_conc + else [ + ":".join( + [met, str(carbon_conc["*"][met][0]), str(carbon_conc["*"][met][1])] + ) + for met in carbon_conc["*"] + ] + ) + members = list(mem["name"] for mem in community_members.values()) + for row in range(1, row_num + 1): + row_conc = base_row_conc[:] + trial_letter = chr(ord("A") + row) + trial_name_conversion[trial_letter] = {} + ## add rows where the initial concentration in the first trial is non-zero + for met, conc_dict in carbon_conc["rows"].items(): + if conc_dict[sorted(list(conc_dict.keys()))[row - 1]] > 0: + row_conc.append( + ":".join( + [ + met, + str(conc_dict[sorted(list(conc_dict.keys()))[row - 1]]), + str( + conc_dict[ + sorted(list(conc_dict.keys()), reverse=True)[ + -row + ] + ] + ), + ] + ) + ) + + row_concentration = ";".join(row_conc) + composition = {} + for col in range(1, column_num + 1): + ## construct the columns of information + additional_compounds.append(row_concentration) + experiment_id = [] + for member in members: + ### define the relative community abundances + composition[member] = [ + member, + f"r{species_abundances[col][member]}", + ] + ### define the member strain, where it is appropriate + if member in species_identities_rows[row]: + composition[member][ + 0 + ] += f"_{species_identities_rows[row][member]}" + ### the experimental ID is abundance+memberID + if int(composition[member][1][1:]) != 0: + experiment_id.append( + f"{composition[member][1]}_{composition[member][0]}" + ) + composition[member] = ":".join(composition[member]) + strains.append(";".join(composition[member] for member in members)) + # for row2 in row_conc: + # metID, init, end = row2.split(':') + # ### get the met_name for the corresponding match in values + # met_name = None + # for index, mets in enumerate(species_mets.values()): + # if metID in mets: + # met_name = list(species_mets.keys())[index] + # break + # if "met_name" not in locals() or not met_name: + # logger.critical(f"The specified phenotypes {species_mets} for the {members} members" + # f" does not include the consumption of the available sources" + # f" {row_conc}; hence, the model cannot grow.") + # content = "" + # else: + # content = f"{init}_{met_name}" + # experiment_id.append(content) + experiment_id.extend([":".join(row.split(":")[:2]) for row in row_conc]) + experiment_id = "-".join(experiment_id) + experiment_ids.append(experiment_id) + trial_name_conversion[trial_letter][str(col + 1)] = ( + "G" + str(count), + experiment_id, + ) + count += 1 + + # convert the variable concentrations to short codes + standardized_carbon_conc = {} + for met, conc in carbon_conc["rows"].items(): + standardized_carbon_conc[met] = {} + for row, val in conc.items(): + standardized_carbon_conc[met].update( + { + short_code: val + for (short_code, expID) in trial_name_conversion[row].values() + } + ) + for met, conc in carbon_conc["columns"].items(): + standardized_carbon_conc[met] = default_dict_values( + standardized_carbon_conc, met, {} + ) + for col, val in conc.items(): + for row in trial_name_conversion: + standardized_carbon_conc[met][ + trial_name_conversion[row][str(col)][0] + ] = val + + # add columns to the exported dataframe + constructed_experiments.insert(0, "trial_IDs", experiment_ids) + constructed_experiments["additional_compounds"] = additional_compounds + constructed_experiments["strains"] = strains + constructed_experiments["date"] = [date] * (column_num * row_num) + constructed_experiments.to_csv("growth_metadata.tsv", sep="\t") + return constructed_experiments, standardized_carbon_conc, trial_name_conversion + + @staticmethod + def biomass_growth( + carbon_conc, + fluxes_df, + data_df_trials, + trial_name_conversion, + data_paths, + community_members=None, + pheno_info=None, + ): + # TODO - leverage cFBA to partition metabolite consumption between the defined phenotypes + pheno_info = pheno_info or { + f"{content['name']}_{pheno}": mets + for model, content in community_members.items() + for pheno, mets in content["phenotypes"].items() + } + # invert the trial_name_conversion and data_paths keys and values + short_code_trials = { + contents[0]: row + col + for row in trial_name_conversion + for col, contents in trial_name_conversion[row].items() + } + # short_code_trials = {contents[0]:contents[1] for contents in trial_name_conversion[row].values()} + name_signal = {name: signal for signal, name in data_paths.items()} + + # calculate the 90% concentration for each carbon source + requisite_fluxes = {} + for trial in [short_code_trials[ID] for ID in data_df_trials]: + row_letter = trial[0] + col_number = trial[1:] + ## add rows where the initial concentration in the first trial is non-zero + utilized_phenos = {} + food_gradient = carbon_conc.copy() + for dimension, content in food_gradient.items(): + for met, conc_dict in content.items(): + source_conc = conc_dict[ + row_letter if dimension == "rows" else int(col_number) + ] + # print(met, source_conc) + if source_conc == 0 or f"EX_{met}_e0" not in fluxes_df.index: + continue + for pheno, val in fluxes_df.loc[f"EX_{met}_e0"].items(): + # print(pheno, val) + if val < 0: + utilized_phenos[pheno] = source_conc * 0.9 / val + total_consumed = sum(list(utilized_phenos.values())) + # print(utilized_phenos) + + display(fluxes_df) + short_code = trial_name_conversion[row_letter][col_number][0] + requisite_fluxes[short_code] = {} + excreta = {} + for pheno, flux_conversion in utilized_phenos.items(): + species, phenotype = pheno.split("_", 1) + fluxes = ( + fluxes_df.loc[:, pheno] + * abs(flux_conversion) + * abs(flux_conversion / total_consumed) + ) + requisite_fluxes[short_code][f"{species}|{name_signal[species]}"] = ( + fluxes[fluxes != 0] + ) + pheno = reverse_strip_comp(pheno) + if "excreted" in pheno_info[pheno]: + # print(pheno_info[pheno]["excreted"]) + excreta.update( + {met: fluxes.loc[met] for met in pheno_info[pheno]["excreted"]} + ) + ## determine the fluxes for the other members of the community through cross-feeding + participated_species = [] + for pheno, mets in pheno_info.items(): + species, phenotype = pheno.split("_", 1) + if ( + any([species in ph for ph in utilized_phenos]) + or species in participated_species + ): + continue + for met in mets["consumed"]: + exMet = f"EX_{met}_e0" + if exMet not in excreta: + continue + fluxes = ( + abs(excreta[exMet] * 0.99 / fluxes_df.loc[exMet, pheno]) + * fluxes_df.loc[:, pheno] + ) + requisite_fluxes[short_code][ + f"{species}|{name_signal[species]}" + ] = fluxes[fluxes != 0] + participated_species.append(species) + # print(requisite_fluxes) + return requisite_fluxes + + @staticmethod + def data_process(dataframes, trial_name_conversion): + short_codes, trials_list = [], [] + values, times = {}, {} # The times must capture upstream + first = True + for df_name, (times_df, values_df) in dataframes.items(): + # print(df_name) + # display(times_df) ; display(values_df) + times_tup = FBAHelper.parse_df(times_df) + average_times = np.mean(times_tup.values, axis=0) + values[df_name], times[df_name] = [], [] + for trial_code in values_df.index: + row_let, col_num = trial_code[0], trial_code[1:] + # print(trial_code, row_let, col_num) + for trial_row_values in trial_contents( + trial_code, values_df.index, values_df.values + ): + if first: + short_code, experimentalID = trial_name_conversion[row_let][ + col_num + ] + trials_list.extend([experimentalID] * len(values_df.columns)) + short_codes.extend([short_code] * len(values_df.columns)) + values[df_name].extend(trial_row_values) + times[df_name].extend(average_times) + first = False + # process the data to the smallest dataset, to accommodate heterogeneous data sizes + minVal = min(list(map(len, values.values()))) + for df_name, data in values.items(): + values[df_name] = data[:minVal] + times2 = times.copy() + for df_name, data in times2.items(): + times[df_name] = data[:minVal] + # construct the growth DataFrame + df_data = { + "trial_IDs": trials_list[:minVal], + "short_codes": short_codes[:minVal], + } + df_data.update( + {"Time (s)": np.mean(list(times.values()), axis=0)} + ) # element-wise average + df_data.update({df_name: vals for df_name, vals in values.items()}) + data_df = DataFrame(df_data) + data_df.index = data_df["short_codes"] + data_df = data_df.drop(["short_codes"], axis=1) + data_df.to_csv("growth_spectra.tsv", sep="\t") + return data_df + + +class BiologData: + + @staticmethod + def process( + data_paths, + trial_conditions_path, + community_members, + col_row_num, + member_conversions, + culture=None, + date=None, + significant_deviation=None, + solver="glpk", + msdb_path: str = None, + ): + row_num = 8 + column_num = 12 + ( + zipped_output, + data_timestep_hr, + simulation_time, + dataframes, + trials, + culture, + date, + fluxes_df, + ) = BiologData.load_data( + data_paths, + significant_deviation, + community_members, + col_row_num, + row_num, + culture, + date, + solver, + ) + experimental_metadata, standardized_carbon_conc, trial_name_conversion = ( + BiologData.metadata( + trial_conditions_path, row_num, column_num, culture, date + ) + ) + biolog_df = BiologData.data_process(dataframes, trial_name_conversion) + requisite_biomass = BiologData.biomass_growth(biolog_df, member_conversions) + return ( + experimental_metadata, + biolog_df, + fluxes_df, + standardized_carbon_conc, + requisite_biomass, + trial_name_conversion, + np.mean(data_timestep_hr), + simulation_time, + ) + + @staticmethod + def load_data( + data_paths, + significant_deviation, + community_members, + col_row_num, + row_num, + culture, + date, + solver, + ): + zipped_output = [data_paths["path"], "fluxes.tsv"] + # determine the metabolic fluxes for each member and phenotype + # import and parse the raw CSV data + # TODO - this may be capable of emulating leveraged functions from the GrowthData object + fluxes_df = phenotypes(community_members, solver=solver) + # fluxes_df = None + data_timestep_hr = [] + dataframes = {} + raw_data = _spreadsheet_extension_load(data_paths["path"]) + significant_deviation = significant_deviation or 2 + # culture = culture or _find_culture(data_paths['path']) + culture = culture or ",".join( + [ + x + for x in data_paths.values() + if (x not in ["OD"] and not re.search(r"\w\.\w", x)) + ] + ) + date = date or _findDate(data_paths["path"]) + for org_sheet, name in data_paths.items(): + if org_sheet == "path": + continue + sheet = org_sheet.replace(" ", "_") + df_name = f"{name}:{sheet}" + if df_name not in dataframes: + dataframes[df_name] = _spreadsheet_extension_parse( + data_paths["path"], raw_data, org_sheet + ) + dataframes[df_name].columns = dataframes[df_name].iloc[col_row_num] + dataframes[df_name].drop( + dataframes[df_name].index[: col_row_num + 1], inplace=True + ) + dataframes[df_name].dropna(inplace=True) + # parse the DataFrame for values + dataframes[df_name].columns = [ + str(x).strip() for x in dataframes[df_name].columns + ] + simulation_time = dataframes[df_name].iloc[0, -1] / hour + # display(dataframes[df_name]) + data_timestep_hr.append( + simulation_time / int(float(dataframes[df_name].columns[-1])) + ) + # define the times and data + data_times_df, data_values_df = _df_construction( + name, + df_name, + None, + None, + significant_deviation, + dataframes[df_name], + row_num, + False, + ) + # display(data_times_df) ; display(data_values_df) + dataframes[df_name] = (data_times_df, data_values_df) + + # differentiate the phenotypes for each species + trials = set( + chain.from_iterable([list(df.index) for df, times in dataframes.values()]) + ) + return ( + zipped_output, + data_timestep_hr, + simulation_time, + dataframes, + trials, + culture, + date, + fluxes_df, + ) + + @staticmethod + def metadata(trial_conditions_path, row_num, column_num, culture, date): + # define the conditions for each trial + with open(trial_conditions_path) as trials: + trial_conditions = json.load(trials) + + # define the metadata DataFrame and a few columns + constructed_experiments = DataFrame() + ex_prefix = "B" + constructed_experiments.index = [ + f"{ex_prefix}{x+1}" for x in list(range(row_num * column_num)) + ] + constructed_experiments.index.name = "short_code" + + # define the strains column + experiment_ids, trial_names = [], [] + trial_name_conversion, trial_mets = {}, {} + count = 1 + ## apply universal values to all trials + for row in range(row_num): + trial_letter = chr(ord("A") + row) + trial_name_conversion[trial_letter] = {} + ## add rows where the initial concentration in the first trial is non-zero + for col in range(1, column_num + 1): + ## construct the columns of information + dataID = trial_letter + str(col) + MSID = trial_conditions[dataID]["ModelSEED_ID"] + short_code = ex_prefix + str(count) + + experiment_ids.append(MSID) + trial_names.append(trial_conditions[dataID]["name"]) + trial_name_conversion[trial_letter][str(col)] = (short_code, MSID) + trial_mets[MSID] = {short_code: trial_conditions[dataID]["mM"]} + count += 1 + + # add columns to the exported dataframe + constructed_experiments.insert(0, "ModelSEED_ID", experiment_ids) + constructed_experiments.insert(0, "condition", trial_names) + constructed_experiments["strain"] = [culture] * (column_num * row_num) + constructed_experiments["date"] = [date] * (column_num * row_num) + constructed_experiments.to_csv("growth_metadata.tsv", sep="\t") + return constructed_experiments, trial_mets, trial_name_conversion + + @staticmethod + def data_process(dataframes, trial_name_conversion): + short_codes, trials_list = [], [] + values, times = {}, {} # The times must capture upstream + first = True + for df_name, (times_df, values_df) in dataframes.items(): + # display(df_name, times_df, values_df) + times_tup = FBAHelper.parse_df(times_df) + # display(DataFrame(times_tup.values)) + average_times = list(np.mean(times_tup.values, axis=0)) + # print(average_times) + # print(len(average_times)) + values[df_name], times[df_name] = [], [] + for exprID in values_df.index: + row_let, col_num = exprID[0], exprID[1:] + for trial_row_values in trial_contents( + exprID, values_df.index, values_df.values + ): + if first: + short_code, experimentalID = trial_name_conversion[row_let][ + col_num + ] + trials_list.extend([experimentalID] * len(values_df.columns)) + short_codes.extend([short_code] * len(values_df.columns)) + if len(trial_row_values) != len(average_times): + print( + f"The length of the trial data {len(trial_row_values)} " + f"exceeds that of the timesteps {len(average_times)} " + f"which creates an incompatible DataFrame." + ) + values[df_name].extend(trial_row_values) + times[df_name].extend(average_times) + first = False + # process the data to the smallest dataset, to accommodate heterogeneous data sizes + minVal = min(list(map(len, values.values()))) + for df_name, data in values.items(): + values[df_name] = data[:minVal] + times2 = times.copy() + for df_name, data in times2.items(): + times[df_name] = data[:minVal] + df_data = {"trial_IDs": trials_list, "short_codes": short_codes} + df_data.update( + {"Time (s)": list(np.mean(list(times.values()), axis=0))} + ) # element-wise average + df_data.update({df_name: vals for df_name, vals in values.items()}) + biolog_df = DataFrame(df_data) + biolog_df.index = biolog_df["short_codes"] + del biolog_df["short_codes"] + biolog_df.to_csv("growth_spectra.tsv", sep="\t") + + return biolog_df + + @staticmethod + def biomass_growth(biolog_df, member_conversions): + requisite_biomass = {} + for short_code in biolog_df.index.unique(): + requisite_biomass[short_code] = {} + for signal, conversion in member_conversions.items(): + short_code_df = biolog_df[biolog_df.index == short_code] + requisite_biomass[short_code][signal] = ( + conversion + * short_code_df[signal.replace("|", ":").replace(" ", "_")].iloc[-1] + ) + return requisite_biomass diff --git a/modelseedpy/community/get_ncbi_gbff.pl b/modelseedpy/community/get_ncbi_gbff.pl new file mode 100644 index 00000000..cbeddcfc --- /dev/null +++ b/modelseedpy/community/get_ncbi_gbff.pl @@ -0,0 +1,13 @@ +use strict; + +while (<>){ + chomp ($_); + next if ($_=~/^\s*$/); + my $val = `grep $_ assembly_summary_refseq.txt |cut -f 20`; + chomp ($val); + my @p = split ("/", $val); + my $n = $p[-1]; + my $url = "${val}/${n}_genomic.gbff.gz"; + my $fpath = "${n}_genomic.gbff.gz "; + print "curl $url -o $fpath" . "\n"; +} diff --git a/modelseedpy/community/metquest_code.py b/modelseedpy/community/metquest_code.py new file mode 100644 index 00000000..d6ad31e0 --- /dev/null +++ b/modelseedpy/community/metquest_code.py @@ -0,0 +1,1162 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from collections import deque, defaultdict +import os +import glob +import sys +import warnings +from itertools import combinations +import re +import pandas as pd +import numpy as np +import cobra +import networkx as nx + +from modelseedpy.community import commhelper +from modelseedpy import MSModelUtil + +warnings.filterwarnings("ignore") + + +def _create_graph_with_internal_reaction(organismsdata): + """ + This function creates a NetworkX DiGraph object which consists of + reactions and metabolites happening inside the organisms in a community. + This makes use of the reaction information i.e., irreversible and + reversible, which is obtained from another script fetch_reactions. + + Parameters + ---------- + organismsdata : dict + Dictionary containing the reaction information about organisms + + Returns + ------- + G : NetworkX DiGraph Object + Bipartite graph consisting of internal reactions in organisms + """ + G = nx.DiGraph() + for modelname in organismsdata: + G.add_nodes_from(organismsdata[modelname]["irreversible_rxn_no"], bipartite=1) + G.add_nodes_from(organismsdata[modelname]["reversible_rxn_no"], bipartite=1) + G.add_nodes_from( + organismsdata[modelname]["reversible_back_rxn_no"], bipartite=1 + ) + irrev_lhs_nodes = list( + set( + [ + item + for sublist in organismsdata[modelname]["irreversible_lhs_nodes"] + for item in sublist + ] + ) + ) + irrev_rhs_nodes = list( + set( + [ + item + for sublist in organismsdata[modelname]["irreversible_rhs_nodes"] + for item in sublist + ] + ) + ) + rev_lhs_nodes = list( + set( + [ + item + for sublist in organismsdata[modelname]["reversible_lhs_nodes"] + for item in sublist + ] + ) + ) + rev_rhs_nodes = list( + set( + [ + item + for sublist in organismsdata[modelname]["reversible_rhs_nodes"] + for item in sublist + ] + ) + ) + G.add_nodes_from(irrev_lhs_nodes, bipartite=0) + G.add_nodes_from(irrev_rhs_nodes, bipartite=0) + G.add_nodes_from(rev_lhs_nodes, bipartite=0) + G.add_nodes_from(rev_rhs_nodes, bipartite=0) + for irrevidx in range(len(organismsdata[modelname]["irreversible_rxn_no"])): + for lhsmetidx in range( + len(organismsdata[modelname]["irreversible_lhs_nodes"][irrevidx]) + ): + G.add_edges_from( + [ + ( + organismsdata[modelname]["irreversible_lhs_nodes"][ + irrevidx + ][lhsmetidx], + organismsdata[modelname]["irreversible_rxn_no"][irrevidx], + ) + ] + ) + for rhsmetidx in range( + len(organismsdata[modelname]["irreversible_rhs_nodes"][irrevidx]) + ): + G.add_edges_from( + [ + ( + organismsdata[modelname]["irreversible_rxn_no"][irrevidx], + organismsdata[modelname]["irreversible_rhs_nodes"][ + irrevidx + ][rhsmetidx], + ) + ] + ) + for revidx in range(len(organismsdata[modelname]["reversible_rxn_no"])): + for lhsmetidxrev in range( + len(organismsdata[modelname]["reversible_lhs_nodes"][revidx]) + ): + G.add_edges_from( + [ + ( + organismsdata[modelname]["reversible_lhs_nodes"][revidx][ + lhsmetidxrev + ], + organismsdata[modelname]["reversible_rxn_no"][revidx], + ) + ] + ) + G.add_edges_from( + [ + ( + organismsdata[modelname]["reversible_back_rxn_no"][revidx], + organismsdata[modelname]["reversible_lhs_nodes"][revidx][ + lhsmetidxrev + ], + ) + ] + ) + for rhsmetidxrev in range( + len(organismsdata[modelname]["reversible_rhs_nodes"][revidx]) + ): + G.add_edges_from( + [ + ( + organismsdata[modelname]["reversible_rxn_no"][revidx], + organismsdata[modelname]["reversible_rhs_nodes"][revidx][ + rhsmetidxrev + ], + ) + ] + ) + G.add_edges_from( + [ + ( + organismsdata[modelname]["reversible_rhs_nodes"][revidx][ + rhsmetidxrev + ], + organismsdata[modelname]["reversible_back_rxn_no"][revidx], + ) + ] + ) + return G + + +def _create_graph_with_exchange_reactions(G, orgs, namemap): + """ + This function first identifies the common exchange metabolites + and the non-common exchange metabolites and adds them to the + DiGraph object generated above. + + Parameters + ---------- + G : NetworkX DiGraph Object + Bipartite graph of reaction network from organisms + orgs : dict + Dictionary consisting of irreversible, reversible and exchange + reactions pertaining to the organisms. If more than one organism + is used, this dictionary consists of information about all the + organisms. + namemap : dict + Dictionary mapping the adhoc reaction names to reaction names in + the model + + Returns + ------- + G : NetworkX DiGraph Object + Bipartite graph consisting of internal and exchange reactions in organisms + namemap : dict + Dictionary mapping the adhoc exchange reaction names to reaction names in + the model + """ + metabolite_exchanged = [] + for orgnames in orgs: + exc_met = orgs[orgnames]["exchange_metab_nodes"] + metabolite_exchanged.append(exc_met) + # Common exchange metabolites in different organisms + common_exchange_metabolite = list( + set.intersection(*list(map(set, metabolite_exchanged))) + ) + common_exchange_metabolite.sort() + # Adding the common exchange metabolites to the graph + for orgnames in orgs: + renamed_exc_met = [ + f"{orgnames} {comexcmet}" for comexcmet in common_exchange_metabolite + ] + number_exc_met = list(range(0, len(common_exchange_metabolite))) + mod_exc_rxn_number = [ + f"Org_{orgnames} ER{str(num + 1)}" for num in number_exc_met + ] + mod_exc_rev_rxn_number = [ + f"Org_{orgnames} ERR{str(num + 1)}" for num in number_exc_met + ] + G.add_nodes_from(mod_exc_rxn_number, bipartite=1) + G.add_nodes_from(mod_exc_rev_rxn_number, bipartite=1) + G.add_nodes_from(common_exchange_metabolite, bipartite=0) + G.add_nodes_from(renamed_exc_met, bipartite=0) + for k in range(len(renamed_exc_met)): + namemap[mod_exc_rxn_number[k]] = common_exchange_metabolite[k] + namemap[mod_exc_rev_rxn_number[k]] = common_exchange_metabolite[k] + G.add_edges_from([(renamed_exc_met[k], mod_exc_rxn_number[k])]) + G.add_edges_from([(mod_exc_rxn_number[k], common_exchange_metabolite[k])]) + G.add_edges_from( + [(common_exchange_metabolite[k], mod_exc_rev_rxn_number[k])] + ) + G.add_edges_from([(mod_exc_rev_rxn_number[k], renamed_exc_met[k])]) + # Adding the uncommon exchange metabolites to the graph + for orgnames in orgs: + metitems = orgs[orgnames]["exchange_metab_nodes"] + non_common_exc_met = list(set(metitems) - set(common_exchange_metabolite)) + non_common_exc_met.sort() + renamed_non_common_exc_met = [f"{orgnames} {s}" for s in non_common_exc_met] + number_non_common_exc_met = list(range(0, len(non_common_exc_met))) + mod_non_common_exc_rxn_number = [ + f"Org_{orgnames} NCER{str(num + 1)}" for num in number_non_common_exc_met + ] + mod_non_common_exc_rev_rxn_number = [ + f"Org_{orgnames} NCERR{str(num + 1)}" for num in number_non_common_exc_met + ] + G.add_nodes_from(mod_non_common_exc_rxn_number, bipartite=1) + G.add_nodes_from(mod_non_common_exc_rev_rxn_number, bipartite=1) + G.add_nodes_from(non_common_exc_met, bipartite=0) + G.add_nodes_from(renamed_non_common_exc_met, bipartite=0) + for k in range(len(renamed_non_common_exc_met)): + namemap[mod_non_common_exc_rxn_number[k]] = non_common_exc_met[k] + namemap[mod_non_common_exc_rev_rxn_number[k]] = non_common_exc_met[k] + G.add_edges_from( + [(renamed_non_common_exc_met[k], mod_non_common_exc_rxn_number[k])] + ) + G.add_edges_from( + [(mod_non_common_exc_rxn_number[k], non_common_exc_met[k])] + ) + G.add_edges_from( + [(non_common_exc_met[k], mod_non_common_exc_rev_rxn_number[k])] + ) + G.add_edges_from( + [(mod_non_common_exc_rev_rxn_number[k], renamed_non_common_exc_met[k])] + ) + return G, namemap + + +def create_graph(file_names, no_of_orgs): + """ + This function creates bipartite graph of the organisms based on the + path provided and the number of organsisms. For instance, if a folder + has 3 model files, and the number of organisms is 2, 3 (3C2) different + bipartite graphs are created. The graph objects and the dictionary + are saved as gpickle and pickle files respectively. + + Parameters + ---------- + file_names : list + List containing the file names of models + no_of_orgs : int + Number of organisms to be used for creating the DiGraph. + + Returns + ------- + H : NetworkX DiGraph Object + Bipartite graph consisting of internal and exchange reactions in organisms + full_name_map : dict + Dictionary mapping the adhoc reaction names to reaction names in + the model + """ + + H = [] + organisms_reaction_data, partial_name_map = segregate_reactions_from_models( + file_names + ) + if organisms_reaction_data: + organisms_names = list(organisms_reaction_data.keys()) + all_possible_combis = list( + combinations(list(range(len(organisms_names))), int(no_of_orgs)) + ) + if int(no_of_orgs) > 1 and sorted(organisms_names)[0][0] == "0": + all_possible_combis = all_possible_combis[: len(organisms_names) - 1] + if all_possible_combis: + for ncom in range(len(all_possible_combis)): + file_name = "" + current_combination = {} + for numincom in range(len(all_possible_combis[ncom])): + current_combination[ + organisms_names[all_possible_combis[ncom][numincom]] + ] = organisms_reaction_data[ + organisms_names[all_possible_combis[ncom][numincom]] + ] + file_name = ( + file_name + + organisms_names[all_possible_combis[ncom][numincom]] + + "_" + ) + H.append(_create_graph_with_internal_reaction(current_combination)) + temp, full_name_map = _create_graph_with_exchange_reactions( + H[ncom], current_combination, partial_name_map + ) + H[ncom] = temp + print(len(H), H[ncom]) + print("Number of edges in graph", len(H[ncom].edges())) + print("Number of nodes in graph", len(H[ncom].nodes())) + + # Uncomment the following code to save the graph files externally in your machine + # Note: Graph files can occupy a large space for large datasets + """ + if os.access(path_name_with_models, os.W_OK): + with open(file_name + 'namemap' + '.pickle', 'wb') as filetodump: + dump(full_name_map, filetodump) + nx.write_gpickle(H[ncom], file_name + '.gpickle') + print('Graph and namemap saved for file(s) in', path_name_with_models) + """ + else: + print( + "Number of organisms for creating a consortium graph is more than the models given" + ) + print("Program will now exit") + sys.exit() + else: + print("Cannot create graph") + sys.exit() + return H, full_name_map + + +def forward_pass(graph_object, media): + """ + This function carries out the Guided Breadth First Search on a directed + bipartite graph starting from the entries in seed metabolite set. + + Parameters + ---------- + graph_object : NetworkX DiGraph Object + Bipartite graph of the metabolic network + + seedmet : set + Set of seed metabolites including the source + + Returns + ------- + lower_bound_metabolite : defaultdict + Minimum number of steps required to reach a metabolite + status_dict : defaultdict + Dictionary pertaining to the status of every reaction - whether it + has been visited or not + scope : set + Set of metabolites that can be produced from the given set of + seed metabolites + + Notes + ----- + Starting with the set of seed metabolites S, the algorithm first finds + all the reactions from the set R, whose precursor metabolites are in S. + Such reactions are marked visited and added to the visited reaction set. + Metabolites produced by these reactions are checked. The reactions where + these metabolites participate are then checked for the presence of all its + predecessors and are added to the queue. This traversal continues in a + breadth-first manner and stops when there are no further reactions to + be visited. + """ + pred = graph_object.predecessors + succ = graph_object.successors + lower_bound_metabolite = {cpd: [0] for cpd in media} + lower_bound_reaction = defaultdict(list) + status_dict = defaultdict(str) + # Using a deque since deques have O(1) speed for appendleft() and popleft() + # while lists have O(n) performance for inserting and popping. + queue = deque([]) + # All seed metabolites are always present, hence require 0 steps + stage = 1 + mediaMets = list(media.keys()) + scope = list(media.keys()) + starting_rxn_node = [] + # First stage where starting_rxn_node list contains all the reactions + # which require only the seed metabolites as input + for starting_met_nodes in mediaMets: + # Essential when analysing mutiple networks with same seed metabolite + # set, although would be redundant in case of single network + if starting_met_nodes in graph_object: + for startingrxns in succ(starting_met_nodes): + if set(pred(startingrxns)).issubset(mediaMets): + if startingrxns not in starting_rxn_node: + starting_rxn_node.append(startingrxns) + for metsprod in succ(startingrxns): + scope.add(metsprod) + if stage not in lower_bound_metabolite[metsprod]: + lower_bound_metabolite[metsprod].append(stage) + if stage not in lower_bound_reaction[startingrxns]: + lower_bound_reaction[startingrxns].append(stage) + for rxn in starting_rxn_node: + for metabs in succ(rxn): + for nextrxn in succ(metabs): + if set(pred(nextrxn)).issubset(scope): + if nextrxn not in queue: + queue.append(nextrxn) + status_dict[rxn] = "V" + while queue: + stage += 1 + for parentrxn in list(queue): + if status_dict[parentrxn] == "": + if stage not in lower_bound_reaction[parentrxn]: + lower_bound_reaction[parentrxn].append(stage) + for mets in succ(parentrxn): + scope.add(mets) + if stage not in lower_bound_metabolite[mets]: + lower_bound_metabolite[mets].append(stage) + for progeny in succ(mets): + if set(pred(progeny)).issubset(scope): + if status_dict[progeny] != "V": + if progeny not in queue: + queue.append(progeny) + status_dict[parentrxn] = "V" + elif status_dict[parentrxn] == "V": + for mets in succ(parentrxn): + if stage not in lower_bound_metabolite[mets]: + lower_bound_metabolite[mets].append(stage) + queue.popleft() + return lower_bound_metabolite, status_dict, scope + + +def find_different_reaction_types(stoi_matrix, model, current_model_name): + """ + This function finds the exchange, irreversible and the reversible reactions + from the model. + + Parameters + ---------- + stoi_matrix : numpy array + full path name where the model files are + model : COBRA model object + COBRA model object created from SBML models + current_model_name : str + Name which is to be prefixed against every + reaction/metabolite (to differentiate the entries in multiple organisms, + when a community model is built) + Returns + ------- + exchange_met_ids : list + Metabolite identifiers of exchange metabolites + irrev_lhs_nodes : list + Metabolite identifiers of reactants of irreversible reactions + irrev_rhs_nodes : list + Metabolite identifiers of products of irreversible reactions + rev_lhs_nodes : list + Metabolite identifiers of reactants of reversible reactions + rev_rhs_nodes : list + Metabolite identifiers of products of reversible reactions + exchange_rxn_ids : list + Reaction identifers of exchange reactions + irrev_rxn_ids : list + Reaction identifiers of irreversible reactions + rev_rxn_ids : list + Reaction identifiers of reversible reactions + + """ + + xdim = np.shape(stoi_matrix) + reactants_of_reaction, total_metabolites_in_reaction, products_of_reaction = ( + [], + [], + [], + ) + number_of_reactants_in_reaction, total_number_of_metabs_in_reaction = [], [] + number_of_products_in_reaction, exchange_reaction_idx = [], [] + reaction_identifiers, reaction_in_model, metabolite_identifiers = [], [], [] + for metab in model.metabolites: + metabolite_identifiers.append(metab.id) + for rxns in model.reactions: + reaction_identifiers.append(rxns.id) + reaction_in_model.append(rxns.reaction) + for rxnidx in range(xdim[0]): + reactants_of_reaction.append(np.where(stoi_matrix[rxnidx] == -1)) + total_metabolites_in_reaction.append(np.where(stoi_matrix[rxnidx] != 0)) + products_of_reaction.append(np.where(stoi_matrix[rxnidx] == 1)) + number_of_reactants_in_reaction.append(len(reactants_of_reaction[rxnidx][0])) + total_number_of_metabs_in_reaction.append( + len(total_metabolites_in_reaction[rxnidx][0]) + ) + number_of_products_in_reaction.append(len(products_of_reaction[rxnidx][0])) + + # Case 1 - Presence of bulk metabolites in the medium + + if ( + reaction_in_model[rxnidx][-1] == "b" + ): # Assuming the bulk metabolites end in 'b' + if ( + number_of_reactants_in_reaction[rxnidx] == 1 + and number_of_products_in_reaction[rxnidx] == 1 + ): + exchange_reaction_idx.append(rxnidx) + # Case 2 - Presence of exchange metabolites + elif ( + number_of_reactants_in_reaction[rxnidx] == 1 + and total_number_of_metabs_in_reaction[rxnidx] == 1 + ): + exchange_reaction_idx.append(rxnidx) + elif ( + number_of_products_in_reaction[rxnidx] == 1 + and total_number_of_metabs_in_reaction[rxnidx] == 1 + ): + exchange_reaction_idx.append(rxnidx) + exchange_met_ids, exchange_met_index, exchange_rxn_ids = [], [], [] + for excentry in exchange_reaction_idx: + exchange_rxn_ids.append(reaction_identifiers[excentry]) + if reaction_in_model[excentry][-1] == "b": + exchange_met_ids.append( + metabolite_identifiers[np.nonzero(stoi_matrix[excentry])[0][0]] + ) + else: + exchange_met_index.append(np.nonzero(stoi_matrix[excentry])[0].tolist()[0]) + if exchange_met_index: + for metind in exchange_met_index: + exchange_met_ids.append(metabolite_identifiers[metind]) + all_rxn_idx = list(range(len(reaction_in_model))) + internal_rxns = list(set(all_rxn_idx) ^ set(exchange_reaction_idx)) + reversible_rxns, irreversible_rxns, rxns_lowerbound, rxns_upperbound = ( + [], + [], + [], + [], + ) + for rxns in model.reactions: + rxns_lowerbound.append(rxns.lower_bound) + rxns_upperbound.append(rxns.upper_bound) + for idxint in internal_rxns: + if rxns_lowerbound[idxint] < 0 and rxns_upperbound[idxint] >= 0: + reversible_rxns.append(idxint) + elif rxns_lowerbound[idxint] >= 0 and rxns_upperbound[idxint] >= 0: + irreversible_rxns.append(idxint) + # Irreversible reaction nodes + ( + irrev_lhs_temporary, + irrev_rhs_temporary, + irrev_lhs_nodes, + irrev_rhs_nodes, + irrev_rxn_ids, + ) = ([], [], [], [], []) + for irridx in irreversible_rxns: + irrev_rxn_ids.append(reaction_identifiers[irridx]) + irrev_lhs_temporary.append(np.where(stoi_matrix[irridx] < 0)[0].tolist()) + irrev_rhs_temporary.append(np.where(stoi_matrix[irridx] > 0)[0].tolist()) + for lhsirridx in range(len(irrev_lhs_temporary)): + temp_metab_list_lhs = [] + for met_idx_lhs in irrev_lhs_temporary[lhsirridx]: + met_namech_lhs = ( + f"{current_model_name} {metabolite_identifiers[met_idx_lhs]}" + ) + temp_metab_list_lhs.append(met_namech_lhs) + irrev_lhs_nodes.append(temp_metab_list_lhs) + for rhsirridx in range(len(irrev_rhs_temporary)): + temp_metab_list_rhs = [] + for met_idx_rhs in irrev_rhs_temporary[rhsirridx]: + met_namech_rhs = ( + f"{current_model_name} {metabolite_identifiers[met_idx_rhs]}" + ) + temp_metab_list_rhs.append(met_namech_rhs) + irrev_rhs_nodes.append(temp_metab_list_rhs) + + # Reversible reaction nodes + rev_lhs_temporary, rev_rhs_temporary, rev_lhs_nodes, rev_rhs_nodes, rev_rxn_ids = ( + [], + [], + [], + [], + [], + ) + for rridx in reversible_rxns: + rev_rxn_ids.append(reaction_identifiers[rridx]) + rev_lhs_temporary.append(np.where(stoi_matrix[rridx] < 0)[0].tolist()) + rev_rhs_temporary.append(np.where(stoi_matrix[rridx] > 0)[0].tolist()) + for lhsrevidx in range(len(rev_lhs_temporary)): + temp_metab_list_lhs_rev = [] + for met_idx_lhs in rev_lhs_temporary[lhsrevidx]: + met_namech_lhs = "%s %s" % ( + current_model_name, + metabolite_identifiers[met_idx_lhs], + ) + temp_metab_list_lhs_rev.append(met_namech_lhs) + rev_lhs_nodes.append(temp_metab_list_lhs_rev) + for rhsrevidx in range(len(rev_rhs_temporary)): + temp_metab_list_rhs_rev = [] + for met_idx_rhs in rev_rhs_temporary[rhsrevidx]: + met_namech_rhs = "%s %s" % ( + current_model_name, + metabolite_identifiers[met_idx_rhs], + ) + temp_metab_list_rhs_rev.append(met_namech_rhs) + rev_rhs_nodes.append(temp_metab_list_rhs_rev) + return ( + exchange_met_ids, + irrev_lhs_nodes, + irrev_rhs_nodes, + rev_lhs_nodes, + rev_rhs_nodes, + exchange_rxn_ids, + irrev_rxn_ids, + rev_rxn_ids, + ) + + +def segregate_reactions_from_models(models): + """ + This function gets the data pertaining to the reactions and the + metabolites from the models of multiple organisms. + This requires as input the pathname where the '.xml' files are located. + From this path, this function reads all the files using the functions + in the COBRA toolbox and generates the stoichiometric model for these + SBML models. + + Parameters + ---------- + models : list + List of model objects + + Returns + ------- + all_organisms_info : dict + Dictionary of all model data (reaction information about all the + organisms) + namemap : dict + Dictionary mapping the adhoc reaction names to reaction names in + the model + + """ + all_organisms_info = {} + namemap = {} + for model in models: + stoi = cobra.util.array.create_stoichiometric_matrix(model) + current_organisms_info = {} + rxns_in_model, mets_in_model = [], [] + for metab in model.metabolites: + mets_in_model.append(metab.id) + for reac in model.reactions: + rxns_in_model.append(reac.id) + stoi_matrix = stoi.T + ( + exchange_nodes, + irrev_lhs_nodes, + irrev_rhs_nodes, + rev_lhs_nodes, + rev_rhs_nodes, + exc_name, + irrev_rxn_name, + rev_rxn_name, + ) = find_different_reaction_types(stoi_matrix, model, model.id) + current_organisms_info[model.id] = { + "exchange_metab_nodes": exchange_nodes, + "irreversible_lhs_nodes": irrev_lhs_nodes, + "irreversible_rhs_nodes": irrev_rhs_nodes, + "reversible_lhs_nodes": rev_lhs_nodes, + "reversible_rhs_nodes": rev_rhs_nodes, + "exch_rxn_name": exc_name, + "irrev_rxn_name": irrev_rxn_name, + "rev_rxn_name": rev_rxn_name, + } + + irrev_rxn_number = [] + for num in range(len(irrev_lhs_nodes)): + modified_name_irrev = f"Org_{model.id} IR" + str(num + 1) + irrev_rxn_number.append(modified_name_irrev) + namemap[modified_name_irrev] = irrev_rxn_name[num] + + rev_rxn_number = [] + for num in range(len(rev_lhs_nodes)): + modified_name_rev = f"Org_{model.id} RR" + str(num + 1) + rev_rxn_number.append(modified_name_rev) + namemap[modified_name_rev] = rev_rxn_name[num] + + rev_back_rxn_number = [] + for num in range(len(rev_lhs_nodes)): + modified_name_back_rev = f"Org_{model.id} RevBR" + str(num + 1) + rev_back_rxn_number.append(modified_name_back_rev) + namemap[modified_name_back_rev] = rev_rxn_name[num] + + current_organisms_info[model.id]["reversible_rxn_no"] = rev_rxn_number + current_organisms_info[model.id]["irreversible_rxn_no"] = irrev_rxn_number + current_organisms_info[model.id]["total_nodes"] = ( + len(exchange_nodes) + len(irrev_lhs_nodes) + len(rev_lhs_nodes) + ) + current_organisms_info[model.id]["model_rxns"] = rxns_in_model + current_organisms_info[model.id]["reversible_back_rxn_no"] = rev_back_rxn_number + current_organisms_info[model.id]["metabolites"] = mets_in_model + all_organisms_info.update(current_organisms_info) + return all_organisms_info, namemap + + +def find_relievedrxns(model, org_info, org_info_pert): + relieved = { + i: list(set(org_info_pert[i]) - set(org_info[i])) for i in org_info_pert + } + detailed_rel_rxns, rel_rxns_name = {}, {} + + for i in model: + j = i.id + detailed_rel_rxns[j] = [] + rel_rxns_name[j] = [] + if len(relieved[j]): + rxn_ids = [] + for r in i.reactions: + rxn_ids.append(r.id) + for rel in relieved[j]: + rel_rxn = i.reactions[rxn_ids.index(rel)].reaction + detailed_rel_rxns[j].append(rel_rxn) + rel_rxns_name[j].append(i.reactions[rxn_ids.index(rel)].name) + + return relieved, detailed_rel_rxns, rel_rxns_name + + +def find_stuckrxns(model, community, media, no_of_orgs): + # Constructing graphs + warnings.filterwarnings("ignore") + G, full_name_map = create_graph(community, no_of_orgs) + if not os.path.exists("results"): + os.makedirs("results") + all_possible_combis = list( + combinations(list(range(len(community))), int(no_of_orgs)) + ) + if no_of_orgs > 1 and sorted(community)[0][0] == "0": + all_possible_combis = all_possible_combis[: len(community) - 1] + org_info = {} + scope = {} + print("No. of graphs constructed: ", len(G)) + + # This loop finds all the stuck reaction + for i in range(len(all_possible_combis)): + lbm, sd, s = forward_pass(G[i], media) + for j in range(len(all_possible_combis[i])): + stuck, rxnNode = [], [] + model1 = model[all_possible_combis[i][j]].id + visited = list(sd.keys()) + for r in G[i].nodes: + if r.find(model1) >= 0: + rxnNode.append(r) + for rxn in rxnNode: + if rxn in visited: + continue + elif rxn.find("ERR") >= 0: + continue + elif rxn.find("Org") >= 0: + if (rxn[len(model1) + 5] == "I") or (rxn[len(model1) + 5] == "R"): + stuck.append(rxn) + org_info[model1] = stuck + scope[model1] = s + return org_info, scope, full_name_map + + +def decrypt_orginfo(org_info, namemap): + """ + This function decrypts the rxn ids using the data in corresponding namemaps + :param org_info: + :param namemap: + :return: + org_info: An dictionary of decrypted rxn ids for each community + """ + for i in org_info: + for j in range(len(org_info[i])): + org_info[i][j] = namemap[org_info[i][j]] + return org_info + + +def make_perturbed_community(rem_org, pert_models, pert_community): + pert_model_ids = [i.id for i in pert_models] + for i in rem_org: + if i in pert_model_ids: + pert_models.remove(pert_models[pert_model_ids.index(i)]) + pert_community.remove(pert_community[pert_model_ids.index(i)]) + pert_model_ids.remove(i) + + return pert_models, pert_community, pert_model_ids + + +def perform_task( + media, model, transport_rxns, pert_community, org_info_wo_trans_rxn, rem_org_list, n +): + org_info_pert, scope_pert, namemap_pert = find_stuckrxns( + model, pert_community, media, len(pert_community) + ) + org_info_pert = decrypt_orginfo(org_info_pert, namemap_pert) + org_info_pert_wo_trans_rxn = { + i: list(set(org_info_pert[i]) - set(transport_rxns)) for i in org_info_pert + } + + with open(f"results/Community_without_clus{str(n)}.csv", "w") as g: + for m in org_info_pert_wo_trans_rxn: + g.write(m + "," + str(len(org_info_pert_wo_trans_rxn[m])) + "\n") + stuck_com = stuck_pert_com = 0 + for i in org_info_wo_trans_rxn: + if i not in rem_org_list: + stuck_com += len(org_info_wo_trans_rxn[i]) + for i in org_info_pert_wo_trans_rxn: + stuck_pert_com += len(org_info_pert_wo_trans_rxn[i]) + msi = 1 - (stuck_com / stuck_pert_com) + print(n, "th cluster") + return org_info_pert, org_info_pert_wo_trans_rxn, msi + + +def write_relieved_rxns(g, relieved, detailed_rel_rxns, rel_rxns_name): + g.write("acceptor\trelieved reactions\n") + for i in relieved: + g.write(i + "\t") + for j in list(set(relieved[i])): + g.write(j + "\t\n\t") + for d in list(set(rel_rxns_name[i])): + g.write(d + "\t\n\t") + for k in list(set(detailed_rel_rxns[i])): + g.write(k + "\t\n") + + +def write_relieved_rxn_metadata(h, org_info_wo_trans_rxn, org_info_pert_wo_trans_rxn): + nrelieved = {} + for i in org_info_pert_wo_trans_rxn: + nrelieved[i] = len(org_info_pert_wo_trans_rxn[i]) - len( + org_info_wo_trans_rxn[i] + ) + if nrelieved[i]: + h.write( + i + + "," + + str(len(org_info_wo_trans_rxn[i])) + + "," + + str(len(org_info_pert_wo_trans_rxn[i])) + + "," + + str(nrelieved[i]) + + "\n" + ) + + +def find_relieved_rxn(model, media_name, org_info_single, org_info_pair): + """ + This function extracts and writes the relieved rxns into a tsv file + :param model: + :param media_name: name of the media used (identifer to know what media is used when analysis is done using multiple media) + :param org_info_single: Dictionary containing stuck reactions of all microbes in the community + :param org_info_pair: Dictionary containing stuck reactions of all microbes in the community + :return: None + """ + relieved = {} + for org1 in model: + for org2 in model: + if org1.id + "_" + org2.id in org_info_pair.keys(): + relieved[org1.id + "_" + org2.id] = [] + temp = list( + set(org_info_single[org1.id + "_" + org1.id]) + - set(org_info_pair[org1.id + "_" + org2.id]) + ) + for j in temp: + relieved[org1.id + "_" + org2.id].append(j) + else: + continue + + rel_rxns_name, detailed_rel_rxns = {}, {} + for i in model: + rxn_ids = [r.id for r in i.reactions] + for j in model: + org1 = i.id + org2 = j.id + if org1 + "_" + org2 in relieved.keys(): + detailed_rel_rxns[org1 + "_" + org2] = [] + rel_rxns_name[org1 + "_" + org2] = [] + for rel in relieved[org1 + "_" + org2]: + rel_rxn = i.reactions[rxn_ids.index(rel)].reaction + detailed_rel_rxns[org1 + "_" + org2].append(rel_rxn) + rel_rxns_name[org1 + "_" + org2].append( + i.reactions[rxn_ids.index(rel)].name + ) + + relieved_rxn_output_file = f"results/relieved_rxns_{media_name}_w_excrxns.tsv" + with open(relieved_rxn_output_file, "w") as g: + header = "acceptor\tdonor\trelieved reactions\n" + g.write(header) + for i in model: + for j in model: + org1 = i.id + org2 = j.id + if org1 + "_" + org2 in relieved.keys(): + g.write(org1 + "\t" + org2 + "\t") + rel_rxns = list(set(relieved[org1 + "_" + org2])) + det_rel_rxns = list(set(detailed_rel_rxns[org1 + "_" + org2])) + rel_rxn_nam = list(set(rel_rxns_name[org1 + "_" + org2])) + for x in rel_rxns: + g.write(x + "\t\n\t\t") + for d in rel_rxn_nam: + g.write(d + "\t\n\t\t") + for k in det_rel_rxns: + g.write(k + "\t\n") + print("relieved reactions are written at:\n", relieved_rxn_output_file) + + +def find_stuck_rxns(models, community, media, comm_size): + """ + Constructs graphs using MetQuest and finds all stuck reactions in the cellular compartment + :param models: list of GEMs + :param community: the community model + :param seedmet_file: path to txt file containing seed metabolites + :param comm_size: number of organisms in a community + :return: + org_info: Dictionary containing stuck reactions of all microbes in the community + scope: Dictionary containing all the metabolites that can be produced by the microbes in the community + namemap: Dictionaru containing all the decrypted rxn ids + """ + warnings.filterwarnings("ignore") + G, full_name_map = create_graph(community, comm_size) + if not os.path.exists("results"): + os.makedirs("results") + + all_possible_combis = combinations(models, comm_size) + org_info, scope, vis = {}, {}, {} + print("No. of graphs constructed: ", len(G)) + + # This loop finds all the stuck reaction + for i in range(len(all_possible_combis)): + lbm, sd, s = forward_pass(G[i], media) + for j in range(len(all_possible_combis[i])): + stuck, rxnNode = [], [] + model1 = models[all_possible_combis[i][j]].id + visited = list(sd.keys()) + for r in G[i].nodes: + if r.find(model1) >= 0: + rxnNode.append(r) + for rxn in rxnNode: + if rxn in visited or rxn.find("ERR") >= 0: + continue + elif rxn.find("Org") >= 0: + if (rxn[len(model1) + 5] == "I") or (rxn[len(model1) + 5] == "R"): + stuck.append(rxn) + model2 = models[all_possible_combis[i][j - 1]].id + org_info[model1 + "_" + model2] = stuck + scope[model1 + "_" + model2] = s + vis[model1 + "_" + model2] = visited + return org_info, scope, full_name_map, vis + + +def decrypt_org_info(org_info, namemap): + """ + This function decrypts the rxn ids using the data in corresponding namemaps + :param org_info: + :param namemap: + :return: + org_info: An dictionary of decrypted rxn ids for each community + """ + for i in org_info: + for j in range(len(org_info[i])): + org_info[i][j] = namemap[org_info[i][j]] + return org_info + + +def pMSI(models, media): + """ + Calculates MSI for CarveMe models + Extracts and writes relieved reactions in every pair + :param community: list of GSMM files + :param sd_file: path to txt file containing seed metabolites + :return: msi: Dictionary containing MSI values for every pair + """ + # find all transport reactions + community_model = commhelper.build_from_species_models(models) + comm_util = MSModelUtil(community_model) + # find stuck reactions + org_info_single, scope_sin, namemap_sin, vis = find_stuck_rxns( + models, community_model, media, 1 + ) + org_info_pair, scope_pair, namemap_pair, vis = find_stuck_rxns( + models, models, media, 2 + ) + # decrypt the stuck reactions + org_info_single = decrypt_org_info(org_info_single, namemap_sin) + org_info_pair = decrypt_org_info(org_info_pair, namemap_pair) + # Filter out the transport reactions from every stuck reaction list + org_info_single_wo_trans_rxn, org_info_pair_wo_trans_rxn = {}, {} + for i in org_info_single: + org_info_single_wo_trans_rxn[i] = list( + set(org_info_single[i]) - set(comm_util.transport_list()) + ) + for i in org_info_pair: + org_info_pair_wo_trans_rxn[i] = list( + set(org_info_pair[i]) - set(comm_util.transport_list()) + ) + # find all the relieved reactions in every pairs + find_relieved_rxn(models, "relieved_rxns", org_info_single, org_info_pair) + # calculate MSI for every pair + msi = {} + for org1 in models: + stuck_A = len(org_info_single_wo_trans_rxn[org1.id + "_" + org1.id]) + for org2 in models: + if org1.id + "_" + org2.id in org_info_pair_wo_trans_rxn.keys(): + stuck_AUB = len(org_info_pair_wo_trans_rxn[org1.id + "_" + org2.id]) + if stuck_A == 0: + msi[org1.id + "_" + org2.id] = 0 + else: + msi[org1.id + "_" + org2.id] = 1 - (stuck_AUB / stuck_A) + return msi, community_model + + +def calculate_pairwiseMSI(models, media): + """ + This function calculates pairwise-MSI for all given microbes. + + Creates a csv file containing the MSI values of all pairs. + + Creates an tsv file containing the list of reaction relieved + in all acceptor microbes in the presence of corresponding donor microbes. + + :param path: path to all xml files + :param sd_file: path to txt file containing seed metabolites + """ + + warnings.filterwarnings("ignore") + msi, community_model = pMSI(models, media) + msi_output_file = f"results/MSI_{os.path.basename(media).replace('.txt', '')}.csv" + with open(msi_output_file, "w") as f: + header = "organism,in_the_presence,msi_value\n" + f.write(header) + for org1, org2 in combinations(models, 2): + if org1.id + "_" + org2.id in msi.keys(): + f.write(f"{org1.id},{org2.id},{str(msi[org1.id + '_' + org2.id])}\n") + print("MSI values are written at:\n", msi_output_file) + + +def calculate_higherorderMSI(models, media, clusters="individual_clusters"): + community_model = commhelper.build_from_species_models(models) + comm_util = MSModelUtil(community_model) + org_info, scope, namemap = find_stuckrxns(model, community, media, len(community)) + org_info = decrypt_orginfo(org_info, namemap) + org_info_wo_trans_rxn = { + i: list(set(org_info[i]) - set(comm_util.transport_list())) for i in org_info + } + + with open(f"results/community_unperturbed.csv", "w") as f: + for i, diff in org_info_wo_trans_rxn.items(): + f.write(i + "," + str(len(diff)) + "\n") + + if clusters == "individual_clusters": + rem_org_list1, rem_org_list2 = {}, {} + for i, model in enumerate(models): + rem_org_list1[i] = model.id + rem_org_list2[i] = model.id + else: + cluster_data = pd.read_csv(clusters, sep=",") + rem_org_list1 = cluster_data.set_index("Cluster").T.to_dict("list") + for n in rem_org_list1: + rem_org_list1[n] = [j for j in rem_org_list1[n] if pd.isna(j) is False] + for n in rem_org_list1: + rem_org_list1[n] = [ + cobra.io.read_sbml_model(i).id for i in rem_org_list1[n] + ] + # rem_org_list1[n] = [model_ids[model_ids.index(i)] for i in rem_org_list1[n]] + rem_org_list2 = rem_org_list1.copy() + + for nclus in rem_org_list2: + rem_org_list2[nclus] = [x.replace(".xml", "") for x in rem_org_list2[nclus]] + + with open(f"results/higher_order_msi.csv", "w") as f: + for n in rem_org_list1: + # os.chdir(path) + # new_models = model.copy() + # new_community = glob.glob('*.xml') + # if not new_community: + # new_community = glob.glob('*.sbml') + # new_community.sort() + + pert_models, pert_community, pert_model_ids = make_perturbed_community( + rem_org_list1[n], new_models, new_community + ) + + org_info_pert, org_info_pert_wo_trans_rxn, msi = perform_task( + media, + pert_models, + transport_rxns, + pert_community, + org_info_wo_trans_rxn, + rem_org_list2[n], + n, + ) + for i in rem_org_list2[n]: + f.write("Comm,clus_" + str(n) + "#" + i + "," + str(msi) + "\n") + + if msi: + relieved, detailed_rel_rxns, rel_rxns_name = find_relievedrxns( + pert_models, org_info, org_info_pert + ) + with open( + f"results/clusterKO_/data_analysis/relieved_rxns_Comm--clus{n}.tsv", + "w", + ) as g: + write_relieved_rxns(g, relieved, detailed_rel_rxns, rel_rxns_name) + with open( + f"results/clusterKO_/data_analysis/Comm--clus{n}.tsv", "w" + ) as h: + h.write("Comm--clus" + str(n) + "\n") + for i in rem_org_list2[n]: + h.write(i + "\n") + h.write( + "num of rxns relieved in the below orgs in the presence of clust" + + str(n) + + "\n" + ) + h.write("org,unpert,clust_" + str(n) + "KO,rxns relieved\n") + write_relieved_rxn_metadata( + h, org_info_wo_trans_rxn, org_info_pert_wo_trans_rxn + ) + print("Comm--clus" + str(n)) + + new_models = model.copy() + new_community = glob.glob("*.xml") + if not new_community: + new_community = glob.glob("*.sbml") + new_community.sort() + ko_models, ko_community, model_ids = make_perturbed_community( + pert_model_ids, new_models, new_community + ) + ko_org_list = [x for x in pert_model_ids] + if len(ko_org_list) < len(model): + org_info_pert, org_info_pert_wo_trans_rxn, msi = perform_task( + media, + ko_models, + transport_rxns, + ko_community, + org_info_wo_trans_rxn, + ko_org_list, + n, + ) + for i in ko_community: + f.write("clus_" + str(n) + "#" + i + ",Comm," + str(msi) + "\n") + + if msi: + relieved, detailed_rel_rxns, rel_rxns_name = find_relievedrxns( + ko_models, org_info, org_info_pert + ) + with open( + f"results/clusterKO_/data_analysis/relieved_rxns_Comm--clus{n}.tsv", + "w", + ) as g: + write_relieved_rxns( + g, relieved, detailed_rel_rxns, rel_rxns_name + ) + with open( + f"results/clusterKO_/data_analysis/Comm{n}--clus.tsv", "w" + ) as h: + h.write("clus" + str(n) + "--Comm\n") + for i in ko_org_list: + h.write(i + "\n") + h.write( + "num of rxns relieved in the below orgs in the presence of Comm" + ) + h.write("org,unpert,commKO,rxns relieved\n") + write_relieved_rxn_metadata( + h, org_info_wo_trans_rxn, org_info_pert_wo_trans_rxn + ) + print("clus" + str(n) + "--Comm") diff --git a/modelseedpy/community/mscommfitting.py b/modelseedpy/community/mscommfitting.py new file mode 100644 index 00000000..2a42d63d --- /dev/null +++ b/modelseedpy/community/mscommfitting.py @@ -0,0 +1,1091 @@ +# -*- coding: utf-8 -*- +from modelseedpy.fbapkg.mspackagemanager import MSPackageManager +from modelseedpy.core.exceptions import FeasibilityError +from pandas import read_table, read_csv, DataFrame +from optlang import Variable, Constraint, Objective, Model +from modelseedpy.core.fbahelper import FBAHelper +from scipy.constants import hour +from scipy.optimize import newton +from collections import OrderedDict +from zipfile import ZipFile, ZIP_LZMA +from optlang.symbolics import Zero +from sympy.core.add import Add +from matplotlib import pyplot + +# from pprint import pprint +from time import sleep, process_time +import numpy as np + +# from cplex import Cplex +import json, os, re + + +def _name(name, suffix, time, trial): + return "-".join([name + suffix, time, trial]) + + +class MSCommFitting: + def __init__(self): + ( + self.parameters, + self.variables, + self.constraints, + self.dataframes, + self.signal_species, + self.values, + ) = ({}, {}, {}, {}, {}, {}) + self.phenotypes_parsed_df: np.ndarray + self.problem: object + self.species_phenotypes_bool_df: object + self.zipped_output, self.plots = [], [] + + def _process_csv(self, csv_path, index_col): + self.zipped_output.append(csv_path) + csv = read_csv(csv_path) + csv.index = csv[index_col] + csv.drop(index_col, axis=1, inplace=True) + csv.astype(str) + return csv + + def load_data( + self, + community_members: dict = {}, + kbase_token: str = None, + solver: str = "glpk", + signal_tsv_paths: dict = {}, + phenotypes_csv_path: str = None, + media_conc_path: str = None, + species_abundance_path: str = None, + carbon_conc_series: dict = {}, + ignore_trials: dict = {}, + ignore_timesteps: list = [], + significant_deviation: float = 2, + zip_path: str = None, + ): + self.zipped_output = [] + if zip_path: + with ZipFile(zip_path, "r") as zp: + zp.extractall() + if species_abundance_path: + self.species_abundances = self._process_csv( + species_abundance_path, "trial_column" + ) + if phenotypes_csv_path: + # process a predefined exchanges table + self.zipped_output.append(phenotypes_csv_path) + fluxes_df = read_csv(phenotypes_csv_path) + fluxes_df.index = fluxes_df["rxn"] + to_drop = [col for col in fluxes_df.columns if " " in col] + for col in to_drop + ["rxn"]: + fluxes_df.drop(col, axis=1, inplace=True) + print( + f'The {to_drop+["rxn"]} columns were dropped from the phenotypes CSV.' + ) + + # import and process the media concentrations CSV + self.media_conc = self._process_csv(media_conc_path, "media_compound") + elif community_members: + # import the media for each model + models = OrderedDict() + ex_rxns: set = set() + species: dict = {} + # Using KBase media to constrain exchange reactions in model + for model, content in community_members.items(): + model.solver = solver + ex_rxns.update(model.exchanges) + species.update({content["name"]: content["phenotypes"].keys()}) + models[model] = [] + for media in content["phenotypes"].values(): + with model: # !!! Is this the correct method of parameterizing a media for a model? + pkgmgr = MSPackageManager.get_pkg_mgr(model) + pkgmgr.getpkg("KBaseMediaPkg").build_package( + media, default_uptake=0, default_excretion=1000 + ) + models[model].append(model.optimize()) + + # construct the parsed table of all exchange fluxes for each phenotype + fluxes_df = DataFrame( + data={ + "bio": [ + sol.fluxes["bio1"] + for solutions in models.values() + for sol in solutions + ] + }, + columns=["rxn"] + + [ + spec + "-" + phenotype + for spec, phenotypes in species.items() + for phenotype in phenotypes + ] + + [spec + "-stationary" for spec in species.keys()], + ) + fluxes_df.index.name = "rxn" + fluxes_df.drop("rxn", axis=1, inplace=True) + for ex_rxn in ex_rxns: + elements = [] + for model, solutions in models.items(): + for sol in solutions: + elements.append( + sol.fluxes[ex_rxn] if ex_rxn in sol.fluxes else 0 + ) + if any(np.array(elements) != 0): + fluxes_df.iloc[ex_rxn.id] = elements + + # define only species for which data is defined + signal_tsv_paths + modeled_species = list(signal_tsv_paths.values()) + modeled_species.remove("OD") + removed_phenotypes = [ + col + for col in fluxes_df + if not any([species in col for species in modeled_species]) + ] + for col in removed_phenotypes: + fluxes_df.drop(col, axis=1, inplace=True) + if removed_phenotypes != []: + print( + f"The {removed_phenotypes} phenotypes were removed since their species is not among those that are defined with data: {modeled_species}." + ) + fluxes_df.astype(str) + self.phenotypes_parsed_df = FBAHelper.parse_df(fluxes_df) + self.species_phenotypes_bool_df = DataFrame( + columns=self.phenotypes_parsed_df[1] + ) + + if "columns" not in carbon_conc_series: + carbon_conc_series["columns"] = {} + if "rows" not in carbon_conc_series: + carbon_conc_series["rows"] = {} + self.carbon_conc = carbon_conc_series + + self.parameters["data_timestep_hr"] = [] + if "columns" not in ignore_trials: + ignore_trials["columns"] = [] + if "rows" not in ignore_trials: + ignore_trials["rows"] = [] + if "wells" not in ignore_trials: + ignore_trials["wells"] = [] + ignore_trials["columns"] = list(map(str, ignore_trials["columns"])) + ignore_trials["rows"] = list(map(str, ignore_trials["rows"])) + ignore_timesteps = list(map(str, ignore_timesteps)) + for path, name in signal_tsv_paths.items(): + self.zipped_output.append(path) + signal = os.path.splitext(path)[0].split("_")[0] + # define the signal dataframe + self.signal_species[signal] = name # {name:phenotypes} + self.dataframes[signal] = read_table(path) + self.simulation_time = self.dataframes[signal].iloc[0, -1] / hour + self.parameters["data_timestep_hr"].append( + self.simulation_time / int(self.dataframes[signal].columns[-1]) + ) + self.dataframes[signal] = self.dataframes[signal].iloc[ + 1::2 + ] # excludes the times + self.dataframes[signal].index = self.dataframes[signal]["Well"] + # filter data contents + dropped_trials = [] + for trial in self.dataframes[signal].index: + if any( + [ + trial[0] in ignore_trials["rows"], + trial[1:] in ignore_trials["columns"], + trial in ignore_trials["wells"], + ] + ): + self.dataframes[signal].drop(trial, axis=0, inplace=True) + dropped_trials.append(trial) + if dropped_trials != []: + print( + f"The {dropped_trials} trials were dropped from the {name} measurements." + ) + for col in ["Plate", "Cycle", "Well"]: + self.dataframes[signal].drop(col, axis=1, inplace=True) + for col in self.dataframes[signal]: + if col in ignore_timesteps: + self.dataframes[signal].drop(col, axis=1, inplace=True) + if "OD" not in signal: + removed_trials = [] + for trial, row in self.dataframes[signal].iterrows(): + row_array = np.array(row.to_list()) + if row_array[-1] / row_array[0] < significant_deviation: + self.dataframes[signal].drop(trial, axis=0, inplace=True) + removed_trials.append(trial) + if removed_trials != []: + print( + f"The {removed_trials} trials were removed from the {name} measurements, with their deviation over time being less than the threshold of {significant_deviation}." + ) + + # process the data for subsequent operations and optimal efficiency + self.dataframes[signal].astype(str) + self.dataframes[signal]: np.ndarray = FBAHelper.parse_df( + self.dataframes[signal] + ) + + # differentiate the phenotypes for each species + if "OD" not in signal: + self.species_phenotypes_bool_df.loc[signal]: np.ndarray[int] = np.array( + [ + 1 if self.signal_species[signal] in pheno else 0 + for pheno in self.phenotypes_parsed_df[1] + ] + ) + + self.parameters["data_timestep_hr"] = sum( + self.parameters["data_timestep_hr"] + ) / len(self.parameters["data_timestep_hr"]) + self.data_timesteps = int( + self.simulation_time / self.parameters["data_timestep_hr"] + ) + + def define_problem( + self, + parameters={}, + zip_name: str = None, + export_parameters: bool = True, + export_lp: bool = True, + final_relative_carbon_conc: float = None, + metabolites_to_track: list = None, + ): + self.parameters.update( + { + "timestep_hr": self.parameters[ + "data_timestep_hr" + ], # Timestep size of the simulation in hours + "cvct": 1, # Coefficient for the minimization of phenotype conversion to the stationary phase. + "cvcf": 1, # Coefficient for the minimization of phenotype conversion from the stationary phase. + "bcv": 1, # This is the highest fraction of biomass for a given species that can change phenotypes in a single time step + "cvmin": 0, # This is the lowest value the limit on phenotype conversion goes, + "v": 1000, # the kinetics constant that is externally adjusted + "carbon_sources": ["cpd00136", "cpd00179"], # 4hb, maltose + "diffpos": 1, + "diffneg": 1, # objective coefficients to the diffpos and diffneg variables that correspond with the components of difference between experimental and predicted bimoass values + } + ) + self.parameters.update(parameters) + self.problem = Model() + print("Solver:", type(self.problem)) + trial: str + time: str + name: str + phenotype: str + met: str + obj_coef = {} + constraints: list = [] + variables: list = ( + [] + ) # lists are orders-of-magnitude faster than numpy arrays for appending + self.simulation_timesteps = list( + map( + str, + range( + 1, int(self.simulation_time / self.parameters["timestep_hr"]) + 1 + ), + ) + ) + time_1 = process_time() + for signal, parsed_df in self.dataframes.items(): + for met in self.phenotypes_parsed_df[0]: + met_id = re.sub("(\_\w\d+)", "", met) + met_id = met_id.replace("EX_", "", 1) + if ( + not metabolites_to_track + and met_id != "cpd00001" + or metabolites_to_track + and met_id in metabolites_to_track + ): + self.variables["c_" + met] = {} + self.constraints["dcc_" + met] = {} + initial_time = True + final_time = False + for time in self.simulation_timesteps: + if time == self.simulation_timesteps[-1]: + final_time = True + self.variables["c_" + met][time] = {} + self.constraints["dcc_" + met][time] = {} + for trial in parsed_df[0]: + # define biomass measurement conversion variables + self.variables["c_" + met][time][trial] = Variable( + _name("c_", met, time, trial), lb=0, ub=1000 + ) + # constrain initial time concentrations to the media or a large number if it is not explicitly defined + if ( + initial_time and not "bio" in met_id + ): # !!! the value of initial_time changes + initial_val = ( + self.media_conc.at[met_id, "mM"] + if met_id in list(self.media_conc.index) + else 100 + ) + if ( + met_id in self.carbon_conc["rows"] + and trial[0] in self.carbon_conc["rows"][met_id] + ): + initial_val = self.carbon_conc["rows"][met_id][ + trial[0] + ] + if ( + met_id in self.carbon_conc["columns"] + and trial[1:] in self.carbon_conc["columns"][met_id] + ): + initial_val = self.carbon_conc["columns"][met_id][ + trial[1:] + ] + self.variables["c_" + met][time][trial] = Variable( + _name("c_", met, time, trial), + lb=initial_val, + ub=initial_val, + ) + # mandate complete carbon consumption + if ( + final_time + and met_id in self.parameters["carbon_sources"] + ): + self.variables["c_" + met][time][trial] = Variable( + _name("c_", met, time, trial), lb=0, ub=0 + ) + if final_relative_carbon_conc: + self.variables["c_" + met][time][trial] = Variable( + _name("c_", met, time, trial), + lb=0, + ub=self.variables["c_" + met]["1"][trial].lb + * final_relative_carbon_conc, + ) + variables.append(self.variables["c_" + met][time][trial]) + initial_time = False + break # prevents duplicated variables + for signal, parsed_df in self.dataframes.items(): + if "OD" not in signal: + for phenotype in self.phenotypes_parsed_df[1]: + if self.signal_species[signal] in phenotype: + self.constraints["dbc_" + phenotype] = {} + for time in self.simulation_timesteps: + self.constraints["dbc_" + phenotype][time] = {} + + for phenotype in self.phenotypes_parsed_df[1]: + self.variables["cvt_" + phenotype] = {} + self.variables["cvf_" + phenotype] = {} + self.variables["b_" + phenotype] = {} + self.variables["g_" + phenotype] = {} + self.variables["v_" + phenotype] = {} + self.constraints["gc_" + phenotype] = {} + self.constraints["cvc_" + phenotype] = {} + for time in self.simulation_timesteps: + self.variables["cvt_" + phenotype][time] = {} + self.variables["cvf_" + phenotype][time] = {} + self.variables["b_" + phenotype][time] = {} + self.variables["g_" + phenotype][time] = {} + self.variables["v_" + phenotype][time] = {} + self.constraints["gc_" + phenotype][time] = {} + self.constraints["cvc_" + phenotype][time] = {} + for trial in parsed_df[0]: + self.variables["b_" + phenotype][time][ + trial + ] = Variable( # predicted biomass abundance + _name("b_", phenotype, time, trial), lb=0, ub=100 + ) + self.variables["g_" + phenotype][time][ + trial + ] = Variable( # biomass growth + _name("g_", phenotype, time, trial), lb=0, ub=1000 + ) + + if "stationary" not in phenotype: + self.variables["cvt_" + phenotype][time][ + trial + ] = Variable( # conversion rate to the stationary phase + _name("cvt_", phenotype, time, trial), lb=0, ub=100 + ) + self.variables["cvf_" + phenotype][time][ + trial + ] = Variable( # conversion from to the stationary phase + _name("cvf_", phenotype, time, trial), lb=0, ub=100 + ) + + # 0 <= -cvt + bcv*b_{phenotype} + cvmin + self.constraints["cvc_" + phenotype][time][trial] = Constraint( + -self.variables["cvt_" + phenotype][time][trial] + + self.parameters["bcv"] + * self.variables["b_" + phenotype][time][trial] + + self.parameters["cvmin"], + lb=0, + ub=None, + name=_name("cvc_", phenotype, time, trial), + ) + + # g_{phenotype} - b_{phenotype}*v = 0 + self.constraints["gc_" + phenotype][time][trial] = Constraint( + self.variables["g_" + phenotype][time][trial] + - self.parameters["v"] + * self.variables["b_" + phenotype][time][trial], + lb=0, + ub=0, + name=_name("gc_", phenotype, time, trial), + ) + + obj_coef.update( + { + self.variables["cvf_" + phenotype][time][ + trial + ]: self.parameters["cvcf"], + self.variables["cvt_" + phenotype][time][ + trial + ]: self.parameters["cvct"], + } + ) + variables.extend( + [ + self.variables["cvf_" + phenotype][time][trial], + self.variables["cvt_" + phenotype][time][trial], + ] + ) + constraints.extend( + [ + self.constraints["cvc_" + phenotype][time][trial], + self.constraints["gc_" + phenotype][time][trial], + ] + ) + + variables.extend( + [ + self.variables["b_" + phenotype][time][trial], + self.variables["g_" + phenotype][time][trial], + ] + ) + + # define non-concentration variables + half_dt = self.parameters["data_timestep_hr"] / 2 + time_2 = process_time() + print(f"Done with biomass loop: {(time_2-time_1)/60} min") + for parsed_df in self.dataframes.values(): + for r_index, met in enumerate(self.phenotypes_parsed_df[0]): + met_id = re.sub("(\_\w\d+)", "", met) + met_id = met_id.replace("EX_", "", 1) + if ( + not metabolites_to_track + and "cpd00001" != met_id + or metabolites_to_track + and met_id in metabolites_to_track + ): + for trial in parsed_df[0]: + last_column = False + for time in self.simulation_timesteps: + next_time = str(int(time) + 1) + if next_time == self.simulation_timesteps[-1]: + last_column = True + # c_{met} + dt*sum_k^K() - c+1_{met} = 0 + self.constraints["dcc_" + met][time][trial] = Constraint( + self.variables["c_" + met][time][trial] + - self.variables["c_" + met][next_time][trial] + + np.dot( + self.phenotypes_parsed_df[2][r_index] * half_dt, + np.array( + [ + self.variables["g_" + phenotype][time][ + trial + ] + + self.variables["g_" + phenotype][ + next_time + ][trial] + for phenotype in self.phenotypes_parsed_df[ + 1 + ] + ] + ), + ), + ub=0, + lb=0, + name=_name("dcc_", met, time, trial), + ) + + constraints.append( + self.constraints["dcc_" + met][time][trial] + ) + if last_column: + break + break # prevents duplicated constraints + + time_3 = process_time() + print(f"Done with metabolites loop: {(time_3-time_2)/60} min") + for signal, parsed_df in self.dataframes.items(): + data_timestep = 1 + self.variables[signal + "__conversion"] = Variable( + signal + "__conversion", lb=0, ub=1000 + ) + variables.append(self.variables[signal + "__conversion"]) + + self.variables[signal + "__bio"] = {} + self.variables[signal + "__diffpos"] = {} + self.variables[signal + "__diffneg"] = {} + self.constraints[signal + "__bioc"] = {} + self.constraints[signal + "__diffc"] = {} # diffc is defined latter + for time in self.simulation_timesteps: + if ( + int(time) * self.parameters["timestep_hr"] + >= data_timestep * self.parameters["data_timestep_hr"] + ): # synchronizes user timesteps with data timesteps + data_timestep += 1 + if int(data_timestep) > self.data_timesteps: + break + next_time = str(int(time) + 1) + self.variables[signal + "__bio"][time] = {} + self.variables[signal + "__diffpos"][time] = {} + self.variables[signal + "__diffneg"][time] = {} + self.constraints[signal + "__bioc"][time] = {} + self.constraints[signal + "__diffc"][time] = {} + for r_index, trial in enumerate(parsed_df[0]): + total_biomass: Add = 0 + signal_sum: Add = 0 + from_sum: Add = 0 + to_sum: Add = 0 + for phenotype in self.phenotypes_parsed_df[1]: + total_biomass += self.variables["b_" + phenotype][time][ + trial + ] + val = ( + 1 + if "OD" in signal + else self.species_phenotypes_bool_df.loc[ + signal, phenotype + ] + ) + signal_sum += ( + val * self.variables["b_" + phenotype][time][trial] + ) + if all( + [ + "OD" not in signal, + self.signal_species[signal] in phenotype, + "stationary" not in phenotype, + ] + ): + from_sum += ( + val + * self.variables["cvf_" + phenotype][time][trial] + ) + to_sum += ( + val + * self.variables["cvt_" + phenotype][time][trial] + ) + for phenotype in self.phenotypes_parsed_df[1]: + if ( + "OD" not in signal + and self.signal_species[signal] in phenotype + ): + if "stationary" in phenotype: + # b_{phenotype} - sum_k^K(es_k*cvf) + sum_k^K(pheno_bool*cvt) - b+1_{phenotype} = 0 + self.constraints["dbc_" + phenotype][time][ + trial + ] = Constraint( + self.variables["b_" + phenotype][time][trial] + - from_sum + + to_sum + - self.variables["b_" + phenotype][next_time][ + trial + ], + ub=0, + lb=0, + name=_name("dbc_", phenotype, time, trial), + ) + else: + # -b_{phenotype} + dt*g_{phenotype} + cvf - cvt - b+1_{phenotype} = 0 + self.constraints["dbc_" + phenotype][time][ + trial + ] = Constraint( + self.variables["b_" + phenotype][time][trial] + - self.variables["b_" + phenotype][next_time][ + trial + ] + + half_dt + * ( + self.variables["g_" + phenotype][time][ + trial + ] + + self.variables["g_" + phenotype][ + next_time + ][trial] + ) + + self.variables["cvf_" + phenotype][time][ + trial + ] + - self.variables["cvt_" + phenotype][time][ + trial + ], + ub=0, + lb=0, + name=_name("dbc_", phenotype, time, trial), + ) + + constraints.append( + self.constraints["dbc_" + phenotype][time][trial] + ) + + self.variables[signal + "__bio"][time][trial] = Variable( + _name(signal, "__bio", time, trial), lb=0, ub=1000 + ) + self.variables[signal + "__diffpos"][time][trial] = Variable( + _name(signal, "__diffpos", time, trial), lb=0, ub=100 + ) + self.variables[signal + "__diffneg"][time][trial] = Variable( + _name(signal, "__diffneg", time, trial), lb=0, ub=100 + ) + + # {signal}__conversion*datum = {signal}__bio + self.constraints[signal + "__bioc"][time][trial] = Constraint( + self.variables[signal + "__conversion"] + * parsed_df[2][r_index, int(data_timestep) - 1] + - self.variables[signal + "__bio"][time][trial], + name=_name(signal, "__bioc", time, trial), + lb=0, + ub=0, + ) + + # {speces}_bio - sum_k^K(es_k*b_{phenotype}) - {signal}_diffpos + {signal}_diffneg = 0 + self.constraints[signal + "__diffc"][time][trial] = Constraint( + self.variables[signal + "__bio"][time][trial] + - signal_sum + - self.variables[signal + "__diffpos"][time][trial] + + self.variables[signal + "__diffneg"][time][trial], + name=_name(signal, "__diffc", time, trial), + lb=0, + ub=0, + ) + + obj_coef.update( + { + self.variables[signal + "__diffpos"][time][ + trial + ]: self.parameters["diffpos"], + self.variables[signal + "__diffneg"][time][ + trial + ]: self.parameters["diffneg"], + } + ) + variables.extend( + [ + self.variables[signal + "__bio"][time][trial], + self.variables[signal + "__diffpos"][time][trial], + self.variables[signal + "__diffneg"][time][trial], + ] + ) + constraints.extend( + [ + self.constraints[signal + "__bioc"][time][trial], + self.constraints[signal + "__diffc"][time][trial], + ] + ) + + time_4 = process_time() + print(f"Done with the dbc & diffc loop: {(time_4-time_3)/60} min") + # construct the problem + self.problem.add(variables) + self.problem.update() + self.problem.add(constraints) + self.problem.update() + self.problem.objective = Objective(Zero, direction="min") # , sloppy=True) + self.problem.objective.set_linear_coefficients(obj_coef) + time_5 = process_time() + print( + f"Done with loading the variables, constraints, and objective: {(time_5-time_4)/60} min" + ) + + # print contents + if export_parameters: + self.zipped_output.append("parameters.csv") + DataFrame( + data=list(self.parameters.values()), + index=list(self.parameters.keys()), + columns=["values"], + ).to_csv("parameters.csv") + if export_lp: + self.zipped_output.extend(["mscommfitting.lp", "mscommfitting.json"]) + with open("mscommfitting.lp", "w") as lp: + lp.write(self.problem.to_lp()) + with open("mscommfitting.json", "w") as lp: + json.dump(self.problem.to_json(), lp, indent=3) + if zip_name: + self.zip_name = zip_name + sleep(2) + with ZipFile(self.zip_name, "w", compression=ZIP_LZMA) as zp: + for file in self.zipped_output: + zp.write(file) + os.remove(file) + + time_6 = process_time() + print(f"Done exporting the content: {(time_6-time_5)/60} min") + + def compute(self, graphs: list = [], zip_name=None): + solution = self.problem.optimize() + # categorize the primal values by trial and time + for variable, value in self.problem.primal_values.items(): + if "conversion" not in variable: + basename, time, trial = variable.split("-") + time = int(time) * self.parameters["data_timestep_hr"] + if not trial in self.values: + self.values[trial] = {} + if not basename in self.values[trial]: + self.values[trial][basename] = {} + self.values[trial][basename][time] = value + + # export the processed primal values for graphing + with open("primal_values.json", "w") as out: + json.dump(self.values, out, indent=3) + if not zip_name: + if hasattr(self, zip_name): + zip_name = self.zip_name + if zip_name: + with ZipFile(zip_name, "a", compression=ZIP_LZMA) as zp: + zp.write("primal_values.json") + os.remove("primal_values.json") + + if graphs != []: + self.graph(graphs, zip_name=zip_name) + + if "optimal" in solution: + print("The solution is optimal.") + else: + raise FeasibilityError( + f"The solution is sub-optimal, with a {solution} status." + ) + + def graph( + self, + graphs=[], + primal_values_filename: str = None, + primal_values_zip_path: str = None, + zip_name: str = None, + data_timestep_hr: float = 0.163, + ): + def add_plot(ax, labels, basename, trial): + labels.append(basename.split("-")[-1]) + ax.plot( + self.values[trial][basename].keys(), + self.values[trial][basename].values(), + label=basename, + ) + ax.legend(labels) + ax.set_xticks( + list(self.values[trial][basename].keys())[ + :: int(2 / data_timestep_hr / timestep_ratio) + ] + ) + return ax, labels + + timestep_ratio = 1 + if self.parameters != {}: + data_timestep_hr = self.parameters["data_timestep_hr"] + timestep_ratio = ( + self.parameters["data_timestep_hr"] / self.parameters["timestep_hr"] + ) + if primal_values_filename: + if primal_values_zip_path: + with ZipFile(primal_values_zip_path, "r") as zp: + zp.extract(primal_values_filename) + with open(primal_values_filename, "r", encoding="utf-8") as primal: + self.values = json.load(primal) + + # plot the content for desired trials + self.plots = [] + for graph in graphs: + if any([x in graph["content"] for x in ["total", "OD"]]): + ys = [] + print(graph) + pyplot.rcParams["figure.figsize"] = (11, 7) + pyplot.rcParams["figure.dpi"] = 150 + fig, ax = pyplot.subplots() + y_label = "Variable value" + x_label = "Time (hr)" + for trial, basenames in self.values.items(): + content = graph["content"] + if graph["content"] == "OD": + y_label = "Biomass (g)" + graph["phenotype"] = graph["species"] = "*" + elif "biomass" in graph["content"]: + content = "b" + y_label = "Biomass (g)" + elif graph["content"] == "growth": + content = "g" + y_label = "Biomass (g/hr)" + elif "stress-test" in graph["content"]: + content = graph["content"].split("_")[1] + y_label = graph["species"] + " coculture %" + x_label = content + " (mM)" + if trial == graph["trial"]: + labels: list = [] + for basename in basenames: + # parse for non-concentration variables + if any([x in graph["content"] for x in ["total", "OD"]]): + if "b_" in basename: + if graph["content"] == "OD": + labels.append("predicted") + label = "predicted" + xs = np.array( + list(self.values[trial][basename].keys()) + ) + ys.append( + np.array( + list(self.values[trial][basename].values()) + ) + ) + elif graph["content"] == "total": + if graph["species"] in basename: + labels.append("total_biomass") + label = "total_biomass" + xs = np.array( + list(self.values[trial][basename].keys()) + ) + ys.append( + np.array( + list( + self.values[trial][ + basename + ].values() + ) + ) + ) + if ( + "experimental_data" in graph + and graph["experimental_data"] + ): + if basename == "OD__bio": + labels.append("experimental") + exp_xs = np.array( + list(self.values[trial][basename].keys()) + ) + exp_xs = exp_xs.astype(np.float32) + exp_xs = np.around(exp_xs, 2) + ax.plot( + exp_xs, + list(self.values[trial][basename].values()), + label="experimental", + ) + ax.set_xticks( + exp_xs[ + :: int( + 2 / data_timestep_hr / timestep_ratio + ) + ] + ) + elif graph["phenotype"] == "*" and all( + [x in basename for x in [graph["species"], content]] + ): + if "total" in graph["content"]: + labels = [basename] + xs = np.array(list(self.values[trial][basename].keys())) + ys.append( + np.array( + list(self.values[trial][basename].values()) + ) + ) + else: + ax, labels = add_plot(ax, labels, basename, trial) + print("1") + # + elif all( + [ + x in basename + for x in [graph["species"], graph["phenotype"], content] + ] + ): + ax, labels = add_plot(ax, labels, basename, trial) + print("2") + # concentration plots + elif "EX_" in basename and graph["content"] in basename: + ax, labels = add_plot(ax, labels, basename, trial) + y_label = "Concentration (mM)" + print("3") + + if labels != []: + if any([x in graph["content"] for x in ["total", "OD"]]): + xs = xs.astype(np.float32) + xs = np.around(xs, 2) + ax.plot(xs, sum(ys), label=label) + ax.set_xticks( + xs[:: int(2 / data_timestep_hr / timestep_ratio)] + ) + phenotype_id = ( + graph["phenotype"] + if graph["phenotype"] != "*" + else "all phenotypes" + ) + species_id = ( + graph["species"] + if graph["species"] != "*" + else "all species" + ) + ax.set_xlabel(x_label) + ax.set_ylabel(y_label) + if len(labels) > 1: + ax.legend() + ax.set_title( + f'{graph["content"]} of {species_id} ({phenotype_id}) in the {trial} trial' + ) + fig_name = f'{"_".join([trial, species_id, phenotype_id, graph["content"]])}.jpg' + fig.savefig(fig_name) + self.plots.append(fig_name) + + # combine the figures with the other cotent + if not zip_name: + if hasattr(self, zip_name()): + zip_name = self.zip_name + if zip_name: + with ZipFile(zip_name, "a", compression=ZIP_LZMA) as zp: + for plot in self.plots: + zp.write(plot) + os.remove(plot) + + def load_model( + self, mscomfit_json_path: str, zip_name: str = None, class_object: bool = False + ): + if zip_name: + with ZipFile(zip_name, "r") as zp: + zp.extract(mscomfit_json_path) + with open(mscomfit_json_path, "r") as mscmft: + model = Model.from_json(json.load(mscmft)) + if class_object: + self.problem = model + return model + + def change_parameters( + self, + cvt=None, + cvf=None, + diff=None, + vmax=None, + mscomfit_json_path="mscommfitting.json", + export_zip_name=None, + extract_zip_name=None, + final_concentrations: dict = None, + final_relative_carbon_conc: float = None, + previous_relative_conc: float = None, + ): + def change_param(arg, param, time, trial): + if param: + if not isinstance(param, dict): + arg[0]["value"] = param + else: + if time in param: + if trial in param[time]: + arg[0]["value"] = param[time][trial] + arg[0]["value"] = param[time] + else: + arg[0]["value"] = param["default"] + return arg + + time_1 = process_time() + if not export_zip_name: + export_zip_name = self.zip_name + if not os.path.exists(mscomfit_json_path): + if not extract_zip_name: + extract_zip_name = self.zip_name + with ZipFile(extract_zip_name, "r") as zp: + zp.extract(mscomfit_json_path) + with open(mscomfit_json_path, "r") as mscmft: + mscomfit_json = json.load(mscmft) + else: + with open("mscommfitting.json", "r") as mscmft: + mscomfit_json = json.load(mscmft) + + time_2 = process_time() + print(f"Done loading the JSON: {(time_2-time_1)/60} min") + + # change objective coefficients + for arg in mscomfit_json["objective"]["expression"]["args"]: + name, time, trial = arg["args"][1]["name"].split("-") + if "cvf" in name: + arg["args"] = change_param(arg["args"], cvf, time, trial) + elif "cvt" in name: + arg["args"] = change_param(arg["args"], cvt, time, trial) + elif "diff" in name: + arg["args"] = change_param(arg["args"], diff, time, trial) + + # change final concentrations + if final_concentrations: # absolute concentration + for met in mscomfit_json["variables"]: + name, time, trial = met["name"].split("-") + if ( + name in final_concentrations + and time == self.simulation_timesteps[-1] + ): + met["lb"] = 0 + met["ub"] = final_concentrations[met] + + if final_relative_carbon_conc: # relative concentration + for met in mscomfit_json["variables"]: + if "EX_" in met["name"]: + name, time, trial = met["name"].split("-") + if ( + any([x in name for x in self.parameters["carbon_sources"]]) + and time == self.simulation_timesteps[-1] + ): + print(met["ub"]) + met["lb"] = 0 + met["ub"] *= final_relative_carbon_conc + if previous_relative_conc: + met["ub"] /= previous_relative_conc + print(met["ub"]) + + # change Vmax values + for arg in mscomfit_json["constraints"]: + name, time, trial = arg["name"].split("-") + if "gc" in name: + arg["expression"]["args"][1]["args"] = change_param( + arg["expression"]["args"][1]["args"], vmax, time, trial + ) + + with open(mscomfit_json_path, "w") as mscmft: + json.dump(mscomfit_json, mscmft, indent=3) + with ZipFile(export_zip_name, "a", compression=ZIP_LZMA) as zp: + zp.write(mscomfit_json_path) + os.remove(mscomfit_json_path) + time_3 = process_time() + print(f"Done exporting the model: {(time_3-time_2)/60} min") + + self.problem = Model.from_json(mscomfit_json) + time_4 = process_time() + print( + f"Done loading the model: {(time_4-time_3)/60} min" + ) # ~1/2 the defining a new problem + + def introduce_km( + self, vmax, km, met, graphs, zipname, extract_zipname + ): # Good starting values to try are: vmax = 3.75; km = 2.5 : Equivalent of vmax = 0.5 because at starting maltose of 5 this is vmax/(km + [maltose]) = 3.75/(2.5+5) = 0.5 + vmax_var = {"default": -0.3} + last_conc = {} + count = 0 + while 1: # Dangerous - if there's never convergence, then this never stops + error = None + for t in self.variables["c_" + met]: + if t not in vmax_var: + vmax_var[t] = {} + if t not in last_conc: + last_conc[t] = {} + for trial in self.variables["c_" + met][t]: + if trial in last_conc[t]: + error += ( + last_conc[t][trial] + - self.variables["c_" + met][t][trial].primal + ) ** 2 + last_conc[t][trial] = self.variables["c_" + met][t][trial].primal + vmax_var[t][trial] = -1 * vmax / (km + last_conc[t][trial]) + count += 1 + # Not sure if I'm using the vmax argument right here... please check + self.change_parameters( + vmax_var, zipname, extract_zipname + ) # The Vmax argument can be either a number or a dictionary that is organized by ["time"]["trial"], just as the naming scheme of the variables and constraints + self.compute(graphs, zipname) + if error: + error = (error / count) ** 0.5 + print("Error:", error) + if ( + error < 1 + ): # Definitely don't know what the error threshold should actually be for convergence + break + + def parameter_optimization( + self, + ): + with ZipFile(self.zip_name, "r") as zp: + zp.extract("mscommfitting.json") + + newton diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index c2b5ab6f..b42b2559 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -1,82 +1,71 @@ # -*- coding: utf-8 -*- from modelseedpy.fbapkg.mspackagemanager import MSPackageManager -from modelseedpy.community.mscompatibility import MSCompatibility from modelseedpy.core.msmodelutl import MSModelUtil +from modelseedpy.community.mssteadycom import MSSteadyCom +from modelseedpy.community.commhelper import build_from_species_models +from modelseedpy.core.exceptions import ( + ObjectAlreadyDefinedError, + FeasibilityError, + NoFluxError, +) from modelseedpy.core.msgapfill import MSGapfill from modelseedpy.core.fbahelper import FBAHelper # from modelseedpy.fbapkg.gapfillingpkg import default_blacklist -from modelseedpy.core import MSATPCorrection -from cobra import Model, Reaction, Metabolite +from modelseedpy.core.msatpcorrection import MSATPCorrection +from cobra.io import save_matlab_model, write_sbml_model from cobra.core.dictlist import DictList -from cobra.io import save_matlab_model -from itertools import combinations from optlang.symbolics import Zero -from matplotlib import pyplot +from optlang import Constraint from pandas import DataFrame from pprint import pprint +from cobra import Reaction import logging -# import itertools -import cobra -import networkx -import sigfig -import re, os - logger = logging.getLogger(__name__) -class CommunityModelSpecies: - def __init__( - self, - community, # MSCommunity environment - biomass_cpd, # metabolite in the biomass reaction - names=[], # names of the community species #TODO - look into whether there should be a names field - name=None, # the name of a species - index=None, # the index of the species - ): +class CommunityMember: + def __init__(self, community, biomass_cpd, name=None, index=None, abundance=0): self.community, self.biomass_cpd = community, biomass_cpd - print(self.biomass_cpd.compartment) - self.index = int( - self.biomass_cpd.compartment[1:] - ) # if index is None else index - self.abundance = 0 + self.index = index or int(self.biomass_cpd.compartment[1:]) + self.abundance = abundance if self.biomass_cpd in self.community.primary_biomass.metabolites: self.abundance = abs( self.community.primary_biomass.metabolites[self.biomass_cpd] ) if name: self.id = name - elif self.index < len(names): - self.id = names[self.index - 1] + elif "species_name" in self.biomass_cpd.annotation: + self.id = self.biomass_cpd.annotation["species_name"] else: - if "species_name" in self.biomass_cpd.annotation: - self.id = self.biomass_cpd.annotation["species_name"] - else: - self.id = "Species" + str(self.index) + self.id = "Species" + str(self.index) logger.info("Making atp hydrolysis reaction for species: " + self.id) - atp_rxn = FBAHelper.add_atp_hydrolysis( - self.community.model, "c" + str(self.index) - ) - # FBAHelper.add_autodrain_reactions_to_self.community_model(self.community.model) # !!! FIXME This FBAHelper function is not defined. + atp_rxn = self.community.util.add_atp_hydrolysis("c" + str(self.index)) self.atp_hydrolysis = atp_rxn["reaction"] self.biomass_drain = None - self.biomasses = [] - for reaction in self.community.model.reactions: - if self.biomass_cpd in reaction.metabolites: - if ( - reaction.metabolites[self.biomass_cpd] == 1 - and len(reaction.metabolites) > 1 - ): - self.biomasses.append(reaction) + self.biomasses, self.reactions = [], [] + self.primary_biomass = None + for rxn in self.community.util.model.reactions: + rxnComp = FBAHelper.rxn_compartment(rxn) + if not rxnComp: + print(f"The reaction {rxn.id} strangely lacks a compartment.") + elif int(rxnComp[1:]) == self.index and "bio" not in rxn.name: + self.reactions.append(rxn) + if self.biomass_cpd in rxn.metabolites: + if rxn.metabolites[self.biomass_cpd] == 1 and len(rxn.metabolites) > 1: + self.biomasses.append(rxn) + if ( + len(self.biomasses) == 1 + ): # TODO make this condition more reflective of primary biomass + self.primary_biomass = rxn elif ( - len(reaction.metabolites) == 1 - and reaction.metabolites[self.biomass_cpd] < 0 + len(rxn.metabolites) == 1 and rxn.metabolites[self.biomass_cpd] < 0 ): - self.biomass_drain = reaction + self.biomass_drain = rxn - if len(self.biomasses) == 0: + if self.biomasses == []: logger.critical("No biomass reaction found for species " + self.id) if not self.biomass_drain: logger.info("Making biomass drain reaction for species: " + self.id) @@ -86,531 +75,214 @@ def __init__( lower_bound=0, upper_bound=100, ) - self.community.model.add_reactions([self.biomass_drain]) + self.community.util.model.add_reactions([self.biomass_drain]) self.biomass_drain.add_metabolites({self.biomass_cpd: -1}) self.biomass_drain.annotation["sbo"] = "SBO:0000627" def disable_species(self): for reaction in self.community.model.reactions: - if int(FBAHelper.rxn_compartment(reaction)[1:]) == self.index: + reaction_index = FBAHelper.rxn_compartment(reaction)[1:] + if int(reaction_index) == self.index: reaction.upper_bound = reaction.lower_bound = 0 def compute_max_biomass(self): if len(self.biomasses) == 0: logger.critical("No biomass reaction found for species " + self.id) - self.community.model.objective = self.community.model.problem.Objective( - Zero, direction="max" - ) - self.community.model.objective.set_linear_coefficients( - {self.biomasses[0].forward_variable: 1} - ) - if self.community.lp_filename != None: - self.community.print_lp( - self.community.lp_filename + "_" + self.id + "_Biomass" - ) + self.community.util.add_objective(self.primary_biomass.flux_expression) + if self.community.lp_filename: + self.community.print_lp(f"{self.community.lp_filename}_{self.id}_Biomass") return self.community.model.optimize() def compute_max_atp(self): if not self.atp_hydrolysis: logger.critical("No ATP hydrolysis found for species:" + self.id) - self.community.model.objective = self.community.model.problem.Objective( - Zero, direction="max" - ) - self.community.model.objective.set_linear_coefficients( - {self.atp_hydrolysis.forward_variable: 1} + self.community.util.add_objective( + Zero, coef={self.atp_hydrolysis.forward_variable: 1} ) if self.community.lp_filename: - self.community.print_lp(self.community.lp_filename + "_" + self.id + "_ATP") + self.community.print_lp(f"{self.community.lp_filename}_{self.id}_ATP") return self.community.model.optimize() class MSCommunity: def __init__( self, - model=None, # the model that will be defined - models: list = None, # the list of models that will be assembled into a community - names=[], - abundances=None, # names and abundances of the community species - pfba=True, # specify whether parsimonious FBA will be simulated - lp_filename=None, # specify a filename to create an lp file + model=None, + member_models: list = None, + ids=None, + abundances=None, + kinetic_coeff=2000, + flux_limit=300, + lp_filename=None, + printing=False, ): - # Setting model and package manager - self.model, self.lp_filename, self.pfba = model, lp_filename, pfba - self.pkgmgr = MSPackageManager.get_pkg_mgr(model) + self.lp_filename = lp_filename self.gapfillings = {} + # Define Data attributes as None - self.solution = ( - self.biomass_cpd - ) = ( - self.primary_biomass - ) = ( - self.biomass_drain - ) = ( - self.msgapfill - ) = ( - self.element_uptake_limit - ) = self.kinetic_coeff = self.modelseed_db_path = None - self.species = DictList() - # Computing data from model - msid_cobraid_hash = FBAHelper.msid_hash(model) + self.solution = self.biomass_cpd = self.primary_biomass = self.biomass_drain = ( + None + ) + self.msgapfill = self.element_uptake_limit = self.kinetic_coeff = ( + self.msdb_path + ) = None + # defining the models + if member_models is not None and model is None: + model = build_from_species_models(member_models, abundances=abundances) + if ids is None and member_models is not None: + ids = [mem.id for mem in member_models] + self.id = model.id + self.util = MSModelUtil(model, True) + self.pkgmgr = MSPackageManager.get_pkg_mgr(self.util.model) + msid_cobraid_hash = self.util.msid_hash() + # print(msid_cobraid_hash) + write_sbml_model(model, "test_comm.xml") + if "cpd11416" not in msid_cobraid_hash: - logger.critical("Could not find biomass compound") raise KeyError("Could not find biomass compound for the model.") other_biomass_cpds = [] for self.biomass_cpd in msid_cobraid_hash["cpd11416"]: - print(self.biomass_cpd) - if self.biomass_cpd.compartment == "c0": - for reaction in self.model.reactions: - if self.biomass_cpd in reaction.metabolites: - if ( - reaction.metabolites[self.biomass_cpd] == 1 - and len(reaction.metabolites) > 1 - ): - self.primary_biomass = reaction - elif ( - reaction.metabolites[self.biomass_cpd] < 0 - and len(reaction.metabolites) == 1 - ): - self.biomass_drain = reaction - else: - other_biomass_cpds.append(biomass_cpd) - for biomass_cpd in other_biomass_cpds: - species_obj = CommunityModelSpecies(self, biomass_cpd, names) - self.species.append(species_obj) - if abundances: - self.set_abundance(abundances) - - @staticmethod - def build_from_species_models( - models, mdlid=None, name=None, names=[], abundances=None - ): - """Merges the input list of single species metabolic models into a community metabolic model - - Parameters - ---------- - models : list - List of models to be merged into a community model - msdb_path : string - The path to the local version of the ModelSEED Database - model_id : string - String specifying community model ID - name : string - String specifying community model name - names : list - List of human readable names for models being merged - abundances : dict - Hash of relative abundances for input models in community model - - Returns - ------- - Cobra.Model - Community model object - - Raises - ------ - """ - # compatabilize the models - mscompat = MSCompatibility(modelseed_db_path=msdb_path) - models = mscompat.align_exchanges( - models, conflicts_file_name="exchanges_conflicts.json", model_names=names - ) - models = mscompat.standardize( - models, - conflicts_file_name="standardized_exchange_metabolites.json", - model_names=names, - ) - - # construct the new model - newmodel = Model(mdlid, name) - newutl = MSModelUtil(newmodel) - biomass_compounds = [] - biomass_index = 2 - biomass_indices = [1] - biomass_indices_dict = {} - new_metabolites, new_reactions = set(), set() - for model_index, model in enumerate(models): - model_reaction_ids = [rxn.id for rxn in model.reactions] - # model_index+=1 - print([rxn.id for rxn in model.reactions if "bio" in rxn.id]) - print(model_index, model.id) - # Rename metabolites - for met in model.metabolites: - # Renaming compartments - output = MSModelUtil.parse_id(met) - if output is None: - if met.compartment[0] != "e": - met.id += str(model_index) - met.compartment = met.compartment[0] + str(model_index) - else: - met.compartment = "e0" - else: - if output[2] == "": - if output[1] != "e": - met.id += str(model_index) - met.compartment += str(model_index) - elif output[1] == "e": - met.compartment = "e0" - else: - met.compartment = output[1] + str(model_index) - met.id = output[0] + "_" + output[1] + str(model_index) - new_metabolites.add(met) - if "cpd11416_c" in met.id: - print(met.id, model.id) - biomass_compounds.append(met) - # Rename reactions - for rxn in model.reactions: - if rxn.id[0:3] != "EX_": - if re.search("^(bio)(\d+)$", rxn.id): - print(biomass_indices) - index = int(rxn.id.removeprefix("bio")) - if index not in biomass_indices: - biomass_indices.append(index) - biomass_indices_dict[model.id] = index - print(rxn.id, "2") - else: - rxn_id = "bio" + str(biomass_index) - if rxn_id not in model_reaction_ids: - print(rxn_id, "1") - rxn.id = rxn_id - biomass_indices.append(biomass_index) - biomass_indices_dict[model.id] = index - else: - print(rxn_id, "3") - for i in range(len(models) * 2): - rxn_id = "bio" + str(i) - if ( - rxn_id not in model_reaction_ids - and i not in biomass_indices - ): - rxn.id = rxn_id - biomass_indices.append(i) - biomass_indices_dict[model.id] = i - break - biomass_index += 1 - else: - output = MSModelUtil.parse_id(rxn) - if output is None: - if "e" not in rxn.compartment.id: - rxn.id += str(model_index) - elif output[1] != "e": - rxn.id = output[0] + "_" + output[1] + str(model_index) - if output[2] == "": - rxn.id = rxn.id + str(model_index) - new_reactions.add(rxn) - # Adding new reactions and compounds to base model - newmodel.add_reactions(FBAHelper.filter_cobra_set(new_reactions)) - newmodel.add_metabolites(FBAHelper.filter_cobra_set(new_metabolites)) - - # Create community biomass - comm_biomass = Metabolite("cpd11416_c0", None, "Community biomass", 0, "c0") - metabolites = {comm_biomass: 1} - metabolites.update( - {cpd: -1 / len(biomass_compounds) for cpd in biomass_compounds} + if "c0" in self.biomass_cpd.id: + for rxn in self.util.model.reactions: + if self.biomass_cpd not in rxn.metabolites: + continue + print(self.biomass_cpd, rxn, end=";\t") + if ( + rxn.metabolites[self.biomass_cpd] == 1 + and len(rxn.metabolites) > 1 + ): + if self.primary_biomass: + raise ObjectAlreadyDefinedError( + f"The primary biomass {self.primary_biomass} is already defined," + f"hence, the {rxn.id} cannot be defined as the model primary biomass." + ) + if printing: + print("primary biomass defined", rxn.id) + self.primary_biomass = rxn + elif ( + rxn.metabolites[self.biomass_cpd] < 0 + and len(rxn.metabolites) == 1 + ): + self.biomass_drain = rxn + elif "c" in self.biomass_cpd.compartment: + other_biomass_cpds.append(self.biomass_cpd) + # assign community members and their abundances + print() # this returns the carriage after the tab-ends in the biomass compound printing + abundances = abundances or [1 / len(other_biomass_cpds)] * len( + other_biomass_cpds ) - comm_biorxn = Reaction(id="bio1", name="bio1", lower_bound=0, upper_bound=100) - comm_biorxn.add_metabolites(metabolites) - newmodel.add_reactions([comm_biorxn]) - - # create a biomass sink reaction - newutl = MSModelUtil(newmodel) - newutl.add_exchanges_for_metabolites([comm_biomass], 0, 100, "SK_") - if cobra_model: - return newmodel, biomass_indices_dict - return ( - MSCommunity(model=newmodel, names=names, abundances=abundances), - biomass_indices_dict, + self.members = DictList( + CommunityMember( + community=self, + biomass_cpd=biomass_cpd, + name=ids[memIndex], + abundance=abundances[memIndex], + ) + for memIndex, biomass_cpd in enumerate(other_biomass_cpds) ) + # assign the MSCommunity constraints and objective + self.abundances_set = False + if isinstance(abundances, dict): + self.set_abundance(abundances) + self.pkgmgr.getpkg("CommKineticPkg").build_package(kinetic_coeff, self) + for member in self.members: + vars_coef = {} + for rxn in self.util.model.reactions: + if ( + "EX_" not in rxn.id + and member.index == FBAHelper.rxn_compartment(rxn)[1:] + ): + vars_coef[rxn.forward_variable] = vars_coef[ + rxn.reverse_variable + ] = 1 + print(member.id, flux_limit, member.abundance) + self.util.create_constraint( + Constraint( + Zero, + lb=0, + ub=flux_limit * member.abundance, + name=f"{member.id}_resource_balance", + ), + coef=vars_coef, + ) # Manipulation functions def set_abundance(self, abundances): - # ensure normalization - total_abundance = sum([abundances[species] for species in abundances]) + # calculate the normalized biomass + total_abundance = sum(list(abundances.values())) # map abundances to all species - for species in abundances: - abundances[species] = abundances[species] / total_abundance - if species in self.species: - self.species.get_by_id(species).abundance = abundances[species] + for species, abundance in abundances.items(): + if species in self.members: + self.members.get_by_id(species).abundance = abundance / total_abundance # remake the primary biomass reaction based on abundances - if self.primary_biomass == None: + if self.primary_biomass is None: logger.critical("Primary biomass reaction not found in community model") - all_metabolites = {self.biomass_cpd: 1} - for species in self.species: - all_metabolites[species.biomass_cpd] = -1 * abundances[species.id] + all_metabolites = {self.primary_biomass.products[0]: 1} + all_metabolites.update( + { + mem.biomass_cpd: -abundances[mem.id] / total_abundance + for mem in self.members + } + ) self.primary_biomass.add_metabolites(all_metabolites, combine=False) - - def set_objective( - self, target=None, minimize=False - ): #!!! Mustn't a multilevel objective be set for community models? - if target == None: - target = self.primary_biomass.id - sense = "max" - if minimize: - sense = "min" - self.model.objective = self.model.problem.Objective( - self.model.reactions.get_by_id(target).flux_expression, direction=sense + self.abundances_set = True + + def set_objective(self, target=None, targets=None, minimize=False): + targets = targets or [ + self.util.model.reactions.get_by_id( + target or self.primary_biomass.id + ).flux_expression + ] + self.util.model.objective = self.util.model.problem.Objective( + sum(targets), direction="max" if not minimize else "min" ) - def constrain( - self, element_uptake_limit=None, kinetic_coeff=None, modelseed_db_path=None - ): - # applying uptake constraints - self.element_uptake_limit = element_uptake_limit + def constrain(self, element_uptake_limit=None, thermo_params=None, msdb_path=None): if element_uptake_limit: + self.element_uptake_limit = element_uptake_limit self.pkgmgr.getpkg("ElementUptakePkg").build_package(element_uptake_limit) - # applying kinetic constraints - self.kinetic_coeff = kinetic_coeff - if kinetic_coeff: - self.pkgmgr.getpkg("CommKineticPkg").build_package(kinetic_coeff, self) - # applying FullThermo constraints - self.modelseed_db_path = modelseed_db_path - if modelseed_db_path: - self.pkgmgr.getpkg("FullThermoPkg").build_package( - {"modelseed_db_path": modelseed_db_path} - ) - - # Utility functions - def print_lp(self, filename=None): - if not filename: - filename = self.lp_filename - if filename: - with open(filename + ".lp", "w") as out: - out.write(str(self.model.solver)) - out.close() + if thermo_params: + if msdb_path: + self.msdb_path = msdb_path + thermo_params.update({"modelseed_db_path": msdb_path}) + self.pkgmgr.getpkg("FullThermoPkg").build_package(thermo_params) + else: + self.pkgmgr.getpkg("SimpleThermoPkg").build_package(thermo_params) - def compute_interactions( + def interactions( self, - solution=None, # the COBRA simulation solution that will be parsed and visualized - threshold: int = 1, #!!! What is this threshold? - visualize: bool = True, # specifies whether the net flux will be depicted in a network diagram - export_directory: str = None, # specifies the directory to which the network diagram and associated datatable will be exported, where None does not export the content - node_metabolites: bool = True, # specifies whether the metabolites of each node will be printed - x_offset: float = 0.15, # specifies the x-axis buffer between each species node and its metabolite list in the network diagram - show_figure: bool = True, # specifies whether the figure will be printed to the console - ): - # Check for solution - if not solution: - solution = self.solution - if not solution: - logger.warning("No feasible solution!") - return None - - # Initialize data - metabolite_data, species_data, species_collection = ( - {}, - {"Environment": {}}, - {"Environment": {}}, - ) - data = {"IDs": [], "Metabolites/Donor": [], "Environment": []} - met_list, species_list = [], [None for i in range(1000)] - - # establish spreadsheet infrastructure for only extracellular metabolites - for met in self.model.metabolites: - if met.compartment == "e0": - met_list.append(met) - data["IDs"].append(met.id) - data["Metabolites/Donor"].append(met.name) - - metabolite_data[met] = {} - metabolite_data[met]["Environment"] = 0 - for individual in self.species: - metabolite_data[met][individual.id] = 0 - - for individual in self.species: - species_data[individual.id], species_collection[individual.id] = {}, {} - species_list[individual.index] = individual - data[individual.id] = [] - data["IDs"].append(individual.index) - data["Metabolites/Donor"].append(individual.id) - for other in self.species: - species_data[individual.id][other.id] = 0 - species_collection[individual.id][other.id] = [] - - species_data["Environment"][individual.id] = species_data[individual.id][ - "Environment" - ] = 0 - ( - species_collection["Environment"][individual.id], - species_collection[individual.id]["Environment"], - ) = ([], []) - - data["IDs"].append("Environment") - data["Metabolites/Donor"].append("Environment") - for individual in self.species: - data["IDs"].append(individual.index) - data["Metabolites/Donor"].append(individual.id + " list") - - # computing net metabolite flux from each reaction - for rxn in self.model.reactions: - if rxn.id[0:3] == "EX_" and abs(solution.fluxes[rxn.id]) > Zero: - cpd = list(rxn.metabolites.keys())[0] - if cpd in metabolite_data: - metabolite_data[cpd]["Environment"] += -1 * solution.fluxes[rxn.id] - if len(rxn.id.split("_")) > 1: - comp_index = int(rxn.id.split("_")[-1][1:]) - for metabolite in rxn.metabolites: - if metabolite in metabolite_data: - if species_list[comp_index] != None: - metabolite_data[metabolite][ - species_list[comp_index].id - ] += (solution.fluxes[rxn.id] * rxn.metabolites[metabolite]) - - # translating net metbaolite flux into species interaction flux - for met in metabolite_data: - # Iterating through the metabolite producers - total = sum( - [ - metabolite_data[met][individual.id] - for individual in self.species - if metabolite_data[met][individual.id] > Zero - ] - ) - if metabolite_data[met]["Environment"] > Zero: - total += metabolite_data[met]["Environment"] - for individual in self.species: - if metabolite_data[met][individual.id] > Zero: - # calculate the total net flux between each combination of species, and track the involved metabolites - for other in self.species: - if metabolite_data[met][other.id] < Zero: - normalized_flux = ( - abs( - metabolite_data[met][individual.id] - * metabolite_data[met][other.id] - ) - / total - ) - species_data[individual.id][other.id] += normalized_flux - if normalized_flux > threshold: - species_collection[individual.id][other.id].append( - met.name - ) - # calculate the total net flux between the species and the environment, and track the involved metabolites - if metabolite_data[met]["Environment"] < Zero: - normalized_flux = ( - abs( - metabolite_data[met][individual.id] - * metabolite_data[met]["Environment"] - ) - / total - ) - species_data[individual.id]["Environment"] += normalized_flux - if normalized_flux > threshold: - species_collection[individual.id]["Environment"].append( - met.name - ) - if metabolite_data[met]["Environment"] > Zero: - for individual in self.species: - if metabolite_data[met][individual.id] < Zero: - normalized_flux = ( - abs( - metabolite_data[met]["Environment"] - * metabolite_data[met][individual.id] - ) - / total - ) - species_data["Environment"][individual.id] += normalized_flux - if normalized_flux > threshold: - species_collection["Environment"][individual.id].append( - met.name - ) - - # construct a dataframe - for met in met_list: - for individual in self.species: - data[individual.id].append(metabolite_data[met][individual.id]) - data["Environment"].append(metabolite_data[met]["Environment"]) - for individual in self.species: - for other in self.species: - data[individual.id].append(species_data[individual.id][other.id]) - data[individual.id].append(species_data[individual.id]["Environment"]) - for individual in self.species: - data["Environment"].append(species_data["Environment"][individual.id]) - data["Environment"].append(0) - for individual in self.species: - for other in self.species: - data[individual.id].append( - "; ".join(species_collection[individual.id][other.id]) - ) - data[individual.id].append( - "; ".join(species_collection[individual.id]["Environment"]) - ) - for individual in self.species: - data["Environment"].append( - "; ".join(species_collection["Environment"][individual.id]) - ) - data["Environment"].append(0), data["IDs"].append("Environment list"), data[ - "Metabolites/Donor" - ].append("Environment list") - - self.cross_feeding_df = DataFrame(data) - logger.info(self.cross_feeding_df) - - # graph the network diagram - if visualize: - self._visualize_cross_feeding( - export_directory, node_metabolites, x_offset, show_figure - ) - - return self.cross_feeding_df - - def _visualize_cross_feeding( - self, export_directory, node_metabolites=True, x_offset=0.15, show_figure=True + solution=None, + media=None, + msdb=None, + msdb_path=None, + filename=None, + figure_format="svg", + node_metabolites=True, + flux_threshold=1, + visualize=True, + ignore_mets=None, ): - # construct an efficient DataFrame of the cross-feeding interactions - net_cross_feeding = {} - for index, row in self.cross_feeding_df.iterrows(): - if re.search("Species\d+", row["Metabolites/Donor"]): - net_cross_feeding[row["Metabolites/Donor"]] = row[len(self.species) :] - - # define species and the metabolite fluxes - net_cross_feeding = DataFrame(net_cross_feeding) - self.graph = networkx.Graph() - species_nums = {} - for species in self.species: - species_nums[species.index] = set() - self.graph.add_node(species.index) - for index, entry in net_cross_feeding[ - f"Species{species.index} list" - ].iteritems(): - if ( - "Species" in index - and re.search("(\d+)", index).group() != species.index - ): - species_nums[species.index].update(entry.split("; ")) - - # define the net fluxes for each combination of two species - for species_1, species_2 in combinations(list(species_nums.keys()), 2): - species_2_to_1 = net_cross_feeding.at[ - f"Species{species_2}", f"Species{species_1}" - ] - species_1_to_2 = net_cross_feeding.at[ - f"Species{species_1}", f"Species{species_2}" - ] - interaction_net_flux = sigfig.round(species_2_to_1 - species_1_to_2, 3) - self.graph.add_edge( - species_1, species_2, flux=interaction_net_flux - ) # The graph plots directionally toward the larger numbered species - - # compose the nextwork diagram of net fluxes - self.pos = networkx.circular_layout(self.graph) - if node_metabolites: - for species in self.pos: - x, y = self.pos[species] - metabolites = "\n".join(species_nums[species]) - pyplot.text(x + x_offset, y, metabolites) - networkx.draw_networkx(self.graph, self.pos) - self.labels = networkx.get_edge_attributes(self.graph, "flux") - networkx.draw_networkx_edge_labels( - self.graph, self.pos, edge_labels=self.labels + return MSSteadyCom.interactions( + self, + solution or self.solution, + media, + flux_threshold, + msdb, + msdb_path, + visualize, + filename, + figure_format, + node_metabolites, + True, + ignore_mets, ) - if export_directory: - pyplot.savefig(os.path.join(export_directory, "cross_feeding_diagram.svg")) - self.cross_feeding_df.to_csv( - os.path.join(export_directory, "cross_feeding.csv") - ) - - if show_figure: - pyplot.show() + # Utility functions + def print_lp(self, filename=None): + filename = filename or self.lp_filename + with open(filename + ".lp", "w") as out: + out.write(str(self.util.model.solver)) + out.close() # Analysis functions def gapfill( @@ -618,145 +290,130 @@ def gapfill( media=None, target=None, minimize=False, - default_gapfill_templates=[], - default_gapfill_models=[], - test_conditions=[], - reaction_scores={}, - blacklist=[], + default_gapfill_templates=None, + default_gapfill_models=None, + test_conditions=None, + reaction_scores=None, + blacklist=None, suffix=None, - solver="glpk", + solver: str = "glpk", ): + default_gapfill_templates = default_gapfill_templates or [] + default_gapfill_models = default_gapfill_models or [] + test_conditions, blacklist = test_conditions or [], blacklist or [] + reaction_scores = reaction_scores or {} if not target: target = self.primary_biomass.id self.set_objective(target, minimize) - gfname = FBAHelper.medianame(media) + "-" + target + gfname = FBAHelper.mediaName(media) + "-" + target if suffix: gfname += f"-{suffix}" self.gapfillings[gfname] = MSGapfill( - self.model, + self.util.model, default_gapfill_templates, default_gapfill_models, test_conditions, reaction_scores, blacklist, + solver, ) - gfresults = self.gapfillings[gfname].run_gapfilling( - media, target, solver=solver - ) - if not gfresults: - logger.critical( - "Gapfilling failed with the specified model, media, and target reaction." - ) - return None + gfresults = self.gapfillings[gfname].run_gapfilling(media, target) + assert ( + gfresults + ), f"Gapfilling of {self.util.model.id} in {gfname} towards {target} failed." return self.gapfillings[gfname].integrate_gapfill_solution(gfresults) def test_individual_species( - self, media=None, allow_cross_feeding=True, run_atp=True, run_biomass=True + self, media=None, interacting=True, run_atp=True, run_biomass=True ): - self.pkgmgr.getpkg("KBaseMediaPkg").build_package(media) - # Iterating over species and running tests + assert run_atp or run_biomass, ValueError( + "Either the run_atp or run_biomass arguments must be True." + ) + # self.pkgmgr.getpkg("KBaseMediaPkg").build_package(media) + if media is not None: + self.util.add_medium(media) data = {"Species": [], "Biomass": [], "ATP": []} - for individual in self.species: + for individual in self.members: data["Species"].append(individual.id) - with self.model: # WITH, here, discards changes after each simulation - # If no interaction allowed, iterate over all other species and disable them - if not allow_cross_feeding: - for indtwo in self.species: - if indtwo != individual: - indtwo.disable_species() - if ( - run_biomass - ): # If testing biomass, setting objective to individual species biomass and optimizing + with self.util.model: + if not interacting: + for other in self.members: + if other != individual: + other.disable_species() + if run_biomass: data["Biomass"].append(individual.compute_max_biomass()) - if ( - run_atp - ): # If testing atp, setting objective to individual species atp and optimizing + if run_atp: data["ATP"].append(individual.compute_max_atp()) - df = DataFrame(data) - logger.info(df) - return df + return DataFrame(data) def atp_correction( - self, - core_template, - atp_medias, - atp_objective="bio2", - max_gapfilling=None, - gapfilling_delta=0, + self, core_template, atp_medias, max_gapfilling=None, gapfilling_delta=0 ): - self.atpcorrect = MSATPCorrection( - self.model, + self.atp = MSATPCorrection( + self.util.model, core_template, atp_medias, - atp_objective="bio2", - max_gapfilling=None, - gapfilling_delta=0, + "c0", + max_gapfilling, + gapfilling_delta, ) - def predict_abundances(self, media=None, pfba=True, kinetic_coeff=None): - with self.model: # WITH, here, discards changes after each simulation - if not kinetic_coeff: - kinetic_coeff = self.kinetic_coeff - if ( - not kinetic_coeff - ): # Kinetic coefficients must be used for this formulation to work - kinetic_coeff = 2000 - self.pkgmgr.getpkg("CommKineticPkg").build_package(kinetic_coeff, self) - - objcoef = {} - for species in self.species: - objcoef[species.biomasses[0].forward_variable] = 1 - new_objective = self.model.problem.Objective(Zero, direction="max") - self.model.objective = new_objective - new_objective.set_linear_coefficients(objcoef) - self.run(media, pfba) + # TODO evaluate the comparison of this method with MICOM + def predict_abundances(self, media=None, pfba=True): + with self.util.model: + self.util.model.objective = self.util.model.problem.Objective( + sum( + [ + species.primary_biomass.forward_variable + for species in self.members + ] + ), + direction="max", + ) + self.run_fba(media, pfba) return self._compute_relative_abundance_from_solution() - return None - def run(self, media, pfba=None): - self.pkgmgr.getpkg("KBaseMediaPkg").build_package(media) - self.print_lp() - save_matlab_model(self.model, self.model.name + ".mat") - if pfba or self.pfba: - self._set_solution(cobra.flux_analysis.pfba(self.model)) - else: - self._set_solution(self.model.optimize()) - if not self.solution: - return None - logger.info(self.model.summary()) - return self.solution + def run_fba(self, media=None, pfba=False, fva_reactions=None): + if media is not None: + self.util.add_medium(media) + return self._set_solution(self.util.run_fba(None, pfba, fva_reactions)) - # Internal functions def _compute_relative_abundance_from_solution(self, solution=None): if not solution and not self.solution: - logger.warning("No feasible solution!") + logger.warning("The simulation lacks any flux.") return None - data = {"Species": [], "Abundance": []} - totalgrowth = sum( - [self.solution.fluxes[species.biomasses[0].id] for species in self.species] + comm_growth = sum( + [self.solution.fluxes[member.primary_biomass.id] for member in self.members] ) - if totalgrowth == 0: - logger.warning("The community did not grow!") - return None - for species in self.species: - data["Species"].append(species.id) - data["Abundance"].append( - self.solution.fluxes[species.biomasses[0].id] / totalgrowth - ) - df = DataFrame(data) - logger.info(df) - return df + assert comm_growth > 0, NoFluxError( + f"The total community growth is {comm_growth}" + ) + return { + member.id: self.solution.fluxes[member.primary_biomass.id] / comm_growth + for member in self.members + } def _set_solution(self, solution): - self.solution = None if solution.status != "optimal": - logger.warning("No solution found for the simulation.") - return + FeasibilityError( + f"The solution is sub-optimal, with a(n) {solution} status." + ) + self.solution = None + self.print_lp() + save_matlab_model(self.util.model, self.util.model.name + ".mat") self.solution = solution + logger.info(self.util.model.summary()) + return self.solution - def steady_com( - self, - ): - from reframed.community import SteadyCom, SteadyComVA - - reframed_model = FBAHelper.get_reframed_model(self.model) + def parse_member_growths(self): + # f"cpd11416_c{member.index}" + return { + member.name: self.solution.fluxes[member.primary_biomass.id] + for member in self.members + } + + def return_member_models(self): + # TODO return a list of member models that is parsed from the .members attribute + ## which will have applicability in disaggregating community models that do not have member models + ## such as Filipe's Nitrate reducing community model for the SBI ENIGMA team. + return diff --git a/modelseedpy/community/mskineticsfba.py b/modelseedpy/community/mskineticsfba.py new file mode 100644 index 00000000..9309b455 --- /dev/null +++ b/modelseedpy/community/mskineticsfba.py @@ -0,0 +1,444 @@ +# -*- coding: utf-8 -*- + +from scipy.constants import milli, hour, minute, day, femto +from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg +from modelseedpy import MSModelUtil +from optlang import Constraint +from modelseedpy.core.fbahelper import FBAHelper +from collections import OrderedDict +from optlang.symbolics import Zero +from numpy import log10, nan, mean +from warnings import warn +from matplotlib import pyplot +from pprint import pprint +from datetime import date +from math import inf +import pandas +import json, re, os + + +def _x_axis_determination(total_time): + time = total_time * minute + if time <= 600: + return minute, "s" + if time > 600: + return 1, "min" + if time > 7200: + return 1 / hour, "hr" + return 1 / day, "days" + + +def _check_datum(datum): + if "substituted_rate_law" not in datum: + print(f"RateLawError: The {datum} datum lacks a rate law.") + return False + remainder = re.sub("([0-9A-Za-z/()e\-\+\.\*\_])", "", datum["substituted_rate_law"]) + if remainder != "": + print( + f'RateLawError: The {datum["substituted_rate_law"]}' + f" rate law contains unknown characters: {remainder}" + ) + return False + return True + + +class MSKineticsFBA: + def __init__( + self, + model, + warnings: bool = True, + verbose: bool = False, + printing: bool = False, + jupyter: bool = False, + ): + self.warnings, self.verbose, self.printing, self.jupyter = ( + warnings, + verbose, + printing, + jupyter, + ) + self.model_util = MSModelUtil(model) + self.met_ids = OrderedDict( + {met.id: met.id for met in self.model_util.model.metabolites} + ) + + def baseKinFBA( + self, + kinetics_path: str = None, + kinetics_data: dict = None, + initial_M: dict = None, # a dictionary of the initial metabolic concentrations, which supplants concentrations from the defined kinetics data + total_min: float = 200, + ts_min: float = 20, + export_name=None, + export_directory=None, + chemostat_L: float = None, + feed_profile: dict = None, + chemostat_L_hr: float = None, + temperature: float = 25, + p_h: float = 7, + cell_dry_g: float = 1.44e-13, + cellular_L: float = 1e-18, + conc_figure_title="Metabolic perturbation", + included_mets: list = None, + labeled_plots=True, + visualize=True, + export=True, + ): + # define the dataframe for the time series content + feed_profile, constrained, self.constraints = feed_profile or {}, {}, {} + included_mets, self.sols = included_mets or [], [] + self.parameters = { + "timesteps": int(total_min / ts_min), + "pH": p_h, + "temperature": temperature, + } + self.variables = {"elapsed_time": 0} + self.ts_min, self.minimum = ts_min, inf + timestep_hr = self.ts_min / (hour / minute) + self.constrained = OrderedDict() + cell_g_L = ( + cell_dry_g / cellular_L + ) # https://journals.asm.org/doi/full/10.1128/AEM.64.2.688-694.1998 + + # define reaction kinetics and initial concentrations + assert ( + kinetics_path or kinetics_data + ), "Either < kinetics_path > or < kinetics_data > must be provided" + if kinetics_path: + with open(kinetics_path) as data: + self.kinetics_data = json.load(data) + elif kinetics_data: + self.kinetics_data = kinetics_data.copy() + ## define the concentration, moles, and fluxes DataFrames + self.time = "0 min" + self.conc = pandas.DataFrame( + [0] * len(self.met_ids), + index=list(self.met_ids.keys()), + columns=[self.time], + ) + self.conc.index.name = "metabolite (mM)" + self.moles = self.conc.copy(deep=True) + self.fluxes = pandas.DataFrame( + index=[rxn.id for rxn in self.model_util.model.reactions], + columns=[self.time], + ) + self.fluxes.index.name = "reaction (\u0394mmol/hr*g_(dw)))" # Delta + ## parse the kinetics data + for content in self.kinetics_data.values(): + for condition, datum in content.items(): + if "initial_M" not in datum: + continue + for var, conc in datum["initial_M"].items(): + met_id = datum["met_id"][var] + if met_id in self.met_ids: + self.conc.at[met_id, self.time] += conc / milli + elif self.warnings: + warn( + f"KineticsError: The {met_id} reagent ({var}) in the" + f" {datum['substituted_rate_law']} rate law is not defined by the model." + ) + ## incorporate custom initial concentrations, which overwrites values from the kinetics data + for met_id in initial_M: + self.conc.at[met_id, self.time] = initial_M[met_id] / milli + defined_concs = self.conc[self.conc[self.time] != 0][self.time].to_dict() + chemostat_requirements = [ + chemostat_L is not None, + feed_profile != {}, + chemostat_L_hr is not None, + ] + # execute FBA for each timestep, then calculate custom fluxes, constrain the model, and update concentrations + model_rxns = [rxn.id for rxn in self.model_util.model.reactions] + newTime = 0 + for timestep in range(1, self.parameters["timesteps"] + 1): + oldTime = newTime + newTime = timestep * self.ts_min + t = timestep * timestep_hr + self.previous_time = f"{oldTime} min" + self.time = f"{newTime} min" + self.conc[self.time] = [float(0)] * len(self.conc.index) + self.fluxes[self.time] = [0] * len(self.fluxes.index) + ## create a metabolite variable that prevents negative concentrations + for met in self.model_util.model.metabolites: + if met.id not in defined_concs: + continue + if met.id not in self.constraints: + self.constraints[met.id] = {} + coef = {} + for rxn in met.reactions: + ### The product of the reaction stoichiometry and the timestep + stoich = abs(timestep_hr * rxn.metabolites[met]) + coef[rxn.forward_variable], coef[rxn.reverse_variable] = ( + stoich, + -stoich, + ) + ### build the metabolite constraint + if newTime - self.ts_min in self.constraints[met.id]: + self.model_util.remove_cons_vars( + [self.constraints[met.id][newTime - self.ts_min]] + ) + self.constraints[met.id][newTime] = Constraint( + Zero, lb=0, ub=None, name=f"{met.id}_conc" + ) + self.model_util.create_constraint( + self.constraints[met.id][newTime], coef + ) + ## calculate the flux + display(self.conc[self.conc["0 min"] != 0], self.fluxes) + for rxnID in self.kinetics_data: + # TODO allocate the following code into a function and recusively reduce the timestep until + ## the concentration becomes not negative, following the model of microBialSim. This may require + ## time dependency in the kinetics expression to achieve the desired behavior. + if rxnID not in model_rxns and self.warnings: + warn(f"ReactionError: {rxnID} is not in the model.") + continue + fluxes = [] + for source in self.kinetics_data[rxnID]: + datum = self.kinetics_data[rxnID][source] + if not _check_datum(datum): + continue + ### define rate law variables; calculate flux; average or overwrite the flux based on data criteria + locals().update( + { + metID: self.conc.at[metID, self.previous_time] * milli + for metID in datum["mets"] + } + ) + flux = eval(datum["substituted_rate_law"]) + print(datum["substituted_rate_law"], flux) + if ( + "metadata" not in self.kinetics_data[rxnID][source] + or self.__find_data_match(rxnID, source) == "a" + ): + fluxes.append(flux) + else: + fluxes = [flux] + + flux = mean(fluxes) + rxn = self.model_util.model.reactions.get_by_id(rxnID) + rxn.lb = rxn.ub = flux + self.fluxes.at[rxnID, self.time] = flux + ## execute the COBRA model + sol = self.model_util.model.optimize() + self.sols.append(sol) + ## add previously undefined fluxes and concentrations + for rxnID in self.fluxes.index: + if self.fluxes.at[rxnID, self.time] == 0: + self.fluxes.at[rxnID, self.time] = sol.fluxes[rxnID] + for met in self.model_util.model.metabolites: + self.conc.at[met.id, self.time] = 0 + for rxn in met.reactions: + flux = self.fluxes.at[rxn.id, self.time] + if flux == 0: + continue + # print(rxn.metabolites[met], flux, timestep_hr, cell_g_L) + self.conc.at[met.id, self.time] += ( + rxn.metabolites[met] * flux * timestep_hr * cell_g_L + ) + if all(chemostat_requirements): + self.moles[self.time] = self.conc[self.time] * milli * chemostat_L + self._chemostat(feed_profile, chemostat_L_hr, chemostat_L) + elif any(chemostat_requirements): + warn( + "The < chemostat_L > , < feed_profile >, and < chemostat_L_hr >" + " parameters must all be defined to simulate a chemostat." + ) + self.variables["elapsed_time"] += self.ts_min + if self.printing: + print( + f"\nObjective value (\u0394t{self.ts_min}): ", + self.sols[-1].objective_value, + ) + + # identify the chemicals that dynamically changed in concentrations + self.changed = set( + [ + met_id + for met_id in self.met_ids + if self.conc.at[met_id, "0 min"] != self.conc.at[met_id, self.time] + ] + ) + self.unchanged = set(self.met_ids.keys()) - self.changed + + # visualize concentration changes over time + if visualize: + self._visualize(conc_figure_title, included_mets, labeled_plots) + if export: + self._export(export_name, export_directory, total_min) + if self.verbose: + print( + f"\nChanged concentrations:\t{self.changed}", + f"\nConstrained reactions:\t{constrained.keys()}", + ) + elif self.printing: + if self.jupyter: + pandas.set_option("max_rows", None) + display(self.conc, self.fluxes) + if self.unchanged == set(): + print( + "All of the metabolites changed concentration over the simulation" + ) + else: + print(f"\nUnchanged metabolite concentrations\t{self.unchanged}") + return self.conc, self.fluxes + + def _chemostat(self, feed_profile: dict, chemostat_L_hr, chemostat_L): + L_changed = chemostat_L_hr * self.ts_min + # chemostat addition + for met_id, conc in feed_profile.items(): + self.moles.at[met_id, self.time] += conc * L_changed + self.conc.at[met_id, self.time] = ( + self.moles.at[met_id, self.time] / milli / chemostat_L + ) # normalize to the chemostat volume + # chemostat subtraction + for met in self.model_util.model.metabolites: + if met.compartment[0] != "e": + continue + ## update the chemical moles + self.moles.at[met.id, self.time] -= ( + self.conc.at[met.id, self.time] * L_changed + ) + ## define the chemical concentration + self.conc.at[met.id, self.time] = ( + self.moles.at[met.id, self.time] / milli / chemostat_L + ) + + # nested functions + def __find_data_match(self, rxnID: str, source: str): + # identifies the datum whose experimental conditions most closely matches the simulation conditions + temperature_deviation = ph_deviation = 0 + if FBAHelper.isnumber( + self.kinetics_data[rxnID][source]["metadata"]["Temperature"] + ): + temp = float(self.kinetics_data[rxnID][source]["metadata"]["Temperature"]) + temperature_deviation = ( + abs(self.parameters["temperature"] - temp) + / self.parameters["temperature"] + ) + if FBAHelper.isnumber(self.kinetics_data[rxnID][source]["metadata"]["pH"]): + pH = float(self.kinetics_data[rxnID][source]["metadata"]["pH"]) + ph_deviation = abs(self.parameters["pH"] - pH) / self.parameters["pH"] + + # equally weight between temperature and pH deviation from the simulation conditions + old_minimum = self.minimum + deviation = mean(temperature_deviation, ph_deviation) + self.minimum = min(deviation, self.minimum) + return ( + "a" if old_minimum == self.minimum else "w" + ) # append or write a list of data + + def _visualize(self, conc_fig_title, included_mets, labeled_plots): + # TODO construct a Vega visualization with a range bind that permits scanning over a time series + ## and accordingly adjusting arrowhead widths to reflect flux at the particularly timestep. + ## The heatmap may likewise be dynamic for each timestep over a bind range. + + # define the figure + pyplot.rcParams["figure.figsize"] = (11, 7) + pyplot.rcParams["figure.dpi"] = 150 + self.figure, ax = pyplot.subplots() + ax.set_title(conc_fig_title) + ax.set_ylabel("Concentrations (mM)") + + x_axis_scalar, unit = _x_axis_determination(self.total_min) + ax.set_xlabel("Time " + unit) + legend_list = [] + times = [ + t * self.ts_min * x_axis_scalar + for t in range(self.parameters["timesteps"] + 1) + ] + + # determine the plotted metabolites and the scale of the figure axis + bbox = (1, 1) + if not included_mets: + bbox = (1.7, 1) + # 1e-2 is an arbitrary concentration threshold for plotting on the figure + included_mets = [ + chem + for chem in self.changed + if max(self.conc.loc[[chem]].values[0].tolist()) > 1e-2 + ] + + log_axis = False + minimum, maximum = inf, -inf + printed_concentrations = {} + for chem in self.changed: + if chem not in included_mets: + continue + concentrations = self.conc.loc[[chem]].values[0].tolist() + maximum = max(maximum, max([x if x > 1e-9 else 0 for x in concentrations])) + minimum = min(minimum, min([x if x > 1e-9 else 0 for x in concentrations])) + # plot chemicals with perturbed concentrations + ax.plot(times, concentrations) + if len(chem) > 25: + chem = list(self.met_ids.keys())[self.met_ids.index(chem)] + if not concentrations[0] < 1e-9: + legend_list.append(chem) + else: + legend_list.append(f"(rel) {chem}") + + # design the proper location of the overlaid labels in the figure + if not labeled_plots: + continue + for i, conc in enumerate(concentrations): + if conc <= 1e-9: + continue + x_value = i * self.ts_min + vertical_adjustment = 0 + if x_value in printed_concentrations: + vertical_adjustment = (maximum - minimum) * 0.05 + if log_axis: + vertical_adjustment = log10(maximum - minimum) / 3 + ax.text( + x_value, + conc + vertical_adjustment, + f"{chem} - {round(conc, 4)}", + ha="left", + ) + printed_concentrations[x_value] = conc + break + + # finalize figure details + if maximum > 10 * minimum: + ax.set_yscale("log") + ax.set_xticks(times) + ax.grid(True) + ax.legend( + legend_list, + title="Changed chemicals", + loc="upper right", + bbox_to_anchor=bbox, + title_fontsize="x-large", + fontsize="large", + ) + + def _export(self, export_name="kineticsFBA", export_directory: str = None): + # define a unique simulation name + directory = ( + os.path.dirname(export_directory) if export_directory else os.getcwd() + ) + self.parameters["simulation_path"] = self.simulation_path = os.path.join( + directory, export_name + ) + # export simulation content + self.fluxes.to_csv(os.path.join(self.simulation_path, "fluxes.csv")) + self.conc.to_csv(os.path.join(self.simulation_path, "concentrations.csv")) + obj_vals_df = pandas.DataFrame( + [ + (self.fluxes.columns[index].replace(" min", ""), sol.objective_value) + for index, sol in enumerate(self.sols) + ], + columns=["min", "objective_value"], + ) + obj_vals_df.index = obj_vals_df["min"] + obj_vals_df.drop(["min"], axis=1, inplace=True) + obj_vals_df.to_csv(os.path.join(self.simulation_path, "objective_values.csv")) + # export the parameters + parameters_table = pandas.DataFrame( + self.parameters, columns=["parameter", "value"] + ) + parameters_table.to_csv(os.path.join(self.simulation_path, "parameters.csv")) + # export the figure + self.figure.savefig( + os.path.join(self.simulation_path, "changed_concentrations.svg") + ) + if self.verbose and not self.jupyter: + self.figure.show() diff --git a/modelseedpy/community/mssteadycom.py b/modelseedpy/community/mssteadycom.py new file mode 100644 index 00000000..df29083a --- /dev/null +++ b/modelseedpy/community/mssteadycom.py @@ -0,0 +1,440 @@ +from icecream import ic + +from modelseedpy import FBAHelper +from modelseedpy.core.exceptions import ( + ObjectAlreadyDefinedError, + ParameterError, + NoFluxError, +) + +# from modelseedpy.community.commhelper import build_from_species_models, CommHelper +from optlang import Constraint, Variable +from itertools import combinations +from optlang.symbolics import Zero +from pandas import DataFrame, concat +from matplotlib import pyplot +from numpy import array +import networkx +import sigfig +import os, re + + +def add_collection_item( + met_name, + normalized_flux, + flux_threshold, + ignore_mets, + species_collection, + first, + second, +): + if flux_threshold and normalized_flux <= flux_threshold: + return species_collection + if not any([re.search(x, met_name, flags=re.IGNORECASE) for x in ignore_mets]): + species_collection[first][second].append(re.sub(r"(_\w\d$)", "", met_name)) + return species_collection + + +class MSSteadyCom: + + @staticmethod + def run_fba( + mscommodel, + media, + pfba=False, + fva_reactions=None, + ava=False, + minMemGrwoth: float = 1, + interactions=True, + ): + + # minGrowth = Constraint(name="minMemGrowth", lb=, ub=None) + # mscommodel.model.add_cons_vars + + # fix member abundances + if not mscommodel.abundances_set: + for member in mscommodel.members: + member.biomass_cpd.lb = minMemGrwoth + all_metabolites = {mscommodel.primary_biomass.products[0]: 1} + all_metabolites.update( + { + mem.biomass_cpd: 1 / len(mscommodel.members) + for mem in mscommodel.members + } + ) + mscommodel.primary_biomass.add_metabolites(all_metabolites, combine=False) + # TODO constrain fluxes to be proportional to the relative abundance + + # TODO constrain the sum of fluxes to be proportional with the abundance + sol = mscommodel.run_fba(media, pfba, fva_reactions) + if interactions: + return MSSteadyCom.interactions(mscommodel, sol) + if ava: + return MSSteadyCom.abundance_variability_analysis(mscommodel, sol) + + @staticmethod + def abundance_variability_analysis(mscommodel, media): + variability = {} + for mem in mscommodel.members: + variability[mem.id] = {} + # minimal variability + mscommodel.set_objective(mem.biomasses, minimize=True) + variability[mem.id]["minVar"] = mscommodel.run_fba(media) + # maximal variability + mscommodel.set_objective(mem.biomasses, minimize=False) + variability[mem.id]["maxVar"] = mscommodel.run_fba(media) + return variability + + @staticmethod + def interactions( + mscommodel, # The MSCommunity object of the model (mandatory to prevent circular imports) + solution=None, # the COBRA simulation solution that will be parsed and visualized + media=None, # The media in which the community model will be simulated + # names=None, abundances=None, # names and abundances of the community species + flux_threshold: int = 1, # The threshold of normalized flux below which a reaction is not plotted + msdb=None, + msdb_path: str = None, + visualize: bool = True, # specifies whether the net flux will be depicted in a network diagram + filename: str = "cross_feeding", # Cross-feeding figure export name + export_format: str = "svg", + node_metabolites: bool = True, # specifies whether the metabolites of each node will be printed + show_figure: bool = True, # specifies whether the figure will be printed to the console + ignore_mets=None, # cross-fed exchanges that will not be displayed in the graphs + ): + # verify that the model has a solution and parallelize where the solver is permissible + solver = str(type(mscommodel.util.model.solver)) + print(f"{solver} model loaded") + if "gurobi" in solver: + mscommodel.util.model.problem.Params.Threads = os.cpu_count() / 2 + solution = solution or mscommodel.run_fba(media) + if not solution: + raise ParameterError( + "A solution must be provided, from which interactions are computed." + ) + if all(array(list(solution.fluxes.values)) == 0): + print(list(solution.fluxes.values)) + raise NoFluxError("The simulation lacks any flux.") + + # Initialize data + metabolite_data, species_data, species_collection = ( + {}, + {"Environment": {}}, + {"Environment": {}}, + ) + data = {"IDs": [], "Metabolites/Donor": [], "Environment": []} + species_list = {} + + # track extracellularly exchanged metabolites + exchange_mets_list = mscommodel.util.exchange_mets_list() + for met in exchange_mets_list: + data["IDs"].append(met.id) + data["Metabolites/Donor"].append(re.sub(r"(_\w\d$)", "", met.name)) + metabolite_data[met.id] = {"Environment": 0} + metabolite_data[met.id].update( + {individual.id: 0 for individual in mscommodel.members} + ) + + # computing net metabolite flux from each reaction + # print([mem.id for mem in mscommodel.members]) + for individual in mscommodel.members: + species_data[individual.id], species_collection[individual.id] = {}, {} + species_list[individual.index] = individual + data[individual.id] = [] + for other in mscommodel.members: + species_data[individual.id][other.id] = 0 + species_collection[individual.id][other.id] = [] + species_data["Environment"][individual.id] = species_data[individual.id][ + "Environment" + ] = 0 + species_collection["Environment"][individual.id] = [] + species_collection[individual.id]["Environment"] = [] + + for rxn in mscommodel.util.model.reactions: + if rxn.id[0:3] == "EX_": + cpd = list(rxn.metabolites.keys())[0] + # the Environment takes the opposite perspective to the members + metabolite_data[cpd.id]["Environment"] += -solution.fluxes[rxn.id] + rxn_index = int(FBAHelper.rxn_compartment(rxn)[1:]) + if ( + not any([met not in exchange_mets_list for met in rxn.metabolites]) + or rxn_index not in species_list + ): + continue + for met in rxn.metabolites: + if met.id not in metabolite_data: + continue + metabolite_data[met.id][species_list[rxn_index].id] += ( + solution.fluxes[rxn.id] * rxn.metabolites[met] + ) + + # translating net metabolite flux into species interaction flux + ignore_mets = ignore_mets if ignore_mets is not None else ["h2o_e0", "co2_e0"] + for met in exchange_mets_list: + # Iterating through the metabolite producers + # TODO Why are fluxes normalized? + total = sum( + [ + max([metabolite_data[met.id][individual.id], 0]) + for individual in mscommodel.members + ] + ) + max([metabolite_data[met.id]["Environment"], 0]) + for individual in mscommodel.members: + ## calculate metabolic consumption of a species from the environment + if metabolite_data[met.id][individual.id] < Zero: + if metabolite_data[met.id]["Environment"] <= Zero: + continue + normalized_flux = ( + abs( + metabolite_data[met.id][individual.id] + * metabolite_data[met.id]["Environment"] + ) + / total + ) + species_data["Environment"][individual.id] += normalized_flux + species_collection = add_collection_item( + met.name, + normalized_flux, + flux_threshold, + ignore_mets, + species_collection, + "Environment", + individual.id, + ) + ## calculate and track metabolic donations between a member and another or the environment + elif metabolite_data[met.id][individual.id] > Zero: + for other in mscommodel.members: + ### filter against organisms that do not consume + if metabolite_data[met.id][other.id] >= Zero: + continue + normalized_flux = ( + abs( + metabolite_data[met.id][individual.id] + * metabolite_data[met.id][other.id] + ) + / total + ) + species_data[individual.id][other.id] += normalized_flux + species_collection = add_collection_item( + met.name, + normalized_flux, + flux_threshold, + ignore_mets, + species_collection, + individual.id, + other.id, + ) + ## calculate donations to the environment + if metabolite_data[met.id]["Environment"] >= Zero: + continue + normalized_flux = ( + abs( + metabolite_data[met.id][individual.id] + * metabolite_data[met.id]["Environment"] + ) + / total + ) + species_data[individual.id]["Environment"] += normalized_flux + species_collection = add_collection_item( + met.name, + normalized_flux, + flux_threshold, + ignore_mets, + species_collection, + individual.id, + "Environment", + ) + + # construct the dataframes + for metID in metabolite_data: + for individual in mscommodel.members: + data[individual.id].append(metabolite_data[metID][individual.id]) + data["Environment"].append(metabolite_data[metID]["Environment"]) + + ## process the fluxes dataframe + data["IDs"].append("zz_Environment") + data["Metabolites/Donor"].append(0) + for individual in mscommodel.members: + data[individual.id].append(species_data["Environment"][individual.id]) + data["Environment"].append(0) + for individual in mscommodel.members: + for other in mscommodel.members: + data[individual.id].append(species_data[individual.id][other.id]) + data["Environment"].append(species_data[individual.id]["Environment"]) + data["IDs"].append(f"zz_Species{individual.index}") + data["Metabolites/Donor"].append(individual.id) + + # if len(set(list(map(len, list(data.values()))))) != 1: + # print([(col, len(content)) for col, content in data.items()]) + cross_feeding_df = DataFrame(data) + cross_feeding_df.index = [ + ID.replace("_e0", "") for ID in map(str, cross_feeding_df["IDs"]) + ] + cross_feeding_df.index.name = "Metabolite/Donor ID" + cross_feeding_df.drop(["IDs", "Metabolites/Donor"], axis=1, inplace=True) + cross_feeding_df = cross_feeding_df.loc[(cross_feeding_df != 0).any(axis=1)] + cross_feeding_df.sort_index(inplace=True) + + ## process the identities dataframe + exchanged_mets = {"Environment": [" "], "Donor ID": ["Environment"]} + exchanged_mets.update({ind.id: [] for ind in mscommodel.members}) + for individual in mscommodel.members: + ### environment exchanges + exchanged_mets[individual.id].append( + "; ".join(species_collection["Environment"][individual.id]) + ) + exchanged_mets["Environment"].append( + "; ".join(species_collection[individual.id]["Environment"]) + ) + ### member exchanges + exchanged_mets["Donor ID"].append(individual.id) + for other in mscommodel.members: + exchanged_mets[individual.id].append( + "; ".join(species_collection[individual.id][other.id]) + ) + + # if len(set(list(map(len, list(exchanged_mets.values()))))) != 1: + # print([(col, len(content)) for col, content in exchanged_mets.items()]) + exMets_df = DataFrame(exchanged_mets) + exMets_df.index = [ + ID.replace("_e0", "") for ID in map(str, exMets_df["Donor ID"]) + ] + exMets_df.index.name = "Donor ID" + exMets_df.drop(["Donor ID"], axis=1, inplace=True) + exMets_df.sort_index(inplace=True) + exMets_df.fillna(" ") + + # graph the network diagram + if visualize: + MSSteadyCom.visual_interactions( + cross_feeding_df, + filename, + export_format, + msdb, + msdb_path, + show_figure, + node_metabolites, + ) + + return cross_feeding_df, exMets_df + + @staticmethod + def visual_interactions( + cross_feeding_df, + filename="cross_feeding", + export_format="svg", + msdb=None, + msdb_path=None, + view_figure=True, + node_metabolites=True, + ): + # load the MSDB + assert msdb or msdb_path, ValueError( + "Either the MSDB object or the local MSDB path must be provided" + ) + from modelseedpy.biochem import from_local + + msdb = msdb or from_local(msdb_path) + # construct the structure of the cross-feeding DataFrame + if "Metabolite/Donor ID" in cross_feeding_df.columns: + cross_feeding_df.index = [ + metID.replace("_e0", "") + for metID in cross_feeding_df["Metabolite/Donor ID"].values + ] + cross_feeding_df.index.name = "Metabolite/Donor ID" + cross_feeding_df.drop( + [col for col in cross_feeding_df.columns if "ID" in col], + axis=1, + inplace=True, + ) + else: + cross_feeding_df.index = [ + metID.replace("_e0", "") for metID in cross_feeding_df.index + ] + # define the cross-fed metabolites + cross_feeding_rows = [] + for index, row in cross_feeding_df.iterrows(): + positive = negative = False + for col, val in row.items(): + if col not in ["Environment"]: + if val > 1e-4: + positive = True + elif val < -1e-4: + negative = True + if negative and positive: + cross_feeding_rows.append(row) + break + metabolites_df = concat(cross_feeding_rows, axis=1).T + metabolites_df.index.name = "Metabolite ID" + display(metabolites_df) + metabolites = [ + msdb.compounds.get_by_id(metID.replace("_e0", "")) + for metID in metabolites_df.index.tolist() + if metID not in ["cpdETCM", "cpdETCMe"] + ] + # define the community members that participate in cross-feeding + members = metabolites_df.loc[ + :, (metabolites_df != 0).any(axis=0) + ].columns.tolist() + members.remove("Environment") + members_cluster1, members_cluster2 = ( + members[: int(len(members) / 2)], + members[int(len(members) / 2) :], + ) + + # TODO define a third node tier of just the environment as a rectangle that spans the width of the members + ## which may alleviate much of the ambiguity about mass imbalance between the member fluxes + import graphviz + + dot = graphviz.Digraph(filename, format=export_format) # directed graph + # define nodes + ## top-layer members + # TODO hyperlink the member nodes with their Narrative link + dot.attr("node", shape="rectangle", color="lightblue2", style="filled") + for mem in members_cluster1: + index = members.index(mem) + dot.node(f"S{index}", mem) + ## mets in the middle layer + with dot.subgraph(name="mets") as mets_subgraph: + mets_subgraph.attr(rank="same") + mets_subgraph.attr("node", shape="circle", color="green", style="filled") + for metIndex, met in enumerate(metabolites): + mets_subgraph.node( + met.abbr[:3], + fixedsize="true", + height="0.4", + tooltip=f"{met.id} ; {met.name}", + URL=f"https://modelseed.org/biochem/compounds/{met.id}", + ) + ## bottom-layer members + with dot.subgraph(name="members") as members_subgraph: + members_subgraph.attr(rank="same") + for mem in members_cluster2: + index = members.index(mem) + dot.node(f"S{index}", mem) + # define the edges by parsing the interaction DataFrame + for met in metabolites: + row = metabolites_df.loc[met.id] + maxVal = max(list(row.to_numpy())) + for col, val in row.items(): + if col == "Environment": + continue + index = members.index(col) + # TODO color carbon sources red + if val > 0: + dot.edge( + f"S{index}", + met.abbr[:3], + arrowsize=f"{val / maxVal}", + edgetooltip=str(val), + ) + if val < 0: + dot.edge( + met.abbr[:3], + f"S{index}", + arrowsize=f"{abs(val / maxVal)}", + edgetooltip=str(val), + ) + + # render and export the source + dot.render(filename, view=view_figure) + return dot.source diff --git a/modelseedpy/community/steadycom_template.html b/modelseedpy/community/steadycom_template.html new file mode 100644 index 00000000..b894c7f7 --- /dev/null +++ b/modelseedpy/community/steadycom_template.html @@ -0,0 +1,54 @@ + + + + + + SteadyCom Results + + + + + + + + + + +

    SteadyCom Results

    + + + + \ No newline at end of file From 13274cca2580668341820b3d61c34d725ab75fa2 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sun, 17 Mar 2024 03:08:08 -0500 Subject: [PATCH 214/298] Updates to support mscommunity and probabiliy and fixes to ModelSEEDpy --- modelseedpy/community/__init__.py | 2 + modelseedpy/community/commkineticpkg.py | 3 +- modelseedpy/community/commphitting.py | 1 - modelseedpy/community/datastandardization.py | 1 - modelseedpy/community/mssteadycom.py | 2 - modelseedpy/core/exceptions.py | 34 + modelseedpy/core/fbabuilder.py | 1546 ++++++++++++++++++ modelseedpy/core/msensemble.py | 1 + modelseedpy/core/msgapfill.py | 2 +- modelseedpy/core/msminimalmedia.py | 696 ++++++++ modelseedpy/core/msprobability.py | 246 +++ modelseedpy/core/optlanghelper.py | 190 +++ 12 files changed, 2718 insertions(+), 6 deletions(-) create mode 100644 modelseedpy/core/fbabuilder.py create mode 100644 modelseedpy/core/msminimalmedia.py create mode 100644 modelseedpy/core/msprobability.py create mode 100644 modelseedpy/core/optlanghelper.py diff --git a/modelseedpy/community/__init__.py b/modelseedpy/community/__init__.py index b844cb34..e4e6208e 100644 --- a/modelseedpy/community/__init__.py +++ b/modelseedpy/community/__init__.py @@ -6,6 +6,8 @@ from modelseedpy.community.mscommunity import * from modelseedpy.community.datastandardization import * +from modelseedpy.community.commkineticpkg import CommKineticPkg +from modelseedpy.community.mscompatibility import MSCompatibility from modelseedpy.community.mssteadycom import MSSteadyCom from modelseedpy.community.commphitting import CommPhitting from modelseedpy.community.commhelper import build_from_species_models, phenotypes diff --git a/modelseedpy/community/commkineticpkg.py b/modelseedpy/community/commkineticpkg.py index 81e1479e..c84a122c 100644 --- a/modelseedpy/community/commkineticpkg.py +++ b/modelseedpy/community/commkineticpkg.py @@ -30,7 +30,8 @@ def build_package(self, kinetic_coef, community_model=None): def build_constraint(self, species): coef = { - species.biomasses[0].forward_variable: -1 * self.parameters["kinetic_coef"] + species.biomasses[0].forward_variable: -1 * self.parameters["kinetic_coef"], + species.biomasses[0].reverse_variable: self.parameters["kinetic_coef"] } for reaction in self.model.reactions: if ( diff --git a/modelseedpy/community/commphitting.py b/modelseedpy/community/commphitting.py index 645cc97c..939a5b21 100644 --- a/modelseedpy/community/commphitting.py +++ b/modelseedpy/community/commphitting.py @@ -32,7 +32,6 @@ from itertools import chain from pprint import pprint from h5py import File -from icecream import ic import numpy as np import cobra.io diff --git a/modelseedpy/community/datastandardization.py b/modelseedpy/community/datastandardization.py index 15dd6f15..026d008f 100644 --- a/modelseedpy/community/datastandardization.py +++ b/modelseedpy/community/datastandardization.py @@ -15,7 +15,6 @@ from itertools import chain from typing import Union, Iterable from copy import deepcopy -from icecream import ic # from cplex import Cplex import logging, json, os, re diff --git a/modelseedpy/community/mssteadycom.py b/modelseedpy/community/mssteadycom.py index df29083a..db851e34 100644 --- a/modelseedpy/community/mssteadycom.py +++ b/modelseedpy/community/mssteadycom.py @@ -1,5 +1,3 @@ -from icecream import ic - from modelseedpy import FBAHelper from modelseedpy.core.exceptions import ( ObjectAlreadyDefinedError, diff --git a/modelseedpy/core/exceptions.py b/modelseedpy/core/exceptions.py index cb72f36c..e3e01211 100644 --- a/modelseedpy/core/exceptions.py +++ b/modelseedpy/core/exceptions.py @@ -24,3 +24,37 @@ class GapfillingError(Exception): """Error in model gapfilling""" pass + + +class ObjectError(Exception): + """Error in the construction of a base KBase object""" + + pass + + +class ParameterError(Exception): + """Error in a parameterization""" + + pass + + +class ObjectAlreadyDefinedError(Exception): + pass + + +class NoFluxError(Exception): + """Error for FBA solutions""" + + pass + + +class ObjectiveError(Exception): + """Erroneous assignment of a secondary objective via a constraint""" + + pass + + +class ModelError(Exception): + """Errors in a model that corrupt the simulation""" + + pass \ No newline at end of file diff --git a/modelseedpy/core/fbabuilder.py b/modelseedpy/core/fbabuilder.py new file mode 100644 index 00000000..b82e161d --- /dev/null +++ b/modelseedpy/core/fbabuilder.py @@ -0,0 +1,1546 @@ +import logging + +import re +import copy +from optlang.symbolics import Zero, add +from cobra.core import Gene, Metabolite, Model, Reaction +from cobrakbase.core.kbaseobject import AttrDict +from cobrakbase.annotation_ontology_api.annotation_ontology_apiServiceClient import ( + annotation_ontology_api, +) +import modelseedpy.core.fbahelper + +logger = logging.getLogger(__name__) + + +def build_cpd_id(str): + if str.startswith("M_"): + str = str[2:] + elif str.startswith("M-"): + str = str[2:] + str_fix = str + if "-" in str_fix: + str_fix = str_fix.replace("-", "__DASH__") + if not str == str_fix: + logger.debug("[Species] rename: [%s] -> [%s]", str, str_fix) + return str + + +def build_rxn_id(str): + if str.startswith("R_"): + str = str[2:] + elif str.startswith("R-"): + str = str[2:] + str_fix = str + if "-" in str_fix: + str_fix = str_fix.replace("-", "__DASH__") + if not str == str_fix: + logger.debug("[Reaction] rename: [%s] -> [%s]", str, str_fix) + return str_fix + + +# Adding a few exception classes to handle different types of errors +class ObjectError(Exception): + """Error in the construction of a base KBase object""" + + pass + + +class FeasibilityError(Exception): + """Error in FBA formulation""" + + pass + + +# New class to store functions to building and tracking new constraints and variables related to our own custom FBA formulations +class KBaseFBAUtilities: + def __init__( + self, + cobramodel, + fbamodel, + kbapi, + media=None, + default_uptake=100, + default_excretion=100, + blacklist=[], + auto_sink=["cpd02701_c", "cpd11416_c0", "cpd15302_c"], + ): + self.cobramodel = cobramodel + self.SBO_ANNOTATION = "sbo" + self.metabolites_remap = {} + self.solution_exclusion_constraints = [] + self.kbapi = kbapi + self.potential_variables = dict() + self.reversibility_binary = dict() + self.reversibility_binary_constraints = dict() + self.binary_flux_variables = dict() + self.total_flux_variables = dict() + self.total_flux_constraints = dict() + self.binary_flux_constraints = dict() + self.simple_thermo_constraints = dict() + self.metabolomics_peak_variables = dict() + self.metabolomics_peak_constraints = dict() + self.compound_flux_variables = dict() + self.compound_flux_constraints = dict() + self.metabolomics_constraints = dict() + self.media = None + self.default_uptake = default_uptake + self.default_excretion = default_excretion + self.apply_media_to_model(media, self.default_uptake, self.default_excretion) + self.blacklist = [ + "rxn12985", + "rxn00238", + "rxn07058", + "rxn05305", + "rxn00154", + "rxn09037", + "rxn10643", + "rxn11317", + "rxn05254", + "rxn05257", + "rxn05258", + "rxn05259", + "rxn05264", + "rxn05268", + "rxn05269", + "rxn05270", + "rxn05271", + "rxn05272", + "rxn05273", + "rxn05274", + "rxn05275", + "rxn05276", + "rxn05277", + "rxn05278", + "rxn05279", + "rxn05280", + "rxn05281", + "rxn05282", + "rxn05283", + "rxn05284", + "rxn05285", + "rxn05286", + "rxn05963", + "rxn05964", + "rxn05971", + "rxn05989", + "rxn05990", + "rxn06041", + "rxn06042", + "rxn06043", + "rxn06044", + "rxn06045", + "rxn06046", + "rxn06079", + "rxn06080", + "rxn06081", + "rxn06086", + "rxn06087", + "rxn06088", + "rxn06089", + "rxn06090", + "rxn06091", + "rxn06092", + "rxn06138", + "rxn06139", + "rxn06140", + "rxn06141", + "rxn06145", + "rxn06217", + "rxn06218", + "rxn06219", + "rxn06220", + "rxn06221", + "rxn06222", + "rxn06223", + "rxn06235", + "rxn06362", + "rxn06368", + "rxn06378", + "rxn06474", + "rxn06475", + "rxn06502", + "rxn06562", + "rxn06569", + "rxn06604", + "rxn06702", + "rxn06706", + "rxn06715", + "rxn06803", + "rxn06811", + "rxn06812", + "rxn06850", + "rxn06901", + "rxn06971", + "rxn06999", + "rxn07123", + "rxn07172", + "rxn07254", + "rxn07255", + "rxn07269", + "rxn07451", + "rxn09037", + "rxn10018", + "rxn10077", + "rxn10096", + "rxn10097", + "rxn10098", + "rxn10099", + "rxn10101", + "rxn10102", + "rxn10103", + "rxn10104", + "rxn10105", + "rxn10106", + "rxn10107", + "rxn10109", + "rxn10111", + "rxn10403", + "rxn10410", + "rxn10416", + "rxn11313", + "rxn11316", + "rxn11318", + "rxn11353", + "rxn05224", + "rxn05795", + "rxn05796", + "rxn05797", + "rxn05798", + "rxn05799", + "rxn05801", + "rxn05802", + "rxn05803", + "rxn05804", + "rxn05805", + "rxn05806", + "rxn05808", + "rxn05812", + "rxn05815", + "rxn05832", + "rxn05836", + "rxn05851", + "rxn05857", + "rxn05869", + "rxn05870", + "rxn05884", + "rxn05888", + "rxn05896", + "rxn05898", + "rxn05900", + "rxn05903", + "rxn05904", + "rxn05905", + "rxn05911", + "rxn05921", + "rxn05925", + "rxn05936", + "rxn05947", + "rxn05956", + "rxn05959", + "rxn05960", + "rxn05980", + "rxn05991", + "rxn05992", + "rxn05999", + "rxn06001", + "rxn06014", + "rxn06017", + "rxn06021", + "rxn06026", + "rxn06027", + "rxn06034", + "rxn06048", + "rxn06052", + "rxn06053", + "rxn06054", + "rxn06057", + "rxn06059", + "rxn06061", + "rxn06102", + "rxn06103", + "rxn06127", + "rxn06128", + "rxn06129", + "rxn06130", + "rxn06131", + "rxn06132", + "rxn06137", + "rxn06146", + "rxn06161", + "rxn06167", + "rxn06172", + "rxn06174", + "rxn06175", + "rxn06187", + "rxn06189", + "rxn06203", + "rxn06204", + "rxn06246", + "rxn06261", + "rxn06265", + "rxn06266", + "rxn06286", + "rxn06291", + "rxn06294", + "rxn06310", + "rxn06320", + "rxn06327", + "rxn06334", + "rxn06337", + "rxn06339", + "rxn06342", + "rxn06343", + "rxn06350", + "rxn06352", + "rxn06358", + "rxn06361", + "rxn06369", + "rxn06380", + "rxn06395", + "rxn06415", + "rxn06419", + "rxn06420", + "rxn06421", + "rxn06423", + "rxn06450", + "rxn06457", + "rxn06463", + "rxn06464", + "rxn06466", + "rxn06471", + "rxn06482", + "rxn06483", + "rxn06486", + "rxn06492", + "rxn06497", + "rxn06498", + "rxn06501", + "rxn06505", + "rxn06506", + "rxn06521", + "rxn06534", + "rxn06580", + "rxn06585", + "rxn06593", + "rxn06609", + "rxn06613", + "rxn06654", + "rxn06667", + "rxn06676", + "rxn06693", + "rxn06730", + "rxn06746", + "rxn06762", + "rxn06779", + "rxn06790", + "rxn06791", + "rxn06792", + "rxn06793", + "rxn06794", + "rxn06795", + "rxn06796", + "rxn06797", + "rxn06821", + "rxn06826", + "rxn06827", + "rxn06829", + "rxn06839", + "rxn06841", + "rxn06842", + "rxn06851", + "rxn06866", + "rxn06867", + "rxn06873", + "rxn06885", + "rxn06891", + "rxn06892", + "rxn06896", + "rxn06938", + "rxn06939", + "rxn06944", + "rxn06951", + "rxn06952", + "rxn06955", + "rxn06957", + "rxn06960", + "rxn06964", + "rxn06965", + "rxn07086", + "rxn07097", + "rxn07103", + "rxn07104", + "rxn07105", + "rxn07106", + "rxn07107", + "rxn07109", + "rxn07119", + "rxn07179", + "rxn07186", + "rxn07187", + "rxn07188", + "rxn07195", + "rxn07196", + "rxn07197", + "rxn07198", + "rxn07201", + "rxn07205", + "rxn07206", + "rxn07210", + "rxn07244", + "rxn07245", + "rxn07253", + "rxn07275", + "rxn07299", + "rxn07302", + "rxn07651", + "rxn07723", + "rxn07736", + "rxn07878", + "rxn11417", + "rxn11582", + "rxn11593", + "rxn11597", + "rxn11615", + "rxn11617", + "rxn11619", + "rxn11620", + "rxn11624", + "rxn11626", + "rxn11638", + "rxn11648", + "rxn11651", + "rxn11665", + "rxn11666", + "rxn11667", + "rxn11698", + "rxn11983", + "rxn11986", + "rxn11994", + "rxn12006", + "rxn12007", + "rxn12014", + "rxn12017", + "rxn12022", + "rxn12160", + "rxn12161", + "rxn01267", + "rxn05294", + "rxn04656", + ] + for item in blacklist: + if item not in self.blacklist: + self.blacklist.append(item) + self.auto_sink = [] + full_id = re.compile("\d+$") + for id in auto_sink: + if full_id.search(id): + self.auto_sink.append(id) + else: + for i in range(0, 100): + newid = id + str(i) + self.auto_sink.append(newid) + + self.auto_exchange = "e0" + self.sink_compounds = set() + self.demand_compounds = set() + self.exchange_compounds = set() + self.COBRA_0_BOUND = 0 + self.COBRA_DEFAULT_LB = -1000 + self.COBRA_DEFAULT_UB = 1000 + + def media_const_hash(self): + bound_hash = dict() + if not self.media == None: + for compound in self.media.mediacompounds: + bound_hash[compound.id] = { + "lb": -1 * compound.maxFlux, + "ub": -1 * compound.minFlux, + } + return bound_hash + + def apply_media_to_model( + self, media=None, default_uptake=None, default_excretion=None + ): + self.media = media + if default_uptake == None: + default_uptake = self.default_uptake + if default_excretion == None: + default_excretion = self.default_excretion + + bound_hash = self.media_const_hash() + for reaction in self.cobramodel.reactions: + if reaction.id[0:3].lower() == "ex_": + compound = reaction.id[3:] + if compound[-3:] == "_e0": + compound = compound[:-3] + if compound in bound_hash: + reaction.lower_bound = bound_hash[compound]["lb"] + reaction.upper_bound = bound_hash[compound]["ub"] + else: + reaction.lower_bound = -1 * default_uptake + reaction.upper_bound = default_excretion + reaction.update_variable_bounds() + + def add_total_flux_constraints(self, reaction_filter=None): + for reaction in self.cobramodel.reactions: + if reaction_filter == None or reaction.id in reaction_filter: + self.total_flux_variables[ + reaction.id + ] = self.cobramodel.problem.Variable( + reaction.id + "_tot", lb=0, ub=self.COBRA_DEFAULT_UB + ) + self.cobramodel.add_cons_vars(self.total_flux_variables[reaction.id]) + self.total_flux_constraints[ + reaction.id + ] = self.cobramodel.problem.Constraint( + reaction.forward_variable + + reaction.reverse_variable + - self.total_flux_variables[reaction.id], + lb=0, + ub=0, + name=reaction.id + "_tot", + ) + self.cobramodel.add_cons_vars(self.total_flux_constraints[reaction.id]) + + def add_reversibility_binary_constraints(self, reaction_filter=None): + # Adding thermodynamic constraints + for reaction in self.cobramodel.reactions: + if reaction.id not in self.reversibility_binary and ( + reaction_filter == None or reaction.id in reaction_filter + ): + self.reversibility_binary[ + reaction.id + ] = self.cobramodel.problem.Variable( + reaction.id + "_rb", lb=0, ub=1, type="binary" + ) + self.cobramodel.add_cons_vars(self.reversibility_binary[reaction.id]) + self.reversibility_binary_constraints[reaction.id] = dict() + self.reversibility_binary_constraints[reaction.id][ + "ff" + ] = self.cobramodel.problem.Constraint( + 1000 * self.reversibility_binary[reaction.id] + - reaction.forward_variable, + lb=0, + ub=None, + name=reaction.id + "_FB", + ) + self.cobramodel.add_cons_vars( + self.reversibility_binary_constraints[reaction.id]["ff"] + ) + self.reversibility_binary_constraints[reaction.id][ + "rf" + ] = self.cobramodel.problem.Constraint( + -1000 * self.reversibility_binary[reaction.id] + - reaction.reverse_variable, + lb=-1000, + ub=None, + name=reaction.id + "_RB", + ) + self.cobramodel.add_cons_vars( + self.reversibility_binary_constraints[reaction.id]["rf"] + ) + + def set_objective_from_target_reaction(self, target_reaction, maximize=1): + target_reaction = self.cobramodel.reactions.get_by_id(target_reaction) + sense = "max" + if maximize == 0: + sense = "min" + target_objective = self.cobramodel.problem.Objective( + 1 * target_reaction.flux_expression, direction=sense + ) + self.cobramodel.objective = target_objective + return target_reaction + + def add_simple_thermo_constraints(self): + # Creating potential variables for all compounds + for metabolite in self.cobramodel.metabolites: + if metabolite.id not in self.potential_variables: + self.potential_variables[ + metabolite.id + ] = self.cobramodel.problem.Variable( + metabolite.id + "_u", lb=0, ub=1000 + ) + self.cobramodel.add_cons_vars(self.potential_variables[metabolite.id]) + # Adding thermodynamic constraints + for reaction in self.cobramodel.reactions: + if ( + reaction.id not in self.simple_thermo_constraints + and reaction.id[0:3].lower() != "ex_" + and reaction.id[0:3].lower() != "dm_" + ): + if reaction.id not in self.reversibility_binary: + self.reversibility_binary[ + reaction.id + ] = self.cobramodel.problem.Variable( + reaction.id + "_rb", lb=0, ub=1, type="binary" + ) + self.cobramodel.add_cons_vars( + self.reversibility_binary[reaction.id] + ) + self.reversibility_binary_constraints[reaction.id] = dict() + self.reversibility_binary_constraints[reaction.id][ + "ff" + ] = self.cobramodel.problem.Constraint( + 1000 * self.reversibility_binary[reaction.id] + - reaction.forward_variable, + lb=0, + ub=None, + name=reaction.id + "_FB", + ) + self.cobramodel.add_cons_vars( + self.reversibility_binary_constraints[reaction.id]["ff"] + ) + self.reversibility_binary_constraints[reaction.id][ + "rf" + ] = self.cobramodel.problem.Constraint( + -1000 * self.reversibility_binary[reaction.id] + - reaction.reverse_variable, + lb=-1000, + ub=None, + name=reaction.id + "_RB", + ) + self.cobramodel.add_cons_vars( + self.reversibility_binary_constraints[reaction.id]["rf"] + ) + self.simple_thermo_constraints[ + reaction.id + ] = self.cobramodel.problem.Constraint( + Zero, lb=0, ub=1000, name=reaction.id + "_therm" + ) + self.cobramodel.add_cons_vars( + self.simple_thermo_constraints[reaction.id] + ) + self.cobramodel.solver.update() + const_coef = {self.reversibility_binary[reaction.id]: 1000} + for metabolite in reaction.metabolites: + const_coef[ + self.potential_variables[metabolite.id] + ] = reaction.metabolites[metabolite] + self.simple_thermo_constraints[reaction.id].set_linear_coefficients( + const_coef + ) + # Updating solver one final time + self.cobramodel.solver.update() + + def add_intracellular_metabolomics_constraints( + self, peakstring, relevant_peaks=None + ): + drain_fluxes = list() + peak_array = peakstring.split(";") + compound_reactions = dict() + reaction_hash = dict() + for reaction in self.cobramodel.reactions: + reaction_hash[reaction.id] = 1 + for compound in reaction.metabolites: + if compound.id not in compound_reactions: + compound_reactions[compound.id] = dict() + compound_reactions[compound.id][reaction.id] = reaction.metabolites[ + compound + ] + compartment_tag = re.compile("_[a-z]\d+$") + for peak in peak_array: + sub_array = peak.split(":") + if len(sub_array) > 2: + peakid = sub_array[0] + if relevant_peaks == None or peakid in relevant_peaks: + coef = sub_array[1] + peak_coef = dict() + pfound = 0 + for i in range(2, len(sub_array)): + compound_list = [] + compound = sub_array[i] + if compartment_tag.search(compound): + compound_list = [compound] + else: + for i in range(0, 1000): + compound_list.append(compound + "_c" + str(i)) + for compound in compound_list: + if compound in compound_reactions: + cfound = 0 + compound_coef = dict() + for reaction in compound_reactions[compound]: + if ( + reaction[0:3].lower() != "ex_" + and reaction[0:3].lower() != "dm_" + ): + cfound = 1 + rxnobj = self.cobramodel.reactions.get_by_id( + reaction + ) + compound_coef[rxnobj.forward_variable] = 1000 + compound_coef[rxnobj.reverse_variable] = 1000 + if cfound == 1: + if compound not in self.compound_flux_variables: + self.compound_flux_variables[ + compound + ] = self.cobramodel.problem.Variable( + compound + "_f", lb=0, ub=1 + ) + self.cobramodel.add_cons_vars( + self.compound_flux_variables[compound] + ) + self.compound_flux_constraints[ + compound + ] = self.cobramodel.problem.Constraint( + Zero, lb=0, ub=None, name=compound + "_flux" + ) + self.cobramodel.add_cons_vars( + self.compound_flux_constraints[compound] + ) + compound_coef[ + self.compound_flux_variables[compound] + ] = -1 + self.cobramodel.solver.update() + self.compound_flux_constraints[ + compound + ].set_linear_coefficients(compound_coef) + peak_coef[ + self.compound_flux_variables[compound] + ] = 1 + pfound = 1 + drain_reaction = ( + self.helper.add_drain_from_metabolite_id( + self.cobramodel, compound + ) + ) + if ( + drain_reaction.id + not in self.cobramodel.reactions + ): + self.cobramodel.add_reactions([drain_reaction]) + if pfound == 1: + if peakid not in self.metabolomics_peak_variables: + self.metabolomics_peak_variables[ + peakid + ] = self.cobramodel.problem.Variable(peakid, lb=0, ub=1) + self.cobramodel.add_cons_vars( + self.metabolomics_peak_variables[peakid] + ) + self.metabolomics_peak_constraints[ + peakid + ] = self.cobramodel.problem.Constraint( + Zero, lb=0, ub=None, name=peakid + ) + self.cobramodel.add_cons_vars( + self.metabolomics_peak_constraints[peakid] + ) + peak_coef[self.metabolomics_peak_variables[peakid]] = -1 + self.cobramodel.solver.update() + self.metabolomics_peak_constraints[ + peakid + ].set_linear_coefficients(peak_coef) + + return drain_fluxes + + def convert_template_compound(self, template_compound, index, template): + base_id = template_compound.id.split("_")[0] + base_compound = template.compounds.get_by_id(base_id) + new_id = template_compound.id + new_id += str(index) + compartment = template_compound.templatecompartment_ref.split("/").pop() + compartment += str(index) + + met = Metabolite( + new_id, + formula=base_compound.formula, + name=base_compound.name, + charge=template_compound.charge, + compartment=compartment, + ) + + met.annotation[ + "sbo" + ] = "SBO:0000247" # simple chemical - Simple, non-repetitive chemical entity. + met.annotation["seed.compound"] = base_id + return met + + def convert_template_reaction( + self, template_reaction, index, template, for_gapfilling=1 + ): + array = template_reaction.id.split("_") + base_id = array[0] + new_id = template_reaction.id + new_id += str(index) + + lower_bound = template_reaction.maxrevflux + upper_bound = template_reaction.maxforflux + + direction = template_reaction.GapfillDirection + if for_gapfilling == 0: + direction = template_reaction.direction + + if direction == ">": + lower_bound = 0 + elif direction == "<": + upper_bound = 0 + + cobra_reaction = Reaction( + new_id, + name=template_reaction.name, + lower_bound=lower_bound, + upper_bound=upper_bound, + ) + + object_stoichiometry = {} + for item in template_reaction.templateReactionReagents: + metabolite_id = item["templatecompcompound_ref"].split("/").pop() + template_compound = template.compcompounds.get_by_id(metabolite_id) + compartment = template_compound.templatecompartment_ref.split("/").pop() + if compartment == "e": + metabolite_id = metabolite_id + "0" + else: + metabolite_id = metabolite_id + str(index) + + metabolite = self.cobramodel.metabolites.get_by_id(metabolite_id) + object_stoichiometry[metabolite] = item["coefficient"] + + cobra_reaction.add_metabolites(object_stoichiometry) + + cobra_reaction.annotation["sbo"] = "SBO:0000176" # biochemical reaction + cobra_reaction.annotation["seed.reaction"] = base_id + + return cobra_reaction + + def build_model_extended_for_gapfilling( + self, + extend_with_template=1, + source_models=[], + input_templates=[], + model_penalty=1, + reaction_scores={}, + ): + model_id = self.fbamodel["id"] + ".gf" + + # Determine all indecies that should be gapfilled + indexlist = [0] * 1000 + compounds = self.fbamodel["modelcompounds"] + for compound in compounds: + compartment = compound["modelcompartment_ref"].split("/").pop() + basecomp = compartment[0:1] + if not basecomp == "e": + index = compartment[1:] + index = int(index) + indexlist[index] += 1 + + # Iterating over all indecies with more than 10 intracellular compounds: + gapfilling_penalties = dict() + for i in range(0, 1000): + if indexlist[i] > 10: + if extend_with_template == 1: + new_penalties = self.temp_extend_model_index_for_gapfilling( + i, input_templates + ) + gapfilling_penalties.update(new_penalties) + if i < len(source_models) and source_models[i] != None: + new_penalties = self.mdl_extend_model_index_for_gapfilling( + i, source_models[i], model_penalty + ) + gapfilling_penalties.update(new_penalties) + # Rescaling penalties by reaction scores and saving genes + for reaction in gapfilling_penalties: + array = reaction.split("_") + rxnid = array[0] + if rxnid in reaction_scores: + highest_score = 0 + for gene in reaction_scores[rxnid]: + if highest_score < reaction_scores[rxnid][gene]: + highest_score = reaction_scores[rxnid][gene] + factor = 1 - 0.9 * highest_score + if "reverse" in gapfilling_penalties[reaction]: + penalties[reaction.id]["reverse"] = ( + factor * penalties[reaction.id]["reverse"] + ) + if "forward" in gapfilling_penalties[reaction]: + penalties[reaction.id]["forward"] = ( + factor * penalties[reaction.id]["forward"] + ) + self.cobramodel.solver.update() + return gapfilling_penalties + + # Possible new function to add to the KBaseFBAModelToCobraBuilder to extend a model with a template for gapfilling for a specific index + def mdl_extend_model_index_for_gapfilling(self, index, source_model, model_penalty): + new_metabolites = {} + new_reactions = {} + new_exchange = [] + new_demand = [] + new_penalties = dict() + local_remap = {} + + comp = re.compile("(.*_*)(.)\d+$") + for modelcompound in source_model.metabolites: + cobra_metabolite = self.convert_modelcompound(modelcompound) + original_id = cobra_metabolite.id + groups = comp.match(cobra_metabolite.compartment) + if groups[2] == "e": + cobra_metabolite.compartment = groups[1] + groups[2] + "0" + groups = comp.match(cobra_metabolite.id) + cobra_metabolite.id = groups[1] + groups[2] + "0" + else: + cobra_metabolite.compartment = groups[1] + groups[2] + str(index) + groups = comp.match(cobra_metabolite.id) + cobra_metabolite.id = groups[1] + groups[2] + str(index) + if ( + cobra_metabolite.id not in self.cobramodel.metabolites + and cobra_metabolite.id not in new_metabolites + ): + new_metabolites[cobra_metabolite.id] = cobra_metabolite + if original_id in self.auto_sink: + self.demand_compounds.add(cobra_metabolite.id) + new_demand.append(cobra_metabolite) + if cobra_metabolite.compartment == self.auto_exchange: + self.exchange_compounds.add(cobra_metabolite.id) + new_exchange.append(cobra_metabolite) + if cobra_metabolite.id in self.cobramodel.metabolites: + cobra_metabolite = self.cobramodel.metabolites.get_by_id( + cobra_metabolite.id + ) + else: # Just in case the same compound is added twice - we want to switch the metabolite to the first new version + cobra_metabolite = new_metabolites[cobra_metabolite.id] + local_remap[original_id] = cobra_metabolite + # Adding all metabolites to model prior to adding reactions + self.cobramodel.add_metabolites(new_metabolites.values()) + + for modelreaction in source_model.reactions: + if modelreaction.id.split("_")[0] in self.blacklist: + next + # cobra_reaction = self.convert_modelreaction(modelreaction) + cobra_reaction = modelreaction.copy() + groups = comp.match(cobra_reaction.id) + cobra_reaction.id = groups[1] + groups[2] + str(index) + new_penalties[cobra_reaction.id] = dict() + # Updating metabolites in reaction to new model + metabolites = cobra_reaction.metabolites + new_stoichiometry = {} + for metabolite in metabolites: + # Adding new coefficient: + new_stoichiometry[local_remap[metabolite.id]] = metabolites[metabolite] + # Zeroing out current coefficients + if local_remap[metabolite.id] != metabolite: + new_stoichiometry[metabolite] = 0 + cobra_reaction.add_metabolites(new_stoichiometry, combine=False) + if ( + cobra_reaction.id not in self.cobramodel.reactions + and cobra_reaction.id not in new_reactions + ): + new_reactions[cobra_reaction.id] = cobra_reaction + new_penalties[cobra_reaction.id]["added"] = 1 + if cobra_reaction.lower_bound < 0: + new_penalties[cobra_reaction.id]["reverse"] = model_penalty + if cobra_reaction.upper_bound > 0: + new_penalties[cobra_reaction.id]["forward"] = model_penalty + elif ( + cobra_reaction.lower_bound < 0 + and self.cobramodel.reactions.get_by_id(cobra_reaction.id).lower_bound + == 0 + ): + self.cobramodel.reactions.get_by_id( + cobra_reaction.id + ).lower_bound = cobra_reaction.lower_bound + self.cobramodel.reactions.get_by_id( + cobra_reaction.id + ).update_variable_bounds() + new_penalties[cobra_reaction.id]["reverse"] = model_penalty + new_penalties[cobra_reaction.id]["reversed"] = 1 + elif ( + cobra_reaction.upper_bound > 0 + and self.cobramodel.reactions.get_by_id(cobra_reaction.id).upper_bound + == 0 + ): + self.cobramodel.reactions.get_by_id( + cobra_reaction.id + ).upper_bound = cobra_reaction.upper_bound + self.cobramodel.reactions.get_by_id( + cobra_reaction.id + ).update_variable_bounds() + new_penalties[cobra_reaction.id]["forward"] = model_penalty + new_penalties[cobra_reaction.id]["reversed"] = 1 + + # Only run this on new exchanges so we don't readd for all exchanges + for cpd in new_exchange: + drain_reaction = self.helper.add_drain_from_metabolite_id(cpd.id) + if ( + drain_reaction.id not in self.cobramodel.reactions + and drain_reaction.id not in new_reactions + ): + new_reactions[drain_reaction.id] = drain_reaction + + # Only run this on new demands so we don't readd for all exchanges + for cpd_id in new_demand: + drain_reaction = self.helper.add_drain_from_metabolite_id( + cpd_id, + lower_bound=self.COBRA_0_BOUND, + upper_bound=self.COBRA_DEFAULT_UB, + prefix="DM_", + prefix_name="Demand for ", + sbo="SBO:0000627", + ) + if ( + drain_reaction.id not in self.cobramodel.reactions + and drain_reaction.id not in new_reactions + ): + new_reactions[drain_reaction.id] = drain_reaction + + # Adding all new reactions to the model at once (much faster than one at a time) + self.cobramodel.add_reactions(new_reactions.values()) + return new_penalties + + # Possible new function to add to the KBaseFBAModelToCobraBuilder to extend a model with a template for gapfilling for a specific index + def temp_extend_model_index_for_gapfilling(self, index, input_templates=[]): + new_metabolites = {} + new_reactions = {} + new_exchange = [] + new_demand = [] + new_penalties = dict() + template = None + if index < len(input_templates): + template = input_templates[index] + elif index in self.fbamodel["template_refs"]: + template = self.kbapi.get_from_ws(self.fbamodel["template_refs"][index]) + else: + template = self.kbapi.get_from_ws(self.fbamodel["template_ref"]) + + if template.info.type != "KBaseFBA.NewModelTemplate": + raise ObjectError( + template.info.type + " loaded when KBaseFBA.NewModelTemplate expected" + ) + + for template_compound in template.compcompounds: + tempindex = index + compartment = template_compound.templatecompartment_ref.split("/").pop() + if compartment == "e": + tempindex = 0 + + cobra_metabolite = self.convert_template_compound( + template_compound, tempindex, template + ) + if ( + cobra_metabolite.id not in self.cobramodel.metabolites + and cobra_metabolite.id not in new_metabolites + ): + new_metabolites[cobra_metabolite.id] = cobra_metabolite + self.cobramodel.add_metabolites([cobra_metabolite]) + if cobra_metabolite.id in self.auto_sink: + self.demand_compounds.add(cobra_metabolite.id) + new_demand.append(cobra_metabolite.id) + if cobra_metabolite.compartment == self.auto_exchange: + new_exchange.append(cobra_metabolite.id) + self.exchange_compounds.add(cobra_metabolite.id) + # Adding all metabolites to model prior to adding reactions + self.cobramodel.add_metabolites(new_metabolites.values()) + + for template_reaction in template.reactions: + if template_reaction.id.split("_")[0] in self.blacklist: + continue + cobra_reaction = self.convert_template_reaction( + template_reaction, index, template, 1 + ) + new_penalties[cobra_reaction.id] = dict() + if ( + cobra_reaction.id not in self.cobramodel.reactions + and cobra_reaction.id not in new_reactions + ): + # Adding any template reactions missing from the present model + new_reactions[cobra_reaction.id] = cobra_reaction + if cobra_reaction.lower_bound < 0: + new_penalties[cobra_reaction.id]["reverse"] = ( + template_reaction.base_cost + template_reaction.reverse_penalty + ) + if cobra_reaction.upper_bound > 0: + new_penalties[cobra_reaction.id]["forward"] = ( + template_reaction.base_cost + template_reaction.forward_penalty + ) + new_penalties[cobra_reaction.id]["added"] = 1 + elif template_reaction.GapfillDirection == "=": + # Adjusting directionality as needed for existing reactions + new_penalties[cobra_reaction.id]["reversed"] = 1 + if ( + self.cobramodel.reactions.get_by_id(cobra_reaction.id).lower_bound + == 0 + ): + self.cobramodel.reactions.get_by_id( + cobra_reaction.id + ).lower_bound = template_reaction.maxrevflux + self.cobramodel.reactions.get_by_id( + cobra_reaction.id + ).update_variable_bounds() + new_penalties[cobra_reaction.id]["reverse"] = ( + template_reaction.base_cost + template_reaction.reverse_penalty + ) + if ( + self.cobramodel.reactions.get_by_id(cobra_reaction.id).upper_bound + == 0 + ): + self.cobramodel.reactions.get_by_id( + cobra_reaction.id + ).upper_bound = template_reaction.maxforflux + self.cobramodel.reactions.get_by_id( + cobra_reaction.id + ).update_variable_bounds() + new_penalties[cobra_reaction.id]["forward"] = ( + template_reaction.base_cost + template_reaction.forward_penalty + ) + + # Only run this on new exchanges so we don't readd for all exchanges + for cpd_id in new_exchange: + drain_reaction = self.helper.add_drain_from_metabolite_id(cpd_id) + if drain_reaction != None and drain_reaction.id not in new_reactions: + new_reactions[drain_reaction.id] = drain_reaction + + # Only run this on new demands so we don't readd for all exchanges + for cpd_id in new_demand: + drain_reaction = self.helper.add_drain_from_metabolite_id( + cpd_id, self.COBRA_0_BOUND, self.COBRA_DEFAULT_UB, "DM_", "Demand for " + ) + if drain_reaction != None and drain_reaction.id not in new_reactions: + new_reactions[drain_reaction.id] = drain_reaction + + # Adding all new reactions to the model at once (much faster than one at a time) + self.cobramodel.add_reactions(new_reactions.values()) + return new_penalties + + def convert_modelreaction(self, reaction, bigg=False): + mr_id = reaction.id + name = reaction.name + annotation = reaction.annotation + lower_bound, upper_bound = reaction.get_reaction_constraints() + + id = build_rxn_id(mr_id) + if bigg and "bigg.reaction" in annotation: + id = annotation["bigg.reaction"] + + gpr = reaction.get_gpr() + + cobra_reaction = Reaction( + id, name=name, lower_bound=lower_bound, upper_bound=upper_bound + ) + cobra_reaction.annotation[ + self.SBO_ANNOTATION + ] = "SBO:0000176" # biochemical reaction + cobra_reaction.annotation.update(annotation) + + if id.startswith("rxn"): + cobra_reaction.annotation["seed.reaction"] = id.split("_")[0] + + cobra_reaction.add_metabolites( + self.convert_modelreaction_stoichiometry(reaction) + ) + + cobra_reaction.gene_reaction_rule = reaction.gene_reaction_rule + + for genes in gpr: + for gene in genes: + if not gene in self.genes: + self.genes[gene] = gene + + return cobra_reaction + + def convert_modelcompound(self, metabolite, bigg=False): + formula = metabolite.formula + name = metabolite.name + charge = metabolite.charge + mc_id = metabolite.id + compartment = metabolite.compartment + annotation = metabolite.annotation + + id = build_cpd_id(mc_id) + + if bigg and "bigg.metabolite" in annotation: + id = annotation["bigg.metabolite"] + "_" + compartment + # print(id) + + met = Metabolite( + id, formula=formula, name=name, charge=charge, compartment=compartment + ) + + met.annotation[ + self.SBO_ANNOTATION + ] = "SBO:0000247" # simple chemical - Simple, non-repetitive chemical entity. + if id.startswith("cpd"): + met.annotation["seed.compound"] = id.split("_")[0] + met.annotation.update(annotation) + return met + + def convert_modelreaction_stoichiometry(self, reaction): + object_stoichiometry = {} + s = reaction.stoichiometry + for metabolite_id in s: + if metabolite_id in self.metabolites_remap: + object_stoichiometry[ + self.cobramodel.metabolites.get_by_id( + self.metabolites_remap[metabolite_id] + ) + ] = s[metabolite_id] + return object_stoichiometry + + def create_binary_variables(self, rxnobj, forward=1, reverse=1): + if rxnobj.id not in self.binary_flux_variables: + self.binary_flux_variables[rxnobj.id] = dict() + self.binary_flux_constraints[rxnobj.id] = dict() + if ( + forward == 1 + and rxnobj.upper_bound > 0 + and "forward" not in self.binary_flux_variables[rxnobj.id] + ): + self.binary_flux_variables[rxnobj.id][ + "forward" + ] = self.cobramodel.problem.Variable( + rxnobj.id + "_fb", lb=0, ub=1, type="binary" + ) + self.cobramodel.add_cons_vars( + self.binary_flux_variables[rxnobj.id]["forward"] + ) + self.binary_flux_constraints[rxnobj.id][ + "forward" + ] = self.cobramodel.problem.Constraint( + 1000 * self.binary_flux_variables[rxnobj.id]["forward"] + - rxnobj.forward_variable, + lb=0, + ub=None, + name=rxnobj.id + "_fb", + ) + self.cobramodel.add_cons_vars( + self.binary_flux_constraints[rxnobj.id]["forward"] + ) + if ( + reverse == 1 + and rxnobj.lower_bound < 0 + and "reverse" not in self.binary_flux_variables[rxnobj.id] + ): + self.binary_flux_variables[rxnobj.id][ + "reverse" + ] = self.cobramodel.problem.Variable( + rxnobj.id + "_bb", lb=0, ub=1, type="binary" + ) + self.cobramodel.add_cons_vars( + self.binary_flux_variables[rxnobj.id]["reverse"] + ) + self.binary_flux_constraints[rxnobj.id][ + "reverse" + ] = self.cobramodel.problem.Constraint( + 1000 * self.binary_flux_variables[rxnobj.id]["reverse"] + - rxnobj.forward_variable, + lb=0, + ub=None, + name=rxnobj.id + "_bb", + ) + self.cobramodel.add_cons_vars( + self.binary_flux_constraints[rxnobj.id]["reverse"] + ) + + def binary_check_gapfilling_solution( + self, gapfilling_penalties, add_solution_exclusion_constraint + ): + objcoef = {} + flux_values = self.compute_flux_values_from_variables() + for rxnobj in self.cobramodel.reactions: + if rxnobj.id in gapfilling_penalties: + if ( + "reverse" in gapfilling_penalties[rxnobj.id] + and flux_values[rxnobj.id]["reverse"] > Zero + ): + self.create_binary_variables(rxnobj, 0, 1) + objcoef[self.binary_flux_variables[rxnobj.id]["reverse"]] = 1 + if ( + "forward" in gapfilling_penalties[rxnobj.id] + and flux_values[rxnobj.id]["forward"] > Zero + ): + self.create_binary_variables(rxnobj, 1, 0) + objcoef[self.binary_flux_variables[rxnobj.id]["forward"]] = 1 + with self.cobramodel: + # Setting all gapfilled reactions not in the solution to zero + min_reaction_objective = self.cobramodel.problem.Objective( + Zero, direction="min" + ) + for rxnobj in self.cobramodel.reactions: + if rxnobj.id in gapfilling_penalties: + if ( + "reverse" in gapfilling_penalties[rxnobj.id] + and flux_values[rxnobj.id]["reverse"] <= Zero + ): + rxnobj.lower_bound = 0 + if ( + "forward" in gapfilling_penalties[rxnobj.id] + and flux_values[rxnobj.id]["forward"] <= Zero + ): + rxnobj.upper_bound = 0 + rxnobj.update_variable_bounds() + # Setting the objective to be minimization of sum of binary variables + self.cobramodel.objective = min_reaction_objective + min_reaction_objective.set_linear_coefficients(objcoef) + with open("GapfillBinary.lp", "w") as out: + out.write(str(self.cobramodel.solver)) + self.cobramodel.optimize() + flux_values = self.compute_flux_values_from_variables() + if add_solution_exclusion_constraint == 1: + self.add_binary_solution_exclusion_constraint(flux_values) + return flux_values + + # Adds a constraint that eliminates a gapfilled solution from feasibility so a new solution can be obtained + def add_binary_solution_exclusion_constraint(self, flux_values): + count = len(self.solution_exclusion_constraints) + solution_coef = {} + solution_size = 0 + for reaction in self.binary_flux_variables: + for direction in self.binary_flux_variables[reaction]: + if flux_values[reaction][direction] > Zero: + solution_size += 1 + solution_coef[self.binary_flux_variables[reaction][direction]] = 1 + if len(solution_coef) > 0: + new_exclusion_constraint = self.cobramodel.problem.Constraint( + Zero, + lb=None, + ub=(solution_size - 1), + name="exclusion." + str(count + 1), + ) + self.cobramodel.add_cons_vars(new_exclusion_constraint) + self.cobramodel.solver.update() + new_exclusion_constraint.set_linear_coefficients(solution_coef) + self.solution_exclusion_constraints.append(new_exclusion_constraint) + return new_exclusion_constraint + return None + + # Takes gapfilled penalties and creates and objective function minimizing gapfilled reactions + def create_minimal_reaction_objective(self, penalty_hash, default_penalty=0): + reaction_objective = self.cobramodel.problem.Objective(Zero, direction="min") + obj_coef = dict() + for reaction in self.cobramodel.reactions: + if reaction.id in penalty_hash: + # Minimizing gapfilled reactions + if "reverse" in penalty_hash[reaction.id]: + obj_coef[reaction.reverse_variable] = abs( + penalty_hash[reaction.id]["reverse"] + ) + elif default_penalty != 0: + obj_coef[reaction.reverse_variable] = default_penalty + if "forward" in penalty_hash[reaction.id]: + obj_coef[reaction.forward_variable] = abs( + penalty_hash[reaction.id]["forward"] + ) + elif default_penalty != 0: + obj_coef[reaction.forward_variable] = default_penalty + else: + obj_coef[reaction.forward_variable] = default_penalty + obj_coef[reaction.reverse_variable] = default_penalty + + self.cobramodel.objective = reaction_objective + reaction_objective.set_linear_coefficients(obj_coef) + + # Required this function to add gapfilled compounds to a KBase model for saving gapfilled model + def convert_cobra_compound_to_kbcompound(self, cpd, kbmodel, add_to_model=1): + refid = "cpd00000" + if re.search("cpd\d+_[a-z]+", cpd.id): + refid = cpd.id + refid = re.sub("_[a-z]\d+$", "", refid) + cpd_data = { + "aliases": [], + "charge": cpd.charge, + "compound_ref": "~/template/compounds/id/" + refid, + "dblinks": {}, + "formula": cpd.formula, + "id": cpd.id, + "inchikey": "ALYNCZNDIQEVRV-UHFFFAOYSA-M", + "modelcompartment_ref": "~/modelcompartments/id/" + cpd.id.split("_").pop(), + "name": cpd.name(), + "numerical_attributes": {}, + "string_attributes": {}, + } + cpd_data = AttrDict(cpd_data) + if add_to_model == 1: + kbmodel.modelcompounds.append(cpd_data) + return cpd_data + + # Required this function to add gapfilled reactions to a KBase model for saving gapfilled model + def convert_cobra_reaction_to_kbreaction( + self, rxn, kbmodel, direction="=", add_to_model=1 + ): + rxnref = "~/template/reactions/id/rxn00000_c" + if re.search("rxn\d+_[a-z]+", rxn.id): + rxnref = "~/template/reactions/id/" + rxn.id + rxnref = re.sub("\d+$", "", rxnref) + rxn_data = { + "id": rxn.id, + "aliases": [], + "dblinks": {}, + "direction": direction, + "edits": {}, + "gapfill_data": {}, + "maxforflux": 1000000, + "maxrevflux": 1000000, + "modelReactionProteins": [], + "modelReactionReagents": [], + "modelcompartment_ref": "~/modelcompartments/id/" + rxn.id.split("_").pop(), + "name": rxn.name, + "numerical_attributes": {}, + "probability": 0, + "protons": 0, + "reaction_ref": rxnref, + "string_attributes": {}, + } + rxn_data = AttrDict(rxn_data) + for cpd in rxn.metabolites: + if cpd.id not in kbmodel.modelcompounds: + convert_cobra_compound_to_kbcompound(cpd, kbmodel, 1) + rxn_data.modelReactionReagents.append( + { + "coefficient": rxn.metabolites[cpd], + "modelcompound_ref": "~/modelcompounds/id/" + cpd.id, + } + ) + if add_to_model == 1: + kbmodel.modelreactions.append(rxn_data) + return rxn_data + + def convert_objective_to_constraint(self, lower_bound, upper_bound): + old_obj_variable = self.cobramodel.problem.Variable( + name="old_objective_variable", lb=lower_bound, ub=upper_bound + ) + old_obj_constraint = self.cobramodel.problem.Constraint( + self.cobramodel.solver.objective.expression - old_obj_variable, + lb=0, + ub=0, + name="old_objective_constraint", + ) + self.cobramodel.add_cons_vars([old_obj_variable, old_obj_constraint]) + + def compute_flux_values_from_variables(self): + flux_values = {} + for rxnobj in self.cobramodel.reactions: + flux_values[rxnobj.id] = {} + flux_values[rxnobj.id]["reverse"] = rxnobj.reverse_variable.primal + flux_values[rxnobj.id]["forward"] = rxnobj.forward_variable.primal + return flux_values + + def compute_gapfilled_solution(self, penalties, flux_values=None): + if flux_values == None: + flux_values = self.compute_flux_values_from_variables() + output = {"reversed": {}, "new": {}} + for reaction in self.cobramodel.reactions: + if reaction.id in penalties: + if ( + flux_values[reaction.id]["forward"] > Zero + and "forward" in penalties[reaction.id] + ): + if "added" in penalties[reaction.id]: + output["new"][reaction.id] = ">" + else: + output["reversed"][reaction.id] = ">" + elif ( + flux_values[reaction.id]["reverse"] > Zero + and "reverse" in penalties[reaction.id] + ): + if "added" in penalties[reaction.id]: + output["new"][reaction.id] = "<" + else: + output["reversed"][reaction.id] = "<" + return output + + def add_gapfilling_solution_to_kbase_model(self, newmodel, penalties, media_ref): + gfid = None + if gfid == None: + largest_index = 0 + for gapfilling in newmodel.gapfillings: + current_index = gapfilling.id.split(".").pop() + if largest_index == 0 or largest_index < current_index: + largest_index = current_index + gfid = "gf." + str(largest_index + 1) + newmodel.gapfillings.append( + { + "gapfill_id": newmodel.id + "." + gfid, + "id": gfid, + "integrated": 1, + "integrated_solution": "0", + "media_ref": media_ref, + } + ) + for reaction in self.cobramodel.reactions: + if reaction.id in penalties: + if ( + reaction.forward_variable.primal > Zero + and "forward" in penalties[reaction.id] + ): + if reaction.id not in newmodel.modelreactions: + self.convert_cobra_reaction_to_kbreaction( + reaction, newmodel, ">", 1 + ) + gfrxn = newmodel.modelreactions.get_by_id(reaction.id) + gfrxn.gapfill_data[gfid] = dict() + gfrxn.gapfill_data[gfid]["0"] = [">", 1, []] + elif ( + reaction.forward_variable.primal > Zero + and "reverse" in penalties[reaction.id] + ): + if reaction.id not in newmodel.modelreactions: + self.convert_cobra_reaction_to_kbreaction( + reaction, newmodel, "<", 1 + ) + gfrxn = newmodel.modelreactions.get_by_id(reaction.id) + gfrxn.gapfill_data[gfid] = dict() + gfrxn.gapfill_data[gfid]["0"] = ["<", 1, []] + + def compute_reaction_scores(self, weigh_all_events_equally=1, weights=None): + reaction_genes = {} + if "genome_ref" in self.fbamodel: + anno_api = annotation_ontology_api() + events = anno_api.get_annotation_ontology_events( + { + "input_ref": self.fbamodel["genome_ref"], + } + ) + for event in events: + for gene in event["ontology_terms"]: + if "modelseed_ids" in event["ontology_terms"][gene]: + for rxn in event["ontology_terms"][gene]["modelseed_ids"]: + newrxn = re.sub("^MSRXN:", "", rxn) + if newrxn not in reaction_genes: + reaction_genes[newrxn] = {} + if gene not in reaction_genes[newrxn]: + reaction_genes[newrxn][gene] = 0 + if weigh_all_events_equally == 1 or weights == None: + reaction_genes[newrxn][gene] += 1 + elif event["description"] in weights: + reaction_genes[newrxn][gene] += weights[ + event["description"] + ] + elif event["event_id"] in weights: + reaction_genes[newrxn][gene] += weights[ + event["event_id"] + ] + elif event["id"] in weights: + reaction_genes[newrxn][gene] += weights[event["id"]] + return reaction_genes + + def replicate_model(self, count): + newmodel = Model(self.cobramodel.id + "_rep" + str(count)) + utilities = KBaseFBAUtilities( + newmodel, + newmodel, + self.kbapi, + self.media, + default_uptake=self.default_uptake, + default_excretion=self.default_excretion, + blacklist=self.blacklist, + ) + metabolites = [] + reactions = [] + metabolite_hash = {} + for i in range(0, count): + for metabolite in self.cobramodel.metabolites: + metabolite = metabolite.copy() + metabolite.id = metabolite.id + "__" + str(i) + metabolite_hash[metabolite.id] = metabolite + metabolites.append(metabolite) + for reaction in self.cobramodel.reactions: + reaction = reaction.copy() + reaction.id = reaction.id + "__" + str(i) + input_metabolites = {} + for metabolite in reaction.metabolites: + newid = metabolite.id + "__" + str(i) + input_metabolites[metabolite_hash[newid]] = reaction.metabolites[ + metabolite + ] + reaction.add_metabolites(input_metabolites, combine=False) + reactions.append(reaction) + newmodel.add_metabolites(metabolites) + newmodel.add_reactions(reactions) + return utilities diff --git a/modelseedpy/core/msensemble.py b/modelseedpy/core/msensemble.py index d7ea2b37..2c212ce0 100644 --- a/modelseedpy/core/msensemble.py +++ b/modelseedpy/core/msensemble.py @@ -264,3 +264,4 @@ def run_atp_method( self.rebuild_from_models(models) def run_gapfilling(self): + pass \ No newline at end of file diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index ad365946..f0610f8f 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -485,7 +485,7 @@ def run_multi_gapfill( if gapfilling_mode == "Cumulative": self.gfpkgmgr.getpkg("GapfillingPkg").compute_gapfilling_penalties(exclusion_solution=cumulative_solution,reaction_scores=self.reaction_scores) self.gfpkgmgr.getpkg("GapfillingPkg").build_gapfilling_objective_function() - if gapfilling_mode == "Global":b + if gapfilling_mode == "Global": #Now we run simultaneous gapfilling on a combination of all our various gapfilled models full_solution = self.run_global_gapfilling( media_list, diff --git a/modelseedpy/core/msminimalmedia.py b/modelseedpy/core/msminimalmedia.py new file mode 100644 index 00000000..7efcf414 --- /dev/null +++ b/modelseedpy/core/msminimalmedia.py @@ -0,0 +1,696 @@ +from modelseedpy.core.exceptions import ObjectiveError, FeasibilityError +from modelseedpy.fbapkg.reactionusepkg import ReactionUsePkg +from modelseedpy.core.fbahelper import FBAHelper +from modelseedpy.core.msmodelutl import MSModelUtil +from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg +from itertools import combinations, permutations, chain +from optlang import Variable, Constraint +from cobra.medium import minimal_medium +from optlang.symbolics import Zero +from math import isclose, inf, factorial +from deepdiff import DeepDiff +from time import process_time +from pprint import pprint +import logging +import json, re + +logger = logging.getLogger(__name__) + + +def _exchange_solution(sol_dict): + if isinstance(list(sol_dict.keys())[0], str): + return { + rxn: abs(flux) + for rxn, flux in sol_dict.items() + if "EX_" in rxn and flux < 0 + } + elif hasattr(list(sol_dict.keys())[0], "id"): + return { + rxn.id: abs(flux) + for rxn, flux in sol_dict.items() + if "EX_" in rxn.id and flux < 0 + } + return { + rxn.name: abs(flux) + for rxn, flux in sol_dict.items() + if "EX_" in rxn.name and flux < 0 + } + + +def _model_growth(sol_dict): + return sum( + [flux for var, flux in sol_dict.items() if re.search(r"(^bio\d+$)", var.name)] + ) + + +def _var_to_ID(var): + rxnID = var.name + if "_ru" in rxnID: + rxnID = rxnID.replace("_ru", "") + return rxnID + + +def _compatibilize(org_models, printing=False): + from commscores import GEMCompatibility + + return GEMCompatibility.standardize( + org_models, + conflicts_file_name="standardization_corrections.json", + printing=printing, + ) + + +def verify(org_model, min_media): + model2 = org_model.copy() + model2.medium = min_media + return model2.optimize() + + +def bioFlux_check(model, sol=None, sol_dict=None, min_growth=0.1): + sol_dict = sol_dict or FBAHelper.solution_to_variables_dict(sol, model) + # print({k:v for k,v in sol_dict.items() if v > 1E-8}) + simulated_growth = max( + sum( + [ + flux + for var, flux in sol_dict.items() + if re.search(r"(^bio\d+$)", var.name) + ] + ), + sol.objective_value, + ) + if simulated_growth < min_growth * 0.9999: + raise ObjectiveError( + f"The assigned minimal_growth of {min_growth} was not maintained during the simulation," + f" where the observed growth value was {simulated_growth}." + ) + if sol.status != "optimal": + display(sol) + return sol_dict + + +def minimizeFlux_withGrowth(model_util, min_growth, obj): + model_util.add_minimal_objective_cons(min_growth) + model_util.add_objective(obj, "min") + # print(model_util.model.objective) + # print([(cons.lb, cons.expression) for cons in model_util.model.constraints if "min" in cons.name]) + sol = model_util.model.optimize() + # print(sol.objective_value) + sol_dict = bioFlux_check(model_util.model, sol, min_growth=min_growth) + return sol, sol_dict + + +class MSMinimalMedia: + + @staticmethod + def _influx_objective(model_util, interacting): + rxns = ( + model_util.exchange_list() if interacting else model_util.transport_list() + ) + influxes = [] + for rxn in rxns: + if any( + ["e0" in met.id for met in rxn.reactants] + ): # this is essentially every exchange + influxes.append(rxn.reverse_variable) + elif any( + ["e0" in met.id for met in rxn.products] + ): # this captures edge cases or transporters + influxes.append(rxn.forward_variable) + else: + logger.critical( + f"The reaction {rxn} lacks exchange metabolites, which indicates an error." + ) + return influxes + + @staticmethod + def minimize_flux( + org_model, min_growth=None, environment=None, interacting=True, printing=True + ): + """minimize the total in-flux of exchange reactions in the model""" + if org_model.slim_optimize() == 0: + raise ObjectiveError( + f"The model {org_model.id} possesses an objective value of 0 in complete media, " + "which is incompatible with minimal media computations." + ) + model_util = MSModelUtil(org_model, True) + model_util.add_medium(environment or model_util.model.medium) + # define the MILP + min_growth = ( + model_util.model.slim_optimize() + if min_growth is None + else min(min_growth, model_util.model.slim_optimize()) + ) + # min_flux = MSMinimalMedia._min_consumption_objective(model_util, interacting) + media_exchanges = MSMinimalMedia._influx_objective(model_util, interacting) + # parse the minimal media + sol, sol_dict = minimizeFlux_withGrowth( + model_util, min_growth, sum(media_exchanges) + ) + min_media = _exchange_solution(sol_dict) + total_flux = sum([abs(flux) for flux in min_media.values()]) + simulated_sol = verify(org_model, min_media) + if simulated_sol.status != "optimal": + raise FeasibilityError( + f"The simulation was not optimal, with a status of {simulated_sol.status}" + ) + if printing: + print( + f"The minimal flux media for {org_model.id} consists of {len(min_media)} compounds and a {total_flux} total influx," + f" with a growth value of {simulated_sol.objective_value}" + ) + return min_media, sol + + @staticmethod + def _min_consumption_objective(model_util, interacting): + rxns = ( + model_util.exchange_list() if interacting else model_util.transport_list() + ) + vars = {} + for rxn in rxns: + cons_name = rxn.id + "_bin" + if cons_name in model_util.model.constraints: + print( + f"The {cons_name} constraint already exists in " + f"{model_util.model.id} and thus is skipped.\n" + ) + continue + + # define the variable + var_name = rxn.id + "_ru" + if var_name in model_util.model.variables: + print( + f"The {var_name} variable already exists in " + f"{model_util.model.id} and thus is skipped.\n" + ) + continue + vars[rxn.id] = Variable(var_name, lb=0, ub=1, type="binary") + model_util.add_cons_vars([vars[rxn.id]]) + # bin_flux: {rxn_bin}*1000 >= {rxn_rev_flux} + model_util.create_constraint( + Constraint(Zero, lb=0, ub=None, name=cons_name), + coef={vars[rxn.id]: 1000, rxn.reverse_variable: -1}, + ) + return vars + + @staticmethod + def conserved_exchanges(): + pass + + @staticmethod + def relative_media(): + pass + + @staticmethod + def minimize_components( + org_model, + min_growth=0.1, + environment=None, + interacting=True, + solution_limit=5, + printing=True, + ): + """minimize the quantity of metabolites that are consumed by the model""" + if org_model.slim_optimize() == 0: + raise ObjectiveError( + f"The model {org_model.id} possesses an objective value of 0 in complete media, " + "which is incompatible with minimal media computations." + ) + model_util = MSModelUtil(org_model, True) + model_util.add_timeout(10) + print("Minimal Components media") + if environment: + model_util.add_medium(environment) + # ic(org_model, min_growth, solution_limit) + model_util.add_minimal_objective_cons( + min_growth + ) # , model_util.model.reactions.bio1.flux_expression) + # print(model_util.model.constraints[-1]) + # define the binary variable and constraint + time1 = process_time() + variables = { + "ru": MSMinimalMedia._min_consumption_objective(model_util, interacting) + } + model_util.add_objective(sum(variables["ru"].values()), "min") + time2 = process_time() + print(f"\nDefinition of minimum objective time: {(time2 - time1)/60} mins") + + # determine each solution + # interdependencies = {} + solution_dicts, min_media = [], [0] * 1000 + sol = ( + model_util.model.optimize() + ) # TODO This is the troublesome line that occasionally refuses to solve + if "optimal" not in sol.status: + raise FeasibilityError( + f"The simulation for minimal uptake in {model_util.model.id} was {sol.status}." + ) + time3 = process_time() + broken = False + while ( + not broken + and sol.status == "optimal" + and len(solution_dicts) < solution_limit + ): + print(f"Iteration {len(solution_dicts)}", end="\r") + sol_dict = FBAHelper.solution_to_variables_dict(sol, model_util.model) + ## ensure that the minimal growth is respected + simulated_growth = _model_growth(sol_dict) + if simulated_growth < min_growth * 0.9999: + raise ObjectiveError( + f"The minimal growth of {min_growth} was not maintained; " + f"the simulation achieved {simulated_growth} growth." + ) + sol_rxns_dict = FBAHelper.solution_to_rxns_dict(sol, model_util.model) + solution_dicts.append(sol_dict) + sol_media = _exchange_solution(sol_rxns_dict) + min_media = sol_media if len(sol_media) < len(min_media) else min_media + ## omit the solution from future searches + model_util.create_constraint( + Constraint( + Zero, + lb=None, + ub=len(sol_dict) - 1, + name=f"exclude_sol{len(solution_dicts)}", + ), + sol_dict, + ) + + # search the permutation space by omitting previously investigated solution_dicts + # sol_exchanges = [rxn for rxn in sol_dict if "EX_" in rxn.name] + # interdependencies[count] = MSMinimalMedia._examine_permutations( + # model, sol_exchanges, variables, sol_dict, count, interacting) + try: + sol = model_util.model.optimize() + except: + broken = True + if broken: + break + if not solution_dicts: + raise FeasibilityError("The model was not feasibly simulated.") + min_media = {rxn: flux for rxn, flux in min_media.items()} + simulated_sol = verify(org_model, min_media) + if simulated_sol.status != "optimal": + raise FeasibilityError( + f"The predicted media {min_media} is not compatible with its model {org_model.id}, " + f"and possesses a(n) {simulated_sol.status} status." + ) + time6 = process_time() + print(f"Optimization time: {(time6-time3)/60} mins") + return min_media + + @staticmethod + def _knockout(org_model, rxnVar, variables, sol_dict, sol_index, interacting): + # knockout the specified exchange + knocked_model_utl = MSModelUtil(org_model, True) + knocked_model_utl, vars = MSMinimalMedia._min_consumption_objective( + knocked_model_utl, interacting + ) + coef = {rxnVar: 0} + if interacting: + coef.update( + { + variables["ru"][_var_to_ID(rxnVar2)]: 1 + for rxnVar2 in sol_dict + if rxnVar != rxnVar2 and "EX_" in rxnVar2.name + } + ) + else: + coef.update( + { + variables["ru"][_var_to_ID(rxnVar2)]: 1 + for rxnVar2 in sol_dict + if ( + rxnVar != rxnVar2 + and any(["_e0" in met.id for met in rxnVar2.metabolites]) + ) + } + ) + knocked_model_utl.create_constraint( + Constraint(Zero, lb=0.1, ub=None, name=f"{rxnVar.name}-sol{sol_index}"), + coef, + ) + return knocked_model_utl.optimize() + + @staticmethod + def _examine_permutations( + model, exchange_ids_to_explore, variables, sol_dict, sol_index, interacting + ): + for index, ex in enumerate(exchange_ids_to_explore): + print( + f"{ex.name}: {index}/{len(exchange_ids_to_explore)-1} exchanges to explore" + ) + sol_dict_sans_ex = sol_dict.copy() + sol_dict_sans_ex.pop(ex) + # interdependencies[sol_index][exID] = MSMinimalMedia._examine_permutations( + # exID, sol_dict, sol_index, variables, sol_dict_sans_ex) + interdependencies = {} + + ## explore permutations after removing the selected variable + diff = DeepDiff( + sol_dict_sans_ex, + FBAHelper.solution_to_dict( + MSMinimalMedia._knockout( + model, ex, variables, sol_dict, sol_index, interacting + ) + ), + ) + if ( + diff + ): # the addition of new exchanges or altered exchange fluxes are detected after the removed exchange + print(diff) + for key, changes in diff.items(): + # for change in changes: + # print(change) + changed_reactions = [ + re.search("(?<=\[')(.+)(?='\])", change).group() + for change in changes + ] + # this dictionary should be parsed into a list of substitute metabolites and a list of functionally coupled reactions + for exchange in [rxn for rxn in changed_reactions if "EX_" in rxn]: + interdependencies[sol_index][exchange] = ( + MSMinimalMedia._examine_permutations( + model, + exchange_ids_to_explore, + variables, + sol_dict, + sol_index + 1, + interacting, + ) + ) + # coef = {variables["met"][exID]: 0 for cpd in new_mets.keys()} + # coef.update({variables["met"][exID]: 1 for exID in sol_dict if exID not in new_mets.keys()}) + # cpd_name = "_".join(new_mets.keys()) + new_sol = model.optimize() + new_sol_dict = FBAHelper.solution_to_variables_dict(new_sol, model) + new_sol_exchanges = [rxn for rxn in sol_dict if "EX_" in rxn.name] + if new_sol.status != "optimal": + return interdependencies + MSMinimalMedia._examine_permutations( + model, + new_sol_exchanges, + variables, + new_sol_dict, + sol_index + 1, + interacting, + ) + return interdependencies + + @staticmethod + def determine_min_media( + model, + minimization_method="minFlux", + min_growth=None, + environment=None, + interacting=True, + solution_limit=5, + printing=True, + ): + if minimization_method == "minFlux": + return MSMinimalMedia.minimize_flux( + model, min_growth, environment, interacting, printing + ) + if minimization_method == "minComponents": + return minimal_medium(model, min_growth, minimize_components=True) + # return MSMinimalMedia.minimize_components( + # model, min_growth, environment, interacting, solution_limit, printing) + if minimization_method == "jenga": + return MSMinimalMedia.jenga_method(model, printing=printing) + + @staticmethod + def comm_media_est( + models, + comm_model, + minimization_method="minComponents", + min_growth=0.1, + environment=None, + interacting=True, + n_solutions=5, + printing=False, + ): + media = {"community_media": {}, "members": {}} + # print("com_media_est") + for org_model in models: + model_util = MSModelUtil(org_model, True) + # print(model_util.model.optimize()) + if environment: + # print(environment) + model_util.add_medium(environment) + # reactions = [rxn.name for rxn in model.variables] + # duplicate_reactions = DeepDiff(sorted(set(reactions)), sorted(reactions)) + # if duplicate_reactions: + # logger.critical(f'CodeError: The model {model.id} contains {duplicate_reactions}' + # f' that compromise the model.') + media["members"][model_util.model.id] = { + "media": MSMinimalMedia.determine_min_media( + model_util.model, + minimization_method, + min_growth, + environment, + interacting, + n_solutions, + printing, + ), + "solution": FBAHelper.solution_to_dict(model_util.model.optimize()), + } + if minimization_method == "jenga": + media["community_media"] = FBAHelper.sum_dict( + media["members"][model_util.model.id]["media"], + media["community_media"], + ) + if comm_model: + comm_util = MSModelUtil(comm_model) + if environment: + comm_util.add_medium(environment) + # if minimization_method == "jenga": + # print("Community models are too excessive for direct assessment via the JENGA method; " + # "thus, the community minimal media is estimated as the combination of member media.") + # return media + media["community_media"] = MSMinimalMedia.determine_min_media( + comm_model, + minimization_method, + min_growth, + environment, + interacting, + n_solutions, + printing, + ) + return media + + @staticmethod + def interacting_comm_media( + models, + comm_model, + minimization_method="jenga", + min_growth=0.1, + media=None, + environment=None, + printing=True, + ): + # define the community minimal media + media = media or MSMinimalMedia.comm_media_est( + models, + comm_model, + min_growth, + minimization_method, + environment, + printing=printing, + ) + org_media = media["community_media"].copy() + original_time = process_time() + # remove exchanges that can be satisfied by cross-feeding + for model in models: + for rxnID, flux in media["members"][model.id]["solution"].items(): + if ( + rxnID in media["community_media"] and flux > 0 + ): ## outflux in solutions + stoich = list( + model.reactions.get_by_id(rxnID).metabolites.values() + )[0] + media["community_media"][rxnID] += ( + flux * stoich + ) ## the cytoplasmic removal is captured by negative reactant stoich + media["community_media"] = { + ID: flux for ID, flux in media["community_media"].items() if flux > 0 + } # influx in media + syntrophic_diff = DeepDiff(org_media, media["community_media"]) + changed_quantity = ( + 0 + if not syntrophic_diff + else len(list(chain(*[v for v in list(dict(syntrophic_diff).values())]))) + ) + if printing: + print( + f"Syntrophic fluxes examined after {(process_time() - original_time) / 60} minutes, " + f"with {changed_quantity} change(s): {syntrophic_diff}" + ) + return media + + @staticmethod + def jenga_method( + org_model, + org_media=None, + conserved_cpds: list = None, + export=True, + printing=True, + compatibilize=False, + environment=None, + ): + # copy and compatibilize the parameter objects + if org_model.slim_optimize() == 0: + raise ObjectiveError( + f"The model {org_model.id} possesses an objective value of 0 in complete media, " + "which is incompatible with minimal media computations." + ) + copied_model = org_model.copy() + copied_model.medium = environment or copied_model.medium + if compatibilize: + copied_model = _compatibilize(copied_model) + original_media = org_media or MSMinimalMedia.minimize_components(copied_model) + # {cpd.replace("EX_", ""): flux for cpd, flux in .items()} + + # identify removal=ble compounds + original_time = process_time() + copied_model.medium = original_media + original_obj_value = org_model.optimize().objective_value + redundant_cpds = set() + for cpd in original_media: + new_media = original_media.copy() + new_media.pop(cpd) + copied_model.medium = new_media + sol_obj_val = copied_model.slim_optimize() + if isclose(sol_obj_val, original_obj_value, abs_tol=1e-4): + redundant_cpds.add(cpd) + else: + logger.debug( + f"The {sol_obj_val} objective value after the removal of {cpd} " + f"does not match the original objective value of {original_obj_value}." + ) + if not redundant_cpds: + logger.debug( + "None of the media components were determined to be removable." + ) + return original_media + if len(redundant_cpds) > 9: + import sigfig + + num_permuts = sigfig.round( + factorial(len(redundant_cpds)), sigfigs=2, format="sci" + ) + raise FeasibilityError( + f"The model {copied_model.id} contains {len(redundant_cpds)} removable" + f" compounds, which yields {num_permuts} permutations and is untenable for computation." + " Select a different minimal media method such as 'minFlux' or 'minComponents'." + ) + + # vet all permutation removals of the redundant compounds + permuts = [p for p in permutations(redundant_cpds)] + if printing: + print( + f"The {len(permuts)} permutations of the {redundant_cpds} redundant compounds, " + "from absolute tolerance of 1e-4, will be examined." + ) + permut_results, failed_permut_starts = [], [] + best = 0 + for perm_index, permut in enumerate(permuts): + print(f"{perm_index+1}/{len(permuts)}", end="\r") + successful_removal = 0 + permut_segments = [permut[:index] for index in range(len(permut), 2, -1)] + ## eliminate previously discovered failures and successes, respectively + if any([seg in failed_permut_starts for seg in permut_segments]): + continue + if best >= len(permut) / 2 and any( + [ + set(permut[: best - 1]) == set(list(success)[: best - 1]) + for success in permut_results + ] + ): + continue + new_media = original_media.copy() + for cpd in permut: + ### parameterize and simulate the community + new_media.pop(cpd) + copied_model.medium = new_media + sol = copied_model.optimize() + if not isclose(sol.objective_value, original_obj_value, abs_tol=1e-7): + failed_permut_starts.append(permut[: successful_removal + 1]) + break + successful_removal += 1 + + if successful_removal >= best: + if successful_removal > best: + best = successful_removal + permut_results = [] + permut_removable = permut[ + :best + ] # slice only the elements that are removable + if permut_removable not in permut_results: + permut_results.append(permut_removable) + if printing: + print(permut_removable) + print("best:", best) + + # filter to only the most minimal media + unique_combinations, unique_paths = [], [] + for removal_path in permut_results: + path_permutations = permutations(removal_path) + if all([path in permut_results for path in path_permutations]): + for com in combinations(removal_path, len(removal_path)): + com = set(com) + if com not in unique_combinations: + unique_combinations.append(com) + else: + unique_paths.append(removal_path) + if unique_combinations and printing: + print("Unique combinations:") + print(len(unique_combinations), unique_combinations) + if unique_paths and printing: + print("Unique paths:") + print(len(unique_paths), unique_paths) + + # further remove compounds from the media, while defaulting to the removal with the largest ID values + best_removals = {} + possible_removals = unique_combinations + unique_paths + if conserved_cpds: + possible_removals = [ + opt + for opt in possible_removals + if not any(cpd in conserved_cpds for cpd in opt) + ] + best = -inf + for removal in possible_removals: + cpdID_sum = sum( + [ + int(cpd.split("_")[1].replace("cpd", "") if "cpd" in cpd else 500) + for cpd in removal + ] + ) + if cpdID_sum > best: + best = cpdID_sum + best_removals = {best: [removal]} + elif cpdID_sum == best: + best_removals[best].append(removal) + ## arbitrarily select the first removal from those that both maximize the summed cpdID and avoid conserved compounds + media = FBAHelper.remove_media_compounds( + original_media, list(best_removals.values())[0][0], printing + ) + if printing: + print(best_removals) + pprint(media) + + # communicate results + jenga_media = media.copy() + jenga_difference = DeepDiff(original_media, jenga_media) + changed_quantity = ( + 0 if not jenga_difference else len(list(jenga_difference.values())[0]) + ) + if printing: + print( + f"Jenga fluxes examined after {(process_time()-original_time)/60} minutes, " + f"with {changed_quantity} change(s): {jenga_difference}" + ) + if export: + export_name = copied_model.id + "_media.json" + with open(export_name, "w") as out: + json.dump(media, out, indent=3) + return media diff --git a/modelseedpy/core/msprobability.py b/modelseedpy/core/msprobability.py new file mode 100644 index 00000000..a4f913a0 --- /dev/null +++ b/modelseedpy/core/msprobability.py @@ -0,0 +1,246 @@ +from cobrakbase.core.kbasefba.fbamodel_from_cobra import CobraModelConverter +from modelseedpy.fbapkg.mspackagemanager import MSPackageManager +from modelseedpy.community.mscommunity import MSCommunity +from cobrakbase.core.kbasefba.fbamodel import FBAModel +from cobra.io import write_sbml_model, read_sbml_model +from optlang import Objective +from json import load, dump +from os import path, mkdir +from cobra import Model +import re + + +def add_biomass_objective(megaModel, captured_rxnIDs): + if "bio1" in captured_rxnIDs: + megaModel.objective = Objective( + megaModel.reactions.bio1.flux_expression, direction="max" + ) + else: + # select the most conserved biomass composition + for rxn in megaModel.reactions: + if "biomass" and not "EX_" in rxn.id: + megaModel.objective = Objective(rxn.flux_expression, direction="max") + break + megaModel.solver.update() + return megaModel + + +class MSProbability: + + # TODO - add the parallelization code with an argument flag + @staticmethod + def megaModel( + clades_paths, kbase_api=None, reaction_counts_path=None, numTotal="numMembers",copy_genes=True + ): + # compute the reaction frequency of the models in a given clade + broken_models, megaModels = [], [] + # models_paths = glob(f"{models_path}/*.xml") + for clade, paths in clades_paths.items(): + print(clade+"1") + if not reaction_counts_path: + print(clade+"2") + if not path.exists("reaction_counts"): + mkdir("reaction_counts") + reaction_counts = {} + for index, model_path in enumerate(paths): + print( + f"{model_path}\tindex {index}\t\t\t\t\t\t\t\t\t\t\t\t", end="\r" + ) + try: + model = ( + read_sbml_model(model_path) + if not kbase_api + else kbase_api.get_from_ws(model_path) + ) + except Exception as e: + print("broken", e, model_path) + broken_models.append(model_path) + continue + # print(f"\n{len(model.reactions)} reactions", ) + for rxn in model.reactions: + if rxn.id in reaction_counts: + reaction_counts[rxn.id] += 1 + else: + reaction_counts[rxn.id] = 1 + # TODO storing a list of the rxn objects will save computational effort in the subsequent step + reaction_counts.update({numTotal: len(paths) - len(broken_models)}) + reaction_counts.update( + { + rxnID: (count / reaction_counts[numTotal]) + for rxnID, count in reaction_counts.items() + if rxnID != numTotal + } + ) + with open(f"reaction_counts/{clade}_reactions.json", "w") as jsonOut: + dump(reaction_counts, jsonOut, indent=3) + else: + try: + with open(f"{reaction_counts_path}/{clade}.json", "r") as jsonIn: + reaction_counts = load(jsonIn) + except: + print(f"broken model: {clade}") + continue + + # constructing the probabilistic clade model + megaModel = FBAModel( + { + "id": clade, + "name": f"MegaModel for {clade} from {reaction_counts[numTotal]} members", + } + ) + # megaModel = CobraModelConverter(Model(clade, name=f"MegaModel for {clade} from {reaction_counts[numTotal]} members")).build() + remaining_rxnIDs = set(list(reaction_counts.keys())) + captured_reactions, captured_rxnIDs = [], set() + + print("\n", clade) # , end="\t") + found_rxn_hash = {} + for model_path in paths: + print(f"{model_path}\t\t\t\t\t\t\t\t\t\t\t\t", end="\r") + try: + model = ( + read_sbml_model(model_path) + if not kbase_api + else kbase_api.get_from_ws(model_path) + ) + except Exception as e: + print("broken", e, model_path) + broken_models.append(model_path) + continue + for rxn in model.reactions: + if rxn.id not in found_rxn_hash: + found_rxn_hash[rxn.id] = {"genes":{},"rxn":rxn} + captured_reactions.append(rxn) + elif copy_genes: + for gene in rxn.genes: + if gene.id not in found_rxn_hash[rxn.id]: + found_rxn_hash[rxn.id]["genes"][gene.id] = 1 + if len(found_rxn_hash[rxn.id]["rxn"].gene_reaction_rule) > 0: + found_rxn_hash[rxn.id]["rxn"].gene_reaction_rule += f" or {gene.id}" + else: + found_rxn_hash[rxn.id]["rxn"].gene_reaction_rule = gene.id + if captured_reactions == []: + print(f"\tNo models for {clade} are defined.") + continue + ## add reactions + megaModel.add_reactions(list(captured_reactions)) + for rxn in megaModel.reactions: + rxn.notes["probability"] = reaction_counts[rxn.id] + ## add objective + megaModel = add_biomass_objective(megaModel, captured_rxnIDs) + ## evaluate the model and export + missingRxns = ( + set([rxnID for rxnID in reaction_counts]) + - set([rxn.id for rxn in megaModel.reactions]) + - {numTotal} + ) + if missingRxns != set(): + print("\nmissing reactions: ", missingRxns) + write_sbml_model(megaModel, clade+".xml") + megaModels.append(megaModel) + print("\tfinished") + return megaModels if len(clades_paths) > 1 else megaModels[0] + + @staticmethod + def apply_threshold(model, threshold=0.5): + for rxn in model.reactions: + if rxn.notes["probability"] < threshold: + rxn.lower_bound = rxn.upper_bound = 0 + return model + + # "MS2 - Probabilistic modeling" would create a probabilstic model and optionally an ensemble model from the probabilistic model + + # TODO - develop a separate App from + + # TODO - Construct another code to aggregate functions from all genomes into a single model, where the genes themselves would be mapped with a probability + ## only count genomes with SSOs + ## this would accelerate the construction of making a megaModel + ## specify an ANI cut-off and a closeness to the top-hitting genome + ## yield two models: augmented MAG model with only conserved functions and the probabilistic model with all functions + ## create the KBase module + GitHub repository, after Chris settles on a name + + # TODO - integrate the ensembleFBA modules + repositories + + # TODO - update the CommunityFBA update to run probabilistic models + + @staticmethod + def prFBA( + model_s_, + environment=None, + abundances=None, + min_prob=0.01, + prob_exp=1, + ex_weight=100, + commkinetics=None, + kinetics_coef=1000, + printLP=False, + expression=None + ): + from modelseedpy.community.commhelper import build_from_species_models + from modelseedpy.core.msmodelutl import MSModelUtil + from modelseedpy.fbapkg.elementuptakepkg import ElementUptakePkg + from optlang.symbolics import Zero + + # commkinetics = commkinetics if commkinetics is not None else len(model_s_) > 1 + mdlUtil = MSModelUtil( + model_s_ + if len(model_s_) == 1 + else build_from_species_models( + model_s_, abundances=abundances, commkinetics=commkinetics + ) + ) + if environment is not None: + mdlUtil.add_medium(environment) + # constrain carbon consumption and community composition + elepkg = ElementUptakePkg(mdlUtil.model) + elepkg.build_package({"C": 100}) + ## the total flux through the members proportional to their relative abundances + if not commkinetics and len(model_s_) > 1: + pkgmgr = MSPackageManager.get_pkg_mgr(mdlUtil.model) + MSCommObj = MSCommunity(mdlUtil.model, model_s_) + pkgmgr.getpkg("CommKineticPkg").build_package(kinetics_coef, MSCommObj) + + # constrain the model to 95% of the optimum growth + maxBioSol = mdlUtil.model.slim_optimize() + mdlUtil.add_minimal_objective_cons(maxBioSol * 0.95) + + # weight internal reactions based on their probabilities + ## minimize: sum_r^R ((1-probabilities^prob_exp_r)*flux_r + min_prob) + sum_ex^EX(ex_weight*EX) + coef = {} + for rxn in mdlUtil.model.reactions: + if "rxn" == rxn.id[0:3]: + coef.update( + { + rxn.forward_variable: max( + min_prob, (1 - float(rxn.notes["probability"]) ** prob_exp) + ) + } + ) + coef.update( + { + rxn.reverse_variable: max( + min_prob, (1 - float(rxn.notes["probability"]) ** prob_exp) + ) + } + ) + elif "EX_" == rxn.id[0:3]: + coef.update({rxn.forward_variable: ex_weight}) + coef.update({rxn.reverse_variable: ex_weight}) + mdlUtil.add_objective(Zero, "min", coef) + + print([cons.name for cons in mdlUtil.model.constraints]) + + if printLP: + with open("prFBA.lp", "w") as out: + out.write(str(mdlUtil.model.solver)) + + # simulate the probabilistic model with the respective probabilities + return mdlUtil.model.optimize() + + @staticmethod + def iterative_simulation(time_iterative_data): + pass + + def expressionData(data): + # iterate over the reactions, genes, and keep the highest expression score + # turn off reactions that are below a threshold, ensure that the growth is unchanged, otherwise restore the reaction. + pass diff --git a/modelseedpy/core/optlanghelper.py b/modelseedpy/core/optlanghelper.py new file mode 100644 index 00000000..b616ab90 --- /dev/null +++ b/modelseedpy/core/optlanghelper.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- +""" +Created on Thu Aug 18 10:26:32 2022 + +@author: Andrew Freiburger +""" +from collections import namedtuple +from optlang import Model +from typing import Iterable, Union +from pprint import pprint +import logging + +logger = logging.getLogger(__name__) + +Bounds = namedtuple("Bounds", ("lb", "ub"), defaults=(0, 1000)) +tupVariable = namedtuple( + "tupVariable", + ("name", "bounds", "type"), + defaults=("varName", Bounds(), "continuous"), +) +tupConstraint = namedtuple( + "tupConstraint", + ("name", "bounds", "expr"), + defaults=("consName", Bounds(0, 0), None), +) +tupObjective = namedtuple( + "tupObjective", + ("name", "expr", "direction"), + defaults=("objectiveName", None, "max"), +) + + +def isIterable(term): + try: + iter(term) + if type(term) is not str: + return True + return False + except: + return False + + +def isnumber(obj): + try: + float(obj) + return True + except: + return False + + +def define_term(value): + if isnumber(value): + return {"type": "Number", "value": value} + if isinstance(value, str): + return {"type": "Symbol", "name": value} + print(f"ERROR: The {value} of type {type(value)} is not known.") + + +def get_expression_template(expr): + # print(expr) + if isinstance(expr, list): + return {"type": "Add", "args": []} + return {"type": expr["operation"], "args": []} + + +class OptlangHelper: + + @staticmethod + def add_variables( + var_name: str, var_bounds: (list, tuple), var_type: str = "continuous" + ): + return { + "name": var_name.replace(" ", "_"), + "lb": var_bounds[0], + "ub": var_bounds[1], + "type": var_type, + } + + @staticmethod + def add_constraint(cons_name: str, cons_bounds: (list, tuple), cons_expr: dict): + return { + "name": cons_name.replace(" ", "_"), + "expression": OptlangHelper._define_expression(cons_expr), + "lb": cons_bounds[0], + "ub": cons_bounds[1], + "indicator_variable": None, + "active_when": 1, + } + + @staticmethod + def add_objective(obj_name: str, objective_expr: Union[dict, list], direction: str): + if isinstance(objective_expr, list): + obj_expr = { + "type": "Add", + "args": [ + OptlangHelper._define_expression(expr) for expr in objective_expr + ], + } + elif isinstance(objective_expr, dict): + obj_expr = { + "type": objective_expr["operation"], + "args": [define_term(term) for term in objective_expr["elements"]], + } + return { + "name": obj_name.replace(" ", "_"), + "expression": obj_expr, + "direction": direction, + } + + @staticmethod + def define_model(model_name, variables, constraints, objective, optlang=False): + model = {"name": model_name, "variables": [], "constraints": []} + # pprint(objective) + for var in variables: + if len(var) == 2: + var.append("continuous") + model["variables"].append( + OptlangHelper.add_variables(var[0], var[1], var[2]) + ) + for cons in constraints: + model["constraints"].append( + OptlangHelper.add_constraint(cons[0], cons[1], cons[2]) + ) + # if not isinstance(obj, str): # catches a strange error of the objective name as the objective itself + model["objective"] = OptlangHelper.add_objective( + objective[0], objective[1], objective[2] + ) + if optlang: + return Model.from_json(model) + return model + + @staticmethod + def _define_expression(expr: dict): + expression = get_expression_template(expr) + level1_coef = 0 + for ele in expr["elements"]: + if not isnumber(ele) and not isinstance(ele, str): + # print(expr, ele, end="\r") + arguments = [] + level2_coef = 0 + for ele2 in ele["elements"]: + if not isnumber(ele2) and not isinstance(ele2, str): + # print("recursive ele\t\t", type(ele2), ele2) + arguments.append(OptlangHelper._define_expression(ele2)) + elif isinstance(ele2, str): + arguments.append(define_term(ele2)) + else: + level2_coef += float(ele2) + expression["args"].append(get_expression_template(ele)) + if level2_coef != 0: + arguments.append(define_term(level2_coef)) + expression["args"][-1]["args"] = arguments + elif isinstance(ele, str): + expression["args"].append(define_term(ele)) + else: + level1_coef += float(ele) + if level1_coef != 0: + expression["args"].append(define_term(level1_coef)) + # pprint(expression) + return expression + + @staticmethod + def dot_product(zipped_to_sum, heuns_coefs=None): + # ensure that the lengths are compatible for heun's dot-products + if heuns_coefs is not None: + coefs = ( + heuns_coefs + if isinstance(heuns_coefs, (list, set)) + else heuns_coefs.tolist() + ) + zipped_length = len(zipped_to_sum) + coefs_length = len(coefs) + if zipped_length != coefs_length: + raise IndexError( + f"ERROR: The length of zipped elements {zipped_length}" + f" is unequal to that of coefficients {coefs_length}" + ) + + elements = [] + for index, (term1, term2) in enumerate(zipped_to_sum): + if heuns_coefs is not None: + elements.extend( + [ + {"operation": "Mul", "elements": [heuns_coefs[index], term1]}, + {"operation": "Mul", "elements": [heuns_coefs[index], term2]}, + ] + ) + else: + elements.append({"operation": "Mul", "elements": [term1, term2]}) + return elements From ea73824eda8ad139b0118904bd9c761106b6d731 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 19 Mar 2024 00:49:33 -0500 Subject: [PATCH 215/298] Checking in the stripping out of flux limits --- modelseedpy/community/mscommunity.py | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index b42b2559..fcf3b1d9 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -112,7 +112,6 @@ def __init__( ids=None, abundances=None, kinetic_coeff=2000, - flux_limit=300, lp_filename=None, printing=False, ): @@ -136,8 +135,6 @@ def __init__( self.pkgmgr = MSPackageManager.get_pkg_mgr(self.util.model) msid_cobraid_hash = self.util.msid_hash() # print(msid_cobraid_hash) - write_sbml_model(model, "test_comm.xml") - if "cpd11416" not in msid_cobraid_hash: raise KeyError("Could not find biomass compound for the model.") other_biomass_cpds = [] @@ -185,26 +182,6 @@ def __init__( if isinstance(abundances, dict): self.set_abundance(abundances) self.pkgmgr.getpkg("CommKineticPkg").build_package(kinetic_coeff, self) - for member in self.members: - vars_coef = {} - for rxn in self.util.model.reactions: - if ( - "EX_" not in rxn.id - and member.index == FBAHelper.rxn_compartment(rxn)[1:] - ): - vars_coef[rxn.forward_variable] = vars_coef[ - rxn.reverse_variable - ] = 1 - print(member.id, flux_limit, member.abundance) - self.util.create_constraint( - Constraint( - Zero, - lb=0, - ub=flux_limit * member.abundance, - name=f"{member.id}_resource_balance", - ), - coef=vars_coef, - ) # Manipulation functions def set_abundance(self, abundances): From 917bf848b82f9e14b59a2d62f35cfed60190429d Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 19 Mar 2024 01:00:54 -0500 Subject: [PATCH 216/298] Restoring old MSCommunity for now because refactor to new code is too difficult to do right now --- modelseedpy/community/mscommunity.py | 886 +++++++++++++++++++-------- 1 file changed, 626 insertions(+), 260 deletions(-) diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index fcf3b1d9..c2b5ab6f 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -1,71 +1,82 @@ # -*- coding: utf-8 -*- from modelseedpy.fbapkg.mspackagemanager import MSPackageManager +from modelseedpy.community.mscompatibility import MSCompatibility from modelseedpy.core.msmodelutl import MSModelUtil -from modelseedpy.community.mssteadycom import MSSteadyCom -from modelseedpy.community.commhelper import build_from_species_models -from modelseedpy.core.exceptions import ( - ObjectAlreadyDefinedError, - FeasibilityError, - NoFluxError, -) from modelseedpy.core.msgapfill import MSGapfill from modelseedpy.core.fbahelper import FBAHelper # from modelseedpy.fbapkg.gapfillingpkg import default_blacklist -from modelseedpy.core.msatpcorrection import MSATPCorrection -from cobra.io import save_matlab_model, write_sbml_model +from modelseedpy.core import MSATPCorrection +from cobra import Model, Reaction, Metabolite from cobra.core.dictlist import DictList +from cobra.io import save_matlab_model +from itertools import combinations from optlang.symbolics import Zero -from optlang import Constraint +from matplotlib import pyplot from pandas import DataFrame from pprint import pprint -from cobra import Reaction import logging +# import itertools +import cobra +import networkx +import sigfig +import re, os + logger = logging.getLogger(__name__) -class CommunityMember: - def __init__(self, community, biomass_cpd, name=None, index=None, abundance=0): +class CommunityModelSpecies: + def __init__( + self, + community, # MSCommunity environment + biomass_cpd, # metabolite in the biomass reaction + names=[], # names of the community species #TODO - look into whether there should be a names field + name=None, # the name of a species + index=None, # the index of the species + ): self.community, self.biomass_cpd = community, biomass_cpd - self.index = index or int(self.biomass_cpd.compartment[1:]) - self.abundance = abundance + print(self.biomass_cpd.compartment) + self.index = int( + self.biomass_cpd.compartment[1:] + ) # if index is None else index + self.abundance = 0 if self.biomass_cpd in self.community.primary_biomass.metabolites: self.abundance = abs( self.community.primary_biomass.metabolites[self.biomass_cpd] ) if name: self.id = name - elif "species_name" in self.biomass_cpd.annotation: - self.id = self.biomass_cpd.annotation["species_name"] + elif self.index < len(names): + self.id = names[self.index - 1] else: - self.id = "Species" + str(self.index) + if "species_name" in self.biomass_cpd.annotation: + self.id = self.biomass_cpd.annotation["species_name"] + else: + self.id = "Species" + str(self.index) logger.info("Making atp hydrolysis reaction for species: " + self.id) - atp_rxn = self.community.util.add_atp_hydrolysis("c" + str(self.index)) + atp_rxn = FBAHelper.add_atp_hydrolysis( + self.community.model, "c" + str(self.index) + ) + # FBAHelper.add_autodrain_reactions_to_self.community_model(self.community.model) # !!! FIXME This FBAHelper function is not defined. self.atp_hydrolysis = atp_rxn["reaction"] self.biomass_drain = None - self.biomasses, self.reactions = [], [] - self.primary_biomass = None - for rxn in self.community.util.model.reactions: - rxnComp = FBAHelper.rxn_compartment(rxn) - if not rxnComp: - print(f"The reaction {rxn.id} strangely lacks a compartment.") - elif int(rxnComp[1:]) == self.index and "bio" not in rxn.name: - self.reactions.append(rxn) - if self.biomass_cpd in rxn.metabolites: - if rxn.metabolites[self.biomass_cpd] == 1 and len(rxn.metabolites) > 1: - self.biomasses.append(rxn) - if ( - len(self.biomasses) == 1 - ): # TODO make this condition more reflective of primary biomass - self.primary_biomass = rxn + self.biomasses = [] + for reaction in self.community.model.reactions: + if self.biomass_cpd in reaction.metabolites: + if ( + reaction.metabolites[self.biomass_cpd] == 1 + and len(reaction.metabolites) > 1 + ): + self.biomasses.append(reaction) elif ( - len(rxn.metabolites) == 1 and rxn.metabolites[self.biomass_cpd] < 0 + len(reaction.metabolites) == 1 + and reaction.metabolites[self.biomass_cpd] < 0 ): - self.biomass_drain = rxn + self.biomass_drain = reaction - if self.biomasses == []: + if len(self.biomasses) == 0: logger.critical("No biomass reaction found for species " + self.id) if not self.biomass_drain: logger.info("Making biomass drain reaction for species: " + self.id) @@ -75,191 +86,531 @@ def __init__(self, community, biomass_cpd, name=None, index=None, abundance=0): lower_bound=0, upper_bound=100, ) - self.community.util.model.add_reactions([self.biomass_drain]) + self.community.model.add_reactions([self.biomass_drain]) self.biomass_drain.add_metabolites({self.biomass_cpd: -1}) self.biomass_drain.annotation["sbo"] = "SBO:0000627" def disable_species(self): for reaction in self.community.model.reactions: - reaction_index = FBAHelper.rxn_compartment(reaction)[1:] - if int(reaction_index) == self.index: + if int(FBAHelper.rxn_compartment(reaction)[1:]) == self.index: reaction.upper_bound = reaction.lower_bound = 0 def compute_max_biomass(self): if len(self.biomasses) == 0: logger.critical("No biomass reaction found for species " + self.id) - self.community.util.add_objective(self.primary_biomass.flux_expression) - if self.community.lp_filename: - self.community.print_lp(f"{self.community.lp_filename}_{self.id}_Biomass") + self.community.model.objective = self.community.model.problem.Objective( + Zero, direction="max" + ) + self.community.model.objective.set_linear_coefficients( + {self.biomasses[0].forward_variable: 1} + ) + if self.community.lp_filename != None: + self.community.print_lp( + self.community.lp_filename + "_" + self.id + "_Biomass" + ) return self.community.model.optimize() def compute_max_atp(self): if not self.atp_hydrolysis: logger.critical("No ATP hydrolysis found for species:" + self.id) - self.community.util.add_objective( - Zero, coef={self.atp_hydrolysis.forward_variable: 1} + self.community.model.objective = self.community.model.problem.Objective( + Zero, direction="max" + ) + self.community.model.objective.set_linear_coefficients( + {self.atp_hydrolysis.forward_variable: 1} ) if self.community.lp_filename: - self.community.print_lp(f"{self.community.lp_filename}_{self.id}_ATP") + self.community.print_lp(self.community.lp_filename + "_" + self.id + "_ATP") return self.community.model.optimize() class MSCommunity: def __init__( self, - model=None, - member_models: list = None, - ids=None, - abundances=None, - kinetic_coeff=2000, - lp_filename=None, - printing=False, + model=None, # the model that will be defined + models: list = None, # the list of models that will be assembled into a community + names=[], + abundances=None, # names and abundances of the community species + pfba=True, # specify whether parsimonious FBA will be simulated + lp_filename=None, # specify a filename to create an lp file ): - self.lp_filename = lp_filename + # Setting model and package manager + self.model, self.lp_filename, self.pfba = model, lp_filename, pfba + self.pkgmgr = MSPackageManager.get_pkg_mgr(model) self.gapfillings = {} - # Define Data attributes as None - self.solution = self.biomass_cpd = self.primary_biomass = self.biomass_drain = ( - None - ) - self.msgapfill = self.element_uptake_limit = self.kinetic_coeff = ( - self.msdb_path - ) = None - # defining the models - if member_models is not None and model is None: - model = build_from_species_models(member_models, abundances=abundances) - if ids is None and member_models is not None: - ids = [mem.id for mem in member_models] - self.id = model.id - self.util = MSModelUtil(model, True) - self.pkgmgr = MSPackageManager.get_pkg_mgr(self.util.model) - msid_cobraid_hash = self.util.msid_hash() - # print(msid_cobraid_hash) + self.solution = ( + self.biomass_cpd + ) = ( + self.primary_biomass + ) = ( + self.biomass_drain + ) = ( + self.msgapfill + ) = ( + self.element_uptake_limit + ) = self.kinetic_coeff = self.modelseed_db_path = None + self.species = DictList() + # Computing data from model + msid_cobraid_hash = FBAHelper.msid_hash(model) if "cpd11416" not in msid_cobraid_hash: + logger.critical("Could not find biomass compound") raise KeyError("Could not find biomass compound for the model.") other_biomass_cpds = [] for self.biomass_cpd in msid_cobraid_hash["cpd11416"]: - if "c0" in self.biomass_cpd.id: - for rxn in self.util.model.reactions: - if self.biomass_cpd not in rxn.metabolites: - continue - print(self.biomass_cpd, rxn, end=";\t") - if ( - rxn.metabolites[self.biomass_cpd] == 1 - and len(rxn.metabolites) > 1 - ): - if self.primary_biomass: - raise ObjectAlreadyDefinedError( - f"The primary biomass {self.primary_biomass} is already defined," - f"hence, the {rxn.id} cannot be defined as the model primary biomass." - ) - if printing: - print("primary biomass defined", rxn.id) - self.primary_biomass = rxn - elif ( - rxn.metabolites[self.biomass_cpd] < 0 - and len(rxn.metabolites) == 1 - ): - self.biomass_drain = rxn - elif "c" in self.biomass_cpd.compartment: - other_biomass_cpds.append(self.biomass_cpd) - # assign community members and their abundances - print() # this returns the carriage after the tab-ends in the biomass compound printing - abundances = abundances or [1 / len(other_biomass_cpds)] * len( - other_biomass_cpds + print(self.biomass_cpd) + if self.biomass_cpd.compartment == "c0": + for reaction in self.model.reactions: + if self.biomass_cpd in reaction.metabolites: + if ( + reaction.metabolites[self.biomass_cpd] == 1 + and len(reaction.metabolites) > 1 + ): + self.primary_biomass = reaction + elif ( + reaction.metabolites[self.biomass_cpd] < 0 + and len(reaction.metabolites) == 1 + ): + self.biomass_drain = reaction + else: + other_biomass_cpds.append(biomass_cpd) + for biomass_cpd in other_biomass_cpds: + species_obj = CommunityModelSpecies(self, biomass_cpd, names) + self.species.append(species_obj) + if abundances: + self.set_abundance(abundances) + + @staticmethod + def build_from_species_models( + models, mdlid=None, name=None, names=[], abundances=None + ): + """Merges the input list of single species metabolic models into a community metabolic model + + Parameters + ---------- + models : list + List of models to be merged into a community model + msdb_path : string + The path to the local version of the ModelSEED Database + model_id : string + String specifying community model ID + name : string + String specifying community model name + names : list + List of human readable names for models being merged + abundances : dict + Hash of relative abundances for input models in community model + + Returns + ------- + Cobra.Model + Community model object + + Raises + ------ + """ + # compatabilize the models + mscompat = MSCompatibility(modelseed_db_path=msdb_path) + models = mscompat.align_exchanges( + models, conflicts_file_name="exchanges_conflicts.json", model_names=names ) - self.members = DictList( - CommunityMember( - community=self, - biomass_cpd=biomass_cpd, - name=ids[memIndex], - abundance=abundances[memIndex], - ) - for memIndex, biomass_cpd in enumerate(other_biomass_cpds) + models = mscompat.standardize( + models, + conflicts_file_name="standardized_exchange_metabolites.json", + model_names=names, + ) + + # construct the new model + newmodel = Model(mdlid, name) + newutl = MSModelUtil(newmodel) + biomass_compounds = [] + biomass_index = 2 + biomass_indices = [1] + biomass_indices_dict = {} + new_metabolites, new_reactions = set(), set() + for model_index, model in enumerate(models): + model_reaction_ids = [rxn.id for rxn in model.reactions] + # model_index+=1 + print([rxn.id for rxn in model.reactions if "bio" in rxn.id]) + print(model_index, model.id) + # Rename metabolites + for met in model.metabolites: + # Renaming compartments + output = MSModelUtil.parse_id(met) + if output is None: + if met.compartment[0] != "e": + met.id += str(model_index) + met.compartment = met.compartment[0] + str(model_index) + else: + met.compartment = "e0" + else: + if output[2] == "": + if output[1] != "e": + met.id += str(model_index) + met.compartment += str(model_index) + elif output[1] == "e": + met.compartment = "e0" + else: + met.compartment = output[1] + str(model_index) + met.id = output[0] + "_" + output[1] + str(model_index) + new_metabolites.add(met) + if "cpd11416_c" in met.id: + print(met.id, model.id) + biomass_compounds.append(met) + # Rename reactions + for rxn in model.reactions: + if rxn.id[0:3] != "EX_": + if re.search("^(bio)(\d+)$", rxn.id): + print(biomass_indices) + index = int(rxn.id.removeprefix("bio")) + if index not in biomass_indices: + biomass_indices.append(index) + biomass_indices_dict[model.id] = index + print(rxn.id, "2") + else: + rxn_id = "bio" + str(biomass_index) + if rxn_id not in model_reaction_ids: + print(rxn_id, "1") + rxn.id = rxn_id + biomass_indices.append(biomass_index) + biomass_indices_dict[model.id] = index + else: + print(rxn_id, "3") + for i in range(len(models) * 2): + rxn_id = "bio" + str(i) + if ( + rxn_id not in model_reaction_ids + and i not in biomass_indices + ): + rxn.id = rxn_id + biomass_indices.append(i) + biomass_indices_dict[model.id] = i + break + biomass_index += 1 + else: + output = MSModelUtil.parse_id(rxn) + if output is None: + if "e" not in rxn.compartment.id: + rxn.id += str(model_index) + elif output[1] != "e": + rxn.id = output[0] + "_" + output[1] + str(model_index) + if output[2] == "": + rxn.id = rxn.id + str(model_index) + new_reactions.add(rxn) + # Adding new reactions and compounds to base model + newmodel.add_reactions(FBAHelper.filter_cobra_set(new_reactions)) + newmodel.add_metabolites(FBAHelper.filter_cobra_set(new_metabolites)) + + # Create community biomass + comm_biomass = Metabolite("cpd11416_c0", None, "Community biomass", 0, "c0") + metabolites = {comm_biomass: 1} + metabolites.update( + {cpd: -1 / len(biomass_compounds) for cpd in biomass_compounds} + ) + comm_biorxn = Reaction(id="bio1", name="bio1", lower_bound=0, upper_bound=100) + comm_biorxn.add_metabolites(metabolites) + newmodel.add_reactions([comm_biorxn]) + + # create a biomass sink reaction + newutl = MSModelUtil(newmodel) + newutl.add_exchanges_for_metabolites([comm_biomass], 0, 100, "SK_") + if cobra_model: + return newmodel, biomass_indices_dict + return ( + MSCommunity(model=newmodel, names=names, abundances=abundances), + biomass_indices_dict, ) - # assign the MSCommunity constraints and objective - self.abundances_set = False - if isinstance(abundances, dict): - self.set_abundance(abundances) - self.pkgmgr.getpkg("CommKineticPkg").build_package(kinetic_coeff, self) # Manipulation functions def set_abundance(self, abundances): - # calculate the normalized biomass - total_abundance = sum(list(abundances.values())) + # ensure normalization + total_abundance = sum([abundances[species] for species in abundances]) # map abundances to all species - for species, abundance in abundances.items(): - if species in self.members: - self.members.get_by_id(species).abundance = abundance / total_abundance + for species in abundances: + abundances[species] = abundances[species] / total_abundance + if species in self.species: + self.species.get_by_id(species).abundance = abundances[species] # remake the primary biomass reaction based on abundances - if self.primary_biomass is None: + if self.primary_biomass == None: logger.critical("Primary biomass reaction not found in community model") - all_metabolites = {self.primary_biomass.products[0]: 1} - all_metabolites.update( - { - mem.biomass_cpd: -abundances[mem.id] / total_abundance - for mem in self.members - } - ) + all_metabolites = {self.biomass_cpd: 1} + for species in self.species: + all_metabolites[species.biomass_cpd] = -1 * abundances[species.id] self.primary_biomass.add_metabolites(all_metabolites, combine=False) - self.abundances_set = True - - def set_objective(self, target=None, targets=None, minimize=False): - targets = targets or [ - self.util.model.reactions.get_by_id( - target or self.primary_biomass.id - ).flux_expression - ] - self.util.model.objective = self.util.model.problem.Objective( - sum(targets), direction="max" if not minimize else "min" + + def set_objective( + self, target=None, minimize=False + ): #!!! Mustn't a multilevel objective be set for community models? + if target == None: + target = self.primary_biomass.id + sense = "max" + if minimize: + sense = "min" + self.model.objective = self.model.problem.Objective( + self.model.reactions.get_by_id(target).flux_expression, direction=sense ) - def constrain(self, element_uptake_limit=None, thermo_params=None, msdb_path=None): + def constrain( + self, element_uptake_limit=None, kinetic_coeff=None, modelseed_db_path=None + ): + # applying uptake constraints + self.element_uptake_limit = element_uptake_limit if element_uptake_limit: - self.element_uptake_limit = element_uptake_limit self.pkgmgr.getpkg("ElementUptakePkg").build_package(element_uptake_limit) - if thermo_params: - if msdb_path: - self.msdb_path = msdb_path - thermo_params.update({"modelseed_db_path": msdb_path}) - self.pkgmgr.getpkg("FullThermoPkg").build_package(thermo_params) - else: - self.pkgmgr.getpkg("SimpleThermoPkg").build_package(thermo_params) + # applying kinetic constraints + self.kinetic_coeff = kinetic_coeff + if kinetic_coeff: + self.pkgmgr.getpkg("CommKineticPkg").build_package(kinetic_coeff, self) + # applying FullThermo constraints + self.modelseed_db_path = modelseed_db_path + if modelseed_db_path: + self.pkgmgr.getpkg("FullThermoPkg").build_package( + {"modelseed_db_path": modelseed_db_path} + ) + + # Utility functions + def print_lp(self, filename=None): + if not filename: + filename = self.lp_filename + if filename: + with open(filename + ".lp", "w") as out: + out.write(str(self.model.solver)) + out.close() - def interactions( + def compute_interactions( self, - solution=None, - media=None, - msdb=None, - msdb_path=None, - filename=None, - figure_format="svg", - node_metabolites=True, - flux_threshold=1, - visualize=True, - ignore_mets=None, + solution=None, # the COBRA simulation solution that will be parsed and visualized + threshold: int = 1, #!!! What is this threshold? + visualize: bool = True, # specifies whether the net flux will be depicted in a network diagram + export_directory: str = None, # specifies the directory to which the network diagram and associated datatable will be exported, where None does not export the content + node_metabolites: bool = True, # specifies whether the metabolites of each node will be printed + x_offset: float = 0.15, # specifies the x-axis buffer between each species node and its metabolite list in the network diagram + show_figure: bool = True, # specifies whether the figure will be printed to the console ): - return MSSteadyCom.interactions( - self, - solution or self.solution, - media, - flux_threshold, - msdb, - msdb_path, - visualize, - filename, - figure_format, - node_metabolites, - True, - ignore_mets, + # Check for solution + if not solution: + solution = self.solution + if not solution: + logger.warning("No feasible solution!") + return None + + # Initialize data + metabolite_data, species_data, species_collection = ( + {}, + {"Environment": {}}, + {"Environment": {}}, ) + data = {"IDs": [], "Metabolites/Donor": [], "Environment": []} + met_list, species_list = [], [None for i in range(1000)] - # Utility functions - def print_lp(self, filename=None): - filename = filename or self.lp_filename - with open(filename + ".lp", "w") as out: - out.write(str(self.util.model.solver)) - out.close() + # establish spreadsheet infrastructure for only extracellular metabolites + for met in self.model.metabolites: + if met.compartment == "e0": + met_list.append(met) + data["IDs"].append(met.id) + data["Metabolites/Donor"].append(met.name) + + metabolite_data[met] = {} + metabolite_data[met]["Environment"] = 0 + for individual in self.species: + metabolite_data[met][individual.id] = 0 + + for individual in self.species: + species_data[individual.id], species_collection[individual.id] = {}, {} + species_list[individual.index] = individual + data[individual.id] = [] + data["IDs"].append(individual.index) + data["Metabolites/Donor"].append(individual.id) + for other in self.species: + species_data[individual.id][other.id] = 0 + species_collection[individual.id][other.id] = [] + + species_data["Environment"][individual.id] = species_data[individual.id][ + "Environment" + ] = 0 + ( + species_collection["Environment"][individual.id], + species_collection[individual.id]["Environment"], + ) = ([], []) + + data["IDs"].append("Environment") + data["Metabolites/Donor"].append("Environment") + for individual in self.species: + data["IDs"].append(individual.index) + data["Metabolites/Donor"].append(individual.id + " list") + + # computing net metabolite flux from each reaction + for rxn in self.model.reactions: + if rxn.id[0:3] == "EX_" and abs(solution.fluxes[rxn.id]) > Zero: + cpd = list(rxn.metabolites.keys())[0] + if cpd in metabolite_data: + metabolite_data[cpd]["Environment"] += -1 * solution.fluxes[rxn.id] + if len(rxn.id.split("_")) > 1: + comp_index = int(rxn.id.split("_")[-1][1:]) + for metabolite in rxn.metabolites: + if metabolite in metabolite_data: + if species_list[comp_index] != None: + metabolite_data[metabolite][ + species_list[comp_index].id + ] += (solution.fluxes[rxn.id] * rxn.metabolites[metabolite]) + + # translating net metbaolite flux into species interaction flux + for met in metabolite_data: + # Iterating through the metabolite producers + total = sum( + [ + metabolite_data[met][individual.id] + for individual in self.species + if metabolite_data[met][individual.id] > Zero + ] + ) + if metabolite_data[met]["Environment"] > Zero: + total += metabolite_data[met]["Environment"] + for individual in self.species: + if metabolite_data[met][individual.id] > Zero: + # calculate the total net flux between each combination of species, and track the involved metabolites + for other in self.species: + if metabolite_data[met][other.id] < Zero: + normalized_flux = ( + abs( + metabolite_data[met][individual.id] + * metabolite_data[met][other.id] + ) + / total + ) + species_data[individual.id][other.id] += normalized_flux + if normalized_flux > threshold: + species_collection[individual.id][other.id].append( + met.name + ) + # calculate the total net flux between the species and the environment, and track the involved metabolites + if metabolite_data[met]["Environment"] < Zero: + normalized_flux = ( + abs( + metabolite_data[met][individual.id] + * metabolite_data[met]["Environment"] + ) + / total + ) + species_data[individual.id]["Environment"] += normalized_flux + if normalized_flux > threshold: + species_collection[individual.id]["Environment"].append( + met.name + ) + if metabolite_data[met]["Environment"] > Zero: + for individual in self.species: + if metabolite_data[met][individual.id] < Zero: + normalized_flux = ( + abs( + metabolite_data[met]["Environment"] + * metabolite_data[met][individual.id] + ) + / total + ) + species_data["Environment"][individual.id] += normalized_flux + if normalized_flux > threshold: + species_collection["Environment"][individual.id].append( + met.name + ) + + # construct a dataframe + for met in met_list: + for individual in self.species: + data[individual.id].append(metabolite_data[met][individual.id]) + data["Environment"].append(metabolite_data[met]["Environment"]) + for individual in self.species: + for other in self.species: + data[individual.id].append(species_data[individual.id][other.id]) + data[individual.id].append(species_data[individual.id]["Environment"]) + for individual in self.species: + data["Environment"].append(species_data["Environment"][individual.id]) + data["Environment"].append(0) + for individual in self.species: + for other in self.species: + data[individual.id].append( + "; ".join(species_collection[individual.id][other.id]) + ) + data[individual.id].append( + "; ".join(species_collection[individual.id]["Environment"]) + ) + for individual in self.species: + data["Environment"].append( + "; ".join(species_collection["Environment"][individual.id]) + ) + data["Environment"].append(0), data["IDs"].append("Environment list"), data[ + "Metabolites/Donor" + ].append("Environment list") + + self.cross_feeding_df = DataFrame(data) + logger.info(self.cross_feeding_df) + + # graph the network diagram + if visualize: + self._visualize_cross_feeding( + export_directory, node_metabolites, x_offset, show_figure + ) + + return self.cross_feeding_df + + def _visualize_cross_feeding( + self, export_directory, node_metabolites=True, x_offset=0.15, show_figure=True + ): + # construct an efficient DataFrame of the cross-feeding interactions + net_cross_feeding = {} + for index, row in self.cross_feeding_df.iterrows(): + if re.search("Species\d+", row["Metabolites/Donor"]): + net_cross_feeding[row["Metabolites/Donor"]] = row[len(self.species) :] + + # define species and the metabolite fluxes + net_cross_feeding = DataFrame(net_cross_feeding) + self.graph = networkx.Graph() + species_nums = {} + for species in self.species: + species_nums[species.index] = set() + self.graph.add_node(species.index) + for index, entry in net_cross_feeding[ + f"Species{species.index} list" + ].iteritems(): + if ( + "Species" in index + and re.search("(\d+)", index).group() != species.index + ): + species_nums[species.index].update(entry.split("; ")) + + # define the net fluxes for each combination of two species + for species_1, species_2 in combinations(list(species_nums.keys()), 2): + species_2_to_1 = net_cross_feeding.at[ + f"Species{species_2}", f"Species{species_1}" + ] + species_1_to_2 = net_cross_feeding.at[ + f"Species{species_1}", f"Species{species_2}" + ] + interaction_net_flux = sigfig.round(species_2_to_1 - species_1_to_2, 3) + self.graph.add_edge( + species_1, species_2, flux=interaction_net_flux + ) # The graph plots directionally toward the larger numbered species + + # compose the nextwork diagram of net fluxes + self.pos = networkx.circular_layout(self.graph) + if node_metabolites: + for species in self.pos: + x, y = self.pos[species] + metabolites = "\n".join(species_nums[species]) + pyplot.text(x + x_offset, y, metabolites) + networkx.draw_networkx(self.graph, self.pos) + self.labels = networkx.get_edge_attributes(self.graph, "flux") + networkx.draw_networkx_edge_labels( + self.graph, self.pos, edge_labels=self.labels + ) + + if export_directory: + pyplot.savefig(os.path.join(export_directory, "cross_feeding_diagram.svg")) + self.cross_feeding_df.to_csv( + os.path.join(export_directory, "cross_feeding.csv") + ) + + if show_figure: + pyplot.show() # Analysis functions def gapfill( @@ -267,130 +618,145 @@ def gapfill( media=None, target=None, minimize=False, - default_gapfill_templates=None, - default_gapfill_models=None, - test_conditions=None, - reaction_scores=None, - blacklist=None, + default_gapfill_templates=[], + default_gapfill_models=[], + test_conditions=[], + reaction_scores={}, + blacklist=[], suffix=None, - solver: str = "glpk", + solver="glpk", ): - default_gapfill_templates = default_gapfill_templates or [] - default_gapfill_models = default_gapfill_models or [] - test_conditions, blacklist = test_conditions or [], blacklist or [] - reaction_scores = reaction_scores or {} if not target: target = self.primary_biomass.id self.set_objective(target, minimize) - gfname = FBAHelper.mediaName(media) + "-" + target + gfname = FBAHelper.medianame(media) + "-" + target if suffix: gfname += f"-{suffix}" self.gapfillings[gfname] = MSGapfill( - self.util.model, + self.model, default_gapfill_templates, default_gapfill_models, test_conditions, reaction_scores, blacklist, - solver, ) - gfresults = self.gapfillings[gfname].run_gapfilling(media, target) - assert ( - gfresults - ), f"Gapfilling of {self.util.model.id} in {gfname} towards {target} failed." + gfresults = self.gapfillings[gfname].run_gapfilling( + media, target, solver=solver + ) + if not gfresults: + logger.critical( + "Gapfilling failed with the specified model, media, and target reaction." + ) + return None return self.gapfillings[gfname].integrate_gapfill_solution(gfresults) def test_individual_species( - self, media=None, interacting=True, run_atp=True, run_biomass=True + self, media=None, allow_cross_feeding=True, run_atp=True, run_biomass=True ): - assert run_atp or run_biomass, ValueError( - "Either the run_atp or run_biomass arguments must be True." - ) - # self.pkgmgr.getpkg("KBaseMediaPkg").build_package(media) - if media is not None: - self.util.add_medium(media) + self.pkgmgr.getpkg("KBaseMediaPkg").build_package(media) + # Iterating over species and running tests data = {"Species": [], "Biomass": [], "ATP": []} - for individual in self.members: + for individual in self.species: data["Species"].append(individual.id) - with self.util.model: - if not interacting: - for other in self.members: - if other != individual: - other.disable_species() - if run_biomass: + with self.model: # WITH, here, discards changes after each simulation + # If no interaction allowed, iterate over all other species and disable them + if not allow_cross_feeding: + for indtwo in self.species: + if indtwo != individual: + indtwo.disable_species() + if ( + run_biomass + ): # If testing biomass, setting objective to individual species biomass and optimizing data["Biomass"].append(individual.compute_max_biomass()) - if run_atp: + if ( + run_atp + ): # If testing atp, setting objective to individual species atp and optimizing data["ATP"].append(individual.compute_max_atp()) - return DataFrame(data) + df = DataFrame(data) + logger.info(df) + return df def atp_correction( - self, core_template, atp_medias, max_gapfilling=None, gapfilling_delta=0 + self, + core_template, + atp_medias, + atp_objective="bio2", + max_gapfilling=None, + gapfilling_delta=0, ): - self.atp = MSATPCorrection( - self.util.model, + self.atpcorrect = MSATPCorrection( + self.model, core_template, atp_medias, - "c0", - max_gapfilling, - gapfilling_delta, + atp_objective="bio2", + max_gapfilling=None, + gapfilling_delta=0, ) - # TODO evaluate the comparison of this method with MICOM - def predict_abundances(self, media=None, pfba=True): - with self.util.model: - self.util.model.objective = self.util.model.problem.Objective( - sum( - [ - species.primary_biomass.forward_variable - for species in self.members - ] - ), - direction="max", - ) - self.run_fba(media, pfba) + def predict_abundances(self, media=None, pfba=True, kinetic_coeff=None): + with self.model: # WITH, here, discards changes after each simulation + if not kinetic_coeff: + kinetic_coeff = self.kinetic_coeff + if ( + not kinetic_coeff + ): # Kinetic coefficients must be used for this formulation to work + kinetic_coeff = 2000 + self.pkgmgr.getpkg("CommKineticPkg").build_package(kinetic_coeff, self) + + objcoef = {} + for species in self.species: + objcoef[species.biomasses[0].forward_variable] = 1 + new_objective = self.model.problem.Objective(Zero, direction="max") + self.model.objective = new_objective + new_objective.set_linear_coefficients(objcoef) + self.run(media, pfba) return self._compute_relative_abundance_from_solution() + return None - def run_fba(self, media=None, pfba=False, fva_reactions=None): - if media is not None: - self.util.add_medium(media) - return self._set_solution(self.util.run_fba(None, pfba, fva_reactions)) + def run(self, media, pfba=None): + self.pkgmgr.getpkg("KBaseMediaPkg").build_package(media) + self.print_lp() + save_matlab_model(self.model, self.model.name + ".mat") + if pfba or self.pfba: + self._set_solution(cobra.flux_analysis.pfba(self.model)) + else: + self._set_solution(self.model.optimize()) + if not self.solution: + return None + logger.info(self.model.summary()) + return self.solution + # Internal functions def _compute_relative_abundance_from_solution(self, solution=None): if not solution and not self.solution: - logger.warning("The simulation lacks any flux.") + logger.warning("No feasible solution!") return None - comm_growth = sum( - [self.solution.fluxes[member.primary_biomass.id] for member in self.members] + data = {"Species": [], "Abundance": []} + totalgrowth = sum( + [self.solution.fluxes[species.biomasses[0].id] for species in self.species] ) - assert comm_growth > 0, NoFluxError( - f"The total community growth is {comm_growth}" - ) - return { - member.id: self.solution.fluxes[member.primary_biomass.id] / comm_growth - for member in self.members - } + if totalgrowth == 0: + logger.warning("The community did not grow!") + return None + for species in self.species: + data["Species"].append(species.id) + data["Abundance"].append( + self.solution.fluxes[species.biomasses[0].id] / totalgrowth + ) + df = DataFrame(data) + logger.info(df) + return df def _set_solution(self, solution): + self.solution = None if solution.status != "optimal": - FeasibilityError( - f"The solution is sub-optimal, with a(n) {solution} status." - ) - self.solution = None - self.print_lp() - save_matlab_model(self.util.model, self.util.model.name + ".mat") + logger.warning("No solution found for the simulation.") + return self.solution = solution - logger.info(self.util.model.summary()) - return self.solution - def parse_member_growths(self): - # f"cpd11416_c{member.index}" - return { - member.name: self.solution.fluxes[member.primary_biomass.id] - for member in self.members - } - - def return_member_models(self): - # TODO return a list of member models that is parsed from the .members attribute - ## which will have applicability in disaggregating community models that do not have member models - ## such as Filipe's Nitrate reducing community model for the SBI ENIGMA team. - return + def steady_com( + self, + ): + from reframed.community import SteadyCom, SteadyComVA + + reframed_model = FBAHelper.get_reframed_model(self.model) From 4300becfcc1322e794d7a68ad94b46cb899fee27 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 19 Mar 2024 01:09:19 -0500 Subject: [PATCH 217/298] Fixing --- modelseedpy/community/mscommunity.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index c2b5ab6f..2a83c464 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -128,7 +128,6 @@ class MSCommunity: def __init__( self, model=None, # the model that will be defined - models: list = None, # the list of models that will be assembled into a community names=[], abundances=None, # names and abundances of the community species pfba=True, # specify whether parsimonious FBA will be simulated @@ -210,15 +209,15 @@ def build_from_species_models( ------ """ # compatabilize the models - mscompat = MSCompatibility(modelseed_db_path=msdb_path) - models = mscompat.align_exchanges( - models, conflicts_file_name="exchanges_conflicts.json", model_names=names - ) - models = mscompat.standardize( - models, - conflicts_file_name="standardized_exchange_metabolites.json", - model_names=names, - ) + #mscompat = MSCompatibility(modelseed_db_path=msdb_path) + #models = mscompat.align_exchanges( + # models, conflicts_file_name="exchanges_conflicts.json", model_names=names + #) + #models = mscompat.standardize( + # models, + # conflicts_file_name="standardized_exchange_metabolites.json", + # model_names=names, + #) # construct the new model newmodel = Model(mdlid, name) From 6ac6e6b49451909305825e58fdbc60acb3407aee Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 19 Mar 2024 01:37:05 -0500 Subject: [PATCH 218/298] Fixing bug --- modelseedpy/community/mscommunity.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index 2a83c464..c989be7c 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -313,8 +313,6 @@ def build_from_species_models( # create a biomass sink reaction newutl = MSModelUtil(newmodel) newutl.add_exchanges_for_metabolites([comm_biomass], 0, 100, "SK_") - if cobra_model: - return newmodel, biomass_indices_dict return ( MSCommunity(model=newmodel, names=names, abundances=abundances), biomass_indices_dict, From 5003789d54fb9d289c438a091d5511de0e3abc7d Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 19 Mar 2024 08:55:49 -0500 Subject: [PATCH 219/298] Fixing bug --- modelseedpy/community/mscommunity.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index c989be7c..df82a266 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -156,18 +156,18 @@ def __init__( logger.critical("Could not find biomass compound") raise KeyError("Could not find biomass compound for the model.") other_biomass_cpds = [] - for self.biomass_cpd in msid_cobraid_hash["cpd11416"]: - print(self.biomass_cpd) - if self.biomass_cpd.compartment == "c0": + for biomass_cpd in msid_cobraid_hash["cpd11416"]: + if biomass_cpd.compartment == "c0": + self.biomass_cpd = biomass_cpd for reaction in self.model.reactions: - if self.biomass_cpd in reaction.metabolites: + if biomass_cpd in reaction.metabolites: if ( - reaction.metabolites[self.biomass_cpd] == 1 + reaction.metabolites[biomass_cpd] == 1 and len(reaction.metabolites) > 1 ): self.primary_biomass = reaction elif ( - reaction.metabolites[self.biomass_cpd] < 0 + reaction.metabolites[biomass_cpd] < 0 and len(reaction.metabolites) == 1 ): self.biomass_drain = reaction From 4898d5d497c778d5cfe28de292f25fb92555d294 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 19 Mar 2024 09:14:45 -0500 Subject: [PATCH 220/298] Fixing --- modelseedpy/community/mscommunity.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index df82a266..d999837f 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -134,8 +134,15 @@ def __init__( lp_filename=None, # specify a filename to create an lp file ): # Setting model and package manager - self.model, self.lp_filename, self.pfba = model, lp_filename, pfba - self.pkgmgr = MSPackageManager.get_pkg_mgr(model) + if isinstance(model, MSModelUtil): + self.model = model.model + self.mdlutl = model + else: + self.model = model + self.mdlutl = MSModelUtil.get(model) + self.pkgmgr = MSPackageManager.get_pkg_mgr(self.model) + self.lp_filename = lp_filename + self.pfba = pfba self.gapfillings = {} # Define Data attributes as None self.solution = ( @@ -151,7 +158,7 @@ def __init__( ) = self.kinetic_coeff = self.modelseed_db_path = None self.species = DictList() # Computing data from model - msid_cobraid_hash = FBAHelper.msid_hash(model) + msid_cobraid_hash = self.mdlutl.msid_hash() if "cpd11416" not in msid_cobraid_hash: logger.critical("Could not find biomass compound") raise KeyError("Could not find biomass compound for the model.") @@ -314,7 +321,7 @@ def build_from_species_models( newutl = MSModelUtil(newmodel) newutl.add_exchanges_for_metabolites([comm_biomass], 0, 100, "SK_") return ( - MSCommunity(model=newmodel, names=names, abundances=abundances), + MSCommunity(model=newutl, names=names, abundances=abundances), biomass_indices_dict, ) From 221fe724229d07c9da74fdb6826aaf0926b8fa1d Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 19 Mar 2024 09:33:15 -0500 Subject: [PATCH 221/298] Fixing community --- modelseedpy/community/mscommunity.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index d999837f..6ad31727 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -188,7 +188,7 @@ def __init__( @staticmethod def build_from_species_models( - models, mdlid=None, name=None, names=[], abundances=None + models, mdlid=None, name=None, names=[], abundances=None,basemodel=None ): """Merges the input list of single species metabolic models into a community metabolic model @@ -227,7 +227,10 @@ def build_from_species_models( #) # construct the new model - newmodel = Model(mdlid, name) + if basemodel: + newmodel = basemodel + else: + newmodel = Model(mdlid, name) newutl = MSModelUtil(newmodel) biomass_compounds = [] biomass_index = 2 From a22b9e3eba782152c3b9d11ec6ddda50907974e7 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 19 Mar 2024 09:47:43 -0500 Subject: [PATCH 222/298] Fixing --- modelseedpy/community/mscommunity.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index 6ad31727..bf4d2967 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -321,7 +321,7 @@ def build_from_species_models( newmodel.add_reactions([comm_biorxn]) # create a biomass sink reaction - newutl = MSModelUtil(newmodel) + newutl = MSModelUtil.get(newmodel) newutl.add_exchanges_for_metabolites([comm_biomass], 0, 100, "SK_") return ( MSCommunity(model=newutl, names=names, abundances=abundances), From 4ae878e76c301427c2594f4a00bb9d2f7fbac365 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 19 Mar 2024 11:08:09 -0500 Subject: [PATCH 223/298] Rolling back to old reconstruction code --- modelseedpy/community/mscommunity.py | 171 +++++++++------------------ 1 file changed, 58 insertions(+), 113 deletions(-) diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index bf4d2967..eaad79e4 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- from modelseedpy.fbapkg.mspackagemanager import MSPackageManager -from modelseedpy.community.mscompatibility import MSCompatibility from modelseedpy.core.msmodelutl import MSModelUtil from modelseedpy.core.msgapfill import MSGapfill from modelseedpy.core.fbahelper import FBAHelper @@ -14,7 +13,6 @@ from optlang.symbolics import Zero from matplotlib import pyplot from pandas import DataFrame -from pprint import pprint import logging # import itertools @@ -31,23 +29,16 @@ def __init__( self, community, # MSCommunity environment biomass_cpd, # metabolite in the biomass reaction - names=[], # names of the community species #TODO - look into whether there should be a names field - name=None, # the name of a species - index=None, # the index of the species + names=[], # names of the community species ): self.community, self.biomass_cpd = community, biomass_cpd - print(self.biomass_cpd.compartment) - self.index = int( - self.biomass_cpd.compartment[1:] - ) # if index is None else index + self.index = int(self.biomass_cpd.compartment[1:]) self.abundance = 0 if self.biomass_cpd in self.community.primary_biomass.metabolites: self.abundance = abs( self.community.primary_biomass.metabolites[self.biomass_cpd] ) - if name: - self.id = name - elif self.index < len(names): + if self.index <= len(names) and names[self.index - 1]: self.id = names[self.index - 1] else: if "species_name" in self.biomass_cpd.annotation: @@ -127,7 +118,7 @@ def compute_max_atp(self): class MSCommunity: def __init__( self, - model=None, # the model that will be defined + model, names=[], abundances=None, # names and abundances of the community species pfba=True, # specify whether parsimonious FBA will be simulated @@ -140,7 +131,7 @@ def __init__( else: self.model = model self.mdlutl = MSModelUtil.get(model) - self.pkgmgr = MSPackageManager.get_pkg_mgr(self.model) + self.pkgmgr = MSPackageManager.get_pkg_mgr(self.model) self.lp_filename = lp_filename self.pfba = pfba self.gapfillings = {} @@ -158,23 +149,22 @@ def __init__( ) = self.kinetic_coeff = self.modelseed_db_path = None self.species = DictList() # Computing data from model - msid_cobraid_hash = self.mdlutl.msid_hash() + msid_cobraid_hash = FBAHelper.msid_hash(model) if "cpd11416" not in msid_cobraid_hash: logger.critical("Could not find biomass compound") - raise KeyError("Could not find biomass compound for the model.") other_biomass_cpds = [] for biomass_cpd in msid_cobraid_hash["cpd11416"]: if biomass_cpd.compartment == "c0": self.biomass_cpd = biomass_cpd - for reaction in self.model.reactions: - if biomass_cpd in reaction.metabolites: + for reaction in model.reactions: + if self.biomass_cpd in reaction.metabolites: if ( - reaction.metabolites[biomass_cpd] == 1 + reaction.metabolites[self.biomass_cpd] == 1 and len(reaction.metabolites) > 1 ): self.primary_biomass = reaction elif ( - reaction.metabolites[biomass_cpd] < 0 + reaction.metabolites[self.biomass_cpd] < 0 and len(reaction.metabolites) == 1 ): self.biomass_drain = reaction @@ -188,7 +178,7 @@ def __init__( @staticmethod def build_from_species_models( - models, mdlid=None, name=None, names=[], abundances=None,basemodel=None + models, mdlid=None, name=None, names=[], abundances=None ): """Merges the input list of single species metabolic models into a community metabolic model @@ -196,9 +186,7 @@ def build_from_species_models( ---------- models : list List of models to be merged into a community model - msdb_path : string - The path to the local version of the ModelSEED Database - model_id : string + mdlid : string String specifying community model ID name : string String specifying community model name @@ -215,118 +203,75 @@ def build_from_species_models( Raises ------ """ - # compatabilize the models - #mscompat = MSCompatibility(modelseed_db_path=msdb_path) - #models = mscompat.align_exchanges( - # models, conflicts_file_name="exchanges_conflicts.json", model_names=names - #) - #models = mscompat.standardize( - # models, - # conflicts_file_name="standardized_exchange_metabolites.json", - # model_names=names, - #) - - # construct the new model - if basemodel: - newmodel = basemodel - else: - newmodel = Model(mdlid, name) + newmodel = Model(mdlid, name) newutl = MSModelUtil(newmodel) biomass_compounds = [] + index = 1 biomass_index = 2 - biomass_indices = [1] - biomass_indices_dict = {} - new_metabolites, new_reactions = set(), set() - for model_index, model in enumerate(models): - model_reaction_ids = [rxn.id for rxn in model.reactions] - # model_index+=1 - print([rxn.id for rxn in model.reactions if "bio" in rxn.id]) - print(model_index, model.id) + for model in models: + new_metabolites = [] + new_reactions = [] # Rename metabolites for met in model.metabolites: # Renaming compartments + if re.search("[a-z+](\d*)$", met.compartment): + m = re.search("([a-z]+)(\d*)$", met.compartment) + if len(m[2]) == 0: + if m[1] == "e": + met.compartment += "0" + else: + met.compartment += str(index) + elif m[1] == "e": + met.compartment = m[1] + "0" + else: + met.compartment = m[1] + str(index) + # Processing metabolite ID output = MSModelUtil.parse_id(met) - if output is None: + if output == None: if met.compartment[0] != "e": - met.id += str(model_index) - met.compartment = met.compartment[0] + str(model_index) + met.id += str(index) + elif output[1] != "e": + if len(output[2]) == 0: + met.id = met.id + str(index) else: - met.compartment = "e0" - else: - if output[2] == "": - if output[1] != "e": - met.id += str(model_index) - met.compartment += str(model_index) - elif output[1] == "e": - met.compartment = "e0" - else: - met.compartment = output[1] + str(model_index) - met.id = output[0] + "_" + output[1] + str(model_index) - new_metabolites.add(met) - if "cpd11416_c" in met.id: - print(met.id, model.id) - biomass_compounds.append(met) + met.id = output[0] + "_" + output[1] + str(index) + if met.id not in newmodel.metabolites: + new_metabolites.append(met) + if met.id == "cpd11416": + biomass_compounds.append(met) # Rename reactions for rxn in model.reactions: if rxn.id[0:3] != "EX_": - if re.search("^(bio)(\d+)$", rxn.id): - print(biomass_indices) - index = int(rxn.id.removeprefix("bio")) - if index not in biomass_indices: - biomass_indices.append(index) - biomass_indices_dict[model.id] = index - print(rxn.id, "2") - else: - rxn_id = "bio" + str(biomass_index) - if rxn_id not in model_reaction_ids: - print(rxn_id, "1") - rxn.id = rxn_id - biomass_indices.append(biomass_index) - biomass_indices_dict[model.id] = index - else: - print(rxn_id, "3") - for i in range(len(models) * 2): - rxn_id = "bio" + str(i) - if ( - rxn_id not in model_reaction_ids - and i not in biomass_indices - ): - rxn.id = rxn_id - biomass_indices.append(i) - biomass_indices_dict[model.id] = i - break + if re.search("^(bio)(\d+)$", rxn.id) != None: + rxn.id = "bio" + str(biomass_index) biomass_index += 1 else: output = MSModelUtil.parse_id(rxn) - if output is None: - if "e" not in rxn.compartment.id: - rxn.id += str(model_index) + if output == None: + if rxn.compartment.id[0] != "e": + rxn.id += str(index) elif output[1] != "e": - rxn.id = output[0] + "_" + output[1] + str(model_index) - if output[2] == "": - rxn.id = rxn.id + str(model_index) - new_reactions.add(rxn) - # Adding new reactions and compounds to base model - newmodel.add_reactions(FBAHelper.filter_cobra_set(new_reactions)) - newmodel.add_metabolites(FBAHelper.filter_cobra_set(new_metabolites)) - + if len(output[2]) == 0: + rxn.id = rxn.id + str(index) + else: + rxn.id = output[0] + "_" + output[1] + str(index) + if rxn.id not in newmodel.reactions: + new_reactions.append(rxn) + # Adding new reactions and compounds to base model + newmodel.add_reactions(new_reactions) + newmodel.add_metabolites(new_metabolites) + index += 1 # Create community biomass comm_biomass = Metabolite("cpd11416_c0", None, "Community biomass", 0, "c0") metabolites = {comm_biomass: 1} - metabolites.update( - {cpd: -1 / len(biomass_compounds) for cpd in biomass_compounds} - ) comm_biorxn = Reaction(id="bio1", name="bio1", lower_bound=0, upper_bound=100) + count = len(biomass_compounds) + for cpd in biomass_compounds: + metabolites[cpd] = -1 / count comm_biorxn.add_metabolites(metabolites) newmodel.add_reactions([comm_biorxn]) - - # create a biomass sink reaction - newutl = MSModelUtil.get(newmodel) newutl.add_exchanges_for_metabolites([comm_biomass], 0, 100, "SK_") - return ( - MSCommunity(model=newutl, names=names, abundances=abundances), - biomass_indices_dict, - ) + return MSCommunity(newmodel, names, abundances) # Manipulation functions def set_abundance(self, abundances): From 3efd02efd7541ad7f592b31b25cb72b719b3b99f Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 19 Mar 2024 11:09:59 -0500 Subject: [PATCH 224/298] Fixing basemodel support --- modelseedpy/community/mscommunity.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index eaad79e4..fc84d5ce 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -178,7 +178,7 @@ def __init__( @staticmethod def build_from_species_models( - models, mdlid=None, name=None, names=[], abundances=None + models, mdlid=None, name=None, names=[], abundances=None,basemodel=None ): """Merges the input list of single species metabolic models into a community metabolic model @@ -203,8 +203,10 @@ def build_from_species_models( Raises ------ """ - newmodel = Model(mdlid, name) - newutl = MSModelUtil(newmodel) + if basemodel: + newmodel = basemodel + else: + newmodel = Model(mdlid, name) biomass_compounds = [] index = 1 biomass_index = 2 From 5cd37e9626a6a0eaaa75e439d4b86a53d574ad74 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 19 Mar 2024 11:13:08 -0500 Subject: [PATCH 225/298] Fixing --- modelseedpy/community/mscommunity.py | 1 + 1 file changed, 1 insertion(+) diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index fc84d5ce..e82c9cc6 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -207,6 +207,7 @@ def build_from_species_models( newmodel = basemodel else: newmodel = Model(mdlid, name) + newutl = MSModelUtil.get(newmodel) biomass_compounds = [] index = 1 biomass_index = 2 From 3e94867611498b74ab8efe4a5e0cdc5faefdc08a Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 19 Mar 2024 11:35:07 -0500 Subject: [PATCH 226/298] Fixing --- modelseedpy/community/mscommunity.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index e82c9cc6..b56db61c 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -149,7 +149,7 @@ def __init__( ) = self.kinetic_coeff = self.modelseed_db_path = None self.species = DictList() # Computing data from model - msid_cobraid_hash = FBAHelper.msid_hash(model) + msid_cobraid_hash = self.mdlutl.msid_hash() if "cpd11416" not in msid_cobraid_hash: logger.critical("Could not find biomass compound") other_biomass_cpds = [] @@ -240,7 +240,7 @@ def build_from_species_models( met.id = output[0] + "_" + output[1] + str(index) if met.id not in newmodel.metabolites: new_metabolites.append(met) - if met.id == "cpd11416": + if newutl.metabolite_msid(met) == "cpd11416": biomass_compounds.append(met) # Rename reactions for rxn in model.reactions: From 95d45c221de420039b8df71362b6bfca4a8b9410 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Fri, 22 Mar 2024 00:31:33 -0500 Subject: [PATCH 227/298] Updates to improve annotation ontology support --- modelseedpy/core/annotationontology.py | 7 +++++++ modelseedpy/core/msgenome.py | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/modelseedpy/core/annotationontology.py b/modelseedpy/core/annotationontology.py index dc52ab55..3efc91b9 100644 --- a/modelseedpy/core/annotationontology.py +++ b/modelseedpy/core/annotationontology.py @@ -7,6 +7,7 @@ import pandas as pd import cobra from cobra import DictList +from modelseedpy.core.msgenome import MSGenome # from builtins import None @@ -443,3 +444,9 @@ def add_feature(self, feature_or_id): if feature_or_id.id not in feature_hash: feature_hash[feature_or_id.id] = feature_or_id return feature_hash[feature_or_id.id] + + def get_msgenome(self,annoont,prioritized_event_list=None,ontologies=None,merge_all=False,feature_type=None,translate_to_rast=True): + return MSGenome.from_annotation_ontology( + self, prioritized_event_list, ontologies, merge_all,feature_type, translate_to_rast + ) + \ No newline at end of file diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index 78f1e004..1ad43721 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -102,6 +102,22 @@ def add_features(self, feature_list: list): self.features += feature_list + @staticmethod + def from_annotation_ontology( + annoont, prioritized_event_list=None, ontologies=None, merge_all=False,feature_type=None, translate_to_rast=True + ): + gene_hash = annoont.get_gene_term_hash() + genome = MSGenome() + features = [] + for gene in gene_hash: + feature = MSFeature(gene.id,"") + for term in gene_hash[gene]: + feature.add_ontology_term(term.ontology.id, term.id) + if term.ontology.id == "SSO": + feature.add_ontology_term("RAST",annoont.get_term_name(term)) + genome.add_features(features) + return genome + @staticmethod def from_fasta( filename, contigs=0, split="|", h_func=None From 0ad47c4924af5ecf0180498bd0a95f6b7b6808c8 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Fri, 22 Mar 2024 01:38:43 -0500 Subject: [PATCH 228/298] Fixing annoopt bug --- modelseedpy/core/annotationontology.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/annotationontology.py b/modelseedpy/core/annotationontology.py index 3efc91b9..55eb2f90 100644 --- a/modelseedpy/core/annotationontology.py +++ b/modelseedpy/core/annotationontology.py @@ -445,7 +445,7 @@ def add_feature(self, feature_or_id): feature_hash[feature_or_id.id] = feature_or_id return feature_hash[feature_or_id.id] - def get_msgenome(self,annoont,prioritized_event_list=None,ontologies=None,merge_all=False,feature_type=None,translate_to_rast=True): + def get_msgenome(self,prioritized_event_list=None,ontologies=None,merge_all=False,feature_type=None,translate_to_rast=True): return MSGenome.from_annotation_ontology( self, prioritized_event_list, ontologies, merge_all,feature_type, translate_to_rast ) From 24ae847ac9886a9b5478edf348b43a28cefd0ae3 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Fri, 22 Mar 2024 01:54:01 -0500 Subject: [PATCH 229/298] Fixing genome --- modelseedpy/core/msgenome.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index 1ad43721..f156e787 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -84,6 +84,9 @@ def add_ontology_term(self, ontology_term, value): class MSGenome: def __init__(self): self.features = DictList() + self.id = None + self.info = None + self.scientific_name = None def add_features(self, feature_list: list): """ From 1e83b45378aa099eec246a0297a76d451e74c4b2 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Fri, 22 Mar 2024 02:14:30 -0500 Subject: [PATCH 230/298] Fixing genome --- modelseedpy/core/msgenome.py | 1 + 1 file changed, 1 insertion(+) diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index f156e787..27aa3425 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -114,6 +114,7 @@ def from_annotation_ontology( features = [] for gene in gene_hash: feature = MSFeature(gene.id,"") + features.append(feature) for term in gene_hash[gene]: feature.add_ontology_term(term.ontology.id, term.id) if term.ontology.id == "SSO": From cb5008472debb2a4dc0e75a0dbffa16b34e9b61a Mon Sep 17 00:00:00 2001 From: Jeremy Jacobson <85139244+jjacobson95@users.noreply.github.com> Date: Fri, 22 Mar 2024 09:54:04 -0700 Subject: [PATCH 231/298] Update msgapfill.py --- modelseedpy/core/msgapfill.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 5c79fb9c..79200d6e 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -11,6 +11,7 @@ from modelseedpy.fbapkg.mspackagemanager import MSPackageManager from modelseedpy.core.msmodelutl import MSModelUtil from modelseedpy.core.exceptions import GapfillingError +from collections import defaultdict logger = logging.getLogger(__name__) logger.setLevel( @@ -447,12 +448,21 @@ def compute_reaction_weights_from_expression_data(self, omics_data, annoont): p = np.zeros(len(restructured_anoot["Reactions"])) # computed_weights is the rxn_hash ({rxn: weight, ...}) computed_weights = {} + + # Precompute gene reaction lookups + gene_reaction_lookup = {} + for idx, row in restructured_anoot.iterrows(): + gene = row['Gene'] + reaction = row['Reactions'] + if gene in gene_reaction_lookup: + gene_reaction_lookup[gene].append(reaction) + else: + gene_reaction_lookup[gene] = [reaction] + for rxn in range(0, len(restructured_anoot)): substr_rxns = [rxn for rxn in restructured_anoot["Reactions"][[rxn]]] # Get the indices of the rows where the condition is True - mask = restructured_anoot["Reactions"].apply( - lambda x: any(substr in x for substr in substr_rxns) - ) + mask = restructured_anoot["Reactions"] == substr_rxns[0] idx_gene = mask[mask].index nAG = 0 nMG = 0 @@ -476,11 +486,10 @@ def compute_reaction_weights_from_expression_data(self, omics_data, annoont): selected_gene = restructured_anoot["Gene"].iloc[idx_gene[iGene]] # Finding reactions associated with genes that contain the selected gene - associated_reactions = restructured_anoot["Reactions"][ - restructured_anoot["Gene"].str.contains(selected_gene) - ] + associated_reactions = gene_reaction_lookup.get(selected_gene, []) + # Checking if there are more than one unique reactions - if len(associated_reactions.unique()) > 1: + if len(associated_reactions) > 1: nCG += 1 p[rxn] = (nMG / nAG) * (1 / (1 + (nCG / nAG))) From fc1019ba1703f0547809de3764624fee95d7e00b Mon Sep 17 00:00:00 2001 From: Jeremy Date: Fri, 22 Mar 2024 09:55:18 -0700 Subject: [PATCH 232/298] linted --- modelseedpy/core/msgapfill.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 79200d6e..4e94b069 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -452,13 +452,13 @@ def compute_reaction_weights_from_expression_data(self, omics_data, annoont): # Precompute gene reaction lookups gene_reaction_lookup = {} for idx, row in restructured_anoot.iterrows(): - gene = row['Gene'] - reaction = row['Reactions'] + gene = row["Gene"] + reaction = row["Reactions"] if gene in gene_reaction_lookup: gene_reaction_lookup[gene].append(reaction) else: gene_reaction_lookup[gene] = [reaction] - + for rxn in range(0, len(restructured_anoot)): substr_rxns = [rxn for rxn in restructured_anoot["Reactions"][[rxn]]] # Get the indices of the rows where the condition is True @@ -487,7 +487,7 @@ def compute_reaction_weights_from_expression_data(self, omics_data, annoont): # Finding reactions associated with genes that contain the selected gene associated_reactions = gene_reaction_lookup.get(selected_gene, []) - + # Checking if there are more than one unique reactions if len(associated_reactions) > 1: nCG += 1 From 6738874a02b583e66a83c12e45b4607ed95afa86 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Fri, 22 Mar 2024 10:17:26 -0700 Subject: [PATCH 233/298] re-linted msgapfill.py --- modelseedpy/core/msgapfill.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 4e94b069..ee1b0fe3 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -13,6 +13,7 @@ from modelseedpy.core.exceptions import GapfillingError from collections import defaultdict + logger = logging.getLogger(__name__) logger.setLevel( logging.INFO # WARNING @@ -131,9 +132,9 @@ def test_gapfill_database(self, media, target=None, before_filtering=True): if before_filtering: filter_msg = " before filtering " note = "FBF" - gf_sensitivity[media.id][target][note] = ( - self.mdlutl.find_unproducible_biomass_compounds(target) - ) + gf_sensitivity[media.id][target][ + note + ] = self.mdlutl.find_unproducible_biomass_compounds(target) if target != "rxn00062_c0": self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") logger.warning( @@ -388,10 +389,10 @@ def integrate_gapfill_solution( gf_sensitivity[solution["media"].id] = {} if solution["target"] not in gf_sensitivity[solution["media"].id]: gf_sensitivity[solution["media"].id][solution["target"]] = {} - gf_sensitivity[solution["media"].id][solution["target"]]["success"] = ( - self.mdlutl.find_unproducible_biomass_compounds( - solution["target"], cumulative_solution - ) + gf_sensitivity[solution["media"].id][solution["target"]][ + "success" + ] = self.mdlutl.find_unproducible_biomass_compounds( + solution["target"], cumulative_solution ) self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") self.cumulative_gapfilling.extend(cumulative_solution) From e59adab8970a93519340260d71c632c6951e891b Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Fri, 22 Mar 2024 23:47:44 -0500 Subject: [PATCH 234/298] Adding function for creating new features --- modelseedpy/core/msgenome.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index 27aa3425..3d8ef53b 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -105,6 +105,10 @@ def add_features(self, feature_list: list): self.features += feature_list + def create_new_feature(self,id,sequence): + newftr = MSFeature(id,sequence) + self.add_features([newftr]) + @staticmethod def from_annotation_ontology( annoont, prioritized_event_list=None, ontologies=None, merge_all=False,feature_type=None, translate_to_rast=True From 7d433a58c0ce26e16a39bf6153176deafe0a1707 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 23 Mar 2024 00:41:23 -0500 Subject: [PATCH 235/298] Fixing genome info bug --- modelseedpy/core/annotationontology.py | 5 ++++- modelseedpy/core/msgenome.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/modelseedpy/core/annotationontology.py b/modelseedpy/core/annotationontology.py index 55eb2f90..05eed49d 100644 --- a/modelseedpy/core/annotationontology.py +++ b/modelseedpy/core/annotationontology.py @@ -310,6 +310,7 @@ def __init__(self, genome_ref, data_dir): self.noncodings = {} self.feature_types = {} self.term_names = {} + self.info = None def get_term_name(self, term): if term.ontology.id not in self.term_names: @@ -446,7 +447,9 @@ def add_feature(self, feature_or_id): return feature_hash[feature_or_id.id] def get_msgenome(self,prioritized_event_list=None,ontologies=None,merge_all=False,feature_type=None,translate_to_rast=True): - return MSGenome.from_annotation_ontology( + newgenome = MSGenome.from_annotation_ontology( self, prioritized_event_list, ontologies, merge_all,feature_type, translate_to_rast ) + newgenome.annoont = self + return newgenome \ No newline at end of file diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index 3d8ef53b..6c40b79d 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -85,7 +85,7 @@ class MSGenome: def __init__(self): self.features = DictList() self.id = None - self.info = None + self.annoont = None self.scientific_name = None def add_features(self, feature_list: list): From f9feaf62d1faa2c9a0e839e9b3d20a0b377b71fa Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 23 Mar 2024 00:56:33 -0500 Subject: [PATCH 236/298] Fixing feature --- modelseedpy/core/msgenome.py | 1 + 1 file changed, 1 insertion(+) diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index 6c40b79d..bcef005d 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -108,6 +108,7 @@ def add_features(self, feature_list: list): def create_new_feature(self,id,sequence): newftr = MSFeature(id,sequence) self.add_features([newftr]) + return newftr @staticmethod def from_annotation_ontology( From 3391b5cf2204ef0f7e611752fc314d932f19d832 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 28 Mar 2024 16:02:21 -0500 Subject: [PATCH 237/298] Finalizing omegga --- modelseedpy/core/msfba.py | 11 ++++++----- modelseedpy/core/msgapfill.py | 17 +++++++++-------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/modelseedpy/core/msfba.py b/modelseedpy/core/msfba.py index d9936977..efe3e3e7 100644 --- a/modelseedpy/core/msfba.py +++ b/modelseedpy/core/msfba.py @@ -10,7 +10,7 @@ logger = logging.getLogger(__name__) class MSFBA: - def __init__(self,model_or_mdlutl,media,objective_reactions,maximize,gene_ko=[],reaction_ko=[],pfba=True,fva=True,clone=True): + def __init__(self,model_or_mdlutl,media,objective_reactions={"bio1":1},maximize=True,gene_ko=[],reaction_ko=[],pfba=True,fva=True,clone=True,primary_solution=None,suffix=".fba"): if isinstance(model_or_mdlutl, MSModelUtil): model_or_mdlutl = model_or_mdlutl.model if clone: @@ -24,12 +24,13 @@ def __init__(self,model_or_mdlutl,media,objective_reactions,maximize,gene_ko=[], self.reaction_ko = reaction_ko self.pkgmgr = self.mdlutl.pkgmgr self.apply_parameters() - self.primary_solution = None + self.primary_solution = primary_solution self.secondary_solutions = None self.fva = fva self.pfba = pfba self.fva_results = None self.secondary_fva = None + self.wsid = self.mdlutl.wsid+suffix def build_objective(self): sense = "max" @@ -37,11 +38,11 @@ def build_objective(self): sense = "min" obj = self.model.problem.Objective(0, direction=sense) objcoef = {} - for rxnid in self.objective: + for rxnid in self.objective_reactions: if rxnid in self.model.reactions: rxn = self.model.reactions.get_by_id(rxnid) - objcoef[rxn.forward_variable] = self.objective[rxnid] - objcoef[rxn.reverse_variable] = -1*self.objective[rxnid] + objcoef[rxn.forward_variable] = self.objective_reactions[rxnid] + objcoef[rxn.reverse_variable] = -1*self.objective_reactions[rxnid] else: logger.warning(f"KO reaction {rxnid} not found in model") obj.set_linear_coefficients(objcoef) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 735243f5..1c6efe3a 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -398,7 +398,7 @@ def run_multi_gapfill( binary_check=False, prefilter=True, check_for_growth=True, - gapfilling_mode="Cumulative", + gapfilling_mode="Sequential", run_sensitivity_analysis=True, integrate_solutions=True ): @@ -468,7 +468,7 @@ def run_multi_gapfill( minimum_obj = minimum_objectives[item] thresholds.append(minimum_obj) #Implementing specified gapfilling mode - if gapfilling_mode == "Independent" or gapfilling_mode == "Cumulative": + if gapfilling_mode == "Independent" or gapfilling_mode == "Sequential": self.lp_filename = item.id+"-gf.lp" solution = self.run_gapfilling( item, @@ -487,7 +487,7 @@ def run_multi_gapfill( gapfilling_mode=gapfilling_mode ) #If we are doing cumulative gapfilling, then we need adjust the gapfilling objective so it no longer penalizes using the current solution reactions - if gapfilling_mode == "Cumulative": + if gapfilling_mode == "Sequential": self.gfpkgmgr.getpkg("GapfillingPkg").compute_gapfilling_penalties(exclusion_solution=cumulative_solution,reaction_scores=self.reaction_scores) self.gfpkgmgr.getpkg("GapfillingPkg").build_gapfilling_objective_function() if gapfilling_mode == "Global": @@ -523,7 +523,7 @@ def run_multi_gapfill( remove_unneeded_reactions=True, do_not_remove_list=[] )#Returns reactions in cumulative solution that are not needed for growth - elif gapfilling_mode == "Cumulative": + elif gapfilling_mode == "Sequential": #Restoring the gapfilling objective function self.gfpkgmgr.getpkg("GapfillingPkg").compute_gapfilling_penalties(reaction_scores=self.reaction_scores) self.gfpkgmgr.getpkg("GapfillingPkg").build_gapfilling_objective_function() @@ -559,7 +559,7 @@ def run_multi_gapfill( return solution_dictionary def integrate_gapfill_solution( - self,solution,cumulative_solution=[],remove_unneeded_reactions=False,check_for_growth=True,gapfilling_mode="Cumulative" + self,solution,cumulative_solution=[],remove_unneeded_reactions=False,check_for_growth=True,gapfilling_mode="Sequential" ): """Integrating gapfilling solution into model Parameters @@ -668,7 +668,7 @@ def integrate_gapfill_solution( # Adding the gapfilling solution data to the model, which is needed for saving the model in KBase self.mdlutl.add_gapfilling(solution) # Testing which gapfilled reactions are needed to produce each reactant in the objective function - if link_gaps_to_objective: + """ if link_gaps_to_objective: logger.info( "Gapfilling sensitivity analysis running on succesful run in " + solution["media"].id @@ -685,8 +685,9 @@ def integrate_gapfill_solution( ] = self.mdlutl.find_unproducible_biomass_compounds( solution["target"], cumulative_solution ) - self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") + self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") """ self.cumulative_gapfilling.extend(cumulative_solution) + return current_media_target_solution def compute_reaction_weights_from_expression_data(self, omics_data, annoont): """Computing reaction weights based on input gene-level omics data @@ -718,7 +719,7 @@ def compute_reaction_weights_from_expression_data(self, omics_data, annoont): restructured_anoot = pd.DataFrame(rows_list) ### Integrate Omics, set weights, find indexes for features - feature_ids_set = set(omics_data["feature_ids"]) + feature_ids_set = set(omics_data.index) # Find indices where 'Gene' values are in 'feature_ids' # isin method returns a boolean series that is True where tbl_supAno['Gene'] is in feature_ids_set From a6fc4b9284a50046d59dd41267220b8a038d40ad Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 30 Mar 2024 01:42:58 -0500 Subject: [PATCH 238/298] Fixing omegga capabilities --- modelseedpy/community/mscommunity.py | 2 + modelseedpy/core/msfba.py | 28 ++++---- modelseedpy/core/msgapfill.py | 101 +++++++++++++++------------ modelseedpy/fbapkg/gapfillingpkg.py | 2 - 4 files changed, 70 insertions(+), 63 deletions(-) diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index b56db61c..f1ce5e75 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -158,6 +158,7 @@ def __init__( self.biomass_cpd = biomass_cpd for reaction in model.reactions: if self.biomass_cpd in reaction.metabolites: + print(reaction.id, reaction.metabolites) if ( reaction.metabolites[self.biomass_cpd] == 1 and len(reaction.metabolites) > 1 @@ -172,6 +173,7 @@ def __init__( other_biomass_cpds.append(biomass_cpd) for biomass_cpd in other_biomass_cpds: species_obj = CommunityModelSpecies(self, biomass_cpd, names) + print(species_obj.index,species_obj.id) self.species.append(species_obj) if abundances: self.set_abundance(abundances) diff --git a/modelseedpy/core/msfba.py b/modelseedpy/core/msfba.py index efe3e3e7..2a86f8ee 100644 --- a/modelseedpy/core/msfba.py +++ b/modelseedpy/core/msfba.py @@ -10,7 +10,7 @@ logger = logging.getLogger(__name__) class MSFBA: - def __init__(self,model_or_mdlutl,media,objective_reactions={"bio1":1},maximize=True,gene_ko=[],reaction_ko=[],pfba=True,fva=True,clone=True,primary_solution=None,suffix=".fba"): + def __init__(self,model_or_mdlutl,media,objective_reactions={"bio1":1},maximize=True,gene_ko=[],reaction_ko=[],pfba=True,fva=True,clone=True,primary_solution=None,id=None): if isinstance(model_or_mdlutl, MSModelUtil): model_or_mdlutl = model_or_mdlutl.model if clone: @@ -30,7 +30,9 @@ def __init__(self,model_or_mdlutl,media,objective_reactions={"bio1":1},maximize= self.pfba = pfba self.fva_results = None self.secondary_fva = None - self.wsid = self.mdlutl.wsid+suffix + if id == None: + id = self.mdlutl.model.id+".fba" + self.id = id def build_objective(self): sense = "max" @@ -77,7 +79,7 @@ def add_secondary_solution(self,solution,fva=None): self.secondary_fva = [] self.secondary_fva.append(fva) - def get_variable_class(variable_min, variable_max): + def get_variable_class(self,variable_min, variable_max): variable_class = "Unknown" if variable_min is None or variable_max is None: return variable_class @@ -95,7 +97,7 @@ def get_variable_class(variable_min, variable_max): variable_class = "Variable" return variable_class - def generate_kbase_data(self): + def generate_kbase_data(self,fbamodel_ref,media_ref): output = { "FBABiomassVariables": [], "FBACompoundBounds": [], @@ -126,7 +128,7 @@ def generate_kbase_data(self): "defaultMaxFlux": 1000, "defaultMinDrainFlux": -1000, "drainfluxUseVariables": 0, - "fbamodel_ref": self.fbamodel_ref, + "fbamodel_ref": fbamodel_ref, "findMinimalMedia": 0, "fluxMinimization": 1, "fluxUseVariables": 0, @@ -138,14 +140,14 @@ def generate_kbase_data(self): "maximizeActiveReactions": 0, "maximizeObjective": 1, "media_list_refs": [], - "media_ref": self.media_ref, + "media_ref": media_ref, "minimizeErrorThermodynamicConstraints": 0, "minimize_reaction_costs": {}, "minimize_reactions": 0, "noErrorThermodynamicConstraints": 0, "numberOfSolutions": 1, "objectiveConstraintFraction": 0.1, - "objectiveValue": self.objective_value, + "objectiveValue": self.primary_solution.objective_value, "other_objectives": [], "outputfiles": {}, "parameters": { @@ -211,20 +213,14 @@ def generate_kbase_data(self): variable_data["max"] = -1 * lower variable_data["value"] = -1 * variable_data["value"] variable_data["variableType"] = "drainflux" - variable_data["modelcompound_ref"] = ( - "~/fbamodel/modelcompounds/id/" + rxn.id[3:], - ) + variable_data["modelcompound_ref"] = "~/fbamodel/modelcompounds/id/" + rxn.id[3:] variable_key = "FBACompoundVariables" elif rxn.id.startswith("bio"): variable_data["variableType"] = "biomassflux" - variable_data["biomass_ref"] = ( - "~/fbamodel/biomasses/id/" + rxn.id, - ) + variable_data["biomass_ref"] = "~/fbamodel/biomasses/id/" + rxn.id variable_key = "FBABiomassVariables" else: - variable_data["modelreaction_ref"] = ( - "~/fbamodel/modelreactions/id/" + rxn.id - ) + variable_data["modelreaction_ref"] = "~/fbamodel/modelreactions/id/" + rxn.id variable_data["exp_state"] = "unknown" variable_data["biomass_dependencies"] = [] variable_data["coupled_reactions"] = [] diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 1c6efe3a..2071c136 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -220,8 +220,9 @@ def run_gapfilling( # Printing the gapfilling LP file if self.lp_filename: - with open(self.lp_filename, "w") as out: - out.write(str(self.gfmodel.solver)) + pass + #with open(self.lp_filename, "w") as out: + # out.write(str(self.gfmodel.solver)) # Running gapfil/ling and checking solution sol = self.gfmodel.optimize() @@ -366,8 +367,9 @@ def run_global_gapfilling( # Printing the gapfilling LP file if self.lp_filename: - with open(self.lp_filename, "w") as out: - out.write(str(merged_model.solver)) + pass + #with open(self.lp_filename, "w") as out: + # out.write(str(merged_model.solver)) # Running gapfilling and checking solution sol = merged_model.optimize() @@ -469,7 +471,6 @@ def run_multi_gapfill( thresholds.append(minimum_obj) #Implementing specified gapfilling mode if gapfilling_mode == "Independent" or gapfilling_mode == "Sequential": - self.lp_filename = item.id+"-gf.lp" solution = self.run_gapfilling( item, target, @@ -528,30 +529,57 @@ def run_multi_gapfill( self.gfpkgmgr.getpkg("GapfillingPkg").compute_gapfilling_penalties(reaction_scores=self.reaction_scores) self.gfpkgmgr.getpkg("GapfillingPkg").build_gapfilling_objective_function() #Running sensitivity analysis once on the cumulative solution for all media - """ - if run_sensitivity_analysis:#TODO - need to redesign this run operate on multiple solutions at once... + if run_sensitivity_analysis: logger.info( - "Gapfilling sensitivity analysis running on succesful run in " - + solution["media"].id - + " for target " - + solution["target"] + "Gapfilling sensitivity analysis running" ) - test_solution = [] - for rxn_id in solution["reversed"]: - test_solution.append([rxn_id, solution["reversed"][rxn_id]]) - for rxn_id in solution["new"]: - test_solution.append([rxn_id, solution["new"][rxn_id]]) + #First aggregating all unique reactions with a media for each + reaction_media_hash = {} + solution_rxn_types = ["new","reversed"] + media_reaction_hash = {} + for media in solution_dictionary: + if solution_dictionary[media]["growth"] > 0: + for rxn_type in solution_rxn_types: + for rxn_id in solution_dictionary[media][rxn_type]: + if rxn_id not in reaction_media_hash: + reaction_media_hash[rxn_id] = {} + if solution_dictionary[media][rxn_type][rxn_id] not in reaction_media_hash[rxn_id]: + reaction_media_hash[rxn_id][solution_dictionary[media][rxn_type][rxn_id]] = media + if media not in media_reaction_hash: + media_reaction_hash[media] = {} + media_reaction_hash[media][rxn_id] = solution_dictionary[media][rxn_type][rxn_id] + #Running sensitivity analysis on minimal reactions in each media + rxn_sensitivity_hash = {} + for media in media_reaction_hash: + test_solution = [] + for rxn in media_reaction_hash[media]: + test_solution.append([rxn, media_reaction_hash[media][rxn]]) + self.mdlutl.pkgmgr.getpkg("KBaseMediaPkg").build_package(media) + sensitivity_results = self.mdlutl.find_unproducible_biomass_compounds( + target, test_solution + ) + for rxn in sensitivity_results: + if rxn not in rxn_sensitivity_hash: + rxn_sensitivity_hash[rxn] = {} + for dir in sensitivity_results[rxn]: + rxn_sensitivity_hash[rxn][dir] = sensitivity_results[rxn][dir] + #Building gapfilling sensitivity output gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) - if solution["media"].id not in gf_sensitivity: - gf_sensitivity[solution["media"].id] = {} - if solution["target"] not in gf_sensitivity[solution["media"].id]: - gf_sensitivity[solution["media"].id][solution["target"]] = {} - gf_sensitivity[solution["media"].id][solution["target"]][ - "success" - ] = self.mdlutl.find_unproducible_biomass_compounds( - solution["target"], test_solution - ) - self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") """ + for media in solution_dictionary: + if media.id not in gf_sensitivity: + gf_sensitivity[media.id] = {} + if target not in gf_sensitivity[media.id]: + gf_sensitivity[media.id][target] = {} + if solution_dictionary[media]["growth"] > 0: + gf_sensitivity[media.id][target]["success"] = {} + for rxn_type in solution_rxn_types: + for rxn_id in solution_dictionary[media][rxn_type]: + if rxn_id not in gf_sensitivity[media.id][target]["success"]: + gf_sensitivity[media.id][target]["success"][rxn_id] = {} + gf_sensitivity[media.id][target]["success"][rxn_id][solution_dictionary[media][rxn_type][rxn_id]] = rxn_sensitivity_hash[rxn_id][solution_dictionary[media][rxn_type][rxn_id]] + else: + gf_sensitivity[media.id][target]["failure"] = {} + self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") #Restoring backedup model self.mdlutl = oldmdlutl self.model = oldmdlutl.model @@ -626,6 +654,7 @@ def integrate_gapfill_solution( rxn = self.model.reactions.get_by_id(item[0]) logger.debug(f"Assigning gene to reaction: {item[0]} {bestgene}") rxn.gene_reaction_rule = bestgene + rxn.notes["new_genes"] = bestgene #Setting bounds according to the direction the reaction was gapfilled in if item[1] == ">": rxn.upper_bound = 100 @@ -668,24 +697,6 @@ def integrate_gapfill_solution( # Adding the gapfilling solution data to the model, which is needed for saving the model in KBase self.mdlutl.add_gapfilling(solution) # Testing which gapfilled reactions are needed to produce each reactant in the objective function - """ if link_gaps_to_objective: - logger.info( - "Gapfilling sensitivity analysis running on succesful run in " - + solution["media"].id - + " for target " - + solution["target"] - ) - gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) - if solution["media"].id not in gf_sensitivity: - gf_sensitivity[solution["media"].id] = {} - if solution["target"] not in gf_sensitivity[solution["media"].id]: - gf_sensitivity[solution["media"].id][solution["target"]] = {} - gf_sensitivity[solution["media"].id][solution["target"]][ - "success" - ] = self.mdlutl.find_unproducible_biomass_compounds( - solution["target"], cumulative_solution - ) - self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") """ self.cumulative_gapfilling.extend(cumulative_solution) return current_media_target_solution @@ -703,7 +714,7 @@ def compute_reaction_weights_from_expression_data(self, omics_data, annoont): ### Restructure annoont into Dataframe rows_list = [] - for reaction, genes in annoont.get_reaction_gene_hash().items(): + for reaction, genes in annoont.get_reaction_gene_hash(feature_type="gene").items(): for gene, gene_info in genes.items(): # Initialize the row with 'Gene' and 'Reactions' row = {"Gene": gene, "Reactions": reaction} diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index c4a73794..ed7e49df 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -716,8 +716,6 @@ def run_test_conditions(self, condition_list, solution=None, max_iterations=10): def test_gapfill_database(self): self.reset_objective_minimum(0,False) self.model.objective = self.original_objective - with open("test_gapfill_database.lp", "w") as out: - out.write(str(self.model.solver)) solution = self.model.optimize() logger.info( "Objective with gapfill database:" From 92a59fff16f2f6e9a1b42ed9ad034187f4c944f0 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sun, 31 Mar 2024 23:46:30 -0500 Subject: [PATCH 239/298] Working on fbareport for community FBA app and adding debug message when genes are mapped to gapfilled reactions --- modelseedpy/core/msfbareport.py | 636 ++++++++++++++++++++++++ modelseedpy/core/msgapfill.py | 1 + modelseedpy/data/FBAReportTemplate.html | 213 ++++++++ 3 files changed, 850 insertions(+) create mode 100644 modelseedpy/core/msfbareport.py create mode 100644 modelseedpy/data/FBAReportTemplate.html diff --git a/modelseedpy/core/msfbareport.py b/modelseedpy/core/msfbareport.py new file mode 100644 index 00000000..df5c34bb --- /dev/null +++ b/modelseedpy/core/msfbareport.py @@ -0,0 +1,636 @@ +# -*- coding: utf-8 -*- +import pandas as pd +import logging +import os +import re +import jinja2 +from os.path import dirname +from pandas.io.formats.style import Styler +from modelseedpy.core.msmodelutl import MSModelUtil + +module_path = dirname(os.path.abspath(__file__)) + +logger = logging.getLogger(__name__) +logger.setLevel( + logging.INFO +) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO + + +class MSModelReport: + def __init__(self, model_or_mdlutl): + if isinstance(model_or_mdlutl, MSModelUtil): + self.model = model_or_mdlutl.model + self.modelutl = model_or_mdlutl + else: + self.model = model_or_mdlutl + self.modelutl = MSModelUtil.get(model_or_mdlutl) + + def generate_reports(self, report_path, multi_tab_report_path): + self.build_report(report_path) + self.build_multitab_report(multi_tab_report_path) + + # Helper function to build overview data + def build_overview_data(self): + # Get the number of compartments + number_compartments = len( + set([metabolite.compartment for metabolite in self.model.metabolites]) + ) + + # Extract gapfilling information + core_gapfilling_media = [] + gapfilling_media = [] + gf_sensitivity = self.modelutl.attributes.get("gf_sensitivity", None) + if gf_sensitivity: + for media in gf_sensitivity: + if ( + "bio1" in self.modelutl.attributes["gf_sensitivity"][media] + and "success" + in self.modelutl.attributes["gf_sensitivity"][media]["bio1"] + ): + gapfilling_media.append(media) + if ( + "rxn00062_c0" in self.modelutl.attributes["gf_sensitivity"][media] + and "success" + in self.modelutl.attributes["gf_sensitivity"][media]["rxn00062_c0"] + ): + core_gapfilling_media.append(media) + + # Count the number of gapfills + number_gapfills = len(gapfilling_media) + + # Convert the lists to strings + core_gapfilling_str = ( + "; ".join(core_gapfilling_media) + if core_gapfilling_media + else "No core gapfilling needed." + ) + gapfilling_media_str = ( + "; ".join(gapfilling_media) + if gapfilling_media + else "No genome-scale gapfilling." + ) + + overview = { + "Model ID": self.model.id, + "Full Gapfilling and ATP Analysis Report": "TBD", # You may replace 'TBD' with actual data when available + "Genome Scale Template": self.model.notes.get( + "kbase_template_refs", "Data Not Available" + ), + "Core Gapfilling Media": core_gapfilling_str, + "Gapfilling Media": gapfilling_media_str, + "Source Genome": self.model.notes.get( + "kbase_genome_ref", "Data Not Available" + ), + "Total Number of reactions": self.modelutl.nonexchange_reaction_count(), + "Number compounds": len(self.model.metabolites), + "Number compartments": number_compartments, + "Number biomass": len( + [ + rxn + for rxn in self.model.reactions + if rxn.annotation.get("sbo") == "SBO:0000629" + ] + ), + "Number gapfills": number_gapfills, + } + return overview + + # Helper function for extracting gapfilling data + def extract_gapfilling_data(self, gf_sensitivity): + if gf_sensitivity is None: + return [], {} + + gapfilling_dict = {} + gapfilling_summary = {} + + for media, media_data in gf_sensitivity.items(): + for target, target_data in media_data.items(): + gf_data = target_data.get("success", {}) + if isinstance(gf_data, dict): + for reaction_id, reaction_data in gf_data.items(): + for direction, metabolites in reaction_data.items(): + # If metabolites is None, set to empty string + if metabolites is None: + metabolites = "" + + # Extract both IDs and Names for Gapfilling Sensitivity + sensitivity_ids = [] + sensitivity_names = [] + if isinstance(metabolites, (list, tuple)): + for met_id in metabolites: + sensitivity_ids.append(met_id) + met_name = ( + self.model.metabolites.get_by_id(met_id).name + if met_id in self.model.metabolites + else met_id + ) + sensitivity_names.append(met_name) + else: + metabolites = str(metabolites) + entry = { + "reaction_id": reaction_id, + "reaction_name": self.model.reactions.get_by_id( + reaction_id + ).name + if reaction_id in self.model.reactions + else reaction_id, + "media": media, + "direction": direction, + "target": target, + "gapfilling_sensitivity_id": "; ".join(sensitivity_ids) + if sensitivity_ids + else metabolites, + "gapfilling_sensitivity_name": "; ".join( + sensitivity_names + ) + if sensitivity_names + else metabolites, + } + + # Update the summary dictionary + if reaction_id not in gapfilling_summary: + gapfilling_summary[reaction_id] = [] + gapfilling_summary[reaction_id].append( + f"{media}: {direction}" + ) + + # Check if reaction_id is already in dictionary + if reaction_id in gapfilling_dict: + # Update the media + existing_entry = gapfilling_dict[reaction_id] + existing_media = existing_entry["media"].split("; ") + if media not in existing_media: + existing_media.append(media) + existing_entry["media"] = "; ".join(existing_media) + else: + gapfilling_dict[reaction_id] = entry + + return list(gapfilling_dict.values()), gapfilling_summary + + # transform data to be used in tabular format to use in build_model_report + def transform_gapfilling_data(self, gapfilling_data): + transformed_data = [] + for entry in gapfilling_data: + row = [ + entry["reaction_id"], + entry["reaction_name"], + entry["media"], + entry["direction"], + entry["target"], + entry["gapfilling_sensitivity_id"], + entry["gapfilling_sensitivity_name"], + ] + transformed_data.append(row) + return transformed_data + + # Extract ATP analysis data + def extract_atp_analysis_data(self, atp_analysis, atp_expansion_filter): + entries = [] + if atp_analysis and "core_atp_gapfilling" in atp_analysis: + for media, data in atp_analysis["core_atp_gapfilling"].items(): + score = data.get("score", None) + new_reactions = [ + "{}: {}".format(k, v) for k, v in data.get("new", {}).items() + ] + reversed_reactions = [ + "{}: {}".format(k, v) for k, v in data.get("reversed", {}).items() + ] + atp_production = "Not integrated" + if ( + "selected_media" in atp_analysis + and media in atp_analysis["selected_media"] + ): + atp_production = atp_analysis["selected_media"][media] + + # Extracting the "Filtered Reactions" in the required format + filtered_reactions = [] + for k, v in atp_expansion_filter.get(media, {}).items(): + if isinstance(v, dict): + for sub_k, sub_v in v.items(): + if isinstance(sub_v, dict): + for reaction, direction_dict in sub_v.items(): + direction = list(direction_dict.keys())[0] + filtered_reactions.append( + f"{reaction}: {direction}" + ) + filtered_reactions_str = "; ".join(filtered_reactions) + + if score is not None: + entries.append( + { + "media": media, + "no_of_gapfilled_reactions": score, + "atp_production": atp_production, + "gapfilled_reactions": "; ".join(new_reactions), + "reversed_reaction_by_gapfilling": "; ".join( + reversed_reactions + ), + "filtered_reactions": filtered_reactions_str, + } + ) + # Sorting the entries based on the 'no_of_gapfilled_reactions' column + entries.sort(key=lambda x: x["no_of_gapfilled_reactions"]) + return entries + + # Extract ATP production data for the ATP Analysis tab + def extract_atp_production_data(self, atp_analysis): + atp_production_dict = {} + if atp_analysis: + selected_media = atp_analysis.get("selected_media", {}) + core_atp_gapfilling = atp_analysis.get("core_atp_gapfilling", {}) + + # First, process selected_media + for media, value in selected_media.items(): + atp_production_dict[media] = round(value, 2) + + # Next, process core_atp_gapfilling for media not in selected_media + for media, data in core_atp_gapfilling.items(): + if media not in atp_production_dict: + if data.get("failed"): + atp_production_dict[media] = "failed" + else: + # If the media was not processed in selected_media and it's not failed, set as 'Not Integrated' + atp_production_dict[media] = "Not Integrated" + + return atp_production_dict + + def build_multitab_report(self, output_path): + + # Build overview data + overview_data = self.build_overview_data() + + # Get gf_sensitivity attribute from the model + gf_sensitivity = self.modelutl.attributes.get("gf_sensitivity", None) + + # Extract gapfilling data + gapfilling_entries, gapfilling_reaction_summary = self.extract_gapfilling_data( + gf_sensitivity + ) + + # Check if ATP_analysis attribute is present in the model + atp_analysis = self.modelutl.attributes.get("ATP_analysis", None) + if atp_analysis: + atp_expansion_filter = self.modelutl.attributes.get( + "atp_expansion_filter", {} + ) + atp_analysis_entries = self.extract_atp_analysis_data( + atp_analysis, atp_expansion_filter + ) + else: + atp_analysis_entries = [] + + # Initialize context dictionary + context = { + "overview": overview_data, + "reactions": [], + "compounds": [], + "genes": [], + "biomass": [], + "gapfilling": gapfilling_entries, # Populated with gapfilling data + "atpanalysis": atp_analysis_entries, # Populated with ATP analysis data + } + + print("Module Path:", module_path + "/../data/") + + exchanges = {r.id for r in self.model.exchanges} + + # Identify biomass reactions using SBO annotation + biomass_reactions_ids = { + rxn.id + for rxn in self.model.reactions + if rxn.annotation.get("sbo") == "SBO:0000629" + } + + # Reactions Tab + for rxn in self.model.reactions: + if rxn.id not in exchanges and rxn.id not in biomass_reactions_ids: + equation = rxn.build_reaction_string(use_metabolite_names=True) + rxn_data = { + "id": rxn.id, + "name": rxn.name, + "equation": equation, + "genes": rxn.gene_reaction_rule, + "gapfilling": "; ".join( + gapfilling_reaction_summary.get(rxn.id, []) + ), # Empty list results in an empty string + } + context["reactions"].append(rxn_data) + + # Compounds Tab + for cpd in self.model.metabolites: + cpd_data = { + "id": cpd.id, + "name": cpd.name, + "formula": cpd.formula, + "charge": cpd.charge, + "compartment": cpd.compartment, + } + context["compounds"].append(cpd_data) + + # Genes Tab + for gene in self.model.genes: + gene_data = { + "gene": gene.id, + "reactions": "; ".join([rxn.id for rxn in gene.reactions]), + } + context["genes"].append(gene_data) + + # Biomass Tab + if biomass_reactions_ids: + for biomass_rxn_id in biomass_reactions_ids: + biomass_rxn = self.model.reactions.get_by_id(biomass_rxn_id) + for metabolite, coefficient in biomass_rxn.metabolites.items(): + compound_id = metabolite.id + compound_name = metabolite.name.split("_")[0] + compartment = compound_id.split("_")[-1] + + biomass_data = { + "biomass_reaction_id": biomass_rxn.id, + "biomass_compound_id": compound_id, + "name": compound_name, + "coefficient": coefficient, + "compartment": compartment, + } + context["biomass"].append(biomass_data) + else: + print("No biomass reactions found in the model.") + + # Gapfilling Tab + gf_sensitivity = self.modelutl.attributes.get("gf_sensitivity", None) + gapfilling_data = self.extract_gapfilling_data(gf_sensitivity) + context["gapfilling"] = gapfilling_entries + + # Extract ATP Production Data + atp_production_data = self.extract_atp_production_data(atp_analysis) + + # Populate the 'atpanalysis' context with ATP production data + for entry in context["atpanalysis"]: + media = entry["media"] + entry["atp_production"] = atp_production_data.get(media, None) + + # Diagnostics + unique_biomass_rxns = biomass_reactions_ids + print(f"Unique biomass reactions identified: {len(unique_biomass_rxns)}") + print(f"Biomass Reaction IDs: {', '.join(unique_biomass_rxns)}") + + print("\nFirst 2 reactions:") + for rxn in context["reactions"][:2]: + print(rxn) + + print("\nFirst 2 compounds:") + for cpd in context["compounds"][:2]: + print(cpd) + + print("\nFirst 2 genes:") + for gene in context["genes"][:2]: + print(gene) + + print("\nFirst 2 biomass compounds:") + for bm in context["biomass"][:2]: + print(bm) + + print("\nFirst 2 gapfilling entries:") + for gf in context["gapfilling"][:2]: + print(gf) + + print("\nFirst 2 ATP Analysis entries:") + for entry in context["atpanalysis"][:2]: + print(entry) + + # Render with template + env = jinja2.Environment( + loader=jinja2.FileSystemLoader(module_path + "/../data/"), + autoescape=jinja2.select_autoescape(["html", "xml"]), + ) + html = env.get_template("ModelReportTemplate.html").render(context) + directory = dirname(output_path) + os.makedirs(directory, exist_ok=True) + with open(output_path, "w") as f: + f.write(html) + + def build_report(self, output_path): + """Builds model HTML report for the Model Summary table + Parameters + ---------- + model : cobra.Model + Model to use to build the report + """ + + # 1. Utilize the build_overview_data method + model_summary_data = self.build_overview_data() + # Remove the unwanted entry + model_summary_data.pop("Full Gapfilling and ATP Analysis Report", None) + # 2. Transform the dictionary into a list of tuples + model_summary_list = [(key, value) for key, value in model_summary_data.items()] + # 3. Convert to DataFrame + model_summary_df = pd.DataFrame(model_summary_list, columns=["", ""]) + + # Style the DataFrame (as was done previously) + model_summary_df_styled = model_summary_df.style.hide( + axis="index" + ).set_table_styles( + [ + { + "selector": "th", + "props": [ + ("border", "none"), + ("background-color", "white"), + ("font-family", "Oxygen"), + ("font-size", "14px"), + ("line-height", "20px"), + ], + }, + { + "selector": "td", + "props": [ + ("border", "none"), + ("font-family", "Oxygen"), + ("font-size", "14px"), + ("line-height", "20px"), + ], + }, + { + "selector": "tr:nth-child(even)", + "props": [("background-color", "white")], + }, + { + "selector": "tr:nth-child(odd)", + "props": [("background-color", "#f2f2f2")], + }, + ] + ) + + # Fetching the gapfilling sensitivity data + gf_sensitivity = self.modelutl.attributes.get("gf_sensitivity", None) + gapfilling_data = self.extract_gapfilling_data(gf_sensitivity) + gapfilling_list = self.transform_gapfilling_data(gapfilling_data[0]) + + # Convert the gapfilling_list to a DataFrame + gapfillings_analysis_df = pd.DataFrame( + gapfilling_list, + columns=[ + "Reaction ID", + "Reaction Name", + "Media", + "Direction", + "Target", + "Gapfilling Sensitivity ID", + "Gapfilling Sensitivity Name", + ], + ) + + # Apply style to Gapfillings Analysis DataFrame + gapfillings_analysis_df_styled = gapfillings_analysis_df.style.hide( + axis="index" + ).set_table_styles( + [ + { + "selector": "th", + "props": [ + ("border", "none"), + ("background-color", "white"), + ("font-family", "Oxygen"), + ("font-size", "14px"), + ("line-height", "20px"), + ], + }, + { + "selector": "td", + "props": [ + ("border", "none"), + ("font-family", "Oxygen"), + ("font-size", "14px"), + ("line-height", "20px"), + ], + }, + { + "selector": "tr:nth-child(even)", + "props": [("background-color", "white")], + }, + { + "selector": "tr:nth-child(odd)", + "props": [("background-color", "#f2f2f2")], + }, + ] + ) + + # Legend for Gapfillings Analysis + annotations_text_gapfillings = """ +
      +
    • Reaction ID: The identifier of the reaction.
    • +
    • Reaction Name: The name of the reaction.
    • +
    • Media: The media used by gap filling.
    • +
    • Direction: The direction of the reaction. Can be ">" for forward, "<" for reverse, or "=" for both directions.
    • +
    • Target: The reaction selected as the objective function target for the gapfilling optimization problem. Targets here can be the model’s biomass reaction, commonly named “bio1” for models created by this app. + Alternatively, “rxn00062” (ATP Production) reaction is shown for cases where gapfilling was applied to guarantee ATP production in a given media. + When reactions are gapfilled for ATP production, we recommend checking the full Core ATP Analysis in the table below.
    • +
    • Gapfilling Sensitivity ID and Name: Gapfilling is necessary when compounds in the biomass objective function can not be produced by the model. + For each reaction we list the biomass compound(s) that can not be synthesized by the model without gapfilling. + In cases where gap filling fails there are two possible scenarios: + 1) FBF (failed before filtering) : the gapfilling immediately failed, even before we filtered out the ATP breaking reactions. This means this objective CANNOT be satisfied with the entire current database. + 2) FAF (failed after filtering): the gapfilling succeeded before filtering, but failed after filtering out reactions that break ATP. This tells you definitively if the ATP filtering caused the gapfilling to fail
    • +
    + """ + + # Extract ATP analysis data + atp_analysis = self.modelutl.attributes.get("ATP_analysis", None) + atp_expansion_filter = self.modelutl.attributes.get("atp_expansion_filter", {}) + atp_analysis_entries = self.extract_atp_analysis_data( + atp_analysis, atp_expansion_filter + ) + + # Convert the atp_analysis_entries list to a DataFrame + atp_analysis_df = pd.DataFrame(atp_analysis_entries) + + # Apply style to ATP Analysis DataFrame + atp_analysis_df_styled = atp_analysis_df.style.hide( + axis="index" + ).set_table_styles( + [ + { + "selector": "th", + "props": [ + ("border", "none"), + ("background-color", "white"), + ("font-family", "Oxygen"), + ("font-size", "14px"), + ("line-height", "20px"), + ], + }, + { + "selector": "td", + "props": [ + ("border", "none"), + ("font-family", "Oxygen"), + ("font-size", "14px"), + ("line-height", "20px"), + ], + }, + { + "selector": "tr:nth-child(even)", + "props": [("background-color", "white")], + }, + { + "selector": "tr:nth-child(odd)", + "props": [("background-color", "#f2f2f2")], + }, + ] + ) + + # Legend for ATP Analysis + annotations_text_atp_analysis = """ +
      +
    • No. of gapfilled reactions: The number of reactions filled by the gapfilling process.
    • +
    • Media: The media in which the reaction takes place.
    • +
    • ATP Production: ATP production by the core metabolism model.
    • +
    • Gapfilled Reactions: Reactions added during the gapfilling process.
    • +
    • Reversed Reaction by Gapfilling: Reactions that have been reversed during the gapfilling process.
    • +
    • Filtered Reactions: Reactions that have been filtered out during the analysis. When a reaction addition would lead to a large increase in ATP production or an infinite energy loop, we filter that reaction out of the gapfilling database and prevent it from being added to the model.
    • +
    + """ + + # ATP analysis explanation text + explanation_text_atp_analysis = """ +

    During model reconstruction, we analyze the genome’s core metabolism draft model (model without gapfilling) to assess energy biosynthesis capabilities. + The goal of this analysis is to ensure the core metabolism model is able to produce ATP before we expand the model to the genome-scale. + This step is designed to prevent gapfilling from introducing reactions that create energy-generating loops. + The tests are conducted on a large collection of minimal conditions, with the goal of simulating the model’s capability to produce energy with different electron donor, electron acceptor, and carbon source combinations.

    +

    When the draft model of the core metabolism is capable of producing ATP in at least one of the test media, no gapfilling reactions part of this analysis will be added to the model. While we still report the gapfilling requirements for the test media formulations that fail to produce ATP with that draft core model, we only integrate these solutions in the model when no test media succeeds in producing ATP. + In this case, the integrated gap-filling solution(s) will be displayed in the “Gapfilling Analysis” table above, with the “Target” “rxn00062” (ATP Production) objective function.

    +

    The goal is to display the test results for all media to provide clues for the metabolic capabilities of the genome(s). When many reactions are required for growth on the SO4 testing media conditions, this could be a good indicator that the organism is not capable of performing sulfate reduction. + On the other hand, when only one gapfill reaction is required for ATP production in a given media, multiple scenarios can be considered. + 1) Organism(s) can’t grow on test condition, and we correctly did not add the reaction to the model. 2) Possible issue with the source genome annotation missing a specific gene function 3) Possible issue with the model reconstruction database. We hope this data helps make more informed decisions on reactions that may need to be manually curated in the model. + In cases where is known from the literature or unpublished experimental results that an organism is capable of producing ATP in a given media condition that requires gapfilling in this analysis, you can use the parameter “Force ATP media” in the reconstruction app to ensure those reactions are integrated into the model. + .

    + """ + + # Save the data to HTML with the styled DataFrames and the legends + directory = os.path.dirname(output_path) + os.makedirs(directory, exist_ok=True) + with open(output_path, "w", encoding="utf-8") as f: + f.write('') + f.write("

    Model Summary

    ") + f.write(model_summary_df_styled.render(escape=False)) + f.write("

    ") + f.write("

    Gapfillings Analysis

    ") + + # Check for Gapfillings Analysis data + if not gapfillings_analysis_df.empty: + f.write(gapfillings_analysis_df_styled.render(escape=False)) + f.write(f"

    Legend:

    {annotations_text_gapfillings}") + else: + f.write( + "

    Warning: No Gapfillings Analysis data available for this model.

    " + ) + + f.write("

    Core ATP Analysis

    ") + + # Check for ATP Analysis data + if not atp_analysis_df.empty: + f.write(atp_analysis_df_styled.render(escape=False)) + f.write(f"

    Legend:

    {annotations_text_atp_analysis}") + f.write(explanation_text_atp_analysis) + else: + f.write( + "

    Warning: No Core ATP Analysis data available for this model.

    " + ) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 2071c136..a92e0960 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -655,6 +655,7 @@ def integrate_gapfill_solution( logger.debug(f"Assigning gene to reaction: {item[0]} {bestgene}") rxn.gene_reaction_rule = bestgene rxn.notes["new_genes"] = bestgene + print("Assigning gene to reaction: "+item[0]+" "+bestgene) #Setting bounds according to the direction the reaction was gapfilled in if item[1] == ">": rxn.upper_bound = 100 diff --git a/modelseedpy/data/FBAReportTemplate.html b/modelseedpy/data/FBAReportTemplate.html new file mode 100644 index 00000000..2ccad425 --- /dev/null +++ b/modelseedpy/data/FBAReportTemplate.html @@ -0,0 +1,213 @@ + + + + + Community FBA + + + + + + +
    + + + + + From 6348c58e6767e980cca9074379d70c29a01879c7 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Tue, 9 Apr 2024 17:48:04 -0500 Subject: [PATCH 240/298] fixes --- modelseedpy/community/mscommunity.py | 1 + modelseedpy/core/msbuilder.py | 1 + modelseedpy/core/msmodel.py | 1 - setup.py | 1 - tests/{ => core}/test_advanced.py | 0 tests/{ => core}/test_basic.py | 0 tests/test_data/mock_data.py | 5 ++--- tox.ini | 3 +-- 8 files changed, 5 insertions(+), 7 deletions(-) rename tests/{ => core}/test_advanced.py (100%) rename tests/{ => core}/test_basic.py (100%) diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index c2b5ab6f..ccd4acd8 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -125,6 +125,7 @@ def compute_max_atp(self): class MSCommunity: + def __init__( self, model=None, # the model that will be defined diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index c180cc6f..361ac778 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -1059,6 +1059,7 @@ def build_full_template_model(template, model_id=None, index="0"): :param index: index for the metabolites :return: """ + from modelseedpy.core.msmodel import MSModel model = MSModel(model_id if model_id else template.id, template=template) all_reactions = [] for rxn in template.reactions: diff --git a/modelseedpy/core/msmodel.py b/modelseedpy/core/msmodel.py index 36bfdc7c..d34fc9e6 100644 --- a/modelseedpy/core/msmodel.py +++ b/modelseedpy/core/msmodel.py @@ -113,7 +113,6 @@ def get_set_set(expr_str): # !!! this currently returns dictionaries, not sets? return {frozenset({str(x) for x in dnf.inputs})} else: return {frozenset({str(x) for x in o.inputs}) for o in dnf.xs} - return {} class MSModel(Model): diff --git a/setup.py b/setup.py index f2fe0b3b..aeed38f5 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,6 @@ "Topic :: Scientific/Engineering :: Bio-Informatics", "Intended Audience :: Science/Research", "Operating System :: OS Independent", - "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", diff --git a/tests/test_advanced.py b/tests/core/test_advanced.py similarity index 100% rename from tests/test_advanced.py rename to tests/core/test_advanced.py diff --git a/tests/test_basic.py b/tests/core/test_basic.py similarity index 100% rename from tests/test_basic.py rename to tests/core/test_basic.py diff --git a/tests/test_data/mock_data.py b/tests/test_data/mock_data.py index 4c86b371..478aad0e 100644 --- a/tests/test_data/mock_data.py +++ b/tests/test_data/mock_data.py @@ -271,10 +271,9 @@ def remap(model, bigg_to_seed_cpd, bigg_to_seed_rxn, index="0"): def mock_model_ecoli_core(seed=True): - from cobra.io import load_json_model - from os import path + from cobra.io import load_model - model = load_json_model(path.join(path.dirname(__file__), "e_coli_core.json")) + model = load_model("textbook") if not seed: return model bigg_to_seed_cpd = { diff --git a/tox.ini b/tox.ini index d5ff7ef9..ba2e836d 100644 --- a/tox.ini +++ b/tox.ini @@ -1,9 +1,8 @@ [tox] -envlist = py38,py39,py310 +envlist = py39,py310 [gh-actions] python = - 3.8: py38 3.9: py39 3.10: py310 From 6f15296baa538c01a0866916d2ba35a38c4c16e5 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Tue, 9 Apr 2024 17:49:18 -0500 Subject: [PATCH 241/298] black --- modelseedpy/community/mscommunity.py | 1 - modelseedpy/core/msbuilder.py | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/community/mscommunity.py b/modelseedpy/community/mscommunity.py index ccd4acd8..c2b5ab6f 100644 --- a/modelseedpy/community/mscommunity.py +++ b/modelseedpy/community/mscommunity.py @@ -125,7 +125,6 @@ def compute_max_atp(self): class MSCommunity: - def __init__( self, model=None, # the model that will be defined diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index 361ac778..c49e2e5e 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -1060,6 +1060,7 @@ def build_full_template_model(template, model_id=None, index="0"): :return: """ from modelseedpy.core.msmodel import MSModel + model = MSModel(model_id if model_id else template.id, template=template) all_reactions = [] for rxn in template.reactions: From 184faf563c1f3f3e9181754fac38ec9e4be0afdc Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Tue, 9 Apr 2024 18:01:58 -0500 Subject: [PATCH 242/298] added py311 --- .github/workflows/pre-commit.yml | 2 +- .github/workflows/tox.yml | 2 +- .travis.yml | 4 ++-- setup.py | 2 +- tox.ini | 3 ++- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 6b54b4a0..ffde9f98 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - python-version: ['3.8', '3.9', '3.10'] + python-version: ['3.9', '3.10', '3.11'] steps: - uses: actions/checkout@v2 - uses: actions/setup-python@v3 diff --git a/.github/workflows/tox.yml b/.github/workflows/tox.yml index 9ce47285..c3d816d0 100644 --- a/.github/workflows/tox.yml +++ b/.github/workflows/tox.yml @@ -11,7 +11,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python-version: ['3.8', '3.9', '3.10'] + python-version: ['3.9', '3.10', '3.11'] steps: - uses: actions/checkout@v3 - name: Set up Python diff --git a/.travis.yml b/.travis.yml index 20911611..75b2eb81 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,8 @@ language: python python: - - 3.7 - - 3.8 - 3.9 + - 3.10 + - 3.11 before_install: - python --version - pip install -U pip diff --git a/setup.py b/setup.py index aeed38f5..da01e792 100644 --- a/setup.py +++ b/setup.py @@ -34,7 +34,7 @@ ], install_requires=[ "networkx >= 2.4", - "cobra >= 0.28.0", + "cobra >= 0.29.0", "scikit-learn == 1.2.0", # version lock for pickle ML models "scipy >= 1.5.4", "chemicals >= 1.0.13", diff --git a/tox.ini b/tox.ini index ba2e836d..0aa1e6aa 100644 --- a/tox.ini +++ b/tox.ini @@ -1,10 +1,11 @@ [tox] -envlist = py39,py310 +envlist = py39,py310,py311 [gh-actions] python = 3.9: py39 3.10: py310 + 3.11: py311 [testenv] setenv = ARCHIVEINTERFACE_CPCONFIG = {toxinidir}/server.conf From 48fde20d9196da21c301e39ba8b352897631be4c Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 27 Apr 2024 23:20:13 -0500 Subject: [PATCH 243/298] Temporarily removing dependency --- modelseedpy/core/msminimalmedia.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msminimalmedia.py b/modelseedpy/core/msminimalmedia.py index 7efcf414..8c2f6e2d 100644 --- a/modelseedpy/core/msminimalmedia.py +++ b/modelseedpy/core/msminimalmedia.py @@ -8,7 +8,7 @@ from cobra.medium import minimal_medium from optlang.symbolics import Zero from math import isclose, inf, factorial -from deepdiff import DeepDiff +#from deepdiff import DeepDiff from time import process_time from pprint import pprint import logging From f1339479e5e385c0a15119a32cb872961dbdab4f Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 20 May 2024 22:43:33 -0500 Subject: [PATCH 244/298] Fixes to support simulation of uptake and excretion phenotypes --- modelseedpy/core/msgrowthphenotypes.py | 196 ++++++++++++------------- modelseedpy/core/msmodelutl.py | 107 +++++++++++++- 2 files changed, 197 insertions(+), 106 deletions(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 735807a0..5e8b07f3 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -19,22 +19,24 @@ def __init__( self, id, media=None, - growth=None, + experimental_value=None, gene_ko=[], additional_compounds=[], parent=None, name=None, + type="growth" ): self.id = id self.name = name if name == None: self.name = self.id - self.growth = growth + self.experimental_value = experimental_value self.media = media self.gene_ko = gene_ko self.gapfilling = None self.additional_compounds = additional_compounds self.parent = parent + self.type = type def build_media(self, include_base_media=True): """Builds media object to use when simulating the phenotype @@ -57,12 +59,12 @@ def build_media(self, include_base_media=True): def simulate( self, model_or_mdlutl, - objective, - growth_multiplier=3, + multiplier=3, add_missing_exchanges=False, save_fluxes=False, pfba=False, - ignore_growth_data=False, + ignore_experimental_data=False, + baseline_objective=0.01 ): """Simulates a single phenotype Parameters @@ -71,40 +73,47 @@ def simulate( Model to use to run the simulations add_missing_exchanges : bool Boolean indicating if exchanges for compounds mentioned explicitly in phenotype media should be added to the model automatically - growth_multiplier : double + multiplier : double Indicates a multiplier to use for positive growth above the growth on baseline media save_fluxes : bool Indicates if the fluxes should be saved and returned with the results pfba : bool Runs pFBA to compute fluxes after initially solving for growth - ignore_growth_data : bool + ignore_experimental_data : bool Indicates if existing growth data in the phenotype should be ignored when computing the class of the simulated phenotype """ modelutl = model_or_mdlutl if not isinstance(model_or_mdlutl, MSModelUtil): modelutl = MSModelUtil.get(model_or_mdlutl) - # Setting objective - if objective: - modelutl.model.objective = objective + #Setting the objective from the phenotype type - this will add missing exchanges for the primary compound for uptake and excretion phenotypes + missing_transporters = [] + objstring = modelutl.set_objective_from_phenotype(self,missing_transporters) - # Building full media and adding missing exchanges + #Creating output datastructure and returning if the objective cannot be created output = { - "growth": None, - "class": None, - "missing_transports": [], - "baseline_growth": None, + "objective_value": 0, + "class": "N", + "missing_transports": missing_transporters, + "baseline_objective": 0, + "objective":objstring, + "baseline_objective":baseline_objective } + if objstring == None: + return output + + # Building full media and adding missing exchanges full_media = self.build_media() - if add_missing_exchanges: - output["missing_transports"] = modelutl.add_missing_exchanges(full_media) + #Adding missing exchanges + if add_missing_exchanges: + output["missing_transports"].extend(modelutl.add_missing_exchanges(full_media)) + # Getting basline growth - output["baseline_growth"] = 0.01 - if self.parent: - output["baseline_growth"] = self.parent.baseline_growth(modelutl, objective) - if output["baseline_growth"] < 1e-5: - output["baseline_growth"] = 0.01 + if objstring != None and output["baseline_objective"] == None and self.parent: + output["baseline_objective"] = self.parent.baseline_objective(modelutl, objstring) + if output["baseline_objective"] < 1e-5: + output["baseline_objective"] = 0.01 # Building specific media and setting compound exception list if self.parent and self.parent.atom_limits and len(self.parent.atom_limits) > 0: @@ -135,38 +144,36 @@ def simulate( # Optimizing model solution = modelutl.model.optimize() - output["growth"] = solution.objective_value + output["objective_value"] = solution.objective_value if solution.objective_value > 0 and pfba: solution = cobra.flux_analysis.pfba(modelutl.model) if save_fluxes: output["fluxes"] = solution.fluxes # Determining phenotype class - if output["growth"] >= output["baseline_growth"] * growth_multiplier: - output["GROWING"] = True - if not self.growth or ignore_growth_data: - output["class"] = "GROWTH" - elif self.growth > 0: + if output["objective_value"] >= output["baseline_objective"] * multiplier: + output["postive"] = True + if not self.experimental_value or ignore_experimental_data: + output["class"] = "P" + elif self.experimental_value > 0: output["class"] = "CP" - elif self.growth == 0: + elif self.experimental_value == 0: output["class"] = "FP" else: - output["GROWING"] = False - if self.growth == None or ignore_growth_data: - output["class"] = "NOGROWTH" - elif self.growth > 0: + output["postive"] = False + if self.experimental_value == None or ignore_experimental_data: + output["class"] = "N" + elif self.experimental_value > 0: output["class"] = "FN" - elif self.growth == 0: + elif self.experimental_value == 0: output["class"] = "CN" - print(self.id,output["GROWING"],output["class"],output["growth"],output["baseline_growth"],growth_multiplier) return output def gapfill_model_for_phenotype( self, msgapfill, - objective, test_conditions, - growth_multiplier=10, + multiplier=10, add_missing_exchanges=False, ): """Gapfills the model to permit this single phenotype to be positive @@ -176,23 +183,23 @@ def gapfill_model_for_phenotype( Fully configured gapfilling object add_missing_exchanges : bool Boolean indicating if exchanges for compounds mentioned explicitly in phenotype media should be added to the model automatically - growth_multiplier : double + multiplier : double Indicates a multiplier to use for positive growth above the growth on baseline media objective : string Expression for objective to be activated by gapfilling """ # First simulate model without gapfilling to assess ungapfilled growth output = self.simulate( - msgapfill.mdlutl, objective, growth_multiplier, add_missing_exchanges + msgapfill.mdlutl,multiplier, add_missing_exchanges ) - if output["growth"] >= output["baseline_growth"] * growth_multiplier: + if output["objective_value"] >= output["baseline_objective"] * multiplier: # No gapfilling needed - original model grows without gapfilling return { "reversed": {}, "new": {}, "media": self.build_media(), - "target": objective, - "minobjective": output["baseline_growth"] * growth_multiplier, + "target": output["objective"], + "minobjective": output["baseline_objective"] * multiplier, "binary_check": False, } @@ -202,10 +209,10 @@ def gapfill_model_for_phenotype( gfobj = gfmodelutl.model.objective # Running simulate on gapfill model to add missing exchanges and set proper media and uptake limit constraints output = self.simulate( - modelutl, objective, growth_multiplier, add_missing_exchanges + gfmodelutl, multiplier=multiplier, add_missing_exchanges=add_missing_exchanges ) # If the gapfilling model fails to achieve the minimum growth, then no solution exists - if output["growth"] < output["baseline_growth"] * growth_multiplier: + if output["objective_value"] < output["baseline_objective"] * multiplier: logger.warning( "Gapfilling failed with the specified model, media, and target reaction." ) @@ -213,15 +220,15 @@ def gapfill_model_for_phenotype( # Running the gapfilling itself full_media = self.build_media() - with modelutl.model: + with gfmodelutl.model: # Applying gene knockouts for gene in self.gene_ko: - if gene in modelutl.model.genes: - geneobj = modelutl.model.genes.get_by_id(gene) + if gene in gfmodelutl.model.genes: + geneobj = gfmodelutl.model.genes.get_by_id(gene) geneobj.knock_out() gfresults = self.gapfilling.run_gapfilling( - media, None, minimum_obj=output["baseline_growth"] * growth_multiplier + full_media, None, minimum_obj=output["baseline_objective"] * multiplier ) if gfresults is None: logger.warning( @@ -240,7 +247,7 @@ def __init__( self.base_uptake = base_uptake self.base_excretion = base_excretion self.atom_limits = global_atom_limits - self.baseline_growth_data = {} + self.baseline_objective_data = {} self.cached_based_growth = {} @staticmethod @@ -250,13 +257,14 @@ def from_compound_hash( base_uptake=0, base_excretion=1000, global_atom_limits={}, + type="growth" ): growthpheno = MSGrowthPhenotypes( base_media, base_uptake, base_excretion, global_atom_limits ) new_phenos = [] for cpd in compounds: - newpheno = MSGrowthPhenotype(cpd, None, compounds[cpd], [], [cpd]) + newpheno = MSGrowthPhenotype(cpd,media=None,experimental_value=compounds[cpd],gene_ko=[],additional_compounds=[cpd],type=type) new_phenos.append(newpheno) growthpheno.add_phenotypes(new_phenos) return growthpheno @@ -283,7 +291,7 @@ def from_kbase_object( for added_cpd in pheno["additionalcompound_refs"]: added_compounds.append(added_cpd.split("/").pop()) newpheno = MSGrowthPhenotype( - media.info.id, media, pheno["normalizedGrowth"], geneko, added_compounds + media.info.id, media, pheno["NormalizedObjective"], geneko, added_compounds ) new_phenos.append(newpheno) growthpheno.add_phenotypes(new_phenos) @@ -380,7 +388,7 @@ def add_phenotypes(self, new_phenotypes): additions = DictList(keep_phenos) self.phenotypes += additions - def baseline_growth(self, model_or_mdlutl, objective): + def baseline_objective(self, model_or_mdlutl, objective): """Simulates all the specified phenotype conditions and saves results Parameters ---------- @@ -413,48 +421,41 @@ def baseline_growth(self, model_or_mdlutl, objective): def simulate_phenotypes( self, model_or_mdlutl, - objective, - growth_multiplier=3, + multiplier=3, add_missing_exchanges=False, save_fluxes=False, gapfill_negatives=False, msgapfill=None, test_conditions=None, - ignore_growth_data=False + ignore_experimental_data=False ): """Simulates all the specified phenotype conditions and saves results Parameters ---------- model_or_mdlutl : Model | MSModelUtl Model to use to run the simulations - objective : string - Expression for objective to maximize in simulations - growth_multiplier : double + multiplier : double Indicates a multiplier to use for positive growth above the growth on baseline media add_missing_exchanges : bool Boolean indicating if exchanges for compounds mentioned explicitly in phenotype media should be added to the model automatically save_fluxes : bool Indicates if the fluxes should be saved and returned with the results - ignore_growth_data : bool + ignore_experimental_data : bool Indicates if existing growth data in the phenotype set should be ignored when computing the class of a simulated phenotype """ # Discerning input is model or mdlutl and setting internal links modelutl = model_or_mdlutl if not isinstance(model_or_mdlutl, MSModelUtil): modelutl = MSModelUtil.get(model_or_mdlutl) - # Setting objective - modelutl.objective = objective - # Getting basline growth - baseline_growth = self.baseline_growth(modelutl, objective) # Establishing output of the simulation method summary = { - "Label": ["Accuracy", "CP", "CN", "FP", "FN", "Growth", "No growth"], + "Label": ["Accuracy", "CP", "CN", "FP", "FN", "P", "N"], "Count": [0, 0, 0, 0, 0, 0, 0], } data = { "Phenotype": [], - "Observed growth": [], - "Simulated growth": [], + "Observed objective": [], + "Simulated objective": [], "Class": [], "Transports missing": [], "Gapfilled reactions": [], @@ -463,19 +464,20 @@ def simulate_phenotypes( # Running simulations gapfilling_solutions = {} totalcount = 0 + datahash = {} for pheno in self.phenotypes: result = pheno.simulate( modelutl, - objective, - growth_multiplier, + multiplier, add_missing_exchanges, save_fluxes, - ignore_growth_data=ignore_growth_data, + ignore_experimental_data=ignore_experimental_data, ) + datahash[pheno.id] = result data["Class"].append(result["class"]) data["Phenotype"].append(pheno.id) - data["Observed growth"].append(pheno.growth) - data["Simulated growth"].append(result["growth"]) + data["Observed objective"].append(pheno.experimental_value) + data["Simulated objective"].append(result["objective_value"]) data["Transports missing"].append(";".join(result["missing_transports"])) if result["class"] == "CP": summary["Count"][1] += 1 @@ -491,17 +493,16 @@ def simulate_phenotypes( elif result["class"] == "FN": summary["Count"][4] += 1 totalcount += 1 - elif result["class"] == "GROWTH": + elif result["class"] == "P": summary["Count"][5] += 1 - elif result["class"] == "NOGROWTH": + elif result["class"] == "N": summary["Count"][6] += 1 # Gapfilling negative growth conditions - if gapfill_negatives and output["class"] in ["NOGROWTH", "FN", "CN"]: + if gapfill_negatives and result["class"] in ["N", "FN", "CN"]: gapfilling_solutions[pheno] = pheno.gapfill_model_for_phenotype( msgapfill, - objective, test_conditions, - growth_multiplier, + multiplier, add_missing_exchanges, ) if gapfilling_solutions[pheno] != None: @@ -526,27 +527,26 @@ def simulate_phenotypes( summary["Count"][0] = summary["Count"][0] / totalcount sdf = pd.DataFrame(summary) df = pd.DataFrame(data) - self.adjust_phenotype_calls(df,baseline_growth) - return {"details": df, "summary": sdf} - - def adjust_phenotype_calls(self,data,basline_growth): - lowest = data["Simulated growth"].min() - if basline_growth < lowest: - lowest = basline_growth - highest = data["Simulated growth"].max() + self.adjust_phenotype_calls(df) + return {"details": df, "summary": sdf,"data":datahash} + + def adjust_phenotype_calls(self,data,baseline_objective=0.01): + lowest = data["Simulated objective"].min() + if baseline_objective < lowest: + lowest = baseline_objective + highest = data["Simulated objective"].max() threshold = (highest-lowest)/2+lowest if highest/(lowest+0.000001) < 1.5: threshold = highest - print("Adjusting:",basline_growth,lowest,highest,threshold) grow = 0 nogrow = 0 change = 0 for (i,item) in data.iterrows(): oldclass = item["Class"] - if item["Simulated growth"] >= threshold: + if item["Simulated objective"] >= threshold: grow += 1 - if item["Class"] == "NOGROWTH": - data.loc[i, 'Class'] = "GROWTH" + if item["Class"] == "N": + data.loc[i, 'Class'] = "P" change += 1 elif item["Class"] == "FN": data.loc[i, 'Class'] = "CP" @@ -556,23 +556,20 @@ def adjust_phenotype_calls(self,data,basline_growth): change += 1 else: nogrow += 1 - if item["Class"] == "GROWTH": - data.loc[i, 'Class'] = "NOGROWTH" + if item["Class"] == "P": + data.loc[i, 'Class'] = "N" change += 1 elif item["Class"] == "CP": data.loc[i, 'Class'] = "FN" change += 1 elif item["Class"] == "FP": data.loc[i, 'Class'] = "CN" - change += 1 - if oldclass != item["Class"]: - print("Adjusting",item["Phenotype"],"from",oldclass,"to",item["Class"]) + change += 1 def fit_model_to_phenotypes( self, msgapfill, - objective, - grow_multiplier, + multiplier, correct_false_positives=False, minimize_new_false_positives=True, atp_safe=True, @@ -600,15 +597,14 @@ def fit_model_to_phenotypes( with model: result = pheno.simulate( modelutl, - objective, - growth_multiplier, + multiplier, add_missing_exchanges, save_fluxes, ) # Gapfilling negative growth conditions - if gapfill_negatives and output["class"] in ["NOGROWTH", "FN", "CN"]: + if gapfill_negatives and result["class"] in ["N", "FN", "CN"]: negative_growth.append(pheno.build_media()) - elif gapfill_negatives and output["class"] in ["GROWTH", "FP", "CP"]: + elif gapfill_negatives and result["class"] in ["P", "FP", "CP"]: positive_growth.append(pheno.build_media()) # Create super media for all @@ -637,7 +633,7 @@ def gapfill_all_phenotypes( self, model_or_mdlutl, msgapfill=None, # Needed if the gapfilling object in model utl is not initialized - growth_threshold=None, + threshold=None, add_missing_exchanges=False, ): mdlutl = MSModelUtil.get(model_or_mdlutl) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index b93671ae..ee11d108 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -268,7 +268,7 @@ def find_met(self, name, compartment=None): array = met.id.split("_") if array[1] == compartment or met.compartment == compartment: return [met] - return None + return [] sname = MSModelUtil.search_name(name) if sname in self.search_metabolite_hash: if not compartment: @@ -277,7 +277,7 @@ def find_met(self, name, compartment=None): array = met.id.split("_") if array[1] == compartment or met.compartment == compartment: return [met] - return None + return [] logger.info(name + " not found in model!") return [] @@ -327,6 +327,104 @@ def nonexchange_reaction_count(self): count += 1 return count + def reaction_scores(self): + return {} + + ################################################################################# + # Functions related to phenotype simultion + # Design philosophy: the phenotype types should be aware of phenotype data and + # agnostic to the model, so this code handles how to simulate a phenotype in a + # model. This code sets the model objective based on the phenotype type and adds + # the appropriate exchange reactions. + ################################################################################# + def set_objective_from_phenotype(self,phenotype,missing_transporters=[],create_missing_compounds=False): + if phenotype.type == "growth": + if "bio1" in self.model.reactions: + self.model.objective = "bio1" + else: + logger.critical(phenotype.id+": growth phenotype but could not find biomass reaction!") + return None + if phenotype.type == "uptake" or phenotype.type == "excretion": + uptake = excretion = 0 + if phenotype.type == "uptake": + uptake = 1000 + else: + excretion = 1000 + if len(phenotype.additional_compounds) == 0: + logger.critical(phenotype.id+": can't set uptake or excretion objective without additional compounds specified!") + return None + first = True + for cpd in phenotype.additional_compounds: + exid = "EX_"+cpd+"_e0" + if exid not in self.model.reactions: + exid = "EX_"+cpd+"_c0" + if exid not in self.model.reactions: + exmets = self.find_met(cpd,"c0") + if len(exmets) == 0: + if create_missing_compounds: + exmets = [Metabolite(cpd+"_c0",name=cpd+"_c0",compartment="c0")] + self.model.add_metabolites(exmets) + else: + logger.warning(phenotype.id+": could not find metabolite for "+cpd) + return None + self.add_exchanges_for_metabolites(exmets,uptake=uptake,excretion=excretion) + missing_transporters.append(cpd) + if first: + self.model.objective = exid + first = False + else: + self.model.objective += exid + if phenotype.type == "excretion": + for reaction in self.model.reactions: + if reaction.objective_coefficient != 0: + reaction.objective_coefficient = -1*reaction.objective_coefficient + return str(self.model.objective) + + ################################################################################# + # Functions related to exchanges and transport reactions + ################################################################################# + def add_transport_and_exchange_for_metabolite(self, met,direction="=",prefix="trans",override=False): + #Breaking down the ID to see the compartment and index - ID must take form _ + output = MSModelUtil.parse_id(met) + if not output: + logger.critical("Transport metabolite ID " + met.id + " not in proper format") + return None + (baseid,compartment,index) = output + #Checking if exchange already exists + if baseid+"_e0" in self.model.metabolites and not override: + logger.critical("Transport reaction appears to already exist for " + met.id+". Override if transport still desired.") + return None + elif baseid+"_e0" not in self.model.metabolites: + exmet = Metabolite(baseid+"_e0",name=met.name+"_e0",compartment="e0",charge=met.charge,formula=met.formula) + self.model.add_metabolites([exmet]) + else: + exmet = self.model.metabolites.get_by_id(baseid+"_e0") + #Checking charge so transport will be charge balanced + hmet = None + exhmet = None + if met.charge != 0: + #Finding H+ compound in model: + output = self.find_met("cpd00067",compartment+str(index)) + if len(output) > 0: + hmet = output[0] + output = self.find_met("cpd00067","e0") + if len(output) > 0: + exhmet = output[0] + if not hmet or not exhmet: + logger.warning("No H+ metabolite found in model") + stoich = {met:-1,exmet:1} + if met.charge != 0 and hmet and exhmet: + stoich[hmet] = met.charge + stoich[exhmet] = -1*met.charge + transport = Reaction(prefix + met.id + "_"+compartment+str(index)) + transport.name = "Charge nuetral transport for " + met.name + transport.add_metabolites(stoich) + self.model.add_reactions([exchange]) + transport.annotation["sbo"] = "SBO:0000185" + self.model.add_reactions([transport]) + self.add_exchanges_for_metabolites([exmet],0,1000) + return transport + def exchange_hash(self): exchange_reactions = {} exlist = self.exchange_list() @@ -337,7 +435,7 @@ def exchange_hash(self): else: logger.warn("Nonstandard exchange reaction ignored:" + reaction.id) return exchange_reactions - + def add_missing_exchanges(self, media): output = [] exchange_hash = self.exchange_hash() @@ -383,9 +481,6 @@ def add_exchanges_for_metabolites( self.model.add_reactions(drains) return drains - def reaction_scores(self): - return {} - ################################################################################# # Functions related to editing the model ################################################################################# From 742c5143d5ffbe5f208e06fcef98022de1e55ec4 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 22 May 2024 01:00:26 -0500 Subject: [PATCH 245/298] Improving gapfilling and modelutl --- modelseedpy/core/msgapfill.py | 27 +++++++++++++++----- modelseedpy/core/msmodelutl.py | 10 ++++++-- modelseedpy/fbapkg/gapfillingpkg.py | 39 ++++++++++++++++++++++++++--- 3 files changed, 65 insertions(+), 11 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index a92e0960..8335878a 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -150,7 +150,7 @@ def test_gapfill_database(self, media, target=None, before_filtering=True): ) return False - def prefilter(self,test_conditions=None,growth_conditions=[]): + def prefilter(self,test_conditions=None,growth_conditions=[],use_prior_filtering=True): """Prefilters the database by removing any reactions that break specified ATP tests Parameters ---------- @@ -161,9 +161,13 @@ def prefilter(self,test_conditions=None,growth_conditions=[]): test_conditions = self.test_conditions if self.test_conditions: logger.debug(f"PREFILTERING WITH {str(len(growth_conditions))} GROWTH CONDITIONS") + base_filter = None + if use_prior_filtering: + base_filter = self.mdlutl.get_attributes("gf_filter", {}) self.gfpkgmgr.getpkg("GapfillingPkg").filter_database_based_on_tests( self.test_conditions, - growth_conditions + growth_conditions=growth_conditions, + base_filter=base_filter ) gf_filter = self.gfpkgmgr.getpkg("GapfillingPkg").modelutl.get_attributes( "gf_filter", {} @@ -395,6 +399,7 @@ def run_multi_gapfill( self, media_list, target=None, + target_hash={}, minimum_objectives={}, default_minimum_objective=None, binary_check=False, @@ -436,7 +441,10 @@ def run_multi_gapfill( default_minimum_objective = self.default_minimum_objective #Checking that each media to ensure gapfilling works before filtering for media in media_list: - if not self.test_gapfill_database(media,target,before_filtering=True): + currtarget = target + if media in target_hash: + currtarget = target_hash[media] + if not self.test_gapfill_database(media,currtarget,before_filtering=True): #Remove media that fail initial test print("Removing ungapfillable media "+media.id) media_list.remove(media) @@ -450,11 +458,14 @@ def run_multi_gapfill( minimum_obj = default_minimum_objective if media in minimum_objectives: minimum_obj = minimum_objectives[media] + currtarget = target + if media in target_hash: + currtarget = target_hash[media] growth_conditions.append({ "media": media, "is_max_threshold": False, "threshold": minimum_obj, - "objective": target, + "objective": currtarget, }) self.prefilter(growth_conditions=growth_conditions) #Iterating over all media and running gapfilling @@ -463,7 +474,11 @@ def run_multi_gapfill( targets = [] thresholds = [] for item in media_list: - targets.append(target) + currtarget=target + if media in target_hash: + targets.append(target_hash[media]) + else: + targets.append(target) #Determining the minimum objective for the current media minimum_obj = default_minimum_objective if item in minimum_objectives: @@ -473,7 +488,7 @@ def run_multi_gapfill( if gapfilling_mode == "Independent" or gapfilling_mode == "Sequential": solution = self.run_gapfilling( item, - target, + currtarget, minimum_obj, binary_check, False, diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index ee11d108..2cf26995 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -384,6 +384,13 @@ def set_objective_from_phenotype(self,phenotype,missing_transporters=[],create_m # Functions related to exchanges and transport reactions ################################################################################# def add_transport_and_exchange_for_metabolite(self, met,direction="=",prefix="trans",override=False): + #If met is a string, attempt to find the associated metabolite + if isinstance(met,str): + mets = self.find_met(met) + if len(mets) == 0: + logger.critical("Metabolite "+met+" not found in model") + return None + met = mets[0] #Breaking down the ID to see the compartment and index - ID must take form _ output = MSModelUtil.parse_id(met) if not output: @@ -417,9 +424,8 @@ def add_transport_and_exchange_for_metabolite(self, met,direction="=",prefix="tr stoich[hmet] = met.charge stoich[exhmet] = -1*met.charge transport = Reaction(prefix + met.id + "_"+compartment+str(index)) - transport.name = "Charge nuetral transport for " + met.name + transport.name = "Charge-nuetral transport for " + met.name transport.add_metabolites(stoich) - self.model.add_reactions([exchange]) transport.annotation["sbo"] = "SBO:0000185" self.model.add_reactions([transport]) self.add_exchanges_for_metabolites([exmet],0,1000) diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index ed7e49df..c7a0b595 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -745,13 +745,28 @@ def reset_objective_minimum(self, min_objective,reset_params=True): if min_objective < 0: self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].ub = min_objective - def filter_database_based_on_tests(self, test_conditions,growth_conditions=[]): + def filter_database_based_on_tests(self,test_conditions,growth_conditions=[],base_filter=None,base_target="rxn00062_c0"): #Saving the current media current_media = self.current_media() #Clearing element uptake constraints self.pkgmgr.getpkg("ElementUptakePkg").clear() # Setting the minimal growth constraint to zero - self.reset_objective_minimum(0,False) + self.reset_objective_minimum(0,False) + # Applying base filter + base_filter_list = [] + if base_filter != None: + for media_id in base_filter: + if base_target in base_filter[media_id]: + for threshold in base_filter[media_id][base_target]: + for rxn_id in base_filter[media_id][base_target][threshold]: + for direction in base_filter[media_id][base_target][threshold][rxn_id]: + if rxn_id in self.model.reactions: + rxnobj = self.model.reactions.get_by_id(rxn_id) + base_filter_list.append([rxnobj,direction]) + if direction == ">": + rxnobj.upper_bound = 0 + else: + rxnobj.lower_bound = 0 # Filtering the database of any reactions that violate the specified tests filetered_list = [] with self.model: @@ -762,10 +777,28 @@ def filter_database_based_on_tests(self, test_conditions,growth_conditions=[]): rxnlist.append([reaction, "<"]) if "forward" in self.gapfilling_penalties[reaction.id]: rxnlist.append([reaction, ">"]) - filtered_list = self.modelutl.reaction_expansion_test( rxnlist, test_conditions ) + #Adding base filter reactions to model + if base_filter != None: + gf_filter_att = self.modelutl.get_attributes("gf_filter", {}) + for media_id in base_filter: + if media_id not in gf_filter_att: + gf_filter_att[media_id] = {} + if base_target in base_filter[media_id]: + if base_target not in gf_filter_att[media_id]: + gf_filter_att[media_id][base_target] = {} + for threshold in base_filter[media_id][base_target]: + if threshold not in gf_filter_att[media_id][base_target]: + gf_filter_att[media_id][base_target][threshold] = {} + for rxn_id in base_filter[media_id][base_target][threshold]: + if rxn_id not in gf_filter_att[media_id][base_target][threshold]: + gf_filter_att[media_id][base_target][threshold][rxn_id] = {} + for direction in base_filter[media_id][base_target][threshold][rxn_id]: + if direction not in gf_filter_att[media_id][base_target][threshold][rxn_id]: + gf_filter_att[media_id][base_target][threshold][rxn_id][direction] = {} + gf_filter_att[media_id][base_target][threshold][rxn_id][direction][direction] = base_filter[media_id][base_target][threshold][rxn_id][direction] # Now constraining filtered reactions to zero for item in filtered_list: logger.debug("Filtering:" + item[0].id + item[1]) From cff2a9e32df0389edf52226169ba68ef27ba6dcc Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 3 Jun 2024 01:20:16 -0500 Subject: [PATCH 246/298] Checking in fixes to support phenotype simulations --- modelseedpy/core/msgapfill.py | 28 ++++++++---- modelseedpy/core/msgrowthphenotypes.py | 62 +++++++++++++++++++++++--- modelseedpy/core/msmodelutl.py | 30 ++++++++++++- modelseedpy/fbapkg/gapfillingpkg.py | 33 +++++++------- modelseedpy/fbapkg/kbasemediapkg.py | 8 +++- 5 files changed, 125 insertions(+), 36 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 8335878a..84f36d34 100644 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -123,6 +123,8 @@ def test_gapfill_database(self, media, target=None, before_filtering=True): self.gfpkgmgr.getpkg("KBaseMediaPkg").build_package(media) if self.gfpkgmgr.getpkg("GapfillingPkg").test_gapfill_database(): return True + if self.gfpkgmgr.getpkg("GapfillingPkg").test_solution.status == 'infeasible': + return False gf_sensitivity = {} if target != "rxn00062_c0": gf_sensitivity = self.mdlutl.get_attributes("gf_sensitivity", {}) @@ -150,7 +152,7 @@ def test_gapfill_database(self, media, target=None, before_filtering=True): ) return False - def prefilter(self,test_conditions=None,growth_conditions=[],use_prior_filtering=True): + def prefilter(self,test_conditions=None,growth_conditions=[],use_prior_filtering=True,base_filter_only=False): """Prefilters the database by removing any reactions that break specified ATP tests Parameters ---------- @@ -167,7 +169,8 @@ def prefilter(self,test_conditions=None,growth_conditions=[],use_prior_filtering self.gfpkgmgr.getpkg("GapfillingPkg").filter_database_based_on_tests( self.test_conditions, growth_conditions=growth_conditions, - base_filter=base_filter + base_filter=base_filter, + base_filter_only=base_filter_only ) gf_filter = self.gfpkgmgr.getpkg("GapfillingPkg").modelutl.get_attributes( "gf_filter", {} @@ -407,7 +410,8 @@ def run_multi_gapfill( check_for_growth=True, gapfilling_mode="Sequential", run_sensitivity_analysis=True, - integrate_solutions=True + integrate_solutions=True, + remove_unneeded_reactions=True ): """Run gapfilling across an array of media conditions ultimately using different integration policies: simultaneous gapfilling, independent gapfilling, cumulative gapfilling Parameters @@ -437,8 +441,9 @@ def run_multi_gapfill( self.model = cobra.io.json.from_json(cobra.io.json.to_json(self.model)) self.mdlutl = MSModelUtil.get(self.model) #Setting the default minimum objective - if not default_minimum_objective: + if default_minimum_objective == None: default_minimum_objective = self.default_minimum_objective + self.gfpkgmgr.getpkg("GapfillingPkg").parameters["minimum_obj"] = default_minimum_objective #Checking that each media to ensure gapfilling works before filtering for media in media_list: currtarget = target @@ -498,7 +503,7 @@ def run_multi_gapfill( solution_dictionary[item] = self.integrate_gapfill_solution( solution, cumulative_solution=cumulative_solution, - remove_unneeded_reactions=True, + remove_unneeded_reactions=remove_unneeded_reactions, check_for_growth=check_for_growth, gapfilling_mode=gapfilling_mode ) @@ -544,6 +549,8 @@ def run_multi_gapfill( self.gfpkgmgr.getpkg("GapfillingPkg").compute_gapfilling_penalties(reaction_scores=self.reaction_scores) self.gfpkgmgr.getpkg("GapfillingPkg").build_gapfilling_objective_function() #Running sensitivity analysis once on the cumulative solution for all media + with open("datacache/solutions.json", 'w') as f: + json.dump(solution_dictionary,f,indent=4,skipkeys=True) if run_sensitivity_analysis: logger.info( "Gapfilling sensitivity analysis running" @@ -618,7 +625,7 @@ def integrate_gapfill_solution( gapfilling_mode : Cumulative, Independent, Simultaneous Specify what the gapfilling mode is because this determines how integration is performed """ - logger.debug(f"Initial solution: {str(solution)}") + logger.info(f"Initial solution: {str(solution)}") original_objective = self.mdlutl.model.objective self.mdlutl.model.objective = solution["target"] self.mdlutl.model.objective.direction = "max" @@ -643,7 +650,7 @@ def integrate_gapfill_solution( #Clearing current bounds because we only want to add reaction in the direction it was gapfilled in rxn.upper_bound = 0 rxn.lower_bound = 0 - logger.debug(f"integrating rxn: {item[0]}") + logger.info(f"integrating rxn: {item[0]}") rxn = self.model.reactions.get_by_id(item[0]) #Setting genes if the reaction has no genes if len(rxn.genes) == 0: @@ -681,6 +688,7 @@ def integrate_gapfill_solution( new_cumulative_reactions.append([item[0], item[1],item[2]]) #Testing the full cumulative solution to see which reactions are needed for current media/target full_solution = cumulative_solution + new_cumulative_reactions + logger.info(f"Full solution: {str(full_solution)}") #Setting up structure to store the finalized solution for this media/target current_media_target_solution = {"growth":0,"media":solution["media"],"target":solution["target"],"minobjective":solution["minobjective"],"binary_check":solution["binary_check"] ,"new":{},"reversed":{}} #If gapfilling is independent, we only check the specific solution @@ -693,6 +701,7 @@ def integrate_gapfill_solution( cumulative_solution.append(item) #elif not remove_unneeded_reactions and not self.mdlutl.find_item_in_solution(cumulative_solution,item): # cumulative_solution.append(item) + logger.info(f"Cumulative media target solution: {str(current_media_target_solution)}") else: unneeded = self.mdlutl.test_solution(full_solution,[solution["target"]],[solution["media"]],[solution["minobjective"]],remove_unneeded_reactions,do_not_remove_list=cumulative_solution)#Returns reactions in input solution that are not needed for growth for item in cumulative_solution: @@ -704,12 +713,13 @@ def integrate_gapfill_solution( cumulative_solution.append(item) #elif not remove_unneeded_reactions: # cumulative_solution.append(item) - logger.debug(f"Unneeded: {str(unneeded)}") + logger.info(f"Unneeded: {str(unneeded)}") + logger.info(f"Cumulative: {str(cumulative_gapfilling)}") #Checking that the final integrated model grows if check_for_growth: self.mdlutl.pkgmgr.getpkg("KBaseMediaPkg").build_package(solution["media"]) current_media_target_solution["growth"] = self.mdlutl.model.slim_optimize() - logger.debug(f"Growth: {str(current_media_target_solution['growth'])} {solution['media'].id}") + logger.info(f"Growth: {str(current_media_target_solution['growth'])} {solution['media'].id}") # Adding the gapfilling solution data to the model, which is needed for saving the model in KBase self.mdlutl.add_gapfilling(solution) # Testing which gapfilled reactions are needed to produce each reactant in the objective function diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 5e8b07f3..a390de44 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -13,6 +13,7 @@ logging.INFO ) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO +zero_threshold = 0.0000001 class MSGrowthPhenotype: def __init__( @@ -62,9 +63,10 @@ def simulate( multiplier=3, add_missing_exchanges=False, save_fluxes=False, - pfba=False, + save_reaction_list=False, ignore_experimental_data=False, - baseline_objective=0.01 + baseline_objective=0.01, + flux_coefficients=None, ): """Simulates a single phenotype Parameters @@ -145,10 +147,52 @@ def simulate( # Optimizing model solution = modelutl.model.optimize() output["objective_value"] = solution.objective_value - if solution.objective_value > 0 and pfba: - solution = cobra.flux_analysis.pfba(modelutl.model) - if save_fluxes: - output["fluxes"] = solution.fluxes + if solution.objective_value > 0: + if flux_coefficients == None: + solution = cobra.flux_analysis.pfba(modelutl.model) + else: + #modelutl.printlp(lpfilename="lpfiles/gapfill.lp") + if '1_objc' in modelutl.model.constraints: + constraint = modelutl.model.constraints['1_objc'] + modelutl.model.remove_cons_vars([constraint]) + modelutl.pkgmgr.getpkg("ObjConstPkg").build_package( + 0.2*output["objective_value"], None + ) + coefobj = modelutl.model.problem.Objective(0, direction="min") + modelutl.model.objective = coefobj + obj_coef = {} + for rxn in flux_coefficients: + rxnid = rxn + direction = "=" + if rxn[0:1] == ">" or rxn[0:1] == "<": + direction = rxn[0:1] + rxnid = rxn[1:] + if rxnid in modelutl.model.reactions: + rxnobj = modelutl.model.reactions.get_by_id(rxnid) + if direction == ">" or direction == "=": + obj_coef[rxnobj.forward_variable] = flux_coefficients[rxn] + if direction == "<" or direction == "=": + obj_coef[rxnobj.reverse_variable] = flux_coefficients[rxn] + coefobj.set_linear_coefficients(obj_coef) + solution = modelutl.model.optimize() + modelutl.pkgmgr.getpkg("ObjConstPkg").clear() + if save_reaction_list: + output["reactions"] = [] + if save_fluxes: + output["fluxes"] = solution.fluxes + output["gapfill_count"] = 0 + output["reaction_count"] = 0 + for reaction in modelutl.model.reactions: + if reaction.id in solution.fluxes: + flux = solution.fluxes[reaction.id] + if abs(flux) > zero_threshold: + output["reaction_count"] += 1 + if reaction.id[0:3] != "bio" and reaction.id[0:3] != "EX_" and reaction.id[0:3] != "DM_" and len(reaction.genes) == 0: + output["gapfill_count"] += 1 + if save_reaction_list and flux > zero_threshold: + output["reactions"].append(">"+reaction.id) + elif save_reaction_list: + output["reactions"].append("<"+reaction.id) # Determining phenotype class if output["objective_value"] >= output["baseline_objective"] * multiplier: @@ -424,10 +468,12 @@ def simulate_phenotypes( multiplier=3, add_missing_exchanges=False, save_fluxes=False, + save_reaction_list=False, gapfill_negatives=False, msgapfill=None, test_conditions=None, - ignore_experimental_data=False + ignore_experimental_data=False, + flux_coefficients=None ): """Simulates all the specified phenotype conditions and saves results Parameters @@ -471,7 +517,9 @@ def simulate_phenotypes( multiplier, add_missing_exchanges, save_fluxes, + save_reaction_list=save_reaction_list, ignore_experimental_data=ignore_experimental_data, + flux_coefficients=flux_coefficients ) datahash[pheno.id] = result data["Class"].append(result["class"]) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 2cf26995..014cd616 100644 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -378,6 +378,7 @@ def set_objective_from_phenotype(self,phenotype,missing_transporters=[],create_m for reaction in self.model.reactions: if reaction.objective_coefficient != 0: reaction.objective_coefficient = -1*reaction.objective_coefficient + self.model.objective.direction = 'max' return str(self.model.objective) ################################################################################# @@ -427,6 +428,12 @@ def add_transport_and_exchange_for_metabolite(self, met,direction="=",prefix="tr transport.name = "Charge-nuetral transport for " + met.name transport.add_metabolites(stoich) transport.annotation["sbo"] = "SBO:0000185" + transport.upper_bound = 0 + transport.lower_bound = 0 + if direction == ">" or direction == "=": + transport.upper_bound = 1000 + if direction == "<" or direction == "=": + transport.lower_bound = -1000 self.model.add_reactions([transport]) self.add_exchanges_for_metabolites([exmet],0,1000) return transport @@ -786,7 +793,8 @@ def test_solution(self,solution,targets,medias,thresholds=[0.1],remove_unneeded_ solution = self.convert_solution_to_list(solution) #Processing solution in standardized format for item in solution: - rxn_id = item[0] + rxn_id = item[0] + other_original_bound = None rxnobj = self.model.reactions.get_by_id(rxn_id) #Testing all media and target and threshold combinations to see if the reaction is needed needed = False @@ -800,9 +808,15 @@ def test_solution(self,solution,targets,medias,thresholds=[0.1],remove_unneeded_ #This has to happen after media is applied in case the reaction is an exchange if item[1] == ">": original_bound = rxnobj.upper_bound + if rxnobj.lower_bound > 0: + other_original_bound = rxnobj.lower_bound + rxnobj.lower_bound = 0 rxnobj.upper_bound = 0 else: original_bound = rxnobj.lower_bound + if rxnobj.upper_bound < 0: + other_original_bound = rxnobj.upper_bound + rxnobj.upper_bound = 0 rxnobj.lower_bound = 0 #Computing the objective value objective = self.model.slim_optimize() @@ -818,7 +832,7 @@ def test_solution(self,solution,targets,medias,thresholds=[0.1],remove_unneeded_ ) #If the reaction isn't needed for any media and target combinations, add it to the unneeded list if not needed: - unneeded.append([rxn_id, item[1], item[2],original_bound]) + unneeded.append([rxn_id, item[1], item[2],original_bound,other_original_bound]) logger.info( rxn_id + item[1] @@ -830,16 +844,24 @@ def test_solution(self,solution,targets,medias,thresholds=[0.1],remove_unneeded_ #Restore the reaction if it is needed if item[1] == ">": rxnobj.upper_bound = original_bound + if other_original_bound != None: + rxnobj.lower_bound = other_original_bound else: rxnobj.lower_bound = original_bound + if other_original_bound != None: + rxnobj.upper_bound = other_original_bound if not remove_unneeded_reactions: #Restoring the bounds on the unneeded reactions for item in unneeded: rxnobj = self.model.reactions.get_by_id(item[0]) if item[1] == ">": rxnobj.upper_bound = item[3] + if item[4] != None: + rxnobj.lower_bound = item[4] else: rxnobj.lower_bound = item[3] + if item[4] != None: + rxnobj.upper_bound = item[4] else: #Do not restore bounds on unneeded reactions and remove reactions from model if their bounds are zero removed_rxns = [] @@ -848,8 +870,12 @@ def test_solution(self,solution,targets,medias,thresholds=[0.1],remove_unneeded_ if self.find_item_in_solution(do_not_remove_list,item): if item[1] == ">": rxnobj.upper_bound = item[3] + if item[4] != None: + rxnobj.lower_bound = item[4] else: rxnobj.lower_bound = item[3] + if item[4] != None: + rxnobj.upper_bound = item[4] elif rxnobj.lower_bound == 0 and rxnobj.upper_bound == 0 and not self.find_item_in_solution(do_not_remove_list,item,ignore_dir=True): removed_rxns.append(rxnobj) if len(removed_rxns) > 0: diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index c7a0b595..c795d327 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -716,16 +716,16 @@ def run_test_conditions(self, condition_list, solution=None, max_iterations=10): def test_gapfill_database(self): self.reset_objective_minimum(0,False) self.model.objective = self.original_objective - solution = self.model.optimize() + self.test_solution = self.model.optimize() logger.info( "Objective with gapfill database:" - + str(solution.objective_value) + + str(self.test_solution.objective_value) + "; min objective:" + str(self.parameters["minimum_obj"]) ) self.reset_objective_minimum(self.parameters["minimum_obj"]) self.model.objective = self.parameters["gfobj"] - if solution.objective_value < self.parameters["minimum_obj"]: + if self.test_solution.objective_value < self.parameters["minimum_obj"] or self.test_solution.status == 'infeasible': return False return True @@ -745,7 +745,7 @@ def reset_objective_minimum(self, min_objective,reset_params=True): if min_objective < 0: self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].ub = min_objective - def filter_database_based_on_tests(self,test_conditions,growth_conditions=[],base_filter=None,base_target="rxn00062_c0"): + def filter_database_based_on_tests(self,test_conditions,growth_conditions=[],base_filter=None,base_target="rxn00062_c0",base_filter_only=False): #Saving the current media current_media = self.current_media() #Clearing element uptake constraints @@ -768,18 +768,19 @@ def filter_database_based_on_tests(self,test_conditions,growth_conditions=[],bas else: rxnobj.lower_bound = 0 # Filtering the database of any reactions that violate the specified tests - filetered_list = [] - with self.model: - rxnlist = [] - for reaction in self.model.reactions: - if reaction.id in self.gapfilling_penalties: - if "reverse" in self.gapfilling_penalties[reaction.id]: - rxnlist.append([reaction, "<"]) - if "forward" in self.gapfilling_penalties[reaction.id]: - rxnlist.append([reaction, ">"]) - filtered_list = self.modelutl.reaction_expansion_test( - rxnlist, test_conditions - ) + filtered_list = [] + if not base_filter_only: + with self.model: + rxnlist = [] + for reaction in self.model.reactions: + if reaction.id in self.gapfilling_penalties: + if "reverse" in self.gapfilling_penalties[reaction.id]: + rxnlist.append([reaction, "<"]) + if "forward" in self.gapfilling_penalties[reaction.id]: + rxnlist.append([reaction, ">"]) + filtered_list = self.modelutl.reaction_expansion_test( + rxnlist, test_conditions + ) #Adding base filter reactions to model if base_filter != None: gf_filter_att = self.modelutl.get_attributes("gf_filter", {}) diff --git a/modelseedpy/fbapkg/kbasemediapkg.py b/modelseedpy/fbapkg/kbasemediapkg.py index 7e53a0af..92525b30 100644 --- a/modelseedpy/fbapkg/kbasemediapkg.py +++ b/modelseedpy/fbapkg/kbasemediapkg.py @@ -50,8 +50,12 @@ def build_package( # First initializing all exchanges to default uptake and excretion exchange_list = self.modelutl.exchange_list() for reaction in exchange_list: - reaction.lower_bound = -1 * self.parameters["default_uptake"] - reaction.upper_bound = self.parameters["default_excretion"] + if -1 * self.parameters["default_uptake"] > reaction.upper_bound: + reaction.upper_bound = self.parameters["default_excretion"] + reaction.lower_bound = -1 * self.parameters["default_uptake"] + else: + reaction.lower_bound = -1 * self.parameters["default_uptake"] + reaction.upper_bound = self.parameters["default_excretion"] # Now constraining exchanges for specific compounds specified in the media if self.parameters["media"]: From f8ef961a5c9b80e9b55ac27ae8356960a4ee67d3 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 3 Jun 2024 09:09:53 -0500 Subject: [PATCH 247/298] Fixing minimum value for phenotype --- modelseedpy/core/msgrowthphenotypes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index a390de44..66f7a4c0 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -156,7 +156,7 @@ def simulate( constraint = modelutl.model.constraints['1_objc'] modelutl.model.remove_cons_vars([constraint]) modelutl.pkgmgr.getpkg("ObjConstPkg").build_package( - 0.2*output["objective_value"], None + 0.1, None ) coefobj = modelutl.model.problem.Objective(0, direction="min") modelutl.model.objective = coefobj From 17ceafd5b43c1bdb2f58f1622b8fe40f16d19f7a Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 3 Jun 2024 09:36:03 -0500 Subject: [PATCH 248/298] Fixing phenotype simulation --- modelseedpy/core/msgrowthphenotypes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 66f7a4c0..09d759aa 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -147,7 +147,7 @@ def simulate( # Optimizing model solution = modelutl.model.optimize() output["objective_value"] = solution.objective_value - if solution.objective_value > 0: + if solution.objective_value != None and solution.objective_value > 0: if flux_coefficients == None: solution = cobra.flux_analysis.pfba(modelutl.model) else: @@ -195,7 +195,7 @@ def simulate( output["reactions"].append("<"+reaction.id) # Determining phenotype class - if output["objective_value"] >= output["baseline_objective"] * multiplier: + if output["objective_value"] != None and output["objective_value"] >= output["baseline_objective"] * multiplier: output["postive"] = True if not self.experimental_value or ignore_experimental_data: output["class"] = "P" From b8eb006caca92a0a60481af513f7df82b3dbb4e6 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 3 Jun 2024 10:10:08 -0500 Subject: [PATCH 249/298] Disabling phenotype call adjustment --- modelseedpy/core/msgrowthphenotypes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 09d759aa..958b7269 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -575,7 +575,7 @@ def simulate_phenotypes( summary["Count"][0] = summary["Count"][0] / totalcount sdf = pd.DataFrame(summary) df = pd.DataFrame(data) - self.adjust_phenotype_calls(df) + #self.adjust_phenotype_calls(df) return {"details": df, "summary": sdf,"data":datahash} def adjust_phenotype_calls(self,data,baseline_objective=0.01): From 35e3b337267aa902aa967e85fadbf2f46ba1dba2 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 4 Jun 2024 13:22:19 -0500 Subject: [PATCH 250/298] Adjusting where growth constraint is being removed --- modelseedpy/core/msgrowthphenotypes.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 958b7269..8a4ab47f 100644 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -145,6 +145,9 @@ def simulate( geneobj.knock_out() # Optimizing model + if '1_objc' in modelutl.model.constraints: + constraint = modelutl.model.constraints['1_objc'] + modelutl.model.remove_cons_vars([constraint]) solution = modelutl.model.optimize() output["objective_value"] = solution.objective_value if solution.objective_value != None and solution.objective_value > 0: @@ -152,9 +155,6 @@ def simulate( solution = cobra.flux_analysis.pfba(modelutl.model) else: #modelutl.printlp(lpfilename="lpfiles/gapfill.lp") - if '1_objc' in modelutl.model.constraints: - constraint = modelutl.model.constraints['1_objc'] - modelutl.model.remove_cons_vars([constraint]) modelutl.pkgmgr.getpkg("ObjConstPkg").build_package( 0.1, None ) From 2b71ba0928319319c57d73f1f57dd06d0b484f08 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Fri, 21 Jun 2024 13:02:31 -0500 Subject: [PATCH 251/298] biochem --- modelseedpy/biochem/modelseed_compound.py | 6 ++++- modelseedpy/biochem/modelseed_reaction.py | 5 ++++- modelseedpy/core/msgenome.py | 27 ++++++++++++++--------- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/modelseedpy/biochem/modelseed_compound.py b/modelseedpy/biochem/modelseed_compound.py index a3ea75f3..c17941ac 100644 --- a/modelseedpy/biochem/modelseed_compound.py +++ b/modelseedpy/biochem/modelseed_compound.py @@ -57,7 +57,9 @@ def __init__( self.flags |= set(flags) def to_template_compartment_compound(self, compartment): - cpd_id = f"{self.seed_id}_{compartment}" + cpd_id = f"{self.seed_id}" + if compartment: + cpd_id += f"_{compartment}" # build Template Compound metabolite = MSTemplateMetabolite( self.seed_id, @@ -71,6 +73,8 @@ def to_template_compartment_compound(self, compartment): self.abbr, ) # build Template Compartment Compound + if compartment is None: + compartment = 'x' res = MSTemplateSpecies(cpd_id, self.charge, compartment, metabolite.id) # assign Compound to Compartment Compound diff --git a/modelseedpy/biochem/modelseed_reaction.py b/modelseedpy/biochem/modelseed_reaction.py index b43430ce..d0e3b050 100644 --- a/modelseedpy/biochem/modelseed_reaction.py +++ b/modelseedpy/biochem/modelseed_reaction.py @@ -174,8 +174,11 @@ def to_template_reaction(self, compartment_setup=None): raise ValueError("invalid compartment setup") from modelseedpy.core.msmodel import get_cmp_token + rxn_id = f"{self.id}" reaction_compartment = get_cmp_token(compartment_setup.values()) - rxn_id = f"{self.id}_{reaction_compartment}" + if reaction_compartment: + rxn_id += f"_{reaction_compartment}" + name = f"{self.name}" metabolites = {} for m, v in self.metabolites.items(): diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index 78f1e004..51ec3896 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -8,6 +8,21 @@ DEFAULT_SPLIT = " " +def to_fasta(features, filename, l=80, fn_header=None): + with open(filename, "w") as fh: + for feature in features: + h = f">{feature.id}\n" + if fn_header: + h = fn_header(feature) + fh.write(h) + lines = [ + feature.seq[i: i + l] + "\n" for i in range(0, len(feature.seq), l) + ] + for line in lines: + fh.write(line) + return filename + + def normalize_role(s): s = s.strip().lower() s = re.sub(r"[\W_]+", "", s) @@ -111,17 +126,7 @@ def from_fasta( return genome def to_fasta(self, filename, l=80, fn_header=None): - with open(filename, "w") as fh: - for feature in self.features: - h = f">{feature.id}\n" - if fn_header: - h = fn_header(feature) - fh.write(h) - lines = [ - feature.seq[i : i + l] + "\n" for i in range(0, len(feature.seq), l) - ] - for line in lines: - fh.write(line) + to_fasta(self.features, filename, l, fn_header) return filename @staticmethod From f42f91f3e5e1019fa0d00a602368a1a47718609a Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Mon, 8 Jul 2024 23:13:29 -0500 Subject: [PATCH 252/298] bump 4.0 swapped pyeda for sympy --- README.rst | 5 - modelseedpy/__init__.py | 2 +- modelseedpy/biochem/modelseed_biochem.py | 50 ++++++++++ modelseedpy/biochem/modelseed_compound.py | 2 +- modelseedpy/core/msgenome.py | 50 +++++++++- modelseedpy/core/msmodel.py | 33 +++++-- setup.py | 5 +- tests/core/test_msmodel.py | 82 +++++++++++++++++ tests/core/test_mstemplate.py | 107 ++++++++++++++++++++++ 9 files changed, 320 insertions(+), 16 deletions(-) create mode 100644 tests/core/test_msmodel.py create mode 100644 tests/core/test_mstemplate.py diff --git a/README.rst b/README.rst index 6f380d9a..f2b4e973 100644 --- a/README.rst +++ b/README.rst @@ -51,8 +51,3 @@ The associated ModelSEED Database, which is required for a few packages, is simp git clone https://github.com/ModelSEED/ModelSEEDDatabase.git and the path to this repository is passed as an argument to the corresponding packages. - -**Windows users** must separately install the ``pyeda`` module: 1) download the appropriate wheel for your Python version from `this website `_ ; and 2) install the wheel through the following commands in a command prompt/powershell console:: - - cd path/to/pyeda/wheel - pip install pyeda_wheel_name.whl diff --git a/modelseedpy/__init__.py b/modelseedpy/__init__.py index 74ea066b..995c054f 100644 --- a/modelseedpy/__init__.py +++ b/modelseedpy/__init__.py @@ -14,7 +14,7 @@ __author__ = "Christopher Henry" __email__ = "chenry@anl.gov" -__version__ = "0.3.3" +__version__ = "0.4.0" logger = logging.getLogger(__name__) diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index 80594e0e..439becb0 100644 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -250,6 +250,56 @@ def _load_metabolites( return metabolites +def build_modelseed_reaction( + o, names, aliases, ec_numbers, metabolites_indexed, metabolites +): + if "id" in o and o["id"]: + rxn_names = set() + if o["id"] in names: + rxn_names |= names[o["id"]] + ( + lower_bound, + upper_bound, + ) = get_reaction_constraints_from_direction(o.get("reversibility")) + stoichiometry = o.get("stoichiometry") + reaction_metabolites = {} + for s in stoichiometry: + cmp_token = s["compartment"] + value = s["coefficient"] + cpd = metabolites[s["compound"]] + cpd_index_id = f"{cpd.id}_{cmp_token}" + if cpd_index_id not in metabolites_indexed: + cpd_token = cpd.copy() + cpd_token.id = f"{cpd.id}_{cmp_token}" + cpd_token.base_id = cpd.id + cpd_token.compartment = cmp_token + metabolites_indexed[cpd_index_id] = cpd_token + reaction_metabolites[metabolites_indexed[cpd_index_id]] = value + rxn = ModelSEEDReaction2( + o["id"], + o.get("name"), + "", + lower_bound, + upper_bound, + "", + rxn_names, + o.get("deltag"), + o.get("deltagerr"), + o.get("is_obsolete"), + None, + o.get("status"), + o.get("source"), + ) + rxn.add_metabolites(reaction_metabolites) + if rxn.id in aliases: + rxn.annotation.update(aliases[rxn.id]) + if rxn.id in ec_numbers: + rxn.annotation["ec-code"] = ec_numbers[rxn.id] + return rxn + else: + raise ValueError("unable to build reaction") + + def _load_reactions( database_path: str, metabolites: dict, aliases=None, names=None, ec_numbers=None ) -> (dict, dict): diff --git a/modelseedpy/biochem/modelseed_compound.py b/modelseedpy/biochem/modelseed_compound.py index c17941ac..c5c73fed 100644 --- a/modelseedpy/biochem/modelseed_compound.py +++ b/modelseedpy/biochem/modelseed_compound.py @@ -74,7 +74,7 @@ def to_template_compartment_compound(self, compartment): ) # build Template Compartment Compound if compartment is None: - compartment = 'x' + compartment = "x" res = MSTemplateSpecies(cpd_id, self.charge, compartment, metabolite.id) # assign Compound to Compartment Compound diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index 51ec3896..99790484 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -16,7 +16,7 @@ def to_fasta(features, filename, l=80, fn_header=None): h = fn_header(feature) fh.write(h) lines = [ - feature.seq[i: i + l] + "\n" for i in range(0, len(feature.seq), l) + feature.seq[i : i + l] + "\n" for i in range(0, len(feature.seq), l) ] for line in lines: fh.write(line) @@ -40,6 +40,17 @@ def read_fasta(f, split=DEFAULT_SPLIT, h_func=None): return parse_fasta_str(fh.read(), split, h_func) +def read_fasta2(f, split=DEFAULT_SPLIT, h_func=None): + if f.endswith(".gz"): + import gzip + + with gzip.open(f, "rb") as fh: + return extract_features(fh.read().decode("utf-8"), split, h_func) + else: + with open(f, "r") as fh: + return extract_features(fh.read(), split, h_func) + + def parse_fasta_str(faa_str, split=DEFAULT_SPLIT, h_func=None): features = [] seq = None @@ -68,6 +79,37 @@ def parse_fasta_str(faa_str, split=DEFAULT_SPLIT, h_func=None): return features +def extract_features(faa_str, split=DEFAULT_SPLIT, h_func=None): + features = [] + active_seq = None + seq_lines = [] + for line in faa_str.split("\n"): + if line.startswith(">"): + if active_seq is not None: + active_seq.seq = "".join(seq_lines) + features.append(active_seq) + seq_lines = [] + seq_id = line[1:] + desc = None + if h_func: + seq_id, desc = h_func(seq_id) + elif split: + header_data = line[1:].split(split, 1) + seq_id = header_data[0] + if len(header_data) > 1: + desc = header_data[1] + active_seq = MSFeature(seq_id, "", desc) + else: + seq_lines.append(line.strip()) + + # add last sequence + if len(seq_lines) > 0: + active_seq.seq = "".join(seq_lines) + features.append(active_seq) + + return features + + class MSFeature: def __init__(self, feature_id, sequence, description=None, aliases=None): """ @@ -125,6 +167,12 @@ def from_fasta( genome.features += read_fasta(filename, split, h_func) return genome + @staticmethod + def from_fasta2(filename, split=" ", h_func=None): + genome = MSGenome() + genome.features += read_fasta2(filename, split, h_func) + return genome + def to_fasta(self, filename, l=80, fn_header=None): to_fasta(self.features, filename, l, fn_header) return filename diff --git a/modelseedpy/core/msmodel.py b/modelseedpy/core/msmodel.py index d34fc9e6..48c9f985 100644 --- a/modelseedpy/core/msmodel.py +++ b/modelseedpy/core/msmodel.py @@ -1,10 +1,12 @@ # -*- coding: utf-8 -*- import logging import re -from cobra.core import Model -from pyeda.inter import ( - expr, -) # wheels must be specially downloaded and installed for Windows https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyeda +from sympy.logic.inference import satisfiable +from sympy import Symbol +import sympy.logic.boolalg as spl +from cobra.core import Model, GPR + +# from pyeda.inter import expr logger = logging.getLogger(__name__) @@ -103,18 +105,37 @@ def get_cmp_token(compartments): return None -def get_set_set(expr_str): # !!! this currently returns dictionaries, not sets?? +def get_set_set_pyeda(expr_str: str, pyeda_expr): if len(expr_str.strip()) == 0: return {} expr_str = expr_str.replace(" or ", " | ") expr_str = expr_str.replace(" and ", " & ") - dnf = expr(expr_str).to_dnf() + dnf = pyeda_expr(expr_str).to_dnf() if len(dnf.inputs) == 1 or dnf.NAME == "And": return {frozenset({str(x) for x in dnf.inputs})} else: return {frozenset({str(x) for x in o.inputs}) for o in dnf.xs} +def get_set_set(expr_str: str): + if expr_str is None or len(expr_str.strip()) == 0: + return {} + gpr = GPR.from_string(expr_str) + expr = gpr.as_symbolic() + expr_model = list(satisfiable(expr, all_models=True)) + dnf = spl.SOPform(tuple(gpr.genes), list(expr_model)) + if type(dnf) == spl.And or type(dnf) == Symbol: + variable_set = set() + variable_set.add(frozenset({atom.name for atom in dnf.atoms()})) + return frozenset(variable_set) + elif type(dnf) == spl.Or: + return frozenset( + {frozenset({atom.name for atom in x.atoms()}) for x in dnf.args} + ) + else: + raise ValueError(f"unable to decode {expr_str} found token of type {type(dnf)}") + + class MSModel(Model): def __init__(self, id_or_model=None, genome=None, template=None): """ diff --git a/setup.py b/setup.py index da01e792..97e79dfd 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ setup( name="ModelSEEDpy", - version="0.3.3", + version="0.4.0", description="Python package for building and analyzing models using ModelSEED", long_description_content_type="text/x-rst", long_description=readme, @@ -40,7 +40,8 @@ "chemicals >= 1.0.13", "chemw >= 0.3.2", "matplotlib >= 3.0.0", - "pyeda", + "Jinja2 >= 3.1.4", + "sympy >=1.12.0", ], tests_require=[ "pytest", diff --git a/tests/core/test_msmodel.py b/tests/core/test_msmodel.py new file mode 100644 index 00000000..68478498 --- /dev/null +++ b/tests/core/test_msmodel.py @@ -0,0 +1,82 @@ +from modelseedpy.core.msmodel import * + + +def test_get_direction_from_constraints1(): + res = get_direction_from_constraints(0, 1000) + + assert res == ">" + + +def test_get_direction_from_constraints2(): + res = get_direction_from_constraints(-1000, 0) + + assert res == "<" + + +def test_get_direction_from_constraints3(): + res = get_direction_from_constraints(-1000, 1000) + + assert res == "=" + + +def test_get_set_set1(): + res = get_set_set("A") + + assert len(res) == 1 + assert {"A"} in res + + +def test_get_set_set2(): + res = get_set_set("A and B") + + assert len(res) == 1 + assert {"A", "B"} in res + + +def test_get_set_set3(): + res = get_set_set("A or B") + + assert len(res) == 2 + assert {"A"} in res + assert {"B"} in res + + +def test_get_set_set4(): + res = get_set_set("A or B or C") + + assert len(res) == 3 + assert {"A"} in res + assert {"B"} in res + assert {"C"} in res + + +def test_get_set_set5(): + res = get_set_set("A or B and C") + + assert len(res) == 2 + assert {"A"} in res + assert {"B", "C"} in res + + +def test_get_set_set6(): + res = get_set_set("A and B or C") + + assert len(res) == 2 + assert {"A", "B"} in res + assert {"C"} in res + + +def test_get_set_set7(): + res = get_set_set("(A or B) and C") + + assert len(res) == 2 + assert {"A", "C"} in res + assert {"B", "C"} in res + + +def test_get_set_set8(): + res = get_set_set("A and (B or C)") + + assert len(res) == 2 + assert {"A", "B"} in res + assert {"A", "C"} in res diff --git a/tests/core/test_mstemplate.py b/tests/core/test_mstemplate.py new file mode 100644 index 00000000..8de3eeea --- /dev/null +++ b/tests/core/test_mstemplate.py @@ -0,0 +1,107 @@ +import pytest +from modelseedpy.core.mstemplate import ( + MSTemplate, + MSTemplateMetabolite, + MSTemplateReaction, + MSTemplateSpecies, +) +from modelseedpy.core.mstemplate import ( + NewModelTemplateRole, + NewModelTemplateComplex, + MSTemplateCompartment, +) + + +@pytest.fixture +def empty_template(): + return MSTemplate("test", "test name", "test") + + +def test_empty_template(): + template = MSTemplate("test", "test name", "test") + assert template.id == "test" + assert template.name == "test name" + assert len(template.roles) == 0 + assert len(template.complexes) == 0 + assert len(template.compounds) == 0 + assert len(template.compcompounds) == 0 + assert len(template.reactions) == 0 + + +def test_template_add_role(empty_template): + role = NewModelTemplateRole("role1", "metabolic function") + empty_template.add_roles([role]) + assert len(empty_template.roles) == 1 + + +def test_template_add_role_mult(empty_template): + role_a = NewModelTemplateRole("roleA", "metabolic function A") + role_b = NewModelTemplateRole("roleB", "metabolic function B") + role_c = NewModelTemplateRole("roleC", "metabolic function C") + empty_template.add_roles([role_a, role_b, role_c]) + assert len(empty_template.roles) == 3 + + +def test_template_add_simple_complex(empty_template): + role = NewModelTemplateRole("role1", "metabolic function") + empty_template.add_roles([role]) + + seed_complex = NewModelTemplateComplex("complex1", "example complex") + + seed_complex.add_role(empty_template.roles.role1) + + empty_template.add_complexes([seed_complex]) + + assert len(empty_template.complexes) == 1 + + +def test_template_add_simple_metabolite(empty_template): + cpd_apple = MSTemplateMetabolite("apple", "C100", "just a apple") + empty_template.add_compounds([cpd_apple]) + + assert len(empty_template.compounds) == 1 + + +def test_template_add_simple_metabolite_species(empty_template): + cpd_apple = MSTemplateMetabolite("apple", "C100", "just a apple") + empty_template.add_compounds([cpd_apple]) + + comp_cpd_apple = MSTemplateSpecies("apple_k", 0, "k", "apple") + empty_template.add_comp_compounds([comp_cpd_apple]) + + assert len(empty_template.compounds) == 1 + assert len(empty_template.compcompounds) == 1 + assert empty_template.compcompounds.apple_k.compound + assert empty_template.compcompounds.apple_k.compound.name == "just a apple" + assert len(empty_template.compounds.apple.species) == 1 + + +def test_template_add_compartment(empty_template): + empty_template.compartments += [MSTemplateCompartment("w", "world", 4)] + + assert len(empty_template.compartments) == 1 + + +def test_template_add_reaction(empty_template): + cpd_apple = MSTemplateMetabolite("apple", "C100", "just a apple") + cpd_apple_pie = MSTemplateMetabolite("appie", "C1000", "apple pie (10 apples)") + empty_template.add_compounds([cpd_apple, cpd_apple_pie]) + + comp_cpd_apple = MSTemplateSpecies("apple_k", 0, "k", "apple") + comp_cpd_apple_pie = MSTemplateSpecies("appie_k", 0, "k", "appie") + empty_template.add_comp_compounds([comp_cpd_apple, comp_cpd_apple_pie]) + + rxn_make_pie = MSTemplateReaction( + "rxn_pie_k", "rxn00000", "make pie", "pie", 0, 1000 + ) + rxn_make_pie.add_metabolites( + { + empty_template.compcompounds.apple_k: -10, + empty_template.compcompounds.appie_k: 1, + } + ) + + empty_template.add_reactions([rxn_make_pie]) + + assert len(empty_template.reactions) == 1 + assert empty_template.reactions.rxn_pie_k.check_mass_balance() == {} From 9e978484edb1fbbe94336188df9daf56d676c2be Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Mon, 8 Jul 2024 23:25:44 -0500 Subject: [PATCH 253/298] mixed line endings --- tests/core/test_msmodel.py | 164 +++++++++++++------------- tests/core/test_mstemplate.py | 214 +++++++++++++++++----------------- 2 files changed, 189 insertions(+), 189 deletions(-) diff --git a/tests/core/test_msmodel.py b/tests/core/test_msmodel.py index 68478498..0aa63ffa 100644 --- a/tests/core/test_msmodel.py +++ b/tests/core/test_msmodel.py @@ -1,82 +1,82 @@ -from modelseedpy.core.msmodel import * - - -def test_get_direction_from_constraints1(): - res = get_direction_from_constraints(0, 1000) - - assert res == ">" - - -def test_get_direction_from_constraints2(): - res = get_direction_from_constraints(-1000, 0) - - assert res == "<" - - -def test_get_direction_from_constraints3(): - res = get_direction_from_constraints(-1000, 1000) - - assert res == "=" - - -def test_get_set_set1(): - res = get_set_set("A") - - assert len(res) == 1 - assert {"A"} in res - - -def test_get_set_set2(): - res = get_set_set("A and B") - - assert len(res) == 1 - assert {"A", "B"} in res - - -def test_get_set_set3(): - res = get_set_set("A or B") - - assert len(res) == 2 - assert {"A"} in res - assert {"B"} in res - - -def test_get_set_set4(): - res = get_set_set("A or B or C") - - assert len(res) == 3 - assert {"A"} in res - assert {"B"} in res - assert {"C"} in res - - -def test_get_set_set5(): - res = get_set_set("A or B and C") - - assert len(res) == 2 - assert {"A"} in res - assert {"B", "C"} in res - - -def test_get_set_set6(): - res = get_set_set("A and B or C") - - assert len(res) == 2 - assert {"A", "B"} in res - assert {"C"} in res - - -def test_get_set_set7(): - res = get_set_set("(A or B) and C") - - assert len(res) == 2 - assert {"A", "C"} in res - assert {"B", "C"} in res - - -def test_get_set_set8(): - res = get_set_set("A and (B or C)") - - assert len(res) == 2 - assert {"A", "B"} in res - assert {"A", "C"} in res +from modelseedpy.core.msmodel import * + + +def test_get_direction_from_constraints1(): + res = get_direction_from_constraints(0, 1000) + + assert res == ">" + + +def test_get_direction_from_constraints2(): + res = get_direction_from_constraints(-1000, 0) + + assert res == "<" + + +def test_get_direction_from_constraints3(): + res = get_direction_from_constraints(-1000, 1000) + + assert res == "=" + + +def test_get_set_set1(): + res = get_set_set("A") + + assert len(res) == 1 + assert {"A"} in res + + +def test_get_set_set2(): + res = get_set_set("A and B") + + assert len(res) == 1 + assert {"A", "B"} in res + + +def test_get_set_set3(): + res = get_set_set("A or B") + + assert len(res) == 2 + assert {"A"} in res + assert {"B"} in res + + +def test_get_set_set4(): + res = get_set_set("A or B or C") + + assert len(res) == 3 + assert {"A"} in res + assert {"B"} in res + assert {"C"} in res + + +def test_get_set_set5(): + res = get_set_set("A or B and C") + + assert len(res) == 2 + assert {"A"} in res + assert {"B", "C"} in res + + +def test_get_set_set6(): + res = get_set_set("A and B or C") + + assert len(res) == 2 + assert {"A", "B"} in res + assert {"C"} in res + + +def test_get_set_set7(): + res = get_set_set("(A or B) and C") + + assert len(res) == 2 + assert {"A", "C"} in res + assert {"B", "C"} in res + + +def test_get_set_set8(): + res = get_set_set("A and (B or C)") + + assert len(res) == 2 + assert {"A", "B"} in res + assert {"A", "C"} in res diff --git a/tests/core/test_mstemplate.py b/tests/core/test_mstemplate.py index 8de3eeea..8be3683d 100644 --- a/tests/core/test_mstemplate.py +++ b/tests/core/test_mstemplate.py @@ -1,107 +1,107 @@ -import pytest -from modelseedpy.core.mstemplate import ( - MSTemplate, - MSTemplateMetabolite, - MSTemplateReaction, - MSTemplateSpecies, -) -from modelseedpy.core.mstemplate import ( - NewModelTemplateRole, - NewModelTemplateComplex, - MSTemplateCompartment, -) - - -@pytest.fixture -def empty_template(): - return MSTemplate("test", "test name", "test") - - -def test_empty_template(): - template = MSTemplate("test", "test name", "test") - assert template.id == "test" - assert template.name == "test name" - assert len(template.roles) == 0 - assert len(template.complexes) == 0 - assert len(template.compounds) == 0 - assert len(template.compcompounds) == 0 - assert len(template.reactions) == 0 - - -def test_template_add_role(empty_template): - role = NewModelTemplateRole("role1", "metabolic function") - empty_template.add_roles([role]) - assert len(empty_template.roles) == 1 - - -def test_template_add_role_mult(empty_template): - role_a = NewModelTemplateRole("roleA", "metabolic function A") - role_b = NewModelTemplateRole("roleB", "metabolic function B") - role_c = NewModelTemplateRole("roleC", "metabolic function C") - empty_template.add_roles([role_a, role_b, role_c]) - assert len(empty_template.roles) == 3 - - -def test_template_add_simple_complex(empty_template): - role = NewModelTemplateRole("role1", "metabolic function") - empty_template.add_roles([role]) - - seed_complex = NewModelTemplateComplex("complex1", "example complex") - - seed_complex.add_role(empty_template.roles.role1) - - empty_template.add_complexes([seed_complex]) - - assert len(empty_template.complexes) == 1 - - -def test_template_add_simple_metabolite(empty_template): - cpd_apple = MSTemplateMetabolite("apple", "C100", "just a apple") - empty_template.add_compounds([cpd_apple]) - - assert len(empty_template.compounds) == 1 - - -def test_template_add_simple_metabolite_species(empty_template): - cpd_apple = MSTemplateMetabolite("apple", "C100", "just a apple") - empty_template.add_compounds([cpd_apple]) - - comp_cpd_apple = MSTemplateSpecies("apple_k", 0, "k", "apple") - empty_template.add_comp_compounds([comp_cpd_apple]) - - assert len(empty_template.compounds) == 1 - assert len(empty_template.compcompounds) == 1 - assert empty_template.compcompounds.apple_k.compound - assert empty_template.compcompounds.apple_k.compound.name == "just a apple" - assert len(empty_template.compounds.apple.species) == 1 - - -def test_template_add_compartment(empty_template): - empty_template.compartments += [MSTemplateCompartment("w", "world", 4)] - - assert len(empty_template.compartments) == 1 - - -def test_template_add_reaction(empty_template): - cpd_apple = MSTemplateMetabolite("apple", "C100", "just a apple") - cpd_apple_pie = MSTemplateMetabolite("appie", "C1000", "apple pie (10 apples)") - empty_template.add_compounds([cpd_apple, cpd_apple_pie]) - - comp_cpd_apple = MSTemplateSpecies("apple_k", 0, "k", "apple") - comp_cpd_apple_pie = MSTemplateSpecies("appie_k", 0, "k", "appie") - empty_template.add_comp_compounds([comp_cpd_apple, comp_cpd_apple_pie]) - - rxn_make_pie = MSTemplateReaction( - "rxn_pie_k", "rxn00000", "make pie", "pie", 0, 1000 - ) - rxn_make_pie.add_metabolites( - { - empty_template.compcompounds.apple_k: -10, - empty_template.compcompounds.appie_k: 1, - } - ) - - empty_template.add_reactions([rxn_make_pie]) - - assert len(empty_template.reactions) == 1 - assert empty_template.reactions.rxn_pie_k.check_mass_balance() == {} +import pytest +from modelseedpy.core.mstemplate import ( + MSTemplate, + MSTemplateMetabolite, + MSTemplateReaction, + MSTemplateSpecies, +) +from modelseedpy.core.mstemplate import ( + NewModelTemplateRole, + NewModelTemplateComplex, + MSTemplateCompartment, +) + + +@pytest.fixture +def empty_template(): + return MSTemplate("test", "test name", "test") + + +def test_empty_template(): + template = MSTemplate("test", "test name", "test") + assert template.id == "test" + assert template.name == "test name" + assert len(template.roles) == 0 + assert len(template.complexes) == 0 + assert len(template.compounds) == 0 + assert len(template.compcompounds) == 0 + assert len(template.reactions) == 0 + + +def test_template_add_role(empty_template): + role = NewModelTemplateRole("role1", "metabolic function") + empty_template.add_roles([role]) + assert len(empty_template.roles) == 1 + + +def test_template_add_role_mult(empty_template): + role_a = NewModelTemplateRole("roleA", "metabolic function A") + role_b = NewModelTemplateRole("roleB", "metabolic function B") + role_c = NewModelTemplateRole("roleC", "metabolic function C") + empty_template.add_roles([role_a, role_b, role_c]) + assert len(empty_template.roles) == 3 + + +def test_template_add_simple_complex(empty_template): + role = NewModelTemplateRole("role1", "metabolic function") + empty_template.add_roles([role]) + + seed_complex = NewModelTemplateComplex("complex1", "example complex") + + seed_complex.add_role(empty_template.roles.role1) + + empty_template.add_complexes([seed_complex]) + + assert len(empty_template.complexes) == 1 + + +def test_template_add_simple_metabolite(empty_template): + cpd_apple = MSTemplateMetabolite("apple", "C100", "just a apple") + empty_template.add_compounds([cpd_apple]) + + assert len(empty_template.compounds) == 1 + + +def test_template_add_simple_metabolite_species(empty_template): + cpd_apple = MSTemplateMetabolite("apple", "C100", "just a apple") + empty_template.add_compounds([cpd_apple]) + + comp_cpd_apple = MSTemplateSpecies("apple_k", 0, "k", "apple") + empty_template.add_comp_compounds([comp_cpd_apple]) + + assert len(empty_template.compounds) == 1 + assert len(empty_template.compcompounds) == 1 + assert empty_template.compcompounds.apple_k.compound + assert empty_template.compcompounds.apple_k.compound.name == "just a apple" + assert len(empty_template.compounds.apple.species) == 1 + + +def test_template_add_compartment(empty_template): + empty_template.compartments += [MSTemplateCompartment("w", "world", 4)] + + assert len(empty_template.compartments) == 1 + + +def test_template_add_reaction(empty_template): + cpd_apple = MSTemplateMetabolite("apple", "C100", "just a apple") + cpd_apple_pie = MSTemplateMetabolite("appie", "C1000", "apple pie (10 apples)") + empty_template.add_compounds([cpd_apple, cpd_apple_pie]) + + comp_cpd_apple = MSTemplateSpecies("apple_k", 0, "k", "apple") + comp_cpd_apple_pie = MSTemplateSpecies("appie_k", 0, "k", "appie") + empty_template.add_comp_compounds([comp_cpd_apple, comp_cpd_apple_pie]) + + rxn_make_pie = MSTemplateReaction( + "rxn_pie_k", "rxn00000", "make pie", "pie", 0, 1000 + ) + rxn_make_pie.add_metabolites( + { + empty_template.compcompounds.apple_k: -10, + empty_template.compcompounds.appie_k: 1, + } + ) + + empty_template.add_reactions([rxn_make_pie]) + + assert len(empty_template.reactions) == 1 + assert empty_template.reactions.rxn_pie_k.check_mass_balance() == {} From 311563e39959e46f8acf47c4f09485e58f787f4b Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Mon, 8 Jul 2024 23:28:49 -0500 Subject: [PATCH 254/298] pragmas --- tests/core/test_msmodel.py | 1 + tests/core/test_mstemplate.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/tests/core/test_msmodel.py b/tests/core/test_msmodel.py index 0aa63ffa..ec4027f5 100644 --- a/tests/core/test_msmodel.py +++ b/tests/core/test_msmodel.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from modelseedpy.core.msmodel import * diff --git a/tests/core/test_mstemplate.py b/tests/core/test_mstemplate.py index 8be3683d..9663e8c8 100644 --- a/tests/core/test_mstemplate.py +++ b/tests/core/test_mstemplate.py @@ -1,4 +1,6 @@ +# -*- coding: utf-8 -*- import pytest + from modelseedpy.core.mstemplate import ( MSTemplate, MSTemplateMetabolite, From 43770ce67072924932dc19cf184f921ae1ed04eb Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Tue, 9 Jul 2024 00:07:37 -0500 Subject: [PATCH 255/298] readne --- README.rst | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index f2b4e973..3d491ec3 100644 --- a/README.rst +++ b/README.rst @@ -25,6 +25,10 @@ ________________________________________________________________________ :target: https://pepy.tech/project/modelseedpy :alt: Downloads +.. image:: https://img.shields.io/badge/code%20style-black-000000.svg + :target: https://github.com/ambv/black + :alt: Black + Metabolic modeling is an pivotal method for computational research in synthetic biology and precision medicine. The metabolic models, such as the constrint-based flux balance analysis (FBA) algorithm, are improved with comprehensive datasets that capture more metabolic chemistry in the model and improve the accuracy of simulation predictions. We therefore developed ModelSEEDpy as a comprehensive suite of packages that bootstrap metabolic modeling with the ModelSEED Database (`Seaver et al., 2021 `_ ). These packages parse and manipulate (e.g. gapfill missing reactions or calculated chemical properties of metabolites), constrain (with kinetic, thermodynamics, and nutrient uptake), and simulate cobrakbase models (both individual models and communities). This is achieved by standardizing COBRA models through the ``cobrakbase`` module into a form that is amenable with the KBase/ModelSEED ecosystem. These functionalities are exemplified in `Python Notebooks `_ . Please submit errors, inquiries, or suggestions as `GitHub issues `_ where they can be addressed by our developers. @@ -33,11 +37,11 @@ Metabolic modeling is an pivotal method for computational research in synthetic Installation ---------------------- -ModelSEEDpy will soon be installable via the ``PyPI`` channel:: +PIP (latest stable version 0.4.0):: pip install modelseedpy -but, until then, the repository must cloned:: +GitHub dev build (latest working version):: git clone https://github.com/ModelSEED/ModelSEEDpy.git From 899e093b786b5fcd0d4336ad1fd475955d54f130 Mon Sep 17 00:00:00 2001 From: jplfaria Date: Sat, 20 Jul 2024 05:40:37 +0000 Subject: [PATCH 256/298] Add pigment and carbohydrate biomass categories --- modelseedpy/core/mstemplate.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 49fd98c3..3144c43e 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -529,6 +529,8 @@ def __init__( lipid, cellwall, cofactor, + pigment, + carbohydrate, energy, other, ): @@ -543,6 +545,8 @@ def __init__( :param lipid:float :param cellwall:float :param cofactor:float + :param pigment:float + :param carbohydrate:float :param energy:float :param other:float """ @@ -555,6 +559,8 @@ def __init__( self.lipid = lipid self.cellwall = cellwall self.cofactor = cofactor + self.pigment = pigment + self.carbohydrate = carbohydrate self.energy = energy self.other = other self.templateBiomassComponents = DictList() @@ -573,6 +579,8 @@ def from_table( lipid, cellwall, cofactor, + pigment, + carbohydrate, energy, other, ): @@ -586,6 +594,8 @@ def from_table( lipid, cellwall, cofactor, + pigment, + carbohydrate, energy, other, ) @@ -633,6 +643,8 @@ def from_dict(d, template): d["lipid"], d["cellwall"], d["cofactor"], + d["pigment"], + d["carbohydrate"], d["energy"], d["other"], ) @@ -689,6 +701,8 @@ def get_or_create_reaction(self, model, baseid, compartment=None, index=None): def build_biomass(self, model, index="0", classic=False, GC=0.5, add_to_model=True): types = [ "cofactor", + "pigment", + "carbohydrate", "lipid", "cellwall", "protein", @@ -699,6 +713,8 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5, add_to_model=Tr ] type_abundances = { "cofactor": self.cofactor, + "pigment": self.pigment, + "carbohydrate": self.carbohydrate, "lipid": self.lipid, "cellwall": self.cellwall, "protein": self.protein, @@ -876,6 +892,8 @@ def get_data(self): "lipid": self.lipid, "cellwall": self.cellwall, "cofactor": self.cofactor, + "pigment": self.pigment, + "carbohydrate": self.carbohydrate, "energy": self.energy, "other": self.other, "templateBiomassComponents": [], @@ -1122,6 +1140,8 @@ def overwrite_biomass_from_table( lipid, cellwall, cofactor, + pigment, + carbohydrate, energy, other, ): @@ -1139,6 +1159,8 @@ def overwrite_biomass_from_table( lipid, cellwall, cofactor, + pigment, + carbohydrate, energy, other, ) From 213fe4e4f97c536c46774c6bd7cc781ceb4af9a0 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 6 Aug 2024 12:22:12 -0500 Subject: [PATCH 257/298] Checking in various code updates from recent project work. --- modelseedpy/core/msensemble.py | 62 +++++++++++++++++--------- modelseedpy/core/msgapfill.py | 0 modelseedpy/core/msgrowthphenotypes.py | 7 +-- modelseedpy/core/msmodel.py | 3 -- modelseedpy/core/msmodelutl.py | 5 +++ modelseedpy/core/rpcclient.py | 0 6 files changed, 51 insertions(+), 26 deletions(-) mode change 100644 => 100755 modelseedpy/core/msensemble.py mode change 100644 => 100755 modelseedpy/core/msgapfill.py mode change 100644 => 100755 modelseedpy/core/msgrowthphenotypes.py mode change 100644 => 100755 modelseedpy/core/msmodel.py mode change 100644 => 100755 modelseedpy/core/msmodelutl.py mode change 100644 => 100755 modelseedpy/core/rpcclient.py diff --git a/modelseedpy/core/msensemble.py b/modelseedpy/core/msensemble.py old mode 100644 new mode 100755 index 2c212ce0..e8f8e70c --- a/modelseedpy/core/msensemble.py +++ b/modelseedpy/core/msensemble.py @@ -42,7 +42,7 @@ def from_annotation(model_or_mdlutl,reaction_probability_hash,sample_count=100): ensemble = MSEnsemble(mdlutl) ensemble.build_ensemble(reaction_probability_hash, gpr_level_sampling, sample_count) - def __init__(self,model_or_mdlutl): + def __init__(self,model_or_mdlutl,reaction_probabilities=None): # Discerning input is model or mdlutl and setting internal links if isinstance(model_or_mdlutl, MSModelUtil): self.model = model_or_mdlutl.model @@ -50,12 +50,12 @@ def __init__(self,model_or_mdlutl): else: self.model = model_or_mdlutl self.mdlutl = MSModelUtil.get(model_or_mdlutl) - self.data = { - "size": self.size, - "reactions": {} - } attributes = self.mdlutl.get_attributes() if "ensemble" not in attributes: + self.data = { + "size": 0, + "reactions": {} + } for rxn in self.model.reactions: self.data["reactions"][rxn.id] = { "presence": "", @@ -66,10 +66,32 @@ def __init__(self,model_or_mdlutl): self.data["reactions"][rxn.id]["genes"][gene.id] = { "presence": "" } + if reaction_probabilities: + self.reset_reaction_probabilities(reaction_probabilities) logger.warning("Input model is not an ensemble model. You will need to run build_ensemble() to create an ensemble model.") else: self.data = attributes["ensemble"] + def reset_reaction_probabilities(self,reaction_probability_hash,clear_existing=False): + #clear_existing: if true, clear existing probabilities before setting new ones + if clear_existing: + for rxnid in self.data["reactions"]: + self.data["reactions"][rxnid]["probability"] = 0 + for geneid in self.data["reactions"][rxnid]["genes"]: + self.data["reactions"][rxnid]["genes"][geneid]["probability"] = 0 + #Overwriting reaction probabilities from input hash + for rxnid in reaction_probability_hash: + if rxnid in self.model.reactions: + rxnobj = self.model.reactions.get_by_id(rxnid) + if rxnid not in self.data["reactions"]: + self.data["reactions"][rxnid] = {"presence":"","genes":{}} + if "probability" in reaction_probability_hash[rxnid]: + self.data["reactions"][rxnid]["probability"] = reaction_probability_hash[rxnid]["probability"] + if "genes" in reaction_probability_hash[rxnid]: + for geneid in reaction_probability_hash[rxnid]["genes"]: + #if geneid in rxnobj.genes: + self.data["reactions"][rxnid]["genes"][geneid] = {"presence":"","probability":reaction_probability_hash[rxnid]["genes"][geneid]} + def rebuild_from_models(self,models):#DONE #Clearing existing data self.data["ATP_analysis"] = {"core_atp_gapfilling":{},"selected_media":{},"tests":{}} @@ -135,7 +157,11 @@ def rebuild_from_models(self,models):#DONE if "probabilty" not in self.ensemble_data["reactions"][rxnid]["genes"][geneid]: self.ensemble_data["reactions"][rxnid]["genes"][geneid]["probabilty"] = self.ensemble_data["reactions"][rxnid]["genes"][geneid]["presence"].count('1')/len(self.ensemble_data["reactions"][rxnid]["genes"][geneid]["presence"]) - def sample_from_probabilities(self,from_reaction_probabilities=False,sample_count=1000): + def sample_from_probabilities(self,reaction_probabilities=None,from_reaction_probabilities=False,sample_count=1000): + #Overwriting reaction probabilities if provided + if reaction_probabilities: + self.reset_reaction_probabilities(reaction_probabilities) + self.data["size"] = sample_count #Scrolling through ensemble data with probabilities for rxnid in self.data["reactions"]: if "probability" not in self.data["reactions"][rxnid]: @@ -158,22 +184,18 @@ def sample_from_probabilities(self,from_reaction_probabilities=False,sample_coun self.data["reactions"][rxnid]["genes"][gene.id]["presence"] = "" #Sampling from probabilities for i in range(sample_count): - if from_reaction_probabilities: - for rxnid in self.data["reactions"]: - if random.uniform(0,1) < self.data["reactions"][rxnid]["probability"]: - self.data["reactions"][rxnid]["presence"] += "1" - else: - self.data["reactions"][rxnid]["presence"] += "0" - for geneid in self.data["reactions"][rxnid]["genes"]: - self.data["reactions"][rxnid]["genes"][geneid]["presence"] += "1" - else: + for rxnid in self.data["reactions"]: present = False - for geneid in self.data["reactions"][rxnid]["genes"]: - if random.uniform(0,1) < self.data["reactions"][rxnid]["genes"][geneid]["probability"]: + if from_reaction_probabilities or len(self.data["reactions"][rxnid]["genes"]) == 0: + if random.uniform(0,1) < self.data["reactions"][rxnid]["probability"]: present = True - self.data["reactions"][rxnid]["genes"][geneid]["presence"] += "1" - else: - self.data["reactions"][rxnid]["genes"][geneid]["presence"] += "0" + else: + for geneid in self.data["reactions"][rxnid]["genes"]: + if random.uniform(0,1) < self.data["reactions"][rxnid]["genes"][geneid]["probability"]: + present = True + self.data["reactions"][rxnid]["genes"][geneid]["presence"] += "1" + else: + self.data["reactions"][rxnid]["genes"][geneid]["presence"] += "0" if present: self.data["reactions"][rxnid]["presence"] += "1" else: diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py old mode 100644 new mode 100755 diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py old mode 100644 new mode 100755 index 8a4ab47f..986eb72e --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -335,7 +335,7 @@ def from_kbase_object( for added_cpd in pheno["additionalcompound_refs"]: added_compounds.append(added_cpd.split("/").pop()) newpheno = MSGrowthPhenotype( - media.info.id, media, pheno["NormalizedObjective"], geneko, added_compounds + media.info.id, media, pheno["normalizedGrowth"], geneko, added_compounds ) new_phenos.append(newpheno) growthpheno.add_phenotypes(new_phenos) @@ -473,7 +473,8 @@ def simulate_phenotypes( msgapfill=None, test_conditions=None, ignore_experimental_data=False, - flux_coefficients=None + flux_coefficients=None, + recall_phenotypes=True ): """Simulates all the specified phenotype conditions and saves results Parameters @@ -575,7 +576,7 @@ def simulate_phenotypes( summary["Count"][0] = summary["Count"][0] / totalcount sdf = pd.DataFrame(summary) df = pd.DataFrame(data) - #self.adjust_phenotype_calls(df) + self.adjust_phenotype_calls(df) return {"details": df, "summary": sdf,"data":datahash} def adjust_phenotype_calls(self,data,baseline_objective=0.01): diff --git a/modelseedpy/core/msmodel.py b/modelseedpy/core/msmodel.py old mode 100644 new mode 100755 index c6634fd3..5c38e501 --- a/modelseedpy/core/msmodel.py +++ b/modelseedpy/core/msmodel.py @@ -3,9 +3,6 @@ import re import traceback from cobra.core import Model -from pyeda.inter import ( - expr, -) # wheels must be specially downloaded and installed for Windows https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyeda logger = logging.getLogger(__name__) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py old mode 100644 new mode 100755 index 014cd616..84a3fb21 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -98,6 +98,11 @@ def get(model, create_if_missing=True): else: return None + @staticmethod + def from_cobrapy_json(filename): + model = cobra.io.load_json_model(filename) + return MSModelUtil(model) + @staticmethod def build_from_kbase_json_file(filename, kbaseapi): """ diff --git a/modelseedpy/core/rpcclient.py b/modelseedpy/core/rpcclient.py old mode 100644 new mode 100755 From ff94ce1803ae615f1e12a1b0d190411d81dfc46e Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Tue, 3 Sep 2024 22:50:32 -0500 Subject: [PATCH 258/298] genome --- modelseedpy/core/msatpcorrection.py | 55 +++++++++-------------------- modelseedpy/core/msgenome.py | 10 +----- setup.py | 1 + 3 files changed, 18 insertions(+), 48 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index 083fc719..bcbc9ccb 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -1,20 +1,7 @@ # -*- coding: utf-8 -*- import logging -import cobra -import copy import json -import time import pandas as pd -from os.path import abspath as _abspath -from os.path import dirname as _dirname -from optlang.symbolics import Zero, add -from modelseedpy.core.rast_client import RastClient -from modelseedpy.core.msgenome import normalize_role -from modelseedpy.core.msmodel import ( - get_gpr_string, - get_reaction_constraints_from_direction, -) -from cobra.core import Gene, Metabolite, Model, Reaction from modelseedpy.core.msmodelutl import MSModelUtil from modelseedpy.core.mstemplate import MSTemplateBuilder from modelseedpy.core import FBAHelper, MSGapfill, MSMedia @@ -22,11 +9,6 @@ from modelseedpy.helpers import get_template logger = logging.getLogger(__name__) -logger.setLevel( - logging.INFO -) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO - -_path = _dirname(_abspath(__file__)) min_gap = { "Glc.O2": 5, @@ -90,12 +72,6 @@ def __init__( self.modelutl = MSModelUtil.get(model_or_mdlutl) # Setting atpcorrection attribute in model utl so link is bidirectional self.modelutl.atputl = self - - if default_media_path: - self.default_media_path = default_media_path - else: - self.default_media_path = _path + "/../data/atp_medias.tsv" - self.compartment = compartment if atp_hydrolysis_id and atp_hydrolysis_id in self.model.reactions: @@ -106,21 +82,18 @@ def __init__( self.media_hash = {} self.atp_medias = [] + if load_default_medias: - self.load_default_medias() + self.load_default_medias(default_media_path) media_ids = set() - for media in atp_medias: - if isinstance(media, list): - if media[0].id in media_ids: - raise ValueError("media ids not unique") - media_ids.add(media[0].id) - self.atp_medias.append(media) - else: - if media.id in media_ids: - raise ValueError("media ids not unique") - media_ids.add(media.id) - self.atp_medias.append([media, 0.01]) + for media_or_list in atp_medias: + media = media_or_list[0] if isinstance(media_or_list, list) else media_or_list + min_obj = media_or_list[1] if isinstance(media_or_list, list) else 0.01 + if media.id in media_ids: + raise ValueError("media ids not unique") + media_ids.add(media.id) + self.atp_medias.append((media, min_obj)) self.media_hash[media.id] = media if "empty" not in self.media_hash: media = MSMedia.from_dict({}) @@ -164,8 +137,12 @@ def load_default_template(self): get_template("template_core"), None ).build() - def load_default_medias(self): - filename = self.default_media_path + def load_default_medias(self, default_media_path=None): + if default_media_path is None: + import os.path as _path + current_file_path = _path.dirname(_path.abspath(__file__)) + default_media_path = f"{current_file_path}/../data/atp_medias.tsv" + filename = default_media_path medias = pd.read_csv(filename, sep="\t", index_col=0).to_dict() for media_id in medias: media_d = {} @@ -179,7 +156,7 @@ def load_default_medias(self): media.id = media_id media.name = media_id min_obj = 0.01 - self.atp_medias.append([media, min_gap.get(media_d, min_obj)]) + self.atp_medias.append((media, min_gap.get(media_d, min_obj))) @staticmethod def find_reaction_in_template(model_reaction, template, compartment): diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index 99790484..86063cc2 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -160,15 +160,7 @@ def add_features(self, feature_list: list): self.features += feature_list @staticmethod - def from_fasta( - filename, contigs=0, split="|", h_func=None - ): # !!! the contigs argument is never used - genome = MSGenome() - genome.features += read_fasta(filename, split, h_func) - return genome - - @staticmethod - def from_fasta2(filename, split=" ", h_func=None): + def from_fasta(filename, split=" ", h_func=None): genome = MSGenome() genome.features += read_fasta2(filename, split, h_func) return genome diff --git a/setup.py b/setup.py index 97e79dfd..17f6e136 100644 --- a/setup.py +++ b/setup.py @@ -35,6 +35,7 @@ install_requires=[ "networkx >= 2.4", "cobra >= 0.29.0", + "pandas >= 2.2.2", "scikit-learn == 1.2.0", # version lock for pickle ML models "scipy >= 1.5.4", "chemicals >= 1.0.13", From 2961bfb4e74767cb67914dc7215cefc0d220897f Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Thu, 26 Sep 2024 12:04:53 -0500 Subject: [PATCH 259/298] reaction pathways --- modelseedpy/biochem/modelseed_biochem.py | 1 + modelseedpy/biochem/modelseed_reaction.py | 3 +++ 2 files changed, 4 insertions(+) diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index 439becb0..c970222a 100644 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -357,6 +357,7 @@ def _load_reactions( None, o.get("status"), o.get("source"), + pathways=o.get('pathways') ) rxn.add_metabolites(reaction_metabolites) if rxn.id in aliases: diff --git a/modelseedpy/biochem/modelseed_reaction.py b/modelseedpy/biochem/modelseed_reaction.py index d0e3b050..5b828c55 100644 --- a/modelseedpy/biochem/modelseed_reaction.py +++ b/modelseedpy/biochem/modelseed_reaction.py @@ -134,6 +134,7 @@ def __init__( status=None, source=None, flags=None, + pathways=None ): super().__init__(rxn_id, name, subsystem, lower_bound, upper_bound) @@ -165,6 +166,8 @@ def __init__( if flags: self.flags |= set(flags) + self.pathways = pathways + @property def compound_ids(self): return None From 67957d367fe0524969855dd618bf9eb20ccf8fe1 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Thu, 26 Sep 2024 12:05:47 -0500 Subject: [PATCH 260/298] black --- modelseedpy/biochem/modelseed_biochem.py | 2 +- modelseedpy/biochem/modelseed_reaction.py | 2 +- modelseedpy/core/msatpcorrection.py | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/modelseedpy/biochem/modelseed_biochem.py b/modelseedpy/biochem/modelseed_biochem.py index c970222a..634a97ba 100644 --- a/modelseedpy/biochem/modelseed_biochem.py +++ b/modelseedpy/biochem/modelseed_biochem.py @@ -357,7 +357,7 @@ def _load_reactions( None, o.get("status"), o.get("source"), - pathways=o.get('pathways') + pathways=o.get("pathways"), ) rxn.add_metabolites(reaction_metabolites) if rxn.id in aliases: diff --git a/modelseedpy/biochem/modelseed_reaction.py b/modelseedpy/biochem/modelseed_reaction.py index 5b828c55..04b5e086 100644 --- a/modelseedpy/biochem/modelseed_reaction.py +++ b/modelseedpy/biochem/modelseed_reaction.py @@ -134,7 +134,7 @@ def __init__( status=None, source=None, flags=None, - pathways=None + pathways=None, ): super().__init__(rxn_id, name, subsystem, lower_bound, upper_bound) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index bcbc9ccb..448580ea 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -88,7 +88,9 @@ def __init__( media_ids = set() for media_or_list in atp_medias: - media = media_or_list[0] if isinstance(media_or_list, list) else media_or_list + media = ( + media_or_list[0] if isinstance(media_or_list, list) else media_or_list + ) min_obj = media_or_list[1] if isinstance(media_or_list, list) else 0.01 if media.id in media_ids: raise ValueError("media ids not unique") @@ -140,6 +142,7 @@ def load_default_template(self): def load_default_medias(self, default_media_path=None): if default_media_path is None: import os.path as _path + current_file_path = _path.dirname(_path.abspath(__file__)) default_media_path = f"{current_file_path}/../data/atp_medias.tsv" filename = default_media_path From 0e84a2b3f0c6eb0a41cc5d26c226a3b44f163560 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 7 Oct 2024 23:53:07 -0500 Subject: [PATCH 261/298] Fixes for expression fba and ATP --- modelseedpy/__init__.py | 2 + modelseedpy/config.cfg | 2 +- modelseedpy/core/msatpcorrection.py | 11 +- modelseedpy/core/msensemble.py | 1 + modelseedpy/core/msgapfill.py | 4 +- modelseedpy/core/msgenome.py | 2 +- modelseedpy/core/msmodelutl.py | 530 +++++++++++++++++- modelseedpy/fbapkg/__init__.py | 2 + modelseedpy/fbapkg/expressionactivationpkg.py | 49 ++ modelseedpy/fbapkg/fluxfittingpkg.py | 9 +- modelseedpy/fbapkg/gapfillingpkg.py | 7 +- modelseedpy/fbapkg/proteomefittingpkg.py | 6 +- modelseedpy/fbapkg/reactionactivationpkg.py | 66 +++ modelseedpy/multiomics/msexpression.py | 98 ++-- 14 files changed, 724 insertions(+), 65 deletions(-) create mode 100644 modelseedpy/fbapkg/expressionactivationpkg.py mode change 100644 => 100755 modelseedpy/fbapkg/fluxfittingpkg.py create mode 100644 modelseedpy/fbapkg/reactionactivationpkg.py diff --git a/modelseedpy/__init__.py b/modelseedpy/__init__.py index 74ea066b..981165c5 100644 --- a/modelseedpy/__init__.py +++ b/modelseedpy/__init__.py @@ -73,6 +73,8 @@ ObjConstPkg, ChangeOptPkg, ElementUptakePkg, + ReactionActivationPkg, + ExpressionActivationPkg ) from modelseedpy.multiomics import MSExpression diff --git a/modelseedpy/config.cfg b/modelseedpy/config.cfg index e9be1382..11df18bb 100644 --- a/modelseedpy/config.cfg +++ b/modelseedpy/config.cfg @@ -1,5 +1,5 @@ [biochem] -path = data/ModelSEEDDatabase +path = /Users/chenry/code/ModelSEEDDatabase [data] template_folder = data/templates classifier_folder = data/ml diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index f9373bef..ca85e866 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -53,7 +53,6 @@ "default": 1.2, } - class MSATPCorrection: DEBUG = False @@ -477,6 +476,16 @@ def expand_model_to_genome_scale(self): self.model.remove_reactions([item[0]]) # Restoring other compartment reactions but not the core because this would undo reaction filtering self.restore_noncore_reactions(noncore=False, othercompartment=True) + # Setting core model attribute in model + core_reactions = [] + for reaction in self.model.reactions: + # check if reaction is in core template + template_reaction = self.find_reaction_in_template( + reaction, self.coretemplate, self.compartment[0:1] + ) + if template_reaction is not None: + core_reactions.append(reaction.id) + self.modelutl.save_attributes(core_reactions, "core_reactions") def restore_noncore_reactions(self, noncore=True, othercompartment=True): """ diff --git a/modelseedpy/core/msensemble.py b/modelseedpy/core/msensemble.py index e8f8e70c..6b1aac37 100755 --- a/modelseedpy/core/msensemble.py +++ b/modelseedpy/core/msensemble.py @@ -200,6 +200,7 @@ def sample_from_probabilities(self,reaction_probabilities=None,from_reaction_pro self.data["reactions"][rxnid]["presence"] += "1" else: self.data["reactions"][rxnid]["presence"] += "0" + def unpack_models(self,model_list=None): output_models = [None]*self.size diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 84f36d34..425509c0 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -152,7 +152,7 @@ def test_gapfill_database(self, media, target=None, before_filtering=True): ) return False - def prefilter(self,test_conditions=None,growth_conditions=[],use_prior_filtering=True,base_filter_only=False): + def prefilter(self,test_conditions=None,growth_conditions=[],use_prior_filtering=False,base_filter_only=False): """Prefilters the database by removing any reactions that break specified ATP tests Parameters ---------- @@ -714,7 +714,7 @@ def integrate_gapfill_solution( #elif not remove_unneeded_reactions: # cumulative_solution.append(item) logger.info(f"Unneeded: {str(unneeded)}") - logger.info(f"Cumulative: {str(cumulative_gapfilling)}") + logger.info(f"Cumulative: {str(self.cumulative_gapfilling)}") #Checking that the final integrated model grows if check_for_growth: self.mdlutl.pkgmgr.getpkg("KBaseMediaPkg").build_package(solution["media"]) diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index bcef005d..1f90b96a 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -54,7 +54,7 @@ def parse_fasta_str(faa_str, split=DEFAULT_SPLIT, h_func=None): class MSFeature: - def __init__(self, feature_id, sequence, description=None, aliases=None): + def __init__(self, feature_id, sequence, description=None, aliases=[]): """ @param feature_id: identifier for the protein coding feature diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 84a3fb21..e21cdeb0 100755 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -8,6 +8,7 @@ import cobra from cobra import Model, Reaction, Metabolite from optlang.symbolics import Zero +from cobra.flux_analysis import pfba from modelseedpy.fbapkg.mspackagemanager import MSPackageManager from modelseedpy.biochem.modelseed_biochem import ModelSEEDBiochem from modelseedpy.core.fbahelper import FBAHelper @@ -20,6 +21,256 @@ logging.INFO ) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO +core_rxns = { + "rxn00994_c0": "<", + "rxn00151_c0": ">", + "rxn24606_c0": ">", + "rxn00161_c0": ">", + "rxn14426_c0": ">", + "rxn00762_c0": "=", + "rxn05145_c0": ">", + "rxn00871_c0": ">", + "rxn01236_c0": "<", + "rxn05226_c0": ">", + "rxn01116_c0": "=", + "rxn00251_c0": "=", + "rxn05602_c0": "=", + "rxn09001_c0": ">", + "rxn00995_c0": ">", + "rxn14419_c0": ">", + "rxn14420_c0": ">", + "rxn24607_c0": "=", + "rxn00324_c0": "<", + "rxn01334_c0": "=", + "rxn05209_c0": "=", + "rxn00611_c0": "=", + "rxn00544_c0": "<", + "rxn01121_c0": ">", + "rxn03249_c0": "=", + "rxn00392_c0": "=", + "rxn05581_c0": "=", + "rxn00990_c0": ">", + "rxn00985_c0": "=", + "sul00004_c0": "=", + "rxn00160_c0": ">", + "rxn00615_c0": ">", + "rxn09003_c0": ">", + "rxn00083_c0": ">", + "rxn05493_c0": "=", + "rxn00248_c0": "=", + "rxn00678_c0": "=", + "rxn00558_c0": "=", + "rxn02376_c0": "=", + "rxn24608_c0": ">", + "rxn14424_c0": ">", + "rxn09174_c0": "=", + "rxn03250_c0": "=", + "rxn00162_c0": ">", + "rxn00549_c0": ">", + "rxn00779_c0": ">", + "rxn05573_c0": ">", + "rxn00506_c0": ">", + "rxn14425_c0": ">", + "rxn01872_c0": "=", + "rxn01996_c0": "=", + "rxn00507_c0": ">", + "rxn08528_c0": "=", + "rxn24609_c0": "=", + "rxn03884_c0": ">", + "rxn05488_c0": "=", + "rxn03079_c0": "=", + "rxn24610_c0": "=", + "rxn00178_c0": ">", + "rxn08793_c0": ">", + "rxn01130_c0": ">", + "rxn00512_c0": "<", + "rxn08355_c0": ">", + "rxn02342_c0": ">", + "rxn02314_c0": "=", + "rxn39373_c0": "=", + "rxn31759_c0": "=", + "rxn11937_c0": "<", + "rxn46184_c0": "=", + "rxn01123_c0": ">", + "rxn14421_c0": ">", + "rxn00379_c0": ">", + "rxn08734_c0": ">", + "rxn00668_c0": "=", + "rxn14418_c0": ">", + "rxn10570_c0": "=", + "rxn05553_c0": ">", + "rxn09295_c0": ">", + "rxn05759_c0": "=", + "rxn01343_c0": ">", + "rxn00545_c0": ">", + "rxn00250_c0": "=", + "rxn00785_c0": "=", + "rxn00305_c0": ">", + "rxn01387_c0": "=", + "rxn00974_c0": "=", + "rxn00604_c0": ">", + "rxn00875_c0": ">", + "rxn05528_c0": ">", + "rxn00623_c0": "<", + "rxn13974_c0": "<", + "rxn00770_c0": "=", + "rxn08900_c0": ">", + "rxn05468_c0": ">", + "rxn00199_c0": ">", + "rxn00499_c0": "=", + "rxn06493_c0": "=", + "rxn01275_c0": ">", + "rxn14412_c0": ">", + "rxn01106_c0": "=", + "rxn08428_c0": "=", + "rxn00777_c0": "=", + "rxn03644_c0": "=", + "rxn14414_c0": ">", + "rxn01480_c0": "=", + "rxn06526_c0": "=", + "rxn00543_c0": "=", + "rxn01115_c0": ">", + "rxn01870_c0": "=", + "rxn00677_c0": "=", + "rxn00799_c0": "=", + "rxn08975_c0": ">", + "rxn03240_c0": "=", + "rxn05312_c0": "<", + "rxn08558_c0": ">", + "sul00008_c0": ">", + "rxn01187_c0": ">", + "rxn00171_c0": "=", + "rxn15383_c0": ">", + "rxn00224_c0": "=", + "rxn03127_c0": "=", + "rxn01834_c0": "=", + "rxn24613_c0": "=", + "rxn14428_c0": "<", + "rxn08689_c0": "=", + "rxn02527_c0": ">", + "rxn00336_c0": ">", + "rxn05040_c0": ">", + "rxn08783_c0": ">", + "rxn14427_c0": ">", + "rxn00616_c0": "=", + "rxn05313_c0": ">", + "rxn03020_c0": "=", + "rxn11322_c0": "=", + "rxn00206_c0": "<", + "rxn09167_c0": ">", + "rxn10122_c0": ">", + "rxn00763_c0": "=", + "rxn06299_c0": "=", + "rxn05561_c0": "=", + "rxn08966_c0": "=", + "rxn10471_c0": "=", + "rxn15962_c0": "<", + "rxn00786_c0": "=", + "rxn00157_c0": "<", + "rxn00216_c0": "=", + "rxn00077_c0": "=", + "rxn01241_c0": "=", + "rxn01100_c0": "=", + "rxn00748_c0": ">", + "rxn00935_c0": "=", + "rxn00548_c0": "=", + "rxn08557_c0": ">", + "rxn05466_c0": "=", + "rxn08655_c0": ">", + "rxn00441_c0": ">", + "rxn01476_c0": ">", + "rxn02168_c0": "=", + "rxn00569_c0": "<", + "rxn17445_c0": ">", + "rxn01274_c0": ">", + "rxn00006_c0": "<", + "rxn08792_c0": ">", + "rxn08691_c0": "=", + "sul00003_c0": "=", + "rxn04794_c0": "=", + "rxn00568_c0": "<", + "rxn00225_c0": "=", + "rxn09318_c0": "=", + "rxn01057_c0": "=", + "rxn00247_c0": ">", + "rxn00285_c0": "=", + "rxn09004_c0": "=", + "rxn24612_c0": "=", + "rxn00371_c0": ">", + "rxn00159_c0": ">", + "rxn01333_c0": "=", + "rxn01388_c0": "=", + "rxn02480_c0": "=", + "rxn02167_c0": ">", + "rxn08971_c0": ">", + "rxn00612_c0": "=", + "rxn01806_c0": ">", + "rxn00148_c0": "<", + "rxn00122_c0": ">", + "rxn05469_c0": "=", + "rxn00265_c0": ">", + "rxn00330_c0": "<", + "rxn00602_c0": "<", + "rxn08179_c0": ">", + "rxn09269_c0": ">", + "rxn01200_c0": "=", + "rxn08556_c0": ">", + "rxn05627_c0": ">", + "rxn08656_c0": ">", + "rxn00097_c0": "=", + "rxn05319_c0": "=", + "rxn03085_c0": "=", + "rxn08178_c0": ">", + "rxn00747_c0": "=", + "rxn05559_c0": "=", + "rxn09314_c0": ">", + "rxn15961_c0": "=", + "rxn08976_c0": ">", + "rxn00172_c0": "<", + "rxn00868_c0": "<", + "rxn08173_c0": "=", + "rxn00102_c0": "=", + "rxn09272_c0": ">", + "rxn03126_c0": "=", + "sul00002_c0": "=", + "rxn01871_c0": "<", + "rxn00500_c0": "=", + "rxn00175_c0": ">", + "rxn00459_c0": "=", + "rxn24611_c0": "=", + "rxn09008_c0": "=", + "rxn00173_c0": "=", + "rxn33011_c0": "=", + "rxn08901_c0": ">", + "rxn00782_c0": "<", + "rxn03643_c0": "=", + "rxn08527_c0": "=", + "rxn00869_c0": "<", + "rxn05651_c0": "=", + "rxn10126_c0": ">", + "rxn00874_c0": "=", + "rxn10577_c0": ">", + "rxn00001_c0": ">", + "sul00010_c0": ">", + "rxn05625_c0": "=", + "rxn00670_c0": "=", + "rxn00147_c0": ">", + "rxn00288_c0": ">", + "rxn06777_c0": "=", + "rxn01452_c0": "<", + "rxn08518_c0": ">", + "rxn14422_c0": ">", + "rxn01477_c0": ">", + "rxn08350_c0": "=", + "rxn00256_c0": "<", + "rxn08977_c0": ">", + "rxn00781_c0": "=", + "rxn05467_c0": "=", + "rxn00011_c0": "<", + "rxn39175_c0": "=", + "rxn14423_c0": ">", + "rxn40505_c0": "=" +} class MSModelUtil: mdlutls = {} @@ -97,11 +348,6 @@ def get(model, create_if_missing=True): return MSModelUtil.mdlutls[model] else: return None - - @staticmethod - def from_cobrapy_json(filename): - model = cobra.io.load_json_model(filename) - return MSModelUtil(model) @staticmethod def build_from_kbase_json_file(filename, kbaseapi): @@ -134,6 +380,7 @@ def __init__(self, model): self.integrated_gapfillings = [] self.attributes = {} self.atp_tests = None + self.reliability_scores = None if hasattr(self.model, "computed_attributes"): if self.model.computed_attributes: self.attributes = self.model.computed_attributes @@ -144,6 +391,50 @@ def __init__(self, model): if "fbas" not in self.attributes: self.attributes["fbas"] = {} + ########I/O functions + @staticmethod + def from_cobrapy_json(filename): + model = cobra.io.load_json_model(filename) + return MSModelUtil(model) + + def save_model(self, filename): + """ + Saves the associated cobrapy model to a json file + + Parameters + ---------- + filename: name of the file the model should be saved to + """ + cobra.io.save_json_model(self.model, filename) + + def printlp(self, lpfilename="debug.lp"): + with open(lpfilename, "w") as out: + out.write(str(self.model.solver)) + + def print_solutions(self, solution_hash,filename="reaction_solutions.csv"): + records = [] + for rxn in self.model.reactions: + record = {"id":rxn.id,"name":rxn.name,"equation":rxn.build_reaction_string(use_metabolite_names=True)} + records.append(record) + for key in solution_hash: + record[key] = solution_hash[key].fluxes[rxn.id] + df = pd.DataFrame.from_records(records) + df.to_csv(filename) + + ########FBA utility functions + def set_media(self, media): + """ + Sets the media of the model from a media object or dictionary + + Parameters + ---------- + media: MSMedia object | dict : media object or dictionary with media formulation + """ + if isinstance(media, dict): + from modelseedpy.core.msmedia import MSMedia + media = MSMedia.from_dict(media) + self.pkgmgr.getpkg("KBaseMediaPkg").build_package(media) + ########Functions related to ATP gapfilling method def get_atputl(self,atp_media_filename=None,core_template=None,gapfilling_delta=0,max_gapfilling=0,forced_media=[],remake_atputil=False): """ @@ -233,10 +524,6 @@ def compute_automated_reaction_scores(self): """ self.reaction_scores = {} - def printlp(self, lpfilename="debug.lp"): - with open(lpfilename, "w") as out: - out.write(str(self.model.solver)) - def build_metabolite_hash(self): self.metabolite_hash = {} self.search_metabolite_hash = {} @@ -559,6 +846,110 @@ def add_ms_reaction(self, rxn_dict, compartment_trans=["c0", "e0"]): ################################################################################# # Functions related to utility functions ################################################################################# + def assign_reliability_scores_to_reactions(self): + """Assigns a reliability score to every model reaction which indicates how likely the reaction is to be accurate and to take place + + Returns + ------- + { reaction ID : { reaction direction : score } } + """ + if self.reliability_scores == None: + self.reliability_scores = {} + biochem = ModelSEEDBiochem.get() + for reaction in self.model.reactions: + #Pulling model reaction related data + transported_charge = 0 + for met in reaction.metabolites: + coef = reaction.metabolites[met] + if met.id.split("_")[-1][0:1] == "e": + transported_charge += coef * met.charge + #Pulling ModelSEED Biochemistry related data + msid = MSModelUtil.reaction_msid(reaction) + if msid: + #Penalizing for net transport of ions in the wrong direction + forwardscore = 0 + reversescore = 0 + if transported_charge > 0: + forwardscore += 50*transported_charge + if transported_charge < 0: + reversescore += -50*transported_charge + basescore = 0 + msrxn = biochem.reactions[msid] + #Penalizing for mass imbalance + if msrxn["status"][0:2] == "MI": + basescore = 1000 + #Penalizing for charge imbalance + if msrxn["status"][0:2] == "CI": + basescore = 800 + #Penalizing if no pathways + if msrxn["pathways"] == None: + basescore = 50 + #Penalizing if there is no deltaG + if "deltag" not in msrxn or msrxn["deltag"] == 10000000: + basescore = 200 + else: + #Penalizing in the direction of infeasiblility + if msrxn["deltag"] <= -5: + reversescore += 20 + if msrxn["deltag"] <= -10: + reversescore += 20 + if msrxn["deltag"] >= 5: + forwardscore += 20 + if msrxn["deltag"] >= 10: + forwardscore += 20 + #Penalizing reactions in direction of production of ATP + array = str(msrxn["stoichiometry"]).split(";") + for item in array: + subarray = item.split(":") + if len(subarray) > 1: + if subarray[1] == "cpd00002": + if float(subarray[0]) < 0: + reversescore += 100 + elif float(subarray[0]) > 0: + forwardscore += 100 + #Penalizing if a compound structure is unkown + if subarray[1] in biochem.compounds: + if "inchikey" not in biochem.compounds[subarray[1]] or biochem.compounds[subarray[1]]["inchikey"] == None: + basescore += 40 + if "formula" not in biochem.compounds[subarray[1]] or biochem.compounds[subarray[1]]["formula"] == None: + basescore += 60 + if "deltag" not in biochem.compounds[subarray[1]] or biochem.compounds[subarray[1]]["deltag"] == 10000000: + basescore += 20 + self.reliability_scores[reaction.id] = {} + self.reliability_scores[reaction.id][">"] = basescore+forwardscore + self.reliability_scores[reaction.id]["<"] = basescore+reversescore + elif reaction.id[0:3] == "EX_" or reaction.id[0:3] == "SK_" or reaction.id[0:3] == "DM_" or reaction.id[0:3] == "bio": + self.reliability_scores[reaction.id] = {} + self.reliability_scores[reaction.id][">"] = -10 + self.reliability_scores[reaction.id]["<"] = -10 + else: + self.reliability_scores[reaction.id] = {} + self.reliability_scores[reaction.id][">"] = 1000 + self.reliability_scores[reaction.id]["<"] = 1000 + return self.reliability_scores + + def is_core(self,rxn): + """Indicates if a specified reaction is a core reaction + + Parameters + ---------- + reaction: Raction|string + + Returns + ------- + bool + """ + if not isinstance(rxn, str): + rxn = rxn.id + if "core_reactions" in self.get_attributes(): + print("Using core reactions attribute!") + if rxn in self.get_attributes("core_reactions"): + return True + return False + elif rxn in core_rxns: + return True + return False + def build_model_data_hash(self): data = { "Model": self.id, @@ -984,7 +1375,7 @@ def apply_test_condition(self, condition, model=None): # model.objective.direction = "min" pkgmgr.getpkg("KBaseMediaPkg").build_package(condition["media"]) - def test_single_condition(self, condition, apply_condition=True, model=None): + def test_single_condition(self, condition, apply_condition=True, model=None,report_atp_loop_reactions=False,analyze_failures=True,rxn_list=[]): """Runs a single test condition to determine if objective value on set media exceeds threshold Parameters @@ -1032,6 +1423,14 @@ def test_single_condition(self, condition, apply_condition=True, model=None): return False if value >= condition["threshold"] and condition["is_max_threshold"]: logger.debug("Failed high:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) + if analyze_failures and len(rxn_list) == 1: + #Constraining test objective at failed value + if value > 1000: + value = 1000 + self.model.reactions.get_by_id(condition["objective"]).lower_bound = value + solution = pfba(self.model) + self.analyze_minimal_reaction_set(solution,rxn_list[0][0].id) + self.model.reactions.get_by_id(condition["objective"]).lower_bound = 0 return False elif value <= condition["threshold"] and not condition["is_max_threshold"]: print("Failed low:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) @@ -1040,7 +1439,7 @@ def test_single_condition(self, condition, apply_condition=True, model=None): logger.debug("Passed:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) return True - def test_condition_list(self, condition_list, model=None,positive_growth=[]): + def test_condition_list(self, condition_list, model=None,positive_growth=[],rxn_list=[]): """Runs a set of test conditions to determine if objective values on set medias exceed thresholds Parameters @@ -1061,7 +1460,7 @@ def test_condition_list(self, condition_list, model=None,positive_growth=[]): if model == None: model = self.model for condition in condition_list: - if not self.test_single_condition(condition,apply_condition=True,model=model): + if not self.test_single_condition(condition,apply_condition=True,model=model,rxn_list=rxn_list): return False return True @@ -1138,7 +1537,8 @@ def binary_expansion_test(self, reaction_list, condition, currmodel, depth=0,pos newdepth = depth + 1 filtered_list = [] # First run the full test - if self.test_single_condition(condition,apply_condition=False,model=currmodel): + if self.test_single_condition(condition,apply_condition=False,model=currmodel,rxn_list=reaction_list): + print("Reaction set passed"," ".join(map(str, reaction_list))) return [] # Check if input list contains only one reaction: if len(reaction_list) == 1: @@ -1234,7 +1634,8 @@ def reaction_expansion_test( condition_list, binary_search=True, attribute_label="gf_filter", - positive_growth=[] + positive_growth=[], + resort_by_score=True ): """Adds reactions in reaction list one by one and appplies tests, filtering reactions that fail @@ -1256,6 +1657,11 @@ def reaction_expansion_test( logger.debug(f"Expansion started! Binary = {binary_search}") self.breaking_reaction = None filtered_list = [] + if resort_by_score: + scores = self.assign_reliability_scores_to_reactions() + reaction_list = sorted(reaction_list, key=lambda x: scores[x[0].id][x[1]]) + for item in reaction_list: + print(item[0].id+":"+item[1]+":"+str(scores[item[0].id][item[1]])) for condition in condition_list: logger.debug(f"testing condition {condition}") currmodel = self.model @@ -1350,6 +1756,102 @@ def reaction_expansion_test( ][item[0].id][item[1]] = item[2] return filtered_list + ################################################################################# + # Functions for reaction set analysis + ################################################################################# + def analyze_minimal_reaction_set(self,solution,label,print_output=True): + """Systematically exploring alternative options for each reaction in an input minimal reaction set + + Parameters + ---------- + reaction_set : list + List of reactions to be evaluated for alternative options + print_output : bool + Prints output to stdout if true + + Returns + ------- + {obj reaction: list >} : list of reactions pointing to their alternative options + + Raises + ------ + """ + #Determining reaction set as the set of currently active reactions in the input solution + reaction_set = [] + output = {} + original_objective = self.model.objective + minimal_deviation_objective = self.model.problem.Objective(0, direction="min") + initial_zero_reactions = {} + obj_coef = dict() + scores = self.assign_reliability_scores_to_reactions() + for rxn in self.model.reactions: + if abs(solution.fluxes[rxn.id]) < 0.000000001: + initial_zero_reactions[rxn.id] = {">":True,"<":True} + obj_coef[rxn.forward_variable] = 1 + obj_coef[rxn.reverse_variable] = 1 + elif solution.fluxes[rxn.id] > 0.000000001 and rxn.lower_bound <= 0: + output[rxn.id] = [">",[]] + reaction_set.append([rxn,">",solution.fluxes[rxn.id],scores[rxn.id][">"],self.is_core(rxn)]) + initial_zero_reactions[rxn.id] = {"<":True} + obj_coef[rxn.reverse_variable] = 1 + elif solution.fluxes[rxn.id] < -0.000000001 and rxn.upper_bound >= 0: + output[rxn.id] = ["<",[]] + reaction_set.append([rxn,"<",solution.fluxes[rxn.id],scores[rxn.id]["<"],self.is_core(rxn)]) + initial_zero_reactions[rxn.id] = {">":True} + obj_coef[rxn.forward_variable] = 1 + self.model.objective = minimal_deviation_objective + minimal_deviation_objective.set_linear_coefficients(obj_coef) + #Knocking reactions out one at a time and checking for alternative options + for item in reaction_set: + original_bound = None + if item[1] == ">": + original_bound = item[0].upper_bound + item[0].upper_bound = 0 + else: + original_bound = item[0].lower_bound + item[0].lower_bound = 0 + new_solution = self.model.optimize() + result = {"alternatives":[],"coupled":[],"failed":False,"flux":item[2],"score":item[3],"core":item[4]} + output[item[0].id][1].append(result) + if new_solution.status == "optimal": + for secitem in reaction_set: + if secitem != item: + if abs(new_solution.fluxes[secitem[0].id]) < 0.000000001: + result["coupled"].append(secitem) + for rxn in self.model.reactions: + if rxn.id in initial_zero_reactions and abs(new_solution.fluxes[rxn.id]) > 0.000000001: + if new_solution.fluxes[rxn.id] > 0.000000001 and ">" in initial_zero_reactions[rxn.id]: + result["alternatives"].append([rxn,">"]) + elif new_solution.fluxes[rxn.id] < -0.000000001 and "<" in initial_zero_reactions[rxn.id]: + result["alternatives"].append([rxn,"<"]) + else: + result["failed"] = True + if original_bound != None: + if item[1] == ">": + item[0].upper_bound = original_bound + else: + item[0].lower_bound = original_bound + + self.model.objective = original_objective + #Printing output if requested + if print_output: + records = [] + for rxnid in output: + item = output[rxnid] + record = {"id":rxnid,"direction":item[0],"flux":item[1][0]["flux"],"score":item[1][0]["score"],"core":item[1][0]["core"],"equation":self.model.reactions.get_by_id(rxnid).build_reaction_string(use_metabolite_names=True),"coupled":"","alternatives":"","failed":item[1][0]["failed"]} + for subitem in item[1][0]["alternatives"]: + if len(record["alternatives"]): + record["alternatives"] += ";" + record["alternatives"] += subitem[1]+subitem[0].id+":"+subitem[0].build_reaction_string(use_metabolite_names=True) + for subitem in item[1][0]["coupled"]: + if len(record["coupled"]): + record["coupled"] += ";" + record["coupled"] += subitem[1]+subitem[0].id+":"+subitem[0].build_reaction_string(use_metabolite_names=True) + records.append(record) + df = pd.DataFrame.from_records(records) + df.to_csv("nboutput/rxn_analysis/"+label+"-min_rxn_set_analysis.csv",index=False) + return output + ################################################################################# # Functions related to biomass sensitivity analysis ################################################################################# diff --git a/modelseedpy/fbapkg/__init__.py b/modelseedpy/fbapkg/__init__.py index 6f67c85f..9767fa04 100644 --- a/modelseedpy/fbapkg/__init__.py +++ b/modelseedpy/fbapkg/__init__.py @@ -19,3 +19,5 @@ from modelseedpy.fbapkg.objconstpkg import ObjConstPkg from modelseedpy.fbapkg.changeoptpkg import ChangeOptPkg from modelseedpy.fbapkg.elementuptakepkg import ElementUptakePkg +from modelseedpy.fbapkg.expressionactivationpkg import ExpressionActivationPkg +from modelseedpy.fbapkg.reactionactivationpkg import ReactionActivationPkg diff --git a/modelseedpy/fbapkg/expressionactivationpkg.py b/modelseedpy/fbapkg/expressionactivationpkg.py new file mode 100644 index 00000000..04dda4f8 --- /dev/null +++ b/modelseedpy/fbapkg/expressionactivationpkg.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +import logging + +logger = logging.getLogger(__name__) +from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg +from modelseedpy.core.fbahelper import FBAHelper + +# Base class for FBA packages +class ExpressionActivationPkg(BaseFBAPkg): + def __init__(self, model): + BaseFBAPkg.__init__( + self, + model, + "ExpressionActivation", + {}, + {} + ) + self.pkgmgr.addpkgs(["ReactionActivationPkg"]) + + def build_package(self,on_hash,off_hash,on_coeff=None,off_coeff=None,other_coef=0.1,max_value=0.001): + activation_filter = {} + for rxn in on_hash: + activation_filter[rxn] = 1 + self.pkgmgr.getpkg("ReactionActivationPkg").build_package(rxn_filter=activation_filter,max_value=max_value) + expression_objective = self.model.problem.Objective(0, direction="min") + obj_coef = dict() + for rxn in self.model.reactions: + if rxn.id in on_hash: + coef = on_coeff + if coef == None: + coef = on_hash[rxn.id] + obj_coef[self.pkgmgr.getpkg("ReactionActivationPkg").variables["fra"][rxn.id]] = -1*coef + obj_coef[self.pkgmgr.getpkg("ReactionActivationPkg").variables["rra"][rxn.id]] = -1*coef + elif rxn.id in off_hash: + coef = off_coeff + if coef == None: + coef = off_hash[rxn.id] + obj_coef[rxn.forward_variable] = coef + obj_coef[rxn.reverse_variable] = coef + elif rxn.id[0:3] == "bio" or rxn.id[0:3] == "EX_" or rxn.id[0:3] == "SK_" or rxn.id[0:3] == "DM_": + pass + else: + obj_coef[rxn.forward_variable] = other_coef + obj_coef[rxn.reverse_variable] = other_coef + self.model.objective = expression_objective + expression_objective.set_linear_coefficients(obj_coef) + self.parameters["gfobj"] = self.model.objective \ No newline at end of file diff --git a/modelseedpy/fbapkg/fluxfittingpkg.py b/modelseedpy/fbapkg/fluxfittingpkg.py old mode 100644 new mode 100755 index e3e832dc..810f2567 --- a/modelseedpy/fbapkg/fluxfittingpkg.py +++ b/modelseedpy/fbapkg/fluxfittingpkg.py @@ -27,11 +27,10 @@ def build_package(self, parameters): "rescale_vfit_by_flux": True, }, ) - if self.parameters["totalflux"] == 0: + if self.parameters["totalflux"] == 1: self.pkgmgr.getpkg("RevBinPkg", 1).build_package( self.parameters["target_flux"] ) - else: self.pkgmgr.getpkg("TotalFluxPkg", 1).build_package( self.parameters["target_flux"] ) @@ -39,9 +38,7 @@ def build_package(self, parameters): for rxnid in self.parameters["target_flux"]: if rxnid in self.model.reactions: rxnobj = self.model.reactions.get_by_id(rxnid) - var = self.build_variable( - self, "vfit", -1000, 1000, "continuous", rxnobj - ) + var = self.build_variable(rxnobj) objvars.append(var**2) self.build_constraint(rxnobj) if self.parameters["set_objective"] == 1: @@ -51,7 +48,7 @@ def build_package(self, parameters): def build_variable(self, object): return BaseFBAPkg.build_variable( - self, "vfit", -1000, 1000, "continuous", object + self, "vfit", -100000, 100000, "continuous", object ) def build_constraint(self, cobra_obj): diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index c795d327..5dab108b 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -745,7 +745,7 @@ def reset_objective_minimum(self, min_objective,reset_params=True): if min_objective < 0: self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].ub = min_objective - def filter_database_based_on_tests(self,test_conditions,growth_conditions=[],base_filter=None,base_target="rxn00062_c0",base_filter_only=False): + def filter_database_based_on_tests(self,test_conditions,growth_conditions=[],base_filter=None,base_target="rxn00062_c0",base_filter_only=False,all_noncore=True): #Saving the current media current_media = self.current_media() #Clearing element uptake constraints @@ -778,6 +778,11 @@ def filter_database_based_on_tests(self,test_conditions,growth_conditions=[],bas rxnlist.append([reaction, "<"]) if "forward" in self.gapfilling_penalties[reaction.id]: rxnlist.append([reaction, ">"]) + elif all_noncore and not self.modelutl.is_core(reaction): + if reaction.lower_bound < 0: + rxnlist.append([reaction, "<"]) + if reaction.upper_bound > 0: + rxnlist.append([reaction, ">"]) filtered_list = self.modelutl.reaction_expansion_test( rxnlist, test_conditions ) diff --git a/modelseedpy/fbapkg/proteomefittingpkg.py b/modelseedpy/fbapkg/proteomefittingpkg.py index 469efc08..3aedacb5 100644 --- a/modelseedpy/fbapkg/proteomefittingpkg.py +++ b/modelseedpy/fbapkg/proteomefittingpkg.py @@ -7,7 +7,7 @@ from optlang.symbolics import Zero, add from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg from modelseedpy.core.fbahelper import FBAHelper -from modelseedpy.multiomics.msexpression import MSExpression, GENOME, MODEL, COLUMN_NORM +from modelseedpy.multiomics.msexpression import MSExpression # Options for default behavior LOWEST = 10 @@ -45,7 +45,7 @@ def build_package(self, parameters): ) objvars = [] # Converting genome proteome to reaction proteome if necessary - if self.parameters["proteome"].type == GENOME: + if self.parameters["proteome"].type == "genome": self.parameters["proteome"] = self.parameters[ "proteome" ].build_reaction_expression( @@ -123,7 +123,7 @@ def build_constraint(self, object, type): # kvfit(i) = kapp(i)*ProtCoef*Prot(i) - v(i) # Pulling expression value for selected condition and reaction expval = self.parameters["proteome"].get_value( - object.id, self.parameters["condition"], COLUMN_NORM + object.id, self.parameters["condition"], "column_norm" ) if expval is None and self.parameters["default_expression"] is not None: if self.parameters["default_expression"] == LOWEST: diff --git a/modelseedpy/fbapkg/reactionactivationpkg.py b/modelseedpy/fbapkg/reactionactivationpkg.py new file mode 100644 index 00000000..f43bac06 --- /dev/null +++ b/modelseedpy/fbapkg/reactionactivationpkg.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +import logging + +logger = logging.getLogger(__name__) +from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg +from modelseedpy.core.fbahelper import FBAHelper + +# Base class for FBA packages +class ReactionActivationPkg(BaseFBAPkg): + def __init__(self, model): + BaseFBAPkg.__init__( + self, + model, + "ReactionActivation", + {"fra": "reaction", "rra": "reaction"}, + { + "fra": "reaction", + "rra": "reaction" + } + ) + + def build_package(self, rxn_filter=None,max_value=0.001): + self.pkgmgr.getpkg("RevBinPkg").build_package(filter=rxn_filter) + for rxn in self.model.reactions: + # Checking that reaction passes input filter if one is provided + if rxn_filter == None: + self.build_variable(rxn,max_value) + self.build_constraint(rxn) + elif rxn.id in rxn_filter: + self.build_variable(rxn,max_value) + self.build_constraint(rxn) + + def build_variable(self, cobra_obj,max_value): + variable = BaseFBAPkg.build_variable(self, "fra", 0,max_value, "continuous", cobra_obj) + variable = BaseFBAPkg.build_variable(self, "rra", 0,max_value, "continuous", cobra_obj) + return variable + + def build_constraint(self, cobra_obj): + constraint = None + if cobra_obj.id not in self.constraints["fra"]: + constraint = BaseFBAPkg.build_constraint( + self, + "fra", + None, + 0, + { + self.variables["fra"][cobra_obj.id]: 1, + cobra_obj.forward_variable: -1, + }, + cobra_obj, + ) + if cobra_obj.id not in self.constraints["rra"]: + constraint = BaseFBAPkg.build_constraint( + self, + "rra", + None, + 0, + { + self.variables["rra"][cobra_obj.id]: 1, + cobra_obj.reverse_variable: -1 + }, + cobra_obj, + ) + return constraint \ No newline at end of file diff --git a/modelseedpy/multiomics/msexpression.py b/modelseedpy/multiomics/msexpression.py index 02453e34..4fb2b75c 100644 --- a/modelseedpy/multiomics/msexpression.py +++ b/modelseedpy/multiomics/msexpression.py @@ -1,25 +1,18 @@ # -*- coding: utf-8 -*- import logging +import pandas as pd import re import copy from cobra.core.dictlist import DictList -from cobra.core.gene import Gene, ast2str, eval_gpr, parse_gpr +from cobra.core.gene import Gene, ast2str, eval_gpr, parse_gpr, GPR from ast import And, BitAnd, BitOr, BoolOp, Expression, Name, NodeTransformer, Or from modelseedpy.core.msgenome import MSGenome, MSFeature -# Types of expression data -GENOME = 10 -MODEL = 20 - -# Types of normalization -COLUMN_NORM = 10 - logger = logging.getLogger(__name__) - def compute_gene_score(expr, values, default): - if isinstance(expr, Expression): + if isinstance(expr, (Expression, GPR)): return compute_gene_score(expr.body, values, default) elif isinstance(expr, Name): if expr.id in values: @@ -29,16 +22,21 @@ def compute_gene_score(expr, values, default): elif isinstance(expr, BoolOp): op = expr.op if isinstance(op, Or): - total = 0 + total = None for subexpr in expr.values: - total += compute_gene_score(subexpr, values, default) + value = compute_gene_score(subexpr, values, default) + if value != None: + if total == None: + total = 0 + total += value return total elif isinstance(op, And): least = None for subexpr in expr.values: value = compute_gene_score(subexpr, values, default) - if least == None or value < least: - least = value + if value != None: + if least == None or value < least: + least = value return least else: raise TypeError("unsupported operation " + op.__class__.__name__) @@ -49,12 +47,22 @@ def compute_gene_score(expr, values, default): class MSCondition: - def __init__(self, id): + def __init__(self, id,parent): self.id = id self.column_sum = None self.feature_count = None self.lowest = None - + self.parent = parent + + def value_at_zscore(self,zscore,normalization=None): + array = [] + for feature in self.parent.features: + value = feature.get_value(self,normalization) + if value != None: + array.append(value) + mean = sum(array) / len(array) + std_dev = (sum([(x - mean) ** 2 for x in array]) / len(array)) ** 0.5 + return mean + (zscore * std_dev) class MSExpressionFeature: def __init__(self, feature, parent): @@ -63,23 +71,32 @@ def __init__(self, feature, parent): self.values = {} self.parent = parent - def add_value(self, condition, value): + def add_value(self, condition, value,collision_policy="add"):#Could also choose overwrit if condition in self.values: - condition.feature_count += -1 - condition.column_sum += -1 * value + if self.values[condition] != None: + condition.column_sum += -1 * self.values[condition] + if collision_policy == "add": + if self.values[condition] == None: + if value != None: + self.values[condition] = value + elif value != None: + self.values[condition] += value + else: + self.values[condition] = self.values[condition] logger.warning( - "Overwriting value " + collision_policy+" value " + str(self.values[condition]) - + " with " + + " to " + str(value) + " in feature " - + self.feature.id - ) - if condition.lowest is None or condition.lowest > value: - condition.lowest = value - condition.feature_count += 1 - condition.column_sum += value - self.values[condition] = value + + self.feature.id) + else: + condition.feature_count += 1 + self.values[condition] = value + if self.values[condition] != None: + condition.column_sum += self.values[condition] + if condition.lowest is None or condition.lowest > self.values[condition]: + condition.lowest = self.values[condition] def get_value(self, condition, normalization=None): if isinstance(condition, str): @@ -94,7 +111,7 @@ def get_value(self, condition, normalization=None): "Condition " + condition.id + " has no value in " + self.feature.id ) return None - if normalization == COLUMN_NORM: + if normalization == "column_norm" and self.values[condition] != None: return self.values[condition] / condition.column_sum return self.values[condition] @@ -108,7 +125,7 @@ def __init__(self, type): @staticmethod def from_gene_feature_file(filename, genome=None, create_missing_features=False): - expression = MSExpression(GENOME) + expression = MSExpression("genome") if genome == None: expression.object = MSGenome() create_missing_features = True @@ -125,7 +142,7 @@ def from_gene_feature_file(filename, genome=None, create_missing_features=False) headers = line.split("\t") for i in range(1, len(headers)): if headers[i] not in expression.conditions: - conditions.append(MSCondition(headers[i])) + conditions.append(MSCondition(headers[i],expression)) expression.conditions.append(conditions[i - 1]) else: conditions.append(self.conditions.get_by_id(headers[i])) @@ -143,7 +160,7 @@ def add_feature(self, id, create_gene_if_missing=False): if id in self.features: return self.features.get_by_id(id) feature = None - if self.type == GENOME: + if self.type == "genome": if self.object.search_for_gene(id) == None: if create_gene_if_missing: self.object.features.append(MSFeature(id, "")) @@ -173,21 +190,21 @@ def get_value(self, feature, condition, normalization=None): return feature.get_value(condition, normalization) def build_reaction_expression(self, model, default): - if self.type == MODEL: + if self.type == "model": logger.critical( "Cannot build a reaction expression from a model-based expression object!" ) # Creating the expression and features - rxnexpression = MSExpression(MODEL) + rxnexpression = MSExpression("model") rxnexpression.object = model for rxn in model.reactions: if len(rxn.genes) > 0: rxnexpression.add_feature(rxn.id) for condition in self.conditions: + newcondition = MSCondition(condition.id,rxnexpression) rxnexpression.conditions.append(condition) # Pulling the gene values from the current expression values = {} - logger.warning("TESTING!") for gene in model.genes: feature = self.object.search_for_gene(gene.id) if feature == None: @@ -208,8 +225,17 @@ def build_reaction_expression(self, model, default): # Computing the reaction level values for condition in rxnexpression.conditions: for feature in rxnexpression.features: - tree = parse_gpr(feature.feature.gene_reaction_rule)[0] + tree = GPR().from_string(str(feature.feature.gene_reaction_rule)) feature.add_value( condition, compute_gene_score(tree, values[condition.id], default) ) return rxnexpression + + def get_dataframe(self, normalization=None): + records = [] + for feature in self.features: + record = {"ftr_id":feature.id} + for condition in self.conditions: + record[condition.id] = feature.get_value(condition, normalization) + records.append(record) + return pd.DataFrame.from_records(records) From 78fda494090c065305e294d44532c3b437eb2694 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 5 Nov 2024 00:03:28 -0600 Subject: [PATCH 262/298] Fixing error with bio reaction, fixing check for compounds in template, setting failure testing to false, and fixing report --- modelseedpy/core/msbuilder.py | 4 +++- modelseedpy/core/msmodelreport.py | 6 +++--- modelseedpy/core/msmodelutl.py | 2 +- modelseedpy/core/mstemplate.py | 4 ++++ 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/modelseedpy/core/msbuilder.py b/modelseedpy/core/msbuilder.py index c180cc6f..f7feda2d 100644 --- a/modelseedpy/core/msbuilder.py +++ b/modelseedpy/core/msbuilder.py @@ -13,6 +13,7 @@ ) from cobra.core import Gene, Metabolite, Model, Reaction, Group from modelseedpy.core import FBAHelper +from modelseedpy.core.msmodel import MSModel from modelseedpy.fbapkg.mspackagemanager import MSPackageManager from modelseedpy.biochem.modelseed_biochem import ModelSEEDBiochem from modelseedpy.biochem.modelseed_to_cobra import modelseed_to_cobra_reaction @@ -1078,7 +1079,8 @@ def build_full_template_model(template, model_id=None, index="0"): bio.build_biomass( model, index, classic=False, GC=0.5, add_to_model=True ) - model.objective = "bio1" + if "bio1" in model.reactions: + model.objective = "bio1" reactions_sinks = [] for cpd_id in ["cpd02701_c0", "cpd11416_c0", "cpd15302_c0", "cpd03091_c0"]: diff --git a/modelseedpy/core/msmodelreport.py b/modelseedpy/core/msmodelreport.py index df5c34bb..2d980e38 100644 --- a/modelseedpy/core/msmodelreport.py +++ b/modelseedpy/core/msmodelreport.py @@ -610,13 +610,13 @@ def build_report(self, output_path): with open(output_path, "w", encoding="utf-8") as f: f.write('') f.write("

    Model Summary

    ") - f.write(model_summary_df_styled.render(escape=False)) + f.write(model_summary_df_styled.to_html(escape=False)) f.write("

    ") f.write("

    Gapfillings Analysis

    ") # Check for Gapfillings Analysis data if not gapfillings_analysis_df.empty: - f.write(gapfillings_analysis_df_styled.render(escape=False)) + f.write(gapfillings_analysis_df_styled.to_html(escape=False)) f.write(f"

    Legend:

    {annotations_text_gapfillings}") else: f.write( @@ -627,7 +627,7 @@ def build_report(self, output_path): # Check for ATP Analysis data if not atp_analysis_df.empty: - f.write(atp_analysis_df_styled.render(escape=False)) + f.write(atp_analysis_df_styled.to_html(escape=False)) f.write(f"

    Legend:

    {annotations_text_atp_analysis}") f.write(explanation_text_atp_analysis) else: diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index e21cdeb0..1d74d92e 100755 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -1375,7 +1375,7 @@ def apply_test_condition(self, condition, model=None): # model.objective.direction = "min" pkgmgr.getpkg("KBaseMediaPkg").build_package(condition["media"]) - def test_single_condition(self, condition, apply_condition=True, model=None,report_atp_loop_reactions=False,analyze_failures=True,rxn_list=[]): + def test_single_condition(self, condition, apply_condition=True, model=None,report_atp_loop_reactions=False,analyze_failures=False,rxn_list=[]): """Runs a single test condition to determine if objective value on set media exceeds threshold Parameters diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 7632df52..c798d1b5 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -182,6 +182,10 @@ def to_metabolite(self, index="0", force=False): cpd_id = f"{self.id}{index}" compartment = f"{self.compartment}{index}" + if self.compound == None: + logger.critical( + f"Compound objective associated with [{cpd_id}] is missing from template" + ) name = f"{self.compound.name} [{compartment}]" metabolite = Metabolite(cpd_id, self.formula, name, self.charge, compartment) metabolite.notes["modelseed_template_id"] = self.id From aa63f34514c59f235e0f58e0b29729b35a132042 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Fri, 8 Nov 2024 23:45:11 -0600 Subject: [PATCH 263/298] genome --- modelseedpy/core/msgenome.py | 32 ++++++++++++++++++++++---------- modelseedpy/core/mstemplate.py | 30 +++++++++++++++--------------- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index 86063cc2..c9e3df88 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -8,18 +8,18 @@ DEFAULT_SPLIT = " " -def to_fasta(features, filename, l=80, fn_header=None): +def to_fasta(features, filename, line_size=80, fn_header=None): with open(filename, "w") as fh: for feature in features: - h = f">{feature.id}\n" - if fn_header: - h = fn_header(feature) - fh.write(h) - lines = [ - feature.seq[i : i + l] + "\n" for i in range(0, len(feature.seq), l) - ] - for line in lines: - fh.write(line) + if feature.seq: + h = f">{feature.id}\n" + if fn_header: + h = fn_header(feature) + fh.write(h) + _seq = feature.seq + lines = [_seq[i: i + line_size] + "\n" for i in range(0, len(_seq), line_size)] + for line in lines: + fh.write(line) return filename @@ -188,3 +188,15 @@ def search_for_gene(self, query): return self.features.get_by_id(query) aliases = self.alias_hash() return aliases[query] if query in aliases else None + + def _repr_html_(self): + return f""" + + + + + + + + +
    Memory address{f"{id(self):x}"}
    Features{len(self.features)}
    """ diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 70b94ec1..61312eb0 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -520,23 +520,23 @@ def get_data(self): class MSTemplateBiomass: def __init__( self, - bio_id, - name, - type, - dna, - rna, - protein, - lipid, - cellwall, - cofactor, - pigment, - carbohydrate, - energy, - other, + biomass_id: str, + name: str, + type: str, + dna: float, + rna: float, + protein: float, + lipid: float, + cellwall: float, + cofactor: float, + pigment: float, + carbohydrate: float, + energy: float, + other: float, ): """ - :param bio_id:string + :param biomass_id:string :param name:string :param type:string :param dna:float @@ -550,7 +550,7 @@ def __init__( :param energy:float :param other:float """ - self.id = bio_id + self.id = biomass_id self.name = name self.type = type self.dna = dna From 35ecbc70c7881bb6d9b317b8aa2bdfb1365d4f97 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Fri, 8 Nov 2024 23:46:44 -0600 Subject: [PATCH 264/298] b --- modelseedpy/core/msgenome.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index c9e3df88..7b751738 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -17,7 +17,10 @@ def to_fasta(features, filename, line_size=80, fn_header=None): h = fn_header(feature) fh.write(h) _seq = feature.seq - lines = [_seq[i: i + line_size] + "\n" for i in range(0, len(_seq), line_size)] + lines = [ + _seq[i : i + line_size] + "\n" + for i in range(0, len(_seq), line_size) + ] for line in lines: fh.write(line) return filename From c2c11687c2f64f825fd156eafe553099855280db Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 19 Nov 2024 23:26:26 -0600 Subject: [PATCH 265/298] Fixing media forcing; fixing ensemble modeling; fixing aliases in genomes; fixing msexpression --- modelseedpy/core/msatpcorrection.py | 5 ++++ modelseedpy/core/msensemble.py | 9 +++++- modelseedpy/core/msgenome.py | 12 +++++++- modelseedpy/core/msmodelutl.py | 6 ++-- modelseedpy/multiomics/msexpression.py | 40 ++++++++++++++++---------- 5 files changed, 52 insertions(+), 20 deletions(-) diff --git a/modelseedpy/core/msatpcorrection.py b/modelseedpy/core/msatpcorrection.py index ca85e866..847fd1c0 100644 --- a/modelseedpy/core/msatpcorrection.py +++ b/modelseedpy/core/msatpcorrection.py @@ -113,6 +113,7 @@ def __init__( for media_id in forced_media: for item in self.atp_medias: if item[0].id == media_id: + print("Forced media: " + media_id) self.forced_media.append(item[0]) break @@ -405,6 +406,10 @@ def determine_growth_media(self, max_gapfilling=None): ): self.selected_media.append(media) atp_att["selected_media"][media.id] = 0 + elif media in self.forced_media: + self.selected_media.append(media) + atp_att["selected_media"][media.id] = 0 + self.modelutl.save_attributes(atp_att, "ATP_analysis") diff --git a/modelseedpy/core/msensemble.py b/modelseedpy/core/msensemble.py index 6b1aac37..3ab43eed 100755 --- a/modelseedpy/core/msensemble.py +++ b/modelseedpy/core/msensemble.py @@ -200,7 +200,14 @@ def sample_from_probabilities(self,reaction_probabilities=None,from_reaction_pro self.data["reactions"][rxnid]["presence"] += "1" else: self.data["reactions"][rxnid]["presence"] += "0" - + #Updating reaction probabilities from presence data + count = 0 + for item in self.data["reactions"][rxnid]["presence"]: + if item == "1": + count += 1 + self.data["reactions"][rxnid]["probability"] = count/len(self.data["reactions"][rxnid]["presence"]) + #Saving ensemble data in model attributes + return self.save_ensemble_model() def unpack_models(self,model_list=None): output_models = [None]*self.size diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index 1f90b96a..03c2b08c 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -161,7 +161,17 @@ def from_protein_sequences_hash(sequences): return genome def alias_hash(self): - return {alias: gene for gene in self.features for alias in gene.aliases} + output = {} + for gene in self.features: + for alias in gene.aliases: + #Check if alias is a list + if isinstance(alias,list): + if alias[1] not in output: + output[alias[1]] = gene + else: + if alias not in output: + output[alias] = gene + return output def search_for_gene(self, query): if query in self.features: diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 1d74d92e..aa6b099e 100755 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -865,7 +865,7 @@ def assign_reliability_scores_to_reactions(self): transported_charge += coef * met.charge #Pulling ModelSEED Biochemistry related data msid = MSModelUtil.reaction_msid(reaction) - if msid: + if msid and msid != "rxn00000": #Penalizing for net transport of ions in the wrong direction forwardscore = 0 reversescore = 0 @@ -1538,11 +1538,11 @@ def binary_expansion_test(self, reaction_list, condition, currmodel, depth=0,pos filtered_list = [] # First run the full test if self.test_single_condition(condition,apply_condition=False,model=currmodel,rxn_list=reaction_list): - print("Reaction set passed"," ".join(map(str, reaction_list))) + #print("Reaction set passed"," ".join(map(str, reaction_list))) return [] # Check if input list contains only one reaction: if len(reaction_list) == 1: - print("Failed:"+reaction_list[0][1]+reaction_list[0][0].id) + #print("Failed:"+reaction_list[0][1]+reaction_list[0][0].id) if reaction_list[0][1] == ">": reaction_list[0].append(reaction_list[0][0].upper_bound) reaction_list[0][0].upper_bound = 0 diff --git a/modelseedpy/multiomics/msexpression.py b/modelseedpy/multiomics/msexpression.py index 4fb2b75c..c73a7ead 100644 --- a/modelseedpy/multiomics/msexpression.py +++ b/modelseedpy/multiomics/msexpression.py @@ -124,7 +124,7 @@ def __init__(self, type): self.conditions = DictList() @staticmethod - def from_gene_feature_file(filename, genome=None, create_missing_features=False): + def from_gene_feature_file(filename, genome=None, create_missing_features=False,ignore_columns=[],description_column=None,sep="\t"): expression = MSExpression("genome") if genome == None: expression.object = MSGenome() @@ -136,27 +136,37 @@ def from_gene_feature_file(filename, genome=None, create_missing_features=False) data = file.read() lines = data.split("\n") conditions = None + description_index = None + cond_indeces = [] for line in lines: if conditions == None: conditions = [] headers = line.split("\t") for i in range(1, len(headers)): - if headers[i] not in expression.conditions: - conditions.append(MSCondition(headers[i],expression)) - expression.conditions.append(conditions[i - 1]) - else: - conditions.append(self.conditions.get_by_id(headers[i])) - conditions[i - 1].column_sum = 0 - conditions[i - 1].feature_count = 0 + if headers[i] == description_column: + description_index = i + print("Description column:",description_index) + elif headers[i] not in ignore_columns: + conditions.append(headers[i]) + cond_indeces.append(i) + if headers[i] not in expression.conditions: + expression.conditions.append(MSCondition(headers[i],expression)) + else: + conditions.append(self.conditions.get_by_id(headers[i])) + expression.conditions.get_by_id(headers[i]).column_sum = 0 + expression.conditions.get_by_id(headers[i]).feature_count = 0 else: array = line.split("\t") - protfeature = expression.add_feature(array[0], create_missing_features) + description = None + if description_index != None: + description = array[description_index] + protfeature = expression.add_feature(array[0], create_missing_features,description=description) if protfeature != None: - for i in range(1, len(array)): - protfeature.add_value(conditions[i - 1], float(array[i])) + for cond_index in cond_indeces: + protfeature.add_value(expression.conditions.get_by_id(headers[cond_index]), float(array[cond_index])) return expression - def add_feature(self, id, create_gene_if_missing=False): + def add_feature(self, id, create_gene_if_missing=False,description=None): if id in self.features: return self.features.get_by_id(id) feature = None @@ -208,11 +218,11 @@ def build_reaction_expression(self, model, default): for gene in model.genes: feature = self.object.search_for_gene(gene.id) if feature == None: - logger.warning( - "Model gene " + gene.id + " not found in genome of expression" + logger.debug( + "Model gene " + gene.id + " not found in genome or expression" ) elif feature.id not in self.features: - logger.warning( + logger.debug( "Model gene " + gene.id + " in genome but not in expression" ) else: From 02319e004e61f4465e1fa465d60fda27eb3205b7 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Wed, 20 Nov 2024 23:20:07 -0600 Subject: [PATCH 266/298] Removing pyeda dependency --- setup.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/setup.py b/setup.py index f2fe0b3b..fd9e77a7 100644 --- a/setup.py +++ b/setup.py @@ -40,8 +40,7 @@ "scipy >= 1.5.4", "chemicals >= 1.0.13", "chemw >= 0.3.2", - "matplotlib >= 3.0.0", - "pyeda", + "matplotlib >= 3.0.0" ], tests_require=[ "pytest", From 3d4d79f73733ecc7a22d5a36a137263265b0e43f Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 21 Nov 2024 10:23:22 -0600 Subject: [PATCH 267/298] Removing solution printing that was used for debugging --- modelseedpy/core/msgapfill.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 425509c0..221cd3cb 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -549,8 +549,8 @@ def run_multi_gapfill( self.gfpkgmgr.getpkg("GapfillingPkg").compute_gapfilling_penalties(reaction_scores=self.reaction_scores) self.gfpkgmgr.getpkg("GapfillingPkg").build_gapfilling_objective_function() #Running sensitivity analysis once on the cumulative solution for all media - with open("datacache/solutions.json", 'w') as f: - json.dump(solution_dictionary,f,indent=4,skipkeys=True) + #with open("datacache/solutions.json", 'w') as f: + #json.dump(solution_dictionary,f,indent=4,skipkeys=True) if run_sensitivity_analysis: logger.info( "Gapfilling sensitivity analysis running" From 3749d671aa5353618924c9525e2eb179696e6a8a Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 21 Nov 2024 12:07:51 -0600 Subject: [PATCH 268/298] Setting config for KBase deploy --- modelseedpy/config.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/config.cfg b/modelseedpy/config.cfg index 11df18bb..56fd6422 100644 --- a/modelseedpy/config.cfg +++ b/modelseedpy/config.cfg @@ -1,5 +1,5 @@ [biochem] -path = /Users/chenry/code/ModelSEEDDatabase +path = /deps/ModelSEEDDatabase/ [data] template_folder = data/templates classifier_folder = data/ml From c7938f428720927ef462b90f058c06b1a7c93961 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Thu, 28 Nov 2024 19:28:57 -1000 Subject: [PATCH 269/298] pigment fix --- modelseedpy/core/mstemplate.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 61312eb0..6bdc27a3 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -637,16 +637,16 @@ def from_dict(d, template): d["id"], d["name"], d["type"], - d["dna"], - d["rna"], - d["protein"], - d["lipid"], - d["cellwall"], - d["cofactor"], - d["pigment"], - d["carbohydrate"], - d["energy"], - d["other"], + d.get("dna", 0), + d.get("rna", 0), + d.get("protein", 0), + d.get("lipid", 0), + d.get("cellwall", 0), + d.get("cofactor", 0), + d.get("pigment", 0), + d.get("carbohydrate", 0), + d.get("energy", 0), + d.get("other", 0) ) for item in d["templateBiomassComponents"]: biocomp = MSTemplateBiomassComponent.from_dict(item, template) From 6d48d6774c121773fa5793d6f61a5b3e4cf4b41b Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 28 Dec 2024 10:14:39 -0600 Subject: [PATCH 270/298] Fixing global gapfilling --- modelseedpy/config.cfg | 2 +- modelseedpy/core/msgapfill.py | 263 +++++++++++--------- modelseedpy/core/msmodelutl.py | 12 +- modelseedpy/fbapkg/basefbapkg.py | 12 + modelseedpy/fbapkg/gapfillingpkg.py | 6 +- modelseedpy/fbapkg/objconstpkg.py | 13 + modelseedpy/fbapkg/objectivepkg.py | 79 ++++++ modelseedpy/fbapkg/problemreplicationpkg.py | 9 +- 8 files changed, 263 insertions(+), 133 deletions(-) create mode 100644 modelseedpy/fbapkg/objectivepkg.py diff --git a/modelseedpy/config.cfg b/modelseedpy/config.cfg index 56fd6422..11df18bb 100644 --- a/modelseedpy/config.cfg +++ b/modelseedpy/config.cfg @@ -1,5 +1,5 @@ [biochem] -path = /deps/ModelSEEDDatabase/ +path = /Users/chenry/code/ModelSEEDDatabase [data] template_folder = data/templates classifier_folder = data/ml diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 221cd3cb..08ffde81 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -76,7 +76,7 @@ def __init__( direction="max", ) # Setting parameters for gapfilling - self.lp_filename = self.last_solution = None + self.last_solution = None self.model_penalty = 1 self.default_minimum_objective = minimum_obj self.default_gapfill_models = default_gapfill_models @@ -88,6 +88,11 @@ def __init__( self.test_condition_iteration_limit = 10 self.test_conditions = test_conditions self.reaction_scores = reaction_scores + self.default_excretion = default_excretion + self.default_uptake = default_uptake + self.minimum_obj = minimum_obj + self.base_media = base_media + self.base_media_target_element = base_media_target_element self.cumulative_gapfilling = [] # Building gapfilling package self.gfpkgmgr.getpkg("GapfillingPkg").build_package( @@ -152,6 +157,46 @@ def test_gapfill_database(self, media, target=None, before_filtering=True): ) return False + def test_and_adjust_gapfilling_conditions(self,medias,targets,thresholds,prefilter=True): + output = { + "medias":[], + "targets":[], + "thresholds":[], + "conditions":[] + } + logger.debug("Testing unfiltered database") + for i,media in enumerate(medias): + if self.test_gapfill_database(media,targets[i],before_filtering=True): + output["medias"].append(media) + output["targets"].append(targets[i]) + output["thresholds"].append(thresholds[i]) + output["conditions"].append({ + "media": media, + "is_max_threshold": False, + "threshold": thresholds[i], + "objective": targets[i], + }) + # Filtering + if prefilter: + logger.debug("Filtering database") + self.prefilter(growth_conditions=output["conditions"]) + medias = [] + targets = [] + thresholds = [] + conditions = [] + logger.debug("Testing filtered database") + for i,media in enumerate(output["medias"]): + if self.test_gapfill_database(media,output["targets"][i],before_filtering=False): + medias.append(media) + targets.append(output["targets"][i]) + thresholds.append(output["thresholds"][i]) + conditions.append(output["conditions"][i]) + output["medias"] = medias + output["targets"] = targets + output["thresholds"] = thresholds + output["conditions"] = conditions + return output + def prefilter(self,test_conditions=None,growth_conditions=[],use_prior_filtering=False,base_filter_only=False): """Prefilters the database by removing any reactions that break specified ATP tests Parameters @@ -226,10 +271,7 @@ def run_gapfilling( return None # Printing the gapfilling LP file - if self.lp_filename: - pass - #with open(self.lp_filename, "w") as out: - # out.write(str(self.gfmodel.solver)) + self.mdlutl.printlp(model=self.gfmodel,filename="StandardGapfill",print=False) # Running gapfil/ling and checking solution sol = self.gfmodel.optimize() @@ -296,91 +338,70 @@ def run_global_gapfilling( Indicates if the model should be checked to ensure that the resulting gapfilling solution produces a nonzero objective """ # Testing if gapfilling can work before filtering - final_media = [] - final_targets = [] - final_thresholds = [] - growth_conditions = [] - for i,media in enumerate(medias): - if self.test_gapfill_database(media,targets[i],before_filtering=True): - final_media.append(media) - final_targets.append(targets[i]) - final_thresholds.append(thresholds[i]) - growth_conditions.append({ - "media": media, - "is_max_threshold": False, - "threshold": thresholds[i], - "objective": targets[i], - }) - # Filtering - if prefilter: - self.prefilter(growth_conditions=growth_conditions) - medias = [] - targets = [] - thresholds = [] - for i,media in enumerate(final_media): - if self.test_gapfill_database(media,final_targets[i],before_filtering=True): - medias.append(media) - targets.append(targets[i]) - thresholds.append(thresholds[i]) + test_output = self.test_and_adjust_gapfilling_conditions(medias,targets,thresholds,prefilter=prefilter) #If none of the media conditions can be gapfilled, then return None - if len(medias) == 0: + if len(test_output["medias"]) == 0: return None + #Adding max flux variables + self.gfpkgmgr.getpkg("GapfillingPkg").create_max_flux_variables() #Instantiating all models to be merged merged_model = None model_list = [] pkgmgrs = {} - for i,media in enumerate(medias): - model_cpy = self.gfmodel.copy() - pkgmgrs[model_cpy] = MSPackageManager.get_pkg_mgr(model_cpy) - #Creating max flux variables - pkgmgrs[model_cpy].getpkg("GapfillingPkg").create_max_flux_variables() + for i,media in enumerate(test_output["medias"]): #Setting the objective - pkgmgrs[model_cpy].getpkg("GapfillingPkg").set_base_objective(targets[i],thresholds[i]) + self.gfpkgmgr.getpkg("GapfillingPkg").set_base_objective(test_output["targets"][i],test_output["thresholds"][i]) #Setting the media - pkgmgrs[model_cpy].getpkg("GapfillingPkg").set_media(media) + self.gfpkgmgr.getpkg("GapfillingPkg").set_media(media) + #Copying model and either making it the base model or adding to the model list + model_cpy = self.gfmodel.copy() if i == 0: merged_model = model_cpy else: model_list.append(model_cpy) #Merging all models - gfpkg = pkgmgrs[merged_model].getpkg("GapfillingPkg") - pkgmgrs[merged_model].getpkg("ProblemReplicationPkg").build_package({ + mergpkgmgr = MSPackageManager.get_pkg_mgr(merged_model) + mergpkgmgr.getpkg("ProblemReplicationPkg").build_package({ "models":model_list, "shared_variable_packages":{ - gfpkg : ["rmaxf","fmaxf"] + "GapfillingPkg" : ["rmaxf","fmaxf"] } }) + mergfpkg = mergpkgmgr.getpkg("GapfillingPkg") + origgfpkg = self.gfpkgmgr.getpkg("GapfillingPkg") #Setting the objective reaction_objective = merged_model.problem.Objective(Zero, direction="min") obj_coef = dict() - for reaction in merged_model.reactions: - if reaction.id in gfpkg.gapfilling_penalties: - if reaction.id[0:3] != "EX_": - if "reverse" in gfpkg.gapfilling_penalties[reaction.id]: - if reaction.id in gfpkg.maxflux_variables: - if "reverse" in gfpkg.maxflux_variables[reaction.id]: - obj_coef[gfpkg.maxflux_variables[reaction.id]["reverse"]] = abs( - gfpkg.gapfilling_penalties[reaction.id]["reverse"] - ) - if "forward" in gfpkg.gapfilling_penalties[reaction.id]: - if reaction.id in gfpkg.maxflux_variables: - if "forward" in gfpkg.maxflux_variables[reaction.id]: - obj_coef[gfpkg.maxflux_variables[reaction.id]["forward"]] = abs( - gfpkg.gapfilling_penalties[reaction.id]["forward"] - ) + gfrxnidhash = dict() + for rxnid in mergfpkg.variables["rmaxf"]: + gfrxnidhash[rxnid] = {"reverse":mergfpkg.variables["rmaxf"][rxnid]} + if rxnid in origgfpkg.gapfilling_penalties: + if "reverse" in origgfpkg.gapfilling_penalties[rxnid]: + obj_coef[mergfpkg.variables["rmaxf"][rxnid]] = abs(origgfpkg.gapfilling_penalties[rxnid]["reverse"]) + else: + obj_coef[mergfpkg.variables["rmaxf"][rxnid]] = 1 + else: + obj_coef[mergfpkg.variables["rmaxf"][rxnid]] = 1 + for rxnid in mergfpkg.variables["fmaxf"]: + if rxnid not in gfrxnidhash: + gfrxnidhash[rxnid] = {"forward":mergfpkg.variables["fmaxf"][rxnid]} + else: + gfrxnidhash[rxnid]["forward"] = mergfpkg.variables["fmaxf"][rxnid] + if rxnid in origgfpkg.gapfilling_penalties: + if "forward" in origgfpkg.gapfilling_penalties[rxnid]: + obj_coef[mergfpkg.variables["fmaxf"][rxnid]] = abs(origgfpkg.gapfilling_penalties[rxnid]["forward"]) + else: + obj_coef[mergfpkg.variables["fmaxf"][rxnid]] = 1 + else: + obj_coef[mergfpkg.variables["fmaxf"][rxnid]] = 1 merged_model.objective = reaction_objective reaction_objective.set_linear_coefficients(obj_coef) - gfpkg.parameters["gfobj"] = self.model.objective - # Printing the gapfilling LP file - if self.lp_filename: - pass - #with open(self.lp_filename, "w") as out: - # out.write(str(merged_model.solver)) + self.mdlutl.printlp(model=merged_model,filename="GlobalGapfill",print=True) # Running gapfilling and checking solution sol = merged_model.optimize() - logger.debug( + logger.info( f"gapfill solution objective value {sol.objective_value} ({sol.status}) for media {media}" ) if sol.status != "optimal": @@ -388,15 +409,32 @@ def run_global_gapfilling( return None # Computing solution and ensuring all tests still pass - self.last_solution = {"new":{},"reversed":{},"media":medias[0],"target":targets[0],"minobjective":thresholds[0],"binary_check":False} + self.last_solution = {"new":{},"reversed":{},"media":test_output["medias"][0],"target":test_output["targets"][0],"minobjective":test_output["thresholds"][0],"binary_check":False} flux_values = {} - for rxn in self.model.reactions: - flux_values[rxn.id] = { - "reverse": self.gfpkgmgr.getpkg("GapfillingPkg").maxflux_variables[reaction.id]["reverse"].primal, - "forward": self.gfpkgmgr.getpkg("GapfillingPkg").maxflux_variables[reaction.id]["forward"].primal - } - self.gfpkgmgr.getpkg("GapfillingPkg").compute_gapfilled_solution(flux_values) - return self.last_solution + for rxnid in origgfpkg.gapfilling_penalties: + flux_values[rxnid] = {} + flux_values[rxnid]["reverse"] = merged_model.reactions.get_by_id(rxnid).reverse_variable.primal + flux_values[rxnid]["forward"] = merged_model.reactions.get_by_id(rxnid).forward_variable.primal + for rxnid in gfrxnidhash: + if rxnid not in flux_values: + flux_values[rxnid] = {} + penalty = 0 + if "reverse" in gfrxnidhash[rxnid]: + if rxnid in origgfpkg.gapfilling_penalties and "reverse" in origgfpkg.gapfilling_penalties[rxnid]: + penalty = origgfpkg.gapfilling_penalties[rxnid]["reverse"] + if gfrxnidhash[rxnid]["reverse"].primal > 1e-8: + logger.debug(f"{rxnid} reverse {gfrxnidhash[rxnid]['reverse'].primal} {penalty}") + flux_values[rxnid]["reverse"] = gfrxnidhash[rxnid]["reverse"].primal + penalty = 0 + if "forward" in gfrxnidhash[rxnid]: + if rxnid in origgfpkg.gapfilling_penalties and "forward" in origgfpkg.gapfilling_penalties[rxnid]: + penalty = origgfpkg.gapfilling_penalties[rxnid]["forward"] + if gfrxnidhash[rxnid]["forward"].primal > 1e-8: + logger.debug(f"{rxnid} forward {gfrxnidhash[rxnid]['forward'].primal} {penalty}") + flux_values[rxnid]["forward"] = gfrxnidhash[rxnid]["forward"].primal + global_solution = origgfpkg.compute_gapfilled_solution(flux_values) + logger.info(f"Gloabl solution: {global_solution}") + return global_solution def run_multi_gapfill( self, @@ -444,63 +482,39 @@ def run_multi_gapfill( if default_minimum_objective == None: default_minimum_objective = self.default_minimum_objective self.gfpkgmgr.getpkg("GapfillingPkg").parameters["minimum_obj"] = default_minimum_objective - #Checking that each media to ensure gapfilling works before filtering + # Testing if gapfilling can work before and after filtering + targets = [] + thresholds = [] for media in media_list: currtarget = target if media in target_hash: currtarget = target_hash[media] - if not self.test_gapfill_database(media,currtarget,before_filtering=True): - #Remove media that fail initial test - print("Removing ungapfillable media "+media.id) - media_list.remove(media) + targets.append(currtarget) + minimum_obj = default_minimum_objective + if media in minimum_objectives: + minimum_obj = minimum_objectives[media] + thresholds.append(minimum_obj) + test_output = self.test_and_adjust_gapfilling_conditions(media_list,targets,thresholds,prefilter=prefilter) #If there are no media left, don't run gapfilling - if len(media_list) == 0: + if len(test_output["medias"]) == 0: return None - #Running prefiltering once for all media if specified. Rememeber - filtering does not care about the target or media - it is just a set of tests that are run on the database - if prefilter: - growth_conditions=[] - for media in media_list: - minimum_obj = default_minimum_objective - if media in minimum_objectives: - minimum_obj = minimum_objectives[media] - currtarget = target - if media in target_hash: - currtarget = target_hash[media] - growth_conditions.append({ - "media": media, - "is_max_threshold": False, - "threshold": minimum_obj, - "objective": currtarget, - }) - self.prefilter(growth_conditions=growth_conditions) #Iterating over all media and running gapfilling solution_dictionary = {} cumulative_solution = [] - targets = [] - thresholds = [] - for item in media_list: - currtarget=target - if media in target_hash: - targets.append(target_hash[media]) - else: - targets.append(target) - #Determining the minimum objective for the current media - minimum_obj = default_minimum_objective - if item in minimum_objectives: - minimum_obj = minimum_objectives[item] - thresholds.append(minimum_obj) + for i,media in enumerate(test_output["medias"]): #Implementing specified gapfilling mode if gapfilling_mode == "Independent" or gapfilling_mode == "Sequential": + print("Running "+gapfilling_mode+" gapfilling!") solution = self.run_gapfilling( - item, - currtarget, - minimum_obj, + media, + test_output["targets"][i], + test_output["thresholds"][i], binary_check, False, ) #If there is a solution, go ahead and integrate it into the model if solution: - solution_dictionary[item] = self.integrate_gapfill_solution( + solution_dictionary[media] = self.integrate_gapfill_solution( solution, cumulative_solution=cumulative_solution, remove_unneeded_reactions=remove_unneeded_reactions, @@ -513,19 +527,20 @@ def run_multi_gapfill( self.gfpkgmgr.getpkg("GapfillingPkg").build_gapfilling_objective_function() if gapfilling_mode == "Global": #Now we run simultaneous gapfilling on a combination of all our various gapfilled models + print("Running global gapfilling!") full_solution = self.run_global_gapfilling( - media_list, - targets, - thresholds, - binary_check, - False, - check_for_growth, + medias=test_output["medias"], + targets=test_output["targets"], + thresholds=test_output["thresholds"], + binary_check=binary_check, + prefilter=False ) #Now we integrate the full solution into the model for every media which effectively determines which reactions are needed for each media - for i,item in enumerate(media_list): + for i,item in enumerate(test_output["medias"]): full_solution["media"] = item - full_solution["target"] = targets[i] - full_solution["minobjective"] = thresholds[i] + full_solution["target"] = test_output["targets"][i] + full_solution["minobjective"] = test_output["thresholds"][i] + full_solution["binary_check"] = binary_check #In this case we donot remove unnneeded reactions from the model because they may be needed for other media solution_dictionary[item] = self.integrate_gapfill_solution( full_solution, @@ -538,9 +553,9 @@ def run_multi_gapfill( #These is a danger here that the integration step will put a reaction into a solution that subsequently gets removed at this step. This is something to look out for unneeded = self.mdlutl.test_solution( cumulative_solution, - targets, - media_list, - thresholds=[0.1], + test_output["targets"], + test_output["medias"], + thresholds=test_output["thresholds"], remove_unneeded_reactions=True, do_not_remove_list=[] )#Returns reactions in cumulative solution that are not needed for growth diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index aa6b099e..b5eae486 100755 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -407,9 +407,15 @@ def save_model(self, filename): """ cobra.io.save_json_model(self.model, filename) - def printlp(self, lpfilename="debug.lp"): - with open(lpfilename, "w") as out: - out.write(str(self.model.solver)) + def printlp(self,model=None,path="",filename="debug",print=False): + if print: + if len(path) > 0: + path+"/" + lpfilename = path+filename+".lp" + if model == None: + model = self.model + with open(lpfilename, "w") as out: + out.write(str(model.solver)) def print_solutions(self, solution_hash,filename="reaction_solutions.csv"): records = [] diff --git a/modelseedpy/fbapkg/basefbapkg.py b/modelseedpy/fbapkg/basefbapkg.py index f5a216f0..f97b1aed 100644 --- a/modelseedpy/fbapkg/basefbapkg.py +++ b/modelseedpy/fbapkg/basefbapkg.py @@ -61,6 +61,18 @@ def __init__( for type in constraint_types: self.constraints[type] = dict() + for constraint in self.model.solver.constraints: + obj_type = constraint.name.split("_")[-1] + if obj_type in self.constraints: + name = "_".join(constraint.name.split("_")[0:-1]) + self.constraints[obj_type][name] = constraint + + for variable in self.model.solver.variables: + obj_type = variable.name.split("_")[-1] + if obj_type in self.variables: + name = "_".join(variable.name.split("_")[0:-1]) + self.variables[obj_type][name] = variable + def validate_parameters(self, params, required, defaults): for item in required: if item not in params: diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index 5dab108b..34b17f3d 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -24,7 +24,7 @@ logging.INFO ) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO -base_blacklist = {}#{"rxn00062":"="} +base_blacklist = {"rxn04656":"=","rxn07589":"=","rxn07588":"="} zero_threshold = 1e-8 @@ -242,6 +242,8 @@ def create_max_flux_variables(self): for reaction in self.model.reactions: if reaction.id in self.gapfilling_penalties: if "reverse" in self.gapfilling_penalties[reaction.id]: + if reaction.id not in self.maxflux_variables: + self.maxflux_variables[reaction.id] = {} self.maxflux_variables[reaction.id][ "reverse" ] = self.build_variable( @@ -258,6 +260,8 @@ def create_max_flux_variables(self): reaction, ) if "forward" in self.gapfilling_penalties[reaction.id]: + if reaction.id not in self.maxflux_variables: + self.maxflux_variables[reaction.id] = {} self.maxflux_variables[reaction.id][ "forward" ] = self.build_variable( diff --git a/modelseedpy/fbapkg/objconstpkg.py b/modelseedpy/fbapkg/objconstpkg.py index de1dc3b5..2098b24d 100644 --- a/modelseedpy/fbapkg/objconstpkg.py +++ b/modelseedpy/fbapkg/objconstpkg.py @@ -17,6 +17,19 @@ def build_constraint(self, lower_bound, upper_bound): coef = self.model.solver.objective.get_linear_coefficients( self.model.solver.objective.variables ) + #Check if the constraint already exists + found = False + for name in self.constraints["objc"]: + constraint = self.constraints["objc"][name] + existing_coef = constraint.get_linear_coefficients( + constraint.variables + ) + if coef == existing_coef: + print("Match found!") + constraint.lb = lower_bound + constraint.ub = upper_bound + return constraint + return BaseFBAPkg.build_constraint( self, "objc", lower_bound, upper_bound, coef, None ) diff --git a/modelseedpy/fbapkg/objectivepkg.py b/modelseedpy/fbapkg/objectivepkg.py new file mode 100644 index 00000000..dd4ba4cb --- /dev/null +++ b/modelseedpy/fbapkg/objectivepkg.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import + +import logging +from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg + +logger = logging.getLogger(__name__) +logger.setLevel( + logging.WARNING#INFO +) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO + +# Base class for FBA packages +class ObjectivePkg(BaseFBAPkg): + def __init__(self, model): + BaseFBAPkg.__init__(self, model, "objective builder", {}, {}) + self.objective_cache = {} + + def build_package(self,objective_string,objective_name=None,cache_objective_name=None): + #Saving unmodified objective string + if objective_name == None: + objective_name = objective_string + #Caching objective and objective string + self.objective_string_cache[objective_name] = objective_string + #Caching the current objective if a name was specified + if cache_objective_name != None: + self.objective_cache[cache_objective_name] = self.model.objective + #Creating empty objective - always max + self.objective_cache[objective_name] = self.model.problem.Objective(Zero, direction="max") + #Parsing objective string of form: MAX{(1)bio1|(1)rxn00001_c0} + obj_coef = dict() + #Checking if there is a directionality in the objective + sign = 1 + if objective_string[0:3] == "MAX": + objective_string = [4,-1]#Clearing out the directionality MAX{} + elif objective_string[0:3] == "MIN": + sign = -1 + objective_string = [4,-1]#Clearing out the directionality MIN{} + #Building dictionary of variable names + varnames = {} + for variable in self.model.solver.variables: + varnames[variable.name] = variable + #Parsing the main body of the objective string + terms = objective_string.split("|") + for term in terms: + coef = 1 + #Checking for coefficient + if term[0:1] == "(": + array = term.split(")") + coef = float(array[0][1]) + term = array[1] + #Applying the directionality sign + coef = coef*sign + #Checking for a +/- on term + if term[0:1] == "+" or term[0:1] == "-": + rxnid = term[1:] + if rxnid not in self.model.reactions: + logger.warning(rxnid+" in objective strin not found in model.") + else: + rxnobj = self.model.reactions + if term[0:1] == "+": + obj_coef[rxnobj.forward_variable] = coef + elif term[0:1] == "-": + obj_coef[rxnobj.reverse_variable] = coef + #Checking if the term is just a reaction ID + elif term in self.model.reactions: + rxnobj = self.model.reactions + obj_coef[rxnobj.forward_variable] = coef + obj_coef[rxnobj.reverse_variable] = -1*coef + elif term in varnames: + obj_coef[varnames[term]] = coef + self.model.objective = self.objective_cache[objective_name] + self.model.objective.set_linear_coefficients(obj_coef) + + def restore_objective(self,name): + if name in self.objective_cache: + self.model.objective = self.objective_cache[name] + else: + logger.warning("Objective "+name+" not found in cache") \ No newline at end of file diff --git a/modelseedpy/fbapkg/problemreplicationpkg.py b/modelseedpy/fbapkg/problemreplicationpkg.py index 062abc33..53e5f6fe 100644 --- a/modelseedpy/fbapkg/problemreplicationpkg.py +++ b/modelseedpy/fbapkg/problemreplicationpkg.py @@ -21,12 +21,13 @@ def build_package(self, parameters): # First loading shared variables into a hash shared_var_hash = {} for pkg in self.parameters["shared_variable_packages"]: + fbapkg = self.modelutl.pkgmgr.getpkg(pkg) for type in self.parameters["shared_variable_packages"][pkg]: - if type in pkg.variables: - for objid in pkg.variables[type]: + if type in fbapkg.variables: + for objid in fbapkg.variables[type]: shared_var_hash[ - pkg.variables[type][objid].name - ] = pkg.variables[type][objid] + fbapkg.variables[type][objid].name + ] = fbapkg.variables[type][objid] # Now copying over variables and constraints from other models and replacing shared variables count = 0 for othermdl in self.parameters["models"]: From 1ca7860a716295e8e1f842837695bc18559c95f2 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Mon, 20 Jan 2025 03:28:20 -0600 Subject: [PATCH 271/298] proj --- modelseedpy/core/rast_client.py | 12 ++++++++---- pyproject.toml | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/modelseedpy/core/rast_client.py b/modelseedpy/core/rast_client.py index 97211add..cc36b7bb 100644 --- a/modelseedpy/core/rast_client.py +++ b/modelseedpy/core/rast_client.py @@ -60,7 +60,7 @@ def __init__(self): }, ] - def annotate_genome(self, genome): + def annotate_genome(self, genome, split_terms=True): p_features = [] for f in genome.features: if f.seq and len(f.seq) > 0: @@ -70,9 +70,13 @@ def annotate_genome(self, genome): for o in res[0]["features"]: feature = genome.features.get_by_id(o["id"]) if "function" in o: - functions = re.split("; | / | @", o["function"]) - for function in functions: - feature.add_ontology_term("RAST", function) + rast_function = o["function"] + if split_terms: + functions = re.split("; | / | @", rast_function) + for function in functions: + feature.add_ontology_term("RAST", function) + else: + feature.add_ontology_term("RAST", rast_function) return res[0]["analysis_events"] diff --git a/pyproject.toml b/pyproject.toml index 0ed58542..8e0e52df 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta" [tool.black] line-length = 88 -python-version = ['py36'] +python-version = ['py38'] include = '\.pyi?$' exclude = ''' ( From 01b1383298e2db575adf5c9a7e53fdef8250fc19 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 13 Feb 2025 10:00:07 -0600 Subject: [PATCH 272/298] Improvements to support building models from other annotations --- modelseedpy/core/annotationontology.py | 37 +++++++++++++++++++++++++- modelseedpy/core/msmodelutl.py | 24 ++++++++--------- modelseedpy/core/mstemplate.py | 11 +++++++- modelseedpy/fbapkg/gapfillingpkg.py | 2 +- 4 files changed, 59 insertions(+), 15 deletions(-) diff --git a/modelseedpy/core/annotationontology.py b/modelseedpy/core/annotationontology.py index 05eed49d..0ed14c3f 100644 --- a/modelseedpy/core/annotationontology.py +++ b/modelseedpy/core/annotationontology.py @@ -452,4 +452,39 @@ def get_msgenome(self,prioritized_event_list=None,ontologies=None,merge_all=Fals ) newgenome.annoont = self return newgenome - \ No newline at end of file + + def get_events_from_priority_list(self,priority_list): + event_list = [] + for item in priority_list: + selected_merge = None + for event in self.events: + if item == "all": + if event.id not in event_list: + event_list.append(event.id) + elif item == "RAST": + if len(event.method) > 4 and event.method[0:4] == "RAST" and event.id not in event_list: + event_list.append(event.id) + elif item == "Prokka": + if len(event.method) > 6 and event.method[0:6] == "Prokka" and event.id not in event_list: + event_list.append(event.id) + elif item == "DRAM": + if len(event.method) > 4 and event.method[0:4] == "DRAM" and event.id not in event_list: + event_list.append(event.id) + elif item == "GLM4EC": + if len(event.method) > 6 and event.method[0:6] == "GLM4EC" and event.id not in event_list: + event_list.append(event.id) + elif item == "PDB": + if event.method == "KBAnnotationApps.PDBAnnotation" and event.ontology.id == "EC" and event.id not in event_list: + event_list.append(event.id) + elif item == "SNEKMER": + if len(event.method) > 7 and event.method[0:7] == "Snekmer" and event.id not in event_list: + event_list.append(event.id) + elif item == "Import": + if len(event.method) > 6 and event.method[0:6] == "Import" and event.id not in event_list: + event_list.append(event.id) + elif item == "Merge": + if len(event.method) > 5 and event.method[0:5] == "Merge" and event.id not in event_list: + selected_merge = event.id + if selected_merge: + event_list.append(selected_merge) + return event_list \ No newline at end of file diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index b5eae486..d2936b4f 100755 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -498,7 +498,7 @@ def get_atp_tests(self,core_template=None,atp_media_filename=None,recompute=Fals return self.atp_tests #Attempting to pull ATP tests from attributes if not recompute: - print("Getting tests from attributes") + logger.debug("Getting tests from attributes") atp_analysis = self.get_attributes("ATP_analysis",None) if atp_analysis: if "tests" in atp_analysis: @@ -948,7 +948,7 @@ def is_core(self,rxn): if not isinstance(rxn, str): rxn = rxn.id if "core_reactions" in self.get_attributes(): - print("Using core reactions attribute!") + logger.debug("Using core reactions attribute!") if rxn in self.get_attributes("core_reactions"): return True return False @@ -1291,7 +1291,7 @@ def test_solution(self,solution,targets,medias,thresholds=[0.1],remove_unneeded_ return unneeded def add_gapfilling(self, solution): - print("Adding gapfilling",str(solution)) + logger.debug("Adding gapfilling:"+str(solution)) self.integrated_gapfillings.append(solution) def create_kb_gapfilling_data(self, kbmodel, atpmedia_ws="94026"): @@ -1439,7 +1439,7 @@ def test_single_condition(self, condition, apply_condition=True, model=None,repo self.model.reactions.get_by_id(condition["objective"]).lower_bound = 0 return False elif value <= condition["threshold"] and not condition["is_max_threshold"]: - print("Failed low:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) + logger.debug("Failed low:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) return False self.test_objective = new_objective logger.debug("Passed:"+condition["media"].id+":"+str(new_objective)+";"+str(condition["threshold"])) @@ -1544,11 +1544,11 @@ def binary_expansion_test(self, reaction_list, condition, currmodel, depth=0,pos filtered_list = [] # First run the full test if self.test_single_condition(condition,apply_condition=False,model=currmodel,rxn_list=reaction_list): - #print("Reaction set passed"," ".join(map(str, reaction_list))) + #logger.debug("Reaction set passed"," ".join(map(str, reaction_list))) return [] # Check if input list contains only one reaction: if len(reaction_list) == 1: - #print("Failed:"+reaction_list[0][1]+reaction_list[0][0].id) + #logger.debug("Failed:"+reaction_list[0][1]+reaction_list[0][0].id) if reaction_list[0][1] == ">": reaction_list[0].append(reaction_list[0][0].upper_bound) reaction_list[0][0].upper_bound = 0 @@ -1561,7 +1561,7 @@ def binary_expansion_test(self, reaction_list, condition, currmodel, depth=0,pos #Testing positive growth conditions for pos_condition in positive_growth: if not self.test_single_condition(pos_condition,apply_condition=True,model=currmodel): - print("Does not pass positive growth tests:"+reaction_list[0][1]+reaction_list[0][0].id) + logger.debug("Does not pass positive growth tests:"+reaction_list[0][1]+reaction_list[0][0].id) success = False break #Restoring current test condition @@ -1601,7 +1601,7 @@ def binary_expansion_test(self, reaction_list, condition, currmodel, depth=0,pos for item in new_filter: filtered_list.append(item) if self.breaking_reaction != None: - print("Ending early due to breaking reaction:"+self.breaking_reaction.id) + logger.debug("Ending early due to breaking reaction:"+self.breaking_reaction.id) return filtered_list # Submitting second half of reactions for testing - now only breaking reactions are removed from the first list for i, item in enumerate(reaction_list): @@ -1667,14 +1667,14 @@ def reaction_expansion_test( scores = self.assign_reliability_scores_to_reactions() reaction_list = sorted(reaction_list, key=lambda x: scores[x[0].id][x[1]]) for item in reaction_list: - print(item[0].id+":"+item[1]+":"+str(scores[item[0].id][item[1]])) + logger.debug(item[0].id+":"+item[1]+":"+str(scores[item[0].id][item[1]])) for condition in condition_list: logger.debug(f"testing condition {condition}") currmodel = self.model tic = time.perf_counter() new_filtered = [] if not self.check_if_solution_exists(reaction_list, condition, currmodel): - print("No solution exists that passes tests for condition "+condition["media"].id) + logger.debug("No solution exists that passes tests for condition "+condition["media"].id) return None with currmodel: self.apply_test_condition(condition) @@ -1691,13 +1691,13 @@ def reaction_expansion_test( done = True else: #Remove breaking reaction from reaction_list - print("Keeping breaking reaction:"+self.breaking_reaction.id) + logger.debug("Keeping breaking reaction:"+self.breaking_reaction.id) for i in range(len(reaction_list)): if reaction_list[i][0] == self.breaking_reaction: del reaction_list[i] break if not self.check_if_solution_exists(reaction_list, condition, currmodel): - print("No solution exists after retaining breaking reaction:"+self.breaking_reaction.id) + logger.debug("No solution exists after retaining breaking reaction:"+self.breaking_reaction.id) return None self.breaking_reaction = None else: diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index c798d1b5..b5cfde73 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -1515,7 +1515,16 @@ def remove_reactions( associated_groups = self.get_associated_groups(reaction) for group in associated_groups: group.remove_members(reaction) """ - + + #*************************Curation Functions************************* + def auto_fix_protons(self): + for rxn in self.reactions: + mb = rxn.check_mass_balance() + if 'charge' in mb and mb.get('H') == mb.get('charge'): + print(f'auto fix charge for {rxn.id}') + rxn.add_metabolites({ + self.compcompounds.cpd00067_c: -1 * mb['charge'] + }) class MSTemplateBuilder: def __init__( diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index 34b17f3d..f423e2e7 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -24,7 +24,7 @@ logging.INFO ) # When debugging - set this to INFO then change needed messages below from DEBUG to INFO -base_blacklist = {"rxn04656":"=","rxn07589":"=","rxn07588":"="} +base_blacklist = {"rxn04656":"=","rxn07589":"<","rxn07588":"<"} zero_threshold = 1e-8 From d04990a2c5e5fc552ca9806f0505a0ace6a96931 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 13 Feb 2025 13:32:00 -0600 Subject: [PATCH 273/298] Adding support for pigment and carbohydrate --- modelseedpy/core/mstemplate.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index b5cfde73..e8e54d16 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -534,6 +534,8 @@ def __init__( lipid, cellwall, cofactor, + pigment, + carbohydrate, energy, other, ): @@ -548,6 +550,8 @@ def __init__( :param lipid:float :param cellwall:float :param cofactor:float + :param pigment:float + :param carbohydrate:float :param energy:float :param other:float """ @@ -560,6 +564,8 @@ def __init__( self.lipid = lipid self.cellwall = cellwall self.cofactor = cofactor + self.pigment = pigment + self.carbohydrate = carbohydrate self.energy = energy self.other = other self.templateBiomassComponents = DictList() @@ -578,6 +584,8 @@ def from_table( lipid, cellwall, cofactor, + pigment, + carbohydrate, energy, other, ): @@ -591,6 +599,8 @@ def from_table( lipid, cellwall, cofactor, + pigment, + carbohydrate, energy, other, ) @@ -638,6 +648,8 @@ def from_dict(d, template): d["lipid"], d["cellwall"], d["cofactor"], + d["pigment"], + d["carbohydrate"], d["energy"], d["other"], ) @@ -701,6 +713,8 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5, add_to_model=Tr "rna", "energy", "other", + "pigment", + "carbohydrate" ] type_abundances = { "cofactor": self.cofactor, @@ -710,6 +724,8 @@ def build_biomass(self, model, index="0", classic=False, GC=0.5, add_to_model=Tr "dna": self.dna, "rna": self.rna, "energy": self.energy, + "pigment": self.pigment, + "carbohydrate": self.carbohydrate, } # Creating biomass reaction object metabolites = {} @@ -1127,6 +1143,8 @@ def overwrite_biomass_from_table( lipid, cellwall, cofactor, + pigment, + carbohydrate, energy, other, ): @@ -1144,6 +1162,8 @@ def overwrite_biomass_from_table( lipid, cellwall, cofactor, + pigment, + carbohydrate, energy, other, ) From c37cde4e69ec37daf5e4d512dc650c9db0b5b714 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 13 Feb 2025 13:34:34 -0600 Subject: [PATCH 274/298] Adding defaults for new fields pigment and carbohydrate --- modelseedpy/core/mstemplate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index e8e54d16..44e37cdb 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -648,8 +648,8 @@ def from_dict(d, template): d["lipid"], d["cellwall"], d["cofactor"], - d["pigment"], - d["carbohydrate"], + d.get("pigment",0), + d.get("carbohydrate",0), d["energy"], d["other"], ) From ee19f855838fa3c70c86f59b787b6af8cddc4fb7 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 13 Feb 2025 13:57:17 -0600 Subject: [PATCH 275/298] Fixing ModelSEEDDatabase calls in utils --- modelseedpy/core/msmodelutl.py | 51 +++++++++++++++------------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index d2936b4f..07d60175 100755 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -880,47 +880,42 @@ def assign_reliability_scores_to_reactions(self): if transported_charge < 0: reversescore += -50*transported_charge basescore = 0 - msrxn = biochem.reactions[msid] + msrxn = biochem.reactions.get_by_id(msid) #Penalizing for mass imbalance - if msrxn["status"][0:2] == "MI": + if msrxn.status[0:2] == "MI": basescore = 1000 #Penalizing for charge imbalance - if msrxn["status"][0:2] == "CI": + if msrxn.status[0:2] == "CI": basescore = 800 - #Penalizing if no pathways - if msrxn["pathways"] == None: - basescore = 50 + #Penalizing if no pathways TODO - cannot use this with ModelSEEDDatabase instead of ModelSEEDBiochem + #if msrxn["pathways"] == None: + # basescore = 50 #Penalizing if there is no deltaG - if "deltag" not in msrxn or msrxn["deltag"] == 10000000: + if msrxn.deltag == 10000000: basescore = 200 else: #Penalizing in the direction of infeasiblility - if msrxn["deltag"] <= -5: + if msrxn.deltag <= -5: reversescore += 20 - if msrxn["deltag"] <= -10: + if msrxn.deltag <= -10: reversescore += 20 - if msrxn["deltag"] >= 5: + if msrxn.deltag >= 5: forwardscore += 20 - if msrxn["deltag"] >= 10: + if msrxn.deltag >= 10: forwardscore += 20 #Penalizing reactions in direction of production of ATP - array = str(msrxn["stoichiometry"]).split(";") - for item in array: - subarray = item.split(":") - if len(subarray) > 1: - if subarray[1] == "cpd00002": - if float(subarray[0]) < 0: - reversescore += 100 - elif float(subarray[0]) > 0: - forwardscore += 100 - #Penalizing if a compound structure is unkown - if subarray[1] in biochem.compounds: - if "inchikey" not in biochem.compounds[subarray[1]] or biochem.compounds[subarray[1]]["inchikey"] == None: - basescore += 40 - if "formula" not in biochem.compounds[subarray[1]] or biochem.compounds[subarray[1]]["formula"] == None: - basescore += 60 - if "deltag" not in biochem.compounds[subarray[1]] or biochem.compounds[subarray[1]]["deltag"] == 10000000: - basescore += 20 + for cpd in msrxn.metabolites: + if cpd.id == "cpd00002": + if msrxn.metabolites[cpd] < 0: + reversescore += 100 + elif msrxn.metabolites[cpd] > 0: + forwardscore += 100 + if cpd.inchikey() == None: + basescore += 40 + if cpd.formula == None: + basescore += 60 + if cpd.deltag == 10000000: + basescore += 20 self.reliability_scores[reaction.id] = {} self.reliability_scores[reaction.id][">"] = basescore+forwardscore self.reliability_scores[reaction.id]["<"] = basescore+reversescore From 92fafbaeeaec4ccd17c3b122581000770d51d0a2 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 13 Feb 2025 14:03:22 -0600 Subject: [PATCH 276/298] Fixing reaction scoring --- modelseedpy/core/msmodelutl.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 07d60175..aca4103a 100755 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -891,17 +891,17 @@ def assign_reliability_scores_to_reactions(self): #if msrxn["pathways"] == None: # basescore = 50 #Penalizing if there is no deltaG - if msrxn.deltag == 10000000: + if msrxn.delta_g == 10000000 or msrxn.delta_g == None: basescore = 200 else: #Penalizing in the direction of infeasiblility - if msrxn.deltag <= -5: + if msrxn.delta_g <= -5: reversescore += 20 - if msrxn.deltag <= -10: + if msrxn.delta_g <= -10: reversescore += 20 - if msrxn.deltag >= 5: + if msrxn.delta_g >= 5: forwardscore += 20 - if msrxn.deltag >= 10: + if msrxn.delta_g >= 10: forwardscore += 20 #Penalizing reactions in direction of production of ATP for cpd in msrxn.metabolites: @@ -914,7 +914,7 @@ def assign_reliability_scores_to_reactions(self): basescore += 40 if cpd.formula == None: basescore += 60 - if cpd.deltag == 10000000: + if cpd.delta_g == 10000000 or cpd.delta_g == None: basescore += 20 self.reliability_scores[reaction.id] = {} self.reliability_scores[reaction.id][">"] = basescore+forwardscore From 0b289012c3cef5dc6a3789cd97faff632f5cd3ed Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 13 Feb 2025 14:06:22 -0600 Subject: [PATCH 277/298] Fixing reaction scoring --- modelseedpy/core/msmodelutl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index aca4103a..8dd34216 100755 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -910,7 +910,7 @@ def assign_reliability_scores_to_reactions(self): reversescore += 100 elif msrxn.metabolites[cpd] > 0: forwardscore += 100 - if cpd.inchikey() == None: + if cpd.inchi_key() == None: basescore += 40 if cpd.formula == None: basescore += 60 From a472beb4849ee5f771fa56e58b6baa5dbb9c4059 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 13 Feb 2025 14:09:04 -0600 Subject: [PATCH 278/298] Fixing reaction scoring --- modelseedpy/core/msmodelutl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 8dd34216..626d2c6d 100755 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -910,7 +910,7 @@ def assign_reliability_scores_to_reactions(self): reversescore += 100 elif msrxn.metabolites[cpd] > 0: forwardscore += 100 - if cpd.inchi_key() == None: + if cpd.inchi_key == None: basescore += 40 if cpd.formula == None: basescore += 60 From 89d84712e9c95fe1f24b1fb24f738a12f36389c1 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Thu, 13 Feb 2025 23:14:46 -0600 Subject: [PATCH 279/298] Attempting to fix variable mismatch --- modelseedpy/fbapkg/problemreplicationpkg.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modelseedpy/fbapkg/problemreplicationpkg.py b/modelseedpy/fbapkg/problemreplicationpkg.py index 53e5f6fe..675447c4 100644 --- a/modelseedpy/fbapkg/problemreplicationpkg.py +++ b/modelseedpy/fbapkg/problemreplicationpkg.py @@ -35,9 +35,12 @@ def build_package(self, parameters): self.variables[str(count)] = {} newobj = [] new_var_hash = {} + othermdl.solver = "gurobi" for var in othermdl.variables: if var.name not in shared_var_hash: + print("Original variable: " + str(Variable)) newvar = Variable.clone(var) + print("Copy variable: " + str(newvar)) newvar.name = var.name + "." + str(count) self.variables[str(count)][var.name] = newvar new_var_hash[var.name] = newvar From ee1872cd686b721d4b7cc641fa204f60f1a9ec31 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 15 Feb 2025 08:44:03 -0600 Subject: [PATCH 280/298] Trying to fix bug with problem replication with gurobi --- modelseedpy/fbapkg/problemreplicationpkg.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/modelseedpy/fbapkg/problemreplicationpkg.py b/modelseedpy/fbapkg/problemreplicationpkg.py index 675447c4..71e81244 100644 --- a/modelseedpy/fbapkg/problemreplicationpkg.py +++ b/modelseedpy/fbapkg/problemreplicationpkg.py @@ -35,13 +35,11 @@ def build_package(self, parameters): self.variables[str(count)] = {} newobj = [] new_var_hash = {} - othermdl.solver = "gurobi" for var in othermdl.variables: if var.name not in shared_var_hash: - print("Original variable: " + str(Variable)) - newvar = Variable.clone(var) - print("Copy variable: " + str(newvar)) - newvar.name = var.name + "." + str(count) + newvar = self.model.problem.Variable( + var.name + "." + str(count), lb=var.lb, ub=var.ub, type=var.type + ) self.variables[str(count)][var.name] = newvar new_var_hash[var.name] = newvar newobj.append(newvar) From a888d36c710084b6b65597c66c0e1ca80f75e294 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 22 Feb 2025 00:15:38 -0600 Subject: [PATCH 281/298] Fixing bugs in gapfilling --- modelseedpy/core/annotationontology.py | 9 ++++--- modelseedpy/core/msgapfill.py | 27 ++++++++++++++------- modelseedpy/core/msgrowthphenotypes.py | 33 ++++++++++++++++++++++---- modelseedpy/core/msmodelutl.py | 24 ++++++++++++++++--- modelseedpy/fbapkg/gapfillingpkg.py | 20 ++++++++++++---- 5 files changed, 91 insertions(+), 22 deletions(-) diff --git a/modelseedpy/core/annotationontology.py b/modelseedpy/core/annotationontology.py index 0ed14c3f..c361c911 100644 --- a/modelseedpy/core/annotationontology.py +++ b/modelseedpy/core/annotationontology.py @@ -37,6 +37,7 @@ "tmscore", "rmsd", "hmmscore", + "score" ] def convert_to_search_role(role): @@ -60,9 +61,9 @@ def __init__(self, parent, event, term, probability=1, scores={}, ref_entity=Non self.ref_entity = ref_entity self.entity_type = entity_type self.scores = scores - for item in self.scores: - if item not in allowable_score_types: - logger.warning(item + " not an allowable score type!") + #for item in self.scores: + #if item not in allowable_score_types: + #logger.warning(item + " not an allowable score type!") def to_data(self): output = { @@ -485,6 +486,8 @@ def get_events_from_priority_list(self,priority_list): elif item == "Merge": if len(event.method) > 5 and event.method[0:5] == "Merge" and event.id not in event_list: selected_merge = event.id + elif item in event.description or item in event.id: + event_list.append(event.id) if selected_merge: event_list.append(selected_merge) return event_list \ No newline at end of file diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 08ffde81..541947d0 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -116,7 +116,7 @@ def __init__( } ) - def test_gapfill_database(self, media, target=None, before_filtering=True): + def test_gapfill_database(self, media, target=None, before_filtering=True,active_reactions=[]): # Testing if gapfilling can work before filtering if target: self.gfpkgmgr.getpkg("GapfillingPkg").set_base_objective(target,None) @@ -126,7 +126,7 @@ def test_gapfill_database(self, media, target=None, before_filtering=True): target = target[13:] #Setting media self.gfpkgmgr.getpkg("KBaseMediaPkg").build_package(media) - if self.gfpkgmgr.getpkg("GapfillingPkg").test_gapfill_database(): + if self.gfpkgmgr.getpkg("GapfillingPkg").test_gapfill_database(active_reactions): return True if self.gfpkgmgr.getpkg("GapfillingPkg").test_solution.status == 'infeasible': return False @@ -162,14 +162,17 @@ def test_and_adjust_gapfilling_conditions(self,medias,targets,thresholds,prefilt "medias":[], "targets":[], "thresholds":[], - "conditions":[] + "conditions":[], + "active_reactions":[] } logger.debug("Testing unfiltered database") for i,media in enumerate(medias): - if self.test_gapfill_database(media,targets[i],before_filtering=True): + active_reactions = [] + if self.test_gapfill_database(media,targets[i],before_filtering=True,active_reactions=active_reactions): output["medias"].append(media) output["targets"].append(targets[i]) output["thresholds"].append(thresholds[i]) + output["active_reactions"].append(active_reactions) output["conditions"].append({ "media": media, "is_max_threshold": False, @@ -179,25 +182,29 @@ def test_and_adjust_gapfilling_conditions(self,medias,targets,thresholds,prefilt # Filtering if prefilter: logger.debug("Filtering database") - self.prefilter(growth_conditions=output["conditions"]) + self.prefilter(growth_conditions=output["conditions"],active_reaction_sets=output["active_reactions"]) medias = [] targets = [] thresholds = [] conditions = [] + active_reaction_sets = [] logger.debug("Testing filtered database") for i,media in enumerate(output["medias"]): - if self.test_gapfill_database(media,output["targets"][i],before_filtering=False): + active_reactions = [] + if self.test_gapfill_database(media,output["targets"][i],before_filtering=False,active_reactions=active_reactions): medias.append(media) targets.append(output["targets"][i]) thresholds.append(output["thresholds"][i]) conditions.append(output["conditions"][i]) + active_reaction_sets.append(active_reactions) output["medias"] = medias output["targets"] = targets output["thresholds"] = thresholds output["conditions"] = conditions + output["active_reactions"] = active_reaction_sets return output - def prefilter(self,test_conditions=None,growth_conditions=[],use_prior_filtering=False,base_filter_only=False): + def prefilter(self,test_conditions=None,growth_conditions=[],use_prior_filtering=False,base_filter_only=False,active_reaction_sets=[]): """Prefilters the database by removing any reactions that break specified ATP tests Parameters ---------- @@ -215,7 +222,8 @@ def prefilter(self,test_conditions=None,growth_conditions=[],use_prior_filtering self.test_conditions, growth_conditions=growth_conditions, base_filter=base_filter, - base_filter_only=base_filter_only + base_filter_only=base_filter_only, + active_reaction_sets=active_reaction_sets ) gf_filter = self.gfpkgmgr.getpkg("GapfillingPkg").modelutl.get_attributes( "gf_filter", {} @@ -355,6 +363,7 @@ def run_global_gapfilling( self.gfpkgmgr.getpkg("GapfillingPkg").set_media(media) #Copying model and either making it the base model or adding to the model list model_cpy = self.gfmodel.copy() + if i == 0: merged_model = model_cpy else: @@ -400,7 +409,9 @@ def run_global_gapfilling( self.mdlutl.printlp(model=merged_model,filename="GlobalGapfill",print=True) # Running gapfilling and checking solution + print("Runninng global optimization") sol = merged_model.optimize() + print("Global optimization complete") logger.info( f"gapfill solution objective value {sol.objective_value} ({sol.status}) for media {media}" ) diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 986eb72e..23f04c77 100755 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -281,11 +281,15 @@ def gapfill_model_for_phenotype( return gfresults - class MSGrowthPhenotypes: def __init__( - self, base_media=None, base_uptake=0, base_excretion=1000, global_atom_limits={} + self, base_media=None, base_uptake=0, base_excretion=1000, global_atom_limits={}, id=None, name=None, source=None, source_id=None, type=None ): + self.id = id + self.name = name + self.source = source + self.source_id = source_id + self.type = type self.base_media = base_media self.phenotypes = DictList() self.base_uptake = base_uptake @@ -304,7 +308,7 @@ def from_compound_hash( type="growth" ): growthpheno = MSGrowthPhenotypes( - base_media, base_uptake, base_excretion, global_atom_limits + base_media=base_media, base_uptake=base_uptake, base_excretion=base_excretion, global_atom_limits=global_atom_limits, id=None, name=None, source=None, source_id=None, type=None ) new_phenos = [] for cpd in compounds: @@ -323,7 +327,7 @@ def from_kbase_object( global_atom_limits={}, ): growthpheno = MSGrowthPhenotypes( - base_media, base_uptake, base_excretion, global_atom_limits + base_media=base_media, base_uptake=base_uptake, base_excretion=base_excretion, global_atom_limits=global_atom_limits, id=data["id"], name=data["name"], source=data["source"], source_id=data["source_id"], type=data["type"] ) new_phenos = [] for pheno in data["phenotypes"]: @@ -414,6 +418,27 @@ def from_ms_file( growthpheno.add_phenotypes(new_phenos) return growthpheno + def to_kbase_json(self,genome_ref): + pheno_data = { + "id": self.id, + "name": self.name, + "source": self.source, + "source_id": self.source_id, + "type": self.type, + "phenotypes": [], + "genome_ref": genome_ref + } + for pheno in self.phenotypes: + pheno_data["phenotypes"].append({ + "id": pheno.id, + "name": pheno.name, + "media_ref": pheno.media.info.ref, + "normalizedGrowth": pheno.experimental_value, + "geneko_refs": pheno.gene_ko, + "additionalcompound_refs": pheno.additional_compounds + }) + return pheno_data + def build_super_media(self): super_media = None for pheno in self.phenotypes: diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 626d2c6d..c6d7ec21 100755 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -852,13 +852,21 @@ def add_ms_reaction(self, rxn_dict, compartment_trans=["c0", "e0"]): ################################################################################# # Functions related to utility functions ################################################################################# - def assign_reliability_scores_to_reactions(self): + def assign_reliability_scores_to_reactions(self,active_reaction_sets=[]): """Assigns a reliability score to every model reaction which indicates how likely the reaction is to be accurate and to take place Returns ------- { reaction ID : { reaction direction : score } } """ + active_rxn_dictionary={} + for item in active_reaction_sets: + for array in item: + if array[0] not in active_rxn_dictionary: + active_rxn_dictionary[array[0]] = {} + if array[1] not in active_rxn_dictionary[array[0]]: + active_rxn_dictionary[array[0]][array[1]] = 0 + active_rxn_dictionary[array[0]][array[1]]+=1 if self.reliability_scores == None: self.reliability_scores = {} biochem = ModelSEEDBiochem.get() @@ -927,6 +935,15 @@ def assign_reliability_scores_to_reactions(self): self.reliability_scores[reaction.id] = {} self.reliability_scores[reaction.id][">"] = 1000 self.reliability_scores[reaction.id]["<"] = 1000 + for_multiplier = 1 + rev_multiplier = 1 + if reaction.id in active_rxn_dictionary: + if ">" in active_rxn_dictionary[reaction.id]: + for_multiplier += 0.1*active_rxn_dictionary[reaction.id][">"] + if "<" in active_rxn_dictionary[reaction.id]: + rev_multiplier += 0.1*active_rxn_dictionary[reaction.id]["<"] + self.reliability_scores[reaction.id][">"] = self.reliability_scores[reaction.id][">"]*for_multiplier + self.reliability_scores[reaction.id]["<"] = self.reliability_scores[reaction.id]["<"]*rev_multiplier return self.reliability_scores def is_core(self,rxn): @@ -1636,7 +1653,8 @@ def reaction_expansion_test( binary_search=True, attribute_label="gf_filter", positive_growth=[], - resort_by_score=True + resort_by_score=True, + active_reaction_sets=[] ): """Adds reactions in reaction list one by one and appplies tests, filtering reactions that fail @@ -1659,7 +1677,7 @@ def reaction_expansion_test( self.breaking_reaction = None filtered_list = [] if resort_by_score: - scores = self.assign_reliability_scores_to_reactions() + scores = self.assign_reliability_scores_to_reactions(active_reaction_sets=active_reaction_sets) reaction_list = sorted(reaction_list, key=lambda x: scores[x[0].id][x[1]]) for item in reaction_list: logger.debug(item[0].id+":"+item[1]+":"+str(scores[item[0].id][item[1]])) diff --git a/modelseedpy/fbapkg/gapfillingpkg.py b/modelseedpy/fbapkg/gapfillingpkg.py index f423e2e7..d8acb5b0 100644 --- a/modelseedpy/fbapkg/gapfillingpkg.py +++ b/modelseedpy/fbapkg/gapfillingpkg.py @@ -8,6 +8,7 @@ import json from optlang.symbolics import Zero, add from cobra import Model, Reaction, Metabolite +from cobra.flux_analysis import pfba from cobra.io import ( load_json_model, save_json_model, @@ -717,7 +718,7 @@ def run_test_conditions(self, condition_list, solution=None, max_iterations=10): return None return solution - def test_gapfill_database(self): + def test_gapfill_database(self,active_reactions=[]): self.reset_objective_minimum(0,False) self.model.objective = self.original_objective self.test_solution = self.model.optimize() @@ -731,6 +732,11 @@ def test_gapfill_database(self): self.model.objective = self.parameters["gfobj"] if self.test_solution.objective_value < self.parameters["minimum_obj"] or self.test_solution.status == 'infeasible': return False + #Running pFBA to determine active reactions for nonzero objective + solution = pfba(self.model) + for rxn in self.model.reactions: + if solution.fluxes[rxn.id] > 0: + active_reactions.append([rxn.id,">"]) return True def reset_objective_minimum(self, min_objective,reset_params=True): @@ -749,7 +755,7 @@ def reset_objective_minimum(self, min_objective,reset_params=True): if min_objective < 0: self.pkgmgr.getpkg("ObjConstPkg").constraints["objc"]["1"].ub = min_objective - def filter_database_based_on_tests(self,test_conditions,growth_conditions=[],base_filter=None,base_target="rxn00062_c0",base_filter_only=False,all_noncore=True): + def filter_database_based_on_tests(self,test_conditions,growth_conditions=[],base_filter=None,base_target="rxn00062_c0",base_filter_only=False,all_noncore=True,active_reaction_sets=[]): #Saving the current media current_media = self.current_media() #Clearing element uptake constraints @@ -776,20 +782,26 @@ def filter_database_based_on_tests(self,test_conditions,growth_conditions=[],bas if not base_filter_only: with self.model: rxnlist = [] + rxndict = {} for reaction in self.model.reactions: if reaction.id in self.gapfilling_penalties: + rxndict[reaction.id] = 1 if "reverse" in self.gapfilling_penalties[reaction.id]: rxnlist.append([reaction, "<"]) if "forward" in self.gapfilling_penalties[reaction.id]: rxnlist.append([reaction, ">"]) elif all_noncore and not self.modelutl.is_core(reaction): + rxndict[reaction.id] = 1 if reaction.lower_bound < 0: rxnlist.append([reaction, "<"]) if reaction.upper_bound > 0: rxnlist.append([reaction, ">"]) + print("Full model:",len(self.modelutl.model.reactions)) + print("Gapfilling count:",len(self.gapfilling_penalties)) + print("Reaction list:",len(rxndict)) filtered_list = self.modelutl.reaction_expansion_test( - rxnlist, test_conditions - ) + rxnlist, test_conditions,active_reaction_sets=active_reaction_sets + )#,positive_growth=growth_conditions #Adding base filter reactions to model if base_filter != None: gf_filter_att = self.modelutl.get_attributes("gf_filter", {}) From e571d2dd63a0e3d1d9860d6c874f99280de8aa1b Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 22 Feb 2025 23:10:20 -0600 Subject: [PATCH 282/298] Debugging global gapfill solution saving --- modelseedpy/core/msgapfill.py | 8 ++++++-- modelseedpy/core/msmodelutl.py | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 541947d0..da99d3c6 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -345,6 +345,7 @@ def run_global_gapfilling( check_for_growth : bool Indicates if the model should be checked to ensure that the resulting gapfilling solution produces a nonzero objective """ + start_time = time.time() # Testing if gapfilling can work before filtering test_output = self.test_and_adjust_gapfilling_conditions(medias,targets,thresholds,prefilter=prefilter) #If none of the media conditions can be gapfilled, then return None @@ -409,9 +410,9 @@ def run_global_gapfilling( self.mdlutl.printlp(model=merged_model,filename="GlobalGapfill",print=True) # Running gapfilling and checking solution - print("Runninng global optimization") + print("Starting global optimization-",time.time()-start_time) sol = merged_model.optimize() - print("Global optimization complete") + print("Global optimization complete-",time.time()-start_time) logger.info( f"gapfill solution objective value {sol.objective_value} ({sol.status}) for media {media}" ) @@ -445,6 +446,7 @@ def run_global_gapfilling( flux_values[rxnid]["forward"] = gfrxnidhash[rxnid]["forward"].primal global_solution = origgfpkg.compute_gapfilled_solution(flux_values) logger.info(f"Gloabl solution: {global_solution}") + print("Global gapfilling done -",time.time()-start_time) return global_solution def run_multi_gapfill( @@ -729,6 +731,7 @@ def integrate_gapfill_solution( # cumulative_solution.append(item) logger.info(f"Cumulative media target solution: {str(current_media_target_solution)}") else: + print("Test solution:",solution["media"].id) unneeded = self.mdlutl.test_solution(full_solution,[solution["target"]],[solution["media"]],[solution["minobjective"]],remove_unneeded_reactions,do_not_remove_list=cumulative_solution)#Returns reactions in input solution that are not needed for growth for item in cumulative_solution: if not self.mdlutl.find_item_in_solution(unneeded,item): @@ -747,6 +750,7 @@ def integrate_gapfill_solution( current_media_target_solution["growth"] = self.mdlutl.model.slim_optimize() logger.info(f"Growth: {str(current_media_target_solution['growth'])} {solution['media'].id}") # Adding the gapfilling solution data to the model, which is needed for saving the model in KBase + print("adding gapfilling:",solution["media"].id) self.mdlutl.add_gapfilling(solution) # Testing which gapfilled reactions are needed to produce each reactant in the objective function self.cumulative_gapfilling.extend(cumulative_solution) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index c6d7ec21..530f6077 100755 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -1303,7 +1303,7 @@ def test_solution(self,solution,targets,medias,thresholds=[0.1],remove_unneeded_ return unneeded def add_gapfilling(self, solution): - logger.debug("Adding gapfilling:"+str(solution)) + logger.info("Adding gapfilling:"+str(solution)) self.integrated_gapfillings.append(solution) def create_kb_gapfilling_data(self, kbmodel, atpmedia_ws="94026"): From 48ff1b10a280dbf77fa93577d6e362689c2645de Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 22 Feb 2025 23:37:58 -0600 Subject: [PATCH 283/298] Debugging gene finder for gapfilled reactions --- modelseedpy/core/msgapfill.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index da99d3c6..41793d7a 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -685,7 +685,7 @@ def integrate_gapfill_solution( #Setting genes from reaction scores in we have them coreid = re.sub(r"_[a-z]\d+$", "", item[0]) if coreid in self.reaction_scores: - logger.debug(f"Found reaction scores for coreid: {coreid}") + logger.info(f"Found reaction scores for coreid: {coreid}") bestgene = None bestscore = None for gene in self.reaction_scores[coreid]: @@ -702,7 +702,7 @@ def integrate_gapfill_solution( bestgene = gene bestscore = score rxn = self.model.reactions.get_by_id(item[0]) - logger.debug(f"Assigning gene to reaction: {item[0]} {bestgene}") + logger.info(f"Assigning gene to reaction: {item[0]} {bestgene}") rxn.gene_reaction_rule = bestgene rxn.notes["new_genes"] = bestgene print("Assigning gene to reaction: "+item[0]+" "+bestgene) From 93e4bbd426e2d199b3ab959f978a4557b04148fe Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sun, 23 Feb 2025 08:34:45 -0600 Subject: [PATCH 284/298] Adding time import --- modelseedpy/core/msgapfill.py | 1 + 1 file changed, 1 insertion(+) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 41793d7a..ed9dec6a 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -6,6 +6,7 @@ import json import numpy as np import pandas as pd +import time from optlang.symbolics import Zero, add from modelseedpy.core import FBAHelper # !!! the import is never used from modelseedpy.fbapkg.mspackagemanager import MSPackageManager From b569bdd16376d3a6baa3ca3b0be0bd732ded0015 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sun, 23 Feb 2025 11:23:16 -0600 Subject: [PATCH 285/298] Fixing gapfilling --- modelseedpy/core/msgapfill.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index ed9dec6a..5978b6d2 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -542,6 +542,7 @@ def run_multi_gapfill( if gapfilling_mode == "Global": #Now we run simultaneous gapfilling on a combination of all our various gapfilled models print("Running global gapfilling!") + print("Reaction scores:",self.reaction_scores) full_solution = self.run_global_gapfilling( medias=test_output["medias"], targets=test_output["targets"], @@ -551,13 +552,14 @@ def run_multi_gapfill( ) #Now we integrate the full solution into the model for every media which effectively determines which reactions are needed for each media for i,item in enumerate(test_output["medias"]): - full_solution["media"] = item - full_solution["target"] = test_output["targets"][i] - full_solution["minobjective"] = test_output["thresholds"][i] - full_solution["binary_check"] = binary_check + copy_solution = full_solution.copy() + copy_solution["media"] = item + copy_solution["target"] = test_output["targets"][i] + copy_solution["minobjective"] = test_output["thresholds"][i] + copy_solution["binary_check"] = binary_check #In this case we donot remove unnneeded reactions from the model because they may be needed for other media solution_dictionary[item] = self.integrate_gapfill_solution( - full_solution, + copy_solution, cumulative_solution=cumulative_solution, remove_unneeded_reactions=False, check_for_growth=check_for_growth, @@ -573,6 +575,7 @@ def run_multi_gapfill( remove_unneeded_reactions=True, do_not_remove_list=[] )#Returns reactions in cumulative solution that are not needed for growth + print("Unneeded in global gapfill:",unneeded) elif gapfilling_mode == "Sequential": #Restoring the gapfilling objective function self.gfpkgmgr.getpkg("GapfillingPkg").compute_gapfilling_penalties(reaction_scores=self.reaction_scores) @@ -732,7 +735,6 @@ def integrate_gapfill_solution( # cumulative_solution.append(item) logger.info(f"Cumulative media target solution: {str(current_media_target_solution)}") else: - print("Test solution:",solution["media"].id) unneeded = self.mdlutl.test_solution(full_solution,[solution["target"]],[solution["media"]],[solution["minobjective"]],remove_unneeded_reactions,do_not_remove_list=cumulative_solution)#Returns reactions in input solution that are not needed for growth for item in cumulative_solution: if not self.mdlutl.find_item_in_solution(unneeded,item): @@ -751,8 +753,7 @@ def integrate_gapfill_solution( current_media_target_solution["growth"] = self.mdlutl.model.slim_optimize() logger.info(f"Growth: {str(current_media_target_solution['growth'])} {solution['media'].id}") # Adding the gapfilling solution data to the model, which is needed for saving the model in KBase - print("adding gapfilling:",solution["media"].id) - self.mdlutl.add_gapfilling(solution) + self.mdlutl.add_gapfilling(current_media_target_solution) # Testing which gapfilled reactions are needed to produce each reactant in the objective function self.cumulative_gapfilling.extend(cumulative_solution) return current_media_target_solution From 84317b78258054ca4d4c52bd1d11602d48b1cf41 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sun, 23 Feb 2025 13:26:26 -0600 Subject: [PATCH 286/298] Removing debugging print --- modelseedpy/core/msgapfill.py | 1 - modelseedpy/core/msgrowthphenotypes.py | 9 ++++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 5978b6d2..22c6a190 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -542,7 +542,6 @@ def run_multi_gapfill( if gapfilling_mode == "Global": #Now we run simultaneous gapfilling on a combination of all our various gapfilled models print("Running global gapfilling!") - print("Reaction scores:",self.reaction_scores) full_solution = self.run_global_gapfilling( medias=test_output["medias"], targets=test_output["targets"], diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index 23f04c77..e1a3e1ee 100755 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -536,7 +536,7 @@ def simulate_phenotypes( # Running simulations gapfilling_solutions = {} totalcount = 0 - datahash = {} + datahash = {"summary": {}} for pheno in self.phenotypes: result = pheno.simulate( modelutl, @@ -599,6 +599,13 @@ def simulate_phenotypes( summary["Count"][0] = None else: summary["Count"][0] = summary["Count"][0] / totalcount + datahash["summary"]["accuracy"] = summary["Count"][0] + datahash["summary"]["CP"] = summary["Count"][1] + datahash["summary"]["CN"] = summary["Count"][2] + datahash["summary"]["FP"] = summary["Count"][3] + datahash["summary"]["FN"] = summary["Count"][4] + datahash["summary"]["P"] = summary["Count"][5] + datahash["summary"]["N"] = summary["Count"][6] sdf = pd.DataFrame(summary) df = pd.DataFrame(data) self.adjust_phenotype_calls(df) From d12f2cd6fe6ce08e88386ccef8368199eb2bf8e3 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sun, 23 Feb 2025 23:06:23 -0600 Subject: [PATCH 287/298] Debugging issue with reaction bounds on gapfilled reactions --- modelseedpy/core/msgapfill.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 22c6a190..0dba734e 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -566,6 +566,12 @@ def run_multi_gapfill( ) #Now we remove reactions uneeded for any of the specified media conditions #These is a danger here that the integration step will put a reaction into a solution that subsequently gets removed at this step. This is something to look out for + print("Bounds before final testing") + for item in model.integrated_gapfillings: + for rxn in item["new"]: + print(rxn.id,item["new"][rxn],model.reactions.get_by_id(rxn.id).lower_bound,model.reactions.get_by_id(rxn.id).upper_bound) + for rxn in item["reversed"]: + print(rxn.id,item["new"][rxn],model.reactions.get_by_id(rxn.id).lower_bound,model.reactions.get_by_id(rxn.id).upper_bound) unneeded = self.mdlutl.test_solution( cumulative_solution, test_output["targets"], @@ -574,6 +580,12 @@ def run_multi_gapfill( remove_unneeded_reactions=True, do_not_remove_list=[] )#Returns reactions in cumulative solution that are not needed for growth + print("Bounds after final testing") + for item in model.integrated_gapfillings: + for rxn in item["new"]: + print(rxn.id,item["new"][rxn],model.reactions.get_by_id(rxn.id).lower_bound,model.reactions.get_by_id(rxn.id).upper_bound) + for rxn in item["reversed"]: + print(rxn.id,item["new"][rxn],model.reactions.get_by_id(rxn.id).lower_bound,model.reactions.get_by_id(rxn.id).upper_bound) print("Unneeded in global gapfill:",unneeded) elif gapfilling_mode == "Sequential": #Restoring the gapfilling objective function @@ -656,7 +668,7 @@ def integrate_gapfill_solution( gapfilling_mode : Cumulative, Independent, Simultaneous Specify what the gapfilling mode is because this determines how integration is performed """ - logger.info(f"Initial solution: {str(solution)}") + logger.debug(f"Initial solution: {str(solution)}") original_objective = self.mdlutl.model.objective self.mdlutl.model.objective = solution["target"] self.mdlutl.model.objective.direction = "max" @@ -719,7 +731,7 @@ def integrate_gapfill_solution( new_cumulative_reactions.append([item[0], item[1],item[2]]) #Testing the full cumulative solution to see which reactions are needed for current media/target full_solution = cumulative_solution + new_cumulative_reactions - logger.info(f"Full solution: {str(full_solution)}") + logger.debug(f"Full solution: {str(full_solution)}") #Setting up structure to store the finalized solution for this media/target current_media_target_solution = {"growth":0,"media":solution["media"],"target":solution["target"],"minobjective":solution["minobjective"],"binary_check":solution["binary_check"] ,"new":{},"reversed":{}} #If gapfilling is independent, we only check the specific solution @@ -744,8 +756,8 @@ def integrate_gapfill_solution( cumulative_solution.append(item) #elif not remove_unneeded_reactions: # cumulative_solution.append(item) - logger.info(f"Unneeded: {str(unneeded)}") - logger.info(f"Cumulative: {str(self.cumulative_gapfilling)}") + logger.debug(f"Unneeded: {str(unneeded)}") + logger.debug(f"Cumulative: {str(self.cumulative_gapfilling)}") #Checking that the final integrated model grows if check_for_growth: self.mdlutl.pkgmgr.getpkg("KBaseMediaPkg").build_package(solution["media"]) From a549592e08d1ebbca4e142ef24be2c0ad607c35f Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 24 Feb 2025 10:25:04 -0600 Subject: [PATCH 288/298] Fixing bug in debuging prints --- modelseedpy/core/msgapfill.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 0dba734e..3ef0a832 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -569,9 +569,9 @@ def run_multi_gapfill( print("Bounds before final testing") for item in model.integrated_gapfillings: for rxn in item["new"]: - print(rxn.id,item["new"][rxn],model.reactions.get_by_id(rxn.id).lower_bound,model.reactions.get_by_id(rxn.id).upper_bound) + print(rxn.id,item["new"][rxn],self.model.reactions.get_by_id(rxn.id).lower_bound,self.model.reactions.get_by_id(rxn.id).upper_bound) for rxn in item["reversed"]: - print(rxn.id,item["new"][rxn],model.reactions.get_by_id(rxn.id).lower_bound,model.reactions.get_by_id(rxn.id).upper_bound) + print(rxn.id,item["new"][rxn],self.model.reactions.get_by_id(rxn.id).lower_bound,self.model.reactions.get_by_id(rxn.id).upper_bound) unneeded = self.mdlutl.test_solution( cumulative_solution, test_output["targets"], @@ -583,9 +583,9 @@ def run_multi_gapfill( print("Bounds after final testing") for item in model.integrated_gapfillings: for rxn in item["new"]: - print(rxn.id,item["new"][rxn],model.reactions.get_by_id(rxn.id).lower_bound,model.reactions.get_by_id(rxn.id).upper_bound) + print(rxn.id,item["new"][rxn],self.model.reactions.get_by_id(rxn.id).lower_bound,self.model.reactions.get_by_id(rxn.id).upper_bound) for rxn in item["reversed"]: - print(rxn.id,item["new"][rxn],model.reactions.get_by_id(rxn.id).lower_bound,model.reactions.get_by_id(rxn.id).upper_bound) + print(rxn.id,item["new"][rxn],self.model.reactions.get_by_id(rxn.id).lower_bound,self.model.reactions.get_by_id(rxn.id).upper_bound) print("Unneeded in global gapfill:",unneeded) elif gapfilling_mode == "Sequential": #Restoring the gapfilling objective function From 7c74a9e25fdd1f38aa8b9a80e5d4e23ddd46c68e Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 24 Feb 2025 15:14:02 -0600 Subject: [PATCH 289/298] Fixing phenotype simulation and gapfilling debugging --- modelseedpy/core/msgapfill.py | 4 ++-- modelseedpy/core/msgrowthphenotypes.py | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 3ef0a832..067bf17a 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -567,7 +567,7 @@ def run_multi_gapfill( #Now we remove reactions uneeded for any of the specified media conditions #These is a danger here that the integration step will put a reaction into a solution that subsequently gets removed at this step. This is something to look out for print("Bounds before final testing") - for item in model.integrated_gapfillings: + for item in self.model.integrated_gapfillings: for rxn in item["new"]: print(rxn.id,item["new"][rxn],self.model.reactions.get_by_id(rxn.id).lower_bound,self.model.reactions.get_by_id(rxn.id).upper_bound) for rxn in item["reversed"]: @@ -581,7 +581,7 @@ def run_multi_gapfill( do_not_remove_list=[] )#Returns reactions in cumulative solution that are not needed for growth print("Bounds after final testing") - for item in model.integrated_gapfillings: + for item in self.model.integrated_gapfillings: for rxn in item["new"]: print(rxn.id,item["new"][rxn],self.model.reactions.get_by_id(rxn.id).lower_bound,self.model.reactions.get_by_id(rxn.id).upper_bound) for rxn in item["reversed"]: diff --git a/modelseedpy/core/msgrowthphenotypes.py b/modelseedpy/core/msgrowthphenotypes.py index e1a3e1ee..58d00f29 100755 --- a/modelseedpy/core/msgrowthphenotypes.py +++ b/modelseedpy/core/msgrowthphenotypes.py @@ -197,7 +197,7 @@ def simulate( # Determining phenotype class if output["objective_value"] != None and output["objective_value"] >= output["baseline_objective"] * multiplier: output["postive"] = True - if not self.experimental_value or ignore_experimental_data: + if self.experimental_value == None or ignore_experimental_data: output["class"] = "P" elif self.experimental_value > 0: output["class"] = "CP" @@ -555,17 +555,21 @@ def simulate_phenotypes( data["Transports missing"].append(";".join(result["missing_transports"])) if result["class"] == "CP": summary["Count"][1] += 1 + summary["Count"][5] += 1 summary["Count"][0] += 1 totalcount += 1 elif result["class"] == "CN": summary["Count"][2] += 1 summary["Count"][0] += 1 + summary["Count"][6] += 1 totalcount += 1 elif result["class"] == "FP": summary["Count"][3] += 1 + summary["Count"][5] += 1 totalcount += 1 elif result["class"] == "FN": summary["Count"][4] += 1 + summary["Count"][6] += 1 totalcount += 1 elif result["class"] == "P": summary["Count"][5] += 1 From 844bf4a99ffa00cf0b52076dc89644906a760d14 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Mon, 24 Feb 2025 23:27:37 -0600 Subject: [PATCH 290/298] Fixing ensemble and gapfilling --- modelseedpy/core/msensemble.py | 10 +++++----- modelseedpy/core/msgapfill.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modelseedpy/core/msensemble.py b/modelseedpy/core/msensemble.py index 3ab43eed..49f755db 100755 --- a/modelseedpy/core/msensemble.py +++ b/modelseedpy/core/msensemble.py @@ -60,11 +60,13 @@ def __init__(self,model_or_mdlutl,reaction_probabilities=None): self.data["reactions"][rxn.id] = { "presence": "", "gapfilling":"", - "genes": {} + "genes": {}, + "probability": 0 } for gene in rxn.genes: self.data["reactions"][rxn.id]["genes"][gene.id] = { - "presence": "" + "presence": "", + "probability": 0 } if reaction_probabilities: self.reset_reaction_probabilities(reaction_probabilities) @@ -82,14 +84,12 @@ def reset_reaction_probabilities(self,reaction_probability_hash,clear_existing=F #Overwriting reaction probabilities from input hash for rxnid in reaction_probability_hash: if rxnid in self.model.reactions: - rxnobj = self.model.reactions.get_by_id(rxnid) if rxnid not in self.data["reactions"]: - self.data["reactions"][rxnid] = {"presence":"","genes":{}} + self.data["reactions"][rxnid] = {"probability":0,"presence":"","genes":{}} if "probability" in reaction_probability_hash[rxnid]: self.data["reactions"][rxnid]["probability"] = reaction_probability_hash[rxnid]["probability"] if "genes" in reaction_probability_hash[rxnid]: for geneid in reaction_probability_hash[rxnid]["genes"]: - #if geneid in rxnobj.genes: self.data["reactions"][rxnid]["genes"][geneid] = {"presence":"","probability":reaction_probability_hash[rxnid]["genes"][geneid]} def rebuild_from_models(self,models):#DONE diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 067bf17a..34115191 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -567,7 +567,7 @@ def run_multi_gapfill( #Now we remove reactions uneeded for any of the specified media conditions #These is a danger here that the integration step will put a reaction into a solution that subsequently gets removed at this step. This is something to look out for print("Bounds before final testing") - for item in self.model.integrated_gapfillings: + for item in self.mdlutl.integrated_gapfillings: for rxn in item["new"]: print(rxn.id,item["new"][rxn],self.model.reactions.get_by_id(rxn.id).lower_bound,self.model.reactions.get_by_id(rxn.id).upper_bound) for rxn in item["reversed"]: @@ -581,7 +581,7 @@ def run_multi_gapfill( do_not_remove_list=[] )#Returns reactions in cumulative solution that are not needed for growth print("Bounds after final testing") - for item in self.model.integrated_gapfillings: + for item in self.mdlutl.integrated_gapfillings: for rxn in item["new"]: print(rxn.id,item["new"][rxn],self.model.reactions.get_by_id(rxn.id).lower_bound,self.model.reactions.get_by_id(rxn.id).upper_bound) for rxn in item["reversed"]: From 76e350799936fc8799618122a8b479c79da1c124 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 25 Feb 2025 09:26:53 -0600 Subject: [PATCH 291/298] Fixing bug --- modelseedpy/core/msgapfill.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 34115191..72fbae2f 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -569,9 +569,9 @@ def run_multi_gapfill( print("Bounds before final testing") for item in self.mdlutl.integrated_gapfillings: for rxn in item["new"]: - print(rxn.id,item["new"][rxn],self.model.reactions.get_by_id(rxn.id).lower_bound,self.model.reactions.get_by_id(rxn.id).upper_bound) + print(rxn,item["new"][rxn],self.model.reactions.get_by_id(rxn).lower_bound,self.model.reactions.get_by_id(rxn).upper_bound) for rxn in item["reversed"]: - print(rxn.id,item["new"][rxn],self.model.reactions.get_by_id(rxn.id).lower_bound,self.model.reactions.get_by_id(rxn.id).upper_bound) + print(rxn,item["new"][rxn],self.model.reactions.get_by_id(rxn).lower_bound,self.model.reactions.get_by_id(rxn).upper_bound) unneeded = self.mdlutl.test_solution( cumulative_solution, test_output["targets"], @@ -583,9 +583,9 @@ def run_multi_gapfill( print("Bounds after final testing") for item in self.mdlutl.integrated_gapfillings: for rxn in item["new"]: - print(rxn.id,item["new"][rxn],self.model.reactions.get_by_id(rxn.id).lower_bound,self.model.reactions.get_by_id(rxn.id).upper_bound) + print(rxn,item["new"][rxn],self.model.reactions.get_by_id(rxn).lower_bound,self.model.reactions.get_by_id(rxn).upper_bound) for rxn in item["reversed"]: - print(rxn.id,item["new"][rxn],self.model.reactions.get_by_id(rxn.id).lower_bound,self.model.reactions.get_by_id(rxn.id).upper_bound) + print(rxn,item["new"][rxn],self.model.reactions.get_by_id(rxn).lower_bound,self.model.reactions.get_by_id(rxn).upper_bound) print("Unneeded in global gapfill:",unneeded) elif gapfilling_mode == "Sequential": #Restoring the gapfilling objective function From 5455ff1672aaa4af657f79df704635b07aa5e579 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 25 Feb 2025 15:08:56 -0600 Subject: [PATCH 292/298] Fixing bug causing gapfilled reactions to be KO during testing --- modelseedpy/core/msmodelutl.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/modelseedpy/core/msmodelutl.py b/modelseedpy/core/msmodelutl.py index 530f6077..fbc12a8b 100755 --- a/modelseedpy/core/msmodelutl.py +++ b/modelseedpy/core/msmodelutl.py @@ -1210,6 +1210,14 @@ def test_solution(self,solution,targets,medias,thresholds=[0.1],remove_unneeded_ rxn_id = item[0] other_original_bound = None rxnobj = self.model.reactions.get_by_id(rxn_id) + if item[1] == ">": + original_bound = rxnobj.upper_bound + if rxnobj.lower_bound > 0: + other_original_bound = rxnobj.lower_bound + else: + original_bound = rxnobj.lower_bound + if rxnobj.upper_bound < 0: + other_original_bound = rxnobj.upper_bound #Testing all media and target and threshold combinations to see if the reaction is needed needed = False for (i,target) in enumerate(targets): @@ -1221,15 +1229,11 @@ def test_solution(self,solution,targets,medias,thresholds=[0.1],remove_unneeded_ #Knocking out the reaction to test for the impact on the objective #This has to happen after media is applied in case the reaction is an exchange if item[1] == ">": - original_bound = rxnobj.upper_bound if rxnobj.lower_bound > 0: - other_original_bound = rxnobj.lower_bound rxnobj.lower_bound = 0 rxnobj.upper_bound = 0 else: - original_bound = rxnobj.lower_bound if rxnobj.upper_bound < 0: - other_original_bound = rxnobj.upper_bound rxnobj.upper_bound = 0 rxnobj.lower_bound = 0 #Computing the objective value From c2b88affa933fc1646d6417e28f8d714f6fd8adc Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 25 Feb 2025 17:16:58 -0600 Subject: [PATCH 293/298] Fixing ensemble and removing prints --- modelseedpy/core/msensemble.py | 11 +++++++---- modelseedpy/core/msgapfill.py | 14 +------------- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/modelseedpy/core/msensemble.py b/modelseedpy/core/msensemble.py index 49f755db..f58efd19 100755 --- a/modelseedpy/core/msensemble.py +++ b/modelseedpy/core/msensemble.py @@ -57,16 +57,19 @@ def __init__(self,model_or_mdlutl,reaction_probabilities=None): "reactions": {} } for rxn in self.model.reactions: + probability = 0 + if rxn.id[0:3] == "bio" or rxn.id[0:3] == "EX_" or rxn.id[0:3] == "DM_" or rxn.id[0:3] == "SK_" or len(rxn.genes) == 0: + probability = 1 self.data["reactions"][rxn.id] = { "presence": "", "gapfilling":"", "genes": {}, - "probability": 0 + "probability": probability } for gene in rxn.genes: self.data["reactions"][rxn.id]["genes"][gene.id] = { "presence": "", - "probability": 0 + "probability": 0.2 } if reaction_probabilities: self.reset_reaction_probabilities(reaction_probabilities) @@ -210,8 +213,8 @@ def sample_from_probabilities(self,reaction_probabilities=None,from_reaction_pro return self.save_ensemble_model() def unpack_models(self,model_list=None): - output_models = [None]*self.size - for i in range(self.size): + output_models = [None]*self.data["size"] + for i in range(self.data["size"]): if not model_list or i in model_list: clone_mdl = cobra.io.json.from_json(cobra.io.json.to_json(self.model)) clone_mdl_utl = MSModelUtil.get(clone_mdl) diff --git a/modelseedpy/core/msgapfill.py b/modelseedpy/core/msgapfill.py index 72fbae2f..480135dc 100755 --- a/modelseedpy/core/msgapfill.py +++ b/modelseedpy/core/msgapfill.py @@ -566,12 +566,6 @@ def run_multi_gapfill( ) #Now we remove reactions uneeded for any of the specified media conditions #These is a danger here that the integration step will put a reaction into a solution that subsequently gets removed at this step. This is something to look out for - print("Bounds before final testing") - for item in self.mdlutl.integrated_gapfillings: - for rxn in item["new"]: - print(rxn,item["new"][rxn],self.model.reactions.get_by_id(rxn).lower_bound,self.model.reactions.get_by_id(rxn).upper_bound) - for rxn in item["reversed"]: - print(rxn,item["new"][rxn],self.model.reactions.get_by_id(rxn).lower_bound,self.model.reactions.get_by_id(rxn).upper_bound) unneeded = self.mdlutl.test_solution( cumulative_solution, test_output["targets"], @@ -580,12 +574,6 @@ def run_multi_gapfill( remove_unneeded_reactions=True, do_not_remove_list=[] )#Returns reactions in cumulative solution that are not needed for growth - print("Bounds after final testing") - for item in self.mdlutl.integrated_gapfillings: - for rxn in item["new"]: - print(rxn,item["new"][rxn],self.model.reactions.get_by_id(rxn).lower_bound,self.model.reactions.get_by_id(rxn).upper_bound) - for rxn in item["reversed"]: - print(rxn,item["new"][rxn],self.model.reactions.get_by_id(rxn).lower_bound,self.model.reactions.get_by_id(rxn).upper_bound) print("Unneeded in global gapfill:",unneeded) elif gapfilling_mode == "Sequential": #Restoring the gapfilling objective function @@ -644,7 +632,7 @@ def run_multi_gapfill( gf_sensitivity[media.id][target]["success"][rxn_id][solution_dictionary[media][rxn_type][rxn_id]] = rxn_sensitivity_hash[rxn_id][solution_dictionary[media][rxn_type][rxn_id]] else: gf_sensitivity[media.id][target]["failure"] = {} - self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") + self.mdlutl.save_attributes(gf_sensitivity, "gf_sensitivity") #Restoring backedup model self.mdlutl = oldmdlutl self.model = oldmdlutl.model From 3546e59645e9fdddd9d080ba80eb9a67c155da39 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Tue, 25 Feb 2025 23:14:24 -0600 Subject: [PATCH 294/298] Fixing ensemble code and annotation ontology --- modelseedpy/core/annotationontology.py | 2 +- modelseedpy/core/msensemble.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modelseedpy/core/annotationontology.py b/modelseedpy/core/annotationontology.py index c361c911..3b7c533f 100644 --- a/modelseedpy/core/annotationontology.py +++ b/modelseedpy/core/annotationontology.py @@ -486,7 +486,7 @@ def get_events_from_priority_list(self,priority_list): elif item == "Merge": if len(event.method) > 5 and event.method[0:5] == "Merge" and event.id not in event_list: selected_merge = event.id - elif item in event.description or item in event.id: + elif item.lower() in event.description.lower() or item.lower() in event.id.lower(): event_list.append(event.id) if selected_merge: event_list.append(selected_merge) diff --git a/modelseedpy/core/msensemble.py b/modelseedpy/core/msensemble.py index f58efd19..d8368836 100755 --- a/modelseedpy/core/msensemble.py +++ b/modelseedpy/core/msensemble.py @@ -221,13 +221,13 @@ def unpack_models(self,model_list=None): remove_reactions = [] for rxn in clone_mdl_utl.model.reactions: if rxn.id in self.data["reactions"]: - if self.data["reactions"][rxn.id][i] == "0": + if self.data["reactions"][rxn.id]["presence"][i] == "0": remove_reactions.append(rxn) else: new_genes = [] for gene in rxn.genes: if gene.id in self.data["reactions"][rxn.id]["genes"]: - if self.data["reactions"][rxn.id]["genes"][gene.id][i] == "1": + if self.data["reactions"][rxn.id]["genes"][gene.id]["presence"][i] == "1": new_genes.append(gene) rxn.gene_reaction_rule = " or ".join([gene.id for gene in new_genes]) else: From 574fe004e7b909ed97f68c43051b118b89a481f2 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Mon, 3 Mar 2025 13:16:49 -0600 Subject: [PATCH 295/298] genome loader --- modelseedpy/core/msgenome.py | 142 +++++++++++++++++++++++++++++++++ modelseedpy/core/mstemplate.py | 2 +- 2 files changed, 143 insertions(+), 1 deletion(-) diff --git a/modelseedpy/core/msgenome.py b/modelseedpy/core/msgenome.py index 7b751738..c423427c 100644 --- a/modelseedpy/core/msgenome.py +++ b/modelseedpy/core/msgenome.py @@ -82,6 +82,27 @@ def parse_fasta_str(faa_str, split=DEFAULT_SPLIT, h_func=None): return features +def read_gbff_records_from_file(filename: str): + if filename.endswith(".gbff"): + with open(filename, "r") as fh: + return read_gbff_records(fh) + elif filename.endswith(".gz"): + import gzip + from io import StringIO + + with gzip.open(filename, "rb") as fh: + return read_gbff_records(StringIO(fh.read().decode("utf-8"))) + + +def read_gbff_records(handler): + from Bio import SeqIO + + gbff_records = [] + for record in SeqIO.parse(handler, "gb"): + gbff_records.append(record) + return gbff_records + + def extract_features(faa_str, split=DEFAULT_SPLIT, h_func=None): features = [] active_seq = None @@ -168,6 +189,45 @@ def from_fasta(filename, split=" ", h_func=None): genome.features += read_fasta2(filename, split, h_func) return genome + @staticmethod + def from_gbff_sequence(filename): + gbff_records = read_gbff_records_from_file(filename) + genome = MSGenome() + features = [] + for rec in gbff_records: + feature = MSFeature(rec.id, str(rec.seq), description=rec.description) + features.append(feature) + genome.features += features + return genome + + @staticmethod + def from_gbff_features( + filename, feature_id_qualifier="protein_id", description_qualifier="product" + ): + gbff_records = read_gbff_records_from_file(filename) + genome = MSGenome() + features = [] + for rec in gbff_records: + for f in rec.features: + if f.type == "CDS": + translations = f.qualifiers.get("translation", []) + if len(translations) == 1: + feature_id = f.qualifiers.get(feature_id_qualifier, [None])[0] + description = f.qualifiers.get(description_qualifier, [None])[0] + if feature_id: + feature = MSFeature( + feature_id, translations[0], description=description + ) + features.append(feature) + else: + logger.warning( + f"skip feature: unable to fetch id from qualifier {feature_id_qualifier}" + ) + elif len(translations) > 1: + logger.warning(f"skip feature: with multiple sequences {f}") + genome.features += features + return genome + def to_fasta(self, filename, l=80, fn_header=None): to_fasta(self.features, filename, l, fn_header) return filename @@ -203,3 +263,85 @@ def _repr_html_(self): {len(self.features)} """ + + +class GenomeGff(MSGenome): + def __init__(self, contigs): + self.contigs = contigs + super().__init__() + + @staticmethod + def read_sequence(feature_id, gff_record, expected_sequence, contigs): + from Bio.Seq import Seq + from Bio import Align + + protein_seq_cds = expected_sequence + feature_contig = contigs.features.get_by_id(gff_record.contig_id) + seq = Seq(feature_contig.seq[gff_record.start - 1 : gff_record.end]) + if gff_record.strand == "-": + seq = seq.reverse_complement() + seq_from_dna = str(seq.translate()) + if len(seq_from_dna) > 0 and seq_from_dna[-1] == "*": + seq_from_dna = seq_from_dna[:-1] + if len(protein_seq_cds) > 0 and protein_seq_cds[-1] == "*": + protein_seq_cds = protein_seq_cds[:-1] + eq = protein_seq_cds == seq_from_dna + + score = None + if not eq and len(seq_from_dna) > 0: + try: + aligner = Align.PairwiseAligner() + res = aligner.align(protein_seq_cds, seq_from_dna) + score = res.score + except ValueError as ex: + print("error", gff_record) + raise ex + + feature = MSFeature(feature_id, protein_seq_cds) + feature.description = f"score: {score}" + feature.gff = gff_record + return feature + + @staticmethod + def from_fna_faa_gff( + filename_fna, filename_faa, filename_gff, _fn_get_id, prodigal=False + ): + genome_gff_features = _read_gff_features(filename_gff) + genome_faa = MSGenome.from_fasta(filename_faa) + contigs = MSGenome.from_fasta(filename_fna) + + feature_lookup = {} + if prodigal: + for feature in genome_faa.features: + attr = dict( + x.split("=") + for x in feature.description.split(" # ")[-1].split(";") + ) + if attr["ID"] not in feature_lookup: + feature_lookup[attr["ID"]] = feature + else: + raise ValueError("") + else: + feature_lookup = {feature.id: feature for feature in genome_faa.features} + + features = [] + for gff_record in genome_gff_features: + if gff_record.feature_type == "CDS": + feature_id = gff_record.attr.get("ID") + if _fn_get_id: + feature_id = _fn_get_id(gff_record) + + feature_cds = feature_lookup.get(feature_id) + + if feature_cds: + protein_seq_cds = feature_cds.seq + f = GenomeGff.read_sequence( + feature_id, gff_record, protein_seq_cds, contigs + ) + features.append(f) + else: + print(f"not found {feature_id}") + + genome = GenomeGff(contigs) + genome.features += features + return genome diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index 6bdc27a3..cffc6106 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -646,7 +646,7 @@ def from_dict(d, template): d.get("pigment", 0), d.get("carbohydrate", 0), d.get("energy", 0), - d.get("other", 0) + d.get("other", 0), ) for item in d["templateBiomassComponents"]: biocomp = MSTemplateBiomassComponent.from_dict(item, template) From d39b0c1ca8b0ed6845c112f7977eaff9a9bace95 Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Fri, 4 Apr 2025 00:38:38 -0500 Subject: [PATCH 296/298] Fixing path to ModelSEEDDatanase in config file for KBase app --- modelseedpy/config.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modelseedpy/config.cfg b/modelseedpy/config.cfg index 11df18bb..e46ec871 100644 --- a/modelseedpy/config.cfg +++ b/modelseedpy/config.cfg @@ -1,5 +1,5 @@ [biochem] -path = /Users/chenry/code/ModelSEEDDatabase +path = /deps/ModelSEEDDatabase [data] template_folder = data/templates classifier_folder = data/ml From 7cc275a490b0df4988b1082b041e4b59137b19b5 Mon Sep 17 00:00:00 2001 From: Filipe Liu Date: Fri, 4 Apr 2025 01:16:25 -0500 Subject: [PATCH 297/298] mstemplate biomass --- modelseedpy/__init__.py | 2 +- modelseedpy/core/mstemplate.py | 20 ++++++++++---------- setup.py | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/modelseedpy/__init__.py b/modelseedpy/__init__.py index 995c054f..2c4e20b1 100644 --- a/modelseedpy/__init__.py +++ b/modelseedpy/__init__.py @@ -14,7 +14,7 @@ __author__ = "Christopher Henry" __email__ = "chenry@anl.gov" -__version__ = "0.4.0" +__version__ = "0.4.2" logger = logging.getLogger(__name__) diff --git a/modelseedpy/core/mstemplate.py b/modelseedpy/core/mstemplate.py index cffc6106..5cce5927 100644 --- a/modelseedpy/core/mstemplate.py +++ b/modelseedpy/core/mstemplate.py @@ -523,16 +523,16 @@ def __init__( biomass_id: str, name: str, type: str, - dna: float, - rna: float, - protein: float, - lipid: float, - cellwall: float, - cofactor: float, - pigment: float, - carbohydrate: float, - energy: float, - other: float, + dna: float = 0, + rna: float = 0, + protein: float = 0, + lipid: float = 0, + cellwall: float = 0, + cofactor: float = 0, + pigment: float = 0, + carbohydrate: float = 0, + energy: float = 0, + other: float = 0, ): """ diff --git a/setup.py b/setup.py index 17f6e136..3c27af19 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ setup( name="ModelSEEDpy", - version="0.4.0", + version="0.4.2", description="Python package for building and analyzing models using ModelSEED", long_description_content_type="text/x-rst", long_description=readme, From 9560c4bc47b294236c3cbad2ec87da7b6e15e60d Mon Sep 17 00:00:00 2001 From: Christopher Henry Date: Sat, 5 Apr 2025 00:01:27 -0500 Subject: [PATCH 298/298] Adding objective package --- modelseedpy/__init__.py | 1 + modelseedpy/core/msensemble.py | 2 +- modelseedpy/fbapkg/__init__.py | 1 + modelseedpy/fbapkg/objectivepkg.py | 17 ++++++++++------- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/modelseedpy/__init__.py b/modelseedpy/__init__.py index 981165c5..7ac66b2f 100644 --- a/modelseedpy/__init__.py +++ b/modelseedpy/__init__.py @@ -71,6 +71,7 @@ FullThermoPkg, MSPackageManager, ObjConstPkg, + ObjectivePkg, ChangeOptPkg, ElementUptakePkg, ReactionActivationPkg, diff --git a/modelseedpy/core/msensemble.py b/modelseedpy/core/msensemble.py index d8368836..2ef522b2 100755 --- a/modelseedpy/core/msensemble.py +++ b/modelseedpy/core/msensemble.py @@ -214,7 +214,7 @@ def sample_from_probabilities(self,reaction_probabilities=None,from_reaction_pro def unpack_models(self,model_list=None): output_models = [None]*self.data["size"] - for i in range(self.data["size"]): + for i in range(10):#self.data["size"]): if not model_list or i in model_list: clone_mdl = cobra.io.json.from_json(cobra.io.json.to_json(self.model)) clone_mdl_utl = MSModelUtil.get(clone_mdl) diff --git a/modelseedpy/fbapkg/__init__.py b/modelseedpy/fbapkg/__init__.py index 9767fa04..4056490f 100644 --- a/modelseedpy/fbapkg/__init__.py +++ b/modelseedpy/fbapkg/__init__.py @@ -17,6 +17,7 @@ from modelseedpy.fbapkg.problemreplicationpkg import ProblemReplicationPkg from modelseedpy.fbapkg.fullthermopkg import FullThermoPkg from modelseedpy.fbapkg.objconstpkg import ObjConstPkg +from modelseedpy.fbapkg.objectivepkg import ObjectivePkg from modelseedpy.fbapkg.changeoptpkg import ChangeOptPkg from modelseedpy.fbapkg.elementuptakepkg import ElementUptakePkg from modelseedpy.fbapkg.expressionactivationpkg import ExpressionActivationPkg diff --git a/modelseedpy/fbapkg/objectivepkg.py b/modelseedpy/fbapkg/objectivepkg.py index dd4ba4cb..6cde6d89 100644 --- a/modelseedpy/fbapkg/objectivepkg.py +++ b/modelseedpy/fbapkg/objectivepkg.py @@ -3,6 +3,7 @@ from __future__ import absolute_import import logging +from optlang.symbolics import Zero, add from modelseedpy.fbapkg.basefbapkg import BaseFBAPkg logger = logging.getLogger(__name__) @@ -15,16 +16,17 @@ class ObjectivePkg(BaseFBAPkg): def __init__(self, model): BaseFBAPkg.__init__(self, model, "objective builder", {}, {}) self.objective_cache = {} + self.objective_string_cache = {} - def build_package(self,objective_string,objective_name=None,cache_objective_name=None): + def build_package(self,objective_string,objective_name=None,cache_current_objective_name=None): #Saving unmodified objective string if objective_name == None: objective_name = objective_string #Caching objective and objective string self.objective_string_cache[objective_name] = objective_string #Caching the current objective if a name was specified - if cache_objective_name != None: - self.objective_cache[cache_objective_name] = self.model.objective + if cache_current_objective_name != None: + self.objective_cache[cache_current_objective_name] = self.model.objective #Creating empty objective - always max self.objective_cache[objective_name] = self.model.problem.Objective(Zero, direction="max") #Parsing objective string of form: MAX{(1)bio1|(1)rxn00001_c0} @@ -32,10 +34,10 @@ def build_package(self,objective_string,objective_name=None,cache_objective_name #Checking if there is a directionality in the objective sign = 1 if objective_string[0:3] == "MAX": - objective_string = [4,-1]#Clearing out the directionality MAX{} + objective_string = objective_string[4:-1]#Clearing out the directionality MAX{} elif objective_string[0:3] == "MIN": sign = -1 - objective_string = [4,-1]#Clearing out the directionality MIN{} + objective_string = objective_string[4:-1]#Clearing out the directionality MIN{} #Building dictionary of variable names varnames = {} for variable in self.model.solver.variables: @@ -57,20 +59,21 @@ def build_package(self,objective_string,objective_name=None,cache_objective_name if rxnid not in self.model.reactions: logger.warning(rxnid+" in objective strin not found in model.") else: - rxnobj = self.model.reactions + rxnobj = self.model.reactions.get_by_id(rxnid) if term[0:1] == "+": obj_coef[rxnobj.forward_variable] = coef elif term[0:1] == "-": obj_coef[rxnobj.reverse_variable] = coef #Checking if the term is just a reaction ID elif term in self.model.reactions: - rxnobj = self.model.reactions + rxnobj = self.model.reactions.get_by_id(term) obj_coef[rxnobj.forward_variable] = coef obj_coef[rxnobj.reverse_variable] = -1*coef elif term in varnames: obj_coef[varnames[term]] = coef self.model.objective = self.objective_cache[objective_name] self.model.objective.set_linear_coefficients(obj_coef) + print(self.model.objective) def restore_objective(self,name): if name in self.objective_cache: