Skip to content

Commit 23750c6

Browse files
author
Francisco Arrieta
committed
Data Table shows annotation code
Need to optimize and clean
1 parent 1ddbbb1 commit 23750c6

4 files changed

Lines changed: 121 additions & 59 deletions

File tree

odmtools/controller/frmDataTable.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,14 @@ def __init__(self, parent, **kwargs):
1313
self.memDB = None
1414
DataTable.__init__(self, parent, **kwargs)
1515

16+
def init(self, memDB):
17+
self.memDB = memDB
18+
self.olvDataTable.init(self.memDB)
1619

17-
def init_publishers(self):
1820
Publisher.subscribe(self.onChangeSelection, "changeTableSelection")
1921
Publisher.subscribe(self.onRefresh, "refreshTable")
2022
Publisher.subscribe(self.olvDataTable.onDeselectAll, "deselectAllDataTable")
2123

22-
def init(self, memDB):
23-
self.memDB = memDB
24-
self.olvDataTable.init(self.memDB)
25-
self.init_publishers()
26-
2724
def onItemSelected(self, event):
2825
pass
2926

odmtools/controller/olvDataTable.py

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ def __init__(self, parent, **kwargs):
2020
self.sortedColumnIndex = -1
2121
self.currentItem = None
2222
self.dataframe = None
23+
self.annotations = None
24+
self.data = None
2325

2426
def init(self, memDB):
2527
self.memDB = memDB
@@ -28,19 +30,54 @@ def init(self, memDB):
2830
self.oddRowsBackColor = wx.Colour(191, 217, 217)
2931

3032
self.dataframe = self.memDB.getDataValuesDF()
31-
sort_by_index = list(self.dataframe.columns).index("valuedatetime")
32-
self.dataframe.sort_values(self.dataframe.columns[sort_by_index], inplace=True)
33-
self.dataObjects = self.dataframe.values.tolist()
33+
self.annotations = self.memDB.get_annotations()
34+
# sort_by_index = list(self.dataframe.columns).index("valuedatetime")
35+
# columns = self.memDB.get_columns_with_annotations()
36+
# self.dataframe.sort_values(self.dataframe.columns[sort_by_index], inplace=True)
37+
# self.dataObjects = self.dataframe.values.tolist()
38+
self.dataObjects = self.__merge_dataframe_with_annotations()
39+
col = self.memDB.get_columns_with_annotations()
40+
41+
# columns = \
42+
# [ColumnDefn(x.strip(), align="left", valueGetter=i, minimumWidth=125, width=125,
43+
# stringConverter='%Y-%m-%d %H:%M:%S' if "valuedatetime" == x.lower() else '%s')
44+
# for x, i in self.memDB.getEditColumns()]
3445
columns = \
3546
[ColumnDefn(x.strip(), align="left", valueGetter=i, minimumWidth=125, width=125,
36-
stringConverter='%Y-%m-%d %H:%M:%S' if "valuedatetime" == x.lower() else '%s')
37-
for x, i in self.memDB.getEditColumns()]
47+
stringConverter='%Y-%m-%d %H:%M:%S' if "valuedatetime" == x.lower() else '%s')
48+
for x, i in col]
49+
3850
self.SetColumns(columns)
3951

4052

4153
self.SetObjectGetter(self.ObjectGetter)
4254
self.SetItemCount(len(self.dataframe))
4355

56+
def __merge_dataframe_with_annotations(self):
57+
sort_by_index = self.dataframe.columns.tolist().index("valuedatetime")
58+
self.dataframe.sort_values(self.dataframe.columns[sort_by_index], inplace=True)
59+
60+
data_list = self.dataframe.values.tolist()
61+
anno_list = self.annotations.values.tolist()
62+
data = data_list
63+
64+
anno = {}
65+
for i in range(0, len(anno_list)):
66+
value_id = anno_list[i][1]
67+
annotation_code = anno_list[i][-1]
68+
if value_id in anno:
69+
anno[value_id].append(annotation_code)
70+
else:
71+
anno[value_id] = [annotation_code]
72+
73+
for key, value in anno.iteritems():
74+
for i in range(0, len(data_list)):
75+
if key in data_list[i]:
76+
data_list[i].append(value)
77+
break
78+
79+
return data
80+
4481
def EnableSorting(self):
4582
self.Bind(wx.EVT_LIST_COL_CLICK, self.onColSelected)
4683
if not self.smallImageList:

odmtools/odmdata/memory_database.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def __init__(self, taskserver=None):
2525
self.df = None
2626
# Series_Service handles remote database
2727
self.series_service = None
28+
self.results_annotations = None
2829

2930
# Memory_service handles in memory database
3031
sm = ServiceManager()
@@ -77,6 +78,16 @@ def getDataValuesDF(self):
7778
logging.debug("done updating memory dataframe")
7879
return self.df
7980

81+
def get_annotations(self, query_db_again=False):
82+
# self.mem_service._session.commit()
83+
# setSchema(self.mem_service._session_factory.engine)
84+
if self.results_annotations is None or query_db_again:
85+
result_id = self.df.resultid[0]
86+
annotation = self.series_service.get_annotations_by_result(resultid=result_id)
87+
self.results_annotations = annotation
88+
89+
return self.results_annotations
90+
8091
def getDataValues(self):
8192
# TODO: fix me! this commit location is only temoporarily. should be flushing so that we can restore
8293
self.mem_service._session.commit()
@@ -94,6 +105,27 @@ def getEditColumns(self):
94105
return [(x, i) for (i, x) in enumerate(columns)]
95106
# return [(x, i) for (i, x) in enumerate(self.df.columns)]
96107

108+
def get_columns_with_annotations(self):
109+
"""
110+
If results_annotations has not been set then
111+
:return:
112+
"""
113+
114+
if self.results_annotations is None or self.df is None:
115+
print "self.df and self.results_annotations must be a pandas dataframe. Currently they are None"
116+
return []
117+
118+
columns = []
119+
columns.extend(self.df.columns.tolist())
120+
121+
annotation_columns = self.results_annotations.columns.tolist()
122+
index = annotation_columns.index("annotationcode")
123+
annotation_code_column = annotation_columns[index]
124+
125+
columns.append(annotation_code_column)
126+
127+
return [(x, i) for (i, x) in enumerate(columns)]
128+
97129
def getDataValuesforGraph(self, seriesID, noDataValue, startDate=None, endDate=None):
98130
return self.series_service.get_plot_values(seriesID, noDataValue, startDate, endDate)
99131

@@ -250,7 +282,7 @@ def initEditValues(self, seriesID):
250282
logger.debug("Load series from db")
251283

252284
self.series = self.series_service.get_series(seriesID)
253-
self.df = self.series_service.get_values(series_id= seriesID)
285+
self.df = self.series_service.get_values(series_id=seriesID)
254286

255287
self.editLoaded = True
256288

odmtools/odmservices/series_service.py

Lines changed: 43 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -116,26 +116,6 @@ def get_variables_by_site_code(self, site_code):
116116
q = self._session.query(Variables).filter(Variables.VariableID.in_(var_ids))
117117
return q.all()
118118

119-
# Data Value Methods
120-
def get_values(self, series_id=None):
121-
'''
122-
123-
:param series_id: Series id
124-
:return: pandas dataframe
125-
'''
126-
127-
setSchema(self._session_factory.engine)
128-
q = self.read._session.query(TimeSeriesResultValues)
129-
if series_id:
130-
q = q.filter_by(ResultID=series_id)
131-
q = q.order_by(TimeSeriesResultValues.ValueDateTime)
132-
query = q.statement.compile(dialect=self._session_factory.engine.dialect)
133-
data = pd.read_sql_query(sql=query,
134-
con=self._session_factory.engine,
135-
params=query.params)
136-
data.set_index(data['valuedatetime'], inplace=True)
137-
return data
138-
139119
# Series Catalog methods
140120
def get_series_by_site(self , site_id):
141121
# try:
@@ -359,42 +339,55 @@ def get_series_from_filter(self):
359339
# Pass in probably a Series object, match it against the database
360340
pass
361341

362-
#
342+
363343
#Data Value Methods
364344
def get_values(self, series_id=None):
365-
'''
366-
:param series_id: Series id
345+
"""
346+
:param series_id:
367347
:return: pandas dataframe
368-
'''
369-
#series= self.get_series_by_id(series_id)
370-
# if series:
371-
# q = self._edit_session.query(DataValue).filter_by(
372-
# site_id=series.site_id,
373-
# variable_id=series.variable_id,
374-
# method_id=series.method_id,
375-
# source_id=series.source_id,
376-
# quality_control_level_id=series.quality_control_level_id)
377-
#
378-
# query=q.statement.compile(dialect=self._session_factory.engine.dialect)
379-
# data= pd.read_sql_query(sql= query,
380-
# con = self._session_factory.engine,
381-
# params = query.params )
382-
# #return data.set_index(data['LocalDateTime'])
383-
# return data
384-
# else:
385-
# return None
348+
"""
349+
# see get_annotations_by_result around line 850
386350

387351
q = self.read._session.query(TimeSeriesResultValues)
388352
if series_id:
389-
q=q.filter_by(ResultID=series_id)
390-
q= q.order_by(TimeSeriesResultValues.ValueDateTime)
353+
q = q.filter_by(ResultID=series_id)
354+
q = q.order_by(TimeSeriesResultValues.ValueDateTime)
391355
query = q.statement.compile(dialect=self._session_factory.engine.dialect)
392356
data = pd.read_sql_query(sql=query,
393357
con=self._session_factory.engine,
394358
params=query.params)
395359
data.set_index(data['valuedatetime'], inplace=True)
360+
361+
# if series_id:
362+
# anno = self.get_annotations_by_result(series_id)
363+
# q = pd.merge(data, anno, how="left", on='valueid', indicator=False)
364+
# data.applymap(self.merge_annotation_with_timeseries_result)
365+
366+
# if len(anno):
367+
# # data.valueid.apply(self.merge_annotation_with_timeseries_result)
368+
# # data.applymap(self.merge_annotation_with_timeseries_result)
369+
# self.merge_annotation_with_timeseries_result(data, anno)
370+
371+
372+
396373
return data
397374

375+
# df.drop_duplicates(dup_cols, keep='last', inplace=True)
376+
# newdf = pd.merge(df, pd.read_sql(query, engine), how='left', on=dup_cols, indicator=True)
377+
# newdf = newdf[newdf['_merge'] == 'left_only']
378+
# newdf.drop(['_merge'], axis=1, inplace=True)
379+
# return df[df['valuedatetime'].isin(newdf['valuedatetime'])]
380+
381+
# def merge_annotation_with_timeseries_result(self, x):
382+
# print x
383+
#
384+
# # return x
385+
# return 123
386+
def merge_annotation_with_timeseries_result(self, data, anno):
387+
388+
print 123
389+
return
390+
398391
def get_all_values_df(self):
399392

400393
"""
@@ -877,17 +870,20 @@ def get_all_annotations(self):
877870
return self.read.getAnnotations(type=None)
878871

879872
def get_annotations_by_result(self, resultid):
880-
setSchema(self._session_factory.engine)
873+
# setSchema(self._session_factory.engine)
881874

882875
# ids = [x[0] for x in self.read._session.query(TimeSeriesResultValues.ValueID)\
883876
# .filter(TimeSeriesResultValues.ResultID == resultid).all()]
884877
# q = self.read._session.query(TimeSeriesResultValueAnnotations)\
885878
# .filter(TimeSeriesResultValueAnnotations.ValueID.in_(ids)).all()
886879

887-
q =self.read._session.query(TimeSeriesResultValueAnnotations.AnnotationID, TimeSeriesResultValueAnnotations.ValueID,
888-
TimeSeriesResultValues.ResultID, TimeSeriesResultValues.ValueDateTime)\
880+
resultid = int(resultid)
881+
882+
q = self.read._session.query(TimeSeriesResultValueAnnotations.AnnotationID, TimeSeriesResultValueAnnotations.ValueID,
883+
TimeSeriesResultValues.ResultID, TimeSeriesResultValues.ValueDateTime, Annotations.AnnotationCode)\
889884
.filter(TimeSeriesResultValues.ResultID == resultid)\
890-
.filter(TimeSeriesResultValueAnnotations.ValueID == TimeSeriesResultValues.ValueID)
885+
.filter(TimeSeriesResultValueAnnotations.ValueID == TimeSeriesResultValues.ValueID)\
886+
.filter(Annotations.AnnotationID==TimeSeriesResultValueAnnotations.AnnotationID)
891887

892888
query = q.statement.compile(dialect=self._session_factory.engine.dialect)
893889
data = pd.read_sql_query(sql=query, con=self._session_factory.engine,

0 commit comments

Comments
 (0)