Skip to content

Commit fb61173

Browse files
committed
Merge pull request #12 from pmorissette/add-filter-to-search
added filtering to search functions
2 parents 1d3cd94 + b14be64 commit fb61173

File tree

1 file changed

+22
-7
lines changed

1 file changed

+22
-7
lines changed

fredapi/fred.py

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ def __do_series_search(self, url):
306306
data = None
307307
return data, num_results_total
308308

309-
def __get_search_results(self, url, limit, order_by, sort_order):
309+
def __get_search_results(self, url, limit, order_by, sort_order, filter):
310310
"""
311311
helper function for getting search results up to specified limit on the number of results. The Fred HTTP API
312312
truncates to 1000 results per request, so this may issue multiple HTTP requests to obtain more available data.
@@ -321,6 +321,12 @@ def __get_search_results(self, url, limit, order_by, sort_order):
321321
else:
322322
raise ValueError('%s is not in the valid list of order_by options: %s' % (order_by, str(order_by_options)))
323323

324+
if filter is not None:
325+
if len(filter) == 2:
326+
url = url + '&filter_variable=%s&filter_value=%s' % (filter[0], filter[1])
327+
else:
328+
raise ValueError('Filter should be a 2 item tuple like (filter_variable, filter_value)')
329+
324330
sort_order_options = ['asc', 'desc']
325331
if sort_order is not None:
326332
if sort_order in sort_order_options:
@@ -344,7 +350,7 @@ def __get_search_results(self, url, limit, order_by, sort_order):
344350
data = data.append(next_data)
345351
return data.head(max_results_needed)
346352

347-
def search(self, text, limit=1000, order_by=None, sort_order=None):
353+
def search(self, text, limit=1000, order_by=None, sort_order=None, filter=None):
348354
"""
349355
Do a fulltext search for series in the Fred dataset. Returns information about matching series in a DataFrame.
350356
@@ -360,6 +366,9 @@ def search(self, text, limit=1000, order_by=None, sort_order=None):
360366
'popularity'
361367
sort_order : str, optional
362368
sort the results by ascending or descending order. Valid options are 'asc' or 'desc'
369+
filter : tuple, optional
370+
filters the results. Expects a tuple like (filter_variable, filter_value).
371+
Valid filter_variable values are 'frequency', 'units', and 'seasonal_adjustment'
363372
364373
Returns
365374
-------
@@ -368,10 +377,10 @@ def search(self, text, limit=1000, order_by=None, sort_order=None):
368377
"""
369378
url = "%s/series/search?search_text=%s&" % (self.root_url,
370379
quote_plus(text))
371-
info = self.__get_search_results(url, limit, order_by, sort_order)
380+
info = self.__get_search_results(url, limit, order_by, sort_order, filter)
372381
return info
373382

374-
def search_by_release(self, release_id, limit=0, order_by=None, sort_order=None):
383+
def search_by_release(self, release_id, limit=0, order_by=None, sort_order=None, filter=None):
375384
"""
376385
Search for series that belongs to a release id. Returns information about matching series in a DataFrame.
377386
@@ -387,19 +396,22 @@ def search_by_release(self, release_id, limit=0, order_by=None, sort_order=None)
387396
'popularity'
388397
sort_order : str, optional
389398
sort the results by ascending or descending order. Valid options are 'asc' or 'desc'
399+
filter : tuple, optional
400+
filters the results. Expects a tuple like (filter_variable, filter_value).
401+
Valid filter_variable values are 'frequency', 'units', and 'seasonal_adjustment'
390402
391403
Returns
392404
-------
393405
info : DataFrame
394406
a DataFrame containing information about the matching Fred series
395407
"""
396408
url = "%s/release/series?release_id=%d" % (self.root_url, release_id)
397-
info = self.__get_search_results(url, limit, order_by, sort_order)
409+
info = self.__get_search_results(url, limit, order_by, sort_order, filter)
398410
if info is None:
399411
raise ValueError('No series exists for release id: ' + str(release_id))
400412
return info
401413

402-
def search_by_category(self, category_id, limit=0, order_by=None, sort_order=None):
414+
def search_by_category(self, category_id, limit=0, order_by=None, sort_order=None, filter=None):
403415
"""
404416
Search for series that belongs to a category id. Returns information about matching series in a DataFrame.
405417
@@ -415,6 +427,9 @@ def search_by_category(self, category_id, limit=0, order_by=None, sort_order=Non
415427
'popularity'
416428
sort_order : str, optional
417429
sort the results by ascending or descending order. Valid options are 'asc' or 'desc'
430+
filter : tuple, optional
431+
filters the results. Expects a tuple like (filter_variable, filter_value).
432+
Valid filter_variable values are 'frequency', 'units', and 'seasonal_adjustment'
418433
419434
Returns
420435
-------
@@ -423,7 +438,7 @@ def search_by_category(self, category_id, limit=0, order_by=None, sort_order=Non
423438
"""
424439
url = "%s/category/series?category_id=%d&" % (self.root_url,
425440
category_id)
426-
info = self.__get_search_results(url, limit, order_by, sort_order)
441+
info = self.__get_search_results(url, limit, order_by, sort_order, filter)
427442
if info is None:
428443
raise ValueError('No series exists for category id: ' + str(category_id))
429444
return info

0 commit comments

Comments
 (0)