import pandas as pd
import requests
import os
import json
[docs]
class Recipe_id:
def __init__(self, id, api_key):
self.id = id
self.api_key = api_key
[docs]
def dict_reader(self, input_dict):
"""
Process a dictionary into a Pandas Series.
Parameters:
- input_dict (dict): The input dictionary to process.
Returns:
- pd.Series: Processed Pandas Series.
"""
row_data = {}
for i in input_dict.keys():
info = input_dict[i]
for j in info.keys():
row_data[f"{i}_{j}"] = info[j]
return pd.Series(row_data)
[docs]
def list_reader(self, input_dict):
"""
Process a dictionary into a Pandas Series.
Parameters:
- input_dict (dict): The input dictionary to process.
Returns:
- pd.Series: Processed Pandas Series.
"""
row_data = {}
for i in input_dict.keys():
info = input_dict[i]
row_data[f"{i}"] = info
return pd.Series(row_data)
[docs]
def search_ingredient_id(self):
"""
Search for ingredient information using the Spoonacular API.
Returns:
- pd.DataFrame or None: A DataFrame containing ingredient information or None if an error occurs.
"""
url = f'https://spoonacular-recipe-food-nutrition-v1.p.rapidapi.com/recipes/{self.id}/ingredientWidget.json'
params = {'id': self.id
}
headers = {
'x-rapidapi-host': 'spoonacular-recipe-food-nutrition-v1.p.rapidapi.com',
'x-rapidapi-key': self.api_key }
try:
response = requests.get(url, params=params, headers=headers)
response.raise_for_status()
ingredient= response.json()
ingredients_df = pd.DataFrame(ingredient)
ingredients_df = pd.concat([ingredients_df, ingredients_df ['ingredients'].apply(self.list_reader)], axis=1)
ingredients_df = pd.concat([ingredients_df, ingredients_df['amount'].apply(self.dict_reader)], axis=1)
ingredients_df= ingredients_df.drop(columns=['image', 'amount', 'ingredients'])
return ingredients_df
except Exception as e:
print(f"An error occurred for ID {self.id}: {e}")
return None
[docs]
def search_taste_id(self, recipe_id_list):
"""
Fetch taste information for a list of recipe IDs using the Spoonacular API.
Parameters:
- recipe_id_list (list): A list of recipe IDs.
Returns:
- pd.DataFrame: A DataFrame containing taste information for each recipe.
"""
taste_compare = pd.DataFrame()
headers = {
'x-rapidapi-host': 'spoonacular-recipe-food-nutrition-v1.p.rapidapi.com',
'x-rapidapi-key': self.api_key }
for i in recipe_id_list:
url = f'https://spoonacular-recipe-food-nutrition-v1.p.rapidapi.com/recipes/{i}/tasteWidget.json'
params = {'id': i,
'normalize': 'False'
}
try:
response = requests.get(url, params=params, headers=headers)
response.raise_for_status()
taste_response = response.json()
df_taste = pd.DataFrame(taste_response, index=[i])
taste_compare = pd.concat([taste_compare, df_taste], ignore_index=False)
except Exception as e:
print(f"An error occurred for ID {i}: {e}")
return taste_compare
[docs]
def search_nutrient_id(self, selection = 'info'):
"""
Fetch nutrition information for a recipe using the Spoonacular API.
Parameters:
- selection (str, optional): Type of nutrition information to retrieve.
- 'info': General information about nutrients, caloric breakdown, and weight per serving.
- 'table': Detailed table of nutrient information.
Returns:
- pd.DataFrame: A DataFrame containing the requested nutrition information.
"""
url = f'https://spoonacular-recipe-food-nutrition-v1.p.rapidapi.com/recipes/{self.id}/nutritionWidget.json'
params = {'id': self.id
}
headers = {
'x-rapidapi-host': 'spoonacular-recipe-food-nutrition-v1.p.rapidapi.com',
'x-rapidapi-key': self.api_key }
try:
response = requests.get(url, params=params, headers=headers)
response.raise_for_status()
nutrition = response.json()
keys_to_extract = ['nutrients', 'caloricBreakdown', 'weightPerServing']
sub_nutr = {key: nutrition[key] for key in keys_to_extract}
if selection == 'table':
nutr = pd.DataFrame(sub_nutr['nutrients'])
elif selection == 'info':
nutr_total = pd.DataFrame(sub_nutr['caloricBreakdown'], index=['info']).T
nutr_serving = pd.DataFrame(sub_nutr['weightPerServing'], index=['info']).T
nutr = pd.concat([nutr_total, nutr_serving], ignore_index=False)
else:
raise ValueError("Invalid selection. Use 'table' or 'info'.")
except Exception as e:
print(f"An error occurred for ID {self.id }: {e}")
return None
return nutr
[docs]
def search_equipment_id(self):
"""
Fetch equipment information for a recipe using the Spoonacular API.
Returns:
- pd.DataFrame or None: A DataFrame containing equipment information or None if an error occurs.
"""
url = f'https://spoonacular-recipe-food-nutrition-v1.p.rapidapi.com/recipes/{self.id}/equipmentWidget.json'
params = {'id':self.id}
headers = {
'x-rapidapi-host': 'spoonacular-recipe-food-nutrition-v1.p.rapidapi.com',
'x-rapidapi-key': self.api_key }
try:
response = requests.get(url, params=params, headers=headers)
response.raise_for_status()
equipment = response.json()
equip_df = pd.DataFrame(equipment)
equip_df = pd.concat([equip_df, equip_df ['equipment'].apply(self.list_reader)], axis=1)
equip_df= equip_df.drop(columns=['equipment','image'])
except Exception as e:
print(f"An error occurred for ID {self.id}: {e}")
return None
return equip_df
[docs]
def search_instruction_id(self):
"""
Fetch analyzed instructions for a recipe using the Spoonacular API.
Returns:
- list or str: A list of instruction steps or an error message if no instructions are found or an error occurs.
"""
url = f'https://spoonacular-recipe-food-nutrition-v1.p.rapidapi.com/recipes/{self.id}/analyzedInstructions'
params = {'id':self.id
}
headers = {
'x-rapidapi-host': 'spoonacular-recipe-food-nutrition-v1.p.rapidapi.com',
'x-rapidapi-key': self.api_key }
try:
response = requests.get(url, params=params, headers=headers)
response.raise_for_status()
if not response.json():
return f"No instructions found for recipe with ID {self.id}"
instruction_steps = response.json()[0].get('steps', [])
return instruction_steps
except requests.exceptions.RequestException as e:
return f"An error occurred: {e}"
[docs]
def convert_instruction(self, list_in):
"""
Convert and print a list of instruction steps.
Parameters:
- list_in (list): List of instruction steps.
Returns:
- None
"""
step = list()
length = len(list_in)
for i in range(length):
step_info = list_in[i]['step']
step.append(step_info)
print(f"Here are the steps to prepare recipe {self.id}:")
for i, step in enumerate(step, start=1):
print(f"{i}. {step}")
print('')