Files
OpenBB/openbb_terminal/economy/commodity_model.py
2023-07-22 09:01:40 -07:00

60 lines
1.9 KiB
Python

import logging
import re
import pandas as pd
from openbb_terminal.decorators import log_start_end
from openbb_terminal.helper_funcs import get_user_agent, request
logger = logging.getLogger(__name__)
def format_number(text: str) -> float:
numbers = re.findall(r"[-+]?(?:\d*\.\d+|\d+)", text)
if "t" in text.lower():
multiplier = 1_000_000_000_000
elif "b" in text.lower():
multiplier = 1_000_000_000
elif "m" in text.lower():
multiplier = 1_000_000
else:
multiplier = 1
return round(float(numbers[0]) * multiplier, 2)
@log_start_end(log=logger)
def get_debt() -> pd.DataFrame:
"""Retrieves national debt information for various countries. [Source: wikipedia.org]
Returns
-------
pd.DataFrame
Country, Debt [$], Debt [% of GDP], Debt per capita [$], Debt per capita [% of GDP]
"""
url = "https://en.wikipedia.org/wiki/List_of_countries_by_external_debt"
response = request(url, headers={"User-Agent": get_user_agent()})
df = pd.read_html(response.content)[0]
df = df.rename(
columns={
"Country/Region": "Country",
"External debt US dollars": "USD Debt",
"Per capitaUS dollars": "Per Capita",
"Per capita US dollars": "USD Per Capita",
"Date": "As Of",
}
)
df["USD Debt"] = df["USD Debt"].apply(lambda x: format_number(x)).astype("int64")
df["USD Per Capita"] = df["USD Per Capita"].astype("int64")
df["Rank"] = df["USD Debt"].rank(ascending=False).astype("int64")
date = df["As Of"].astype(str)
dates = []
for i in date.index:
dates.append(date[i].split("[")[0])
df["As Of"] = dates
df["As Of"] = df["As Of"].str.replace("31 September", "30 September").str.strip()
indexes = ["Rank", "As Of", "Country", "USD Per Capita", "USD Debt", "% of GDP"]
df = df[indexes]
return df