熊猫滚动物体如何工作?

熊猫滚动物体如何工作?,第1张

熊猫滚动物体如何工作?

我建议您看一下源代码,以便深入了解滚动的作用。特别地,我建议您看一下generic.py和window.py中的

rolling
函数。从那里,你可以看一下类,如果你指定一个窗口类型或默认所使用的类。最后一个继承自,最终继承于和。
Window
Rolling
_Rolling_and_Expanding``_Rolling``_Window

就是说,我将给我两分钱:熊猫的整个滚动机制依赖于numpy函数

apply_along_axis
。特别是用它在这里的大熊猫。它与
windows.pyx
cython模块一起使用。进入您的系列,出来总的滚动窗口。对于典型的聚合函数,它可以为您高效地处理它们,而对于自定义函数(使用
apply()
),它使用
roll_generic()
in
windows.pyx

熊猫中的滚动功能独立地在熊猫数据帧列上运行。它不是python迭代器,并且是延迟加载的,这意味着在您对它应用聚合函数之前不会计算任何内容。直到完成聚合之前,才会使用实际应用数据滚动窗口的功能。

造成混乱的原因可能是您将滚动对象视为数据框。(您已经

df
在最后一个代码片段中命名了滚动对象)。真的不是。它是一个对象,可以通过在其所包含的窗口逻辑上应用聚合来产生数据帧。

您提供的lambda将应用于新数据框的每个单元格。它在旧数据框中向后(沿每一列)打开一个窗口,并将其聚合到新数据框中的一个单元格中。聚合可以是诸如

sum
,,
mean
您进行的自定义设置等,在一定的窗口大小(例如3)上。这里有一些示例:

a = np.arange(5)df = pd.Dataframe(a, columns=['a'])df.rolling(3).mean().dropna()

…也可以通过以下方式完成:

df.rolling(3).apply(np.mean).dropna()

…并产生:

     a2  3.03  6.04  9.0

(第一列是索引值,在下面的示例中可以忽略。)

注意我们如何提供现有的numpy聚合函数。那是主意。只要符合聚合函数的功能,就应该能够提供我们想要的任何东西,即采用值的向量并从中产生单个值。这是我们创建自定义聚合函数的另一个示例,在本例中为窗口的L2范数:

df.rolling(3).apply(lambda x: np.sqrt(x.dot(x))).dropna()

如果您不熟悉lambda函数,则与以下内容相同:

def euclidean_dist(x):    return np.sqrt(x.dot(x))df.rolling(3).apply(euclidean_dist).dropna()

…产生:

          a2  2.2360683  3.7416574  5.385165

只是为了确保,我们可以手动检查

np.sqrt(0**2 + 1**2 + 2**2)
确实如此
2.236068

[在您的原始编辑的最后一个代码片段中,您的代码可能比预期的要早失效。在

df.apply(...)
您尝试添加名称
df
为2的滚动对象之前,该调用失败
df.apply(...)
。滚动对象不是您要对其进行 *** 作的对象。您提供的聚合函数通常也不符合聚合函数。该
a
是一个窗口的值的列表,
b
将是你通过一个恒定的额外的参数,它可以是一个滚动的对象,如果你想要的,但它通常不会的东西,你想这样做。更清楚地说,这与您在原始编辑中所做的类似,但是可以起作用:

a = np.arange(8)df = pd.Dataframe(a, columns=['a'])n = 4rol = df.rolling(n)def prod(window_list, constant_rol):    return window_list.dot(constant_rol.sum().dropna().head(n))rol.apply(prod, args=(rol,)).dropna()# [92.0, 140.0, 188.0, 236.0, 284.0]

这是一个人为的示例,但我在此演示它的目的是使您可以将想要的任何内容作为常量传递,甚至可以使用自己使用的滚动对象。动态部分是

a
您或
window_list
我的情况下的第一个参数。所有已定义的窗口(以单个列表的形式)被一一传递到该函数中。

根据您的后续评论,这可能是您想要的:

import numpy as npimport pandas as pdn = 3a = np.arange(5)df = pd.Dataframe(a, columns=['a'])def keep(window, windows):    windows.append(window.copy())    return window[-1]windows = list()df['a'].rolling(n).apply(keep, args=(windows,))df = df.tail(n)df['a_window'] = windows

这将数组/向量添加到每个滚动块,从而产生:

   a         a_window2  2  [0.0, 1.0, 2.0]3  3  [1.0, 2.0, 3.0]4  4  [2.0, 3.0, 4.0]

请注意,仅当您一次在列上执行此 *** 作时,它才有效。如果您想在存储之前在窗口上做一些数学运算,

keep
那也很好。

就是说,如果没有更多关于您要实现的目标的投入,那么很难构建一个适合您需求的示例。

如果您的最终目标是创建一个滞后变量的数据框,那么我将使用使用实列

shift()

import numpy as npimport pandas as pda = np.arange(5)df = pd.Dataframe(a, columns=['a'])for i in range(1,3):    df['a-%s' % i] = df['a'].shift(i)df.dropna()

…给予:

   a  a-1  a-22  2  1.0  0.03  3  2.0  1.04  4  3.0  2.0

(可能有一些更漂亮的方法,但是它可以完成工作。)

关于

b
第一个代码段中的变量,请记住,pandas中的Dataframe通常不作为任意尺寸/对象的张量来处理。您可能可以将任何内容塞进去,但是最终将得到字符串,时间对象,整数和浮点数。这可能就是熊猫设计者没有费心将滚动聚合转换为非标量值的原因。甚至似乎还没有一个简单的字符串被允许作为聚合函数的输出。

无论如何,我希望这能回答您的一些问题。如果没有告知我,我会尽力在评论或更新中为您提供帮助。


关于

_create_blocks()
滚动物体功能的最后说明。

_create_blocks()
使用
freq
参数时,该函数将处理重新索引和装箱
rolling

如果您将freq与以下几个星期配合使用

freq=W

import pandas as pda = np.arange(50)df = pd.Dataframe(a, columns=['a'])df.index = pd.to_datetime('2016-01-01') + pd.to_timedelta(df['a'], 'D')blocks, obj, index = df.rolling(4, freq='W')._create_blocks(how=None)for b in blocks:    print(b)

…然后我们每周获取装箱(不滚动)的原始数据:

    aa    2016-01-03   2.02016-01-10   9.02016-01-17  16.02016-01-24  23.02016-01-31  30.02016-02-07  37.02016-02-14  44.02016-02-21   NaN

注意,这不是聚合滚动的输出。这只是它正在处理的新块。在这之后。我们像这样进行聚合

sum
并得到:

     aa     2016-01-03    NaN2016-01-10    NaN2016-01-17    NaN2016-01-24   50.02016-01-31   78.02016-02-07  106.02016-02-14  134.02016-02-21    NaN

…以总和检验:50 = 2 + 9 + 16 + 23。

如果您不使用

freq
它作为参数,它只会返回原始数据结构:

import pandas as pda = np.arange(5)df = pd.Dataframe(a, columns=['a'])blocks, obj, index = df.rolling(3)._create_blocks(how=None)for b in blocks:    print(b)

…产生…

 aa 2016-01-01  02016-01-02  12016-01-03  22016-01-04  32016-01-05  4

…,用于滚动窗口聚合。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5655563.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存