Récemment, j'étudie à nouveau Python. Donc, dans le cadre de mon étude, j'ai essayé de créer une classe qui rendrait l'API publique plus facile à utiliser.
Le code peut être trouvé ici dans le référentiel (https://github.com/ironball1113/sakenowa_wrapper).
Il s'agit d'un projet de publication des données collectées à partir de l'application Sakeno, qui a pour concept "d'enregistrer le saké que vous avez bu et de trouver votre saké préféré". En d'autres termes, ce sont des données sur le saké japonais. Les détails seront cités sur la page publique. https://muro.sakenowa.com/sakenowa-data/
Il s'agit d'un projet visant à publier des données quantifiées et des informations sur les marques populaires de saveurs appartenant à l'application de saké Sakenowa. Tout le monde peut l'utiliser gratuitement dans le cadre des conditions d'utilisation, et peut afficher des données sur le site EC, créer des applications et des services et analyser les données.
Chez Sakenowa, nous analysons les commentaires d'impression des utilisateurs et quantifions la saveur. En plus de ces données, nous publierons les données suivantes, y compris les informations de classement.
- Les saveurs de chaque marque sont quantifiées à partir des six perspectives: magnifique, moelleux, profond, doux, léger et sec. --Tags des détails de saveur pour chaque marque (étiquette de saveur) --Classement des actions populaires à Sakenowa --Autres informations de base de la marque
--Liste des zones (GET / zones) --Liste des marques (GET / marques) --Liste des brasseries (GET / brasseries) --Ranking (GET / classements) --Graphique des saveurs (GET / tableaux des saveurs) --Liste des balises de saveur (GET / flavour-tags)
- Tags de saveur pour chaque marque (GET / brand-flavour-tags)
sakenowa_wrapper J'ai créé une classe parce que je pensais que ce serait un peu plus facile à appeler si je pouvais l'utiliser dans le format de trame de données pandas avec uniquement les informations de point de terminaison. C'est facile à faire et la réponse de l'API est enfin renvoyée dans une trame de données.
sakenowa_wrapper.py
import ast
import urllib.request
import pandas as pd
from pandas.core.frame import DataFrame
class SakenowaAPI(object):
urls = {
"areas": "https://muro.sakenowa.com/sakenowa-data/api/areas",
"brands": "https://muro.sakenowa.com/sakenowa-data/api/brands",
"breweries": "https://muro.sakenowa.com/sakenowa-data/api/breweries",
"rankings": "https://muro.sakenowa.com/sakenowa-data/api/rankings",
"flavor-charts": "https://muro.sakenowa.com/sakenowa-data/api/flavor-charts",
"flavor-tags": "https://muro.sakenowa.com/sakenowa-data/api/flavor-tags",
"brand-flavor-tags": "https://muro.sakenowa.com/sakenowa-data/api/brand-flavor-tags",
}
def __init__(self, endpoint: str, ranking_type: str = None) -> None:
self.endpoint = endpoint
check_endpoint = self.endpoint in list(self.urls.keys())
if check_endpoint:
self.url = self.urls[self.endpoint]
self.ranking_type = ranking_type
print(f"\nThe current endpoint is {self.endpoint}")
if ranking_type is not None:
print(f"Rankings type is {ranking_type}")
print("=" * 30)
else:
raise ValueError("L'argument est incorrect. Veuillez préciser à nouveau.")
def _get_body(self, url: str) -> str:
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as res:
body = res.read()
return body.decode()
def _set_key(self) -> str:
if self.endpoint in ["areas", "brands", "breweries"]:
return self.endpoint
if self.endpoint == "flavor-charts":
return "flavorCharts"
if self.endpoint == "flavor-tags":
return "tags"
if self.endpoint == "brand-flavor-tags":
return "flavorTags"
if self.endpoint == "rankings" and self.ranking_type is not None:
return self.ranking_type
else:
return "Failure"
def set_df(self) -> DataFrame:
body = self._get_body(self.url)
dic = ast.literal_eval(body)
key = self._set_key()
return pd.DataFrame(dic[key])
Voici le code d'essai. En gros, procédez comme suit:
Les points de terminaison qui peuvent être spécifiés avec l'API Sakenowa sont les suivants. Étant donné que les classements ont un classement complet et un classement régional des marques populaires, un argument supplémentaire est nécessaire pour spécifier laquelle appeler. ex) SakenowaAPI("rankings", "overall") or SakenowaAPI("rankings", "areas")
test_sakenowa.py
from sakenowa_wrapper import SakenowaAPI
#Quand il y a un argument tel que les zones
sakenowa_areas = SakenowaAPI("areas")
print(sakenowa_areas.set_df().head())
#les classements concernent les classements généraux
sakenowa_rank_overall = SakenowaAPI("rankings", "overall")
print(sakenowa_rank_overall.set_df().head())
#Si l'argument est incorrect
# sakenowa_failue = SakenowaAPI("failue")
# print(sakenowa_failue.set_df().head())
# --------------------Résultat de sortie--------------------
# The current endpoint is areas
# ==============================
# id name
#0 1 Hokkaido
#1 2 Préfecture d'Aomori
#2 3 Préfecture d'Iwate
#3 4 Préfecture de Miyagi
#4 5 Préfecture d'Akita
# The current endpoint is rankings
# Rankings type is overall
# ==============================
# rank score brandId
# 0 1 4.412219 109
# 1 2 4.100738 792
# 2 3 4.072851 660
# 3 4 4.072180 1033
# 4 5 4.065659 19
# ValueError:L'argument est incorrect. Veuillez préciser à nouveau.
En outre, le code d'essai pour dessiner le tableau des saveurs avec matplotlib est le suivant. J'ai fait référence à cet article pour la partie de la création de la carte radar. Dessinez un graphique radar avec Matplotlib (16 lignes)
test_radar_chart.py
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sakenowa_wrapper import SakenowaAPI
sakenowa_flavor_charts = SakenowaAPI("flavor-charts")
dic = sakenowa_flavor_charts.make_dic()
df_copy = sakenowa_flavor_charts.set_df(dic).copy()
col_rename = {
"f1": "Fruity",
"f2": "Mellow",
"f3": "Heavy",
"f4": "Mild",
"f5": "Dry",
"f6": "Light",
}
brand_id = 2
renamed_cols = list(df_copy.rename(columns=col_rename).columns)[1:]
flavor_values = df_copy.query("brandId == @brand_id").values.tolist()[0][1:]
def plot_polar(labels, values, imgname):
angles = np.linspace(0, 2 * np.pi, len(labels) + 1, endpoint=True)
values = np.concatenate((values, [values[0]]))
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
ax.plot(angles, values, "o-")
ax.fill(angles, values, alpha=0.25)
ax.set_thetagrids(angles[:-1] * 180 / np.pi, labels)
fig.savefig(imgname)
plt.close(fig)
plot_polar(renamed_cols, flavor_values, "flavor.png ")
Projet de données Sakenowa [Vérification de type statique qui commence vaguement avec Python](https://qiita.com/ocknamo/items/6341d0a7757c668782c8#%E3%81%8A%E3%81%BE%E3%81%91stub%E3%82%92% E8% 87% AA% E5% 8B% 95% E7% 94% 9F% E6% 88% 90% E3% 81% 99% E3% 82% 8B) Dessinez un graphique radar avec Matplotlib (16 lignes)
Recommended Posts