熊猫中特定观察组的累积乘积

时间:2020-05-11 10:24:58

标签: pandas cumulative-sum

我有以下类型的数据集

           Date    ID  window        var
0    1998-01-28     X      -5  8.500e-03
1    1998-01-28     Y      -5  1.518e-02
2    1998-01-29     X      -4  8.005e-03
3    1998-01-29     Y      -4  7.905e-03
4    1998-01-30     X      -3 -5.497e-03
         ...   ...     ...        ...
3339 2016-12-19     Y       3 -4.365e-04
3340 2016-12-20     X       4  3.628e-03
3341 2016-12-20     Y       4  6.608e-03
3342 2016-12-21     X       5 -2.467e-03
3343 2016-12-21     Y       5 -2.651e-03

我的目的是根据变量var计算变量window的累积积。这个想法是,对于每个日期,我都确定了一个围绕该日期5天的窗口/变量window从-5到5)。现在,我要计算属于特定日期的窗口中的累积乘积。例如,第一个日期(1998-01-28)的windows值为-5,因此代表计算cumprod的起点。我想有一个名为cumprod的新变量,它在var为-5的日期正好为window,那么它是var值在-5和-4,依此类推,直到window等于5。这将为第一组日期定义cumprod的值,其中每个组都由连续日期以{ {1}}从-5到5结束。然后我将在任何日期组重复此操作。因此,我将获得类似

的信息
var

在前两个日期中,我以 Date ID window var cumprod 0 1998-01-28 X -5 8.500e-03 8.500e-03 1 1998-01-28 Y -5 1.518e-02 1.518e-02 2 1998-01-29 X -4 8.005e-03 6.80425e-05 3 1998-01-29 Y -4 7.905e-03 0.00011999790000000002 4 1998-01-30 X -3 -5.497e-03 ... ... ... ... 3339 2016-12-19 Y 3 -4.365e-04 3340 2016-12-20 X 4 3.628e-03 3341 2016-12-20 Y 4 6.608e-03 3342 2016-12-21 X 5 -2.467e-03 3343 2016-12-21 Y 5 -2.651e-03 为例。

我该如何实现?我在想找到一种将标识符附加到每组日期的方法,然后使用cumprod运行某种cumprod()方法。我想不出该怎么做。通过在窗口上使用.groupby(group_identifier)函数可以简化它吗?任何其他方法都非常受欢迎。

1 个答案:

答案 0 :(得分:1)

我建议以下

if (fork() == 0) {
    printf("First child process\n");
    if (fork() != 0)
        printf("First child process (parent part)\n");
    /*
    else
        printf("Grandchild\n");

    // fall through for both first child and grandchild
    */
}

// Main process, and first child, and grandchild
if (fork() != 0) {
    // also first child and grandchild ("parent" part)
    printf("Main process (parent part)\n");
    if (fork() == 0)
        // also third grandchild, and second great-grandchild
        printf("Third child process\n");
}
/*
else
    // also second grandchild, and first great-grandchild
    printf("Main process, second child\n");
*/

我的import numpy as np import pandas as pd np.random.seed(123) df = pd.DataFrame({"Date": pd.date_range("1998-01-28", freq="d", periods=22), "window": np.concatenate([np.arange(-5,6,1),np.arange(-5,6,1)]), "var": np.random.randint(1,10,22) }) 与您的相似:

df

然后我创建一个分组变量并使用 Date window var 0 1998-01-28 -5 3 1 1998-01-29 -4 3 2 1998-01-30 -3 7 3 1998-01-31 -2 2 4 1998-02-01 -1 4 5 1998-02-02 0 7 6 1998-02-03 1 2 7 1998-02-04 2 1 8 1998-02-05 3 2 9 1998-02-06 4 1 10 1998-02-07 5 1 11 1998-02-08 -5 4 12 1998-02-09 -4 5 转换var:

cumprod

结果是:

df =  df.sort_values("Date") # My df is already sorted by Date given the way 
# I created it, but I add this to make sure yours is sorted by date
df["group"] = (df["window"] == -5).cumsum()
df = pd.concat([df, df.groupby("group")["var"].transform("cumprod")], axis=1)
相关问题