repo_description: Best Practices on Recommendation Systems
repo_topics: ai artificial-intelligence data-science deep-learning jupyter-notebook kubernetes machine-learning operationalization python ranking rating recommendation recommendation-algorithm recommendation-engine recommendation-system recommender tutorial
code: # Copyright (c) Recommenders contributors.
  # Licensed under the MIT License.
  
  from os import environ
  from pathlib import Path
  from setuptools import setup, find_packages
  import site
  import sys
  import time
  
  # Workaround for enabling editable user pip installs
  site.ENABLE_USER_SITE = "--user" in sys.argv[1:]
  
  # Version
  here = Path(__file__).absolute().parent
  version_data = {}
  with open(here.joinpath("recommenders", "__init__.py"), "r") as f:
      exec(f.read(), version_data)
  version = version_data.get("__version__", "0.0")
  
  # Get the long description from the README file
  with open(here.joinpath("recommenders", "README.md"), encoding="utf-8") as f:
      LONG_DESCRIPTION = f.read()
  
  HASH = environ.get("HASH", None)
  if HASH is not None:
      version += ".post" + str(int(time.time()))
  
  install_requires = [
      "category-encoders>=2.6.0,<3",  # requires packaging
      "cornac>=2.3.0,<3",  # requires packaging, tqdm
      "hyperopt>=0.2.7,<1",
      "lightgbm>=4.0.0,<5",
      "locust>=2.12.2,<3",  # requires jinja2
      "memory-profiler>=0.61.0,<1",
      "nltk>=3.8.1,<4",  # requires tqdm
      "notebook>=6.5.5,<8",  # requires ipykernel, jinja2, jupyter, nbconvert, nbformat, packaging, requests
      "numba>=0.57.0,<1",
      "numpy<2.0.0",  # See https://github.com/recommenders-team/recommenders/issues/2224
      "pandas>2.0.0,<3.0.0",  # requires numpy
      "pyarrow>=10.0.1",
      "retrying>=1.3.4,<2",
      "scikit-learn>=1.2.0,<2",  # requires scipy, and introduce breaking change affects feature_extraction.text.TfidfVectorizer.min_df
      "seaborn>=0.13.0,<1",  # requires matplotlib, packaging
      "statsmodels>=0.14.4",
      "transformers>=4.27.0,<5",  # requires packaging, pyyaml, requests, tqdm
  ]
  
  # shared dependencies
  extras_require = {
      "gpu": [
          "nvidia-ml-py>=11.525.84",
          "tensorflow>=2.8.4,!=2.9.0.*,!=2.9.1,!=2.9.2,!=2.10.0.*,<2.16",  # Fixed TF due to constant security problems and breaking changes #2073
          "tf-slim>=1.1.0",  # No python_requires in its setup.py
          "torch>=2.0.1,<3",
      ],
      "spark": [
          "pyarrow>=10.0.1",
          "pyspark>=3.3.0,<4",
      ],
      "dev": [
          "black>=23.3.0",
          "pytest>=7.2.1",
          "pytest-cov>=4.1.0",
          "pytest-mock>=3.10.0",  # for access to mock fixtures in pytest
      ],
  }
  # For the brave of heart
  extras_require["all"] = list(set(sum([*extras_require.values()], [])))
  
  # The following dependencies need additional testing
  extras_require["experimental"] = [
      # xlearn requires cmake to be pre-installed
      "xlearn==0.40a1",
      # VW C++ binary needs to be installed manually for some code to work
      "vowpalwabbit>=8.9.0,<9",
      # nni needs to be upgraded
      "nni==1.5",
      "pymanopt>=0.2.5",
      "lightfm>=1.17,<2",
      "scikit-surprise>=1.1.3",  # Put back in core deps when #2224 is fixed
  ]
  
  # The following dependency can be installed as below, however PyPI does not allow direct URLs.
  # Temporary fix for pymanopt, only this commit works with TF2
  # "pymanopt@https://github.com/pymanopt/pymanopt/archive/fb36a272cdeecb21992cfd9271eb82baafeb316d.zip",
  
  setup(
      name="recommenders",
      version=version,
      description="Recommenders - Python utilities for building recommendation systems",
      long_description=LONG_DESCRIPTION,
      long_description_content_type="text/markdown",
      url="https://github.com/recommenders-team/recommenders",
      project_urls={
          "Documentation": "https://recommenders-team.github.io/recommenders/intro.html",
          "Wiki": "https://github.com/recommenders-team/recommenders/wiki",
      },
      author="Recommenders contributors",
      author_email="[REDACTED_EMAIL]",
      classifiers=[
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "Intended Audience :: Information Technology",
          "Intended Audience :: Science/Research",
          "Topic :: Scientific/Engineering :: Artificial Intelligence",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "License :: OSI Approved :: MIT License",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Operating System :: POSIX :: Linux",
      ],
      extras_require=extras_require,
      keywords="recommendations recommendation recommenders recommender system engine "
      "machine learning python spark gpu",
      install_requires=install_requires,
      package_dir={"recommenders": "recommenders"},
      python_requires=">=3.6",
      packages=find_packages(
          where=".",
          exclude=["contrib", "docs", "examples", "scenarios", "tests", "tools"],
      ),
      setup_requires=["numpy>=1.19"],
  )
  