diff --git a/openbb_terminal/alternative/alt_controller.py b/openbb_terminal/alternative/alt_controller.py index 607b0960f98..833ffd35c18 100644 --- a/openbb_terminal/alternative/alt_controller.py +++ b/openbb_terminal/alternative/alt_controller.py @@ -25,7 +25,7 @@ class AlternativeDataController(BaseController): """Alternative Controller class""" CHOICES_COMMANDS: List[str] = ["hn"] - CHOICES_MENUS = ["covid", "oss"] + CHOICES_MENUS = ["covid", "oss","realestate"] PATH = "/alternative/" CHOICES_GENERATION = True @@ -43,6 +43,7 @@ class AlternativeDataController(BaseController): mt = MenuText("alternative/") mt.add_menu("covid") mt.add_menu("oss") + mt.add_menu("realestate") mt.add_raw("\n") mt.add_cmd("hn") console.print(text=mt.menu_text, menu="Alternative") @@ -81,3 +82,12 @@ class AlternativeDataController(BaseController): if ns_parser: hackernews_view.display_stories(limit=ns_parser.limit) + + @log_start_end(log=logger) + def call_realestate(self, _): + """Process realestate command.""" + from openbb_terminal.alternative.realestate.realestate_controller import ( + RealEstateController, + ) + + self.queue = self.load_class(RealEstateController, self.queue) \ No newline at end of file diff --git a/openbb_terminal/alternative/realestate/__init__.py b/openbb_terminal/alternative/realestate/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_terminal/alternative/realestate/landRegistry_model.py b/openbb_terminal/alternative/realestate/landRegistry_model.py new file mode 100644 index 00000000000..730155b5325 --- /dev/null +++ b/openbb_terminal/alternative/realestate/landRegistry_model.py @@ -0,0 +1,253 @@ +""" UK Land Registry Model """ +__docformat__ = "numpy" + +import logging +import io +import pandas as pd +from SPARQLWrapper.Wrapper import CSV, SPARQLWrapper + +from openbb_terminal.decorators import log_start_end + +logger = logging.getLogger(__name__) + + +def pcd_format(postcode: str): + return ( + postcode[0 : len(postcode) - 3].strip() + + " " + + postcode[len(postcode) - 3 : len(postcode)] + ) + + +@log_start_end(log=logger) +def get_estate_sales(postcode: str) -> pd.DataFrame: + + """All sales for specified postcode. + + Parameters + ---------- + postcode : str + Postcode + + + Returns + ------- + pd.DataFrame + All sales with that postcode + """ + + if not postcode: + return pd.DataFrame() + + # the upper is done since SDK calls don't appear to go through the controller + pcd_postcode = pcd_format(postcode.upper()) + + query = f""" + PREFIX lrppi: + PREFIX rdf: + PREFIX owl: + PREFIX lrcommon: + PREFIX xsd: + PREFIX ukhpi: + PREFIX skos: + PREFIX rdfs: + PREFIX sr: + + SELECT ?paon ?saon ?street ?town ?county ?postcode ?amount ?date ?id ?category + WHERE + {{ VALUES ?postcode {{ "{pcd_postcode}" }} + ?addr lrcommon:postcode ?postcode . + ?transx lrppi:propertyAddress ?addr ; + lrppi:pricePaid ?amount ; + lrppi:transactionId ?id ; + lrppi:transactionDate ?date . + ?transx lrppi:transactionCategory/skos:prefLabel ?category. + + OPTIONAL {{ ?addr lrcommon:county ?county }} + OPTIONAL {{ ?addr lrcommon:paon ?paon }} + OPTIONAL {{ ?addr lrcommon:saon ?saon }} + OPTIONAL {{ ?addr lrcommon:street ?street }} + OPTIONAL {{ ?addr lrcommon:town ?town }} + }} + ORDER BY DESC(?date) + """ + endpoint = "http://landregistry.data.gov.uk/landregistry/query" + + # df = sparql_dataframe.get(endpoint, query) + + df = pd.DataFrame() + sparql = SPARQLWrapper(endpoint) + sparql.setReturnFormat(CSV) + sparql.setQuery(query) + + results = sparql.query().convert() + if isinstance(results, bytes): + _csv = io.StringIO(results.decode("utf-8")) + # print( pd.read_csv(_csv, sep=",")) + df = pd.read_csv(_csv, sep=",") + + return df + + +@log_start_end(log=logger) +def get_towns_sold_prices( + town: str, startdate: str = "2010-01-01", enddate: str = "" +) -> pd.DataFrame: + """Get towns sold house price data. + + Parameters + ---------- + town : str + town + + startdate : str + startDate + + enddate : str + endDate + + + Returns + ------- + pd.DataFrame + All sales for that town within the date range specified + """ + + # the upper is done since SDK calls don't appear to go through the controller + town = town.upper() + + query = f""" + prefix rdf: + prefix rdfs: + prefix owl: + prefix xsd: + prefix sr: + prefix ukhpi: + prefix lrppi: + prefix skos: + prefix lrcommon: + + SELECT ?paon ?saon ?street ?county ?postcode ?amount ?date ?category + WHERE + {{ + VALUES ?town {{"{town}"^^xsd:string}} + + ?addr lrcommon:town ?town ; + lrcommon:postcode ?postcode. + + ?transx lrppi:propertyAddress ?addr ; + lrppi:pricePaid ?amount ; + lrppi:transactionDate ?date ; + lrppi:transactionCategory/skos:prefLabel ?category. + + FILTER ( + ?date > "{startdate}"^^xsd:date && + ?date < "{enddate}"^^xsd:date + ). + + OPTIONAL {{?addr lrcommon:county ?county}} + OPTIONAL {{?addr lrcommon:paon ?paon}} + OPTIONAL {{?addr lrcommon:saon ?saon}} + OPTIONAL {{?addr lrcommon:saon ?postcode}} + OPTIONAL {{?addr lrcommon:street ?street}} + }} + ORDER BY (?date && ?postcode) + """ + + endpoint = "http://landregistry.data.gov.uk/landregistry/query" + + df = pd.DataFrame() + sparql = SPARQLWrapper(endpoint) + sparql.setReturnFormat(CSV) + sparql.setQuery(query) + sparql.method = "POST" + + results = sparql.query().convert() + if isinstance(results, bytes): + _csv = io.StringIO(results.decode("utf-8")) + df = pd.read_csv(_csv, sep=",") + + return df + + +@log_start_end(log=logger) +def get_region_stats( + region: str, startdate: str = "2010-01-01", enddate: str = "" +) -> pd.DataFrame: + """Get regional house price statistics. + + Parameters + ---------- + region : str + region + + startdate : str + startDate + + enddate : str + endDate + + + Returns + ------- + pd.DataFrame + All stats for that region within the date range specified + """ + + region = region.lower() + + query = f""" + prefix rdf: + prefix rdfs: + prefix owl: + prefix xsd: + prefix sr: + prefix ukhpi: + prefix lrppi: + prefix skos: + prefix lrcommon: + + SELECT ?month ?avgPrice ?avgPriceCash ?totalSalesVolume ?avgPriceExistingProperty + ?avgPriceFirstTimeBuyer + ?avgPriceDetached ?hpi ?detachedhpi ?newbuildhpi + {{ + values ?refRegion {{}} + ?region ukhpi:refPeriodStart ?month ; + ukhpi:housePriceIndex ?hpi ; + ukhpi:refRegion ?refRegion ; + ukhpi:averagePrice ?avgPrice ; + ukhpi:averagePriceCash ?avgPriceCash ; + ukhpi:salesVolume ?totalSalesVolume ; + ukhpi:averagePriceDetached ?avgPriceDetached ; + ukhpi:averagePriceExistingProperty ?avgPriceExistingProperty ; + ukhpi:averagePriceFirstTimeBuyer ?avgPriceFirstTimeBuyer ; + ukhpi:housePriceIndexDetached ?detachedhpi ; + ukhpi:housePriceIndexNewBuild ?newbuildhpi . + ?refRegion rdfs:label ?regionLabel . + FILTER(LANG(?regionLabel) = "en"). + FILTER ( + ?month > "{startdate}"^^xsd:date && + ?month < "{enddate}"^^xsd:date + ) + + OPTIONAL {{?region ukhpi:housePriceIndexDetached ?detachedhpi}} + OPTIONAL {{?region ukhpi:housePriceIndexNewBuild ?newbuildhpi }} + OPTIONAL {{?region ukhpi:averagePrice ?averagePrice }} + }} + ORDER BY (?month) + """ + + endpoint = "http://landregistry.data.gov.uk/landregistry/query" + + df = pd.DataFrame() + sparql = SPARQLWrapper(endpoint) + sparql.setReturnFormat(CSV) + sparql.setQuery(query) + sparql.method = "POST" + + results = sparql.query().convert() + if isinstance(results, bytes): + _csv = io.StringIO(results.decode("utf-8")) + df = pd.read_csv(_csv, sep=",") + + return df diff --git a/openbb_terminal/alternative/realestate/landRegistry_view.py b/openbb_terminal/alternative/realestate/landRegistry_view.py new file mode 100644 index 00000000000..3d7328a5c1f --- /dev/null +++ b/openbb_terminal/alternative/realestate/landRegistry_view.py @@ -0,0 +1,143 @@ +""" UK Land Registry View """ +__docformat__ = "numpy" + +import logging +import os + +from openbb_terminal.decorators import log_start_end +from openbb_terminal.alternative.realestate import landRegistry_model +from openbb_terminal.helper_funcs import print_rich_table, export_data +from openbb_terminal.rich_config import console + +logger = logging.getLogger(__name__) + + +@log_start_end(log=logger) +def display_estate_sales(postcode: str, export: str = "") -> None: + """Display real estate sales. + + Parameters + ---------- + postcode : str + Postcode + + """ + sales = landRegistry_model.get_estate_sales(postcode) + + if sales.empty or len(sales) == 0: + console.print( + "[red]" + + "No data loaded.\n" + + "Make sure you picked a valid postcode." + + "[/red]\n" + ) + return + + print_rich_table( + sales, + show_index=False, + title=f"[bold]{postcode}[/bold]", + ) + + export_data( + export, + os.path.dirname(os.path.abspath(__file__)), + "sales", + sales, + ) + + +@log_start_end(log=logger) +def display_towns_sold_prices( + town: str, startdate: str, enddate: str, export: str = "" +): + """Get towns sold house price data. + + Parameters + ---------- + town : str + town + + startdate : str + startDate + + enddate : str + endDate + + + Returns + ------- + pd.DataFrame + All sales for that town within the date range specified + """ + + sales = landRegistry_model.get_towns_sold_prices(town, startdate, enddate) + + if sales.empty or len(sales) == 0: + console.print( + "[red]" + + "No data loaded.\n" + + "Make sure you picked a valid town and date range." + + "[/red]\n" + ) + return + + print_rich_table( + sales, + show_index=False, + title=f"[bold]{town} : {startdate} - {enddate}[/bold]", + ) + + export_data( + export, + os.path.dirname(os.path.abspath(__file__)), + "towns_sold_prices", + sales, + ) + + +@log_start_end(log=logger) +def display_region_stats(region: str, startdate: str, enddate: str, export: str = ""): + """Get towns sold house price data. + + Parameters + ---------- + region : str + region + + startdate : str + startDate + + enddate : str + endDate + + + Returns + ------- + pd.DataFrame + All stats for that region within the date range specified + """ + + stats = landRegistry_model.get_region_stats(region, startdate, enddate) + + if stats.empty or len(stats) == 0: + console.print( + "[red]" + + "No data loaded.\n" + + "Make sure you picked a valid region and date range." + + "[/red]\n" + ) + return + + print_rich_table( + stats, + show_index=False, + title=f"[bold]{region} : {startdate} - {enddate}[/bold]", + ) + + export_data( + export, + os.path.dirname(os.path.abspath(__file__)), + "region_stats", + stats, + ) diff --git a/openbb_terminal/alternative/realestate/realestate_controller.py b/openbb_terminal/alternative/realestate/realestate_controller.py new file mode 100644 index 00000000000..f2f9c4afc3b --- /dev/null +++ b/openbb_terminal/alternative/realestate/realestate_controller.py @@ -0,0 +1,282 @@ +"""Trading Hours Controller.""" +__docformat__ = "numpy" + +import argparse +import logging + +from typing import List + +from openbb_terminal.custom_prompt_toolkit import NestedCompleter + +from openbb_terminal import feature_flags as obbff +from openbb_terminal.decorators import log_start_end +from openbb_terminal.menu import session +from openbb_terminal.helper_funcs import ( + EXPORT_ONLY_RAW_DATA_ALLOWED, +) +from openbb_terminal.rich_config import console, MenuText +from openbb_terminal.parent_classes import BaseController +from openbb_terminal.alternative.realestate import landRegistry_view + +logger = logging.getLogger(__name__) + + +class RealEstateController(BaseController): + + """Real Estate Controller class.""" + + CHOICES_COMMANDS = ["sales", "townsales", "regionstats"] + PATH = "/alternative/realestate/" + CHOICES_GENERATION = True + # FILE_PATH = os.path.join(os.path.dirname(__file__), "README.md") + + def __init__(self, queue: List[str] = None): + """Construct Data.""" + super().__init__(queue) + + self.enddate = None + self.startdate = None + self.town = None + self.postcode = None + self.region = None + + if session and obbff.USE_PROMPT_TOOLKIT: + choices: dict = self.choices_default + self.completer = NestedCompleter.from_nested_dict(choices) + + def print_help(self): + + mt = MenuText("alternative/realestate/") + mt.add_cmd("sales") + mt.add_raw("\n") + mt.add_param("_postcode", self.postcode or "") + mt.add_raw("\n") + mt.add_cmd("townsales") + mt.add_raw("\n") + mt.add_param("_town", self.town or "") + mt.add_param("_startdate ", self.startdate or "") + mt.add_param("_enddate ", self.enddate or "") + mt.add_raw("\n") + mt.add_cmd("regionstats") + mt.add_raw("\n") + mt.add_param("_region", self.region or "") + mt.add_param("_startdate ", self.startdate or "") + mt.add_param("_enddate ", self.enddate or "") + + console.print(text=mt.menu_text, menu="UK Real Estate Sales Data") + + @log_start_end(log=logger) + def call_sales(self, other_args: List[str]): + """Process 'postcode' command.""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="sales", + description="Select the postcode you want to see sold house price data for. [Source: UK Land Registry]", + ) + parser.add_argument( + "-p", + "--postcode", + help="Postcode", + type=str.upper, + required="-h" not in other_args, + dest="postcode", + metavar="postcode", + ) + + if ( + other_args + and "-p" not in other_args[0] + and "--postcode" not in other_args[0] + and "-h" not in other_args + ): + other_args.insert(0, "-p") + + ns_parser = self.parse_known_args_and_warn( + parser, other_args, EXPORT_ONLY_RAW_DATA_ALLOWED + ) + + if ns_parser: + if ns_parser.postcode: + landRegistry_view.display_estate_sales( + ns_parser.postcode, export=ns_parser.export + ) + else: + console.print("[red]Select valid postcode[/red]\n") + else: + console.print("[red]Select valid postcode[/red]\n") + + @log_start_end(log=logger) + def call_townsales(self, other_args: List[str]): + """Process 'townsales' command.""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="townsales", + description="""Select the town and date range you want to see sold house price data for. + [Source: UK Land Registry]""", + ) + + parser.add_argument( + "-t", + "--town", + help="Town that we want sales information for", + type=str.upper, + required="-h" not in other_args, + dest="town", + metavar="town", + ) + + parser.add_argument( + "-s", + "--startdate", + help="Start date that we want sales information for", + type=str, + required=True, + dest="startdate", + metavar="startdate", + ) + + parser.add_argument( + "-e", + "--enddate", + help="End date that we want sales information for", + type=str, + required=True, + dest="enddate", + metavar="enddate", + ) + + if ( + other_args + and "-t" not in other_args[0] + and "--town" not in other_args[0] + and "-h" not in other_args + ): + other_args.insert(0, "-t") + + if ( + other_args + and len(other_args) > 2 + and "-s" not in other_args[2] + and "--startdate" not in other_args[2] + and "-h" not in other_args + ): + other_args.insert(2, "-s") + + if ( + other_args + and len(other_args) > 4 + and "-e" not in other_args[4] + and "--enddate" not in other_args[4] + and "-h" not in other_args + ): + other_args.insert(4, "-e") + + ns_parser = self.parse_known_args_and_warn( + parser, other_args, EXPORT_ONLY_RAW_DATA_ALLOWED + ) + + if ns_parser: + if ns_parser.town and ns_parser.startdate and ns_parser.enddate: + landRegistry_view.display_towns_sold_prices( + ns_parser.town, + ns_parser.startdate, + ns_parser.enddate, + ns_parser.export, + ) + else: + console.print( + "[red]Select the town you want to know about and a valid date range.[/red]\n" + ) + else: + console.print( + "[red]Select the town you want to know about and a valid date range.[/red]\n" + ) + + @log_start_end(log=logger) + def call_regionstats(self, other_args: List[str]): + """Process 'regionstats' command.""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="regionstats", + description="Select the region and date range you want see stats for. [Source: UK Land Registry]", + ) + + parser.add_argument( + "-r", + "--region", + help="Region that we want stats for", + type=str.lower, + required="-h" not in other_args, + dest="region", + metavar="region", + ) + + parser.add_argument( + "-s", + "--startdate", + help="Start date that we want sales information for", + type=str, + required=True, + dest="startdate", + metavar="startdate", + ) + + parser.add_argument( + "-e", + "--enddate", + help="End date that we want sales information for", + type=str, + required=True, + dest="enddate", + metavar="enddate", + ) + + if ( + other_args + and "-r" not in other_args[0] + and "--region" not in other_args[0] + and "-h" not in other_args + ): + other_args.insert(0, "-r") + + if ( + other_args + and len(other_args) > 2 + and "-s" not in other_args[2] + and "--startdate" not in other_args[2] + and "-h" not in other_args + ): + other_args.insert(2, "-s") + + if ( + other_args + and len(other_args) > 4 + and "-e" not in other_args[4] + and "--enddate" not in other_args[4] + and "-h" not in other_args + ): + other_args.insert(4, "-e") + + ns_parser = self.parse_known_args_and_warn( + parser, other_args, EXPORT_ONLY_RAW_DATA_ALLOWED + ) + + if ns_parser: + if ns_parser.region and ns_parser.startdate and ns_parser.enddate: + landRegistry_view.display_region_stats( + ns_parser.region, + ns_parser.startdate, + ns_parser.enddate, + ns_parser.export, + ) + else: + console.print( + "[red]Select the region you want to know about and a valid date range.[/red]\n" + ) + else: + console.print( + "[red]Select the region you want to know about and a valid date range.[/red]\n" + ) diff --git a/openbb_terminal/miscellaneous/i18n/en.yml b/openbb_terminal/miscellaneous/i18n/en.yml index 679df15c76e..276db536fd0 100644 --- a/openbb_terminal/miscellaneous/i18n/en.yml +++ b/openbb_terminal/miscellaneous/i18n/en.yml @@ -862,6 +862,7 @@ en: alternative/hn: Hacker News most popular stories alternative/covid: COVID menu, cases, deaths, rates alternative/oss: Open Source menu, star history, repos information + alternative/realestate: Real Estate menu, sold prices, HPIs alternative/covid/slopes: get countries with highest slope in cases alternative/covid/country: select country for data alternative/covid/_country: Country @@ -873,6 +874,9 @@ en: alternative/oss/rs: repo summary alternative/oss/sh: repo star history alternative/oss/tr: top starred repos + alternative/realestate/sales: list UK house sales via postcode + alternative/realestate/townsales: list UK house sales via town + alternative/realestate/regionstats: retrieve UK sold house price stats by region econometrics/_data_loc: Looking for data in econometrics/load: load a dataset (also works with StatsModels datasets) econometrics/export: export a processed dataset diff --git a/poetry.lock b/poetry.lock index bcedbe9bb68..0c09e5128dc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1545,6 +1545,17 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "isodate" +version = "0.6.1" +description = "An ISO 8601 date/time/duration parser and formatter" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + [[package]] name = "isort" version = "5.10.1" @@ -3481,6 +3492,26 @@ python-versions = ">=2.7" [package.extras] full = ["numpy"] +[[package]] +name = "rdflib" +version = "6.2.0" +description = "RDFLib is a Python library for working with RDF, a simple yet powerful language for representing information." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +isodate = "*" +pyparsing = "*" + +[package.extras] +berkeleydb = ["berkeleydb"] +dev = ["black (==22.6.0)", "flake8", "isort", "mypy", "pep8-naming", "types-setuptools", "flakeheaven"] +docs = ["myst-parser", "sphinx (<6)", "sphinxcontrib-apidoc", "sphinxcontrib-kroki", "sphinx-autodoc-typehints"] +html = ["html5lib"] +networkx = ["networkx"] +tests = ["html5lib", "pytest", "pytest-cov"] + [[package]] name = "regex" version = "2022.3.2" @@ -3856,6 +3887,23 @@ category = "main" optional = false python-versions = ">=3.6" +[[package]] +name = "sparqlwrapper" +version = "2.0.0" +description = "SPARQL Endpoint interface to Python" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +rdflib = ">=6.1.1" + +[package.extras] +dev = ["setuptools (>=3.7.1)", "mypy (>=0.931)", "pandas (>=1.3.5)", "pandas-stubs (>=1.2.0.48)"] +docs = ["sphinx (<5)", "sphinx-rtd-theme"] +keepalive = ["keepalive (>=0.5)"] +pandas = ["pandas (>=1.3.5)"] + [[package]] name = "sphinx" version = "4.5.0" @@ -4856,7 +4904,7 @@ prediction = ["torch", "pytorch-lightning", "u8darts"] [metadata] lock-version = "1.1" python-versions = "^3.8,<3.11, !=3.9.7" -content-hash = "93af5b94272cecbbb58b50a5d271585b2217292a40007bbec5eaef5186802827" +content-hash = "80a1a29b160bb77a07f1e8bf11d5a47ddd6219601d420f11c93cdcb56ef1bfcf" [metadata.files] absl-py = [] @@ -4980,6 +5028,7 @@ ipython = [] ipython-genutils = [] ipywidgets = [] iso8601 = [] +isodate = [] isort = [] jedi = [] jedi-language-server = [] @@ -5126,6 +5175,7 @@ pyzmq = [] qdldl = [] quandl = [] rapidfuzz = [] +rdflib = [] regex = [] requests = [] requests-oauthlib = [] @@ -5156,6 +5206,7 @@ sniffio = [] snowballstemmer = [] socketio-client-nexus = [] soupsieve = [] +sparqlwrapper = [] sphinx = [] sphinxcontrib-applehelp = [] sphinxcontrib-devhelp = [] diff --git a/pyproject.toml b/pyproject.toml index 982a9ec72dd..163a6e8fd4e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -108,6 +108,7 @@ docstring-parser = {version = "^0.15", optional = true} grpcio = "^1.51.1" jupyterlab-widgets = "^3.0.3" packaging = ">=22.0" +SPARQLWrapper = "^2.0.0" [tool.poetry.dev-dependencies] pytest = "^6.2.2" diff --git a/requirements-full.txt b/requirements-full.txt index 301cc72b5d4..29ba60b0d1c 100644 --- a/requirements-full.txt +++ b/requirements-full.txt @@ -116,6 +116,7 @@ ipython-genutils==0.2.0; python_version >= "3.7" ipython==8.5.0; python_version >= "3.8" ipywidgets==8.0.2; python_version >= "3.7" iso8601==0.1.16 +isodate==0.6.1; python_version >= "3.7" isort==5.10.1; python_full_version >= "3.7.2" and python_version < "4.0" jedi==0.18.1; python_version >= "3.8" jinja2==3.1.2; python_version >= "3.7" @@ -252,6 +253,7 @@ pyzmq==24.0.1; python_full_version >= "3.7.0" and python_full_version < "4.0.0" qdldl==0.1.5.post2; python_version >= "3.7" quandl==3.7.0; python_version >= "3.6" rapidfuzz==1.9.1; python_version >= "2.7" +rdflib==6.2.0; python_version >= "3.7" regex==2022.3.2; python_version >= "3.6" requests-oauthlib==1.3.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" requests==2.28.1; python_version >= "3.7" and python_version < "4" @@ -282,6 +284,7 @@ sniffio==1.3.0; python_version >= "3.8" and python_version < "4.0" and python_fu snowballstemmer==2.2.0; python_version >= "3.6" socketio-client-nexus==0.7.6 soupsieve==2.3.2.post1; python_version >= "3.6" and python_full_version >= "3.6.0" +sparqlwrapper==2.0.0; python_version >= "3.7" sphinx==4.5.0; python_version >= "3.6" sphinxcontrib-applehelp==1.0.2; python_version >= "3.6" sphinxcontrib-devhelp==1.0.2; python_version >= "3.6" diff --git a/requirements.txt b/requirements.txt index fb5527d267b..a6c0f12b921 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,30 +1,27 @@ aiodns==3.0.0; python_version >= "3.5.2" and python_full_version >= "3.7.0" aiohttp==3.8.3; python_version >= "3.6" and python_full_version >= "3.7.0" aiosignal==1.2.0; python_version >= "3.6" and python_full_version >= "3.7.0" -alabaster==0.7.12; python_version >= "3.6" alpha-vantage==2.3.1 altair==4.2.0; python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.7" anyio==3.6.2; python_full_version >= "3.6.2" and python_version >= "3.8" and python_version < "4.0" appdirs==1.4.4 -appnope==0.1.3; sys_platform == "darwin" and python_version >= "3.8" and platform_system == "Darwin" and python_full_version >= "3.7.0" and python_full_version < "4.0.0" +appnope==0.1.3; sys_platform == "darwin" and python_version >= "3.8" and platform_system == "Darwin" +arch==5.3.1; python_version >= "3.7" argon2-cffi-bindings==21.2.0; python_version >= "3.7" argon2-cffi==21.3.0; python_version >= "3.7" ascii-magic==1.6; python_version >= "3.5" astor==0.8.1; python_full_version >= "3.7.1" and python_full_version < "4.0.0" and python_version >= "3.8" -astroid==2.12.12; python_full_version >= "3.7.2" +astropy==5.1.1; python_version >= "3.8" asttokens==2.0.8; python_version >= "3.8" async-timeout==4.0.2; python_version >= "3.6" and python_full_version >= "3.7.0" -atomicwrites==1.4.1; sys_platform == "win32" and python_version >= "3.7" and python_full_version >= "3.7.0" and python_full_version < "4.0.0" -attrs==21.4.0; python_full_version >= "3.7.0" and python_version >= "3.7" and (python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.5.0") and python_full_version < "4.0.0" and (python_version >= "3.7" and python_full_version < "3.9.7" and python_full_version >= "3.7.0" or python_full_version > "3.9.7" and python_version >= "3.7" and python_full_version < "4.0.0") +attrs==21.4.0; python_version >= "3.6" and python_full_version >= "3.7.0" and (python_version >= "3.7" and python_full_version < "3.9.7" and python_full_version >= "3.7.0" or python_full_version > "3.9.7" and python_version >= "3.7") babel==2.10.3; python_version >= "3.7" backcall==0.2.0; python_version >= "3.8" backoff==2.2.1; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.7.0" backports.zoneinfo==0.2.1; python_version >= "3.7" and python_full_version < "3.9.7" and python_version < "3.9" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version < "3.9.7" and python_full_version >= "3.6.0" or python_full_version > "3.9.7" and python_version >= "3.6") or python_full_version > "3.9.7" and python_version >= "3.6" and python_version < "3.9" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version < "3.9.7" and python_full_version >= "3.6.0" or python_full_version > "3.9.7" and python_version >= "3.6") -bandit==1.7.4; python_version >= "3.7" base58==2.1.1; python_version >= "3.5" and python_full_version >= "3.7.0" beartype==0.7.1; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.6.0" beautifulsoup4==4.11.1; python_full_version >= "3.6.0" and python_version >= "3.7" -black==22.12.0; python_version >= "3.7" bleach==5.0.1; python_version >= "3.7" blinker==1.5; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version < "3.9.7" and python_full_version >= "3.5.0" or python_full_version > "3.9.7" bs4==0.0.1 @@ -32,39 +29,34 @@ bt==0.2.9; (python_version >= "2.7" and python_full_version < "3.0.0") or (pytho cachetools==5.2.0; python_version >= "3.7" and python_version < "4.0" and (python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7") ccxt==2.5.80 certifi==2022.9.24; python_version >= "3.8" and python_version < "4" and python_full_version >= "3.7.1" and python_full_version < "4.0.0" and (python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7") -cffi==1.15.1; implementation_name == "pypy" and python_version >= "3.7" and python_full_version >= "3.7.0" and python_full_version < "4.0.0" -cfgv==3.3.1; python_full_version >= "3.6.1" and python_version >= "3.7" +cffi==1.15.1; implementation_name == "pypy" and python_version >= "3.7" and python_full_version >= "3.7.0" charset-normalizer==2.1.1; python_full_version >= "3.6.0" click==8.1.3; python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.7" -codespell==2.2.2; python_version >= "3.7" -colorama==0.4.6; python_full_version >= "3.7.2" and python_version >= "3.8" and sys_platform == "win32" and (python_version >= "3.6" and python_full_version < "3.0.0" and sys_platform == "win32" or sys_platform == "win32" and python_version >= "3.6" and python_full_version >= "3.7.0") and (python_version >= "3.7" and python_full_version < "3.0.0" and platform_system == "Windows" or platform_system == "Windows" and python_version >= "3.7" and python_full_version >= "3.7.0") and (python_version >= "3.7" and python_full_version < "3.0.0" and platform_system == "Windows" and (python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.7") or platform_system == "Windows" and python_version >= "3.7" and (python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.7") and python_full_version >= "3.7.0") and (python_version >= "3.8" and python_full_version < "3.0.0" and sys_platform == "win32" or sys_platform == "win32" and python_version >= "3.8" and python_full_version >= "3.7.0") and python_full_version < "4.0.0" +colorama==0.4.6; python_full_version >= "3.7.0" and python_version >= "3.8" and sys_platform == "win32" and platform_system == "Windows" and (python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.7") commonmark==0.9.1; python_full_version >= "3.6.3" and python_full_version < "4.0.0" and (python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7") convertdate==2.4.0; python_version >= "3.7" and python_version < "4" -coverage==6.5.0; python_version >= "3.7" cryptography==38.0.2; python_version >= "3.6" cssselect==1.1.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" +cvxpy==1.2.1; python_version >= "3.7" cycler==0.11.0; python_version >= "3.7" cython==0.29.32; python_version >= "3.8" and python_full_version < "3.0.0" and sys_platform == "darwin" or python_full_version >= "3.3.0" and sys_platform == "darwin" and python_version >= "3.8" dateparser==1.1.2; python_version >= "3.5" datetime==4.7; python_version >= "3.5" -debugpy==1.6.3; python_full_version >= "3.7.0" and python_full_version < "4.0.0" and python_version >= "3.7" -decorator==5.1.1; python_version >= "3.8" and (python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.5") and (python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.5") +debugpy==1.6.3; python_version >= "3.7" +decorator==5.1.1; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.8" defusedxml==0.7.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" degiro-connector==2.0.21; python_full_version >= "3.7.1" and python_full_version < "4.0.0" deprecation==2.1.0 detecta==0.0.5; python_version >= "3.6" -dill==0.3.6; python_version >= "3.7" and python_full_version >= "3.7.2" -distlib==0.3.6; python_version >= "3.7" dnspython==2.2.1; python_version >= "3.6" and python_version < "4.0" -docutils==0.17.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" -entrypoints==0.4; python_full_version >= "3.7.0" and python_full_version < "4.0.0" and python_version >= "3.7" and (python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.7") +ecos==2.0.10; python_version >= "3.7" +entrypoints==0.4; python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.7" et-xmlfile==1.1.0; python_version >= "3.6" exchange-calendars==4.2.3; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.0" executing==1.1.1; python_version >= "3.8" -fastjsonschema==2.16.2; python_full_version >= "3.7.0" and python_full_version < "4.0.0" and python_version >= "3.7" +fastjsonschema==2.16.2; python_full_version >= "3.7.0" and python_version >= "3.7" feedparser==6.0.10; python_version >= "3.6" ffn==0.3.6; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" -filelock==3.8.0; python_version >= "3.7" financedatabase==1.0.2 finnhub-python==2.4.15 finviz==1.4.4 @@ -87,30 +79,27 @@ holidays==0.14.2; python_version >= "3.7" html5lib==1.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0") httpcore==0.15.0; python_version >= "3.8" and python_version < "4.0" httpx==0.23.0; python_version >= "3.8" and python_version < "4.0" -identify==2.5.7; python_version >= "3.7" idna==3.4; python_version >= "3.8" and python_version < "4" and python_full_version >= "3.7.1" and python_full_version < "4.0.0" and (python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7") -imagesize==1.4.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" importlib-metadata==5.0.0; python_version >= "3.7" and python_full_version < "3.9.7" and python_version < "3.10" or python_full_version > "3.9.7" and python_version >= "3.7" and python_version < "3.10" inflection==0.5.1; python_version >= "3.6" -iniconfig==1.1.1; python_full_version >= "3.7.0" and python_full_version < "4.0.0" and python_version >= "3.7" interface-meta==1.3.0; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.1" and python_full_version < "4.0.0" investiny==0.5.0; python_version >= "3.8" and python_version < "4.0" investpy==1.0.8; python_version >= "3.7" ipyflex==0.2.4; python_version >= "3.6" -ipykernel==6.16.1; python_full_version >= "3.7.0" and python_full_version < "4.0.0" and python_version >= "3.7" +ipykernel==6.16.1; python_version >= "3.7" ipympl==0.8.4 ipython-genutils==0.2.0; python_version >= "3.7" ipython==8.5.0; python_version >= "3.8" ipywidgets==8.0.2; python_version >= "3.7" iso8601==0.1.16 -isort==5.10.1; python_full_version >= "3.7.2" and python_version < "4.0" +isodate==0.6.1; python_version >= "3.7" jedi==0.18.1; python_version >= "3.8" jinja2==3.1.2; python_version >= "3.7" joblib==1.2.0; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" json5==0.9.10; python_version >= "3.7" jsonschema==3.2.0 -jupyter-client==7.4.1; python_full_version >= "3.7.0" and python_full_version < "4.0.0" and python_version >= "3.7" -jupyter-core==4.11.2; python_full_version >= "3.7.0" and python_full_version < "4.0.0" and python_version >= "3.7" +jupyter-client==7.4.1; python_full_version >= "3.7.0" and python_version >= "3.7" +jupyter-core==4.11.2; python_full_version >= "3.7.0" and python_version >= "3.7" jupyter-server==1.21.0; python_version >= "3.7" jupyterlab-pygments==0.2.2; python_version >= "3.7" jupyterlab-server==2.16.1; python_version >= "3.7" @@ -118,32 +107,25 @@ jupyterlab-widgets==3.0.3; python_version >= "3.7" jupyterlab==3.5.0; python_version >= "3.7" kiwisolver==1.4.4; python_version >= "3.7" korean-lunar-calendar==0.3.1; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.0" -lazy-object-proxy==1.7.1; python_version >= "3.6" and python_full_version >= "3.7.2" linearmodels==4.27; python_version >= "3.8" loguru==0.6.0; python_version >= "3.5" and python_full_version >= "3.7.0" lxml==4.9.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7" -markdown-it-py==1.1.0; python_version >= "3.6" and python_version < "4.0" markupsafe==2.1.1; python_version >= "3.7" -matplotlib-inline==0.1.6; python_version >= "3.8" and python_full_version >= "3.7.0" and python_full_version < "4.0.0" +matplotlib-inline==0.1.6; python_version >= "3.8" matplotlib==3.5.3; python_version >= "3.7" -mccabe==0.6.1; python_full_version >= "3.7.2" -mdit-py-plugins==0.2.8; python_version >= "3.6" and python_version < "4.0" +mccabe==0.6.1; python_full_version >= "3.7.0" mistune==0.8.4; python_version >= "3.7" -mock==4.0.3; python_version >= "3.6" more-itertools==9.0.0; python_version >= "3.7" mplfinance==0.12.9b1 multidict==6.0.2; python_version >= "3.7" and python_full_version >= "3.7.0" multitasking==0.0.11 mypy-extensions==0.4.3; python_version >= "3.8" -mypy==0.930; python_version >= "3.6" -myst-parser==0.15.2; python_version >= "3.6" nbclassic==0.4.5; python_version >= "3.7" -nbclient==0.5.13; python_full_version >= "3.7.0" and python_version >= "3.7" and python_full_version < "4.0.0" +nbclient==0.5.13; python_full_version >= "3.7.0" and python_version >= "3.7" nbconvert==6.5.4; python_version >= "3.7" -nbformat==5.7.0; python_full_version >= "3.7.0" and python_full_version < "4.0.0" and python_version >= "3.7" -nbmake==1.3.0; python_full_version >= "3.7.0" and python_full_version < "4.0.0" -nest-asyncio==1.5.6; python_full_version >= "3.7.0" and python_full_version < "4.0.0" and python_version >= "3.7" -nodeenv==1.7.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.7.0" and python_version >= "3.7" +nbformat==5.7.0; python_full_version >= "3.7.0" and python_version >= "3.7" +nest-asyncio==1.5.6; python_full_version >= "3.7.0" and python_version >= "3.7" +networkx==2.8.7; python_version >= "3.8" notebook-shim==0.2.0; python_version >= "3.7" notebook==6.5.1; python_version >= "3.7" numpy==1.23.4; python_version >= "3.8" @@ -151,6 +133,7 @@ oandapyv20==0.6.3 oauthlib==3.2.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" onetimepass==1.0.1; python_full_version >= "3.7.1" and python_full_version < "4.0.0" openpyxl==3.0.10; python_version >= "3.6" +osqp==0.6.2.post5; python_version >= "3.7" packaging==22.0; python_version >= "3.7" pandas-datareader==0.10.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6" pandas-market-calendars==3.2; python_full_version >= "3.7.0" @@ -159,40 +142,34 @@ pandas==1.5.1; python_version >= "3.8" pandocfilters==1.5.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" papermill @ git+https://github.com/nteract/papermill.git@main ; python_version >= "3.7" parso==0.8.3; python_version >= "3.8" -pathspec==0.10.2; python_version >= "3.7" patsy==0.5.3; python_version >= "3.8" -pbr==5.11.0; python_version >= "3.8" pexpect==4.8.0; sys_platform != "win32" and python_version >= "3.8" pickleshare==0.7.5; python_version >= "3.8" pillow==9.2.0; python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.7" -platformdirs==2.5.2; python_version >= "3.7" and python_full_version >= "3.7.2" plotly==5.10.0; python_version >= "3.6" -pluggy==1.0.0; python_full_version >= "3.7.0" and python_full_version < "4.0.0" and python_version >= "3.7" praw==7.6.0; python_version >= "3.7" and python_version < "4.0" prawcore==2.3.0; python_version >= "3.7" and python_version < "4.0" -pre-commit==2.20.0; python_version >= "3.7" prometheus-client==0.15.0; python_version >= "3.7" prompt-toolkit==3.0.31; python_full_version >= "3.6.2" property-cached==1.6.4; python_version >= "3.8" protobuf==3.20.1; python_version >= "3.7" psaw==0.0.12; python_version >= "3" -psutil==5.9.3; python_full_version >= "3.7.0" and python_full_version < "4.0.0" and python_version >= "3.7" +psutil==5.9.3; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" ptyprocess==0.7.0; sys_platform != "win32" and python_version >= "3.8" and os_name != "nt" pure-eval==0.2.2; python_version >= "3.8" -py==1.11.0; python_full_version >= "3.7.0" and python_version >= "3.7" and python_full_version < "4.0.0" and implementation_name == "pypy" +py==1.11.0; python_version >= "3.7" and python_full_version < "3.0.0" and implementation_name == "pypy" or implementation_name == "pypy" and python_version >= "3.7" and python_full_version >= "3.5.0" pyally==1.1.2 pyarrow==9.0.0; python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.7" pycares==4.2.2; python_version >= "3.5.2" and python_full_version >= "3.7.0" pycodestyle==2.7.0; python_full_version >= "3.7.0" pycoingecko==2.3.0 pycparser==2.21; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" -pydantic==1.8.2; python_full_version >= "3.7.0" and python_full_version < "4.0.0" pydeck==0.8.0b4; python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.7" +pyerfa==2.0.0.1; python_version >= "3.8" pyex==0.5.0 pyflakes==2.3.1; python_full_version >= "3.7.0" pygments==2.13.0; python_version >= "3.6" pyhdfe==0.1.0; python_version >= "3.8" -pylint==2.15.2; python_full_version >= "3.7.2" pyluach==2.0.2; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.0" pymeeus==0.5.11; python_version >= "3.7" and python_version < "4" pympler==1.0.1; python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.6" @@ -202,10 +179,6 @@ pyotp==2.7.0; python_version >= "3.6" pyparsing==3.0.9; python_full_version >= "3.6.8" and python_version >= "3.7" pyprind==2.11.3; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" pyrsistent==0.18.1; python_version >= "3.7" -pytest-cov==3.0.0; python_version >= "3.6" -pytest-mock==3.10.0; python_version >= "3.7" -pytest-recording==0.12.1; python_version >= "3.5" -pytest==6.2.5; python_version >= "3.6" pythclient==0.1.2; python_full_version >= "3.7.0" python-binance==1.0.16 python-coinmarketcap==0.2 @@ -215,49 +188,43 @@ python-i18n==0.3.9 pytrends==4.8.0 pytz-deprecation-shim==0.1.0.post0; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version < "3.9.7" and python_full_version >= "3.6.0" or python_full_version > "3.9.7" and python_version >= "3.6" pytz==2022.5; python_full_version >= "3.7.1" and python_full_version < "4.0.0" and python_version >= "3.8" and (python_version >= "3.8" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.8") and python_version < "4.0" -pyupgrade==2.38.4; python_version >= "3.7" pywin32==304; sys_platform == "win32" and platform_python_implementation != "PyPy" and python_version >= "3.7" pywinpty==2.0.8; os_name == "nt" and python_version >= "3.7" -pyyaml==6.0; python_version >= "3.7" -pyzmq==24.0.1; python_full_version >= "3.7.0" and python_full_version < "4.0.0" and python_version >= "3.7" +pyyaml==6.0; python_version >= "3.8" +pyzmq==24.0.1; python_version >= "3.7" +qdldl==0.1.5.post2; python_version >= "3.7" quandl==3.7.0; python_version >= "3.6" rapidfuzz==1.9.1; python_version >= "2.7" +rdflib==6.2.0; python_version >= "3.7" regex==2022.3.2; python_version >= "3.6" requests-oauthlib==1.3.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" requests==2.28.1; python_version >= "3.7" and python_version < "4" rfc3986==1.5.0; python_version >= "3.8" and python_version < "4.0" rich==12.6.0; python_full_version >= "3.6.3" and python_full_version < "4.0.0" +riskfolio-lib==3.3.0; python_version >= "3.7" robin-stocks==2.1.0; python_version >= "3" ruamel.yaml.clib==0.2.7; platform_python_implementation == "CPython" and python_version < "3.11" and python_version >= "3.5" ruamel.yaml==0.17.21; python_version >= "3" -ruff==0.0.210; python_version >= "3.7" scikit-learn==1.1.2; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" scipy==1.9.3; python_version >= "3.8" screeninfo==0.6.7 +scs==3.2.0; python_version >= "3.7" seaborn==0.11.2; python_version >= "3.6" semver==2.13.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version < "3.9.7" and python_full_version >= "3.4.0" or python_full_version > "3.9.7" send2trash==1.8.0; python_version >= "3.7" sentiment-investor==2.1.0; python_version >= "3.8" and python_version < "4.0" setuptools-scm==6.4.2; python_version >= "3.8" sgmllib3k==1.0.0; python_version >= "3.6" -six==1.16.0; python_full_version >= "3.7.1" and python_version >= "3.8" and python_full_version < "4.0.0" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version < "3.9.7" and python_full_version >= "3.3.0" or python_full_version > "3.9.7") and (python_version >= "3.8" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.8") and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7") and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0") and (python_version >= "3.7" and python_full_version < "3.9.7" and python_full_version >= "3.7.0" or python_full_version > "3.9.7" and python_version >= "3.7" and python_full_version < "4.0.0") and (python_version >= "3.8" and python_full_version < "3.0.0" or python_version >= "3.8" and python_full_version >= "3.3.0") +six==1.16.0; python_full_version >= "3.7.1" and python_version >= "3.8" and python_full_version < "4.0.0" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version < "3.9.7" and python_full_version >= "3.3.0" or python_full_version > "3.9.7") and (python_version >= "3.8" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.8") and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7") and (python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0") and (python_version >= "3.7" and python_full_version < "3.9.7" and python_full_version >= "3.7.0" or python_full_version > "3.9.7" and python_version >= "3.7") and (python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.8") smmap==5.0.0; python_version >= "3.7" sniffio==1.3.0; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.6.2" -snowballstemmer==2.2.0; python_version >= "3.6" socketio-client-nexus==0.7.6 soupsieve==2.3.2.post1; python_version >= "3.6" and python_full_version >= "3.6.0" -sphinx==4.5.0; python_version >= "3.6" -sphinxcontrib-applehelp==1.0.2; python_version >= "3.6" -sphinxcontrib-devhelp==1.0.2; python_version >= "3.6" -sphinxcontrib-htmlhelp==2.0.0; python_version >= "3.6" -sphinxcontrib-jsmath==1.0.1; python_version >= "3.6" -sphinxcontrib-qthelp==1.0.3; python_version >= "3.6" -sphinxcontrib-serializinghtml==1.1.5; python_version >= "3.6" +sparqlwrapper==2.0.0; python_version >= "3.7" squarify==0.4.3 sseclient==0.0.27 stack-data==0.5.1; python_version >= "3.8" statsmodels==0.13.2; python_version >= "3.7" -stevedore==4.1.0; python_version >= "3.8" stocksera==0.1.21; python_version >= "3.6" streamlit==1.13.0; (python_version >= "3.7" and python_full_version < "3.9.7") or (python_full_version > "3.9.7") tabulate==0.9.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7" @@ -267,24 +234,15 @@ terminado==0.16.0; python_version >= "3.7" thepassiveinvestor==1.0.11 threadpoolctl==3.1.0; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8" tinycss2==1.2.1; python_version >= "3.7" -tokenize-rt==4.2.1; python_full_version >= "3.6.1" and python_version >= "3.7" tokenterminal==1.0.1 -toml==0.10.2; python_version >= "3.7" and python_full_version < "3.9.7" and python_full_version >= "3.7.0" or python_full_version > "3.9.7" and python_version >= "3.7" and python_full_version < "4.0.0" -tomli==2.0.1; python_version < "3.11" and python_full_version >= "3.7.2" and python_version >= "3.8" and python_full_version <= "3.11.0a6" -tomlkit==0.11.5; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.7.2" +toml==0.10.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version < "3.9.7" and python_full_version >= "3.3.0" or python_full_version > "3.9.7" +tomli==2.0.1; python_version >= "3.8" toolz==0.12.0; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.0" and (python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.7") -tornado==6.2; python_version >= "3.7" and python_full_version < "3.9.7" and python_full_version >= "3.7.0" or python_full_version > "3.9.7" and python_version >= "3.7" and python_full_version < "4.0.0" +tornado==6.2; python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.7" tqdm==4.64.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" tradingview-ta==3.3.0; python_version >= "3.6" -traitlets==5.5.0; python_version >= "3.8" and python_full_version >= "3.7.0" and python_full_version < "4.0.0" -types-python-dateutil==2.8.19.2 -types-pytz==2021.3.8 -types-pyyaml==6.0.12 -types-requests==2.28.11.2 -types-setuptools==57.4.18 -types-six==1.16.21 -types-urllib3==1.26.25.1 -typing-extensions==4.4.0; python_full_version >= "3.7.2" and python_full_version < "4.0.0" and python_version < "3.9" and python_version >= "3.7" and (python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.7") and (python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7") +traitlets==5.5.0; python_full_version >= "3.7.0" and python_version >= "3.8" +typing-extensions==4.4.0; python_full_version >= "3.7.0" and python_full_version < "4.0.0" and python_version < "3.9" and python_version >= "3.7" and (python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.7") and (python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7") tzdata==2022.5; python_version >= "3.7" and python_full_version < "3.0.0" and platform_system == "Windows" or python_version >= "3.7" and python_full_version < "3.9.7" and platform_system == "Windows" and python_full_version >= "3.6.0" or python_full_version > "3.9.7" and python_version >= "3.6" and platform_system == "Windows" tzlocal==4.2; python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.6" ujson==5.5.0; python_version >= "3.7" @@ -295,8 +253,6 @@ user-agent==0.1.10 vadersentiment==3.3.2 validators==0.20.0; python_version >= "3.7" and python_full_version < "3.9.7" or python_full_version > "3.9.7" and python_version >= "3.4" valinvest==0.0.2; python_version >= "3.6" -vcrpy==4.2.1; python_version >= "3.7" -virtualenv==20.16.5; python_version >= "3.7" voila==0.4.0; python_version >= "3.7" watchdog==2.1.9; python_version >= "3.6" wcwidth==0.2.5; python_full_version >= "3.6.2" and python_version >= "3.8" @@ -305,7 +261,8 @@ websocket-client==1.4.1; python_version >= "3.8" and python_version < "4.0" websockets==10.3; python_version >= "3.7" widgetsnbextension==4.0.3; python_version >= "3.7" win32-setctime==1.1.0; python_version >= "3.5" and python_full_version >= "3.7.0" and sys_platform == "win32" -wrapt==1.14.1; python_full_version >= "3.7.2" and python_full_version < "4.0.0" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7") and python_version >= "3.8" and python_version < "3.11" +wrapt==1.14.1; python_full_version >= "3.7.1" and python_full_version < "4.0.0" and python_version >= "3.8" +xlsxwriter==3.0.3; python_version >= "3.7" yarl==1.8.1; python_version >= "3.7" and python_full_version >= "3.7.0" yfinance==0.2.3 zipp==3.10.0; python_version >= "3.7" and python_full_version < "3.9.7" and python_version < "3.10" or python_full_version > "3.9.7" and python_version >= "3.7" and python_version < "3.10" diff --git a/tests/openbb_terminal/alternative/realestate/test_landRegistry_model.py b/tests/openbb_terminal/alternative/realestate/test_landRegistry_model.py new file mode 100644 index 00000000000..386e2836293 --- /dev/null +++ b/tests/openbb_terminal/alternative/realestate/test_landRegistry_model.py @@ -0,0 +1,31 @@ +import ssl + +# IMPORTATION INTERNAL +from openbb_terminal.alternative.realestate import landRegistry_model + +ssl._create_default_https_context = ssl._create_unverified_context + + +def test_get_estate_sales(): + assert len(landRegistry_model.get_estate_sales("DA119NF")) > 0 + + +def test_invalid_postcode_get_estate_sales(): + assert len(landRegistry_model.get_estate_sales("DA11")) == 0 + + +def test_get_towns_sold_prices(): + assert ( + len( + landRegistry_model.get_towns_sold_prices( + "DARTFORD", "2019-01-01", "2022-01-01" + ) + ) + > 0 + ) + + +def test_get_region_stats(): + assert ( + len(landRegistry_model.get_region_stats("KENT", "2019-01-01", "2022-01-01")) > 0 + ) \ No newline at end of file