Source code for shocksgo.interp
import numpy as np
__all__ = ['interpolate_missing_data']
[docs]def interpolate_missing_data(times, fluxes, cadences=None):
"""
Assuming ``times`` are uniformly spaced with missing cadences,
fill in the missing cadences with linear interpolation.
Cadences can be passed if they are known.
Parameters
----------
times : numpy.ndarray
Incomplete but otherwise uniformly sampled times
fluxes : numpy.ndarray
Flux for each time in ``times``
cadences : numpy.ndarray, optional
Integer cadence number of each observation.
Returns
-------
interpolated_times : numpy.ndarray
``times`` with filled-in missing cadences
interpolated_fluxes : numpy.ndarray
``fluxes`` with filled-in missing cadences
"""
first_time = times[0]
if cadences is not None:
# Median time between cadences
dt = np.median(np.diff(times) / np.diff(cadences))
cadence_indices = cadences - cadences[0]
else:
# Find typical time between cadences:
dt = np.median(np.diff(times))
# Approximate the patchy grid of integer cadence indices,
# i.e.: (0, 1, 3, 4, 5, 8, ...)
cadence_indices = np.rint((times - first_time)/dt)
# Find missing cadence indices if that grid were complete
expected_cadence_indices = set(np.arange(cadence_indices.min(),
cadence_indices.max()))
missing_cadence_indices = expected_cadence_indices.difference(set(cadence_indices))
# Convert the missing cadences to times
missing_times = first_time + np.array(list(missing_cadence_indices))*dt
# Interpolate to find fluxes at missing times
interp_fluxes = np.interp(missing_times, times, fluxes)
# Combine the interpolated and input times, fluxes
interpolated_fluxes = np.concatenate([fluxes, interp_fluxes])
interpolated_times = np.concatenate([times, missing_times])
# Sort the times, fluxes, so that you can compute the ACF on them:
sort_by_time = np.argsort(interpolated_times)
interpolated_fluxes = interpolated_fluxes[sort_by_time]
interpolated_times = interpolated_times[sort_by_time]
return interpolated_times, interpolated_fluxes