<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def create_estimation_obj(model_obj, init_vals, mappings=None, ridge=None, constrained_pos=None, weights=None):
 """ Should return a model estimation object corresponding to the model type of the `model_obj`. Parameters model_obj : an instance or sublcass of the MNDC class. init_vals : 1D ndarray. The initial values to start the estimation process with. In the following order, there should be one value for each nest coefficient, shape parameter, outside intercept parameter, or index coefficient that is being estimated. mappings : OrderedDict or None, optional. Keys will be `["rows_to_obs", "rows_to_alts", "chosen_row_to_obs", "rows_to_nests"]`. The value for `rows_to_obs` will map the rows of the `long_form` to the unique observations (on the columns) in their order of appearance. The value for `rows_to_alts` will map the rows of the `long_form` to the unique alternatives which are possible in the dataset (on the columns), in sorted order--not order of appearance. The value for `chosen_row_to_obs`, if not None, will map the rows of the `long_form` that contain the chosen alternatives to the specific observations those rows are associated with (denoted by the columns). The value of `rows_to_nests`, if not None, will map the rows of the `long_form` to the nest (denoted by the column) that contains the row's alternative. Default == None. ridge : int, float, long, or None, optional. Determines whether or not ridge regression is performed. If a scalar is passed, then that scalar determines the ridge penalty for the optimization. The scalar should be greater than or equal to zero. Default `== None`. constrained_pos : list or None, optional. Denotes the positions of the array of estimated parameters that are not to change from their initial values. If a list is passed, the elements are to be integers where no such integer is greater than `init_vals.size.` Default == None. weights : 1D ndarray. Should contain the weights for each corresponding observation for each row of the long format data. """

    # Get the mapping matrices for each model
    mapping_matrices =\
        model_obj.get_mappings_for_fit() if mappings is None else mappings
    # Create the zero vector for each model.
    zero_vector = np.zeros(init_vals.shape[0])
    # Get the internal model name
    internal_model_name = display_name_to_model_type[model_obj.model_type]
    # Get the split parameter function and estimator class for this model.
    estimator_class, current_split_func =\
        (model_type_to_resources[internal_model_name]['estimator'],
         model_type_to_resources[internal_model_name]['split_func'])
    # Create the estimator instance that is desired.
    estimation_obj = estimator_class(model_obj,
                                     mapping_matrices,
                                     ridge,
                                     zero_vector,
                                     current_split_func,
                                     constrained_pos,
                                     weights=weights)
    # Return the created object
    return estimation_obj