forked from TheAlgorithms/Python
- Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathget_top_billionaires.py
101 lines (81 loc) · 2.92 KB
/
get_top_billionaires.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
"""
CAUTION: You may get a json.decoding error.
This works for some of us but fails for others.
"""
fromdatetimeimportUTC, date, datetime
importrequests
fromrichimportbox
fromrichimportconsoleasrich_console
fromrichimporttableasrich_table
LIMIT=10
TODAY=datetime.now(tz=UTC)
API_URL= (
"https://www.forbes.com/forbesapi/person/rtb/0/position/true.json"
"?fields=personName,gender,source,countryOfCitizenship,birthDate,finalWorth"
f"&limit={LIMIT}"
)
defyears_old(birth_timestamp: int, today: date|None=None) ->int:
"""
Calculate the age in years based on the given birth date. Only the year, month,
and day are used in the calculation. The time of day is ignored.
Args:
birth_timestamp: The date of birth.
today: (useful for writing tests) or if None then datetime.date.today().
Returns:
int: The age in years.
Examples:
>>> today = date(2024, 1, 12)
>>> years_old(birth_timestamp=datetime(1959, 11, 20).timestamp(), today=today)
64
>>> years_old(birth_timestamp=datetime(1970, 2, 13).timestamp(), today=today)
53
>>> all(
... years_old(datetime(today.year - i, 1, 12).timestamp(), today=today) == i
... for i in range(1, 111)
... )
True
"""
today=todayorTODAY.date()
birth_date=datetime.fromtimestamp(birth_timestamp, tz=UTC).date()
return (today.year-birth_date.year) - (
(today.month, today.day) < (birth_date.month, birth_date.day)
)
defget_forbes_real_time_billionaires() ->list[dict[str, int|str]]:
"""
Get the top 10 real-time billionaires using Forbes API.
Returns:
List of top 10 realtime billionaires data.
"""
response_json=requests.get(API_URL, timeout=10).json()
return [
{
"Name": person["personName"],
"Source": person["source"],
"Country": person["countryOfCitizenship"],
"Gender": person["gender"],
"Worth ($)": f"{person['finalWorth'] /1000:.1f} Billion",
"Age": str(years_old(person["birthDate"] /1000)),
}
forpersoninresponse_json["personList"]["personsLists"]
]
defdisplay_billionaires(forbes_billionaires: list[dict[str, int|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,
)
forkeyinforbes_billionaires[0]:
table.add_column(key)
forbillionaireinforbes_billionaires:
table.add_row(*billionaire.values())
rich_console.Console().print(table)
if__name__=="__main__":
fromdoctestimporttestmod
testmod()
display_billionaires(get_forbes_real_time_billionaires())