在熊猫中,我们有pd.rolling_quantile(). 在 numpy 中,我们有np.percentile(),但我不确定如何进行滚动/移动版本。
解释我所说的移动/滚动百分位数/分位数是什么意思:
给定数组[1, 5, 7, 2, 4, 6, 9, 3, 8, 10],0.5窗口大小为 3的移动分位数(即移动百分位数 50%)为:
1
5 - 1 5 7 -> 0.5 quantile = 5
7 - 5 7 2 -> 5
2 - 7 2 4 -> 4
4 - 2 4 6 -> 4
6 - 4 6 9 -> 6
9 - 6 9 3 -> 6
3 - 9 3 8 -> 8
8 - …Run Code Online (Sandbox Code Playgroud) 我认为这在基础R中应该很容易,但我无法弄明白.我有一个简单的数据框,让我们说它看起来像这样
tbl <- read.table(text =
"Field1 Field2
100 200
150 180
200 160
280 250
300 300
300 250",
header = TRUE)
Run Code Online (Sandbox Code Playgroud)
现在,我想要做的是创建一个将应用滚动%添加的函数,例如:
fn <- function(tbl, pct) {}
Run Code Online (Sandbox Code Playgroud)
它接受上面的数据帧为tbl.它将当前行的百分比部分添加到基于NEXT的行pct,并且几乎以累积方式滚动它.
例如,fn(tbl$Field1, 0.1)会生成以下结果:
100 (100 + 0.1*0)
160 (150 + 0.1*100 = 160)
216 (200 + 0.1*160 = 216)
301.6 (280 + 0.1*216 = 301.6)
Run Code Online (Sandbox Code Playgroud)
等等
我会使用一个包解决方案,但更喜欢基础R,因为它有助于学习过程!我的长期目标是通过field和pct的每个组合构建一个循环,这样我就可以在回归模型中测试它的效果; 因此,我的直觉是,我后来可以应用的功能是前进的方向.
谢谢.
给定一个向量(数据框的列),我想创建一个滚动向量.
l = 0:10
Run Code Online (Sandbox Code Playgroud)
会返回,(窗口为3):
[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5] ...
Run Code Online (Sandbox Code Playgroud) 我有以下 data.frame:
grp nr yr
1: A 1.0 2009
2: A 2.0 2009
3: A 1.5 2009
4: A 1.0 2010
5: B 3.0 2009
6: B 2.0 2010
7: B NA 2011
8: C 3.0 2014
9: C 3.0 2019
10: C 3.0 2020
11: C 4.0 2021
Run Code Online (Sandbox Code Playgroud)
期望的输出:
grp nr yr nr_roll_period_3
1 A 1.0 2009 NA
2 A 2.0 2009 NA
3 A 1.5 2009 NA
4 A 1.0 2010 NA
5 B 3.0 2009 NA
6 …Run Code Online (Sandbox Code Playgroud) 我需要获得 df 的滚动第二大值。
为了获得最大的价值我所做的
max = df.sort_index(ascending=True).rolling(10).max()
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,python 抛出一个错误
max = df.sort_index(ascending=True).rolling(10).nlargest(2)
AttributeError: 'Rolling' object has no attribute 'nlargest'
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?我还能使用什么高性能的东西?
我有一个数据框,其中包含具有客户分析的不同商品的销售时间序列。对于每个项目和给定的一天,我想计算:
我试过这里提供的解决方案:
可以通过以下方式生成示例数据帧:
import pandas as pd
from datetime import timedelta
df_1 = pd.DataFrame()
df_2 = pd.DataFrame()
df_3 = pd.DataFrame()
# Create datetimes and data
df_1['item'] = [1, 1, 1, 2, 2, 2, 2]
df_1['date'] = pd.date_range('1/1/2018', periods=7, freq='D')
df_1['customer'] = ['a', 'b', 'c', 'a', 'b', 'b', 'c']
df_1['sales'] = [2, 4, 1, 5, 7, 2, 3]
df_2['item'] = [1, 1, 1, 2, 2, 2, 2]
df_2['date'] = …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的数据框:
import pandas as pd
df = pd.DataFrame({'ID': [1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3],
'val': [1,2,3,1,2,3,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3],
'time': [pd.Timestamp(2017, 1, 1, 12), pd.Timestamp(2017, 1, 1, 13), pd.Timestamp(2017, 1, 1, 14), pd.Timestamp(2017, 1, 2, 16), pd.Timestamp(2017, 1, 2, 17), pd.Timestamp(2017, 1, 2, 18), pd.Timestamp(2017, 1, 1, 12), pd.Timestamp(2017, 1, 1, 13), pd.Timestamp(2017, 1, 1, 14), pd.Timestamp(2017, 1, 1, 15), pd.Timestamp(2017, 1, 1, 16), pd.Timestamp(2017, 1, 2, 15), pd.Timestamp(2017, 1, 1, 12), pd.Timestamp(2017, 1, 1, 13), pd.Timestamp(2017, 1, 1, 14), pd.Timestamp(2017, 1, 1, 15), pd.Timestamp(2017, 1, 1, 16), …Run Code Online (Sandbox Code Playgroud) j 个表面接触后手部细菌的浓度可以由以下递归关系决定:
H[j+1]=H[j]+T[j]*(S[j]-H[j])
Run Code Online (Sandbox Code Playgroud)
S手触摸的表面浓度在哪里(为了方便,假设是随机的)。T是每个接触的传输效率。我想计算最终的手部浓度(起始浓度为零)。
我有一个数据框,它有一个表面接触向量和每个表面的传输效率。我有两个组a&b并且在每个组中假设我将依次触摸每个组1:length(df):
df <- data.frame(S = runif(10)*100, T = runif(10),g=rep(c("a","b"),each=5))
Run Code Online (Sandbox Code Playgroud)
我想在可能的情况下计算H按组计算的累积总和dplyr。
一个特例:
如果g = "a", 的起始值H为0。如果g=="b"那么的起始值H是从何时开始的最后一个值g=="a"
我使用函数mmax来计算一千万长度整数向量的移动最大值。我运行了 10 次来计算总执行时间。窗口大小 132 的运行时间(15,025 毫秒)是窗口大小 22 的运行时间(2,425 毫秒)的 6 倍。看起来复杂度mmax是 O(nw) 而不是 O(n),其中 w 是滑动窗口的长度)。
为了检查其他类似产品是否也是如此,我在 DolphinDB 上尝试了相同的实验,DolphinDB 是一个具有内置分析功能的时间序列数据库 ( https://www.dolphindb.com/downloads.html )。相比之下,DolphinDB\xe2\x80\x99smmax线性复杂度为 O(n),无论窗口大小如何:1,277 毫秒(窗口大小 132)和 1,233 毫秒(窗口大小 22)。
Server: Dell PowerEdge R630\nArchitecure: x86_64\nCPU Model Name: Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz\nTotal logical CPU cores: 48\nTotal memory: 256G\nRun Code Online (Sandbox Code Playgroud)\n我使用的是KDB+ 4.0 64位版本和DolphinDB_Linux_V2.00.7(DolphinDB社区版本:2核和8GB内存)。两个实验均使用 2 核 CPU 进行。
\n// Start the server\nrlwrap -r taskset -c 0,1 …Run Code Online (Sandbox Code Playgroud) 我有一个列date和列表time_spent.我想为每个日期D找到一段时间内'time_spent'值的总和:(D-7-D),即.过去一周+当天.
我无法找到一种方法来做到这一点,因为我只能找到总和的例子而不是可变时间段的总和.
这是一个数据集示例:
CREATE TABLE rolling_total
(
date date,
time_spent int
);
INSERT INTO rolling_total VALUES ('2013-09-01','2'),
('2013-09-02','1'),
('2013-09-03','3'),
('2013-09-04','4'),
('2013-09-05','2'),
('2013-09-06','5'),
('2013-09-07','3'),
('2013-09-08','2'),
('2013-09-09','1'),
('2013-09-10','1'),
('2013-09-11','1'),
('2013-09-12','3'),
('2013-09-13','2'),
('2013-09-14','4'),
('2013-09-15','6'),
('2013-09-16','1'),
('2013-09-17','2'),
('2013-09-18','3'),
('2013-09-19','4'),
('2013-09-20','1'),
('2013-09-21','6'),
('2013-09-22','5'),
('2013-09-23','3'),
('2013-09-24','1'),
('2013-09-25','5'),
('2013-09-26','2'),
('2013-09-27','1'),
('2013-09-28','4'),
('2013-09-29','3'),
('2013-09-30','2')
Run Code Online (Sandbox Code Playgroud)
结果如下:
date | time_spent | rolling_week_total
2013-09-01 | 2 | 2
2013-09-02 | 1 | 3
2013-09-03 | 3 | 6
2013-09-04 | 4 | 10
2013-09-05 | 2 | …Run Code Online (Sandbox Code Playgroud)