Skip to content
Snippets Groups Projects
Commit c2839129 authored by Martin Bauer's avatar Martin Bauer
Browse files

Improvements in database

parent 1a2d9e51
Branches
Tags
No related merge requests found
import time import time
import socket import socket
from collections import OrderedDict
import blitzdb import blitzdb
import pandas as pd
from pystencils.cpu.cpujit import getCompilerConfig from pystencils.cpu.cpujit import getCompilerConfig
def removeConstantColumns(df): def removeConstantColumns(df):
remainingDf = df.loc[:, (df != df.ix[0]).any()] import pandas as pd
constants = df.loc[:, (df == df.ix[0]).all()].ix[0] remainingDf = df.loc[:, df.apply(pd.Series.nunique) > 1]
constants = df.loc[:, df.apply(pd.Series.nunique) <= 1].iloc[0]
return remainingDf, constants return remainingDf, constants
def removeColumnsByPrefix(df, prefixes, inplace=False):
if not inplace:
df = df.copy()
for columnName in df.columns:
for prefix in prefixes:
if columnName.startswith(prefix):
del df[columnName]
return df
def removePrefixInColumnName(df, inplace=False):
if not inplace:
df = df.copy()
newColumnNames = []
for columnName in df.columns:
if '.' in columnName:
newColumnNames.append(columnName[columnName.index('.') + 1:])
else:
newColumnNames.append(columnName)
df.columns = newColumnNames
return df
class Database(object): class Database(object):
class SimulationResult(blitzdb.Document): class SimulationResult(blitzdb.Document):
pass pass
...@@ -43,21 +66,31 @@ class Database(object): ...@@ -43,21 +66,31 @@ class Database(object):
def filter(self, *args, **kwargs): def filter(self, *args, **kwargs):
return self.backend.filter(Database.SimulationResult, *args, **kwargs) return self.backend.filter(Database.SimulationResult, *args, **kwargs)
def filterParams(self, query, *args, **kwargs):
query = {'params.' + k: v for k, v in query.items()}
return self.filter(query, *args, **kwargs)
def alreadySimulated(self, parameters): def alreadySimulated(self, parameters):
return len(self.filter({'params': parameters})) > 0 return len(self.filter({'params': parameters})) > 0
def toPandas(self, query): # Columns with these prefixes are not included in pandas result
queryResult = self.backend.filter(self.SimulationResult, query) pandasColumnsToIgnore = ['changedParams.', 'env.']
records = []
index = set()
for e in queryResult:
record = OrderedDict(e.params.items())
record.update(e.result)
records.append(record)
index.update(e.params.keys())
df = pd.DataFrame.from_records(records) def toPandas(self, parameterQuery, removePrefix=True, dropConstantColumns=False):
import pandas as pd
return df queryResult = self.filterParams(parameterQuery)
if len(queryResult) == 0:
return
df = pd.io.json.json_normalize([e.attributes for e in queryResult])
df.set_index('pk', inplace=True)
if self.pandasColumnsToIgnore:
removeColumnsByPrefix(df, self.pandasColumnsToIgnore, inplace=True)
if removePrefix:
removePrefixInColumnName(df, inplace=True)
if dropConstantColumns:
df, _ = removeConstantColumns(df)
return df
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment