@@ -437,6 +437,16 @@ def bfill(arr, dim=None, limit=None):
437
437
).transpose (* arr .dims )
438
438
439
439
440
+ def _import_interpolant (interpolant , method ):
441
+ """Import interpolant from scipy.interpolate."""
442
+ try :
443
+ from scipy import interpolate
444
+
445
+ return getattr (interpolate , interpolant )
446
+ except ImportError as e :
447
+ raise ImportError (f"Interpolation with method { method } requires scipy." ) from e
448
+
449
+
440
450
def _get_interpolator (method , vectorizeable_only = False , ** kwargs ):
441
451
"""helper function to select the appropriate interpolator class
442
452
@@ -459,12 +469,6 @@ def _get_interpolator(method, vectorizeable_only=False, **kwargs):
459
469
"akima" ,
460
470
]
461
471
462
- has_scipy = True
463
- try :
464
- from scipy import interpolate
465
- except ImportError :
466
- has_scipy = False
467
-
468
472
# prioritize scipy.interpolate
469
473
if (
470
474
method == "linear"
@@ -475,32 +479,29 @@ def _get_interpolator(method, vectorizeable_only=False, **kwargs):
475
479
interp_class = NumpyInterpolator
476
480
477
481
elif method in valid_methods :
478
- if not has_scipy :
479
- raise ImportError ("Interpolation with method `%s` requires scipy" % method )
480
-
481
482
if method in interp1d_methods :
482
483
kwargs .update (method = method )
483
484
interp_class = ScipyInterpolator
484
485
elif vectorizeable_only :
485
486
raise ValueError (
486
- "{ } is not a vectorizeable interpolator. "
487
- "Available methods are {}" . format ( method , interp1d_methods )
487
+ f" { method } is not a vectorizeable interpolator. "
488
+ f "Available methods are { interp1d_methods } "
488
489
)
489
490
elif method == "barycentric" :
490
- interp_class = interpolate . BarycentricInterpolator
491
+ interp_class = _import_interpolant ( " BarycentricInterpolator" , method )
491
492
elif method == "krog" :
492
- interp_class = interpolate . KroghInterpolator
493
+ interp_class = _import_interpolant ( " KroghInterpolator" , method )
493
494
elif method == "pchip" :
494
- interp_class = interpolate . PchipInterpolator
495
+ interp_class = _import_interpolant ( " PchipInterpolator" , method )
495
496
elif method == "spline" :
496
497
kwargs .update (method = method )
497
498
interp_class = SplineInterpolator
498
499
elif method == "akima" :
499
- interp_class = interpolate . Akima1DInterpolator
500
+ interp_class = _import_interpolant ( " Akima1DInterpolator" , method )
500
501
else :
501
- raise ValueError ("%s is not a valid scipy interpolator" % method )
502
+ raise ValueError (f" { method } is not a valid scipy interpolator" )
502
503
else :
503
- raise ValueError ("%s is not a valid interpolator" % method )
504
+ raise ValueError (f" { method } is not a valid interpolator" )
504
505
505
506
return interp_class , kwargs
506
507
@@ -512,18 +513,13 @@ def _get_interpolator_nd(method, **kwargs):
512
513
"""
513
514
valid_methods = ["linear" , "nearest" ]
514
515
515
- try :
516
- from scipy import interpolate
517
- except ImportError :
518
- raise ImportError ("Interpolation with method `%s` requires scipy" % method )
519
-
520
516
if method in valid_methods :
521
517
kwargs .update (method = method )
522
- interp_class = interpolate . interpn
518
+ interp_class = _import_interpolant ( " interpn" , method )
523
519
else :
524
520
raise ValueError (
525
- "%s is not a valid interpolator for interpolating "
526
- "over multiple dimensions." % method
521
+ f" { method } is not a valid interpolator for interpolating "
522
+ "over multiple dimensions."
527
523
)
528
524
529
525
return interp_class , kwargs
0 commit comments