Skip to content

Commit 7b7e7c5

Browse files
author
Matthieu Ancellin
committed
Add a draft for Design of Experiments (DOE).
1 parent 102c4f9 commit 7b7e7c5

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

labelled_functions/doe.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#!/usr/bin/env python
2+
# coding: utf-8
3+
4+
from itertools import product
5+
from copy import copy
6+
from typing import Union, Sequence, Dict
7+
8+
import pandas as pd
9+
10+
def from_sequence(**kwargs):
11+
for name, values in kwargs.items():
12+
yield from ({name: val} for val in values)
13+
14+
def merge_dicts(ds: Sequence[Dict]) -> Dict:
15+
merged = {}
16+
for d in ds:
17+
merged.update(d)
18+
return merged
19+
20+
def combine_plans_and_sequences(plans, sequences):
21+
plans = list(plans)
22+
for name, values in sequences.items():
23+
plan = from_sequence(**{name: values})
24+
plans.append(plan)
25+
return plans
26+
27+
def zip_plans(*plans, **sequences):
28+
return map(merge_dicts, zip(*combine_plans_and_sequences(plans, sequences)))
29+
30+
def product_of_plans(*plans, **sequences):
31+
return map(merge_dicts, product(*combine_plans_and_sequences(plans, sequences)))
32+
33+
def cross_plans(*plans, pivot, **sequences):
34+
yield pivot
35+
for plan in combine_plans_and_sequences(plans, sequences):
36+
for experiment in plan:
37+
current = copy(pivot)
38+
current.update(experiment)
39+
if current != pivot:
40+
yield current
41+
42+
if __name__ == "__main__":
43+
a = range(5)
44+
b = ['foo', 'bar', 'baz', 'moose', 'llama']
45+
c = range(100, 110)
46+
47+
assert list(from_sequence(a=range(3))) == [{'a': 0}, {'a': 1}, {'a': 2}]
48+
assert list(from_sequence(a=range(3), b=['foo'])) == [{'a': 0}, {'a': 1}, {'a': 2}, {'b': 'foo'}]
49+
assert list(from_sequence(a=range(3))) == list(zip_plans(a=range(3)))
50+
assert list(from_sequence(a=range(3))) == list(product_of_plans(a=range(3)))
51+
52+
assert list(zip_plans(a=range(2), b=['foo', 'bar'])) == [{'a': 0, 'b': 'foo'}, {'a': 1, 'b': 'bar'}]
53+
54+
plan_1 = zip_plans(a=range(2), b=['foo', 'bar'])
55+
plan_2 = zip_plans(c=range(10))
56+
print(pd.DataFrame(cross_plans(plan_1, plan_2, pivot={'a': 1, 'b': 'bar', 'c': 0})))
57+

0 commit comments

Comments
 (0)