New functionality for UK Sold house price data

This commit is contained in:
kulbinder dio
2023-01-14 21:49:05 +00:00
parent 86fd7ae426
commit 230868345c
11 changed files with 821 additions and 86 deletions

View File

@@ -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)

View File

@@ -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: <http://landregistry.data.gov.uk/def/ppi/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX lrcommon: <http://landregistry.data.gov.uk/def/common/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX ukhpi: <http://landregistry.data.gov.uk/def/ukhpi/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX sr: <http://data.ordnancesurvey.co.uk/ontology/spatialrelations/>
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: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>
prefix sr: <http://data.ordnancesurvey.co.uk/ontology/spatialrelations/>
prefix ukhpi: <http://landregistry.data.gov.uk/def/ukhpi/>
prefix lrppi: <http://landregistry.data.gov.uk/def/ppi/>
prefix skos: <http://www.w3.org/2004/02/skos/core#>
prefix lrcommon: <http://landregistry.data.gov.uk/def/common/>
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: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>
prefix sr: <http://data.ordnancesurvey.co.uk/ontology/spatialrelations/>
prefix ukhpi: <http://landregistry.data.gov.uk/def/ukhpi/>
prefix lrppi: <http://landregistry.data.gov.uk/def/ppi/>
prefix skos: <http://www.w3.org/2004/02/skos/core#>
prefix lrcommon: <http://landregistry.data.gov.uk/def/common/>
SELECT ?month ?avgPrice ?avgPriceCash ?totalSalesVolume ?avgPriceExistingProperty
?avgPriceFirstTimeBuyer
?avgPriceDetached ?hpi ?detachedhpi ?newbuildhpi
{{
values ?refRegion {{<http://landregistry.data.gov.uk/id/region/{region}>}}
?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

View File

@@ -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,
)

View File

@@ -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 <YYYY-MM-DD>", self.startdate or "")
mt.add_param("_enddate <YYYY-MM-DD>", 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 <YYYY-MM-DD>", self.startdate or "")
mt.add_param("_enddate <YYYY-MM-DD>", 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"
)

View File

@@ -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

53
poetry.lock generated vendored
View File

@@ -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 = []

1
pyproject.toml vendored
View File

@@ -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"

View File

@@ -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"

125
requirements.txt vendored
View File

@@ -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"

View File

@@ -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
)