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