Skip to content

Commit f0823d4

Browse files
committed
ENH: add helpers to merge extra data into a cycler instance
From private discussions with @WeatherGod
1 parent 1dc2965 commit f0823d4

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed

cycler.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,3 +563,59 @@ def _cycler(label, itr):
563563
itr = (v[lab] for v in itr)
564564

565565
return Cycler._from_iter(label, itr)
566+
567+
568+
def from_iter_of_dicts(inp):
569+
"""Construct a summation-only cycler from a list of dicts
570+
571+
Given an iterable of dictionaries (such as you would get from
572+
iterating over a `Cycler`) and constructs a new `Cycler`.
573+
574+
The following are equivalent ::
575+
576+
from_iter_of_dicts(list(c)) == c.simplify()
577+
578+
Parameters
579+
----------
580+
inp : Iterable[Mapping[Any, Any]]
581+
An iterable of dictionaries. All must have the same keys.
582+
583+
Returns
584+
-------
585+
ret : Cycler
586+
"""
587+
# TODO better validation that all keys match, not just using
588+
# the keys from the first entry
589+
# TODO deal with empty list correctly
590+
inp = list(inp)
591+
return reduce(add, (cycler(k, [_[k] for _ in inp]) for k in inp[0]))
592+
593+
594+
def merge_suplemental(source, indx_key, sumplemental_data):
595+
"""Update a cycler with some supplemental data
596+
597+
Given a cycler, add extra keys to each entry based
598+
on the value of ``index_key`` in that entry.
599+
600+
Parameters
601+
----------
602+
source : Cycler
603+
The cycler to augment.
604+
605+
indx_key : Any
606+
Must be one of the keys in ``source``
607+
608+
sumplemental_data : Mapping[Any, Any]
609+
A mapping between the values of ``index_key`` in ``source``
610+
and mappings of additional keys and values.
611+
612+
Each mapping must have the same set of keys.
613+
614+
Returns
615+
-------
616+
ret : Cycler
617+
618+
"""
619+
return (source +
620+
from_iter_of_dicts(sumplemental_data[v[indx_key]]
621+
for v in source))

0 commit comments

Comments
 (0)