<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def evaluationtable(nodes, criteria, nodenames=None, critnames=None, skip_nan=False):
 """Return a table containing the results of the given evaluation criteria for the given |Node| objects. First, we define two nodes with different simulation and observation data (see function |prepare_arrays| for some explanations):
 Selecting functions |corr| and |bias_abs| as evaluation criteria, function |evaluationtable| returns the following table (which is actually a pandas data frame):
 corr bias_abs test1 1.0 -3.0 test2 NaN NaN One can pass alternative names for both the node objects and the criteria functions. Also, `nan` values can be skipped: corrcoef bias first node 1.0 -3.0 second node -1.0 0.0 The number of assigned node objects and criteria functions must match the number of givern alternative names: Traceback (most recent call last):
 ValueError: While trying to evaluate the simulation results of some \ node objects, the following error occurred: 2 node objects are given \ which does not match with number of given alternative names beeing 1. Traceback (most recent call last):
 ValueError: While trying to evaluate the simulation results of some \ node objects, the following error occurred: 2 criteria functions are given \ which does not match with number of given alternative names beeing 1. """

    if nodenames:
        if len(nodes) != len(nodenames):
            raise ValueError(
                '%d node objects are given which does not match with '
                'number of given alternative names beeing %s.'
                % (len(nodes), len(nodenames)))
    else:
        nodenames = [node.name for node in nodes]
    if critnames:
        if len(criteria) != len(critnames):
            raise ValueError(
                '%d criteria functions are given which does not match '
                'with number of given alternative names beeing %s.'
                % (len(criteria), len(critnames)))
    else:
        critnames = [crit.__name__ for crit in criteria]
    data = numpy.empty((len(nodes), len(criteria)), dtype=float)
    for idx, node in enumerate(nodes):
        sim, obs = prepare_arrays(None, None, node, skip_nan)
        for jdx, criterion in enumerate(criteria):
            data[idx, jdx] = criterion(sim, obs)
    table = pandas.DataFrame(
        data=data, index=nodenames, columns=critnames)
    return table