标签: cumsum

在numpy中绘制随机元素

我想有一系列元素概率[0.1, 0.2, 0.5, 0.2].该数组总和为1.0.

使用普通的Python或numpy,我想绘制与其概率成比例的元素:第一个元素约10%的时间,第二个20%,第三个50%等."draw"应该返回绘制元素的索引.

我想出了这个:

def draw(probs):
    cumsum = numpy.cumsum(probs / sum(probs)) # sum up to 1.0, just in case
    return len(numpy.where(numpy.random.rand() >= cumsum)[0])
Run Code Online (Sandbox Code Playgroud)

它有效,但它太复杂,必须有更好的方法.谢谢.

python arrays numpy cumsum

7
推荐指数
1
解决办法
2401
查看次数

ggplot2和cumsum()

我有一组UNIX时间戳和URI,我试图绘制每个URI的累积请求数.我设法使用虚拟列一次为一个URI执行此操作:

x.df$count <- apply(x.df,1,function(row) 1) # Create a dummy column for cumsum
x.df <- x.df[order(x.df$time, decreasing=FALSE),] # Sort
ggplot(x.df, aes(x=time, y=cumsum(count))) + geom_line()
Run Code Online (Sandbox Code Playgroud)

但是,在我的情况下,这将产生大约30个情节.

ggplot2允许你将多行绘制成一个图(我从这里复制了这段代码):

ggplot(data=test_data_long, aes(x=date, y=value, colour=variable)) +
    geom_line()
Run Code Online (Sandbox Code Playgroud)

问题在于,这种方式cumsum()会依赖于此.

有人有想法吗?

r ggplot2 cumsum

7
推荐指数
1
解决办法
5843
查看次数

高效的2d cumsum

说我有这样的数组

>>> a = np.arange(1,8).reshape((1,-1))
>>> a
array([[1, 2, 3, 4, 5, 6, 7]])
Run Code Online (Sandbox Code Playgroud)

并且我想为每个项目创建a一个"下4个项目的cumsum".也就是说,我的预期输出是

1,       2,      3, 4, 5, 6, 7, 8
1+2,     2+3,     ...
1+2+3    2+3+4    ...
1+2+3+4  2+3+4+5  ...
Run Code Online (Sandbox Code Playgroud)

即包含的矩阵

1, 2, 3, 4, 5, 0, 0, 0
3, 5, 7, 9, 11,0, 0, 0
6, 9, 12,15,18,0, 0, 0
10,14,18,21,26,0, 0, 0
Run Code Online (Sandbox Code Playgroud)

由于最后3个项目的cumsum操作无法正确完成,我期待0那里.我知道如何做一个单一的cumsum.实际上,阵列是

a[:4].cumsum().reshape((-1,1)); a[1:5].cumsum().reshape((-1,1))...
Run Code Online (Sandbox Code Playgroud)

水平堆放.但是,我不知道如何以有效的方式做到这一点.这样做的好的矢量化numpy方式是什么?我也对scipy包装开放,只要它们numpy在效率或可读性方面占主导地位.

python arrays numpy scipy cumsum

7
推荐指数
1
解决办法
767
查看次数

时间差不均匀的群体的滚动总和

这是对我之前发布的问题的调整.这是我的数据:

set.seed(3737)
DF2 = data.frame(user_id = c(rep(27, 7), rep(11, 7)),
            date = as.Date(rep(c('2016-01-01', '2016-01-03', '2016-01-05', '2016-01-07', '2016-01-10', '2016-01-14', '2016-01-16'), 2)),
            value = round(rnorm(14, 15, 5), 1))

 user_id  date        value
 27       2016-01-01  15.0
 27       2016-01-03  22.4
 27       2016-01-05  13.3
 27       2016-01-07  21.9
 27       2016-01-10  20.6
 27       2016-01-14  18.6
 27       2016-01-16  16.4
 11       2016-01-01   6.8
 11       2016-01-03  21.3
 11       2016-01-05  19.8
 11       2016-01-07  22.0
 11       2016-01-10  19.4
 11       2016-01-14  17.5
 11       2016-01-16  19.3
Run Code Online (Sandbox Code Playgroud)

这一次,我想计算指定时间段内value每个的累积总和user_id'; 例如,持续7天,14天.理想的解决方案如下所示:

 user_id …
Run Code Online (Sandbox Code Playgroud)

r date cumsum dplyr

7
推荐指数
1
解决办法
868
查看次数

Cumsum是现有Pandas数据中的新列

我有一个pandas数据框定义为:

A   B   SUM_C      
1   1   10     
1   2   20   
Run Code Online (Sandbox Code Playgroud)

我想做一个SUM_C的累积和,并将其作为新列添加到同一个数据帧.换句话说,我的最终目标是拥有如下所示的数据框:

A   B   SUM_C   CUMSUM_C       
1   1   10      10     
1   2   20      30   
Run Code Online (Sandbox Code Playgroud)

在group()使用pandas中的cumsum显示了生成新数据帧的可能性,其中列名SUM_C被累积和替换.但是,我的问题是将累积和作为新列添加到现有数据框中.

谢谢

python dataframe pandas cumsum

7
推荐指数
1
解决办法
8384
查看次数

组内的 Cumsum 并在 Pandas 条件下重置

我有一个包含两列 ID 和活动的数据框。活动为 0 或 1。我想要一个包含自上次活动为 1 以来递增数字的新列。但是,计数应仅在一个组 (ID) 内。如果活动为 1,则计数列应重置为 0,然后重新开始计数。

所以,我有一个包含以下内容的数据框:

在此处输入图片说明

想要的是这个:

在此处输入图片说明

有人能帮我吗?

group-by count conditional-statements pandas cumsum

7
推荐指数
1
解决办法
2544
查看次数

使用累计的输出差异

为什么这两个操作不同?

library(lubridate)
library(magrittr)

> seconds_to_period(1:1000) %>% cumsum %>% sum
[1] 14492440
> 1:1000 %>% cumsum %>% sum
[1] 167167000
Run Code Online (Sandbox Code Playgroud)

但是,我看到的问题是,该事实cumsum 仅增加了周期的秒数,而忽略了其余的时间

seconds_to_period(60) +  seconds_to_period(60)
[1] "2M 0S"
Run Code Online (Sandbox Code Playgroud)

> cumsum(c(seconds_to_period(60), seconds_to_period(60)))
[1] 0 0
Run Code Online (Sandbox Code Playgroud)

为什么此行为是默认形式?我认为这很不直观。此外,克服此问题并获得与cumsum(1:1000)使用“ Period”类润滑脂相同的结果的方法是什么,该方法不需要执行以下操作:

c(seconds_to_period(60), seconds_to_period(60)) %>% as.numeric %>% cumsum

r lubridate cumsum

7
推荐指数
1
解决办法
118
查看次数

R,dplyr:n_distinct的累积版本

我有一个数据帧如下.它按列排序time.

输入 -

df = data.frame(time = 1:20,
            grp = sort(rep(1:5,4)),
            var1 = rep(c('A','B'),10)
            )

head(df,10)
   time grp var1
1   1   1    A
2   2   1    B
3   3   1    A
4   4   1    B
5   5   2    A
6   6   2    B
7   7   2    A
8   8   2    B
9   9   3    A
10 10   3    B
Run Code Online (Sandbox Code Playgroud)

我想创建另一个变量var2,它var1到目前为止计算不同的值,即直到time每个组的那个点grp.这与我使用时的情况略有不同n_distinct.

预期产量 -

   time grp var1 var2 …
Run Code Online (Sandbox Code Playgroud)

r cumsum dplyr

6
推荐指数
2
解决办法
2180
查看次数

熊猫组由cumsum保持列

我花了几个小时试图在熊猫数据框架上做一个"累计组合".我已经查看了所有stackoverflow的答案,令人惊讶的是,它们都无法解决我的(非常基本的)问题:

我有一个数据帧:

df1 Out[8]: Name Date Amount 0 Jack 2016-01-31 10 1 Jack 2016-02-29 5 2 Jack 2016-02-29 8 3 Jill 2016-01-31 10 4 Jill 2016-02-29 5

我在尝试着

  1. 按['姓名','日期']和
  2. cumsum'Anount'.
  3. 这就对了.

所以期望的输出是:

df1 Out[10]: Name Date Cumsum 0 Jack 2016-01-31 10 1 Jack 2016-02-29 23 2 Jill 2016-01-31 10 3 Jill 2016-02-29 15

编辑:我正在简化这个问题.根据目前的答案,我仍然无法获得正确的"正在运行"的cumsum.仔细看,我希望看到累计金额"10,23,10,15".换句话说,我希望在每个连续日期看到一个人的总累计金额.注意:如果同一个人在一个日期有两个条目,我想将它们相加,然后将它们添加到正在运行的cumsum中,然后才打印总和.

group-by pandas cumsum

6
推荐指数
2
解决办法
2741
查看次数

带有标志条件的 Pandas 按 cumsum 分组

假设我有以下数据框

日期 旗帜 用户 编号
0 2019-01-01 1 A 10
1 2019-01-02 0 A 20
2 2019-01-03 1 30
3 2019-03-04 1 40

我想仅在 flag == 1 时创建按用户分组的数字的累积和,所以我会得到这个:

日期 旗帜 用户 编号 累积量
0 2019-01-01 1 A 10 10
1 2019-01-02 0 A 20 10
2 2019-01-03 1 30 30
3 2019-03-04 1 40 70

到目前为止,我能够按标志进行汇总,忽略用户组

df['cumsum'] = df[df['flag'] == 1 ]['num'].transform(pd.Series.cumsum)
Run Code Online (Sandbox Code Playgroud)

或用户忽略标志的 cumsum

df['cumsum'] = df.groupby('user')['num'].transform(pd.Series.cumsum)
Run Code Online (Sandbox Code Playgroud)

我需要帮助让他们一起工作。

python dataframe pandas cumsum pandas-groupby

6
推荐指数
1
解决办法
519
查看次数