Source code for openalea.growthwheat.converter

# -*- coding: latin-1 -*-

from __future__ import division  # use "//" to do integer division
import pandas as pd

from openalea.growthwheat import simulation

"""
    growthwheat.converter
    ~~~~~~~~~~~~~~~~~~~~~

    The module :mod:`growthwheat.converter` defines functions to convert 
    :class:`dataframes <pandas.DataFrame>` to/from GrowthWheat inputs or outputs format.

"""

#: the columns which define the topology in the input/output dataframe
HIDDENZONE_TOPOLOGY_COLUMNS = ['plant', 'axis', 'metamer']
ELEMENT_TOPOLOGY_COLUMNS = ['plant', 'axis', 'metamer', 'organ', 'element']
ROOT_TOPOLOGY_COLUMNS = ['plant', 'axis', 'organ']
AXIS_TOPOLOGY_COLUMNS = ['plant', 'axis']


[docs] def from_dataframes(hiddenzone_inputs, element_inputs, root_inputs, axis_inputs): """ Convert inputs/outputs from Pandas dataframe to Growth-Wheat format. :param pandas.DataFrame hiddenzone_inputs: Hidden zone inputs dataframe to convert, with one line by hidden zone. :param pandas.DataFrame element_inputs: Element inputs dataframe to convert, with one line by element. :param pandas.DataFrame root_inputs: Root inputs dataframe to convert, with one line by root. :param pandas.DataFrame axis_inputs: axis inputs dataframe to convert, with one line by axis. :return: The inputs in a dictionary. :rtype: dict [str, dict] .. seealso:: see :attr:`simulation.Simulation.inputs` for the structure of Growth-Wheat inputs. """ all_hiddenzone_dict = {} all_element_dict = {} all_root_dict = {} all_axes_dict = {} hiddenzone_inputs_columns = hiddenzone_inputs.columns.difference(HIDDENZONE_TOPOLOGY_COLUMNS) element_inputs_columns = element_inputs.columns.difference(ELEMENT_TOPOLOGY_COLUMNS) root_inputs_columns = root_inputs.columns.difference(ROOT_TOPOLOGY_COLUMNS) axis_inputs_columns = axis_inputs.columns.difference(AXIS_TOPOLOGY_COLUMNS) for element_inputs_id, element_inputs_group in element_inputs.groupby(ELEMENT_TOPOLOGY_COLUMNS): # element element_inputs_series = element_inputs_group.loc[element_inputs_group.first_valid_index()] element_inputs_dict = element_inputs_series[element_inputs_columns].to_dict() all_element_dict[element_inputs_id] = element_inputs_dict hiddenzone_inputs_grouped = hiddenzone_inputs.groupby(HIDDENZONE_TOPOLOGY_COLUMNS) for hiddenzone_inputs_id, hiddenzone_inputs_group in hiddenzone_inputs_grouped: # hiddenzone hiddenzone_inputs_series = hiddenzone_inputs_group.loc[hiddenzone_inputs_group.first_valid_index()] hiddenzone_inputs_dict = hiddenzone_inputs_series[hiddenzone_inputs_columns].to_dict() all_hiddenzone_dict[hiddenzone_inputs_id] = hiddenzone_inputs_dict for root_inputs_id, root_inputs_group in root_inputs.groupby(ROOT_TOPOLOGY_COLUMNS): # root root_inputs_series = root_inputs_group.loc[root_inputs_group.first_valid_index()] root_inputs_dict = root_inputs_series[root_inputs_columns].to_dict() all_root_dict[root_inputs_id] = root_inputs_dict for axis_inputs_id, axis_inputs_group in axis_inputs.groupby(AXIS_TOPOLOGY_COLUMNS): # axis axis_inputs_series = axis_inputs_group.loc[axis_inputs_group.first_valid_index()] axis_inputs_dict = axis_inputs_series[axis_inputs_columns].to_dict() all_axes_dict[axis_inputs_id] = axis_inputs_dict return {'hiddenzone': all_hiddenzone_dict, 'elements': all_element_dict, 'roots': all_root_dict, 'axes': all_axes_dict}
[docs] def to_dataframes(data_dict): """ Convert outputs from Growth-Wheat format to Pandas dataframe. :param dict data_dict: The outputs in Growth-Wheat format. :return: Four dataframes : for hiddenzone outputs, element outputs, roots outputs and axes outputs :rtype: pandas.DataFrame .. seealso:: see :attr:`simulation.Simulation.outputs` for the structure of Growth-Wheat outputs. """ dataframes_dict = {} for (current_key, current_topology_columns, current_outputs_names) in (('hiddenzone', HIDDENZONE_TOPOLOGY_COLUMNS, simulation.HIDDENZONE_OUTPUTS), ('elements', ELEMENT_TOPOLOGY_COLUMNS, simulation.ELEMENT_OUTPUTS), ('roots', ROOT_TOPOLOGY_COLUMNS, simulation.ROOT_OUTPUTS), ('axes', AXIS_TOPOLOGY_COLUMNS, simulation.AXIS_OUTPUTS)): current_data_dict = data_dict[current_key] current_ids_df = pd.DataFrame(current_data_dict.keys(), columns=current_topology_columns) current_data_df = pd.DataFrame(current_data_dict.values()) current_df = pd.concat([current_ids_df, current_data_df], axis=1) current_df.sort_values(by=current_topology_columns, inplace=True) current_columns_sorted = current_topology_columns + current_outputs_names current_df = current_df.reindex(current_columns_sorted, axis=1, copy=False) current_df.reset_index(drop=True, inplace=True) dataframes_dict[current_key] = current_df return dataframes_dict['hiddenzone'], dataframes_dict['elements'], dataframes_dict['roots'], dataframes_dict['axes']