Metadata-Version: 2.5
Name: garg-aml-smurfing
Version: 0.1.0
Summary: Graph-based detection of smurfing patterns in transaction networks.
Project-URL: Homepage, https://github.com/VerbekeLab/garg-aml
Project-URL: Documentation, https://verbekelab.github.io/garg-aml/
Project-URL: Source, https://github.com/VerbekeLab/garg-aml
Project-URL: Changelog, https://github.com/VerbekeLab/garg-aml/blob/main/CHANGELOG.md
Project-URL: Paper, https://arxiv.org/abs/2506.04292
Author-email: Bruno Deprez <bruno.deprez@kuleuven.be>
License-Expression: MIT
License-File: LICENSE
Keywords: anti-money-laundering,fraud-detection,graph,networks,smurfing
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Financial and Insurance Industry
Classifier: Intended Audience :: Science/Research
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Scientific/Engineering
Classifier: Typing :: Typed
Requires-Python: >=3.10
Requires-Dist: networkx>=3.0
Requires-Dist: numpy
Requires-Dist: pandas
Requires-Dist: scipy
Provides-Extra: dev
Requires-Dist: mypy; extra == 'dev'
Requires-Dist: pandas-stubs; extra == 'dev'
Requires-Dist: pre-commit; extra == 'dev'
Requires-Dist: pytest; extra == 'dev'
Requires-Dist: pytest-cov; extra == 'dev'
Requires-Dist: ruff<0.17,>=0.16; extra == 'dev'
Provides-Extra: docs
Requires-Dist: mkdocs-material; extra == 'docs'
Requires-Dist: mkdocstrings[python]; extra == 'docs'
Provides-Extra: parallel
Requires-Dist: joblib; extra == 'parallel'
Provides-Extra: progress
Requires-Dist: tqdm; extra == 'progress'
Provides-Extra: sklearn
Requires-Dist: scikit-learn; extra == 'sklearn'
Description-Content-Type: text/markdown

# GARG-AML

Graph-based detection of **smurfing** patterns in transaction networks.

Smurfing moves money from one account to another through intermediate mules, so
source and target never transact directly. In the second-order neighbourhood of
such an account the adjacency matrix splits into blocks whose on-diagonal parts
are empty and whose off-diagonal parts are dense. GARG-AML scores every account
by exactly that contrast — one number in [-1, 1], computed from local structure
alone, with no training and no labels.

[![PyPI](https://img.shields.io/pypi/v/garg-aml-smurfing.svg)](https://pypi.org/project/garg-aml-smurfing/)
[![Python](https://img.shields.io/pypi/pyversions/garg-aml-smurfing.svg)](https://pypi.org/project/garg-aml-smurfing/)
[![License: MIT](https://img.shields.io/badge/License-MIT-orange.svg)](LICENSE)

## Install

```bash
pip install garg-aml-smurfing
```

> Installed as **`garg-aml-smurfing`**, imported as **`garg_aml`**. The shorter name was already taken on PyPI by an unrelated project.

## Use

```python
import garg_aml as ga

graph, labels = ga.smurfing_graph(n_nodes=100, n_patterns=2, seed=1)
scores = ga.score(graph)["GARGAML"]
scores.sort_values(ascending=False, kind="stable").head(10)
```

Eight of those ten accounts are in an injected pattern, out of 13 among 109 —
with no training, no labels and no tuning.

Full documentation: <https://verbekelab.github.io/garg-aml/>

## Citation

If you use this package, please cite the paper:

```bibtex
@article{deprez2025gargaml,
  title   = {{GARG-AML} against Smurfing: A Scalable and Interpretable
             Graph-Based Framework for Anti-Money Laundering},
  author  = {Deprez, Bruno and Baesens, Bart and Verdonck, Tim and
             Verbeke, Wouter},
  journal = {arXiv preprint arXiv:2506.04292},
  year    = {2025}
}
```

## Links

- Paper: [arXiv:2506.04292](https://arxiv.org/abs/2506.04292)
- Experiments and paper reproduction: [B-Deprez/GARG-AML](https://github.com/B-Deprez/GARG-AML)
- Contributing and release process: [CONTRIBUTING.md](CONTRIBUTING.md)

## Licence

MIT — see [LICENSE](LICENSE).
