Dernière fois a extrait 30 données (1 page) à l'aide de «l'API de recherche de produits Rakuten» et les a enregistrées dans un fichier csv. C'était.
Cette fois, dans le but de collecter des données plus pratiques pour l'analyse et la connexion à la prise de décision, nous avons d'abord développé le script précédent pour augmenter le nombre de données à acquérir, puis utilisé les données produit comme étape préliminaire pour l'agrégation et l'analyse. Nous traitons même les données pour qu'elles puissent être classées par poids (5 kg, 10 kg ...).
Le déroulement est le même que la dernière fois, mais cette fois le nombre d'acquisitions et de mots NG est spécifié ici. Ceux-ci sont ajustés en fonction de l'objectif de la collecte des données et de la quantité et du contenu des informations requises.
Dans mon cas, j'ai précisé un mot qui ne correspond pas à mes attentes et est susceptible d'affecter le prix du produit. Ici, «culture biologique / biologique / réduite en pesticides / sans pesticides», «ensemble / assortiment» et «paiement de la taxe locale» sont exclus. Il n'y a pas de sens profond à fixer le nombre d'acquisitions à 300, mais lorsque j'ai recherché des produits utilisant ce mot-clé / mot NG, le nombre de résultats était d'environ 320, j'ai donc choisi un bon nombre.
À l'origine, il serait plus précis de diviser la quantité par variété de légumes, mais cette fois j'ai décidé de ne pas le faire. En effet, le nombre de données diminuera s'il est trop subdivisé.
C'est presque la même chose que la dernière fois, mais seules les parties page
et NGKeyword
et postageFlag
des paramètres d'entrée qui envoient des requêtes avec l'API sont modifiées.
Le nombre maximum de données pouvant être acquises avec une seule demande de l'API Rakuten Product Search est de 30 (la valeur du paramètre d'entrée «hits»). Si vous spécifiez le nombre de pages «2» dans «page», vous pouvez obtenir la 31e et les données suivantes. On suppose que la valeur de cette «page» est retournée par l'instruction «for».
De plus, le paramètre d'entrée postageFlag
spécifie si le prix de l'article comprend les frais de port (1 comprend les frais de port ou les frais de port gratuits).
import requests
import numpy as np
import pandas as pd
REQUEST_URL = "https://app.rakuten.co.jp/services/api/IchibaItem/Search/20170706"
APP_ID="<Entrez l'ID d'API Rakuten>"
#Paramètres d'entrée
serch_keyword = 'Faire en'
ng_keyword = 'Paiement de la taxe locale Assortiment de kits sans pesticide biologique biologique à faible teneur en pesticides'
page = 1
serch_params={
"format" : "json",
"keyword" : serch_keyword,
"NGKeyword":ng_keyword,
"applicationId" : [APP_ID],
"availability" : 0,
"hits" : 30,
"page" : page,
"sort" : "standard",
"postageFlag" : 1
}
Utilisez l'instruction for
pour obtenir des informations sur le produit pour les pages qui s'étendent sur plusieurs pages.
Extraire uniquement les éléments nécessaires des informations sur le produit et les stocker dans le dict nommé tmp_item
et les stocker dans la liste nommée ʻitem_list` est le même flux que la dernière fois.
#Obtenir des informations sur les produits dans une liste
item_list = [] #Informations produit de type dictionnaire acquises par 30 éléments tmp_10 pages d'article
max_page = 10
for page in range(1, max_page+1):
serch_params['page'] = page
#Envoyez une demande à l'API et obtenez le résultat des données produit en conséquence
response = requests.get(REQUEST_URL, serch_params)
result = response.json()
#Créez un dict qui extrait les informations nécessaires du résultat
item_key = ['itemName', 'itemPrice', 'itemCaption', 'shopName', 'shopUrl', 'itemUrl']
for i in range(0, len(result['Items'])):
tmp_item = {}
item = result['Items'][i]['Item']
for key, value in item.items():
if key in item_key:
tmp_item[key] = value
item_list.append(tmp_item.copy())
Ici, même si j'ai entré un mot-clé qui avait moins de 10 pages de produits, j'ai pu l'obtenir sans erreur particulière. Il semble que le nombre de pages puisse être défini plus grand que le nombre réel de produits (la limite supérieure de «page» est de 100 selon la référence API). Cependant, le traitement prend beaucoup de temps et, dans de rares cas, une erreur se produit dans mon environnement, je pense donc qu'il est préférable de le limiter au minimum nécessaire.
Comme la dernière fois, créez un Pandas DataFrame à partir de la liste qui stocke le dict des informations sur le produit. Je l'ai un peu modifié pour que l'index commence à 1 au lieu de 0.
#Création de trame de données
df = pd.DataFrame(item_list)
df = df.reindex(columns=['itemName', 'itemPrice', 'itemCaption', 'itemUrl', 'shopName', 'shopUrl'])
df.columns = ['Nom du produit', 'Prix du produit', 'Description du produit', 'URL du produit', 'Nom du magasin', 'URL du magasin']
df.index = df.index + 1 #Réindexer à partir de 1
Vérifiez le nombre d'acquisitions avec «df.count ()» et les 5 premières données avec «df.head ()». Cela semble correct s'il contient 300 données comme prévu.
Il est gênant d'exécuter ce script à chaque fois pour obtenir les données, donc sortez csv afin que vous puissiez l'utiliser lorsque vous souhaitez l'utiliser.
df.to_csv('20200914_rakuten_mayqueen.csv')
Maintenant que nous avons augmenté le nombre de données, traitons les données sous une forme adaptée à l'analyse. Vous pouvez procéder tel quel, mais une fois que vous avez chargé le remplissage csv, continuez.
df = pd.read_csv('20200914_rakuten_mayqueen.csv')
Je vais traiter ce DataFrame, mais tout d'abord, lorsque j'ai jeté un coup d'œil rapide au contenu des données avec une feuille de calcul, il était mélangé à des données supplémentaires autres que les légumes qui ne correspondaient pas à l'objectif de cette enquête sur les prix. Puisque nous avons besoin de données de poids cette fois, nous essayerons avec la politique de "ne laisser que les données de produit avec le poids dans le nom du produit".
Dans Pandas, utilisez str.contains ()
pour extraire (correspondre partiellement) les lignes contenant la chaîne spécifiée et les renvoyer sous forme de valeurs booléennes.
#Ne laissez que les données produit avec "kg" dans le nom du produit
kg_flg = df['Nom du produit'].str.contains('kg')
df = df[kg_flg]
kg_flg
est une série de valeurs booléennes, et les lignes qui incluent" kg "sont True, et les lignes qui ne contiennent pas" kg "sont False. La ligne True correspond aux données que vous souhaitez conserver.
En utilisant ceci et en le définissant sur df [kg_flg]
, vous pouvez extraire un DataFrame qui ne contient que des lignes True.
Quand j'ai vérifié le nombre de cas avec df.count ()
, il a diminué à 116 cas.
Si vous souhaitez sécuriser plus de données, il semble que cette zone doit être vérifiée un peu plus.
Cela ne laisse que la ligne avec kg dans le nom du produit, mais je voudrais couper ce poids dans une autre colonne. Le nom du produit doit contenir le poids sous la forme «nombre + kg», alors retirez ce numéro et créez une nouvelle colonne appelée «quantité».
Utilisons une expression régulière ici (je vais omettre l'explication détaillée, mais vous pouvez exprimer "nombre + kg" en utilisant ([0-9] +) kg
)
Spécifiez cette expression régulière dans l'argument de str.extract ()
de Pandas. Cette méthode spécifie une expression régulière comme argument et extrait la première chaîne correspondante pour créer une nouvelle colonne. C'est une méthode pratique qui convient parfaitement à ce que vous voulez faire cette fois.
#Découpez le poids du nom du produit dans une autre colonne
df['Quantité'] = df['Nom du produit'].str.extract('([0-9]+)kg')
df =df.reindex(columns=['Nom du produit', 'Quantité', 'Prix du produit', 'Description du produit', 'URL du produit', 'Nom du magasin', 'URL du magasin'])
df.to_csv('20200914_rakuten_mayqueen_2.csv')
Échangez les colonnes pour faciliter la lecture et affichez csv à la fin. J'ai pu créer un DataFrame comme celui-ci.
Dans l'image, après avoir converti la quantité en type numérique pour une analyse ultérieure, j'ai également ajouté le prix unitaire en kg, qui est le prix du produit divisé par la quantité. Cependant, les chiffres sont assez différents, je vais donc creuser un peu plus la prochaine fois.
La prochaine fois, essayez de calculer des statistiques telles que la valeur moyenne des prix des produits en agrégeant les données, et essayez la visualisation et l'approximation linéaire du prix unitaire en kg Je vais essayer de faire une analyse simple qui semble conduire à une prise de décision.
Recommended Posts