我有一个grouped类型的时间序列对象<pandas.core.groupby.SeriesGroupBy object at 0x03F1A9F0>.grouped.sum()给出了期望的结果,但我无法使用rolling_sum来处理groupby对象.有没有办法将滚动功能应用于groupby对象?例如:
x = range(0, 6)
id = ['a', 'a', 'a', 'b', 'b', 'b']
df = DataFrame(zip(id, x), columns = ['id', 'x'])
df.groupby('id').sum()
id x
a 3
b 12
Run Code Online (Sandbox Code Playgroud)
但是,我希望有类似的东西:
id x
0 a 0
1 a 1
2 a 3
3 b 3
4 b 7
5 b 12
Run Code Online (Sandbox Code Playgroud) python pandas rolling-computation rolling-sum pandas-groupby
我正在尝试pandas.DataFrame.rolling.apply()在多列上使用滚动函数。Python 版本是 3.7,pandas 是 1.0.2。
import pandas as pd
#function to calculate
def masscenter(x):
print(x); # for debug purposes
return 0;
#simple DF creation routine
df = pd.DataFrame( [['02:59:47.000282', 87.60, 739],
['03:00:01.042391', 87.51, 10],
['03:00:01.630182', 87.51, 10],
['03:00:01.635150', 88.00, 792],
['03:00:01.914104', 88.00, 10]],
columns=['stamp', 'price','nQty'])
df['stamp'] = pd.to_datetime(df2['stamp'], format='%H:%M:%S.%f')
df.set_index('stamp', inplace=True, drop=True)
Run Code Online (Sandbox Code Playgroud)
'stamp'是单调且唯一的,'price'是双精度'nQty'值且不包含 NaN,是整数且也不包含 NaN。
所以,我需要计算滚动的“质心”,即sum(price*nQty)/sum(nQty)。
到目前为止我尝试过的:
df.apply(masscenter, axis = 1)
Run Code Online (Sandbox Code Playgroud)
masscenter 被单行调用 5 次,输出将类似于
price 87.6
nQty 739.0
Name: 1900-01-01 …Run Code Online (Sandbox Code Playgroud) 我想对丢失的数据进行滚动计算.
示例代码:( 为了简单起见,我给出了滚动总和的示例,但我想做一些更通用的事情.)
foo = lambda z: z[pandas.notnull(z)].sum()
x = np.arange(10, dtype="float")
x[6] = np.NaN
x2 = pandas.Series(x)
pandas.rolling_apply(x2, 3, foo)
Run Code Online (Sandbox Code Playgroud)
产生:
0 NaN
1 NaN
2 3
3 6
4 9
5 12
6 NaN
7 NaN
8 NaN
9 24
Run Code Online (Sandbox Code Playgroud)
我认为在"滚动"期间,计算中忽略了缺少数据的窗口.我希望得到一个结果:
0 NaN
1 NaN
2 3
3 6
4 9
5 12
6 9
7 12
8 15
9 24
Run Code Online (Sandbox Code Playgroud) 我导入的数据包含7个变量:Y和X1,X2,X3,X4,X5,X6.我尝试应用该rollapply函数,zoo以便在样本内运行滚动回归,窗口为262 obs.(一年中的工作日).
date Y X1 X2
1 10/1/07 -0.0080321720 4.690734e-03 3.333770e-03
2 10/2/07 0.0000000000 -2.818413e-03 5.418223e-03
3 10/3/07 0.0023158650 -4.178744e-03 -3.821100e-04
4 10/4/07 -0.0057491710 -5.071030e-03 -8.321550e-04
5 10/5/07 0.0073570500 3.065045e-03 5.179574e-03
6 10/8/07 0.0127708010 -7.278513e-03 1.145395e-03
7 10/9/07 0.0032661980 9.692267e-03 6.514035e-03
8 10/10/07 0.0013824430 1.161780e-04 2.676416e-03
9 10/11/07 0.0026607550 1.113179e-02 8.825719e-03
10 10/12/07 -0.0046362600 -2.453561e-03 -6.584070e-03
11 10/15/07 -0.0023757680 -7.829081e-03 -3.070540e-03
12 …Run Code Online (Sandbox Code Playgroud) 关于在R中滚动回归有很多问题,但在这里我特意寻找使用的东西dplyr,broom并且(如果需要的话)purrr.
这就是使这个问题与众不同的原因.我希望tidyverse保持一致.是否可以使用诸如purrr:map和之类的整洁工具进行适当的运行回归dplyr?
请考虑这个简单的例子:
library(dplyr)
library(purrr)
library(broom)
library(zoo)
library(lubridate)
mydata = data_frame('group' = c('a','a', 'a','a','b', 'b', 'b', 'b'),
'y' = c(1,2,3,4,2,3,4,5),
'x' = c(2,4,6,8,6,9,12,15),
'date' = c(ymd('2016-06-01', '2016-06-02', '2016-06-03', '2016-06-04',
'2016-06-03', '2016-06-04', '2016-06-05','2016-06-06')))
group y x date
<chr> <dbl> <dbl> <date>
1 a 1.00 2.00 2016-06-01
2 a 2.00 4.00 2016-06-02
3 a 3.00 6.00 2016-06-03
4 a 4.00 8.00 2016-06-04
5 b 2.00 6.00 2016-06-03
6 b 3.00 …Run Code Online (Sandbox Code Playgroud) 这篇出色的文章非常清楚地说明了如何使用cumsum()Pandas DataFrame 方法构建一个 3D 张量,该张量包含一个包含列表列表的列,这些列表的维度使其适合用作 LSTM 的时间序列输入。我想做一些非常相似的事情,但使用列表滚动列表而不是列表的累积聚合。
例如。假设您有一个包含 3 个时间序列的 DataFrame:
A B C
1 2 3
4 5 6
7 8 9
10 11 12
Run Code Online (Sandbox Code Playgroud)
我上面链接的文章向您展示了如何使用cumsum()Pandas 构建一个嵌套列表的 DataFrame 列,如下所示:
[[1, 2, 3]]
[[1, 2, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Run Code Online (Sandbox Code Playgroud)
完成此操作的 Python 代码的关键行如下:
input_cols = list(df.columns)
df['single_list'] = df[input_cols].apply(
tuple, axis=1).apply(list)
df['double_encapsulated'] = df.single_list.apply(
lambda x: [list(x)])
Run Code Online (Sandbox Code Playgroud)
但我想要一个滚动的列表窗口,而不是列表的累积总和。它应该是这样的:
[[1, 2, 3], [4, 5, …Run Code Online (Sandbox Code Playgroud) 我有一个日期时间系列的 dtype:float64。我正在尝试将自定义函数应用于该系列的滚动窗口。我希望这个函数返回字符串。但是,这会生成 TypeError。为什么这会产生错误,有没有办法直接通过应用一个函数来使这个工作?
下面是一个例子:
import numpy as np
import pandas as pd
np.random.seed(1)
number_series = pd.Series(np.random.randint(low=1,high=100,size=100),index=[pd.date_range(start='2000-01-01',freq='W',periods=100)])
number_series = number_series.apply(lambda x: float(x))
def func(s):
if s[-1] > s[-2] > s[-3]:
return 'High'
elif s[-1] > s[-2]:
return 'Medium'
else:
return 'Low'
new_series = number_series.rolling(5).apply(func)
Run Code Online (Sandbox Code Playgroud)
结果是以下错误:
TypeError: must be real number, not str
Run Code Online (Sandbox Code Playgroud)
我目前采用的解决方法是修改 func 以将整数输出到一个系列,然后将另一个函数应用于该系列以生成新系列。按照下面的例子:
def func_float(s):
if s[-1] > s[-2] > s[-3]:
return 1
elif s[-1] > s[-2]:
return 2
else:
return 3
float_series = number_series.rolling(5).apply(func_float)
def func_text(s):
if s …Run Code Online (Sandbox Code Playgroud) 让我先说一下,为了重现这个问题,我需要一个大数据,这是问题的一部分,我无法预测什么时候会出现这种特殊性。无论如何,数据太大(~13k 行,2 列)无法粘贴到问题中,我在帖子末尾添加了一个 pastebin 链接。
在过去的几天里,我遇到了一个奇怪的问题pandas.core.window.rolling.Rolling.corr。我有一个数据集,我试图在其中计算滚动相关性。这就是问题:
在计算
window_size=100两列 (aandb)之间的滚动 ( ) 相关性时:一些索引(一个这样的索引是12981)给出接近的0值(顺序1e-10),但理想情况下它应该返回nanorinf,(因为一列中的所有值都是常数)。但是,如果我只是计算与该索引有关的独立相关性(即包括所述索引的最后 100 行数据),或者对较少数量的行(例如 300 或 1000 而不是 13k)执行滚动计算,我得到正确的结果(即nan或inf。)
>>> df = pd.read_csv('sample_corr_data.csv') # link at the end, ## columns = ['a', 'b']
>>> df.a.tail(100).value_counts()
0.000000 86
-0.000029 3
0.000029 3
-0.000029 2
0.000029 2
-0.000029 2
0.000029 2
Name: a, dtype: int64 …Run Code Online (Sandbox Code Playgroud) 我有一个问题是找到一种最有效的方法来计算具有多列的xts对象的滚动线性回归.我已经在stackoverflow上搜索并阅读了之前的几个问题.
这个问题和答案很接近,但在我看来还不够,因为我想计算所有回归中因变量不变的多元回归.我试图用随机数据重现一个例子:
require(xts)
require(RcppArmadillo) # Load libraries
data <- matrix(sample(1:10000, 1500), 1500, 5, byrow = TRUE) # Random data
data[1000:1500, 2] <- NA # insert NAs to make it more similar to true data
data <- xts(data, order.by = as.Date(1:1500, origin = "2000-01-01"))
NR <- nrow(data) # number of observations
NC <- ncol(data) # number of factors
obs <- 30 # required number of observations for rolling regression analysis
info.names <- c("res", "coef")
info <- array(NA, dim = …Run Code Online (Sandbox Code Playgroud) 我有一系列时间访问建筑物的人.每个人都有一个唯一的身份证.对于时间序列中的每条记录,我想知道过去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