VCD43NRT
VCD43NRT is a Python package for VIIRS/NRT data access and BRDF, albedo, and NDVI processing. The algorithm is exposed through the VCD43NRT processor class; VIIRS source-product APIs such as VNP09GA, VJ109GA, and VJ209GA retain their NASA product names.
The data-access layer supports Suomi NPP plus equivalent JPSS VIIRS products for JPSS-1 and JPSS-2 through mission selection and mission-priority fallback.
The package uses Python for VIIRS data access, raster preparation, and output writing, and a Rust BRDF solver exposed through PyO3 for array processing.
Contributors
Gregory H. Halverson (they/them)
gregory.h.halverson@jpl.nasa.gov
NASA Jet Propulsion Laboratory
Margaret C. Johnson (she/her)
maggie.johnson@jpl.nasa.gov
NASA Jet Propulsion Laboratory
Purpose
The package provides Python-side support for:
VCD43NRT: near-real-time VIIRS/NRT processing and BRDF correction workflow- VIIRS source-product APIs for
VNP09GA,VJ109GA, andVJ209GA
It includes the supporting utilities needed to:
- discover and download VIIRS granules through Earthaccess/CMR
- locate MODLAND tiles and generate grids
- apply solar geometry and BRDF corrections
- manage date ranges and timing helpers
- run the compiled Rust BRDF solver through a Python extension
Package layout
The active package is organized as a Python package with a Rust extension:
VCD43NRT/— Python package modulesVCD43NRT/VCD43NRT.py— canonical algorithm implementation and APIrust/— Rust BRDF solver and PyO3 extension
Prerequisites
This package needs:
- Python 3.11+
- a compatible published wheel for the current Python version and platform (no Julia or Rust toolchain required)
- the wheel build targets Linux x86_64, macOS x86_64/arm64, and Windows x86_64, using the CPython 3.11 stable ABI
- an EarthData account for downloading data products
Authentication
Earthdata authentication checks EARTHDATA_USERNAME and EARTHDATA_PASSWORD
environment variables first, then credentials in ~/.netrc, and finally falls
back to interactive login. To use .netrc, add:
machine urs.earthdata.nasa.gov
login <USERNAME>
password <PASSWORD>
Installation
The most recent release of the Python/Rust hybrid pip package on PyPi can be installed with pip:
pip install VCD43NRT
Development
This Python/Rust hybrid package was developed in a mamba environment VCD43NRT that can be reproduced using environment make target:
make environment
Activate the develop environment using mamba:
mamba activate VCD43NRT
Install this package in development mode using the install make target:
make install
Tests
Unit Tests
Run the unit tests for this package with the tests make target:
make tests
Smoke Test
Run the smoke test to confirm the Python-Rust binding in this package using the smoke-test make target:
make smoke-test
For a longer synthetic-data test of the Rust binding and progress bar, run this in a terminal after installing the package:
python examples/test_brdf_progress.py
Use --pixels 1000000 to increase the workload if the default finishes too
quickly to observe the bar.
Usage
from VCD43NRT import VCD43NRT, VNP09GA
The package can be imported as a regular Python module or run through the
VCD43NRT command-line entry point. The examples below show the Python API and
a single-granule helper script.
The Rust BRDF solver displays progress on stdout when stdout is an interactive
terminal. Indicatif hides the bar when stdout is redirected or captured; the
low-level nrt_brdf_all function also accepts progress=False to disable it.
Quick Start
Basic Initialization
Initialize the VCD43NRT processor with default settings (Suomi NPP):
from VCD43NRT import VCD43NRT
from datetime import date
# Create processor instance
processor = VCD43NRT(working_directory="~/data/VCD43NRT")
# Process a single granule
granule = processor.VCD43NRT(
date_UTC=date(2023, 6, 15),
tile="h11v04"
)
# Access the products
ndvi = granule.NDVI
albedo = granule.albedo
Command-Line Interface
Process single or multiple granules from the command line:
# Single date, single tile
python -m VCD43NRT --date 2023-06-15 --tile h11v04
# Date range with multiple tiles (requires scripting)
python -m VCD43NRT --start 2023-06-01 --end 2023-06-30 --tile h11v04
# Enable diagnostic layers (standard error, quality metrics, intermediate data)
python -m VCD43NRT --date 2023-06-15 --tile h11v04 --diagnostics
Processing Workflows
Single-Granule Processing
Use the helper script to generate one VCD43NRT granule for a specific tile and date:
python examples/generate_single_VCD43NRT_granule.py \
--tile h09v05 \
--date 2026-10-10 \
--working-directory ./scratch/vcd43nrt
Optional flags:
--diagnostics— Write diagnostic layers (standard errors, R², observation count)--mission JPSS1or--mission JPSS2— Force a specific JPSS mission--fallback-mode --mission-priority SNPP,JPSS1,JPSS2— Automatically try missions in order
For JPSS-1 specific processing:
python examples/generate_single_VCD43NRT_granule_JPSS1.py \
--tile h09v05 \
--date 2026-10-10 \
--working-directory ./scratch/vcd43nrt
Batch Processing Multiple Dates
Process a time series of observations:
from datetime import date, timedelta
from VCD43NRT import VCD43NRT
processor = VCD43NRT(working_directory="~/data/VCD43NRT")
start_date = date(2023, 6, 1)
end_date = date(2023, 6, 30)
tile = "h11v04"
# Process all dates in range
current_date = start_date
while current_date <= end_date:
try:
granule = processor.VCD43NRT(date_UTC=current_date, tile=tile)
print(f"✓ Processed {current_date}")
except Exception as e:
print(f"✗ Failed {current_date}: {e}")
current_date += timedelta(days=1)
Multi-Tile Mosaicking
Create regional mosaics from multiple tiles:
from rasters import RasterGeometry
from VCD43NRT import VCD43NRT
processor = VCD43NRT(working_directory="~/data/VCD43NRT")
# Define target region (example: California)
# Must include spatial reference system
target_geometry = RasterGeometry(...)
# Generate regional albedo mosaic
albedo_mosaic = processor.albedo(
date_UTC="2023-06-15",
geometry=target_geometry,
filename="california_albedo_2023-06-15.tif",
save_preview=True
)
# Generate regional NDVI mosaic
ndvi_mosaic = processor.NDVI(
date_UTC="2023-06-15",
geometry=target_geometry,
filename="california_ndvi_2023-06-15.tif"
)
Mission Selection and Fallback
Default Behavior (Suomi NPP)
from VCD43NRT import VCD43NRT
processor = VCD43NRT(working_directory="~/data/VCD43NRT")
Explicit Mission Selection (JPSS-1)
processor = VCD43NRT(
working_directory="~/data/VCD43NRT",
mission="JPSS1",
)
Automatic Mission Fallback
Enable automatic fallback to try missions in priority order:
processor = VCD43NRT(
working_directory="~/data/VCD43NRT",
fallback_mode=True,
mission_priority=["SNPP", "JPSS1", "JPSS2"],
)
This approach is useful for near-real-time processing when data availability varies by mission.
Environment Variable Configuration
Override CMR concept IDs for JPSS missions:
export VCD43NRT_VJ109GA_CONCEPT_ID="<CMR_CONCEPT_ID>"
export VCD43NRT_VJ209GA_CONCEPT_ID="<CMR_CONCEPT_ID>"
Advanced Usage
Accessing BRDF Parameters
Work directly with BRDF parameters before albedo aggregation:
from datetime import date
from VCD43NRT import VCD43NRT
processor = VCD43NRT(working_directory="~/data/VCD43NRT")
# Retrieve raw BRDF parameters
brdf_params = processor.BRDF_parameters(
date_UTC=date(2023, 6, 15),
tile="h11v04",
band="M1" # VIIRS M-band
)
# Access directional and hemispherical albedos
wsa = brdf_params.WSA # White-sky albedo (hemispherical)
bsa = brdf_params.BSA # Black-sky albedo (directional)
nbar = brdf_params.NBAR # Nadir BRDF-adjusted reflectance
# Quality metrics
r_squared = brdf_params.BRDF_R2 # Model fit quality
std_error = brdf_params.BRDF_SE # RMS model residual
obs_count = brdf_params.count # Number of observations used
Diagnostic Output
Enable diagnostic layers to access uncertainty estimates and intermediate results:
granule = processor.VCD43NRT(
date_UTC=date(2023, 6, 15),
tile="h11v04",
diagnostics=True
)
# Uncertainty quantification
ndvi_se = granule.variable("NBARSE_I1") # NBAR standard error
albedo_se = granule.variable("WSASE_M1") # WSA standard error
brdf_se = granule.variable("BRDFSE_M1") # BRDF model error
# Intermediate layers
aot = granule.variable("AOT") # Aerosol optical thickness
sza = granule.variable("SZA") # Solar zenith angle
obs_count = granule.variable("count_M1") # Observations per pixel
# Individual spectral bands
band1_nbar = granule.NBAR(band=1) # I-band 1 (red)
band2_nbar = granule.NBAR(band=2) # I-band 2 (NIR)
Prefetching Surface Reflectance Data
Pre-download VNP09GA surface reflectance data before BRDF processing:
from datetime import date
from VCD43NRT import VCD43NRT
processor = VCD43NRT(working_directory="~/data/VCD43NRT")
# Pre-download data for a date range
processor.prefetch_VNP09GA(
start_date=date(2023, 6, 1),
end_date=date(2023, 6, 30),
geometry=None # Download all available
)
# Now process without download delays
granule = processor.VCD43NRT(
date_UTC=date(2023, 6, 15),
tile="h11v04"
)
Working with Granules Directly
Access individual granules for custom processing:
from datetime import date
from VCD43NRT import VCD43NRT
processor = VCD43NRT(working_directory="~/data/VCD43NRT")
# Get granule reference
granule = processor.granule(
date_UTC=date(2023, 6, 15),
tile="h11v04"
)
# Access all available variables
available_variables = granule.variables
# Load specific variables
ndvi = granule.get_NDVI()
albedo = granule.get_albedo()
nbar_i1 = granule.NBAR(band=1)
wsa_m1 = granule.WSA(band=1)
bsa_m1 = granule.BSA(band=1)
# Export a specific layer
albedo.to_geotiff("albedo_output.tif")
Data Directory Structure
The default directory structure created by VCD43NRT:
~/data/VCD43NRT/
├── VNP09GA_products/ # Surface reflectance data
├── VCD43NRT_products/ # Output BRDF/albedo granules
│ └── VCD43NRT_A<date>_<tile>/
│ ├── NDVI.tif
│ ├── albedo.tif
│ ├── NBAR_I1.tif
│ ├── NBAR_I2.tif
│ ├── WSA_M1.tif
│ ├── BSA_M1.tif
│ └── ...
└── VCD43NRT_staging/ # Temporary intermediate data
Error Handling
Handle common error scenarios:
from datetime import date
from VCD43NRT import VCD43NRT, BRDFRetrievalFailed, AuxiliaryDownloadFailed
processor = VCD43NRT(working_directory="~/data/VCD43NRT")
try:
granule = processor.VCD43NRT(
date_UTC=date(2023, 6, 15),
tile="h11v04"
)
except BRDFRetrievalFailed as e:
print(f"Insufficient observations for BRDF retrieval: {e}")
except AuxiliaryDownloadFailed as e:
print(f"Could not retrieve auxiliary data (e.g., aerosol): {e}")
except Exception as e:
print(f"Unexpected error: {e}")
Notes
The former VNP43NRT processor class, method, and related directory parameters
remain as deprecated compatibility aliases; new code should use VCD43NRT and
the VCD43NRT directory parameters. Existing output directory naming is
retained to avoid breaking local caches. This repository supports VIIRS
products through Earthaccess/CMR-backed granule discovery and download.
References
BRDF and Albedo Theory
Wanner, W., Li, X., & Strahler, A. H. (1995). On the derivation of kernels for kernel-driven models of bidirectional reflectance. Journal of Geophysical Research, 100(D10), 21077-21089. https://doi.org/10.1029/95JD02371
Lewis, P. (1995). The utility of kernel-driven BRDF models in global BRDF and albedo estimation. Journal of Geophysical Research, 100(D10), 21097-21112. https://doi.org/10.1029/95JD02372
Roujean, J. L., Leroy, M., & Deschamps, P. Y. (1992). A bidirectional reflectance model of the Earth's surface for the correction of remote sensing data. Journal of Geophysical Research, 97(D18), 20455-20468. https://doi.org/10.1029/92JD01411
Strahler, A. H., Muller, J. P., Lucht, W., Schaaf, C., Tsang, T., Lewis, P., & Barnsley, M. J. (1999). MODIS BRDF/Albedo Product: Algorithm Theoretical Basis Document Version 5.0. NASA Goddard Space Flight Center.
MODIS BRDF and Albedo Products
Schaaf, C. L., Gao, F., Strahler, A. H., Lucht, W., Li, X., Tsang, T., Strugnell, N. C., Zhang, X., Jin, Y., Barker Schaaf, C., ... & Jin, Y. (2002). First operational BRDF, albedo nadir reflectance products from MODIS. Remote Sensing of Environment, 83(1-2), 135-148. https://doi.org/10.1016/S0034-4257(02)00084-6
Schaaf, C. B., Liu, J., Gao, F., & Strahler, A. H. (2011). MODIS albedo and reflectance anisotropy products. In Land Remote Sensing (pp. 549-561). Springer, New York, NY. https://doi.org/10.1007/978-1-4419-6749-7_24
Liu, J., Schaaf, C., Strahler, A., Zhang, X., Jin, Y., Barker Schaaf, C., Woodcock, C. E., Jain, S., Li, X., Gao, F., ... & He, T. (2018). Validation of Landsat-7/ETM+ land surface reflectance product in North America using Canadian Biosphere Flux Stations. IEEE Transactions on Geoscience and Remote Sensing, 56(5), 2842-2857. https://doi.org/10.1109/TGRS.2017.2784479
VIIRS and NOAA-20/JPSS Data Products
Justice, C. O., Vermote, E., Townshend, J. R., Defries, R., Roy, D. P., Hall, D. K., Salomonson, V. V., Privette, J. L., Riggs, G., Strahler, A., ... & Barnsley, M. J. (2002). The Moderate Resolution Imaging Spectroradiometer (MODIS): Land remote sensing for global change research. IEEE Transactions on Geoscience and Remote Sensing, 40(12), 2747-2761. https://doi.org/10.1109/TGRS.2002.805968
Vermote, E., Justice, C. O., & Csiszar, I. (2016). Early evaluation of the VIIRS Level 2 Ocean Color Earth System Data Record. Remote Sensing of Environment, 166, 38-49. https://doi.org/10.1016/j.rse.2015.12.007
Jackson, D. L., Wick, G. A., & Harms, E. (2021). NOAA's next generation of Geostationary and polar orbiting satellites for Earth Observation. Bulletin of the American Meteorological Society, 102(2), E246-E267.
Atmospheric Correction and Aerosol Data
Lyapustin, A. I., Wang, Y., Miller, S., & Angal, A. (2014). Multi-angle implementation of atmospheric correction for MODIS (MAIAC): 2. Aerosol algorithm. IEEE Transactions on Geoscience and Remote Sensing, 49(12), 4873-4888. https://doi.org/10.1109/TGRS.2011.2144606
Rienecker, M. M., Suarez, M. J., Todling, R., Bacmeister, J., Takacs, L., Liu, H. C., Gu, W., Sienkiewicz, M., Koster, R. D., Gelaro, R., ... & Woollen, J. (2008). The GEOS-5 Data Assimilation System—Documentation of Versions 5.0.1, 5.1.0, and 5.2.0. Technical Report Series on Global Modeling and Data Assimilation, NASA/TM-2008-104606, Vol. 27.
Gelaro, R., McCarty, W., Suárez, M. J., Todling, R., Molod, A., Takacs, L., ... & Zhao, B. (2017). The modern-era retrospective analysis for research and applications, version 2 (MERRA-2). Journal of Climate, 30(14), 5419-5454. https://doi.org/10.1175/JCLI-D-16-0758.1
Vegetation Indices
Rouse, J. W., Haas, R. H., Schell, J. A., & Deering, D. W. (1974). Monitoring vegetation systems in the Great Plains with ERTS. In Proceedings of the Third Earth Resources Technology Satellite Symposium (Vol. 1, pp. 48-62). NASA SP-351.
Tucker, C. J. (1979). Red and photographic infrared linear combinations for monitoring vegetation. Remote Sensing of Environment, 8(2), 127-150. https://doi.org/10.1016/0034-4257(79)90013-0
Justice, C. O., Townshend, J. R., Holben, B. N., & Curl, C. J. (1990). Analysis of the phenology of global vegetation using meteorological satellite data. International Journal of Remote Sensing, 11(7), 1271-1318. https://doi.org/10.1080/01431169008955090
Solar Geometry and Radiative Transfer
Iqbal, M. (1983). An Introduction to Solar Radiation. Academic Press, New York.
Stull, R. (2011). Wet-bulb temperature from relative humidity and air temperature. Journal of Applied Meteorology and Climatology, 50(11), 2267-2269. https://doi.org/10.1175/JAMC-D-11-0143.1
Spencer, J. W. (1971). Fourier series representation of the position of the sun. Search, 2(5), 172.
Climate Data Records
Franch, B., Vermote, E., Roger, J. C., Murphy, K., Becker-Reshef, I., Justice, C., Lane, T. P., Jeevalraman, C., Chilukuri, R., Li, H. Y., & Santamaria-Artigas, A. (2014). A 30+ year AVHRR land-surface reflectance climate data record and its application to wheat-yield monitoring. Remote Sensing of Environment, 145, 88-102. https://doi.org/10.1016/j.rse.2014.02.010
Povey, A. C., & Grainger, R. G. (2015). Known and unknown unknowns: uncertainty estimation in satellite remote sensing. Atmospheric Measurement Techniques, 8(11), 4699-4718. https://doi.org/10.5194/amt-8-4699-2015
Data Discovery and Access
Earthdata Search - NASA's repository of Earth science data products: https://search.earthdata.nasa.gov/
CMR API Documentation - Common Metadata Repository for Earth Science data discovery: https://cmr.earthdata.nasa.gov/search/site/docs/search/api.html
Earthaccess Python package - Open data access for NASA's Earth science data: https://github.com/nsidc/earthaccess
Related Tools and Libraries
Rasterio - Geospatial raster data I/O: https://rasterio.readthedocs.io/
GDAL - Geospatial Data Abstraction Library: https://gdal.org/
Xarray - N-dimensional labeled arrays: https://xarray.pydata.org/
NumPy - Numerical computing in Python: https://numpy.org/
Citation
If you use VCD43NRT in your research, please cite the package using the following BibTeX entry:
@software{halverson2026vcd43nrt,
title={VCD43NRT: VIIRS/NRT BRDF, Albedo, and NDVI Processing Package},
author={Halverson, Gregory H. and Johnson, Margaret C.},
organization={NASA Jet Propulsion Laboratory},
year={2026},
url={https://github.com/JPL-Evapotranspiration-Algorithms/VCD43NRT}
}
Metadata
Release files for VCD43NRT 1.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| vcd43nrt-1.3.0.tar.gz | 60.0 kB | Without provenance | Details for vcd43nrt-1.3.0.tar.gz |
Built distributions (wheels)
| File | Actions Reset | |||
|---|---|---|---|---|
| vcd43nrt-1.3.0-cp311-abi3-win_amd64.whl | CPython 3.11 | abi3 | Windows x86-64 | Details for vcd43nrt-1.3.0-cp311-abi3-win_amd64.whl |
| vcd43nrt-1.3.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl | CPython 3.11 | abi3 | Linux glibc 2.17+ x86-64 | Details for vcd43nrt-1.3.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
| vcd43nrt-1.3.0-cp311-abi3-macosx_11_0_arm64.whl | CPython 3.11 | abi3 | macOS 11.0+ ARM64 | Details for vcd43nrt-1.3.0-cp311-abi3-macosx_11_0_arm64.whl |
| vcd43nrt-1.3.0-cp311-abi3-macosx_10_12_x86_64.whl | CPython 3.11 | abi3 | macOS 10.12+ x86-64 | Details for vcd43nrt-1.3.0-cp311-abi3-macosx_10_12_x86_64.whl |
Total release size: 1.6 MB
Release files / vcd43nrt-1.3.0.tar.gz
| Download URL | vcd43nrt-1.3.0.tar.gz |
|---|---|
| Size | 60.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
76f9e91bc805de5945e9fa19c0687b3c78d2e0759e2455d333225d8820d4d9dd
|
|
BLAKE2b-256 checksum How to use checksums |
7befb999e8f6ef87730f1212fa6b69ad3e5e6009af013c911954406ee6c98d49
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / vcd43nrt-1.3.0-cp311-abi3-win_amd64.whl
| Download URL | vcd43nrt-1.3.0-cp311-abi3-win_amd64.whl |
|---|---|
| Size | 288.3 kB |
| Tags | CPython 3.11 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
1c3a4717a2ab84b7608660c1f4307ac646a68bd47738beb0ebb786a35e10295c
|
|
BLAKE2b-256 checksum How to use checksums |
601eac8045bbf78e744db55ec0e60ec50eadce0a2be7901ed4ba14b46497705f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / vcd43nrt-1.3.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | vcd43nrt-1.3.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 442.1 kB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
0e435327b9932bdb3356d2e97f06b3f208066ea5d3b7c058fdf39bca8adb4faf
|
|
BLAKE2b-256 checksum How to use checksums |
79b4a531b7bf048b72da09a892e82f305fb3b17f104f8bfc4f4aa4b858837a13
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / vcd43nrt-1.3.0-cp311-abi3-macosx_11_0_arm64.whl
| Download URL | vcd43nrt-1.3.0-cp311-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 390.8 kB |
| Tags | CPython 3.11 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
92cbe3a3d0b629c2420af8b5822dc90c6a16960551d0d3629432f4e648e1b50d
|
|
BLAKE2b-256 checksum How to use checksums |
dc55d08afe4a60d471117ff656445b0a7e186bb9a485b091f769294f3e169ecf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / vcd43nrt-1.3.0-cp311-abi3-macosx_10_12_x86_64.whl
| Download URL | vcd43nrt-1.3.0-cp311-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 395.8 kB |
| Tags | CPython 3.11 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
f011d26188dde1371df915bbf1109ebc020a957d6b0293102bcaff4a9f23df7e
|
|
BLAKE2b-256 checksum How to use checksums |
ac92dd6d58b32c56460db47d512531784d5e9f6bcd432dcb035bdbc8f42dc7bc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Security for VCD43NRT 1.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.