|
26 | 26 | "id": "a7dc85d4", |
27 | 27 | "metadata": { |
28 | 28 | "execution": { |
29 | | - "iopub.execute_input": "2026-04-15T11:48:46.950173Z", |
30 | | - "iopub.status.busy": "2026-04-15T11:48:46.949455Z", |
31 | | - "iopub.status.idle": "2026-04-15T11:48:51.464433Z", |
32 | | - "shell.execute_reply": "2026-04-15T11:48:51.461888Z" |
| 29 | + "iopub.execute_input": "2026-04-15T12:51:31.970528Z", |
| 30 | + "iopub.status.busy": "2026-04-15T12:51:31.970334Z", |
| 31 | + "iopub.status.idle": "2026-04-15T12:51:33.760421Z", |
| 32 | + "shell.execute_reply": "2026-04-15T12:51:33.759220Z" |
33 | 33 | } |
34 | 34 | }, |
35 | 35 | "outputs": [], |
|
77 | 77 | "id": "34eb1d72", |
78 | 78 | "metadata": { |
79 | 79 | "execution": { |
80 | | - "iopub.execute_input": "2026-04-15T11:48:51.473375Z", |
81 | | - "iopub.status.busy": "2026-04-15T11:48:51.472289Z", |
82 | | - "iopub.status.idle": "2026-04-15T11:48:51.528923Z", |
83 | | - "shell.execute_reply": "2026-04-15T11:48:51.526616Z" |
| 80 | + "iopub.execute_input": "2026-04-15T12:51:33.763410Z", |
| 81 | + "iopub.status.busy": "2026-04-15T12:51:33.763012Z", |
| 82 | + "iopub.status.idle": "2026-04-15T12:51:33.787338Z", |
| 83 | + "shell.execute_reply": "2026-04-15T12:51:33.786535Z" |
84 | 84 | } |
85 | 85 | }, |
86 | 86 | "outputs": [ |
|
184 | 184 | "df['accept'] = np.random.binomial(1, p)\n", |
185 | 185 | "\n", |
186 | 186 | "# Если у вас есть logged propensity, храните её в отдельной колонке\n", |
| 187 | + "# Важно: в реальных данных propensity_A должна логироваться исторической policy A,\n", |
| 188 | + "# а не придумываться вручную как в этом synthetic-демо.\n", |
| 189 | + "# Если истинная logged propensity недоступна, используйте propensity_source='estimated'\n", |
| 190 | + "# (или auto fallback) и интерпретируйте результат осторожнее.\n", |
187 | 191 | "df['propensity_A'] = np.random.uniform(0.05, 0.95, size=n)\n", |
188 | 192 | "\n", |
189 | 193 | "# Шаг 1: формализуем контракт данных\n", |
|
222 | 226 | "id": "2b792b2f", |
223 | 227 | "metadata": { |
224 | 228 | "execution": { |
225 | | - "iopub.execute_input": "2026-04-15T11:48:51.534425Z", |
226 | | - "iopub.status.busy": "2026-04-15T11:48:51.533667Z", |
227 | | - "iopub.status.idle": "2026-04-15T11:49:06.388899Z", |
228 | | - "shell.execute_reply": "2026-04-15T11:49:06.386732Z" |
| 229 | + "iopub.execute_input": "2026-04-15T12:51:33.789745Z", |
| 230 | + "iopub.status.busy": "2026-04-15T12:51:33.789542Z", |
| 231 | + "iopub.status.idle": "2026-04-15T12:51:38.519607Z", |
| 232 | + "shell.execute_reply": "2026-04-15T12:51:38.518761Z" |
229 | 233 | } |
230 | 234 | }, |
231 | 235 | "outputs": [ |
|
254 | 258 | "\n", |
255 | 259 | " def action_probs(self, x: pd.DataFrame) -> np.ndarray:\n", |
256 | 260 | " a = x[self.action_col].to_numpy()\n", |
| 261 | + " unknown = sorted({act for act in np.unique(a) if act not in self._idx})\n", |
| 262 | + " if unknown:\n", |
| 263 | + " raise ValueError(\n", |
| 264 | + " f\"Unknown actions in column '{self.action_col}': {unknown}. \"\n", |
| 265 | + " f\"Known action_space: {self.action_space}\"\n", |
| 266 | + " )\n", |
257 | 267 | " probs = np.zeros((len(x), len(self.action_space)), dtype=float)\n", |
258 | 268 | " for i, act in enumerate(a):\n", |
259 | | - " j = self._idx.get(act)\n", |
260 | | - " if j is not None:\n", |
261 | | - " probs[i, j] = 1.0\n", |
| 269 | + " probs[i, self._idx[act]] = 1.0\n", |
262 | 270 | " return probs\n", |
263 | 271 | "\n", |
264 | 272 | "# Мини-демо: эмулируем колонку action_B и сравнение через compare_policies\n", |
|
313 | 321 | "id": "540f2f9b", |
314 | 322 | "metadata": { |
315 | 323 | "execution": { |
316 | | - "iopub.execute_input": "2026-04-15T11:49:06.400372Z", |
317 | | - "iopub.status.busy": "2026-04-15T11:49:06.399109Z", |
318 | | - "iopub.status.idle": "2026-04-15T11:49:06.412147Z", |
319 | | - "shell.execute_reply": "2026-04-15T11:49:06.409880Z" |
| 324 | + "iopub.execute_input": "2026-04-15T12:51:38.526806Z", |
| 325 | + "iopub.status.busy": "2026-04-15T12:51:38.526452Z", |
| 326 | + "iopub.status.idle": "2026-04-15T12:51:38.534354Z", |
| 327 | + "shell.execute_reply": "2026-04-15T12:51:38.532784Z" |
320 | 328 | } |
321 | 329 | }, |
322 | 330 | "outputs": [], |
|
351 | 359 | "id": "7c240d61", |
352 | 360 | "metadata": { |
353 | 361 | "execution": { |
354 | | - "iopub.execute_input": "2026-04-15T11:49:06.417844Z", |
355 | | - "iopub.status.busy": "2026-04-15T11:49:06.417305Z", |
356 | | - "iopub.status.idle": "2026-04-15T11:49:36.897842Z", |
357 | | - "shell.execute_reply": "2026-04-15T11:49:36.893050Z" |
| 362 | + "iopub.execute_input": "2026-04-15T12:51:38.536240Z", |
| 363 | + "iopub.status.busy": "2026-04-15T12:51:38.536072Z", |
| 364 | + "iopub.status.idle": "2026-04-15T12:51:48.413851Z", |
| 365 | + "shell.execute_reply": "2026-04-15T12:51:48.411129Z" |
358 | 366 | } |
359 | 367 | }, |
360 | 368 | "outputs": [ |
|
421 | 429 | "id": "1fd6d1d4", |
422 | 430 | "metadata": { |
423 | 431 | "execution": { |
424 | | - "iopub.execute_input": "2026-04-15T11:49:36.904965Z", |
425 | | - "iopub.status.busy": "2026-04-15T11:49:36.904343Z", |
426 | | - "iopub.status.idle": "2026-04-15T11:50:20.869170Z", |
427 | | - "shell.execute_reply": "2026-04-15T11:50:20.865727Z" |
| 432 | + "iopub.execute_input": "2026-04-15T12:51:48.416283Z", |
| 433 | + "iopub.status.busy": "2026-04-15T12:51:48.415590Z", |
| 434 | + "iopub.status.idle": "2026-04-15T12:52:02.311901Z", |
| 435 | + "shell.execute_reply": "2026-04-15T12:52:02.309828Z" |
428 | 436 | } |
429 | 437 | }, |
430 | 438 | "outputs": [ |
|
0 commit comments