def METHOD_NAME(cls, op: "DataFrameInsert"):
    inp = op.inputs[0]
    value = op.value
    if isinstance(value, (SERIES_TYPE, TENSOR_TYPE)):
        value = yield from recursive_tile(value.rechunk({0: inp.nsplits[0]}))
    out = op.outputs[0]
    chunk_bounds = np.cumsum((0,) + inp.nsplits[1])
    chunk_bounds[-1] += 1
    chunks = []
    new_split = list(inp.nsplits[1])
    chunk_dtypes = None
    chunk_columns_value = None
    for c in inp.chunks:
        left_bound = int(chunk_bounds[c.index[1]])
        right_bound = int(chunk_bounds[c.index[1] + 1])
        if left_bound > op.loc or right_bound <= op.loc:
            chunks.append(c)
            continue
        if chunk_dtypes is None:
            new_split[c.index[1]] = inp.nsplits[1][c.index[1]] + 1
            if isinstance(value, (SERIES_TYPE, TENSOR_TYPE)):
                value_dtype = value.dtype
            else:
                value_dtype = pd.Series(value).dtype
            empty_df = build_empty_df(c.dtypes)
            empty_df.insert(
                loc=op.loc - left_bound,
                column=op.column,
                allow_duplicates=op.allow_duplicates,
                value=pd.Series([], dtype=value_dtype),
            )
            chunk_dtypes = empty_df.dtypes
            chunk_columns_value = parse_index(chunk_dtypes.index, store_data=True)
        params = c.params
        params["columns_value"] = chunk_columns_value
        params["dtypes"] = chunk_dtypes
        params["shape"] = (c.shape[0], c.shape[1] + 1)
        new_op = op.copy().reset_key()
        new_op._loc = op.loc - left_bound
        if isinstance(value, (SERIES_TYPE, TENSOR_TYPE)):
            inputs = [c, value.chunks[c.index[0]]]
        else:
            inputs = [c]
        chunks.append(new_op.new_chunk(inputs, **params))
    new_op = op.copy().reset_key()
    return new_op.new_tileables(
        [inp],
        chunks=chunks,
        nsplits=(inp.nsplits[0], tuple(new_split)),
        **out.params,
    )