Merge pull request #263 from hydrosquall/feature/validate-multi-ticker-pandas-arguments

[fix] Validate multi-ticker pandas arguments
This commit is contained in:
Cameron Yick
2019-05-05 15:51:33 -04:00
committed by GitHub
5 changed files with 42 additions and 22 deletions

View File

@@ -6,6 +6,8 @@ History
0.10.x (2019-XX-XX)
------------------
* Documentation: Added a "Peer Comparison Analysis" Jupyter Notebook under "/examples" (@i3creations #197)
* Minor: Update error message to clarify multiple tickers only work with single metrics
* Updated development dependencies
0.9.x (2019-01-30)

View File

@@ -6,7 +6,7 @@ from unittest import TestCase
import vcr
from tiingo import TiingoClient
from tiingo.api import InvalidFrequencyError
from tiingo.exceptions import InvalidFrequencyError
from tiingo.restclient import RestClientError

View File

@@ -4,7 +4,7 @@
import vcr
from unittest import TestCase
from tiingo import TiingoClient
from tiingo.api import APIColumnNameError, InstallPandasException
from tiingo.exceptions import APIColumnNameError, InstallPandasException, MissingRequiredArgumentError
try:
import pandas as pd
pandas_is_installed = True
@@ -69,6 +69,10 @@ class TestTiingoWithPython(TestCase):
self._client.get_dataframe(['GOOGL', 'AAPL'], startDate='2018-01-05',
endDate='2018-01-19', metric_name='xopen', frequency='weekly')
def test_metric_name_missing_when_multiple_tickers(self):
with self.assertRaises(MissingRequiredArgumentError):
self._client.get_dataframe(['GOOGL', 'AAPL'], frequency='weekly')
@vcr.use_cassette('tests/fixtures/ticker_price_pandas_single.yaml')
def test_pandas_edge_case(self):
"""Test single price/date being returned as a frame"""

View File

@@ -1,15 +1,22 @@
# -*- coding: utf-8 -*-
import os
import sys
import pkg_resources
from collections import namedtuple
import csv
import json
from collections import namedtuple
from zipfile import ZipFile
from tiingo.restclient import RestClient
import requests
import os
import re
import sys
import pkg_resources
from zipfile import ZipFile
import requests
from tiingo.restclient import RestClient
from tiingo.exceptions import (
InstallPandasException,
APIColumnNameError,
InvalidFrequencyError,
MissingRequiredArgumentError)
try:
import pandas as pd
@@ -49,17 +56,6 @@ def dict_to_object(item, object_name):
object_hook=lambda d:
namedtuple(object_name, fields)(*values))
class InstallPandasException(Exception):
pass
class APIColumnNameError(Exception):
pass
class InvalidFrequencyError(Exception):
pass
class TiingoClient(RestClient):
"""Class for managing interactions with the Tiingo REST API
@@ -227,12 +223,16 @@ class TiingoClient(RestClient):
frequency (string): Resample frequency (defaults to daily).
"""
valid_columns = ['open', 'high', 'low', 'close', 'volume', 'adjOpen', 'adjHigh', 'adjLow',
'adjClose', 'adjVolume', 'divCash', 'splitFactor']
valid_columns = {'open', 'high', 'low', 'close', 'volume', 'adjOpen', 'adjHigh', 'adjLow',
'adjClose', 'adjVolume', 'divCash', 'splitFactor'}
if metric_name is not None and metric_name not in valid_columns:
raise APIColumnNameError('Valid data items are: ' + str(valid_columns))
if metric_name is None and isinstance(tickers, list):
raise MissingRequiredArgumentError("""When tickers is provided as a list, metric_name is a required argument.
Please provide a metric_name, or call this method with one ticker at a time.""")
params = {
'format': 'json',
'resampleFreq': frequency

14
tiingo/exceptions.py Normal file
View File

@@ -0,0 +1,14 @@
# Exception Clasess
class InstallPandasException(Exception):
pass
class APIColumnNameError(Exception):
pass
class InvalidFrequencyError(Exception):
pass
class MissingRequiredArgumentError(Exception):
pass