aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorJakub Kotur <qtr@google.com>2020-12-21 17:28:15 +0100
committerJakub Kotur <qtr@google.com>2021-03-05 16:28:26 +0100
commita425e55a65d84cc4bdded363daa365cd4c1b84e6 (patch)
treeb63f2f1e94a9289b403c84c2e51079b79ba74c00 /examples
parent54eae68ce52d631abac923a2bd0d5ebe49b8eea5 (diff)
downloaditertools-a425e55a65d84cc4bdded363daa365cd4c1b84e6.tar.gz
Initial import of itertools-0.9.0.
Bug: 155309706 Change-Id: Id790c146e836f0eadfb0d8a103cbe2d226a598c3
Diffstat (limited to 'examples')
-rw-r--r--examples/iris.data150
-rw-r--r--examples/iris.rs137
2 files changed, 287 insertions, 0 deletions
diff --git a/examples/iris.data b/examples/iris.data
new file mode 100644
index 0000000..a3490e0
--- /dev/null
+++ b/examples/iris.data
@@ -0,0 +1,150 @@
+5.1,3.5,1.4,0.2,Iris-setosa
+4.9,3.0,1.4,0.2,Iris-setosa
+4.7,3.2,1.3,0.2,Iris-setosa
+4.6,3.1,1.5,0.2,Iris-setosa
+5.0,3.6,1.4,0.2,Iris-setosa
+5.4,3.9,1.7,0.4,Iris-setosa
+4.6,3.4,1.4,0.3,Iris-setosa
+5.0,3.4,1.5,0.2,Iris-setosa
+4.4,2.9,1.4,0.2,Iris-setosa
+4.9,3.1,1.5,0.1,Iris-setosa
+5.4,3.7,1.5,0.2,Iris-setosa
+4.8,3.4,1.6,0.2,Iris-setosa
+4.8,3.0,1.4,0.1,Iris-setosa
+4.3,3.0,1.1,0.1,Iris-setosa
+5.8,4.0,1.2,0.2,Iris-setosa
+5.7,4.4,1.5,0.4,Iris-setosa
+5.4,3.9,1.3,0.4,Iris-setosa
+5.1,3.5,1.4,0.3,Iris-setosa
+5.7,3.8,1.7,0.3,Iris-setosa
+5.1,3.8,1.5,0.3,Iris-setosa
+5.4,3.4,1.7,0.2,Iris-setosa
+5.1,3.7,1.5,0.4,Iris-setosa
+4.6,3.6,1.0,0.2,Iris-setosa
+5.1,3.3,1.7,0.5,Iris-setosa
+4.8,3.4,1.9,0.2,Iris-setosa
+5.0,3.0,1.6,0.2,Iris-setosa
+5.0,3.4,1.6,0.4,Iris-setosa
+5.2,3.5,1.5,0.2,Iris-setosa
+5.2,3.4,1.4,0.2,Iris-setosa
+4.7,3.2,1.6,0.2,Iris-setosa
+4.8,3.1,1.6,0.2,Iris-setosa
+5.4,3.4,1.5,0.4,Iris-setosa
+5.2,4.1,1.5,0.1,Iris-setosa
+5.5,4.2,1.4,0.2,Iris-setosa
+4.9,3.1,1.5,0.1,Iris-setosa
+5.0,3.2,1.2,0.2,Iris-setosa
+5.5,3.5,1.3,0.2,Iris-setosa
+4.9,3.1,1.5,0.1,Iris-setosa
+4.4,3.0,1.3,0.2,Iris-setosa
+5.1,3.4,1.5,0.2,Iris-setosa
+5.0,3.5,1.3,0.3,Iris-setosa
+4.5,2.3,1.3,0.3,Iris-setosa
+4.4,3.2,1.3,0.2,Iris-setosa
+5.0,3.5,1.6,0.6,Iris-setosa
+5.1,3.8,1.9,0.4,Iris-setosa
+4.8,3.0,1.4,0.3,Iris-setosa
+5.1,3.8,1.6,0.2,Iris-setosa
+4.6,3.2,1.4,0.2,Iris-setosa
+5.3,3.7,1.5,0.2,Iris-setosa
+5.0,3.3,1.4,0.2,Iris-setosa
+7.0,3.2,4.7,1.4,Iris-versicolor
+6.4,3.2,4.5,1.5,Iris-versicolor
+6.9,3.1,4.9,1.5,Iris-versicolor
+5.5,2.3,4.0,1.3,Iris-versicolor
+6.5,2.8,4.6,1.5,Iris-versicolor
+5.7,2.8,4.5,1.3,Iris-versicolor
+6.3,3.3,4.7,1.6,Iris-versicolor
+4.9,2.4,3.3,1.0,Iris-versicolor
+6.6,2.9,4.6,1.3,Iris-versicolor
+5.2,2.7,3.9,1.4,Iris-versicolor
+5.0,2.0,3.5,1.0,Iris-versicolor
+5.9,3.0,4.2,1.5,Iris-versicolor
+6.0,2.2,4.0,1.0,Iris-versicolor
+6.1,2.9,4.7,1.4,Iris-versicolor
+5.6,2.9,3.6,1.3,Iris-versicolor
+6.7,3.1,4.4,1.4,Iris-versicolor
+5.6,3.0,4.5,1.5,Iris-versicolor
+5.8,2.7,4.1,1.0,Iris-versicolor
+6.2,2.2,4.5,1.5,Iris-versicolor
+5.6,2.5,3.9,1.1,Iris-versicolor
+5.9,3.2,4.8,1.8,Iris-versicolor
+6.1,2.8,4.0,1.3,Iris-versicolor
+6.3,2.5,4.9,1.5,Iris-versicolor
+6.1,2.8,4.7,1.2,Iris-versicolor
+6.4,2.9,4.3,1.3,Iris-versicolor
+6.6,3.0,4.4,1.4,Iris-versicolor
+6.8,2.8,4.8,1.4,Iris-versicolor
+6.7,3.0,5.0,1.7,Iris-versicolor
+6.0,2.9,4.5,1.5,Iris-versicolor
+5.7,2.6,3.5,1.0,Iris-versicolor
+5.5,2.4,3.8,1.1,Iris-versicolor
+5.5,2.4,3.7,1.0,Iris-versicolor
+5.8,2.7,3.9,1.2,Iris-versicolor
+6.0,2.7,5.1,1.6,Iris-versicolor
+5.4,3.0,4.5,1.5,Iris-versicolor
+6.0,3.4,4.5,1.6,Iris-versicolor
+6.7,3.1,4.7,1.5,Iris-versicolor
+6.3,2.3,4.4,1.3,Iris-versicolor
+5.6,3.0,4.1,1.3,Iris-versicolor
+5.5,2.5,4.0,1.3,Iris-versicolor
+5.5,2.6,4.4,1.2,Iris-versicolor
+6.1,3.0,4.6,1.4,Iris-versicolor
+5.8,2.6,4.0,1.2,Iris-versicolor
+5.0,2.3,3.3,1.0,Iris-versicolor
+5.6,2.7,4.2,1.3,Iris-versicolor
+5.7,3.0,4.2,1.2,Iris-versicolor
+5.7,2.9,4.2,1.3,Iris-versicolor
+6.2,2.9,4.3,1.3,Iris-versicolor
+5.1,2.5,3.0,1.1,Iris-versicolor
+5.7,2.8,4.1,1.3,Iris-versicolor
+6.3,3.3,6.0,2.5,Iris-virginica
+5.8,2.7,5.1,1.9,Iris-virginica
+7.1,3.0,5.9,2.1,Iris-virginica
+6.3,2.9,5.6,1.8,Iris-virginica
+6.5,3.0,5.8,2.2,Iris-virginica
+7.6,3.0,6.6,2.1,Iris-virginica
+4.9,2.5,4.5,1.7,Iris-virginica
+7.3,2.9,6.3,1.8,Iris-virginica
+6.7,2.5,5.8,1.8,Iris-virginica
+7.2,3.6,6.1,2.5,Iris-virginica
+6.5,3.2,5.1,2.0,Iris-virginica
+6.4,2.7,5.3,1.9,Iris-virginica
+6.8,3.0,5.5,2.1,Iris-virginica
+5.7,2.5,5.0,2.0,Iris-virginica
+5.8,2.8,5.1,2.4,Iris-virginica
+6.4,3.2,5.3,2.3,Iris-virginica
+6.5,3.0,5.5,1.8,Iris-virginica
+7.7,3.8,6.7,2.2,Iris-virginica
+7.7,2.6,6.9,2.3,Iris-virginica
+6.0,2.2,5.0,1.5,Iris-virginica
+6.9,3.2,5.7,2.3,Iris-virginica
+5.6,2.8,4.9,2.0,Iris-virginica
+7.7,2.8,6.7,2.0,Iris-virginica
+6.3,2.7,4.9,1.8,Iris-virginica
+6.7,3.3,5.7,2.1,Iris-virginica
+7.2,3.2,6.0,1.8,Iris-virginica
+6.2,2.8,4.8,1.8,Iris-virginica
+6.1,3.0,4.9,1.8,Iris-virginica
+6.4,2.8,5.6,2.1,Iris-virginica
+7.2,3.0,5.8,1.6,Iris-virginica
+7.4,2.8,6.1,1.9,Iris-virginica
+7.9,3.8,6.4,2.0,Iris-virginica
+6.4,2.8,5.6,2.2,Iris-virginica
+6.3,2.8,5.1,1.5,Iris-virginica
+6.1,2.6,5.6,1.4,Iris-virginica
+7.7,3.0,6.1,2.3,Iris-virginica
+6.3,3.4,5.6,2.4,Iris-virginica
+6.4,3.1,5.5,1.8,Iris-virginica
+6.0,3.0,4.8,1.8,Iris-virginica
+6.9,3.1,5.4,2.1,Iris-virginica
+6.7,3.1,5.6,2.4,Iris-virginica
+6.9,3.1,5.1,2.3,Iris-virginica
+5.8,2.7,5.1,1.9,Iris-virginica
+6.8,3.2,5.9,2.3,Iris-virginica
+6.7,3.3,5.7,2.5,Iris-virginica
+6.7,3.0,5.2,2.3,Iris-virginica
+6.3,2.5,5.0,1.9,Iris-virginica
+6.5,3.0,5.2,2.0,Iris-virginica
+6.2,3.4,5.4,2.3,Iris-virginica
+5.9,3.0,5.1,1.8,Iris-virginica
diff --git a/examples/iris.rs b/examples/iris.rs
new file mode 100644
index 0000000..25ab373
--- /dev/null
+++ b/examples/iris.rs
@@ -0,0 +1,137 @@
+///
+/// This example parses, sorts and groups the iris dataset
+/// and does some simple manipulations.
+///
+/// Iterators and itertools functionality are used throughout.
+
+use itertools::Itertools;
+use std::collections::HashMap;
+use std::iter::repeat;
+use std::num::ParseFloatError;
+use std::str::FromStr;
+
+static DATA: &'static str = include_str!("iris.data");
+
+#[derive(Clone, Debug)]
+struct Iris {
+ name: String,
+ data: [f32; 4],
+}
+
+#[derive(Clone, Debug)]
+enum ParseError {
+ Numeric(ParseFloatError),
+ Other(&'static str),
+}
+
+impl From<ParseFloatError> for ParseError {
+ fn from(err: ParseFloatError) -> Self {
+ ParseError::Numeric(err)
+ }
+}
+
+/// Parse an Iris from a comma-separated line
+impl FromStr for Iris {
+ type Err = ParseError;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let mut iris = Iris { name: "".into(), data: [0.; 4] };
+ let mut parts = s.split(",").map(str::trim);
+
+ // using Iterator::by_ref()
+ for (index, part) in parts.by_ref().take(4).enumerate() {
+ iris.data[index] = part.parse::<f32>()?;
+ }
+ if let Some(name) = parts.next() {
+ iris.name = name.into();
+ } else {
+ return Err(ParseError::Other("Missing name"))
+ }
+ Ok(iris)
+ }
+}
+
+fn main() {
+ // using Itertools::fold_results to create the result of parsing
+ let irises = DATA.lines()
+ .map(str::parse)
+ .fold_results(Vec::new(), |mut v, iris: Iris| {
+ v.push(iris);
+ v
+ });
+ let mut irises = match irises {
+ Err(e) => {
+ println!("Error parsing: {:?}", e);
+ std::process::exit(1);
+ }
+ Ok(data) => data,
+ };
+
+ // Sort them and group them
+ irises.sort_by(|a, b| Ord::cmp(&a.name, &b.name));
+
+ // using Iterator::cycle()
+ let mut plot_symbols = "+ox".chars().cycle();
+ let mut symbolmap = HashMap::new();
+
+ // using Itertools::group_by
+ for (species, species_group) in &irises.iter().group_by(|iris| &iris.name) {
+ // assign a plot symbol
+ symbolmap.entry(species).or_insert_with(|| {
+ plot_symbols.next().unwrap()
+ });
+ println!("{} (symbol={})", species, symbolmap[species]);
+
+ for iris in species_group {
+ // using Itertools::format for lazy formatting
+ println!("{:>3.1}", iris.data.iter().format(", "));
+ }
+
+ }
+
+ // Look at all combinations of the four columns
+ //
+ // See https://en.wikipedia.org/wiki/Iris_flower_data_set
+ //
+ let n = 30; // plot size
+ let mut plot = vec![' '; n * n];
+
+ // using Itertools::tuple_combinations
+ for (a, b) in (0..4).tuple_combinations() {
+ println!("Column {} vs {}:", a, b);
+
+ // Clear plot
+ //
+ // using std::iter::repeat;
+ // using Itertools::set_from
+ plot.iter_mut().set_from(repeat(' '));
+
+ // using Itertools::minmax
+ let min_max = |data: &[Iris], col| {
+ data.iter()
+ .map(|iris| iris.data[col])
+ .minmax()
+ .into_option()
+ .expect("Can't find min/max of empty iterator")
+ };
+ let (min_x, max_x) = min_max(&irises, a);
+ let (min_y, max_y) = min_max(&irises, b);
+
+ // Plot the data points
+ let round_to_grid = |x, min, max| ((x - min) / (max - min) * ((n - 1) as f32)) as usize;
+ let flip = |ix| n - 1 - ix; // reverse axis direction
+
+ for iris in &irises {
+ let ix = round_to_grid(iris.data[a], min_x, max_x);
+ let iy = flip(round_to_grid(iris.data[b], min_y, max_y));
+ plot[n * iy + ix] = symbolmap[&iris.name];
+ }
+
+ // render plot
+ //
+ // using Itertools::join
+ for line in plot.chunks(n) {
+ println!("{}", line.iter().join(" "))
+ }
+ }
+}