Skip to content

Commit 507d852

Browse files
Stephanie ReederStephanie Reeder
authored andcommitted
begin adding code for filling gaps
1 parent d18d441 commit 507d852

5 files changed

Lines changed: 74 additions & 22 deletions

File tree

ODMTools.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
import pyodbc
2222
import pymysql
23-
import psycopg2
23+
# import psycopg2
2424

2525
tool = LoggerTool()
2626
logger = tool.setupLogger('main', 'odmtools.log', 'a', logging.INFO)

odmtools/controller/logicEditTools.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,20 @@ def filter_date(self, endDate, startDate):
5050
else:
5151
return "Cannot filter: %s" % (self._edit_error)
5252

53+
def fill_gap(self, value, time_period):
54+
self._edit_service.fill_gap(value, time_period)
55+
self.refresh_selection()
56+
if self._record:
57+
self._script("edit_service.fill_gap(%s, '%s')\n" % (value, time_period), 'black')
58+
Publisher.sendMessage("scroll")
59+
5360
def data_gaps(self, value, time_period):
5461
self._edit_service.data_gaps(value, time_period)
5562
self.refresh_selection()
5663
if self._record:
5764
self._script("edit_service.data_gaps(%s, '%s')\n" % (value, time_period), 'black')
5865
Publisher.sendMessage("scroll")
5966

60-
6167
def value_change_threshold(self, value, operator):
6268
self._edit_service.change_value_threshold(value, operator)
6369
self.refresh_selection()

odmtools/gui/mnuRibbon.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@
3636
wxID_RIBBONEDITSCRIPTSAVE, wxID_RIBBONVIEWPLOT, wxID_RIBBONVIEWTABLE, wxID_RIBBONVIEWSERIES, wxID_RIBBONVIEWCONSOLE,
3737
wxID_RIBBONVIEWSCRIPT, wxID_RIBBONPLOTBLANKBTN, wxID_FileMenu, wxID_STARTDPDATE, wxID_ENDDPDATE, wxID_FRAME1SPINCTRL1,
3838
wxID_RIBBONEDITFILTER, wxID_RIBBONEDITRECORD, wxID_RIBBONEDITLINFILTER, wxID_RIBBONPLOTDATEAPPLY,
39-
wxID_RIBBONEDITRESETFILTER, wxID_RIBBONRECORDNEW, wxID_RIBBONRECORDOPEN, wxID_RIBBONRECORDSAVE] = [wx.NewId() for
39+
wxID_RIBBONEDITRESETFILTER, wxID_RIBBONRECORDNEW, wxID_RIBBONRECORDOPEN, wxID_RIBBONRECORDSAVE, wxID_GAPFILL] = [wx.NewId() for
4040
_init_ctrls in
41-
range(46)]
41+
range(47)]
4242

4343
## #################################
4444
## Build Menu and Toolbar
@@ -155,6 +155,7 @@ def _init_ctrls(self, prnt):
155155
self.edit_bar.AddSimpleButton(wxID_RIBBONEDITFLAG, "Flag", flag.GetBitmap(), "")
156156
self.edit_bar.AddSimpleButton(wxID_RIBBONEDITADDPOINT, "Add Point", add.GetBitmap(), "")
157157
self.edit_bar.AddSimpleButton(wxID_RIBBONEDITDELPOINT, "Delete Point", delete.GetBitmap(), "")
158+
self.edit_bar.AddSimpleButton(wxID_GAPFILL, "Fill Gap", add.GetBitmap(), "")
158159
#self.edit_bar.AddSimpleButton(wxID_RIBBONEDITRECORD, "Record", bitmap=record.GetBitmap(), help_string="",kind=0x4)
159160

160161
self.edit_bar.EnableButton(wxID_RIBBONEDITFILTER, False)
@@ -250,6 +251,7 @@ def bindEvents(self):
250251
self.Bind(RB.EVT_RIBBONBUTTONBAR_CLICKED, self.onEditFlag, id=wxID_RIBBONEDITFLAG)
251252
self.Bind(RB.EVT_RIBBONBUTTONBAR_CLICKED, self.onEditAddPoint, id=wxID_RIBBONEDITADDPOINT)
252253
self.Bind(RB.EVT_RIBBONBUTTONBAR_CLICKED, self.onEditDelPoint, id=wxID_RIBBONEDITDELPOINT)
254+
self.Bind(RB.EVT_RIBBONBUTTONBAR_CLICKED, self.onGapFill, id = wxID_GAPFILL)
253255

254256
self.Bind(RB.EVT_RIBBONBUTTONBAR_CLICKED, self.onRecordNew, id=wxID_RIBBONRECORDNEW)
255257
self.Bind(RB.EVT_RIBBONBUTTONBAR_CLICKED, self.onRecordOpen, id=wxID_RIBBONRECORDOPEN)
@@ -466,7 +468,12 @@ def onEditAddPoint(self, event):
466468
addPoint.ShowModal()
467469

468470
event.Skip()
469-
471+
# ###################################
472+
# Gap fill
473+
# ###################################
474+
def onGapFill(self, event):
475+
self.parent.getRecordService().fill_gap(30, 'minute')
476+
event.Skip()
470477
# ###################################
471478
# Delete Point
472479
# ###################################

odmtools/odmdata/memory_database.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ def initEditValues(self, seriesID):
201201
"""
202202
if not self.editLoaded:
203203
logger.debug("Load series from db")
204-
204+
self.series = self.series_service.get_series_by_id(seriesID)
205205
self.df = self.series_service.get_values_by_series(seriesID)
206206
self.editLoaded = True
207207

odmtools/odmservices/edit_service.py

Lines changed: 55 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ def _test_filter_previous(self):
8686

8787
return df
8888

89+
8990
def datetime2dataframe(self, datetime_list):
9091
""" Converts datetime_list to a pandas Dataframe
9192
@@ -141,19 +142,47 @@ def filter_date(self, before, after):
141142
if before and after:
142143
self.filtered_dataframe = df[(df.index < before) & (df.index > after)]
143144

145+
def fill_gap(self, gap, period):
146+
147+
df = self.memDB.getDataValuesDF()
148+
gaps= self.find_gaps(df, gap, period)
149+
points = []
150+
series= self.memDB.series
151+
timegap = np.timedelta64(gap, self.time_units[period])
152+
153+
for g in gaps.iterrows():
154+
row= g[0]
155+
e = row["datetime"]
156+
s= row["prevdate"]
157+
print (s)
158+
print (e)
159+
160+
# for each gap time period in the larger gap ( until datetime = prev value)
161+
while s != e:
162+
s= s + timegap
163+
points.append(('-9999', None, s, series.begin_date_time_utc, s, None, None, u'nc', None, None, series.site_id, series.variable_id, series.method_id, series.source_id, series.quality_control_level_id))
164+
#add a row points.append() [('-9999', None, datetime.datetime(2007, 9, 28, 0, 10), '-7', datetime.datetime(2007, 9, 28, 7, 10), None, None, u'nc', None, None, 1, 4, 2, 1, 0)
165+
#('-9999', None, DATE, series.begin_date_time_utc, UTCDATE, None, None, u'nc', None, None, series.site_id, series.variable_id, series.method_id, series.source_id, series.quality_control_level_id
166+
167+
168+
self.add_points(points)
169+
170+
time_units = {
171+
'second': 's',
172+
'minute': 'm',
173+
'hour': 'h',
174+
'day': 'D',
175+
'week': 'W',
176+
'month': 'M',
177+
'year': 'Y'
178+
}
179+
144180
# Data Gaps
145-
def data_gaps(self, value, time_period):
146-
df = self._test_filter_previous()
147181

148-
time_units = {
149-
'second': 's',
150-
'minute': 'm',
151-
'hour': 'h',
152-
'day': 'D',
153-
'week': 'W',
154-
'month': 'M',
155-
'year': 'Y'
156-
}
182+
183+
def find_gaps(self, df, value, time_period):
184+
185+
157186

158187
# make a copy of the dataframe in order to modify it to be in the form we need to determine data gaps
159188
copy_df = df
@@ -165,19 +194,29 @@ def data_gaps(self, value, time_period):
165194
value = int(value)
166195

167196
# create a bool column indicating which rows meet condition
168-
filtered_results = copy_df['datetime'].diff() >= np.timedelta64(value, time_units[time_period])
197+
filtered_results = copy_df['datetime'].diff() > np.timedelta64(value, self.time_units[time_period])
169198

170199
# filter on rows that passed previous condition
171-
copy_df = copy_df[filtered_results]
200+
return copy_df[filtered_results]
201+
202+
172203

204+
205+
def data_gaps(self, value, time_period):
206+
df = self._test_filter_previous()
207+
copy_df = self.find_gaps(df, value, time_period)
208+
print (copy_df)
173209
# merge values and remove duplicates. this hack allows for both values to be marked when selecting data gaps
174210
newdf = pd.concat([copy_df['datetime'], copy_df['dateprev']], join='inner')
175-
self.filtered_dataframe = df[df.index.isin(newdf.drop_duplicates().dropna())]
176211

177212
# clean up
178213
del copy_df
179-
del filtered_results
180-
del newdf
214+
215+
216+
self.filtered_dataframe= df[df.index.isin(newdf.drop_duplicates().dropna())]
217+
218+
219+
181220

182221
def change_value_threshold(self, value, operator):
183222

0 commit comments

Comments
 (0)