当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python dask.dataframe.Series.map_overlap用法及代码示例


用法:

Series.map_overlap(func, before, after, *args, **kwargs)

对每个分区应用一个函数,与相邻分区共享行。

这对于实现诸如 df.rolling(...).mean()df.diff() 之类的窗口函数很有用。

参数

func函数

应用于每个分区的函数。

beforeint

从分区 i - 1 的末尾添加到分区 i 的行数。

afterint

从分区 i + 1 的开头追加到分区 i 的行数。

args, kwargs

要传递给函数的参数和关键字。分区将是第一个参数,这些将在之后传递。

metapd.DataFrame、pd.Series、dict、可迭代、元组、可选

与输出的 dtypes 和列名匹配的空 pd.DataFramepd.Series。此元数据对于 dask 数据帧中的许多算法起作用是必需的。为了便于使用,还提供了一些替代输入。可以提供 {name: dtype}dict(name, dtype) 的可迭代对象,而不是 DataFrame (请注意,名称的顺序应与列的顺序匹配)。可以使用(name, dtype) 的元组代替系列。如果未提供,dask 将尝试推断元数据。这可能会导致意外结果,因此建议提供meta。有关详细信息,请参阅 dask.dataframe.utils.make_meta

注意

给定正整数 beforeafter ,函数 func , map_overlap 执行以下操作:

  1. before 行从分区 i - 1 的末尾添加到每个分区 i 。第一个分区没有前置行。

  2. 从分区 i + 1 的开头将 after 行附加到每个分区 i 。最后一个分区没有附加行。

  3. func 应用到每个分区,如果提供的话,传入任何额外的argskwargs

  4. 从除第一个分区之外的所有分区的开头修剪 before 行。

  5. 从除最后一个分区之外的所有分区的末尾修剪 after 行。

请注意,假设索引和部门保持不变。

例子

给定一个 DataFrame、Series 或 Index,例如:

>>> import pandas as pd
>>> import dask.dataframe as dd
>>> df = pd.DataFrame({'x': [1, 2, 4, 7, 11],
...                    'y': [1., 2., 3., 4., 5.]})
>>> ddf = dd.from_pandas(df, npartitions=2)

可以通过在每个分区之前重叠 2 行,然后将调用映射到 df.rolling(2).sum() 来计算具有大小为 2 的尾随移动窗口的滚动和:

>>> ddf.compute()
    x    y
0   1  1.0
1   2  2.0
2   4  3.0
3   7  4.0
4  11  5.0
>>> ddf.map_overlap(lambda df: df.rolling(2).sum(), 2, 0).compute()
      x    y
0   NaN  NaN
1   3.0  3.0
2   6.0  5.0
3  11.0  7.0
4  18.0  9.0

pandas diff 方法计算偏移多个周期(可以是正数或负数)的离散差。这可以通过在附加/附加那么多行之后将调用df.diff映射到每个分区来实现,具体取决于符号:

>>> def diff(df, periods=1):
...     before, after = (periods, 0) if periods > 0 else (0, -periods)
...     return df.map_overlap(lambda df, periods=1: df.diff(periods),
...                           periods, 0, periods=periods)
>>> diff(ddf, 1).compute()
     x    y
0  NaN  NaN
1  1.0  1.0
2  2.0  1.0
3  3.0  1.0
4  4.0  1.0

如果您有 DatetimeIndex ,则可以将 pd.Timedelta 用于基于时间的窗口。

>>> ts = pd.Series(range(10), index=pd.date_range('2017', periods=10))
>>> dts = dd.from_pandas(ts, npartitions=2)
>>> dts.map_overlap(lambda df: df.rolling('2D').sum(),
...                 pd.Timedelta('2D'), 0).compute()
2017-01-01     0.0
2017-01-02     1.0
2017-01-03     3.0
2017-01-04     5.0
2017-01-05     7.0
2017-01-06     9.0
2017-01-07    11.0
2017-01-08    13.0
2017-01-09    15.0
2017-01-10    17.0
Freq: D, dtype: float64

相关用法


注:本文由纯净天空筛选整理自dask.org大神的英文原创作品 dask.dataframe.Series.map_overlap。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。