def __call__(self, *args, **kwargs):
# TODO: Should be more defensive about this
if len(args) == 1:
# We have a dataframe
df = args[0]
else:
# We have parameters for a single invocation
df = pd.DataFrame(kwargs)
if self.key_columns:
sub_tables = df.groupby(self.key_columns)
else:
sub_tables = [(None, df)]
result = pd.DataFrame(index=df.index)
for key, sub_table in sub_tables:
if sub_table.empty:
continue
funcs = self.interpolations[key]
parameters = tuple(sub_table[k] for k in self.parameter_columns)
for value_column, func in funcs.items():
out = func(*parameters)
# This reshape is necessary because RectBivariateSpline and InterpolatedUnivariateSpline return results
# in slightly different shapes and we need them to be consistent
if out.shape:
result.loc[sub_table.index, value_column] = out.reshape((out.shape[0],))
else:
result.loc[sub_table.index, value_column] = out
if self.func:
return self.func(result)
if len(result.columns) == 1:
return result[result.columns[0]]
return result
评论列表
文章目录