是否可以从pandas库中读取源代码并在我自己的函数中使用它?

时间:2018-01-22 11:57:16

标签: python pandas

背景

我想在给定行长度的元素中切片pandas数据帧,并对它们执行计算。

pandas.DataFrame.rolling会让我这样做,但似乎只有示例sum()中的内置函数,例如df.rolling(2, win_type='triang').sum()。我还想绘制这些子集(我可以通过切片和一些For循环来做到这一点,但它有点慢)。

我发现了什么:

How can I get the source code of a Python function?我已经了解到我可以使用pandas.DataFrame.rolling??来阅读源代码,这会给我这个:

enter image description here

但是尝试使用例如rolling??从这里深入挖掘似乎是徒劳的:

enter image description here

那么,有可能以某种方式引用pandas.DataFrame.rolling的基础函数,还是使用Python结束?我想是因为docs表示大熊猫是用Cython或C编写的,但我对此非常好奇,所以我也想在这里问这个问题。

感谢您的任何建议!

3 个答案:

答案 0 :(得分:5)

这不是关于如何阅读源代码的答案,而是关于如何解决您声明的问题:

使用apply on rolling。例如,尝试df.rolling(2, win_type='triang').apply(yourfunc, args=(), kwargs={})

来自docs,yourfunc

  

必须从ndarray输入* args和** kwargs生成单个值   被传递给函数

这是更好的方法,因为如果不是真的需要你不应该带大熊猫来源并在你的代码中使用它进行复制粘贴和编辑(有一些错误修正,它可能会在一段时间内过时,等等。 )。在这里,我们可以使用已经实现的自己的函数。

答案 1 :(得分:2)

Pandas源代码是开源的,目前可在GitHub上获取:https://github.com/pandas-dev/pandas

你也可以看一下贡献者'有关如何布置代码的指导:https://pandas.pydata.org/pandas-docs/stable/contributing.html

在文档中有指向文档引用的代码的链接(如此)

Screenshot of pandas groupby.apply docs with link to source

答案 2 :(得分:1)

好消息/坏消息:你的痛苦完全不会在那里结束。

[侧面说明]
很容易找不到源代码在系统中的位置,特别是如果你使用像Anaconda这样的额外层 如有疑问,您可以检查交互式shell中的__file__属性:

import pandas
pandas.__file__
>>> 'C:\\Users\\xy\\AppData\\Local\\Continuum\\Anaconda3\\lib\\site-packages\\pandas\\__init__.py'

[/边注]

如果您查找实际的代码段,它来自pandas / core / generic.py中的NDFrame,并且在它之前有一个导入行:

from pandas.core import window as rwindow

@Appender(rwindow.rolling.__doc__)
def rolling(self, window, min_periods=None, freq=None, center=False,
            win_type=None, on=None, axis=0, closed=None):
    axis = self._get_axis_number(axis)
    return rwindow.rolling(self, window=window,
                           min_periods=min_periods, freq=freq,
                           center=center, win_type=win_type,
                           on=on, axis=axis, closed=closed)

所以你的冒险继续在pandas / core / window.py中,rolling就在最后的某个地方:

def rolling(obj, win_type=None, **kwds):
    from pandas import Series, DataFrame
    if not isinstance(obj, (Series, DataFrame)):
        raise TypeError('invalid type: %s' % type(obj))

    if win_type is not None:
        return Window(obj, win_type=win_type, **kwds)

    return Rolling(obj, **kwds)

所有WindowRolling及其父类(_Window_Rolling_and_Expanding_Rolling - 而且这一类也来自{{1}在同一个文件中延伸数千行。