Last active
October 9, 2022 18:00
-
-
Save marskar/aeba765ccbdd08d7f4651212dd846902 to your computer and use it in GitHub Desktop.
A Python class to facilitate use of the Pokemon API
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from typing import Dict, Iterable, List, KeysView, ItemsView, ValuesView | |
import matplotlib.pyplot as plt | |
import pandas as pd | |
import requests | |
class Pokemon: | |
def __init__(self, name: str = None, number: int = None) -> None: | |
if name and number: | |
self.name = name | |
self.number = number | |
self.url = "https://pokeapi.co/api/v2/pokemon/" + name | |
elif name: | |
self.name = name | |
self.url = "https://pokeapi.co/api/v2/pokemon/" + name | |
self.number = requests.get(self.url).json()["id"] | |
elif number: | |
self.number = number | |
self.url = "https://pokeapi.co/api/v2/pokemon/" + str(number) | |
self.name = requests.get(self.url).json()["name"] | |
self.url = "https://pokeapi.co/api/v2/pokemon/" + self.name | |
elif name is None and number is None: | |
raise TypeError("You must provide either a name or a number!") | |
elif name == "": | |
raise ValueError("Name cannot be an empty string.") | |
elif number == 0: | |
raise ValueError("Number cannot be zero.") | |
@property | |
def keys(self) -> KeysView: | |
return requests.get(self.url).json().keys() | |
@property | |
def values(self) -> ValuesView: | |
return requests.get(self.url).json().values() | |
@property | |
def items(self) -> ItemsView: | |
return requests.get(self.url).json().items() | |
@property | |
def abilities(self) -> List: | |
return requests.get(self.url).json()["abilities"] | |
@property | |
def ability_names(self) -> List: | |
return [ | |
d["ability"]["name"] for d in requests.get(self.url).json()["abilities"] | |
] | |
@property | |
def base_experience(self) -> int: | |
return requests.get(self.url).json()["base_experience"] | |
@property | |
def forms(self) -> List: | |
return requests.get(self.url).json()["forms"] | |
@property | |
def game_indices(self) -> List: | |
return requests.get(self.url).json()["game_indices"] | |
@property | |
def held_items(self) -> List: | |
return requests.get(self.url).json()["held_items"] | |
@property | |
def height(self) -> int: | |
return requests.get(self.url).json()["height"] | |
@property | |
def id(self) -> int: | |
return requests.get(self.url).json()["id"] | |
@property | |
def is_default(self) -> bool: | |
return requests.get(self.url).json()["is_default"] | |
@property | |
def location_area_encounters(self) -> str: | |
return requests.get(self.url).json()["location_area_encounters"] | |
@property | |
def moves(self) -> List: | |
return requests.get(self.url).json()["moves"] | |
# Move related methods | |
def get_move_by_number(self, number: str) -> Dict: | |
return requests.get( | |
self.url | |
.replace("pokemon", "move") | |
.replace(self.name, str(number)) | |
).json() | |
def get_move_names(self, numbers: Iterable) -> List: | |
return [ | |
move["name"] for move | |
in [self.get_move_by_number(n) for n in numbers] | |
] | |
def get_move_by_name(self, name: str) -> Dict: | |
return { | |
d["move"]["name"]: d["move"] | |
for d in requests.get(self.url).json()["moves"] | |
}[name] | |
def plot_move_powers( | |
self, | |
numbers: Iterable, | |
ascending: bool = True | |
) -> None: | |
pd.DataFrame({ | |
move["name"]: move["power"] for move | |
in [self.get_move_by_number(n) for n in numbers] | |
}, | |
index=[self.name] | |
).melt( | |
var_name="move", | |
value_name="power" | |
).sort_values( | |
by="power", | |
ascending=ascending | |
).set_index("move").plot.barh(legend=False) | |
plt.suptitle(f"Power values for {self.name}") | |
plt.title(f"Obtained from {self.url}") | |
plt.show() | |
@property | |
def order(self) -> int: | |
return requests.get(self.url).json()["order"] | |
@property | |
def species(self) -> Dict: | |
return requests.get(self.url).json()["species"] | |
@property | |
def sprites(self) -> Dict: | |
return requests.get(self.url).json()["sprites"] | |
@property | |
def sprite_options(self) -> KeysView: | |
return requests.get(self.url).json()["sprites"].keys() | |
@property | |
def stats(self) -> List: | |
return requests.get(self.url).json()["stats"] | |
@property | |
def types(self) -> List: | |
return requests.get(self.url).json()["types"] | |
@property | |
def weight(self) -> int: | |
return requests.get(self.url).json()["weight"] | |
def get_ability(self, name: str) -> Dict: | |
return { | |
d["ability"]["name"]: d["ability"] | |
for d in requests.get(self.url).json()["abilities"] | |
}[name] | |
def show_sprite(self, option: str = "front_default") -> None: | |
plt.imshow(plt.imread(requests.get(self.url).json()["sprites"][option])) | |
if __name__ == '__main__': | |
p = Pokemon(number=1) | |
p.show_sprite() | |
p.get_move_by_number(693) | |
p = Pokemon("charizard") | |
p.plot_move_powers(range(1, 9)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment