Vor kurzem lerne ich wieder Python. Im Rahmen meiner Studie habe ich versucht, eine Klasse zu erstellen, die die Verwendung der öffentlichen API vereinfacht.
Den Code finden Sie hier im Repository (https://github.com/ironball1113/sakenowa_wrapper).
Dies ist ein Projekt zur Veröffentlichung der von der App Sakeno gesammelten Daten, die das Konzept hat, "den Sake aufzuzeichnen, den Sie getrunken haben, und Ihren Lieblingssake zu finden". Mit anderen Worten, es handelt sich um Daten über japanischen Sake. Details werden auf der öffentlichen Seite zitiert. https://muro.sakenowa.com/sakenowa-data/
Dies ist ein Projekt zur Veröffentlichung quantifizierter Daten und beliebter Markeninformationen zu Aromen der Sake-App Sakenowa. Jeder kann es im Rahmen der Nutzungsbedingungen kostenlos nutzen und Daten auf der EC-Website anzeigen, Apps und Dienste erstellen und Daten analysieren.
Bei Sakenowa analysieren wir die Impressionen des Benutzers und quantifizieren den Geschmack. Zusätzlich zu diesen Daten werden wir die folgenden Daten einschließlich Ranking-Informationen veröffentlichen.
- Die Aromen jeder Marke werden aus den sechs Perspektiven von wunderschön, weich, tief, sanft, leicht und trocken quantifiziert.
- Tags mit Geschmacksdetails für jede Marke (Geschmacksmarker)
- Rangfolge der populären Aktien in Sakenowa
- Andere grundlegende Informationen der Marke
- Flächenliste (GET / Gebiete)
- Liste der Marken (GET / Marken)
- Liste der Brauereien (GET / Brauereien) --Ranking (GET / Rankings)
- Geschmackstabelle (GET / Flavour-Charts) --Flavor-Tag-Liste (GET / Flavour-Tags) --Flavour-Tags für jede Marke (GET / Brand-Flavour-Tags)
sakenowa_wrapper Ich habe eine Klasse erstellt, weil ich dachte, es wäre etwas einfacher, sie aufzurufen, wenn ich sie im Pandas-Datenrahmenformat nur mit den Endpunktinformationen verwenden könnte. Dies ist einfach und die API-Antwort wird schließlich an einen Datenrahmen zurückgegeben.
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("Das Argument ist falsch. Bitte erneut angeben.")
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])
Unten ist der Testcode. Grundsätzlich nur Folgendes tun:
Folgende Endpunkte können mit der Sakenowa-API angegeben werden. Da das Ranking ein umfassendes Ranking und ein regionales Ranking beliebter Marken aufweist, ist ein zusätzliches Argument erforderlich, um anzugeben, welche Marke aufgerufen werden soll. ex) SakenowaAPI("rankings", "overall") or SakenowaAPI("rankings", "areas")
test_sakenowa.py
from sakenowa_wrapper import SakenowaAPI
#Wenn es ein Argument wie Bereiche gibt
sakenowa_areas = SakenowaAPI("areas")
print(sakenowa_areas.set_df().head())
#Rangliste ist für Gesamtrangliste
sakenowa_rank_overall = SakenowaAPI("rankings", "overall")
print(sakenowa_rank_overall.set_df().head())
#Wenn das Argument falsch ist
# sakenowa_failue = SakenowaAPI("failue")
# print(sakenowa_failue.set_df().head())
# --------------------Ausgabeergebnis--------------------
# The current endpoint is areas
# ==============================
# id name
#0 1 Hokkaido
#1 2 Präfektur Aomori
#2 3 Präfektur Iwate
#3 4 Präfektur Miyagi
#4 5 Präfektur 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:Das Argument ist falsch. Bitte erneut angeben.
Der Testcode zum Zeichnen der Geschmackstabelle mit matplotlib lautet wie folgt. Ich habe auf diesen Artikel für den Teil der Erstellung der Radarkarte verwiesen. Zeichnen Sie eine Radarkarte mit Matplotlib (16 Zeilen)
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 ")
Sakenowa Data Project [Statische Typprüfung, die lose mit Python beginnt](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) Zeichnen Sie eine Radarkarte mit Matplotlib (16 Zeilen)
Recommended Posts