pub struct WeightedMedianProcessor {
pub source_weights: HashMap<String, u32>,
pub minimum_cumulative_weight: u32,
}Expand description
Processor that calculates the weighted median of input values.
The WeightedMedianProcessor computes the weighted median of a set of input values,
taking into account the relative importance (weight) of each data source. This provides
a way to give more influence to more reliable or important sources when determining
the central value.
§Source Weights
Each source is assigned a weight using the source_weights mapping. Sources with higher
weights have more influence on the resulting median value. Sources that are not present
in the mapping will cause processing to fail.
§Minimum Cumulative Weight
The processor requires the sum of weights from all provided sources to meet or exceed
the minimum_cumulative_weight threshold. This ensures that enough reliable data is
present to calculate a statistically significant result.
§Examples
use std::collections::HashMap;
use bothan_lib::registry::processor::{Processor, weighted_median::WeightedMedianProcessor};
use rust_decimal::Decimal;
// Create weights for different sources
let weights = HashMap::from([
("source1".to_string(), 10),
("source2".to_string(), 20),
("source3".to_string(), 30),
]);
// Create a weighted median processor
let processor = Processor::WeightedMedian(WeightedMedianProcessor {
source_weights: weights,
minimum_cumulative_weight: 50,
});
// Process data with different weights
let data = vec![
("source1".to_string(), Decimal::new(100, 0)), // Weight: 10
("source2".to_string(), Decimal::new(200, 0)), // Weight: 20
("source3".to_string(), Decimal::new(300, 0)), // Weight: 30
];
let result = processor.process(data).unwrap();
// The result is biased toward the value from source3 since it has the highest weightFields§
§source_weights: HashMap<String, u32>Mapping of source identifiers to their respective weights.
Each source is assigned a weight, which determines its influence on the resulting median calculation. Sources with higher weights have more impact on the final result.
minimum_cumulative_weight: u32The minimum sum of weights required for a valid calculation.
Processing will fail if the sum of weights from all provided sources does not meet this threshold. This ensures sufficient data quality and statistical significance.
Implementations§
Source§impl WeightedMedianProcessor
impl WeightedMedianProcessor
Sourcepub fn new(
source_weights: HashMap<String, u32>,
minimum_cumulative_weight: u32,
) -> Self
pub fn new( source_weights: HashMap<String, u32>, minimum_cumulative_weight: u32, ) -> Self
Creates a new WeightedMedianProcessor with the specified weights and minimum threshold.
§Examples
use std::collections::HashMap;
use bothan_lib::registry::processor::weighted_median::WeightedMedianProcessor;
// Create weights for different sources
let weights = HashMap::from([
("binance".to_string(), 30),
("coinbase".to_string(), 25),
("kraken".to_string(), 20),
("kucoin".to_string(), 15),
]);
// Create a processor that requires a minimum cumulative weight of 50
let processor = WeightedMedianProcessor::new(weights, 50);Source§impl WeightedMedianProcessor
impl WeightedMedianProcessor
Sourcepub fn process(
&self,
data: Vec<(String, Decimal)>,
) -> Result<Decimal, ProcessError>
pub fn process( &self, data: Vec<(String, Decimal)>, ) -> Result<Decimal, ProcessError>
Calculates the weighted median of the provided values.
This method computes the weighted median based on the source weights configuration. It first validates that all sources have defined weights and that the cumulative weight meets the minimum threshold.
§Errors
Returns a ProcessError if:
- Any source in the input data does not have a defined weight
- The cumulative weight of all provided sources is less than the minimum threshold
Trait Implementations§
Source§impl<'__de, __Context> BorrowDecode<'__de, __Context> for WeightedMedianProcessor
impl<'__de, __Context> BorrowDecode<'__de, __Context> for WeightedMedianProcessor
Source§fn borrow_decode<__D: BorrowDecoder<'__de, Context = __Context>>(
decoder: &mut __D,
) -> Result<Self, DecodeError>
fn borrow_decode<__D: BorrowDecoder<'__de, Context = __Context>>( decoder: &mut __D, ) -> Result<Self, DecodeError>
Source§impl Clone for WeightedMedianProcessor
impl Clone for WeightedMedianProcessor
Source§fn clone(&self) -> WeightedMedianProcessor
fn clone(&self) -> WeightedMedianProcessor
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for WeightedMedianProcessor
impl Debug for WeightedMedianProcessor
Source§impl<__Context> Decode<__Context> for WeightedMedianProcessor
impl<__Context> Decode<__Context> for WeightedMedianProcessor
Source§impl<'de> Deserialize<'de> for WeightedMedianProcessor
impl<'de> Deserialize<'de> for WeightedMedianProcessor
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl Encode for WeightedMedianProcessor
impl Encode for WeightedMedianProcessor
Source§impl PartialEq for WeightedMedianProcessor
impl PartialEq for WeightedMedianProcessor
Source§impl Serialize for WeightedMedianProcessor
impl Serialize for WeightedMedianProcessor
impl StructuralPartialEq for WeightedMedianProcessor
Auto Trait Implementations§
impl Freeze for WeightedMedianProcessor
impl RefUnwindSafe for WeightedMedianProcessor
impl Send for WeightedMedianProcessor
impl Sync for WeightedMedianProcessor
impl Unpin for WeightedMedianProcessor
impl UnwindSafe for WeightedMedianProcessor
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request