1
1
import abc
2
2
import inspect
3
- from typing import TYPE_CHECKING , Any , Dict , Iterator , Optional , Type , Union
3
+ from typing import TYPE_CHECKING , Any , Dict , Iterator , Tuple , Type , Union
4
4
5
5
import numpy as np
6
6
@@ -72,7 +72,9 @@ def series_generator(self) -> Iterator["Series"]:
72
72
pass
73
73
74
74
@abc .abstractmethod
75
- def wrap_results_for_axis (self , results : ResType ) -> Union ["Series" , "DataFrame" ]:
75
+ def wrap_results_for_axis (
76
+ self , results : ResType , res_index : "Index"
77
+ ) -> Union ["Series" , "DataFrame" ]:
76
78
pass
77
79
78
80
# ---------------------------------------------------------------
@@ -112,15 +114,6 @@ def f(x):
112
114
113
115
self .f = f
114
116
115
- # results
116
- self .result = None
117
- self ._res_index : Optional ["Index" ] = None
118
-
119
- @property
120
- def res_index (self ) -> "Index" :
121
- assert self ._res_index is not None
122
- return self ._res_index
123
-
124
117
@property
125
118
def res_columns (self ) -> "Index" :
126
119
return self .result_columns
@@ -313,12 +306,12 @@ def apply_standard(self):
313
306
return self .obj ._constructor_sliced (result , index = labels )
314
307
315
308
# compute the result using the series generator
316
- results = self .apply_series_generator ()
309
+ results , res_index = self .apply_series_generator ()
317
310
318
311
# wrap results
319
- return self .wrap_results (results )
312
+ return self .wrap_results (results , res_index )
320
313
321
- def apply_series_generator (self ) -> ResType :
314
+ def apply_series_generator (self ) -> Tuple [ ResType , "Index" ] :
322
315
series_gen = self .series_generator
323
316
res_index = self .result_index
324
317
@@ -345,19 +338,20 @@ def apply_series_generator(self) -> ResType:
345
338
results [i ] = self .f (v )
346
339
keys .append (v .name )
347
340
348
- self ._res_index = res_index
349
- return results
341
+ return results , res_index
350
342
351
- def wrap_results (self , results : ResType ) -> Union ["Series" , "DataFrame" ]:
343
+ def wrap_results (
344
+ self , results : ResType , res_index : "Index"
345
+ ) -> Union ["Series" , "DataFrame" ]:
352
346
353
347
# see if we can infer the results
354
348
if len (results ) > 0 and 0 in results and is_sequence (results [0 ]):
355
349
356
- return self .wrap_results_for_axis (results )
350
+ return self .wrap_results_for_axis (results , res_index )
357
351
358
352
# dict of scalars
359
353
result = self .obj ._constructor_sliced (results )
360
- result .index = self . res_index
354
+ result .index = res_index
361
355
362
356
return result
363
357
@@ -380,7 +374,9 @@ def result_index(self) -> "Index":
380
374
def result_columns (self ) -> "Index" :
381
375
return self .index
382
376
383
- def wrap_results_for_axis (self , results : ResType ) -> "DataFrame" :
377
+ def wrap_results_for_axis (
378
+ self , results : ResType , res_index : "Index"
379
+ ) -> "DataFrame" :
384
380
""" return the results for the rows """
385
381
386
382
result = self .obj ._constructor (data = results )
@@ -389,8 +385,8 @@ def wrap_results_for_axis(self, results: ResType) -> "DataFrame":
389
385
if len (result .index ) == len (self .res_columns ):
390
386
result .index = self .res_columns
391
387
392
- if len (result .columns ) == len (self . res_index ):
393
- result .columns = self . res_index
388
+ if len (result .columns ) == len (res_index ):
389
+ result .columns = res_index
394
390
395
391
return result
396
392
@@ -418,35 +414,37 @@ def result_index(self) -> "Index":
418
414
def result_columns (self ) -> "Index" :
419
415
return self .columns
420
416
421
- def wrap_results_for_axis (self , results : ResType ) -> Union ["Series" , "DataFrame" ]:
417
+ def wrap_results_for_axis (
418
+ self , results : ResType , res_index : "Index"
419
+ ) -> Union ["Series" , "DataFrame" ]:
422
420
""" return the results for the columns """
423
421
result : Union ["Series" , "DataFrame" ]
424
422
425
423
# we have requested to expand
426
424
if self .result_type == "expand" :
427
- result = self .infer_to_same_shape (results )
425
+ result = self .infer_to_same_shape (results , res_index )
428
426
429
427
# we have a non-series and don't want inference
430
428
elif not isinstance (results [0 ], ABCSeries ):
431
429
from pandas import Series
432
430
433
431
result = Series (results )
434
- result .index = self . res_index
432
+ result .index = res_index
435
433
436
434
# we may want to infer results
437
435
else :
438
- result = self .infer_to_same_shape (results )
436
+ result = self .infer_to_same_shape (results , res_index )
439
437
440
438
return result
441
439
442
- def infer_to_same_shape (self , results : ResType ) -> "DataFrame" :
440
+ def infer_to_same_shape (self , results : ResType , res_index : "Index" ) -> "DataFrame" :
443
441
""" infer the results to the same shape as the input object """
444
442
445
443
result = self .obj ._constructor (data = results )
446
444
result = result .T
447
445
448
446
# set the index
449
- result .index = self . res_index
447
+ result .index = res_index
450
448
451
449
# infer dtypes
452
450
result = result .infer_objects ()
0 commit comments