Skip to main content

Recency-Frequency based recommendation scoring

Project description

rfscorer

CI PyPI version Python Versions

rfscorer is a Python package for Recency-Frequency based recommendation scoring.

It estimates revisit probabilities — the preference score for each user-item pair, forming a matrix analogous to a rating matrix — from interaction histories, using two simple but powerful behavioral signals: recency, which captures how recently a user interacted with an item, and frequency, which captures how often the user has interacted with it.

The package is designed for product recommendation and revisit modeling, especially in settings where interpretable scoring based on interaction history is preferred over black-box recommendation models.

Note: In this package, RF stands for Recency-Frequency, not Random Forest.

Features

  • scikit-learn-style API — familiar fit() / transform() interface makes it easy to integrate into existing data science workflows
  • Minimal data requirements — works with any interaction log that has three columns: user, item, and datetime; no ratings or explicit feedback needed
  • Explainable scoring — probabilities are derived through mathematical optimization under RF monotonicity constraints, making every score fully traceable and auditable; 3D surface visualization further supports intuitive understanding
  • Probabilistic output — revisit probabilities serve as preference scores, enabling expected value calculations and probabilistic ranking of recommendations
  • Extensible — the user–item probability matrix produced by transform() can be directly used as input to collaborative filtering or other downstream recommendation models

Installation

pip install rfscorer

Usage

from rfscorer import RecencyFrequencyScorer

Prepare an interaction log with at least three columns: user ID, item ID, and timestamp. Split it into a training set and a test set.

df_train = ...  # training interaction log (columns: user, item, datetime)
df_test  = ...  # test interaction log  (columns: user, item, datetime)
user item datetime
u_001 i_032 2026-07-01
u_001 i_017 2026-07-03
u_001 i_032 2026-07-05
u_002 i_011 2026-07-02
u_002 i_058 2026-07-04

The same user-item pair may appear multiple times, representing repeat visits.

Instantiate the scorer, specifying the column names if they differ from the defaults (user, item, datetime).

scorer = RecencyFrequencyScorer()

Call fit() to estimate empirical revisit probabilities from the training log. Specify the observation period (from which recency and frequency are computed) and the evaluation period (which provides the ground-truth revisit labels).

scorer.fit(
    df_train,
    observation_period=("2026-07-01", "2026-07-07"),
    evaluation_period=("2026-07-08", "2026-07-08"),
)

The empirical surface reflects raw revisit rates and may be irregular due to sparse data.

empirical probability surface

Optionally, call optimize() to smooth the surface under RF monotonicity constraints using convex quadratic programming. kind="mono" enforces recency and frequency monotonicity.

scorer.optimize(kind="mono")

mono probability surface

kind="mcc" additionally adds convexity in recency and concavity in frequency, yielding a smoother surface.

scorer.optimize(kind="mcc")

mcc probability surface

Call transform() to score each user-item pair in the test log. It returns a DataFrame with columns user, item, recency, frequency, probability, and order (rank within each user, sorted by probability descending). Pass kind="empirical", kind="mono", or kind="mcc" to select which probabilities to use.

df_rec_mcc = scorer.transform(df_test, target_date="2026-07-07", kind="mcc")
user item recency frequency probability order
u_001 i_032 1 4 0.1167 1
u_001 i_017 2 3 0.0789 2
u_001 i_045 3 1 0.0248 3
u_002 i_011 1 2 0.0621 1
u_002 i_058 4 1 0.0182 2

Within each user, rows are sorted by probability descending; order represents the recommendation rank.

Examples

References

Citing

If you use rfscorer in academic work, please cite the following paper:

Jiro Iwanaga, Naoki Nishimura, Noriyoshi Sukegawa, and Yuichi Takano, "Estimating product-choice probabilities from recency and frequency of page views," Knowledge-Based Systems, Volume 99, 2016, Pages 157–167.

@article{Iwanaga2016,
  author  = {Jiro Iwanaga and Naoki Nishimura and Noriyoshi Sukegawa and Yuichi Takano},
  title   = {Estimating product-choice probabilities from recency and frequency of page views},
  journal = {Knowledge-Based Systems},
  volume  = {99},
  pages   = {157--167},
  year    = {2016},
  url     = {https://www.sciencedirect.com/science/article/abs/pii/S0950705116000848}
}

If you additionally use the probability matrix as input to a collaborative filtering model, please also cite:

Jiro Iwanaga, Naoki Nishimura, Noriyoshi Sukegawa, and Yuichi Takano, "Improving collaborative filtering recommendations by estimating user preferences from clickstream data," Electronic Commerce Research and Applications, Volume 37, Article 100877, 2019.

@article{Iwanaga2019,
  author  = {Jiro Iwanaga and Naoki Nishimura and Noriyoshi Sukegawa and Yuichi Takano},
  title   = {Improving collaborative filtering recommendations by estimating user preferences from clickstream data},
  journal = {Electronic Commerce Research and Applications},
  volume  = {37},
  pages   = {100877},
  year    = {2019},
  url     = {https://www.sciencedirect.com/science/article/abs/pii/S1567422319300547}
}

License

MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rfscorer-0.1.2.tar.gz (2.3 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rfscorer-0.1.2-py3-none-any.whl (16.4 kB view details)

Uploaded Python 3

File details

Details for the file rfscorer-0.1.2.tar.gz.

File metadata

  • Download URL: rfscorer-0.1.2.tar.gz
  • Upload date:
  • Size: 2.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for rfscorer-0.1.2.tar.gz
Algorithm Hash digest
SHA256 77446d45822ec786217884f19a551319b9d37b6397bf9537dce8f1d97f1bfee6
MD5 e3d14e5d0cd6bccac1645b1d3a5297e7
BLAKE2b-256 1f0cf938a52c2b02ae5c3a4677567013685769fda0596571eee34f5284dc1c73

See more details on using hashes here.

File details

Details for the file rfscorer-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: rfscorer-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 16.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for rfscorer-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 b58ea96dd8ee784900402a6c6ad354fca5413abb4dbf99c1c734bd10ce94c1f3
MD5 ab1ed9b2948b3d9a1d32eecd64abcc62
BLAKE2b-256 4be7ec97506860eab093c893f032396999131bd666134fa7d147a1aceb729d05

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page