File candybox.py changed (mode: 100644) (index fa8f8fa..5da968a) |
... |
... |
try: |
20 |
20 |
except ImportError: |
except ImportError: |
21 |
21 |
print("CandyBox: error of import Pandas. CandyBox will work in Pandas-free mode") |
print("CandyBox: error of import Pandas. CandyBox will work in Pandas-free mode") |
22 |
22 |
|
|
23 |
|
|
|
|
23 |
|
import numpy as np |
24 |
24 |
|
|
25 |
25 |
class CandyBox: |
class CandyBox: |
26 |
26 |
|
|
|
... |
... |
class CandyBox: |
43 |
43 |
|
|
44 |
44 |
try: |
try: |
45 |
45 |
cb.df = pd.DataFrame(kwargs) |
cb.df = pd.DataFrame(kwargs) |
|
46 |
|
# chcem jednoduché numpy-like chovaní |
|
47 |
|
cb.df.reset_index(inplace=True) |
46 |
48 |
except NameError: # if there is no "pandas as pd" |
except NameError: # if there is no "pandas as pd" |
47 |
49 |
cb.kwargs = kwargs |
cb.kwargs = kwargs |
48 |
50 |
if cb.consistency_check(): |
if cb.consistency_check(): |
|
... |
... |
class CandyBox: |
77 |
79 |
def __call__(cb, *args, **kwargs): |
def __call__(cb, *args, **kwargs): |
78 |
80 |
# Houston, we've got a problem... |
# Houston, we've got a problem... |
79 |
81 |
# call meaning is different for underlaying f_models and upper Boxes |
# call meaning is different for underlaying f_models and upper Boxes |
80 |
|
# but SampleBox will call in asssumption of f_model under |
|
|
82 |
|
# but SampleBox expect f_model under |
81 |
83 |
return cb.sampling_plan(*args, **kwargs) |
return cb.sampling_plan(*args, **kwargs) |
82 |
84 |
|
|
83 |
85 |
|
|
|
... |
... |
class CandyBox: |
91 |
93 |
# pravděpodobně když se nám vrátí serie, tak bude interpretována jako sloup |
# pravděpodobně když se nám vrátí serie, tak bude interpretována jako sloup |
92 |
94 |
# fakt mi nic spolehlivějšího nenapadá |
# fakt mi nic spolehlivějšího nenapadá |
93 |
95 |
df = pd.DataFrame(df).T |
df = pd.DataFrame(df).T |
|
96 |
|
|
|
97 |
|
# chcem jednoduché numpy-like chovaní |
|
98 |
|
df.reset_index(inplace=True) |
94 |
99 |
return CandyBox(cb.sampling_plan[slice], df=df) |
return CandyBox(cb.sampling_plan[slice], df=df) |
95 |
100 |
# if not |
# if not |
96 |
101 |
else: |
else: |
|
... |
... |
class CandyBox: |
100 |
105 |
sliced_dict[key] = cb.kwargs[key][slice] |
sliced_dict[key] = cb.kwargs[key][slice] |
101 |
106 |
return CandyBox(cb.sampling_plan[slice], **sliced_dict) |
return CandyBox(cb.sampling_plan[slice], **sliced_dict) |
102 |
107 |
|
|
|
108 |
|
def __setattr__(cb, key, value): |
|
109 |
|
# to je vše co má samotný CandyBox |
|
110 |
|
# žádný další majetek u něho nepozoruji |
|
111 |
|
if key in ('sampling_plan', 'df', 'kwargs'): |
|
112 |
|
cb.__dict__[key] = value |
|
113 |
|
elif len(cb) == len(value): |
|
114 |
|
# if pandas |
|
115 |
|
if 'df' in cb.__dict__: |
|
116 |
|
# df je na svědomi pandas |
|
117 |
|
cb.df[key] = value |
|
118 |
|
# if not |
|
119 |
|
else: |
|
120 |
|
cb.kwargs[key] = value |
|
121 |
|
else: |
|
122 |
|
raise ValueError("Sample and given values hasn't the same length. Zkrátka, do sebe nepatří") |
103 |
123 |
|
|
104 |
124 |
|
|
105 |
125 |
def __getattr__(cb, attr): |
def __getattr__(cb, attr): |
|
... |
... |
class CandyBox: |
124 |
144 |
# zkusím převést na numpy, protože |
# zkusím převést na numpy, protože |
125 |
145 |
# Pandasovy indexy jen zlobí |
# Pandasovy indexy jen zlobí |
126 |
146 |
# a stejně nikdo je nepouživá a na ně nespolehá |
# a stejně nikdo je nepouživá a na ně nespolehá |
|
147 |
|
# další kód by neměl furt řešit, co ta bombonjera má uvnitř |
|
148 |
|
# i když je to škoda, že nepujde měnit jednotlivé hodnoty |
127 |
149 |
return cb.df[attr].to_numpy() |
return cb.df[attr].to_numpy() |
|
150 |
|
|
|
151 |
|
# zkusím nepřevadět na numpy, protože chcu mäť možnost hodnoty měnit |
|
152 |
|
# pri slajsech resetuju indexy, takže musí to být v pohodě |
|
153 |
|
# doufám, že tím нищего не поломаju |
|
154 |
|
# šecko se tím zkazilo a je taky otázkou |
|
155 |
|
# zda je to vhodně když se furt robej slajsy |
|
156 |
|
# nechám to na uživatelském kódu |
|
157 |
|
#return cb.df[attr] |
128 |
158 |
else: # implicitně pandas hodí KeyError, kterej nechcem |
else: # implicitně pandas hodí KeyError, kterej nechcem |
129 |
159 |
raise AttributeError |
raise AttributeError |
130 |
160 |
|
|
|
... |
... |
class CandyBox: |
175 |
205 |
# zjednodušený join |
# zjednodušený join |
176 |
206 |
sample_len = len(cb.sampling_plan) |
sample_len = len(cb.sampling_plan) |
177 |
207 |
for key in cb.kwargs: |
for key in cb.kwargs: |
|
208 |
|
# ani nebudu kontrolovat |
|
209 |
|
#if isinstance(key, np.ndarray): |
|
210 |
|
|
178 |
211 |
if key in input.kwargs: |
if key in input.kwargs: |
179 |
|
cb.kwargs[key] = (*cb.kwargs[key], *input.kwargs[key]) |
|
|
212 |
|
cb.kwargs[key] = np.append(cb.kwargs[key], input.kwargs[key]) |
180 |
213 |
else: |
else: |
181 |
214 |
fill_len = sample_len - len(cb.kwargs[key]) |
fill_len = sample_len - len(cb.kwargs[key]) |
182 |
215 |
full = (None for __ in range(fill_len)) |
full = (None for __ in range(fill_len)) |
183 |
|
cb.kwargs[key] = (*cb.kwargs[key], *full) |
|
|
216 |
|
cb.kwargs[key] = np.append(cb.kwargs[key], (*full,)) |
184 |
217 |
|
|
185 |
218 |
|
|
186 |
219 |
else: # nesladký vstup |
else: # nesladký vstup |
|
... |
... |
class CandyBox: |
195 |
228 |
for key in cb.kwargs: |
for key in cb.kwargs: |
196 |
229 |
fill_len = sample_len - len(cb.kwargs[key]) |
fill_len = sample_len - len(cb.kwargs[key]) |
197 |
230 |
full = (None for __ in range(fill_len)) |
full = (None for __ in range(fill_len)) |
198 |
|
cb.kwargs[key] = (*cb.kwargs[key], *full) |
|
|
231 |
|
cb.kwargs[key] = np.append(cb.kwargs[key], (*full,)) |
199 |
232 |
|
|
200 |
233 |
|
|
201 |
|
# we'll see, if .new_sample will be needed |
|
202 |
|
#def new_sample(cb, input): pass |
|
|
234 |
|
# we'll see, if .new_sample will be needed |
|
235 |
|
# year, we need it |
|
236 |
|
# мыным выль сэмпл кулэ! |
|
237 |
|
def new_sample(cb, input): |
|
238 |
|
# čo to je za vstup? |
|
239 |
|
if hasattr(input, 'sampling_plan'): #sweety_input: |
|
240 |
|
# if pandas |
|
241 |
|
if hasattr(input, 'df'): |
|
242 |
|
return CandyBox(cb.sampling_plan.new_sample(input.sampling_plan), df=input.df) |
|
243 |
|
|
|
244 |
|
# if there is no pandas DataFrame |
|
245 |
|
# we suppose there is dictionary in input.kwargs |
|
246 |
|
else: |
|
247 |
|
return CandyBox(cb.sampling_plan.new_sample(input.sampling_plan), **input.kwargs) |
|
248 |
|
|
|
249 |
|
# nesladký vstup |
|
250 |
|
else: |
|
251 |
|
return cb.sampling_plan.new_sample(input) |
|
252 |
|
|
|
253 |
|
|
|
254 |
|
|
|
255 |
|
|
|
256 |
|
|
203 |
257 |
|
|
204 |
258 |
def consistency_check(cb): |
def consistency_check(cb): |
205 |
259 |
# řvat na celé město nebudeme |
# řvat na celé město nebudeme |