In [77]:
import matplotlib.pyplot as plt
from collections import OrderedDict, defaultdict
import random
import requests
import seaborn as sns
%matplotlib inline


def user_ing_raw(user_id=0):
    ing_dict = defaultdict(int)
    if user_id > 0:
        user_fc = UserFlavorCompound.objects.filter(user_id=user_id)
    else:
        user_fc = UserFlavorCompound.objects.all()
    for fc in user_fc:
        ingredient_list = IngredientFlavorCompound.objects.filter(flavor_id=fc.id)
        for ingredient in ingredient_list:
            ing_dict[ingredient.ingredient_id] += fc.score
    return sorted(ing_dict.items(), key=lambda t: t[1], reverse=True)

def user_fc_raw(user_id=0):
    fc_dict = defaultdict(int)
    if user_id > 0:
        user_fc = UserFlavorCompound.objects.filter(user_id=user_id)
    else:
        user_fc = UserFlavorCompound.objects.all()
    for fc in user_fc:
        fc_dict[fc.flavor_id] += fc.score
    return sorted(fc_dict.items(), key=lambda t: t[1], reverse=True)

def perfect_ingr(user_id):
    fc_list = set(UserFlavorCompound.objects.filter(user_id=user_id, score__gt=0).values_list('flavor_id', flat=True))
    unique_ingr_list = IngredientFlavorCompound.objects.distinct().values_list('ingredient_id', flat=True)
    full_hit_list = []
    
    for ingredient in unique_ingr_list:
        ing_fc_list = set(IngredientFlavorCompound.objects.filter(ingredient_id=ingredient).values_list('flavor_id', flat=True))
        match = set.intersection(fc_list, ing_fc_list)
        hit_percent = round((len(match) / len(ing_fc_list)), 3)
        if hit_percent >= .01:
            full_hit_list.append((ingredient, hit_percent))
    return sorted(full_hit_list, key=lambda x: x[1], reverse=True)


def popularity(most=True, item_type='ingredient'):
    sns.set()
    current_palette = sns.color_palette()
    
    if item_type == 'ingredient':
        all_ratings = user_ing_raw()
    elif item_type == 'flavor compound':
        all_ratings = user_fc_raw()
    else:
        return "Improper item_type. Options are: 'ingredient' or 'flavor compound'"
    if most:
        chosen_10 = OrderedDict(all_ratings[:10])
    else:
        chosen_10 = OrderedDict(all_ratings[:-11:-1])
    plt.barh(range(len(chosen_10)), chosen_10.values(), align='center', color = current_palette)
    plt.yticks(range(len(chosen_10)), list(chosen_10.keys()))
    plt.show()

In [78]:
popularity(most=True, item_type='ingredient')



In [ ]:


In [ ]:


In [ ]:


In [ ]: