spells-mtg 0.3.1__py3-none-any.whl → 0.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of spells-mtg might be problematic. Click here for more details.

spells/columns.py CHANGED
@@ -7,25 +7,21 @@ from spells.enums import View, ColName, ColType
7
7
 
8
8
 
9
9
  @dataclass(frozen=True)
10
- class ColumnSpec:
10
+ class ColSpec:
11
11
  name: str
12
12
  col_type: ColType
13
- expr: pl.Expr | None = None
14
- exprMap: Callable[[str], pl.Expr] | None = None
13
+ expr: pl.Expr | Callable[..., pl.Expr] | None = None
15
14
  views: list[View] | None = None
16
- dependencies: list[str] | None = None
17
- version: str | None = (
18
- None # only needed for user-defined functions with python functions in expr
19
- )
15
+ version: str | None = None
20
16
 
21
17
 
22
18
  @dataclass(frozen=True)
23
- class ColumnDefinition:
19
+ class ColDef:
24
20
  name: str
25
21
  col_type: ColType
26
22
  expr: pl.Expr | tuple[pl.Expr, ...]
27
23
  views: set[View]
28
- dependencies: tuple[str, ...]
24
+ dependencies: set[str]
29
25
  signature: str
30
26
 
31
27
 
@@ -46,718 +42,641 @@ default_columns = [
46
42
  ]
47
43
 
48
44
  _column_specs = [
49
- ColumnSpec(
45
+ ColSpec(
50
46
  name=ColName.NAME,
51
47
  col_type=ColType.GROUP_BY,
52
- # handled by internals, derived from both 'pick' and "name mapped" columns
48
+ views=[View.CARD],
53
49
  ),
54
- ColumnSpec(
50
+ ColSpec(
55
51
  name=ColName.EXPANSION,
56
52
  col_type=ColType.GROUP_BY,
57
53
  views=[View.GAME, View.DRAFT],
58
54
  ),
59
- ColumnSpec(
55
+ ColSpec(
60
56
  name=ColName.EVENT_TYPE,
61
57
  col_type=ColType.GROUP_BY,
62
58
  views=[View.GAME, View.DRAFT],
63
59
  ),
64
- ColumnSpec(
60
+ ColSpec(
65
61
  name=ColName.DRAFT_ID,
66
62
  views=[View.GAME, View.DRAFT],
67
63
  col_type=ColType.FILTER_ONLY,
68
64
  ),
69
- ColumnSpec(
65
+ ColSpec(
70
66
  name=ColName.DRAFT_TIME,
71
67
  col_type=ColType.FILTER_ONLY,
72
68
  views=[View.GAME, View.DRAFT],
73
69
  ),
74
- ColumnSpec(
70
+ ColSpec(
75
71
  name=ColName.DRAFT_DATE,
76
72
  col_type=ColType.GROUP_BY,
77
- expr=pl.col("draft_time").str.to_datetime("%Y-%m-%d %H:%M:%S").dt.date(),
78
- dependencies=[ColName.DRAFT_TIME],
73
+ expr=pl.col(ColName.DRAFT_TIME).str.to_datetime("%Y-%m-%d %H:%M:%S").dt.date(),
79
74
  ),
80
- ColumnSpec(
75
+ ColSpec(
81
76
  name=ColName.DRAFT_DAY_OF_WEEK,
82
77
  col_type=ColType.GROUP_BY,
83
- expr=pl.col("draft_time").str.to_datetime("%Y-%m-%d %H:%M:%S").dt.weekday(),
84
- dependencies=[ColName.DRAFT_TIME],
78
+ expr=pl.col(ColName.DRAFT_TIME).str.to_datetime("%Y-%m-%d %H:%M:%S").dt.weekday(),
85
79
  ),
86
- ColumnSpec(
80
+ ColSpec(
87
81
  name=ColName.DRAFT_HOUR,
88
82
  col_type=ColType.GROUP_BY,
89
- expr=pl.col("draft_time").str.to_datetime("%Y-%m-%d %H:%M:%S").dt.hour(),
90
- dependencies=[ColName.DRAFT_TIME],
83
+ expr=pl.col(ColName.DRAFT_TIME).str.to_datetime("%Y-%m-%d %H:%M:%S").dt.hour(),
91
84
  ),
92
- ColumnSpec(
85
+ ColSpec(
93
86
  name=ColName.DRAFT_WEEK,
94
87
  col_type=ColType.GROUP_BY,
95
- expr=pl.col("draft_time").str.to_datetime("%Y-%m-%d %H:%M:%S").dt.week(),
96
- dependencies=[ColName.DRAFT_TIME],
88
+ expr=pl.col(ColName.DRAFT_TIME).str.to_datetime("%Y-%m-%d %H:%M:%S").dt.week(),
97
89
  ),
98
- ColumnSpec(
90
+ ColSpec(
99
91
  name=ColName.RANK,
100
92
  col_type=ColType.GROUP_BY,
101
93
  views=[View.GAME, View.DRAFT],
102
94
  ),
103
- ColumnSpec(
95
+ ColSpec(
104
96
  name=ColName.USER_N_GAMES_BUCKET,
105
97
  col_type=ColType.GROUP_BY,
106
98
  views=[View.DRAFT, View.GAME],
107
99
  ),
108
- ColumnSpec(
100
+ ColSpec(
109
101
  name=ColName.USER_GAME_WIN_RATE_BUCKET,
110
102
  col_type=ColType.GROUP_BY,
111
103
  views=[View.DRAFT, View.GAME],
112
104
  ),
113
- ColumnSpec(
105
+ ColSpec(
114
106
  name=ColName.PLAYER_COHORT,
115
107
  col_type=ColType.GROUP_BY,
116
- expr=pl.when(pl.col("user_n_games_bucket") < 100)
108
+ expr=pl.when(pl.col(ColName.USER_N_GAMES_BUCKET) < 100)
117
109
  .then(pl.lit("Other"))
118
110
  .otherwise(
119
- pl.when(pl.col("user_game_win_rate_bucket") > 0.57)
111
+ pl.when(pl.col(ColName.USER_GAME_WIN_RATE_BUCKET) > 0.57)
120
112
  .then(pl.lit("Top"))
121
113
  .otherwise(
122
- pl.when(pl.col("user_game_win_rate_bucket") < 0.49)
114
+ pl.when(pl.col(ColName.USER_GAME_WIN_RATE_BUCKET) < 0.49)
123
115
  .then(pl.lit("Bottom"))
124
116
  .otherwise(pl.lit("Middle"))
125
117
  )
126
118
  ),
127
- dependencies=[ColName.USER_N_GAMES_BUCKET, ColName.USER_GAME_WIN_RATE_BUCKET],
128
119
  ),
129
- ColumnSpec(
120
+ ColSpec(
130
121
  name=ColName.EVENT_MATCH_WINS,
131
122
  col_type=ColType.GROUP_BY,
132
123
  views=[View.DRAFT],
133
124
  ),
134
- ColumnSpec(
125
+ ColSpec(
135
126
  name=ColName.EVENT_MATCH_WINS_SUM,
136
127
  col_type=ColType.PICK_SUM,
137
128
  views=[View.DRAFT],
138
129
  expr=pl.col(ColName.EVENT_MATCH_WINS),
139
- dependencies=[ColName.EVENT_MATCH_WINS],
140
130
  ),
141
- ColumnSpec(
131
+ ColSpec(
142
132
  name=ColName.EVENT_MATCH_LOSSES,
143
133
  col_type=ColType.GROUP_BY,
144
134
  views=[View.DRAFT],
145
135
  ),
146
- ColumnSpec(
136
+ ColSpec(
147
137
  name=ColName.EVENT_MATCH_LOSSES_SUM,
148
138
  col_type=ColType.PICK_SUM,
149
139
  expr=pl.col(ColName.EVENT_MATCH_LOSSES),
150
- dependencies=[ColName.EVENT_MATCH_LOSSES],
151
140
  ),
152
- ColumnSpec(
141
+ ColSpec(
153
142
  name=ColName.EVENT_MATCHES,
154
143
  col_type=ColType.GROUP_BY,
155
- expr=pl.col("event_match_wins") + pl.col("event_match_losses"),
156
- dependencies=[ColName.EVENT_MATCH_WINS, ColName.EVENT_MATCH_LOSSES],
144
+ expr=pl.col(ColName.EVENT_MATCH_WINS) + pl.col(ColName.EVENT_MATCH_LOSSES),
157
145
  ),
158
- ColumnSpec(
146
+ ColSpec(
159
147
  name=ColName.EVENT_MATCHES_SUM,
160
148
  col_type=ColType.PICK_SUM,
161
149
  expr=pl.col(ColName.EVENT_MATCHES),
162
- dependencies=[ColName.EVENT_MATCHES],
163
150
  ),
164
- ColumnSpec(
151
+ ColSpec(
165
152
  name=ColName.IS_TROPHY,
166
153
  col_type=ColType.GROUP_BY,
167
- expr=pl.when(pl.col("event_type") == "Traditional")
168
- .then(pl.col("event_match_wins") == 3)
169
- .otherwise(pl.col("event_match_wins") == 7),
170
- dependencies=[ColName.EVENT_TYPE, ColName.EVENT_MATCH_WINS],
154
+ expr=pl.when(pl.col(ColName.EVENT_TYPE) == "Traditional")
155
+ .then(pl.col(ColName.EVENT_MATCH_WINS) == 3)
156
+ .otherwise(pl.col(ColName.EVENT_MATCH_WINS) == 7),
171
157
  ),
172
- ColumnSpec(
158
+ ColSpec(
173
159
  name=ColName.IS_TROPHY_SUM,
174
160
  col_type=ColType.PICK_SUM,
175
161
  expr=pl.col(ColName.IS_TROPHY),
176
- dependencies=[ColName.IS_TROPHY],
177
162
  ),
178
- ColumnSpec(
163
+ ColSpec(
179
164
  name=ColName.PACK_NUMBER,
180
165
  col_type=ColType.FILTER_ONLY, # use pack_num
181
166
  views=[View.DRAFT],
182
167
  ),
183
- ColumnSpec(
168
+ ColSpec(
184
169
  name=ColName.PACK_NUM,
185
170
  col_type=ColType.GROUP_BY,
186
- expr=pl.col("pack_number") + 1,
187
- dependencies=[ColName.PACK_NUMBER],
171
+ expr=pl.col(ColName.PACK_NUMBER) + 1,
188
172
  ),
189
- ColumnSpec(
173
+ ColSpec(
190
174
  name=ColName.PICK_NUMBER,
191
175
  col_type=ColType.FILTER_ONLY, # use pick_num
192
176
  views=[View.DRAFT],
193
177
  ),
194
- ColumnSpec(
178
+ ColSpec(
195
179
  name=ColName.PICK_NUM,
196
180
  col_type=ColType.GROUP_BY,
197
- expr=pl.col("pick_number") + 1,
198
- dependencies=[ColName.PICK_NUMBER],
181
+ expr=pl.col(ColName.PICK_NUMBER) + 1,
199
182
  ),
200
- ColumnSpec(
183
+ ColSpec(
201
184
  name=ColName.TAKEN_AT,
202
185
  col_type=ColType.PICK_SUM,
203
186
  expr=pl.col(ColName.PICK_NUM),
204
- dependencies=[ColName.PICK_NUM],
205
187
  ),
206
- ColumnSpec(
188
+ ColSpec(
207
189
  name=ColName.NUM_TAKEN,
208
190
  col_type=ColType.PICK_SUM,
209
191
  expr=pl.when(pl.col(ColName.PICK).is_not_null())
210
192
  .then(1)
211
- .otherwise(0), # a literal returns one row under select alone
212
- dependencies=[ColName.PICK],
193
+ .otherwise(0),
194
+ ),
195
+ ColSpec(
196
+ name=ColName.NUM_DRAFTS,
197
+ col_type=ColType.PICK_SUM,
198
+ expr=pl.when((pl.col(ColName.PACK_NUMBER) == 0) & (pl.col(ColName.PICK_NUMBER) == 0)).then(1).otherwise(0),
213
199
  ),
214
- ColumnSpec(
200
+ ColSpec(
215
201
  name=ColName.PICK,
216
- col_type=ColType.FILTER_ONLY, # aggregated as "name"
202
+ col_type=ColType.FILTER_ONLY,
217
203
  views=[View.DRAFT],
218
204
  ),
219
- ColumnSpec(
205
+ ColSpec(
220
206
  name=ColName.PICK_MAINDECK_RATE,
221
207
  col_type=ColType.PICK_SUM,
222
208
  views=[View.DRAFT],
223
209
  ),
224
- ColumnSpec(
210
+ ColSpec(
225
211
  name=ColName.PICK_SIDEBOARD_IN_RATE,
226
212
  col_type=ColType.PICK_SUM,
227
213
  views=[View.DRAFT],
228
214
  ),
229
- ColumnSpec(
215
+ ColSpec(
230
216
  name=ColName.PACK_CARD,
231
217
  col_type=ColType.NAME_SUM,
232
218
  views=[View.DRAFT],
233
219
  ),
234
- ColumnSpec(
220
+ ColSpec(
235
221
  name=ColName.LAST_SEEN,
236
222
  col_type=ColType.NAME_SUM,
237
- exprMap=lambda name: pl.col(f"pack_card_{name}")
238
- * pl.min_horizontal("pick_num", 8),
239
- dependencies=[ColName.PACK_CARD, ColName.PICK_NUM],
223
+ expr=lambda name: pl.col(f"pack_card_{name}")
224
+ * pl.min_horizontal(ColName.PICK_NUM, 8),
240
225
  ),
241
- ColumnSpec(
226
+ ColSpec(
242
227
  name=ColName.NUM_SEEN,
243
228
  col_type=ColType.NAME_SUM,
244
- exprMap=lambda name: pl.col(f"pack_card_{name}") * (pl.col("pick_num") <= 8),
245
- dependencies=[ColName.PACK_CARD, ColName.PICK_NUM],
229
+ expr=lambda name: pl.col(f"pack_card_{name}") * (pl.col(ColName.PICK_NUM) <= 8),
246
230
  ),
247
- ColumnSpec(
231
+ ColSpec(
248
232
  name=ColName.POOL,
249
233
  col_type=ColType.NAME_SUM,
250
234
  views=[View.DRAFT],
251
235
  ),
252
- ColumnSpec(
236
+ ColSpec(
253
237
  name=ColName.GAME_TIME,
254
238
  col_type=ColType.FILTER_ONLY,
255
239
  views=[View.GAME],
256
240
  ),
257
- ColumnSpec(
241
+ ColSpec(
258
242
  name=ColName.GAME_DATE,
259
243
  col_type=ColType.GROUP_BY,
260
- expr=pl.col("game_time").str.to_datetime("%Y-%m-%d %H-%M-%S").dt.date(),
261
- dependencies=[ColName.GAME_TIME],
244
+ expr=pl.col(ColName.GAME_TIME).str.to_datetime("%Y-%m-%d %H-%M-%S").dt.date(),
262
245
  ),
263
- ColumnSpec(
246
+ ColSpec(
264
247
  name=ColName.GAME_DAY_OF_WEEK,
265
248
  col_type=ColType.GROUP_BY,
266
- expr=pl.col("game_time").str.to_datetime("%Y-%m-%d %H-%M-%S").dt.weekday(),
267
- dependencies=[ColName.GAME_TIME],
249
+ expr=pl.col(ColName.GAME_TIME).str.to_datetime("%Y-%m-%d %H-%M-%S").dt.weekday(),
268
250
  ),
269
- ColumnSpec(
251
+ ColSpec(
270
252
  name=ColName.GAME_HOUR,
271
253
  col_type=ColType.GROUP_BY,
272
- expr=pl.col("game_time").str.to_datetime("%Y-%m-%d %H-%M-%S").dt.hour(),
273
- dependencies=[ColName.GAME_TIME],
254
+ expr=pl.col(ColName.GAME_TIME).str.to_datetime("%Y-%m-%d %H-%M-%S").dt.hour(),
274
255
  ),
275
- ColumnSpec(
256
+ ColSpec(
276
257
  name=ColName.GAME_WEEK,
277
258
  col_type=ColType.GROUP_BY,
278
- expr=pl.col("game_time").str.to_datetime("%Y-%m-%d %H-%M-%S").dt.week(),
279
- dependencies=[ColName.GAME_TIME],
259
+ expr=pl.col(ColName.GAME_TIME).str.to_datetime("%Y-%m-%d %H-%M-%S").dt.week(),
280
260
  ),
281
- ColumnSpec(
261
+ ColSpec(
282
262
  name=ColName.BUILD_INDEX,
283
263
  col_type=ColType.GROUP_BY,
284
264
  views=[View.GAME],
285
265
  ),
286
- ColumnSpec(
266
+ ColSpec(
287
267
  name=ColName.MATCH_NUMBER,
288
268
  col_type=ColType.GROUP_BY,
289
269
  views=[View.GAME],
290
270
  ),
291
- ColumnSpec(
271
+ ColSpec(
292
272
  name=ColName.GAME_NUMBER,
293
273
  col_type=ColType.GROUP_BY,
294
274
  views=[View.GAME],
295
275
  ),
296
- ColumnSpec(
276
+ ColSpec(
297
277
  name=ColName.NUM_GAMES,
298
278
  col_type=ColType.GAME_SUM,
299
279
  expr=pl.col(ColName.GAME_NUMBER).is_not_null(),
300
- dependencies=[ColName.GAME_NUMBER],
301
280
  ),
302
- ColumnSpec(
281
+ ColSpec(
303
282
  name=ColName.NUM_MATCHES,
304
283
  col_type=ColType.GAME_SUM,
305
284
  expr=pl.col(ColName.GAME_NUMBER) == 1,
306
- dependencies=[ColName.GAME_NUMBER],
307
285
  ),
308
- ColumnSpec(
286
+ ColSpec(
309
287
  name=ColName.NUM_EVENTS,
310
288
  col_type=ColType.GAME_SUM,
311
289
  expr=(pl.col(ColName.GAME_NUMBER) == 1) & (pl.col(ColName.MATCH_NUMBER) == 1),
312
- dependencies=[ColName.GAME_NUMBER, ColName.MATCH_NUMBER],
313
290
  ),
314
- ColumnSpec(
291
+ ColSpec(
315
292
  name=ColName.OPP_RANK,
316
293
  col_type=ColType.GROUP_BY,
317
294
  views=[View.GAME],
318
295
  ),
319
- ColumnSpec(
296
+ ColSpec(
320
297
  name=ColName.MAIN_COLORS,
321
298
  col_type=ColType.GROUP_BY,
322
299
  views=[View.GAME],
323
300
  ),
324
- ColumnSpec(
301
+ ColSpec(
325
302
  name=ColName.NUM_COLORS,
326
303
  col_type=ColType.GROUP_BY,
327
304
  expr=pl.col(ColName.MAIN_COLORS).str.len_chars(),
328
- dependencies=[ColName.MAIN_COLORS],
329
305
  ),
330
- ColumnSpec(
306
+ ColSpec(
331
307
  name=ColName.SPLASH_COLORS,
332
308
  col_type=ColType.GROUP_BY,
333
309
  views=[View.GAME],
334
310
  ),
335
- ColumnSpec(
311
+ ColSpec(
336
312
  name=ColName.HAS_SPLASH,
337
313
  col_type=ColType.GROUP_BY,
338
314
  expr=pl.col(ColName.SPLASH_COLORS).str.len_chars() > 0,
339
- dependencies=[ColName.SPLASH_COLORS],
340
315
  ),
341
- ColumnSpec(
316
+ ColSpec(
342
317
  name=ColName.ON_PLAY,
343
318
  col_type=ColType.GROUP_BY,
344
319
  views=[View.GAME],
345
320
  ),
346
- ColumnSpec(
321
+ ColSpec(
347
322
  name=ColName.NUM_ON_PLAY,
348
323
  col_type=ColType.GAME_SUM,
349
324
  expr=pl.col(ColName.ON_PLAY),
350
- dependencies=[ColName.ON_PLAY],
351
325
  ),
352
- ColumnSpec(
326
+ ColSpec(
353
327
  name=ColName.NUM_MULLIGANS,
354
328
  col_type=ColType.GROUP_BY,
355
329
  views=[View.GAME],
356
330
  ),
357
- ColumnSpec(
331
+ ColSpec(
358
332
  name=ColName.NUM_MULLIGANS_SUM,
359
333
  col_type=ColType.GAME_SUM,
360
334
  expr=pl.col(ColName.NUM_MULLIGANS),
361
- dependencies=[ColName.NUM_MULLIGANS],
362
335
  ),
363
- ColumnSpec(
336
+ ColSpec(
364
337
  name=ColName.OPP_NUM_MULLIGANS,
365
338
  col_type=ColType.GAME_SUM,
366
339
  views=[View.GAME],
367
340
  ),
368
- ColumnSpec(
341
+ ColSpec(
369
342
  name=ColName.OPP_NUM_MULLIGANS_SUM,
370
343
  col_type=ColType.GAME_SUM,
371
344
  expr=pl.col(ColName.OPP_NUM_MULLIGANS),
372
- dependencies=[ColName.OPP_NUM_MULLIGANS],
373
345
  ),
374
- ColumnSpec(
346
+ ColSpec(
375
347
  name=ColName.OPP_COLORS,
376
348
  col_type=ColType.GROUP_BY,
377
349
  views=[View.GAME],
378
350
  ),
379
- ColumnSpec(
351
+ ColSpec(
380
352
  name=ColName.NUM_TURNS,
381
353
  col_type=ColType.GROUP_BY,
382
354
  views=[View.GAME],
383
355
  ),
384
- ColumnSpec(
356
+ ColSpec(
385
357
  name=ColName.NUM_TURNS_SUM,
386
358
  col_type=ColType.GAME_SUM,
387
359
  expr=pl.col(ColName.NUM_TURNS),
388
- dependencies=[ColName.NUM_TURNS],
389
360
  ),
390
- ColumnSpec(
361
+ ColSpec(
391
362
  name=ColName.WON,
392
363
  col_type=ColType.GROUP_BY,
393
364
  views=[View.GAME],
394
365
  ),
395
- ColumnSpec(
366
+ ColSpec(
396
367
  name=ColName.NUM_WON,
397
368
  col_type=ColType.GAME_SUM,
398
369
  expr=pl.col(ColName.WON),
399
- dependencies=[ColName.WON],
400
370
  ),
401
- ColumnSpec(
371
+ ColSpec(
402
372
  name=ColName.OPENING_HAND,
403
373
  col_type=ColType.NAME_SUM,
404
374
  views=[View.GAME],
405
375
  ),
406
- ColumnSpec(
376
+ ColSpec(
407
377
  name=ColName.WON_OPENING_HAND,
408
378
  col_type=ColType.NAME_SUM,
409
- exprMap=lambda name: pl.col(f"opening_hand_{name}") * pl.col(ColName.WON),
410
- dependencies=[ColName.OPENING_HAND, ColName.WON],
379
+ expr=lambda name: pl.col(f"opening_hand_{name}") * pl.col(ColName.WON),
411
380
  ),
412
- ColumnSpec(
381
+ ColSpec(
413
382
  name=ColName.DRAWN,
414
383
  col_type=ColType.NAME_SUM,
415
384
  views=[View.GAME],
416
385
  ),
417
- ColumnSpec(
386
+ ColSpec(
418
387
  name=ColName.WON_DRAWN,
419
388
  col_type=ColType.NAME_SUM,
420
- exprMap=lambda name: pl.col(f"drawn_{name}") * pl.col(ColName.WON),
421
- dependencies=[ColName.DRAWN, ColName.WON],
389
+ expr=lambda name: pl.col(f"drawn_{name}") * pl.col(ColName.WON),
422
390
  ),
423
- ColumnSpec(
391
+ ColSpec(
424
392
  name=ColName.TUTORED,
425
393
  col_type=ColType.NAME_SUM,
426
394
  views=[View.GAME],
427
395
  ),
428
- ColumnSpec(
396
+ ColSpec(
429
397
  name=ColName.WON_TUTORED,
430
398
  col_type=ColType.NAME_SUM,
431
- exprMap=lambda name: pl.col(f"tutored_{name}") * pl.col(ColName.WON),
432
- dependencies=[ColName.TUTORED, ColName.WON],
399
+ expr=lambda name: pl.col(f"tutored_{name}") * pl.col(ColName.WON),
433
400
  ),
434
- ColumnSpec(
401
+ ColSpec(
435
402
  name=ColName.DECK,
436
403
  col_type=ColType.NAME_SUM,
437
404
  views=[View.GAME],
438
405
  ),
439
- ColumnSpec(
406
+ ColSpec(
440
407
  name=ColName.WON_DECK,
441
408
  col_type=ColType.NAME_SUM,
442
- exprMap=lambda name: pl.col(f"deck_{name}") * pl.col(ColName.WON),
443
- dependencies=[ColName.DECK, ColName.WON],
409
+ expr=lambda name: pl.col(f"deck_{name}") * pl.col(ColName.WON),
444
410
  ),
445
- ColumnSpec(
411
+ ColSpec(
446
412
  name=ColName.SIDEBOARD,
447
413
  col_type=ColType.NAME_SUM,
448
414
  views=[View.GAME],
449
415
  ),
450
- ColumnSpec(
416
+ ColSpec(
451
417
  name=ColName.WON_SIDEBOARD,
452
418
  col_type=ColType.NAME_SUM,
453
- exprMap=lambda name: pl.col(f"sideboard_{name}") * pl.col(ColName.WON),
454
- dependencies=[ColName.SIDEBOARD, ColName.WON],
419
+ expr=lambda name: pl.col(f"sideboard_{name}") * pl.col(ColName.WON),
455
420
  ),
456
- ColumnSpec(
421
+ ColSpec(
457
422
  name=ColName.NUM_GNS,
458
423
  col_type=ColType.NAME_SUM,
459
- exprMap=lambda name: pl.max_horizontal(
424
+ expr=lambda name: pl.max_horizontal(
460
425
  0,
461
426
  pl.col(f"deck_{name}")
462
427
  - pl.col(f"drawn_{name}")
463
428
  - pl.col(f"tutored_{name}")
464
429
  - pl.col(f"opening_hand_{name}"),
465
430
  ),
466
- dependencies=[
467
- ColName.DECK,
468
- ColName.DRAWN,
469
- ColName.TUTORED,
470
- ColName.OPENING_HAND,
471
- ],
472
- ),
473
- ColumnSpec(
431
+ ),
432
+ ColSpec(
474
433
  name=ColName.WON_NUM_GNS,
475
434
  col_type=ColType.NAME_SUM,
476
- exprMap=lambda name: pl.col(ColName.WON) * pl.col(f"num_gns_{name}"),
477
- dependencies=[ColName.NUM_GNS, ColName.WON],
435
+ expr=lambda name: pl.col(ColName.WON) * pl.col(f"num_gns_{name}"),
478
436
  ),
479
- ColumnSpec(
437
+ ColSpec(
480
438
  name=ColName.SET_CODE,
481
439
  col_type=ColType.CARD_ATTR,
482
440
  ),
483
- ColumnSpec(
441
+ ColSpec(
484
442
  name=ColName.COLOR,
485
443
  col_type=ColType.CARD_ATTR,
486
444
  ),
487
- ColumnSpec(
445
+ ColSpec(
488
446
  name=ColName.RARITY,
489
447
  col_type=ColType.CARD_ATTR,
490
448
  ),
491
- ColumnSpec(
449
+ ColSpec(
492
450
  name=ColName.COLOR_IDENTITY,
493
451
  col_type=ColType.CARD_ATTR,
494
452
  ),
495
- ColumnSpec(
453
+ ColSpec(
496
454
  name=ColName.CARD_TYPE,
497
455
  col_type=ColType.CARD_ATTR,
498
456
  ),
499
- ColumnSpec(
457
+ ColSpec(
500
458
  name=ColName.SUBTYPE,
501
459
  col_type=ColType.CARD_ATTR,
502
460
  ),
503
- ColumnSpec(
461
+ ColSpec(
504
462
  name=ColName.MANA_VALUE,
505
463
  col_type=ColType.CARD_ATTR,
506
464
  ),
507
- ColumnSpec(
465
+ ColSpec(
508
466
  name=ColName.DECK_MANA_VALUE,
509
- col_type=ColType.CARD_SUM,
510
- expr=pl.col(ColName.MANA_VALUE) * pl.col(ColName.DECK),
511
- dependencies=[ColName.MANA_VALUE, ColName.DECK],
467
+ col_type=ColType.NAME_SUM,
468
+ expr=lambda name, card_context: card_context[name][ColName.MANA_VALUE] * pl.col(f"deck_{name}"),
512
469
  ),
513
- ColumnSpec(
470
+ ColSpec(
514
471
  name=ColName.DECK_LANDS,
515
- col_type=ColType.CARD_SUM,
516
- expr=pl.when(pl.col(ColName.CARD_TYPE).str.contains("Land"))
517
- .then(pl.col(ColName.DECK))
518
- .otherwise(0),
519
- dependencies=[ColName.CARD_TYPE, ColName.DECK],
472
+ col_type=ColType.NAME_SUM,
473
+ expr=lambda name, card_context: pl.col(f"deck_{name}") * ( 1 if 'Land' in card_context[name][ColName.CARD_TYPE] else 0 )
520
474
  ),
521
- ColumnSpec(
475
+ ColSpec(
522
476
  name=ColName.DECK_SPELLS,
523
- col_type=ColType.CARD_SUM,
524
- expr=pl.col(ColName.DECK) - pl.col(ColName.DECK_SPELLS),
525
- dependencies=[ColName.DECK, ColName.DECK_SPELLS],
477
+ col_type=ColType.NAME_SUM,
478
+ expr=lambda name: pl.col(f"deck_{name}") - pl.col(f"deck_lands_{name}"),
526
479
  ),
527
- ColumnSpec(
480
+ ColSpec(
528
481
  name=ColName.MANA_COST,
529
482
  col_type=ColType.CARD_ATTR,
530
483
  ),
531
- ColumnSpec(
484
+ ColSpec(
532
485
  name=ColName.POWER,
533
486
  col_type=ColType.CARD_ATTR,
534
487
  ),
535
- ColumnSpec(
488
+ ColSpec(
536
489
  name=ColName.TOUGHNESS,
537
490
  col_type=ColType.CARD_ATTR,
538
491
  ),
539
- ColumnSpec(
492
+ ColSpec(
540
493
  name=ColName.IS_BONUS_SHEET,
541
494
  col_type=ColType.CARD_ATTR,
542
495
  ),
543
- ColumnSpec(
496
+ ColSpec(
544
497
  name=ColName.IS_DFC,
545
498
  col_type=ColType.CARD_ATTR,
546
499
  ),
547
- ColumnSpec(
500
+ ColSpec(
548
501
  name=ColName.ORACLE_TEXT,
549
502
  col_type=ColType.CARD_ATTR,
550
503
  ),
551
- ColumnSpec(
504
+ ColSpec(
552
505
  name=ColName.CARD_JSON,
553
506
  col_type=ColType.CARD_ATTR,
554
507
  ),
555
- ColumnSpec(
508
+ ColSpec(
556
509
  name=ColName.PICKED_MATCH_WR,
557
510
  col_type=ColType.AGG,
558
- expr=pl.col(ColName.EVENT_MATCH_WINS_SUM) / pl.col(ColName.EVENT_MATCHES),
559
- dependencies=[ColName.EVENT_MATCH_WINS_SUM, ColName.EVENT_MATCHES],
511
+ expr=pl.col(ColName.EVENT_MATCH_WINS_SUM) / pl.col(ColName.EVENT_MATCHES_SUM),
560
512
  ),
561
- ColumnSpec(
513
+ ColSpec(
562
514
  name=ColName.TROPHY_RATE,
563
515
  col_type=ColType.AGG,
564
516
  expr=pl.col(ColName.IS_TROPHY_SUM) / pl.col(ColName.NUM_TAKEN),
565
- dependencies=[ColName.IS_TROPHY_SUM, ColName.NUM_TAKEN],
566
517
  ),
567
- ColumnSpec(
518
+ ColSpec(
568
519
  name=ColName.GAME_WR,
569
520
  col_type=ColType.AGG,
570
521
  expr=pl.col(ColName.NUM_WON) / pl.col(ColName.NUM_GAMES),
571
- dependencies=[ColName.NUM_WON, ColName.NUM_GAMES],
572
522
  ),
573
- ColumnSpec(
523
+ ColSpec(
574
524
  name=ColName.ALSA,
575
525
  col_type=ColType.AGG,
576
526
  expr=pl.col(ColName.LAST_SEEN) / pl.col(ColName.NUM_SEEN),
577
- dependencies=[ColName.LAST_SEEN, ColName.NUM_SEEN],
578
527
  ),
579
- ColumnSpec(
528
+ ColSpec(
580
529
  name=ColName.ATA,
581
530
  col_type=ColType.AGG,
582
531
  expr=pl.col(ColName.TAKEN_AT) / pl.col(ColName.NUM_TAKEN),
583
- dependencies=[ColName.TAKEN_AT, ColName.NUM_TAKEN],
584
532
  ),
585
- ColumnSpec(
533
+ ColSpec(
586
534
  name=ColName.NUM_GP,
587
535
  col_type=ColType.AGG,
588
536
  expr=pl.col(ColName.DECK),
589
- dependencies=[ColName.DECK],
590
537
  ),
591
- ColumnSpec(
538
+ ColSpec(
592
539
  name=ColName.PCT_GP,
593
540
  col_type=ColType.AGG,
594
541
  expr=pl.col(ColName.DECK) / (pl.col(ColName.DECK) + pl.col(ColName.SIDEBOARD)),
595
- dependencies=[ColName.DECK, ColName.SIDEBOARD],
596
542
  ),
597
- ColumnSpec(
543
+ ColSpec(
598
544
  name=ColName.GP_WR,
599
545
  col_type=ColType.AGG,
600
546
  expr=pl.col(ColName.WON_DECK) / pl.col(ColName.DECK),
601
- dependencies=[ColName.WON_DECK, ColName.DECK],
602
547
  ),
603
- ColumnSpec(
548
+ ColSpec(
604
549
  name=ColName.NUM_OH,
605
550
  col_type=ColType.AGG,
606
551
  expr=pl.col(ColName.OPENING_HAND),
607
- dependencies=[ColName.OPENING_HAND],
608
552
  ),
609
- ColumnSpec(
553
+ ColSpec(
610
554
  name=ColName.OH_WR,
611
555
  col_type=ColType.AGG,
612
556
  expr=pl.col(ColName.WON_OPENING_HAND) / pl.col(ColName.OPENING_HAND),
613
- dependencies=[ColName.WON_OPENING_HAND, ColName.OPENING_HAND],
614
557
  ),
615
- ColumnSpec(
558
+ ColSpec(
616
559
  name=ColName.NUM_GIH,
617
560
  col_type=ColType.AGG,
618
561
  expr=pl.col(ColName.OPENING_HAND) + pl.col(ColName.DRAWN),
619
- dependencies=[ColName.OPENING_HAND, ColName.DRAWN],
620
562
  ),
621
- ColumnSpec(
563
+ ColSpec(
622
564
  name=ColName.NUM_GIH_WON,
623
565
  col_type=ColType.AGG,
624
566
  expr=pl.col(ColName.WON_OPENING_HAND) + pl.col(ColName.WON_DRAWN),
625
- dependencies=[ColName.WON_OPENING_HAND, ColName.WON_DRAWN],
626
567
  ),
627
- ColumnSpec(
568
+ ColSpec(
628
569
  name=ColName.GIH_WR,
629
570
  col_type=ColType.AGG,
630
571
  expr=pl.col(ColName.NUM_GIH_WON) / pl.col(ColName.NUM_GIH),
631
- dependencies=[ColName.NUM_GIH_WON, ColName.NUM_GIH],
632
572
  ),
633
- ColumnSpec(
573
+ ColSpec(
634
574
  name=ColName.GNS_WR,
635
575
  col_type=ColType.AGG,
636
576
  expr=pl.col(ColName.WON_NUM_GNS) / pl.col(ColName.NUM_GNS),
637
- dependencies=[ColName.WON_NUM_GNS, ColName.NUM_GNS],
638
577
  ),
639
- ColumnSpec(
578
+ ColSpec(
640
579
  name=ColName.IWD,
641
580
  col_type=ColType.AGG,
642
581
  expr=pl.col(ColName.GIH_WR) - pl.col(ColName.GNS_WR),
643
- dependencies=[ColName.GIH_WR, ColName.GNS_WR],
644
582
  ),
645
- ColumnSpec(
583
+ ColSpec(
646
584
  name=ColName.NUM_IN_POOL,
647
585
  col_type=ColType.AGG,
648
586
  expr=pl.col(ColName.DECK) + pl.col(ColName.SIDEBOARD),
649
- dependencies=[ColName.DECK, ColName.SIDEBOARD],
650
587
  ),
651
- ColumnSpec(
588
+ ColSpec(
652
589
  name=ColName.IN_POOL_WR,
653
590
  col_type=ColType.AGG,
654
591
  expr=(pl.col(ColName.WON_DECK) + pl.col(ColName.WON_SIDEBOARD))
655
592
  / pl.col(ColName.NUM_IN_POOL),
656
- dependencies=[ColName.WON_DECK, ColName.WON_SIDEBOARD, ColName.NUM_IN_POOL],
657
593
  ),
658
- ColumnSpec(
594
+ ColSpec(
659
595
  name=ColName.DECK_TOTAL,
660
596
  col_type=ColType.AGG,
661
597
  expr=pl.col(ColName.DECK).sum(),
662
- dependencies=[ColName.DECK],
663
598
  ),
664
- ColumnSpec(
599
+ ColSpec(
665
600
  name=ColName.WON_DECK_TOTAL,
666
601
  col_type=ColType.AGG,
667
602
  expr=pl.col(ColName.WON_DECK).sum(),
668
- dependencies=[ColName.WON_DECK],
669
603
  ),
670
- ColumnSpec(
604
+ ColSpec(
671
605
  name=ColName.GP_WR_MEAN,
672
606
  col_type=ColType.AGG,
673
607
  expr=pl.col(ColName.WON_DECK_TOTAL) / pl.col(ColName.DECK_TOTAL),
674
- dependencies=[ColName.WON_DECK_TOTAL, ColName.DECK_TOTAL],
675
608
  ),
676
- ColumnSpec(
609
+ ColSpec(
677
610
  name=ColName.GP_WR_EXCESS,
678
611
  col_type=ColType.AGG,
679
612
  expr=pl.col(ColName.GP_WR) - pl.col(ColName.GP_WR_MEAN),
680
- dependencies=[ColName.GP_WR, ColName.GP_WR_MEAN],
681
613
  ),
682
- ColumnSpec(
614
+ ColSpec(
683
615
  name=ColName.GP_WR_VAR,
684
616
  col_type=ColType.AGG,
685
617
  expr=(pl.col(ColName.GP_WR_EXCESS).pow(2) * pl.col(ColName.NUM_GP)).sum()
686
618
  / pl.col(ColName.DECK_TOTAL),
687
- dependencies=[ColName.GP_WR_EXCESS, ColName.NUM_GP, ColName.DECK_TOTAL],
688
619
  ),
689
- ColumnSpec(
620
+ ColSpec(
690
621
  name=ColName.GP_WR_STDEV,
691
622
  col_type=ColType.AGG,
692
623
  expr=pl.col(ColName.GP_WR_VAR).sqrt(),
693
- dependencies=[ColName.GP_WR_VAR],
694
624
  ),
695
- ColumnSpec(
625
+ ColSpec(
696
626
  name=ColName.GP_WR_Z,
697
627
  col_type=ColType.AGG,
698
628
  expr=pl.col(ColName.GP_WR_EXCESS) / pl.col(ColName.GP_WR_STDEV),
699
- dependencies=[ColName.GP_WR_EXCESS, ColName.GP_WR_STDEV],
700
629
  ),
701
- ColumnSpec(
630
+ ColSpec(
702
631
  name=ColName.GIH_TOTAL,
703
632
  col_type=ColType.AGG,
704
633
  expr=pl.col(ColName.NUM_GIH).sum(),
705
- dependencies=[ColName.NUM_GIH],
706
634
  ),
707
- ColumnSpec(
635
+ ColSpec(
708
636
  name=ColName.WON_GIH_TOTAL,
709
637
  col_type=ColType.AGG,
710
638
  expr=pl.col(ColName.NUM_GIH_WON).sum(),
711
- dependencies=[ColName.NUM_GIH_WON],
712
639
  ),
713
- ColumnSpec(
640
+ ColSpec(
714
641
  name=ColName.GIH_WR_MEAN,
715
642
  col_type=ColType.AGG,
716
643
  expr=pl.col(ColName.WON_GIH_TOTAL) / pl.col(ColName.GIH_TOTAL),
717
- dependencies=[ColName.WON_GIH_TOTAL, ColName.GIH_TOTAL],
718
644
  ),
719
- ColumnSpec(
645
+ ColSpec(
720
646
  name=ColName.GIH_WR_EXCESS,
721
647
  col_type=ColType.AGG,
722
648
  expr=pl.col(ColName.GIH_WR) - pl.col(ColName.GIH_WR_MEAN),
723
- dependencies=[ColName.GIH_WR, ColName.GIH_WR_MEAN],
724
649
  ),
725
- ColumnSpec(
650
+ ColSpec(
726
651
  name=ColName.GIH_WR_VAR,
727
652
  col_type=ColType.AGG,
728
653
  expr=(pl.col(ColName.GIH_WR_EXCESS).pow(2) * pl.col(ColName.NUM_GIH)).sum()
729
654
  / pl.col(ColName.GIH_TOTAL),
730
- dependencies=[ColName.GIH_WR_EXCESS, ColName.NUM_GIH, ColName.GIH_TOTAL],
731
655
  ),
732
- ColumnSpec(
656
+ ColSpec(
733
657
  name=ColName.GIH_WR_STDEV,
734
658
  col_type=ColType.AGG,
735
659
  expr=pl.col(ColName.GIH_WR_VAR).sqrt(),
736
- dependencies=[ColName.GIH_WR_VAR],
737
660
  ),
738
- ColumnSpec(
661
+ ColSpec(
739
662
  name=ColName.GIH_WR_Z,
740
663
  col_type=ColType.AGG,
741
664
  expr=pl.col(ColName.GIH_WR_EXCESS) / pl.col(ColName.GIH_WR_STDEV),
742
- dependencies=[ColName.GIH_WR_EXCESS, ColName.GIH_WR_STDEV],
743
665
  ),
744
- ColumnSpec(
666
+ ColSpec(
745
667
  name=ColName.DECK_MANA_VALUE_AVG,
746
668
  col_type=ColType.AGG,
747
- expr=pl.col(ColName.DECK_MANA_VALUE) / pl.col(ColName.DECK),
748
- dependencies=[ColName.DECK_MANA_VALUE, ColName.DECK],
669
+ expr=pl.col(ColName.DECK_MANA_VALUE) / pl.col(ColName.DECK_SPELLS),
749
670
  ),
750
- ColumnSpec(
671
+ ColSpec(
751
672
  name=ColName.DECK_LANDS_AVG,
752
673
  col_type=ColType.AGG,
753
674
  expr=pl.col(ColName.DECK_LANDS) / pl.col(ColName.NUM_GAMES),
754
- dependencies=[ColName.DECK_LANDS, ColName.NUM_GAMES],
755
675
  ),
756
- ColumnSpec(
676
+ ColSpec(
757
677
  name=ColName.DECK_SPELLS_AVG,
758
678
  col_type=ColType.AGG,
759
679
  expr=pl.col(ColName.DECK_SPELLS) / pl.col(ColName.NUM_GAMES),
760
- dependencies=[ColName.DECK_SPELLS, ColName.NUM_GAMES],
761
680
  ),
762
681
  ]
763
682