code: def test_python_precision_at_k(
      rating_true, rating_pred, rating_nohit
  ):
      assert (
          precision_at_k(
              rating_true=rating_true,
              rating_pred=rating_true,
              col_prediction=DEFAULT_RATING_COL,
              k=10,
          )
          == 0.6
      )
      assert precision_at_k(rating_true, rating_nohit, k=10) == 0.0
      assert precision_at_k(
          rating_true, rating_pred, k=10
      ) == pytest.approx(0.26666, TOL)
  
      # Check normalization
      single_user = pd.DataFrame(
          {
              DEFAULT_USER_COL: [1, 1, 1],
              DEFAULT_ITEM_COL: [1, 2, 3],
              DEFAULT_RATING_COL: [5, 4, 3],
          }
      )
      assert (
          precision_at_k(
              rating_true=single_user,
              rating_pred=single_user,
              col_rating=DEFAULT_RATING_COL,
              col_prediction=DEFAULT_RATING_COL,
              k=3,
          )
          == 1
      )
  
      same_items = pd.DataFrame(
          {
              DEFAULT_USER_COL: [1, 1, 1, 2, 2, 2],
              DEFAULT_ITEM_COL: [1, 2, 3, 1, 2, 3],
              DEFAULT_RATING_COL: [5, 4, 3, 5, 5, 3],
          }
      )
      assert (
          precision_at_k(
              rating_true=same_items,
              rating_pred=same_items,
              col_prediction=DEFAULT_RATING_COL,
              k=3,
          )
          == 1
      )
  
      # Check that if the sample size is smaller than k, the maximum precision can not be 1
      # if we do precision@5 when there is only 3 items, we can get a maximum of 3/5.
      assert (
          precision_at_k(
              rating_true=same_items,
              rating_pred=same_items,
              col_prediction=DEFAULT_RATING_COL,
              k=5,
          )
          == 0.6
      )
  
imports: import numpy
  import pandas
  import pytest
  from unittest.mock import Mock
  from sklearn.preprocessing import minmax_scale
  from pandas.testing import assert_frame_equal
  from recommenders.utils.constants import DEFAULT_USER_COL, DEFAULT_ITEM_COL, DEFAULT_RATING_COL, DEFAULT_PREDICTION_COL
  from recommenders.evaluation.python_evaluation import _check_column_dtypes, merge_rating_true_pred, merge_ranking_true_pred, rmse, mae, rsquared, exp_var, get_top_k_items, precision_at_k, recall_at_k, ndcg_at_k, map_at_k, map, auc, logloss, user_diversity, diversity, historical_item_novelty, novelty, user_item_serendipity, user_serendipity, serendipity, catalog_coverage, distributional_coverage, ColumnMismatchError, ColumnTypeMismatchError
label_desc: Use image node_id 15 for calling a global function with example usage: test_python_precision_at_k(rating_true, rating_pred, rating_nohit) without return types