python - 是否可以构建一个自动插值的 Pandas 系列?

标签 python pandas

是否有可能为任何给定的索引生成一个对其值进行插值的序列。我有一个我希望规定的预定义插值方案,我宁愿调用者不自己应用插值,以避免任何可能的错误。

class InterpolatedSeries(pd.Series):
    pass # magic?

s = pd.Series([1, 3], index=[1, 3])
i = InterpolatedSeries(s, forward='nearest', backward='nearest', middle='linear')

调用者将收到 i 作为结果,他们现在可以请求任何值,我相信他们获得的值符合规定的插值方案。插值肯定不是可预先计算的(因为我们不知道他们会提前请求哪些点)或可缓存(因为我们不知道他们会请求多少点),但重要的是没有并发症对于调用者。

这可能吗?

>>> i[[0, 0.11234, 1, 2, 2.367, 3, 4]]
... pd.Series([1, 1, 1, 2, 2.367, 3, 3], index=[0, 0.11234, 1, 2, 2.367, 3, 4])

最佳答案

使用 __getitem__。它被称为 python 魔术方法 http://www.diveintopython3.net/special-method-names.html

class InterpolatedSeries(pd.Series):
    def __init__(self, values, forward='nearest', backward='nearest', middle='linear'):
        super().__init__(values)
        self.forward = forward
        self.backward = backward
        self.middle = middle

    def __getitem__(self, key):
        # get the stored values
        values = super().__getitem__(key)
        # Do interpolation
        return values

class InterpolatedSeries(pd.Series):
    def __init__(self, values, forward='nearest', backward='nearest', middle='linear'):
        super().__init__(values)
        self.forward = forward
        self.backward = backward
        self.middle = middle

    def __setitem__(self, key, value):
        # Do interpolation
        super().__setitem__(key, value)

另一种选择是创建您自己的与底层数据结构交互的类。这个类不会继承自 pd.Series,而是一个对象。

class InterpolatedSeries(object):
    def __init__(self, values, forward='nearest', backward='nearest', middle='linear'):
        self.data = values
        self.forward = forward
        self.backward = backward
        self.middle = middle

    def __getitem__(self, key):
        values = self.data.__getitem__(key)
        # Do interpolation
        return values

    def __getattribute__(self, key): # maybe __getattr__ if this doesn't work
        """Return the stored pandas series item if the method or attribute was not found. This allows your to_csv method to work"""
        try:
            return super().__getattribute__(key)
        except AttributeError:
            pass
        return self.data.__getattribute__(key) # Call the stored pandas series method if not found.

    def __dir__(self):
        """Return the list of attributes. (Most code autocomplete features use this, so this will find your pandas series methods for autocomplete in IDEs). """
        values = dir(self.data)
        return values + super().__dir__()

以上可能不是最好的方法,但它确实增加了一些灵 active ,使在后台访问 pandas 系列方法变得更加容易。

关于python - 是否可以构建一个自动插值的 Pandas 系列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40919497/

相关文章:

python - 如何将 DRF 自定义序列化器字段与数据库模型一起使用

python - 如何通过Python字符串中的位置更改字符

python - 如何将多维数组分割成两个数组?

python - 如何在 Pandas 系列中获取下一个非 NaN 数字的索引?

pandas - 使用 Pandas 将变量转换为多列

python - 使用日期时间绘制切片 Pandas 数据框时出现 KeyError

python - Django 应用程序 SSL 套接字连接到固件

python - 如何排列 Pandas 中的一列

python - 唯一值的动态分配 - Python

Python Django - 在 View 中访问响应 header