[PYTHON] J'ai essayé d'utiliser l'API de Sakenowa Data Project

introduction

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

Qu'est-ce que Sakenowa Data Project?

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/

Que sont les données Sakenowa?

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.

Type de 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

point final

--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:

  1. Création d'une instance et spécification d'un point de terminaison
  2. Renvoyer un bloc de données

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

flavor.png

URL de référence

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

J'ai essayé d'utiliser l'API de Sakenowa Data Project
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai essayé d'utiliser l'API checkio
J'ai essayé d'utiliser l'API de données YOUTUBE V3
J'ai essayé d'utiliser l'API BigQuery Storage
J'ai essayé d'utiliser l'API Google Cloud Vision
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé de regrouper les données ECG en utilisant la méthode K-Shape
J'ai essayé le roman Naro API 2
J'ai essayé d'utiliser GrabCut d'OpenCV
J'ai essayé l'API du roman Naruro
J'ai essayé de rechercher des vidéos à l'aide de l'API de données Youtube (débutant)
J'ai essayé de refactoriser le modèle CNN de TensorFlow en utilisant TF-Slim
J'ai essayé la reconnaissance faciale du problème du rire en utilisant Keras.
[Pour les débutants] J'ai essayé d'utiliser l'API Tensorflow Object Detection
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
J'ai essayé le serveur asynchrone de Django 3.0
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé d'utiliser l'API COTOHA (il y a aussi du code sur GitHub)
J'ai regardé les méta-informations de BigQuery et essayé de les utiliser
J'ai essayé d'utiliser l'API UnityCloudBuild de Python
J'ai essayé de toucher l'API COTOHA
Le modèle de projet Python auquel je pense.
[Python] J'ai essayé d'obtenir diverses informations en utilisant l'API de données YouTube!
J'ai essayé d'automatiser la construction d'un environnement pratique à l'aide de l'API SoftLayer d'IBM Cloud
Connaissance de l'utilisation de l'API de données Aurora Severless
J'ai essayé d'utiliser des données PDF de soins médicaux en ligne basés sur la propagation d'une nouvelle infection à coronavirus
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
J'ai essayé d'estimer la similitude de l'intention de la question en utilisant Doc2Vec de gensim
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé de résumer diverses phrases à l'aide de l'API de synthèse automatique "summpy"
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé d'effectuer une analyse de cluster de clients à l'aide des données d'achat
[Kaggle] J'ai essayé l'ingénierie de quantité de caractéristiques de données de séries chronologiques multidimensionnelles à l'aide de tsfresh
J'ai essayé l'histoire courante de l'utilisation du Deep Learning pour prédire la moyenne Nikkei
En utilisant COTOHA, j'ai essayé de suivre le cours émotionnel de la course aux meros.
J'ai essayé l'histoire courante de prédire la moyenne Nikkei à l'aide du Deep Learning (backtest)
J'ai essayé d'utiliser l'API Detect Labels d'AWS Rekognition
J'ai essayé la fonction de tableau croisé dynamique des pandas
J'ai recherché dans la bibliothèque l'utilisation de l'API Gracenote
J'ai essayé d'utiliser l'API à distance avec GAE / J
J'ai essayé l'analyse par grappes de la carte météo
vprof - J'ai essayé d'utiliser le profileur pour Python
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé d'utiliser PyCaret à la vitesse la plus rapide
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé d'utiliser le module Datetime de Python
J'ai essayé DBM avec Pylearn 2 en utilisant des données artificielles
J'ai essayé d'utiliser la bibliothèque de programmation fonctionnelle toolz
Vérifiez l'état des données à l'aide de pandas_profiling
Gratter les données gagnantes de Numbers à l'aide de Docker
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé d'utiliser argparse
J'ai essayé d'utiliser anytree
J'ai essayé d'utiliser aiomysql