From f536394a99802394d9f14c255c67cb50fe4fda55 Mon Sep 17 00:00:00 2001 From: Manoel Marques Date: Fri, 4 Mar 2022 16:02:07 -0500 Subject: [PATCH 1/2] Adopt lazy imports from Terra (#152) (cherry picked from commit 63822defdc5d12798009c7d98e82f515ca81249b) # Conflicts: # qiskit_finance/data_providers/exchange_data_provider.py # qiskit_finance/data_providers/wikipedia_data_provider.py --- .../data_providers/exchange_data_provider.py | 8 ++++++++ .../data_providers/random_data_provider.py | 19 +------------------ .../data_providers/wikipedia_data_provider.py | 8 ++++++++ .../data_providers/yahoo_data_provider.py | 18 +----------------- requirements.txt | 2 +- test/__init__.py | 6 +++--- .../test_european_call_delta_objective.py | 11 +++-------- .../test_european_call_pricing_objective.py | 13 ++++--------- .../test_fixed_income_pricing_objective.py | 13 ++++--------- test/data_providers/test_data_providers.py | 9 +-------- test/finance_test_case.py | 19 ------------------- 11 files changed, 34 insertions(+), 92 deletions(-) diff --git a/qiskit_finance/data_providers/exchange_data_provider.py b/qiskit_finance/data_providers/exchange_data_provider.py index 740119eb..c0cddd48 100644 --- a/qiskit_finance/data_providers/exchange_data_provider.py +++ b/qiskit_finance/data_providers/exchange_data_provider.py @@ -13,15 +13,23 @@ """ Exchange data provider. """ from typing import Union, List +<<<<<<< HEAD import logging import datetime import nasdaqdatalink +======= +import datetime +import quandl +>>>>>>> 63822de (Adopt lazy imports from Terra (#152)) from ._base_data_provider import BaseDataProvider, StockMarket from ..exceptions import QiskitFinanceError +<<<<<<< HEAD logger = logging.getLogger(__name__) +======= +>>>>>>> 63822de (Adopt lazy imports from Terra (#152)) class ExchangeDataProvider(BaseDataProvider): """Exchange data provider. diff --git a/qiskit_finance/data_providers/random_data_provider.py b/qiskit_finance/data_providers/random_data_provider.py index 574e1d49..7d66424d 100644 --- a/qiskit_finance/data_providers/random_data_provider.py +++ b/qiskit_finance/data_providers/random_data_provider.py @@ -15,19 +15,11 @@ from typing import Optional, Union, List import datetime import logging - +import pandas as pd import numpy as np -from qiskit.exceptions import MissingOptionalLibraryError from ._base_data_provider import BaseDataProvider -try: - import pandas as pd - - _HAS_PANDAS = True -except ImportError: - _HAS_PANDAS = False - logger = logging.getLogger(__name__) @@ -47,17 +39,8 @@ def __init__( start: first data point end: last data point precedes this date seed: optional random seed - - Raises: - MissingOptionalLibraryError: Pandas not installed """ super().__init__() - if not _HAS_PANDAS: - raise MissingOptionalLibraryError( - libname="Pandas", - name="RandomDataProvider", - pip_install="pip install pandas", - ) tickers = tickers if tickers is not None else ["TICKER1", "TICKER2"] if isinstance(tickers, list): self._tickers = tickers diff --git a/qiskit_finance/data_providers/wikipedia_data_provider.py b/qiskit_finance/data_providers/wikipedia_data_provider.py index a2a7a6a3..07ace3e0 100644 --- a/qiskit_finance/data_providers/wikipedia_data_provider.py +++ b/qiskit_finance/data_providers/wikipedia_data_provider.py @@ -13,15 +13,23 @@ """ Wikipedia data provider. """ from typing import Optional, Union, List +<<<<<<< HEAD import logging import datetime import nasdaqdatalink +======= +import datetime +import quandl +>>>>>>> 63822de (Adopt lazy imports from Terra (#152)) from ._base_data_provider import BaseDataProvider from ..exceptions import QiskitFinanceError +<<<<<<< HEAD logger = logging.getLogger(__name__) +======= +>>>>>>> 63822de (Adopt lazy imports from Terra (#152)) class WikipediaDataProvider(BaseDataProvider): """Wikipedia data provider. diff --git a/qiskit_finance/data_providers/yahoo_data_provider.py b/qiskit_finance/data_providers/yahoo_data_provider.py index d4aef13f..a2a672c5 100644 --- a/qiskit_finance/data_providers/yahoo_data_provider.py +++ b/qiskit_finance/data_providers/yahoo_data_provider.py @@ -15,18 +15,11 @@ from typing import Optional, Union, List import datetime import logging +import yfinance as yf -from qiskit.exceptions import MissingOptionalLibraryError from ._base_data_provider import BaseDataProvider from ..exceptions import QiskitFinanceError -try: - import yfinance as yf - - _HAS_YFINANCE = True -except ImportError: - _HAS_YFINANCE = False - logger = logging.getLogger(__name__) @@ -49,17 +42,8 @@ def __init__( tickers: tickers start: start time end: end time - - Raises: - MissingOptionalLibraryError: YFinance not installed """ super().__init__() - if not _HAS_YFINANCE: - raise MissingOptionalLibraryError( - libname="YFinance", - name="YahooDataProvider", - pip_install="pip install yfinance", - ) self._tickers = [] tickers = tickers if tickers is not None else [] if isinstance(tickers, list): diff --git a/requirements.txt b/requirements.txt index a5384f67..1839cc54 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -qiskit-terra>=0.17.0 +qiskit-terra>=0.20.0 qiskit-optimization>=0.2.0 scipy>=1.4 numpy>=1.17 diff --git a/test/__init__.py b/test/__init__.py index 783765ed..d20cec62 100644 --- a/test/__init__.py +++ b/test/__init__.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2018, 2021. +# (C) Copyright IBM 2018, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -12,6 +12,6 @@ """ Finance test packages """ -from .finance_test_case import QiskitFinanceTestCase, requires_extra_library +from .finance_test_case import QiskitFinanceTestCase -__all__ = ["QiskitFinanceTestCase", "requires_extra_library"] +__all__ = ["QiskitFinanceTestCase"] diff --git a/test/circuit/test_european_call_delta_objective.py b/test/circuit/test_european_call_delta_objective.py index 9279ed1b..674cce2a 100644 --- a/test/circuit/test_european_call_delta_objective.py +++ b/test/circuit/test_european_call_delta_objective.py @@ -19,7 +19,7 @@ from qiskit.circuit.library import IntegerComparator from qiskit.quantum_info import Operator -from qiskit.utils import QuantumInstance +from qiskit.utils import QuantumInstance, optionals from qiskit.algorithms import IterativeAmplitudeEstimation, EstimationProblem from qiskit_finance.circuit.library import LogNormalDistribution @@ -47,15 +47,10 @@ def test_circuit(self): self.assertTrue(Operator(ecd).equiv(comparator)) + @unittest.skipUnless(optionals.HAS_AER, "qiskit-aer is required to run this test") def test_application(self): """Test an end-to-end application.""" - try: - from qiskit import ( - Aer, - ) # pylint: disable=unused-import,import-outside-toplevel - except ImportError as ex: # pylint: disable=broad-except - self.skipTest(f"Aer doesn't appear to be installed. Error: '{str(ex)}'") - return + from qiskit import Aer num_qubits = 3 diff --git a/test/circuit/test_european_call_pricing_objective.py b/test/circuit/test_european_call_pricing_objective.py index 2934c9a0..c249b582 100644 --- a/test/circuit/test_european_call_pricing_objective.py +++ b/test/circuit/test_european_call_pricing_objective.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2020, 2021. +# (C) Copyright IBM 2020, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -17,7 +17,7 @@ import numpy as np -from qiskit.utils import algorithm_globals, QuantumInstance +from qiskit.utils import algorithm_globals, QuantumInstance, optionals from qiskit.algorithms import IterativeAmplitudeEstimation, EstimationProblem from qiskit.circuit.library import LinearAmplitudeFunction, TwoLocal from qiskit.quantum_info import Operator @@ -60,15 +60,10 @@ def test_ecev_circuit(self): self.assertTrue(Operator(ecev).equiv(linear_function)) + @unittest.skipUnless(optionals.HAS_AER, "qiskit-aer is required to run this test") def test_application(self): """Test an end-to-end application.""" - try: - from qiskit import ( - Aer, - ) # pylint: disable=unused-import,import-outside-toplevel - except ImportError as ex: # pylint: disable=broad-except - self.skipTest(f"Aer doesn't appear to be installed. Error: '{str(ex)}'") - return + from qiskit import Aer bounds = np.array([0.0, 7.0]) num_qubits = 3 diff --git a/test/circuit/test_fixed_income_pricing_objective.py b/test/circuit/test_fixed_income_pricing_objective.py index bff5b016..be17a68c 100644 --- a/test/circuit/test_fixed_income_pricing_objective.py +++ b/test/circuit/test_fixed_income_pricing_objective.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2020, 2021. +# (C) Copyright IBM 2020, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -18,7 +18,7 @@ import numpy as np from qiskit import QuantumCircuit -from qiskit.utils import QuantumInstance +from qiskit.utils import QuantumInstance, optionals from qiskit.algorithms import IterativeAmplitudeEstimation, EstimationProblem from qiskit.quantum_info import Operator from qiskit_finance.circuit.library import NormalDistribution @@ -50,15 +50,10 @@ def test_circuit(self): self.assertTrue(Operator(circuit).equiv(expected)) + @unittest.skipUnless(optionals.HAS_AER, "qiskit-aer is required to run this test") def test_application(self): """Test an end-to-end application.""" - try: - from qiskit import ( - Aer, - ) # pylint: disable=unused-import,import-outside-toplevel - except ImportError as ex: # pylint: disable=broad-except - self.skipTest(f"Aer doesn't appear to be installed. Error: '{str(ex)}'") - return + from qiskit import Aer a_n = np.eye(2) b = np.zeros(2) diff --git a/test/data_providers/test_data_providers.py b/test/data_providers/test_data_providers.py index e6163139..d2e51e98 100644 --- a/test/data_providers/test_data_providers.py +++ b/test/data_providers/test_data_providers.py @@ -16,7 +16,7 @@ import warnings import os import datetime -from test import QiskitFinanceTestCase, requires_extra_library +from test import QiskitFinanceTestCase from ddt import ddt, data, unpack import numpy as np from qiskit_finance import QiskitFinanceError @@ -50,7 +50,6 @@ def tearDown(self): warnings.filterwarnings(action="default", message="unclosed", category=ResourceWarning) warnings.filterwarnings(action="default", module="urllib3", category=DeprecationWarning) - @requires_extra_library def test_random_wrong_use(self): """Random wrong use test""" rnd = RandomDataProvider(seed=1) @@ -73,7 +72,6 @@ def test_random_wrong_use(self): with self.subTest("test WikipediaDataProvider get_similarity_matrix"): self.assertRaises(QiskitFinanceError, wiki.get_similarity_matrix) - @requires_extra_library def test_yahoo_wrong_use(self): """Yahoo! wrong use test""" yahoo = YahooDataProvider( @@ -87,7 +85,6 @@ def test_yahoo_wrong_use(self): with self.subTest("test YahooDataProvider get_similarity_matrix"): self.assertRaises(QiskitFinanceError, yahoo.get_similarity_matrix) - @requires_extra_library def test_random(self): """random test""" similarity = np.array([[1.00000000e00, 6.2284804e-04], [6.2284804e-04, 1.00000000e00]]) @@ -99,7 +96,6 @@ def test_random(self): with self.subTest("test RandomDataProvider get_similarity_matrix"): np.testing.assert_array_almost_equal(rnd.get_similarity_matrix(), similarity, decimal=3) - @requires_extra_library def test_random_divide_0(self): """Random divide by 0 test""" # This will create data with some 0 values, it should not throw @@ -121,7 +117,6 @@ def test_random_divide_0(self): with self.subTest("test get_period_return_covariance_matrix is numpy array"): self.assertIsInstance(sigma_value, np.ndarray) - @requires_extra_library def test_wikipedia(self): """wikipedia test""" try: @@ -165,7 +160,6 @@ def test_nasdaq(self): except QiskitFinanceError as ex: self.skipTest(f"Test of DataOnDemandProvider skipped {str(ex)}") - @requires_extra_library def test_exchangedata(self): """exchange data test""" try: @@ -197,7 +191,6 @@ def test_exchangedata(self): ["AEO", 7.0, [[1.0]]], ) @unpack - @requires_extra_library def test_yahoo(self, tickers, covariance, similarity): """Yahoo data test""" yahoo = YahooDataProvider( diff --git a/test/finance_test_case.py b/test/finance_test_case.py index 9d04d31d..3553528b 100644 --- a/test/finance_test_case.py +++ b/test/finance_test_case.py @@ -20,7 +20,6 @@ import os import unittest import time -from qiskit.exceptions import MissingOptionalLibraryError # disable deprecation warnings that can cause log output overflow # pylint: disable=unused-argument @@ -34,24 +33,6 @@ def _noop(*args, **kargs): # warnings.warn = _noop -def requires_extra_library(test_item): - """Decorator that skips test if an extra library is not available - Args: - test_item (callable): function to be decorated. - Returns: - callable: the decorated function. - """ - - def wrapper(self, *args): - try: - test_item(self, *args) - except MissingOptionalLibraryError as ex: - self.skipTest(str(ex)) - return wrapper - - return wrapper - - class QiskitFinanceTestCase(unittest.TestCase, ABC): """Finance Test Case""" From f750c95c181ccd663a19b8fb36714e39a4d4c1ef Mon Sep 17 00:00:00 2001 From: Manoel Marques Date: Mon, 29 Aug 2022 18:16:53 -0400 Subject: [PATCH 2/2] fix conflicts --- qiskit_finance/data_providers/exchange_data_provider.py | 8 -------- qiskit_finance/data_providers/wikipedia_data_provider.py | 8 -------- 2 files changed, 16 deletions(-) diff --git a/qiskit_finance/data_providers/exchange_data_provider.py b/qiskit_finance/data_providers/exchange_data_provider.py index c0cddd48..740119eb 100644 --- a/qiskit_finance/data_providers/exchange_data_provider.py +++ b/qiskit_finance/data_providers/exchange_data_provider.py @@ -13,23 +13,15 @@ """ Exchange data provider. """ from typing import Union, List -<<<<<<< HEAD import logging import datetime import nasdaqdatalink -======= -import datetime -import quandl ->>>>>>> 63822de (Adopt lazy imports from Terra (#152)) from ._base_data_provider import BaseDataProvider, StockMarket from ..exceptions import QiskitFinanceError -<<<<<<< HEAD logger = logging.getLogger(__name__) -======= ->>>>>>> 63822de (Adopt lazy imports from Terra (#152)) class ExchangeDataProvider(BaseDataProvider): """Exchange data provider. diff --git a/qiskit_finance/data_providers/wikipedia_data_provider.py b/qiskit_finance/data_providers/wikipedia_data_provider.py index 07ace3e0..a2a7a6a3 100644 --- a/qiskit_finance/data_providers/wikipedia_data_provider.py +++ b/qiskit_finance/data_providers/wikipedia_data_provider.py @@ -13,23 +13,15 @@ """ Wikipedia data provider. """ from typing import Optional, Union, List -<<<<<<< HEAD import logging import datetime import nasdaqdatalink -======= -import datetime -import quandl ->>>>>>> 63822de (Adopt lazy imports from Terra (#152)) from ._base_data_provider import BaseDataProvider from ..exceptions import QiskitFinanceError -<<<<<<< HEAD logger = logging.getLogger(__name__) -======= ->>>>>>> 63822de (Adopt lazy imports from Terra (#152)) class WikipediaDataProvider(BaseDataProvider): """Wikipedia data provider.