Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
57 строки
1.6 KiB
Python
57 строки
1.6 KiB
Python
import logging
|
|
|
|
import pandas as pd
|
|
from fastapi import FastAPI
|
|
|
|
PATH_TO_SIMILAR_ITEMS = '../../recommendations/similar_items.parquet'
|
|
|
|
logger = logging.getLogger("uvicorn.error")
|
|
|
|
class SimilarItems:
|
|
|
|
def __init__(self, path, **kwargs):
|
|
|
|
"""
|
|
Загружаем данные из файла
|
|
"""
|
|
logger.info(f"Loading data")
|
|
self._similar_items = pd.read_parquet(path)
|
|
self._similar_items = self._similar_items[kwargs['columns']]
|
|
self._similar_items = self._similar_items.set_index('item_id')
|
|
logger.info(f"Loaded")
|
|
|
|
|
|
def get(self, item_id: int, k: int = 10):
|
|
"""
|
|
Возвращает список k похожих объектов
|
|
"""
|
|
|
|
try:
|
|
i2i = self._similar_items.loc[item_id].head(k)
|
|
i2i = {"item_id_2": i2i["sim_item_id"].tolist(), "score": i2i['score'].tolist()}
|
|
except KeyError:
|
|
logger.error("No recommendations found")
|
|
i2i = {"item_id_2": [], "score": []}
|
|
except:
|
|
logger.error("problem with similar recomendations")
|
|
|
|
return i2i
|
|
|
|
|
|
sim_items_store = SimilarItems(
|
|
PATH_TO_SIMILAR_ITEMS,
|
|
columns=["item_id", "sim_item_id", "score"])
|
|
|
|
logger.info("Ready!")
|
|
|
|
# создаём приложение FastAPI
|
|
app = FastAPI(title="features")
|
|
|
|
@app.get("/similar_items")
|
|
async def recommendations(item_id: int, k: int = 10):
|
|
"""
|
|
Возвращает список похожих объектов длиной k для item_id
|
|
"""
|
|
i2i = sim_items_store.get(item_id, k)
|
|
|
|
return i2i |