Add web program to fetch top 10 real time billionaires using the forbes API. (#7538)

* Add web program to fetch top 10 realtime billioners using forbes API.

* Provide return type to function.

* Use rich for tables and minor refactors.

* Fix tiny typo.

* Add the top {LIMIT} in rich table title.

* Update web_programming/get_top_billioners.py

Co-authored-by: Caeden Perelli-Harris <caedenperelliharris@gmail.com>

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Change the API path.

* Update get_top_billioners.py

Co-authored-by: Caeden Perelli-Harris <caedenperelliharris@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Christian Clauss <cclauss@me.com>
This commit is contained in:
Sagar Giri 2022-10-23 23:35:27 +09:00 committed by GitHub
parent 81ccf54c75
commit 0f06a0b5ff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 85 additions and 0 deletions

View File

@ -10,6 +10,7 @@ pillow
projectq
qiskit
requests
rich
scikit-fuzzy
sklearn
statsmodels

View File

@ -0,0 +1,84 @@
"""
CAUTION: You may get a json.decoding error. This works for some of us but fails for others.
"""
from datetime import datetime
import requests
from rich import box
from rich import console as rich_console
from rich import table as rich_table
LIMIT = 10
TODAY = datetime.now()
API_URL = (
"https://www.forbes.com/forbesapi/person/rtb/0/position/true.json"
"?fields=personName,gender,source,countryOfCitizenship,birthDate,finalWorth"
f"&limit={LIMIT}"
)
def calculate_age(unix_date: int) -> str:
"""Calculates age from given unix time format.
Returns:
Age as string
>>> calculate_age(-657244800000)
'73'
>>> calculate_age(46915200000)
'51'
"""
birthdate = datetime.fromtimestamp(unix_date / 1000).date()
return str(
TODAY.year
- birthdate.year
- ((TODAY.month, TODAY.day) < (birthdate.month, birthdate.day))
)
def get_forbes_real_time_billionaires() -> list[dict[str, str]]:
"""Get top 10 realtime billionaires using forbes API.
Returns:
List of top 10 realtime billionaires data.
"""
response_json = requests.get(API_URL).json()
return [
{
"Name": person["personName"],
"Source": person["source"],
"Country": person["countryOfCitizenship"],
"Gender": person["gender"],
"Worth ($)": f"{person['finalWorth'] / 1000:.1f} Billion",
"Age": calculate_age(person["birthDate"]),
}
for person in response_json["personList"]["personsLists"]
]
def display_billionaires(forbes_billionaires: list[dict[str, str]]) -> None:
"""Display Forbes real time billionaires in a rich table.
Args:
forbes_billionaires (list): Forbes top 10 real time billionaires
"""
table = rich_table.Table(
title=f"Forbes Top {LIMIT} Real Time Billionaires at {TODAY:%Y-%m-%d %H:%M}",
style="green",
highlight=True,
box=box.SQUARE,
)
for key in forbes_billionaires[0]:
table.add_column(key)
for billionaire in forbes_billionaires:
table.add_row(*billionaire.values())
rich_console.Console().print(table)
if __name__ == "__main__":
display_billionaires(get_forbes_real_time_billionaires())