Skip to content

Commit 0784a24

Browse files
committed
Updating github to be the most up to date and working / development version.
Here, adding the wrapper_type functionality to fetch data in wrappers that return tables. Data class gains several new general wrapper classes that provide this new functionality.
1 parent e078805 commit 0784a24

7 files changed

Lines changed: 131 additions & 67 deletions

File tree

skdaccess/astro/kepler/data_fetcher.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
"""
2828

2929
# mithagi required Base,Utils imports
30-
from skdaccess.framework.data_class import DataFetcherBase
30+
from skdaccess.framework.data_class import DataFetcherBase, DictionaryWrapper
3131
from skdaccess.utilities import trend_util
3232
from skdaccess.astro.kepler.data_wrapper import DataWrapper
3333
from skdaccess.utilities import data_util
@@ -46,7 +46,7 @@
4646

4747
class DataFetcher(DataFetcherBase):
4848
''' Data Fetcher for Kepler light curve data '''
49-
def __init__(self, ap_paramList, normalize=False, drop_on_quality=False, filter_window=None, quarter_list=None):
49+
def __init__(self, ap_paramList, normalize=False, drop_on_quality=False, filter_window=None, quarter_list=None, wrapper_type = 'series'):
5050
'''
5151
Initialize Kepler Data Fetcher
5252
@@ -55,12 +55,14 @@ def __init__(self, ap_paramList, normalize=False, drop_on_quality=False, filter_
5555
@param drop_on_quality: Drop data if SAP_QUALITY != 0
5656
@param filter_window: Size of window used when removing systematic offsets.
5757
@param quarter_list: List of quarters (0-17)
58+
@param wrapper_type: Select the type of iterator wrapper to generate, as series or table
5859
'''
5960

6061
self.normalize = normalize
6162
self.drop_on_quality = drop_on_quality
6263
self.filter_window = filter_window
6364
self.quarter_list = quarter_list
65+
self.wrapper_type = wrapper_type
6466
super(DataFetcher, self).__init__(ap_paramList)
6567

6668
def output(self):
@@ -125,5 +127,10 @@ def output(self):
125127
data = kid_data[kid][kid_data[kid]['QUARTER'] == quarter].loc[:,'PDCSAP_FLUX']
126128
kid_data[kid].update(data - trend_util.medianFilter(data, self.filter_window, interpolate=False))
127129

128-
129-
return DataWrapper(kid_data)
130+
if self.wrapper_type == 'series':
131+
return DataWrapper(kid_data)
132+
elif self.wrapper_type == 'table':
133+
return DictionaryWrapper(kid_data)
134+
else:
135+
print('... Invald wrapper type, defaulting to series ...')
136+
return DataWrapper(kid_data)

skdaccess/framework/data_class.py

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def getMetadata(self):
7070
class DataWrapperBase(object):
7171
''' Base class for wrapping data for use in DiscoveryPipeline. '''
7272

73-
def __init__(self, obj_wrap, run_id = -1):
73+
def __init__(self, obj_wrap, run_id = -1, meta_data = None):
7474
'''
7575
Construct object from input data.
7676
@@ -81,6 +81,7 @@ def __init__(self, obj_wrap, run_id = -1):
8181
self.results = dict()
8282
self.constants = dict()
8383
self.run_id = run_id
84+
self.meta_data = meta_data
8485

8586
def update(self, obj):
8687
''' Updated wrapped data '''
@@ -118,3 +119,60 @@ def getIterator(self):
118119
def getIndices(self):
119120
''' Get indices of the data '''
120121
pass
122+
123+
def getLength(self):
124+
pass
125+
126+
class TableFetcher(DataFetcherBase):
127+
128+
def __init__(self, pd_data):
129+
130+
super(TableFetcher, self).__init__([])
131+
self.pd_data = pd_data
132+
133+
134+
def output(self):
135+
return DataPanelWrapper(self.pd_data)
136+
137+
138+
class DataPanelWrapper(DataWrapperBase):
139+
'''
140+
Generic Data wrapper for pandas data panels. Iterators over data frames
141+
'''
142+
143+
def getIterator(self):
144+
'''
145+
Iterator access to data. Iterates over the minor axis.
146+
147+
@return iterator to data frames from Panel
148+
'''
149+
for label in self.data.minor_axis:
150+
yield label, self.data[:,:,label]
151+
152+
def getLength(self):
153+
'''
154+
@return Number of data frames
155+
'''
156+
return len(self.data.minor_axis)
157+
158+
159+
class DictionaryWrapper(DataWrapperBase):
160+
'''
161+
Generic data wrapper for a dictionary of data frames
162+
'''
163+
164+
def getIterator(self):
165+
'''
166+
Iterator access to data. Iterates over the minor axis.
167+
168+
@return iterator to data frames from Panel
169+
'''
170+
for label in self.data.keys():
171+
yield label, self.data[label]
172+
173+
174+
def getLength(self):
175+
'''
176+
@return Number of data frames
177+
'''
178+
return len(self.data)

skdaccess/geo/grace/data_fetcher.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
"""
2828

2929
# mithagi required Base imports
30-
from skdaccess.framework.data_class import DataFetcherBase
30+
from skdaccess.framework.data_class import DataFetcherBase, DataPanelWrapper
3131
from skdaccess.geo.grace.data_wrapper import DataWrapper
3232
from skdaccess.utilities.data_util import getDataLocation
3333

@@ -38,19 +38,21 @@
3838
class DataFetcher(DataFetcherBase):
3939
''' Data Fetcher for GRACE data '''
4040

41-
def __init__(self, ap_paramList, start_date = None, end_date = None, resample = True):
41+
def __init__(self, ap_paramList, start_date = None, end_date = None, resample = True, wrapper_type='series'):
4242
'''
4343
Construct a Grace Data Fetcher
4444
4545
@param ap_paramList[geo_pont]: Geographic location of grace data to select
4646
@param start_date: Beginning date
4747
@param end_date: Ending date
4848
@param resample: Resample the data to daily resolution, leaving NaN's in days without data (Default True)
49+
@param wrapper_type: Select the type of iterator wrapper to generate, as series or table
4950
'''
5051

5152
self.start_date = start_date
5253
self.end_date = end_date
5354
self.resample = resample
55+
self.wrapper_type = wrapper_type
5456
super(DataFetcher, self).__init__(ap_paramList)
5557

5658
def output(self):
@@ -106,7 +108,15 @@ def output(self):
106108
if self.resample == True:
107109
grace_data = grace_data.reindex(pd.date_range(start_date, end_date))
108110

109-
return(DataWrapper(grace_data))
111+
if self.wrapper_type == 'series':
112+
return(DataWrapper(grace_data))
113+
elif self.wrapper_type == 'table':
114+
grace_data.columns = ['Equivalent Water Thickness (cm)', 'Uncertainty']
115+
return(DataPanelWrapper(pd.Panel.from_dict({'GRACE':grace_data},orient='minor')))
116+
else:
117+
print('... Invald wrapper type, defaulting to series ...')
118+
return(DataWrapper(grace_data))
119+
110120

111121
def __str__(self):
112122
'''

skdaccess/geo/groundwater/data_fetcher.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
"""
2828

2929
# mithagi required Base imports
30-
from skdaccess.framework.data_class import DataFetcherBase
30+
from skdaccess.framework.data_class import DataFetcherBase, DataPanelWrapper
3131
from skdaccess.utilities.data_util import getDataLocation
3232
from skdaccess.geo.groundwater.data_wrapper import DataWrapper
3333

@@ -40,13 +40,16 @@ class DataFetcher(DataFetcherBase):
4040
'''
4141
Generates Data Wrappers of groundwater measurements taken in California
4242
'''
43-
def __init__(self, ap_paramList = [], start_date = None, end_date = None, cutoff=0.75, adjust_heights = False):
43+
def __init__(self, ap_paramList = [], start_date = None, end_date = None, cutoff=0.75, adjust_heights = False, wrapper_type='series'):
4444
'''
4545
Construct a Ground Water Data Fetcher
4646
4747
@param ap_paramList[station_list]: List of stations (Optional)
4848
@param start_date: Starting date (defualt: None)
4949
@param end_date: Ending date (default: None)
50+
@param cutoff: Specified required amount of data at a station
51+
@param adjust_heights: Flag to indicate going to water height, instead of original depth to water
52+
@param wrapper_type: Select the type of iterator wrapper to generate, as series or table
5053
'''
5154
self.meta_data = DataFetcher.getStationMetadata()
5255

@@ -55,6 +58,7 @@ def __init__(self, ap_paramList = [], start_date = None, end_date = None, cutof
5558
self.ap_paramList = ap_paramList
5659
self.cutoff = cutoff
5760
self.adjust_heights = adjust_heights
61+
self.wrapper_type = wrapper_type
5862

5963
def output(self):
6064
'''
@@ -102,8 +106,15 @@ def output(self):
102106

103107
store.close()
104108

105-
data = DataWrapper(pd.Panel.from_dict(data_dict,orient='minor'), self.meta_data)
106-
return data
109+
if self.wrapper_type == 'series':
110+
data = DataWrapper(pd.Panel.from_dict(data_dict,orient='minor'), self.meta_data)
111+
return data
112+
elif self.wrapper_type == 'table':
113+
return(DataPanelWrapper(pd.Panel.from_dict(data_dict,orient='minor'), meta_data=self.meta_data))
114+
else:
115+
print('... Invald wrapper type, defaulting to series ...')
116+
data = DataWrapper(pd.Panel.from_dict(data_dict,orient='minor'), self.meta_data)
117+
107118

108119
def __str__(self):
109120
'''

skdaccess/geo/pbo/data_fetcher.py

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
"""
2828

2929
# mithagi required Base,Utils imports
30-
from skdaccess.framework.data_class import DataFetcherBase
30+
from skdaccess.framework.data_class import DataFetcherBase, DataPanelWrapper
3131
from skdaccess.utilities import pbo_util
3232
from skdaccess.utilities import data_util
3333

@@ -37,7 +37,6 @@
3737
# 3rd party package imports
3838
import pandas as pd
3939
import numpy as np
40-
import pickle
4140

4241

4342

@@ -48,7 +47,7 @@ class DataFetcher(DataFetcherBase):
4847
2) stabilization area (for running stabilization)
4948
'''
5049

51-
def __init__(self, start_time, end_time, lat_range, lon_range, ap_paramList, mdyratio=.5, epFlag=1, stabFlag=1):
50+
def __init__(self, start_time, end_time, lat_range, lon_range, ap_paramList, mdyratio=.5, ep_flag=1, stab_flag=1, wrapper_type='series'):
5251
'''
5352
Initialize a DataFetcher
5453
@@ -58,21 +57,25 @@ def __init__(self, start_time, end_time, lat_range, lon_range, ap_paramList, mdy
5857
@param lon_range: Longitude range used to select stabilization sites
5958
@range ap_paramList[radius]: Site radius to search around (km)
6059
@param ap_paramList[geo_point] Tuple containing lat and lon coordinates
60+
@param ep_flag: Propagate errors through stabilization
61+
@param stab_flag: Perform regional stabilization
62+
@param wrapper_type: Select the type of iterator wrapper to generate, as series or table
6163
'''
6264

6365

64-
self.start_time = start_time
65-
self.end_time = end_time
66+
self._start_time = start_time
67+
self._end_time = end_time
6668
self.ap_paramList = ap_paramList
67-
self.geospace = (lat_range, lon_range)
69+
self._geospace = (lat_range, lon_range)
6870
self.station_list = None
69-
self.mdyratio = mdyratio
70-
self.epFlag = epFlag
71-
self.stabFlag = stabFlag
71+
self._mdyratio = mdyratio
72+
self._ep_flag = ep_flag
73+
self._stab_flag = stab_flag
74+
self.wrapper_type = wrapper_type
7275

7376
self.meta_data = DataFetcher.getStationMetadata()
7477

75-
if stabFlag == 1:
78+
if stab_flag == 1:
7679
self.stabilize()
7780
else:
7881
self.rawData()
@@ -119,17 +122,17 @@ def stabilize(self):
119122

120123
storeData = pd.HDFStore(storeData_fn)
121124

122-
mdyratio = self.mdyratio
123-
epFlag = self.epFlag
125+
mdyratio = self._mdyratio
126+
epFlag = self._ep_flag
124127

125128
keyList =[]
126129
for ii in storeName.keys():
127130
coord = storeName[ii]['refNEU']
128-
if coord[0]>self.geospace[0][0] and coord[0]<self.geospace[0][1] and coord[1]>self.geospace[1][0] and coord[1]<self.geospace[1][1]:
131+
if coord[0]>self._geospace[0][0] and coord[0]<self._geospace[0][1] and coord[1]>self._geospace[1][0] and coord[1]<self._geospace[1][1]:
129132
keyList.append(storeName[ii]['4ID'])
130-
elif coord[0]>self.geospace[0][0] and coord[0]<self.geospace[0][1] and coord[1]>(360+self.geospace[1][0]) and coord[1]<(360+self.geospace[1][1]):
133+
elif coord[0]>self._geospace[0][0] and coord[0]<self._geospace[0][1] and coord[1]>(360+self._geospace[1][0]) and coord[1]<(360+self._geospace[1][1]):
131134
keyList.append(storeName[ii]['4ID'])
132-
smSet_all, smHdr_all = pbo_util.stab_sys(storeName,storeData,[self.start_time,self.end_time],indx=keyList,mdyratio=mdyratio,errProp=epFlag)
135+
smSet_all, smHdr_all = pbo_util.stab_sys(storeName,storeData,[self._start_time,self._end_time],indx=keyList,mdyratio=mdyratio,errProp=epFlag)
133136

134137
self.smSet_all = smSet_all
135138
self.smHdr_all = smHdr_all
@@ -150,16 +153,16 @@ def rawData(self):
150153

151154
storeData = pd.HDFStore(storeData_fn)
152155

153-
mdyratio = self.mdyratio
156+
mdyratio = self._mdyratio
154157

155158
keyList =[]
156159
for ii in storeName.keys():
157160
coord = storeName[ii]['refNEU']
158-
if coord[0]>self.geospace[0][0] and coord[0]<self.geospace[0][1] and coord[1]>self.geospace[1][0] and coord[1]<self.geospace[1][1]:
161+
if coord[0]>self._geospace[0][0] and coord[0]<self._geospace[0][1] and coord[1]>self._geospace[1][0] and coord[1]<self._geospace[1][1]:
159162
keyList.append(storeName[ii]['4ID'])
160-
elif coord[0]>self.geospace[0][0] and coord[0]<self.geospace[0][1] and coord[1]>(360+self.geospace[1][0]) and coord[1]<(360+self.geospace[1][1]):
163+
elif coord[0]>self._geospace[0][0] and coord[0]<self._geospace[0][1] and coord[1]>(360+self._geospace[1][0]) and coord[1]<(360+self._geospace[1][1]):
161164
keyList.append(storeName[ii]['4ID'])
162-
smSet_all, smHdr_all = pbo_util.nostab_sys(storeName,storeData,[self.start_time,self.end_time],indx=keyList,mdyratio=mdyratio)
165+
smSet_all, smHdr_all = pbo_util.nostab_sys(storeName,storeData,[self._start_time,self._end_time],indx=keyList,mdyratio=mdyratio)
163166

164167
self.smSet_all = smSet_all
165168
self.smHdr_all = smHdr_all
@@ -215,7 +218,14 @@ def output(self):
215218
data[ii] = self.smSet_all[ii]
216219
info[ii] = self.smHdr_all[ii]
217220

218-
return DataWrapper(pd.Panel.from_dict(data, orient='minor'), geo_point, info)
221+
if self.wrapper_type == 'series':
222+
return DataWrapper(pd.Panel.from_dict(data, orient='minor'), geo_point, info)
223+
elif self.wrapper_type == 'table':
224+
return(DataPanelWrapper(pd.Panel.from_dict(data,orient='minor'), meta_data=info))
225+
else:
226+
print('... Invald wrapper type, defaulting to series ...')
227+
return DataWrapper(pd.Panel.from_dict(data, orient='minor'), geo_point, info)
228+
219229

220230
def __str__(self):
221231
'''

0 commit comments

Comments
 (0)