标签: rolling-computation

如何有效地计算熊猫时间序列中的滚动唯一计数?

我有一系列时间访问建筑物的人.每个人都有一个唯一的身份证.对于时间序列中的每条记录,我想知道过去365天内访问建筑物的唯一人数(即滚动的唯一人数,窗口为365天).

pandas似乎没有用于此计算的内置方法.当存在大量唯一访问者和/或大窗口时,计算变得计算密集.(实际数据大于此示例.)

有没有比我在下面做的更好的计算方法?我不确定为什么我制作的快速方法windowed_nunique(在"速度测试3"下)偏离1.

谢谢你的帮助!

相关链接:

初始化

In [1]:

# Import libraries.
import pandas as pd
import numba
import numpy as np
Run Code Online (Sandbox Code Playgroud)

In [2]:

# Create data of people visiting a building.

np.random.seed(seed=0)
dates = pd.date_range(start='2010-01-01', end='2015-01-01', freq='D')
window = 365 # days
num_pids = 100
probs = np.linspace(start=0.001, stop=0.1, num=num_pids)

df = pd\
    .DataFrame(
        data=[(date, pid)
              for (pid, prob) in zip(range(num_pids), probs)
              for date in np.compress(np.random.binomial(n=1, p=prob, size=len(dates)), …
Run Code Online (Sandbox Code Playgroud)

python time-series distinct-values pandas rolling-computation

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

具有每月偏移量的熊猫滚动()函数

我正在尝试在带有月度数据的 Pandas 数据框上使用滚动()函数。但是,我删除了一些 NaN 值,所以现在我的时间序列中有一些差距。因此,基本窗口参数给出了一个误导性的答案,因为它只是查看之前的观察结果:

import pandas as pd
import numpy as np
import random
dft = pd.DataFrame(np.random.randint(0,10,size=len(dt)),index=dt)
dft.columns = ['value']
dft['value'] = np.where(dft['value'] < 3,np.nan,dft['value'])
dft = dft.dropna()
dft['basic'] = dft['value'].rolling(2).sum()
Run Code Online (Sandbox Code Playgroud)

例如,参见 2017-08-31 条目,其总和为 3.0 和 9.0,但上一个条目是 2017-03-31。

In [57]: dft.tail()
Out[57]:
            value  basic
2017-02-28    8.0   12.0
2017-03-31    3.0   11.0
2017-08-31    9.0   12.0
2017-10-31    7.0   16.0
2017-11-30    7.0   14.0
Run Code Online (Sandbox Code Playgroud)

自然的解决方案(我认为)是使用“2M”偏移量,但它给出了一个错误:

In [58]: dft['basic2M'] = dft['value'].rolling('2M').sum()
...<output omitted>...
ValueError: <2 * MonthEnds> is a non-fixed frequency
Run Code Online (Sandbox Code Playgroud)

如果我移动每日偏移量,我可以让它工作,但这似乎是一个奇怪的解决方法:

In [59]: dft['basic32D'] …
Run Code Online (Sandbox Code Playgroud)

python window-functions pandas rolling-computation

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

Pandas - 在多列上使用 `.rolling()`

DataFrame考虑一只看起来像下面的熊猫

      A     B     C
0  0.63  1.12  1.73
1  2.20 -2.16 -0.13
2  0.97 -0.68  1.09
3 -0.78 -1.22  0.96
4 -0.06 -0.02  2.18
Run Code Online (Sandbox Code Playgroud)

我想使用该函数.rolling()执行以下计算t = 0,1,2

  • t选择从到 的行t+2
  • 从所有列中获取这 3 行中包含的 9 个值。调用此设置S
  • 计算 的第 75 个百分位S(或有关 的其他汇总统计数据S


例如,t = 1我们有 S = { 2.2 , -2.16, -0.13, 0.97, -0.68, 1.09, -0.78, -1.22, 0.96 } 并且第 75 个百分位数是 0.97。

我找不到让它与 一起工作的方法.rolling(),因为它显然单独使用每一列。我现在依靠 for 循环,但它真的很慢。 …

python dataframe pandas rolling-computation

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

如何在df.groupby之后将数据框列值作为窗口大小传递?

    A   B   C
0   1   10  2
1   1   15  2
2   1   14  2
3   2   11  4
4   2   12  4
5   2   13  4
6   2   16  4
7   1   18  2
Run Code Online (Sandbox Code Playgroud)

这是我的示例 DataFrame。

  1. 我想在“A”列上应用 groupby,

  2. 根据列 'C' 的值在列 'B' 上应用滚动总和,这意味着当 A 为 1 时,窗口大小应为 2 而不是 NaN 我想要剩余值的总和,而不管窗口大小如何。

目前我的输出是:

A   
1  0    25.0
   1    29.0
   2    32.0
   7     NaN
2  3    23.0
   4    25.0
   5    29.0
   6     NaN
Run Code Online (Sandbox Code Playgroud)

上面的代码: df['B'].groupby(df['A']).rolling(df['C'][0]).sum().shift(-1)

当 C = 4 时,我希望滚动窗口为 4 …

python group-by sum pandas rolling-computation

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

Pandas 适用于多列输出的滚动

我正在编写一个代码,它将滚动窗口应用于将返回多列的函数。

输入:Pandas Series
预期输出:3 列 DataFrame

def fun1(series, ):
    # Some calculations producing numbers a, b and c
    return {"a": a, "b": b, "c": c} 

res.rolling('21 D').apply(fun1)
Run Code Online (Sandbox Code Playgroud)

资源内容:

time
2019-09-26 16:00:00    0.674969
2019-09-26 16:15:00    0.249569
2019-09-26 16:30:00   -0.529949
2019-09-26 16:45:00   -0.247077
2019-09-26 17:00:00    0.390827
                         ...   
2019-10-17 22:45:00    0.232998
2019-10-17 23:00:00    0.590827
2019-10-17 23:15:00    0.768991
2019-10-17 23:30:00    0.142661
2019-10-17 23:45:00   -0.555284
Length: 1830, dtype: float64
Run Code Online (Sandbox Code Playgroud)

错误:

TypeError: must be real number, not dict
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

  • 在 apply 中更改 raw=True
  • 在 apply 中使用 …

python dataframe pandas rolling-computation

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

列日期的1年滚动平均大熊猫

我想计算下面数据帧中每一行的1年滚动平均值

测试:

index   id      date        variation
2313    7034    2018-03-14  4.139148e-06
2314    7034    2018-03-13  4.953194e-07
2315    7034    2018-03-12  2.854749e-06
2316    7034    2018-03-09  3.907458e-06
2317    7034    2018-03-08  1.662412e-06
2318    7034    2018-03-07  1.346433e-06
2319    7034    2018-03-06  8.731700e-06
2320    7034    2018-03-05  7.145597e-06
2321    7034    2018-03-02  4.893283e-06
...
Run Code Online (Sandbox Code Playgroud)

例如,我需要计算:

  • 2018-03-14和2017-08-14之间的变化均值为7034
  • 2018-03-13和2017-08-13之间的变化均值为7034

  • 等等

我试过了:

test.groupby(['id','date'])['variation'].rolling(window=1,freq='Y',on='date').mean()
Run Code Online (Sandbox Code Playgroud)

但是我收到了错误消息:

ValueError: invalid on specified as date, must be a column (if DataFrame) or None
Run Code Online (Sandbox Code Playgroud)

我怎样才能使用pandas rolling()功能呢?

[编辑1]

谢谢Sacul

我测试过:

df['date'] = pd.to_datetime(df['date'])

df.set_index('date').groupby('id').rolling(window=1, freq='Y').mean()['variation']
Run Code Online (Sandbox Code Playgroud)

但是freq='Y'不起作用(我得到了:) ValueError: Invalid …

python pandas rolling-computation rolling-average

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

pandas滚动窗口有效添加新行

我有一个相当大的数据集(大约 500 万行),其中有几个计算列,如滞后(1 和 7)和滚动窗口(7、30、90,每个都有几个值,如平均值、标准差、最小值、最大值等)。现在我需要向df添加一行或多行,我想知道(重新)计算这些特征的最有效方法。重新计算整个df会花费太多时间,但我不能简单地将函数应用于新添加的行。

对于滞后这不是一个大问题,我可以简单地,例如对于滞后 1,

df.iloc[-1, -2] = df.iloc[-2, -2]
Run Code Online (Sandbox Code Playgroud)

这应该可以解决问题(与滞后 7 相同),但是滚动窗口呢?同样的方法行不通,我无法在整个数据帧上(重新)运行滚动窗口。我要手工计算吗?还有其他办法吗?

Python 3.7.7 和 pandas 1.0.3

append rows pandas rolling-computation

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

pyspark 时间序列数据的高性能滚动/窗口聚合

基本问题

我有一个大约有 100 亿行的数据集。我正在寻找最高效的方法来计算四个不同时间窗口(3 天、7 天、14 天、21 天)内的滚动/窗口聚合/指标(总和、平均值、最小值、最大值、stddev)。

Spark/AWS EMR 规格

Spark 版本:2.4.4
ec2 实例类型:r5.24xlarge
核心 ec2 实例数量:10
pyspark 分区数量:600

概述

我读了一堆 SO 帖子,这些帖子要么解决了计算滚动统计的机制,要么解决了如何使窗口函数更快。然而,没有一篇文章以解决我的问题的方式结合这两个概念。我在下面显示了一些选项,它们可以完成我想要的操作,但我需要它们在我的真实数据集上运行得更快,因此我正在寻找更快/更好的建议。

我的数据集的结构如下,但约有 100 亿行:

+--------------------------+----+-----+
|date                      |name|value|
+--------------------------+----+-----+
|2020-12-20 17:45:19.536796|1   |5    |
|2020-12-21 17:45:19.53683 |1   |105  |
|2020-12-22 17:45:19.536846|1   |205  |
|2020-12-23 17:45:19.536861|1   |305  |
|2020-12-24 17:45:19.536875|1   |405  |
|2020-12-25 17:45:19.536891|1   |505  |
|2020-12-26 17:45:19.536906|1   |605  |
|2020-12-20 17:45:19.536796|2   |10   |
|2020-12-21 17:45:19.53683 |2   |110  |
|2020-12-22 17:45:19.536846|2   |210  |
|2020-12-23 17:45:19.536861|2   |310  |
|2020-12-24 17:45:19.536875|2   |410 …
Run Code Online (Sandbox Code Playgroud)

window-functions apache-spark apache-spark-sql rolling-computation pyspark

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

基于另一列的熊猫滚动第二个最高值

对于以下示例数据:

data={'Person':['a','a','a','a','a','b','b','b','b','b','b'],
     'Sales':['50','60','90','30','33','100','600','80','90','400','550'],
     'Price':['10','12','8','10','12','10','13','16','14','12','10']}
data=pd.DataFrame(data)
Run Code Online (Sandbox Code Playgroud)

对于每个人(组),我希望以滚动方式根据第二高的销售额计算价格,但每个组的窗口会有所不同。结果应如下所示:

result={'Person':['a','a','a','a','a','b','b','b','b','b','b'],
     'Sales':['50','60','90','30','33','100','600','80','90','400','550'],
     'Price':['10','12','8','10','12','10','13','16','14','12','10'],
     'Second_Highest_Price':['','10','12','12','12','','10','10','10','12','10']}
Run Code Online (Sandbox Code Playgroud)

我尝试使用 nlargest(2) 但不确定如何让它在滚动的基础上工作。

python pandas rolling-computation

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

高效的pandas grouby + nunique滚动计算

我正在尝试构建一种可扩展的方法来计算修改了某个文件(截至并包括最新的modified_date)的唯一成员的数量。该unique_member_until_now列包含每个文件的预期结果。

import pandas as pd
from pandas import Timestamp

# Example Dataset

df = pd.DataFrame({'File': ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C'],
 'Member': ['X', 'X', 'Y', 'X', 'Y', 'Y', 'X', 'Z', 'Y', 'X', 'Y', 'X'],
 'modified_date': [Timestamp('2021-11-25 00:00:00'),
  Timestamp('2021-11-28 00:00:00'),
  Timestamp('2021-12-14 00:00:00'),
  Timestamp('2021-10-17 00:00:00'),
  Timestamp('2021-11-01 00:00:00'),
  Timestamp('2021-11-04 00:00:00'),
  Timestamp('2021-11-16 00:00:00'),
  Timestamp('2021-12-16 00:00:00'),
  Timestamp('2021-12-29 00:00:00'),
  Timestamp('2021-10-30 00:00:00'),
  Timestamp('2021-11-23 00:00:00'),
  Timestamp('2021-12-17 00:00:00')],
 'unique_member_until_now': [1, 1, 2, 1, 2, 2, 2, 3, 3, 1, 2, 2]}) …
Run Code Online (Sandbox Code Playgroud)

python pandas rolling-computation pandas-groupby

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