# This function interpolates the spectra in one data frame onto a new set of
# wavelenths.
# Typically used to get data from different instruments onto the same set of
# wavelengths so they can be used together.
import numpy as np
import pandas as pd
import scipy as sp
[docs]
def interp(df, xnew, spect_label="wvl"):
xnew = np.array(xnew, dtype="float")
metadata_cols = df.columns.levels[0] != spect_label
metadata = df[df.columns.levels[0][metadata_cols]]
old_wvls = np.array(df[spect_label].columns, dtype="float")
old_spectra = np.array(df[spect_label])
new_spectra = np.empty([len(old_spectra[:, 0]), len(xnew)]) * np.nan
interp_index = (xnew > min(old_wvls)) & (xnew < max(old_wvls))
f = sp.interpolate.interp1d(old_wvls, old_spectra, axis=1)
new_spectra[:, interp_index] = f(xnew[interp_index])
xnew = list(xnew)
for i, x in enumerate(xnew):
xnew[i] = (spect_label, x)
new_df = pd.DataFrame(
new_spectra, columns=pd.MultiIndex.from_tuples(xnew), index=df.index
)
new_df = pd.concat([new_df, metadata], axis=1)
df = new_df
return df