Long-term sound level measurements analysis in Python
Project description
noisemonitor
A python package for sound level data analysis.
See the Usage Guide for detailed examples and the API Reference for function documentation.
⚠️ Version 1.0.0 - Breaking Changes: This major update introduces a new functional API and is not backward-compatible with previous versions. See the Migration Guide for details.
Table of Contents
Key Features
- Acoustic indicators - Implements standard (Leq, Lden, L90, etc.) and research-based noise indicators (HARMONICA, Number of Noise Events, etc.)
- Flexible data loading - Support for CSV, Excel, and TXT formats with automatic datetime parsing
- Two analysis modes - Summary indicators (discrete values) and profile indicators (time series)
- Multiprocessing support - Fast processing of large datasets
- Easy visualization - Built-in plotting functions with customizable styles
- Data coverage validation - Automated quality checks with configurable thresholds
- Weather integration - [Canada only] Merge and analyze data with Canadian weather station data
Installation
Install from PyPI:
pip install noisemonitor
For weather integration (Canada only):
pip install noisemonitor[weather]
Install the latest development version:
pip install git+https://github.com/valerianF/noisemonitor
Quick Start
noisemonitor is designed for flexibility and ease of use. All analysis functions accept an optional column parameter, allowing you to specify which data column to analyze (e.g., to work with datasets containing multiple sound level measurements or frequency bands). Most functions return results as pandas DataFrames for easy manipulation.
import noisemonitor as nm
# Load data
df_1m = nm.load(
'tests/data/test_data_laeq1m.csv',
datetimeindex=0, # Column index for datetime
valueindexes=1, # Column index(es) for sound levels
header=0, # Header row index
sep=','
)
# Compute Lden
lden = nm.summary.lden(df_1m)
lden.head()
| lden | lday | levening | lnight |
|---|---|---|---|
| 56.1 | 51.75 | 50.08 | 49.23 |
# Compute weekly profiles
weekday_profile = nm.profile.periodic(
df_1m,
hour1=23,
hour2=22,
day1='monday',
day2='friday',
win=3600, # 1-hour window
step=1200 # 20-minute step
)
weekend_profile = nm.profile.periodic(
df_1m,
hour1=23,
hour2=22,
day1='saturday',
day2='sunday',
win=3600,
step=1200
)
# Visualize
nm.display.compare(
[weekday_profile, weekend_profile],
['Weekday', 'Weekend'],
'Leq',
fill_background=True,
title='Weekly Noise Profiles'
)
# Computa HARMONICA indexes
harmonica = nm.summary.harmonica_periodic(df_1s) # requires 1s resolution data
nm.display.harmonica(harmonica) # Visualize
Core Modules
nm.load()
Load data from CSV, Excel, or TXT files (or list of files) with automatic datetime parsing.
df = nm.load('data.csv', datetimeindex=0, valueindexes=1, header=0, sep=',')
nm.filter
Filter data by datetime, remove outliers, or filter by weather conditions.
df_filtered = nm.filter.extreme_values(df, min_value=30, max_value=100)
nm.summary
Compute discrete sound level indicators: Leq, Lden, HARMONICA, frequency analysis, histograms, etc.
overall_lden = nm.summary.lden(df)
daily_lden = nm.summary.periodic(df, freq='D')
harmonica = nm.summary.harmonica_periodic(df)
freq_summary = nm.summary.freq_periodic(df_freq, freq='D')
nm.profile
Compute time-varying sound level profiles: time series, daily/weekly patterns, number of noise events, etc.
time_series = nm.profile.series(df, win=3600, step=1200)
weekday_profile = nm.profile.periodic(df, hour1=0, hour2=23, day1='monday', day2='friday', win=3600)
nne_profile = nm.profile.nne(df, hour1=0, hour2=23, background_type='L50', exceedance=5)
nm.display
Visualize results with line plots, heatmaps, and more.
nm.display.line(time_series, 'Leq', 'L10', 'L90', title='Noise Levels')
nm.display.compare([weekday_profile, weekend_profile], ['Weekdays', 'Weekend'], 'Leq')
nm.display.freq_map(freq_data['Leq'], title='Frequency Heatmap')
nm.weather (Canada only)
Integrate Environment Canada weather data to analyze weather impact on noise.
stations = nm.weather.weathercan.get_historical_stations(coordinates=[45.5, -73.6], radius=25)
df_weather = await nm.weather.weathercan.merge_weather(df, station_id=30165, wind_speed_flag=18)
contingency = nm.weather.weathercan.contingency_weather_flags(df_weather)
Citation
If you use noisemonitor, please consider citing us:
@inproceedings{fraisse2023noisemonitor,
title={noisemonitor: A Python Package For Sound Level Monitor Analysis},
author={Fraisse, Valérian},
booktitle={Acoustics Week in Canada},
year={2023}
}
Dependencies
- NumPy (numpy.org)
- pandas (pandas.pydata.org)
- Matplotlib (matplotlib.org)
License
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file noisemonitor-1.0.1.tar.gz.
File metadata
- Download URL: noisemonitor-1.0.1.tar.gz
- Upload date:
- Size: 35.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c9df4d7de6506a7e4b90a9ad3fef9f6493949af7bbbe890b60a8d6bde4056331
|
|
| MD5 |
b182b61695cb126062e879e03ffafcc0
|
|
| BLAKE2b-256 |
9459606034451c6f865acc9da9becd3e47f36a089806706f53544d12d912957f
|
File details
Details for the file noisemonitor-1.0.1-py3-none-any.whl.
File metadata
- Download URL: noisemonitor-1.0.1-py3-none-any.whl
- Upload date:
- Size: 37.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6d48919b08a3b7713fa7b723b5047aa406b4df863c55bfab5391355a9657a3ca
|
|
| MD5 |
eb33bbbe44d7237dff3c6747e458d78d
|
|
| BLAKE2b-256 |
7d9d20f2417ede780e5b802e514c586e7aa3e9fefb1bc995b3f8c526bb794969
|