ビジネスパーソン・ガジェット置場 empty lot for business

営業や仕事、それに伴う生活を便利に楽にするツール、ガジェットを作ります。既にあるツールも自分用にカスタマイズ。

Pythonでレシピ検索アプリ【with streamlit】

冷蔵庫に入っている食材を使ってどんなものが作れるのかをチェックするガジェットです。残り食材をもとに検索するので個人的なフードロスも抑えられます。レシピは「世界一美味しい手抜きごはん 最速! やる気のいらない100レシピ」から抜粋していますがこちらは本当に簡単に美味しい料理が作れます!

f:id:kslabo51:20220403192359j:plain

例えばこんな状況で

今回は、冷蔵庫に卵とニンジンと、大根ある。これで作れる美味しい料理って何? あと何を買ったらいい? とふと思った時にさっと使えるものがないかなと思い作りました。

f:id:kslabo51:20220403192658p:plain

このガジェットでできることはこちら

  • 残り食材を入力するとそれを使用して作れる簡単メニューを表示してくれます。
  • 一覧から選ぶとそのメニューで必要なものを表示してくれて、残り食材との差分も表示しますので、何を買えばいいか簡単にわかります。
  • 必要な調味料も表示するので合わせてチェックできます。
  • 残り食材が何もない場合は作りたいものをそのまま入力可能です

 

注意点はこちら

表記の揺れなど(卵と玉子など)材料のデータベースにない表記は再度入力を促すようにしています。

 

評価(自己)

役立ち度  ★★★★(良し)
効率化   ★★★★(良し)
ミス防止  ★★★(平均)
楽しさ   ★★★★(良し)
操作    ★★★(平均)

 

実行環境

使用環境    streamlit 
使用言語    python
使用ライブラリ  pandas

 

コード

import pandas as pd
import streamlit as st


st.title('レシピ検索アプリ')

data = pd.read_excel('レシピ材料.xlsx')

seasonings = ['麺つゆ','牛乳','コーラ','コンソメ','チーズ','粉チーズ','ニンニク','生姜','辛子','ラー油','唐辛子','マヨ','ケチャップ','バター','醤油','みりん','酒','酢','ウスター','お好みソース','砂糖','味噌','黒胡椒','だしの素','うどんスープ','小麦粉','お好み焼きこ','パン粉','片栗粉','胡麻油','オリーブ']
df = None


def check_recipi(ingredient):
    results = pd.DataFrame()
    for i in range(len(ingredient)):
        _df = data[data[ingredient[i]]==1]
        results = pd.concat([results, _df])
    results = results.drop_duplicates('調理名')
    li_results = results['調理名'].to_list()

    d = {}
    for result in li_results:
        _df = results[results['調理名'] == result]
        _df = _df.T.reset_index(drop=False)
        _df.columns=['gredient', 'bool']
        d[result] = _df[_df['bool']==1]['gredient'].values

    df = pd.DataFrame()
    for key, values in d.items():
        _d = {}
        seasoning = []
        gredient = []
        for value in values:
            if value in seasonings:
                seasoning.append(value)
            else:
                gredient.append(value)
        _d['レシピ'] = key
        _d['材料'] = ",".join(gredient)
        _d['調味料'] = ",".join(seasoning)
        _df = pd.DataFrame([_d])
        df = pd.concat([df, _df], ignore_index=True)
    return df

def check_ingredient(recipi, ingredient):
    if df is not None:
        _need = df[df['レシピ']==recipi]['材料'].str.split(',').values[0]
        need = [i for i in _need if i not in list(ingredient)]
    else:
        _need = all_df[all_df['レシピ']==recipi]['材料'].str.split(',').values[0]
        need = [i for i in _need if i not in list(ingredient)]
        
    return need

def get_all_recipis():
    all_recipis = data['調理名'].to_list()   
    all_d = {}
    for all_recipi in all_recipis:
        _df = data[data['調理名'] == all_recipi]
        _df = _df.T.reset_index(drop=False)
        _df.columns=['gredient', 'bool']
        all_d[all_recipi] = _df[_df['bool']==1]['gredient'].values
    all_df = pd.DataFrame()
    for key, values in all_d.items():
        _d = {}
        seasoning = []
        gredient = []
        for value in values:
            if value in seasonings:
                seasoning.append(value)
            else:
                gredient.append(value)
        _d['レシピ'] = key
        _d['材料'] = ",".join(gredient)
        _d['調味料'] = ",".join(seasoning)
        _df = pd.DataFrame([_d])
        all_df = pd.concat([all_df, _df], ignore_index=True)
    return all_df

all_df= get_all_recipis()  


ingredient = ''

try:
    ingredient = st.text_input('冷蔵庫にある材料を入れてください(複数の場合は全角スペースをあけ入力)')
    print(ingredient)
    if ingredient != '':
        ingredient = ingredient.split(' ')
        df = check_recipi(ingredient)  
        st.table(df)
except KeyError:
    st.write('その材料はデータベースにないかもしれません。別の漢字やひらがなで試してください。')
        
recipi = st.text_input('作るものを決めてください')

try:
    if recipi != '':
        need = check_ingredient(recipi, ingredient)
        if df is not None:
            st.table(df[df['レシピ']==recipi])
        else:
            st.table(all_df[all_df['レシピ']==recipi])

        if len(need)>1:
            needs = 'と'.join(need)
            st.write(f'{recipi}を作るために{needs}が必要です')
        elif len(need) == 1:
            needs = need[0]
            st.write(f'{recipi}を作るために{needs}が必要です')
        else:
            st.write(f'{recipi}は今ある材料で作れます')
except:
    st.write('その料理はデータベースにないかもしれません。別の漢字やひらがな、または別の料理で試してください')