python-pandas中的重载
我正在构建一个数据库类型的对象,当找不到索引时,它使用api检索信息,将其保存到对象/文件并返回 我想通过重载pandas DataFrame的python-pandas中的重载,python,pandas,overloading,Python,Pandas,Overloading,我正在构建一个数据库类型的对象,当找不到索引时,它使用api检索信息,将其保存到对象/文件并返回 我想通过重载pandas DataFrame的.loc[x,y]方法来实现这一点,但我不知道如何做到这一点 目前我有: import pandas as pd pd.set_option('io.hdf.default_format','table') class DataBase(pd.DataFrame): """DataBase Object which can be updated
.loc[x,y]
方法来实现这一点,但我不知道如何做到这一点
目前我有:
import pandas as pd
pd.set_option('io.hdf.default_format','table')
class DataBase(pd.DataFrame):
"""DataBase Object which can be updated by external api"""
def __init__(self, path, api=None):
super(DataBase, self).__init__(pd.read_hdf('store.h5','df'))
self.api = api
我可能想更改\uuu init\uu
函数,使其包含where
参数,以便只读取需要的内容
我想不出一种方法来正确地重载.loc
方法
此外,hdf5只是一种方法。我想保留使用任何其他存储方法的能力,如sql,甚至csv(如果需要)
loc
是一个属性,它创建并返回一个名为\u loc
的名称,如果它不是None
,则它会根据需要创建一个pandas.core.index.\u LocIndexer
。默认情况下,索引器可以访问创建它们的数据帧,因此您可以在未命中关键帧时修改数据帧
您可以通过子类化DataFrame
和\LocIndexer
来覆盖DataFrame.loc
的行为
class MyLocIndexer(_LocIndexer):
def __getitem__(self, key):
try:
return super().__getitem__(key)
except KeyError:
item = db.fetch_item(key)
self[key] = item
return item
# `return self[key]' is better as it also works when accessing a
# whole axis
class MyDataFrame(DataFrame):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._loc = MyLocIndexer(self, "loc")
上面的内容是用python3编写的,因此如果使用python2,您必须修复super语句。再加上几年后的答案,如果您最终重载了基本pandas类,您可以重写一些构造函数属性,以确保通过标准pandas操作来维持新类,从:
- _构造函数:当操作结果与原始结果具有相同的维度时使用
- _构造函数_sliced:当操作结果有一个较低的维度作为原始维度时使用,例如DataFrame single columns 切片
- _构造函数_expanddim:当操作结果具有比原始结果更高的维度时使用,例如Series.to_frame()和 DataFrame.to_面板()
正如您所看到的,loc不是一个方法而是一个属性,而属性又有自己的get方法。所以答案是,这很复杂。不,我看不见。我在文档或核心文件中找不到任何关于
.loc
的有用信息。我内省的方法只是使用ipython控制台的“?”。无论如何,它已经在语法中了:方法是thing.do();但是属性/属性看起来像thing.other和该操作结束时对该属性执行的任何操作pd.core.indexing.\u LocationIndexer
及其派生工具有一些作用于loc.obj的get方法,因此您可以找到为数据帧选择的方法,对其进行子类化,并重载getter。子类化是什么意思?稍后我将尝试为您提供解决方案。
@property
def _constructor(self):
return MyDataFrame