Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ pillow
projectq
qiskit
requests
rich
scikit-fuzzy
sklearn
statsmodels
Expand Down
84 changes: 84 additions & 0 deletions web_programming/get_top_billioners.py
Original file line number Diff line number Diff line change
@@ -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
Comment on lines +8 to +10
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
from rich import box
from rich import console as rich_console
from rich import table as rich_table
from rich import (box, console as rich_console, table as rich_table)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isort sorts your imports so you don't have to. ;-)


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}"
)
Comment on lines +15 to +19
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

requests can automatically encode the URL parameters: https://requests.readthedocs.io/en/latest/user/quickstart/#passing-parameters-in-urls. Please use this instead.



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