Skip to main content

Frequencies

Struct Frequencies 

Source
pub struct Frequencies<T> { /* private fields */ }
Expand description

A commutative data structure for exact frequency counts.

Implementations§

Source§

impl<T: Eq + Hash> Frequencies<T>

Source

pub fn new() -> Frequencies<T>

Create a new frequency table with no samples.

Source

pub fn with_capacity(capacity: usize) -> Self

Source

pub fn add(&mut self, v: T)

Add a value to the frequency table.

Source

pub fn count(&self, v: &T) -> u64

Return the number of occurrences of v in the data.

Source

pub fn cardinality(&self) -> u64

Return the cardinality (number of unique elements) in the data.

Source

pub fn most_frequent(&self) -> (Vec<(&T, u64)>, u64)

Return a Vec of elements, their corresponding counts in descending order, and the total count.

Source

pub fn least_frequent(&self) -> (Vec<(&T, u64)>, u64)

Return a Vec of elements, their corresponding counts in ascending order, and the total count.

Source

pub fn par_frequent(&self, least: bool) -> (Vec<(&T, u64)>, u64)
where for<'a> (&'a T, u64): Send, T: Ord,

Return a Vec of elements, their corresponding counts in order based on the least parameter, and the total count. Uses parallel sort.

Source

pub fn len(&self) -> usize

Returns the cardinality of the data.

Source

pub fn is_empty(&self) -> bool

Returns true if there is no frequency/cardinality data.

Source

pub fn unique_values(&self) -> UniqueValues<'_, T>

Return an iterator over the unique values of the data.

Source

pub fn top_n(&self, n: usize) -> Vec<(&T, u64)>
where T: Ord,

Get the top N most frequent items without sorting the entire vector This is much faster than most_frequent() when you only need a few items

Source

pub fn bottom_n(&self, n: usize) -> Vec<(&T, u64)>
where T: Ord,

Similar to top_n but for least frequent items

Source

pub fn items_with_count(&self, n: u64) -> Vec<&T>

Get items with exactly n occurrences

Source

pub fn total_count(&self) -> u64

Get the sum of all counts

Source

pub fn has_count(&self, n: u64) -> bool

Check if any item occurs exactly n times

Source

pub fn increment_by(&mut self, v: T, count: u64)

Add specialized method for single increment

Source§

impl<T: Eq + Hash + Ord + Clone + Send + Sync> Frequencies<T>

Source

pub fn modes_antimodes(&self) -> ((Vec<T>, usize, u32), (Vec<T>, usize, u32))

Returns the modes and antimodes of the data.

Produces results identical to crate::Unsorted::modes_antimodes for the same multiset of samples with per-value counts <= u32::MAX (verified by the modes_antimodes_matches_unsorted property test and the equivalence assertion in benches/modesfreq.rs). Above that the two diverge: selection here is exact via full u64 counts, while Unsorted tracks u32 run counts (and cannot practically hold that many samples anyway).

Rather than sorting all unique values, this only sorts what the output actually contains: one O(c) pass over the counts finds the highest/lowest occurrence counts, a second pass collects only the matching keys, then the (typically tiny) mode set is sorted and the 10 smallest antimodes are picked via select_nth_unstable - O(c) average instead of O(c log c), where c is the cardinality. Uniform-count data (highest == lowest: every value is both a mode and an antimode) falls back to a single full key sort, which beats collecting the keys twice.

Counts are compared as u64, so mode/antimode selection is exact even when occurrence counts exceed u32::MAX; only the returned occurrence counts saturate at u32::MAX.

Returns ((modes, modes_count, mode_occurrences), (antimodes, antimodes_count, antimode_occurrences)). Only the first 10 antimodes are returned.

Source§

impl Frequencies<Vec<u8>>

Source

pub fn add_borrowed(&mut self, v: &[u8])

Increment count for a byte slice key, avoiding allocation when key exists. Uses hashbrown’s entry_ref(&[u8]), which probes once with the borrowed key and only allocates ([u8]::to_owned() -> Vec<u8>) on the vacant branch. For low-cardinality columns (the common case), this eliminates ~99% of allocations; for new keys it is a single hash+probe (std’s HashMap has no stable raw-entry API, so the old path hashed twice).

Source

pub fn increment_by_borrowed(&mut self, v: &[u8], count: u64)

Increment by a count for a byte slice key, avoiding allocation when key exists.

Source

pub fn add_borrowed_capped(&mut self, v: &[u8], cap: u64) -> bool

Increment the count for v, enforcing a cardinality cap.

Existing keys always increment (the map doesn’t grow). A NEW key that would grow the map past cap unique entries is rejected: the map is left unchanged and false is returned, so the caller can drop the tracker. cap == 0 means unbounded.

Like Self::add_borrowed, this single-probes via entry_ref and only allocates an owned key on the (admitted) vacant branch.

Trait Implementations§

Source§

impl<T: Clone> Clone for Frequencies<T>

Source§

fn clone(&self) -> Frequencies<T>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T: Eq + Hash> Commute for Frequencies<T>

Source§

fn merge(&mut self, v: Frequencies<T>)

Merges the value other into self.
Source§

fn consume<I: Iterator<Item = Self>>(&mut self, other: I)

Merges the values in the iterator into self.
Source§

impl<T: Debug + Eq + Hash> Debug for Frequencies<T>

Available on debug-assertions enabled only.
Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T: Eq + Hash> Default for Frequencies<T>

Source§

fn default() -> Frequencies<T>

Returns the “default value” for a type. Read more
Source§

impl<'de, T> Deserialize<'de> for Frequencies<T>
where T: Deserialize<'de> + Eq + Hash,

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl<T: Eq + Hash> Extend<T> for Frequencies<T>

Source§

fn extend<I: IntoIterator<Item = T>>(&mut self, it: I)

Extends a collection with the contents of an iterator. Read more
Source§

fn extend_one(&mut self, item: A)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
Source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
Source§

impl<T: Eq + Hash> FromIterator<T> for Frequencies<T>

Source§

fn from_iter<I: IntoIterator<Item = T>>(it: I) -> Frequencies<T>

Creates a value from an iterator. Read more
Source§

impl<T: Eq + Hash> PartialEq for Frequencies<T>

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<T> Serialize for Frequencies<T>
where T: Serialize + Eq + Hash,

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

§

impl<T> Freeze for Frequencies<T>

§

impl<T> RefUnwindSafe for Frequencies<T>
where T: RefUnwindSafe,

§

impl<T> Send for Frequencies<T>
where T: Send,

§

impl<T> Sync for Frequencies<T>
where T: Sync,

§

impl<T> Unpin for Frequencies<T>
where T: Unpin,

§

impl<T> UnsafeUnpin for Frequencies<T>

§

impl<T> UnwindSafe for Frequencies<T>
where T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.