标签: rolling-computation

当 roll() 应用于 groupby pandas 对象时,多索引重复

我有一个错误:

x.field.rolling(window=5,min_periods=1).mean() 其中x是一个pandas.core.groupby.groupby.DataFrameGroupBy对象。

我尝试了本页中提出的解决方案。所以我这样做了:

x.field.apply(lambda x: x.rolling(window=5,min_periods=1).mean())

与上面介绍的网页相反,我仍然遇到同样的错误。

+---------+---------+-------+--------------------+
| machin  | machin  | truc  | a column of series |
+---------+---------+-------+--------------------+
| machin1 | machin1 | truc1 | 1                  |
|         |         | truc2 | 2                  |
|         |         | truc3 | 3                  |
|         |         | truc4 | 4                  |
| machin2 | machin2 | truc1 | 100                |
|         |         | truc2 | 99                 |
|         |         | truc3 | 98 …
Run Code Online (Sandbox Code Playgroud)

python pandas rolling-computation pandas-groupby

5
推荐指数
1
解决办法
1155
查看次数

Pandas groupby ewm

我已经标记了事件(时间序列)数据,其中事件以给定标签的随机间隔发生。我想计算组内 ewma 并将其作为新列“X1_EWMA”添加到数据框中。这是到目前为止的代码:

import pandas as pd
import numpy as np
import altair as alt

n = 1000
df = pd.DataFrame({
    'T': pd.date_range('20190101', periods=n, freq='H'),
    'C1': np.random.choice(list('PYTHON'), n),
    'C2': np.random.choice(list('FUN'), n),
    'X1': np.random.randn(n),
    'X2': 100 + 10 * np.random.randn(n)
})

ts = df.set_index('T')

display(df.head())
display(ts.head())
Run Code Online (Sandbox Code Playgroud)

感谢SO:Pandas Groupby 和带有自定义函数的应用方法),我能够使用以下方法计算分组的 EWMA:

ewm = ts.groupby(['C1']).apply(lambda x: x['X1'].ewm(halflife=10).mean())
ewm.head()
Run Code Online (Sandbox Code Playgroud)

它产生一个系列,由一个分类变量和日期时间索引。系列的长度与原始数据帧和时间系列(df 和 ts)相同

现在我想我可以做一些体操,通过加入行索引(假设排序顺序没有改变)来将它重新连接到原始数据框(df),但这似乎不对,甚至可能是一种冒险的方法,因为 groupby 仅在分类标签之一内 - 我需要小心并进行一些检查/排序/重新索引。

似乎应该有一种更简单的方法将时间序列列直接添加到数据帧 (df) 或时间序列 (ts),而无需创建单独的序列或数据帧并加入它们。如果我想添加滚动统计数据,情况也是如此,例如:

ts.groupby('C1').rolling(10).mean()
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的任何帮助或输入。

结果基于接受的答案:

import pandas as pd
import numpy as np …
Run Code Online (Sandbox Code Playgroud)

python time-series pandas rolling-computation pandas-groupby

5
推荐指数
1
解决办法
3867
查看次数

如何使用另一列的滚动平均值创建新列-Python

我有一个数据框:

import pandas as pd
import numpy as np
d1 = {'id': [11, 11,11,11,11,24,24,24,24,24,24], 
     'PT': [3, 3,6,0,9,4,2,3,4,5,0], 
      "date":["2010-10-10","2010-10-12","2010-10-16","2010-10-18","2010-10-22","2010-10-10","2010-10-11","2010-10-14","2010-10-16","2010-10-19","2010-10-22"], 
        }

df1 = pd.DataFrame(data=d1)

    id  PT  date
0   11  3   2010-10-10
1   11  3   2010-10-12
2   11  6   2010-10-16
3   11  0   2010-10-18
4   11  9   2010-10-22
5   24  4   2010-10-10
6   24  2   2010-10-11
7   24  3   2010-10-14
8   24  4   2010-10-16
9   24  5   2010-10-19
10  24  0   2010-10-22
Run Code Online (Sandbox Code Playgroud)

我想在最后3个条目的移动窗口中PT为每个列计算滚动平均值。此外,如果还没有该条目的3个,我想获得最后2个条目或当前条目的平均值。结果应如下所示:ididid

id  PT  date    Rolling mean …
Run Code Online (Sandbox Code Playgroud)

python dataframe rolling-computation

5
推荐指数
1
解决办法
21
查看次数

Python 中的滚动哈希非常快?

我正在rsync用 Python 编写一个类似玩具的工具。与许多类似的工具一样,它首先使用非常快的哈希作为滚动哈希,然后在找到匹配项后使用 SHA256(但后者不在此处的主题:SHA256、MDA5 等作为滚动哈希太慢)哈希)。

我目前正在测试各种快速哈希方法:

import os, random, time

block_size = 1024  # 1 KB blocks
total_size = 10*1024*1024  # 10 MB random bytes
s = os.urandom(total_size)

t0 = time.time()
for i in range(len(s)-block_size):
    h = hash(s[i:i+block_size])
print('rolling hashes computed in %.1f sec (%.1f MB/s)' % (time.time()-t0, total_size/1024/1024/(time.time()-t0)))
Run Code Online (Sandbox Code Playgroud)

我得到:0.8 MB/s ...所以Python内置hash(...)函数在这里太慢了。

哪种解决方案可以在标准机器上实现至少 10 MB/s 的更快哈希值?

python hash for-loop sha256 rolling-computation

5
推荐指数
1
解决办法
4528
查看次数

(1-previous_record)*current_record 的累积积

数据框包含两个变量 ( timeand rate) 和 10 个观测值

time <- seq(1:10) 
rate <- 1-(0.99^time)
dat <- data.frame(time, rate)
Run Code Online (Sandbox Code Playgroud)

我需要添加一个新列(称为new_rate)。

new_rate 定义如下

注意:new_rate_1是new列new_rate等的第一次观察。

new_rate_1 = rate_1
new_rate_2 = (1-rate_1)*rate_2
new_rate_3 = (1-rate_1)*(1-rate_2)*rate_3
new_rate_4 = (1-rate_1)*(1-rate_2)*(1-rate_3)*rate_4
...
new_rate_10 = (1-rate_1)*(1-rate_2)*(1-rate_3)*(1-rate_4)*(1-rate_5)*(1-rate_6)*(1-rate_7)*(1-rate_8)*(1-rate_9)*rate_10
Run Code Online (Sandbox Code Playgroud)

如何在基础 Rdplyr?

iteration r accumulate dplyr rolling-computation

5
推荐指数
1
解决办法
135
查看次数

R:传递多个参数来累加/减少

这与R有关:使用上一行新生成的数据

我意识到我面临的实际问题比我在上面线程中给出的示例要复杂一些 - 似乎我必须将 3 个参数传递给递归计算才能实现我想要的。因此,accumulate2reduce可能不起作用。所以我在这里提出一个新问题以避免可能的混淆。

我有以下按 ID 分组的数据集:

ID <- c(1, 2, 2, 3, 3, 3)
pw <- c(1:6)
add <- c(1, 2, 3, 5, 7, 8)
x <- c(1, 2, NA, 4, NA, NA)
df <- data.frame(ID, pw, add, x)

df
  ID pw add  x
1  1  1   1  1
2  2  2   2  2
3  2  3   3 NA
4  3  4   5  4
5  3  5   7 NA
6 …
Run Code Online (Sandbox Code Playgroud)

iteration r accumulate rolling-computation

5
推荐指数
2
解决办法
222
查看次数

在同一个变异函数 dplyr 中使用滞后结果

我想使用dplyr+ 滞后函数复制以下公式 R。代码工作到每组的第二行,然后继续给我 0

预测 = 滞后(价值,1)*(1-滞后(损耗)/52)

状况:

  1. 预测的第一个值应该是空的,因为我们已经有了值。
  2. 第二行根据 Attrition 和 Value 列的先前值进行计算。
  3. 第三行之前的值应分别从预测(不是值列)和损耗列中选取。

我从第 3 行开始得到 0。下面是我的复制代码。

data <- data %>% group_by(Patch) %>% mutate(id = row_number())
data <- data %>% group_by(Patch) %>% mutate(forecast = lag(Value,1)*(1-lag(Attrition,1)/52))

tbl_df(data)
# A tibble: 12 x 6
   Patch Week       Value Attrition    id forecast
   <chr> <date>     <dbl>     <dbl> <int>    <dbl>
 1 11P11 2021-06-14     2     0.075     1   NA    
 2 11P11 2021-06-21     0     0.075     2    2.00 
 3 11P11 2021-06-28     0     0.075     3    0    
 4 …
Run Code Online (Sandbox Code Playgroud)

r data-analysis accumulate dplyr rolling-computation

5
推荐指数
1
解决办法
107
查看次数

获取Pandas滚动窗口的索引

我想获取 Pandas Series 的每个滚动窗口中元素的索引。

对我有用的解决方案来自对现有问题的回答:我答案中描述的函数中获得了window.index每个值。我只对上述功能感兴趣。windowrollingstep=1

但这个函数并不是特定于 DataFrames 和 Series 的,它可以在基本的 Python 列表上工作。是否有一些功能可以利用 Pandas 的滚动操作?

我尝试了Rolling.apply方法:

s = pd.Series([1, 2, 3, 4, 5, 6, 7])

rolling = s.rolling(window=3)
indexes = rolling.apply(lambda x: x.index)
Run Code Online (Sandbox Code Playgroud)

但它的结果是TypeError: must be real number, not RangeIndex. 显然,该Rolling.apply方法仅接受基于每个窗口返回数字的函数。这些函数不能返回其他类型的对象。

Rolling我可以使用Pandas 类的其他方法吗?甚至是私有方法。

或者还有其他 Pandas 特定的功能来获取重叠滚动窗口的索引吗?

预期产出

作为输出,我期望某种列表对象。每个内部列表应该计算每个窗口的索引值。原始s系列有[0, 1, 2, 3, 4, 5, 6]索引。因此,使用 a 滚动window=3,我期望结果如下:

[
    [0, 1, 2],
    [1, …
Run Code Online (Sandbox Code Playgroud)

python pandas rolling-computation

5
推荐指数
1
解决办法
2091
查看次数

PostgreSQL 使用组和顺序计算滚动平均值

我有一张表如下

id    |   x    |  y    |  value
------+--------+-------+------------
 1    |   1    |  1    |  25
 1    |   1    |  2    |  42
 1    |   2    |  3    |  98
 1    |   2    |  4    |  54
 1    |   3    |  5    |  67
 2    |   1    |  1    |  78
 2    |   1    |  2    |  45
 2    |   2    |  3    |  96
Run Code Online (Sandbox Code Playgroud)

我必须按 id 对其进行分组,同时按 id、x 和 y(按各自的顺序)保持顺序,并计算前 n 行的滚动平均值。例如,如果 n = 3

id    |   x    | …
Run Code Online (Sandbox Code Playgroud)

sql postgresql rolling-computation

4
推荐指数
1
解决办法
3340
查看次数

R 中可变窗口滚动最大/分钟的内存效率

我一直在进行一项练习,需要在一些大型数据集(约 100 - 2.5 亿行)上计算可变窗口长度的最大/分钟。

简而言之,我有一个表显示开始和结束索引(下面用“Lookup_table”表示),它反映了第二个表(下面称为“Price_table”)的行位置。使用这些行位置,然后我需要提取“Price_table”中特定列的最大值和最小值。我需要对“查找”表的所有行重复此操作。

例如,如果“Lookup_table”的第一行 Start = 1 且 End = 5,我需要从第 1 行到第 5 行(包括第 5 行)查找 Price_table 中目标列的最大值/最小值。然后,如果第二列的 Start = 6、End = 12,我将在 Price_table 中找到第 6 行到第 12 行的最大值/最小值,依此类推。

我在下面创建了一组包含 10,000 行的虚拟数据(对所有包要求表示歉意)。

require(data.table)
require(dplyr)
require(purrr)
   
# Number of rows
nn <- 10000
# Create a random table of Price data with 1,000,000 rows
Price_table <- data.table(Price = runif(nn,300,1000)) %>% mutate(.,Index = seq_len(nrow(.)))

# Create a lookup table with start / end indexes
Lookup_table <- data.table(Start = …
Run Code Online (Sandbox Code Playgroud)

r mapply data.table rolling-computation purrr

4
推荐指数
1
解决办法
253
查看次数