facebookexperimental / facebookexperimental/Robyn
Error in paretor_optimixer.optimize()
- Dominant language
- Jupyter Notebook
- Stars
- 1.5k
- Forks
- 433
- PR merge metrics
- No merged PRs in 30d
Description
Using the new robynpy==0.3.5, I am running into a KeyError: "['ds'] not found in axis" issue when running the **pareto_optimizer.optimize()** function. I have experienced this before and seemed to have been fixed with a previous update, but am running into this again with the new update. Below is the full error message I am getting.
```
KeyError: "['ds'] not found in axis"
File , line 9
4 pareto_optimizer = ParetoOptimizer(
5 mmm_data, output_models, hyperparameters, featurized_mmm_data, holidays_data
6 )
8 # 4. Run optimize function
----> 9 pareto_result = pareto_optimizer.optimize(pareto_fronts="auto", min_candidates=50)
File /local_disk0/.ephemeral_nfs/envs/pythonEnv-3e35a112-080b-4523-a46c-012b516296f1/lib/python3.10/site-packages/robyn/modeling/pareto/pareto_optimizer.py:142, in ParetoOptimizer.optimize(self, pareto_fronts, min_candidates, calibration_constraint, calibrated)
136 pareto_data = self.prepare_pareto_data(
137 aggregated_data, pareto_fronts, min_candidates, calibrated
138 )
139 pareto_data = self.response_curve_calculator.compute_response_curves(
140 pareto_data, aggregated_data
141 )
--> 142 plotting_data = self.plot_data_generator.generate_plot_data(
143 aggregated_data, pareto_data
144 )
146 self.logger.info("Pareto optimization completed successfully")
147 return ParetoResult(
148 pareto_solutions=plotting_data["pareto_solutions"],
149 pareto_fronts=max(pareto_data.pareto_fronts),
(...)
156 df_caov_pct_all=plotting_data["df_caov_pct_all"],
157 )
File /local_disk0/.ephemeral_nfs/envs/pythonEnv-3e35a112-080b-4523-a46c-012b516296f1/lib/python3.10/site-packages/robyn/modeling/pareto/plot_data_generator.py:104, in PlotDataGenerator.generate_plot_data(self, aggregated_data, pareto_data)
102 except Exception as e:
103 self.logger.error(f"Error processing solution {sid}: {str(e)}")
--> 104 raise e
106 pareto_solutions = set()
107 if "sol_id" in xDecompVecCollect.columns:
File /local_disk0/.ephemeral_nfs/envs/pythonEnv-3e35a112-080b-4523-a46c-012b516296f1/lib/python3.10/site-packages/robyn/modeling/pareto/plot_data_generator.py:77, in PlotDataGenerator.generate_plot_data(self, aggregated_data, pareto_data)
75 for sid in tqdm(uniqueSol, desc="Processing Solutions", unit="solution"):
76 try:
---> 77 plot_results = self._process_single_solution(
78 sid,
79 plotMediaShare,
80 plotWaterfall,
81 pareto_data,
82 aggregated_data,
83 dt_mod,
84 dt_modRollWind,
85 rw_start_loc,
86 rw_end_loc,
87 )
89 mediaVecCollect = pd.concat(
90 [mediaVecCollect, plot_results["mediaVecCollect"]],
91 ignore_index=True,
92 )
93 xDecompVecCollect = pd.concat(
94 [xDecompVecCollect, plot_results["xDecompVec"]],
95 ignore_index=True,
96 )
File /local_disk0/.ephemeral_nfs/envs/pythonEnv-3e35a112-080b-4523-a46c-012b516296f1/lib/python3.10/site-packages/robyn/modeling/pareto/plot_data_generator.py:293, in PlotDataGenerator._process_single_solution(self, sid, plotMediaShare, plotWaterfall, pareto_data, aggregated_data, dt_mod, dt_modRollWind, rw_start_loc, rw_end_loc)
290 self.logger.debug(f"Generated plot6data, fitted vs residual, for sid: {sid}")
292 # 7. Immediate vs carryover response
--> 293 plot7data = self.robyn_immcarr(
294 pareto_data, aggregated_data["result_hyp_param"], sid
295 )
296 self.logger.debug(
297 f"Generated plot7data, immediate vs carryover, for sid: {sid}"
298 )
299 mediaVecCollect = pd.concat(
300 [
301 dt_transformPlot.assign(type="rawMedia", sol_id=sid),
(...)
311 ignore_index=True,
312 )
File /local_disk0/.ephemeral_nfs/envs/pythonEnv-3e35a112-080b-4523-a46c-012b516296f1/lib/python3.10/site-packages/robyn/modeling/pareto/plot_data_generator.py:747, in PlotDataGenerator.robyn_immcarr(self, pareto_data, result_hyp_param, sol_id, start_date, end_date)
745 vec_collect["xDecompVec"]["ds"] = vec_collect["xDecompVec"]["ds"].astype(str)
746 # Calculate carryover percentages
--> 747 df_caov = (
748 vec_collect["xDecompVecCarryover"].groupby("sol_id").sum().reset_index()
749 ).drop(columns="ds")
750 df_total = (
751 vec_collect["xDecompVec"]
752 .groupby("sol_id")
(...)
755 .drop(columns="ds")
756 )
757 df_caov_pct = df_caov.copy()
File /databricks/python/lib/python3.10/site-packages/pandas/util/_decorators.py:331, in deprecate_nonkeyword_arguments..decorate..wrapper(*args, **kwargs)
325 if len(args) > num_allow_args:
326 warnings.warn(
327 msg.format(arguments=_format_argument_list(allow_args)),
328 FutureWarning,
329 stacklevel=find_stack_level(),
330 )
--> 331 return func(*args, **kwargs)
File /databricks/python/lib/python3.10/site-packages/pandas/core/frame.py:5399, in DataFrame.drop(self, labels, axis, index, columns, level, inplace, errors)
5251 @deprecate_nonkeyword_arguments(version=None, allowed_args=["self", "labels"])
5252 def drop( # type: ignore[override]
5253 self,
(...)
5260 errors: IgnoreRaise = "raise",
5261 ) -> DataFrame | None:
5262 """
5263 Drop specified labels from rows or columns.
5264
(...)
5397 weight 1.0 0.8
5398 """
-> 5399 return super().drop(
5400 labels=labels,
5401 axis=axis,
5402 index=index,
5403 columns=columns,
5404 level=level,
5405 inplace=inplace,
5406 errors=errors,
5407 )
File /databricks/python/lib/python3.10/site-packages/pandas/util/_decorators.py:331, in deprecate_nonkeyword_arguments..decorate..wrapper(*args, **kwargs)
325 if len(args) > num_allow_args:
326 warnings.warn(
327 msg.format(arguments=_format_argument_list(allow_args)),
328 FutureWarning,
329 stacklevel=find_stack_level(),
330 )
--> 331 return func(*args, **kwargs)
File /databricks/python/lib/python3.10/site-packages/pandas/core/generic.py:4505, in NDFrame.drop(self, labels, axis, index, columns, level, inplace, errors)
4503 for axis, labels in axes.items():
4504 if labels is not None:
-> 4505 obj = obj._drop_axis(labels, axis, level=level, errors=errors)
4507 if inplace:
4508 self._update_inplace(obj)
File /databricks/python/lib/python3.10/site-packages/pandas/core/generic.py:4546, in NDFrame._drop_axis(self, labels, axis, level, errors, only_slice)
4544 new_axis = axis.drop(labels, level=level, errors=errors)
4545 else:
-> 4546 new_axis = axis.drop(labels, errors=errors)
4547 indexer = axis.get_indexer(new_axis)
4549 # Case for non-unique axis
4550 else:
File /databricks/python/lib/python3.10/site-packages/pandas/core/indexes/base.py:6934, in Index.drop(self, labels, errors)
6932 if mask.any():
6933 if errors != "ignore":
-> 6934 raise KeyError(f"{list(labels[mask])} not found in axis")
6935 indexer = indexer[~mask]
6936 return self.delete(indexer)
```
Contributor guide
Assessment
This issue has not been assessed yet.