首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >成功打印包含60多个元素的pandas.Series子类

成功打印包含60多个元素的pandas.Series子类
EN

Stack Overflow用户
提问于 2017-09-12 00:49:25
回答 2查看 297关注 0票数 1

这可能是一个简单的修复,但我不知道如何做。

我已经扩展了pandas.Series类,以便它可以包含用于我的研究的数据集。以下是我到目前为止编写的代码:

代码语言:javascript
复制
import pandas as pd
import numpy as np
from allantools import oadev
class Tombstone(pd.Series):
    """An extension of ``pandas.Series``, which contains raw data from a
    tombstone test.

    Parameters
    ----------
    data : array-like of floats
        The raw data measured in volts from a lock-in amplifier. If no scale
        factor is provided, this data is presumed to be in units of °/h.
    rate : float
        The sampling rate in Hz
    start : float
        The unix time stamp of the start of the run. Used to create the index
        of the Tombstone object. This can be calculated by
        running ``time.time()`` or similar. If no value is passed, the index
        of the Tombstone object will be in hours since start.
    scale_factor : float
        The conversion factor between the lock-in amplifier voltage and deg/h,
        expressed in deg/h/V.

    Attributes
    ----------
    adev : 2-tuple of arrays of floats
        Returns the Allan deviation in degrees/hour in a 2-tuple. The first
        tuple is an array of floats representing the integration times. The
        second tuple is an array of floats representing the allan deviations.
    noise : float
        The calculated angular random walk in units of °/√h taken from the
        1-Hz point on the
        Allan variance curve.
    arw : float
        The calculated angular random walk in units of °/√h taken from the
        1-Hz point on the
        Allan deviation curve.
    drift : float
        The minimum allan deviation in units of °/h.
    """

    def __init__(self, data, rate, start=None, scale_factor=0, *args, **kwargs):

        if start:
            date_index = pd.date_range(
                start=start*1e9, periods=len(data),
                freq='%.3g ms' % (1000/rate), tz='UTC')
            date_index = date_index.tz_convert('America/Los_Angeles')
        else:
            date_index = np.arange(len(data))/60/60/rate
        super().__init__(data, date_index)
        if scale_factor:
            self.name = 'voltage'
        else:
            self.name = 'rotation'
        self.rate = rate

    @property
    def _constructor(self):
        return Tombstone

    @property
    def adev(self):
        tau, dev, _, _ = oadev(np.array(self), rate=self.rate,
                               data_type='freq')
        return tau, dev

    @property
    def noise(self):
        _, dev, _, _ = oadev(np.array(self), rate=self.rate, data_type='freq')
        return dev[0]/60

    # alias
    arw = noise

    @property
    def drift(self):
        tau, dev, _, _ = oadev(np.array(self), rate=self.rate,
                               data_type='freq')
        return min(dev)

我可以在Jupyter笔记本上运行:

代码语言:javascript
复制
>>> t = Tombstone(np.random.rand(60), rate=10)
>>> t
0.000000    0.497036
0.000028    0.860914
0.000056    0.626183
0.000083    0.537434
0.000111    0.451693
...

上一项的输出显示了预期的pandas.Series

但是当我将61个元素传递给构造函数时,我得到了一个错误

代码语言:javascript
复制
>>> t = Tombstone(np.random.rand(61), rate=10)
>>> t
TypeError: cannot concatenate a non-NDFrame object

即使是大型数据集,我仍然可以毫无问题地运行命令:

代码语言:javascript
复制
>>> from matplotlib.pyplot import loglog, show
>>> t = Tombstone(np.random.rand(10000), rate=10)
>>> t.noise
>>> loglog(*t.adev); show()

但是当我要求Jupyter notebook漂亮地打印t时,我总是得到一个错误。

2017-09-13更新

在查看堆栈跟踪之后,问题似乎出在pandas尝试连接前几个元素和最后几个元素时,中间有一个省略号。运行下面的代码会重新生成堆栈跟踪的最后几行:

代码语言:javascript
复制
>>> pd.concat(t.iloc[10:], t.iloc[:-10])

TypeError                                 Traceback (most recent call last)
<ipython-input-12-86a3d2f95e07> in <module>()
----> 1 pd.concat(t.iloc[10:], t.iloc[:-10])

/Users/wheelerj/miniconda3/lib/python3.5/site-packages/pandas/tools/merge.py in concat(objs, axis, join, join_axes, ignore_index, keys, levels, names, verify_integrity, copy)
   1332                        keys=keys, levels=levels, names=names,
   1333                        verify_integrity=verify_integrity,
-> 1334                        copy=copy)
   1335     return op.get_result()
   1336 

/Users/wheelerj/miniconda3/lib/python3.5/site-packages/pandas/tools/merge.py in __init__(self, objs, axis, join, join_axes, keys, levels, names, ignore_index, verify_integrity, copy)
   1389         for obj in objs:
   1390             if not isinstance(obj, NDFrame):
-> 1391                 raise TypeError("cannot concatenate a non-NDFrame object")
   1392 
   1393             # consolidate

TypeError: cannot concatenate a non-NDFrame object
EN

回答 2

Stack Overflow用户

发布于 2017-09-14 03:25:51

我为找到了一个补丁,这个补丁在我的情况下应该可以工作。我仍然认为有一种方法可以通过将切片表示为NDFrame对象来解决它。也许其他人可以弄明白这一点。

如果我在Tombstone类中重写了__repr__内置函数,

代码语言:javascript
复制
def __repr__(self):
    ret = 'Tombstone('
    ret += 'rate=%.3g' % self.rate
    # etc...
    ret += ')'
    return ret

我可以运行以下命令:

代码语言:javascript
复制
>>> t = Tombstone(np.random.rand(61), rate=10)
>>> t
Tombstone(rate=10)
票数 0
EN

Stack Overflow用户

发布于 2019-12-01 13:45:02

我认为问题出在您对super().__init__()的调用中。pd.Series.__init__()有许多您没有传递的额外参数。在我的例子中,我得到了fastpath参数集,但没有处理它。

如果我像这样调整你的__init__(),它似乎可以工作:

代码语言:javascript
复制
def __init__(self, data=None, index=None, rate=None, start=None, scale_factor=0, *args, **kwargs):
    if index is None and rate is not None:
        if start:
            date_index = pd.date_range(
                start=start*1e9, periods=len(data),
                freq='%.3g ms' % (1000/rate), tz='UTC')
            date_index = date_index.tz_convert('America/Los_Angeles')
        else:
            date_index = np.arange(len(data))/60/60/rate
    else:
        date_index=index
    super().__init__(data, date_index, *args, **kwargs)
    if scale_factor:
        self.name = 'voltage'
    else:
        self.name = 'rotation'
    self.rate = rate

您需要确保通过iloctake和索引返回您的类型的对象(在本例中为Tombstone)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46160656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档