我想有一系列元素概率[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)
它有效,但它太复杂,必须有更好的方法.谢谢.
我有一组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()会依赖于此.
有人有想法吗?
说我有这样的数组
>>> 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在效率或可读性方面占主导地位.
这是对我之前发布的问题的调整.这是我的数据:
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) 我有一个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被累积和替换.但是,我的问题是将累积和作为新列添加到现有数据框中.
谢谢
我有一个包含两列 ID 和活动的数据框。活动为 0 或 1。我想要一个包含自上次活动为 1 以来递增数字的新列。但是,计数应仅在一个组 (ID) 内。如果活动为 1,则计数列应重置为 0,然后重新开始计数。
所以,我有一个包含以下内容的数据框:
想要的是这个:
有人能帮我吗?
为什么这两个操作不同?
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
我有一个数据帧如下.它按列排序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) 我花了几个小时试图在熊猫数据框架上做一个"累计组合".我已经查看了所有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
我在尝试着
所以期望的输出是:
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中,然后才打印总和.
假设我有以下数据框
| 日期 | 旗帜 | 用户 | 编号 | |
|---|---|---|---|---|
| 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)
我需要帮助让他们一起工作。