當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。