我正在寻找一种方法来做类似各种rolling_*函数的方法pandas,但我希望滚动计算的窗口由一系列值(比如,DataFrame的一列值的值)定义,而不是窗口中的行数.
举个例子,假设我有这些数据:
>>> print d
RollBasis ToRoll
0 1 1
1 1 4
2 1 -5
3 2 2
4 3 -4
5 5 -2
6 8 0
7 10 -13
8 12 -2
9 13 -5
Run Code Online (Sandbox Code Playgroud)
如果我做了类似的事情rolling_sum(d, 5),我得到一个滚动的总和,其中每个窗口包含5行.但我想要的是滚动总和,其中每个窗口包含一定范围的值RollBasis.也就是说,我希望能够做类似的事情d.roll_by(sum, 'RollBasis', 5),并得到一个结果,其中第一个窗口包含RollBasis1到5之间的所有行,然后第二个窗口包含所有RollBasis在2到6之间的行,然后是第三个window包含RollBasis3到7之间的所有行,等等.窗口的行数不会相等,但RollBasis每个窗口中选择的值范围将相同.所以输出应该是这样的:
>>> d.roll_by(sum, 'RollBasis', 5)
1 -4 # sum of elements with 1 <= Rollbasis <= 5
2 -4 # sum of …Run Code Online (Sandbox Code Playgroud) 我有一个不规则日期的熊猫数据帧.有没有办法使用7天作为移动窗口来计算中位数绝对偏差,中位数等.?我觉得我可以以某种方式使用,pandas.rolling_apply但它不会占用窗口参数的不规则间隔日期.我发现了一个类似的帖子/sf/answers/2117081361/,我正在尝试创建我的自定义功能,但仍然无法弄清楚..任何人都可以帮忙吗?
import pandas as pd
from datetime import datetime
person = ['A','B','C','B','A','C','A','B','C','A',]
ts = [
datetime(2000, 1, 1),
datetime(2000, 1, 1),
datetime(2000, 1, 10),
datetime(2000, 1, 20),
datetime(2000, 1, 25),
datetime(2000, 1, 30),
datetime(2000, 2, 8),
datetime(2000, 2, 12),
datetime(2000, 2, 17),
datetime(2000, 2, 20),
]
score = [9,2,1,3,8,4,2,3,1,9]
df = pd.DataFrame({'ts': ts, 'person': person, 'score': score})
Run Code Online (Sandbox Code Playgroud)
df看起来像这样
person score ts
0 A 9 2000-01-01
1 B 2 2000-01-01
2 C 1 2000-01-10
3 …Run Code Online (Sandbox Code Playgroud) 我很难在数据帧中或者在groupby中解决回顾或翻转问题.
以下是我拥有的数据帧的简单示例:
fruit amount
20140101 apple 3
20140102 apple 5
20140102 orange 10
20140104 banana 2
20140104 apple 10
20140104 orange 4
20140105 orange 6
20140105 grape 1
…
20141231 apple 3
20141231 grape 2
Run Code Online (Sandbox Code Playgroud)
我需要计算每天前3天每种水果'量'的平均值,并创建以下数据框:
fruit average_in_last 3 days
20140104 apple 4
20140104 orange 10
...
Run Code Online (Sandbox Code Playgroud)
例如在20140104,前3天是20140101,20140102和20140103(注意数据框中的日期不连续且20140103不存在),苹果的平均数量是(3 + 5)/ 2 = 4和橙色是10/1 = 10,其余为0.
样本数据框非常简单,但实际数据框更复杂,更大.希望有人能对此有所了解,谢谢你提前!
我有一个数据框,其中为每个 id 记录 1 个或多个事件。对于每个事件,都会记录 id、度量 x 和日期。像这样的东西:
import pandas as pd
import datetime as dt
import numpy as np
x = range(0, 6)
id = ['a', 'a', 'b', 'a', 'b', 'b']
dates = [dt.datetime(2012, 5, 2),dt.datetime(2012, 4, 2),dt.datetime(2012, 6, 2),
dt.datetime(2012, 7, 30),dt.datetime(2012, 4, 1),dt.datetime(2012, 5, 9)]
df =pd.DataFrame(np.column_stack((id,x,dates)), columns = ['id', 'x', 'dates'])
Run Code Online (Sandbox Code Playgroud)
我希望能够设置回溯期(即 70 天),并为数据集中的每一行计算该 id 的任何先前事件的 x 累积总和以及所需的回溯(不包括该行的 x)正在执行计算)。最终应该看起来像:
id x dates want
0 a 0 2012-05-02 00:00:00 1
1 a 1 2012-04-02 00:00:00 0
2 …Run Code Online (Sandbox Code Playgroud) 我有一个由时间戳索引的值的系列。这些时间戳的间隔不规则,我想计算一些类似于过去 N 秒的滚动平均值(例如),其中 N 是一个常数。不幸的是,在计算滚动数量之前定期重新采样不是一种选择——滚动数量必须在整个数据集上计算。
大熊猫有什么好办法吗?
如何通过滚动平均值/中位数并删除缺失值来进入熊猫组?即输出应该在计算平均值/中位数之前删除缺失值,而不是在存在缺失值时给我 NaN。
import pandas as pd
t = pd.DataFrame(data={v.date:[0,0,0,0,1,1,1,1,2,2,2,2],
'i0':[0,1,2,3,0,1,2,3,0,1,2,3],
'i1':['A']*12,
'x':[10.,20.,30.,np.nan,np.nan,21.,np.nan,41.,np.nan,np.nan,32.,42.]})
t.set_index([v.date,'i0','i1'], inplace=True)
t.sort_index(inplace=True)
print(t)
print(t.groupby('date').apply(lambda x: x.rolling(window=2).mean()))
Run Code Online (Sandbox Code Playgroud)
给
x
date i0 i1
0 0 A 10.0
1 A 20.0
2 A 30.0
3 A NaN
1 0 A NaN
1 A 21.0
2 A NaN
3 A 41.0
2 0 A NaN
1 A NaN
2 A 32.0
3 A 42.0
x
date i0 i1
0 0 A NaN
1 A 15.0
2 A 25.0
3 A NaN …Run Code Online (Sandbox Code Playgroud) 我在弄清楚如何对大熊猫日期时间索引的数据帧进行重新采样时遇到麻烦,但是需要最小数量的值才能给出一个值。我想将每日数据重新抽样到每月,并要求至少存在90%的值才能产生值。
输入每日数据:
import pandas as pd
rng = pd.date_range('1/1/2011', periods=365, freq='D')
ts = pd.Series(pd.np.random.randn(len(rng)), index=rng)
ts['2011-01-01':'2011-01-05']=pd.np.nan #a short length of NANs to timeseries
ts['2011-10-03':'2011-10-30']=pd.np.nan #add ~ month long length of NANs to timeseries
Run Code Online (Sandbox Code Playgroud)
一月份只有几个NAN,但是十月份几乎是一个月的NAN,我想要每月重采样总和的输出:
ts.resample('M').sum()
Run Code Online (Sandbox Code Playgroud)
给出十月的NAN(丢失90%的每日数据)和一月份的NAN(丢失90%的数据),而不是当前输出:
2011-01-31 11.949479
2011-02-28 -1.730698
2011-03-31 -0.141164
2011-04-30 -0.291702
2011-05-31 -1.996223
2011-06-30 -1.936878
2011-07-31 5.025407
2011-08-31 -1.344950
2011-09-30 -2.035502
2011-10-31 -2.571338
2011-11-30 -13.492956
2011-12-31 7.100770
Run Code Online (Sandbox Code Playgroud)
我已经阅读了这篇文章,使用滚动均值和min_periods; 我宁愿继续使用resample作为其直接的时间索引用途。这可能吗?我无法在重采样文档中找到很多内容或堆栈溢出来解决此问题。