<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def scatter_drag( x_points: 'Array', y_points: 'Array', *, fig=None, show_eqn=True, options={} ):
 """ Generates an interactive scatter plot with the best fit line plotted over the points. The points can be dragged by the user and the line will automatically update. Args: x_points (Array Number):
 x-values of points to plot y_points (Array Number):
 y-values of points to plot Kwargs: show_eqn (bool):
 If True (default), displays the best fit line's equation above the scatterplot. {options} Returns: VBox with two children: the equation widget and the figure. """

    params = {
        'marks': [{
            'x': x_points,
            'y': y_points,
            'enable_move': True,
        }, {
            'colors': [GOLDENROD],
        }]
    }
    fig = options.get('_fig', False) or _create_fig(options=options)
    [scat, lin] = _create_marks(
        fig=fig, marks=[bq.Scatter, bq.Lines], options=options, params=params
    )
    _add_marks(fig, [scat, lin])

    equation = widgets.Label()

    # create line fit to data and display equation
    def update_line(change=None):
        x_sc = scat.scales['x']
        lin.x = [
            x_sc.min if x_sc.min is not None else np.min(scat.x),
            x_sc.max if x_sc.max is not None else np.max(scat.x),
        ]
        poly = np.polyfit(scat.x, scat.y, deg=1)
        lin.y = np.polyval(poly, lin.x)
        if show_eqn:
            equation.value = 'y = {:.2f}x + {:.2f}'.format(poly[0], poly[1])

    update_line()

    scat.observe(update_line, names=['x', 'y'])

    return widgets.VBox([equation, fig])