pandas panda扩展名用法而不导入它

izkcnapc  于 2023-02-11  发布在  其他
关注(0)|答案(2)|浏览(123)

我已经创建了这里提到的Pandas扩展。
扩展类定义在一个名为pd_extensions的模块中,我想在另一个模块中使用它们,例如my_module,这两个模块位于同一个名为source的包中。
当前能够使用扩展IM将pd_extensions模块导入my_module,如下所示:
import source.pd_extensions
有没有办法不用导入模块就可以使用我创建的扩展?
我发现自己要将这个模块导入到包中每个我想使用扩展的模块中,我想可能有更好的方法(可能通过_ _ init _ 模块)。
我试着只使用扩展而不导入定义它们的模块,但显然不起作用。
我想把它导入到
_ init _ _文件中,这样包中的所有模块都可以访问它,而不必自己导入它,但我不知道这是否可行。

z5btuh9x

z5btuh9x1#

我认为你可以在__init__文件中导入扩展模块,因为扩展模块会先导入Pandas,然后注册访问器,因此Pandas模块会缓存在sys.modules中,任何后续从其他模块导入Pandas的操作都会从缓存中检索条目。
下面是一个简单的例子:

source
├── __init__.py
├── my_module.py
└── pd_extension.py

以下是这些文件的内容:
x一个一个一个一个x一个一个二个一个x一个一个三个一个
现在,让我们通过执行my_module.py来测试代码,它可以按预期工作

$ python -m source.my_module
(2, 3)
gzszwxb4

gzszwxb42#

是的,可以把它添加到Pandas的__init__.py中,然后导入Pandas,但是在你这么做之前,我会先创建一个虚拟环境。
下面是如何使用conda来实现这一点

conda create -n test_env python=3.10
conda install pandas

导航到test_env中的Pandas文件夹

/Users/.../opt/anaconda3/envs/test_env/lib/python3.10/site-packages/pandas/__init__.py

在我添加的__init__.py的底部

import pandas as pd

@pd.api.extensions.register_dataframe_accessor("geo")
class GeoAccessor:
    def __init__(self, pandas_obj):
        self._obj = pandas_obj

    @property
    def center(self):
        # return the geographic center point of this DataFrame
        lat = self._obj.latitude
        lon = self._obj.longitude
        return (float(lon.mean()), float(lat.mean()))

    def plot(self):
        # plot this array's data on a map, e.g., using Cartopy
        pass

现在你应该可以

(base) ~ % conda activate test_env          
(test_env) ~ % python
Python 3.10.9 (main, Jan 11 2023, 09:18:20) [Clang 14.0.6 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> import numpy as np
>>> ds = pd.DataFrame({"longitude": np.linspace(0, 10),
...                    "latitude": np.linspace(0, 20)})
>>> ds.geo.center
(5.0, 10.0)
>>>

相关问题