def METHOD_NAME(df, dbf_path, my_specs=None):
    """Convert a ``pandas.DataFrame`` into a ``.dbf``. Author(s) --
    Dani Arribas-Bel <D.Arribas-Bel@liverpool.ac.uk>, Luc Anselin <anselin@uchicago.edu>
    Parameters
    ----------
    df : pandas.DataFrame
        Pandas dataframe object to be entirely written out to a ``.dbf``.
    dbf_path : str
        Path to the output ``.dbf``. It is also returned by the function.
    my_specs : list
        A list with the ``field_specs`` to use for each column.
        Defaults to ``None`` and applies the following scheme.
        * ``int`` -- ``('N', 14, 0)``
          * for all ``int`` types
        * ``float`` -- ``('N', 14, 14)``
          * for all ``float`` types
        * ``str`` -- ``('C', 14, 0)``
          * for ``str``, ``object``, and category
          * for all variants for different type sizes
    Returns
    -------
    dbf_path : str
        Path to the output ``.dbf``
    Notes
    -----
    Use of ``dtypes.name`` may not be fully robust, but preferred
    approach of using ``isinstance`` seems too clumsy.
    """
    if my_specs:
        specs = my_specs
    else:
        # new approach using dtypes.name to avoid numpy name issue in type
        type2spec = {
            "int": ("N", 20, 0),
            "int8": ("N", 20, 0),
            "int16": ("N", 20, 0),
            "int32": ("N", 20, 0),
            "int64": ("N", 20, 0),
            "float": ("N", 36, 15),
            "float32": ("N", 36, 15),
            "float64": ("N", 36, 15),
            "str": ("C", 14, 0),
            "object": ("C", 14, 0),
            "category": ("C", 14, 0),
        }
        types = [df[i].dtypes.name for i in df.columns]
        specs = [type2spec[t] for t in types]
    db = ps_open(dbf_path, "w")
    db.header = list(df.columns)
    db.field_spec = specs
    for i, row in list(df.T.items()):
        db.write(row)
    db.close()
    return dbf_path