我有一系列时间访问建筑物的人.每个人都有一个唯一的身份证.对于时间序列中的每条记录,我想知道过去365天内访问建筑物的唯一人数(即滚动的唯一人数,窗口为365天).
pandas似乎没有用于此计算的内置方法.当存在大量唯一访问者和/或大窗口时,计算变得计算密集.(实际数据大于此示例.)
有没有比我在下面做的更好的计算方法?我不确定为什么我制作的快速方法windowed_nunique(在"速度测试3"下)偏离1.
谢谢你的帮助!
相关链接:
pandas问题:https://github.com/pandas-dev/pandas/issues/14336In [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
我正在尝试在带有月度数据的 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) 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+2SS(或有关 的其他汇总统计数据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 循环,但它真的很慢。 …
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。
我想在“A”列上应用 groupby,
根据列 '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 …
我正在编写一个代码,它将滚动窗口应用于将返回多列的函数。
输入: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)
我尝试过的:
我想计算下面数据帧中每一行的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-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 …
我有一个相当大的数据集(大约 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
我有一个大约有 100 亿行的数据集。我正在寻找最高效的方法来计算四个不同时间窗口(3 天、7 天、14 天、21 天)内的滚动/窗口聚合/指标(总和、平均值、最小值、最大值、stddev)。
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
对于以下示例数据:
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) 但不确定如何让它在滚动的基础上工作。
我正在尝试构建一种可扩展的方法来计算修改了某个文件(截至并包括最新的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) pandas ×9
python ×8
dataframe ×2
apache-spark ×1
append ×1
group-by ×1
pyspark ×1
rows ×1
sum ×1
time-series ×1