如何使用days作为pandas rolling_apply函数的窗口

时间:2016-02-06 15:36:00

标签: python pandas time-series

我有一个不规则间隔日期的熊猫数据框。有没有办法使用7天作为移动窗口来计算median absolute deviation,中位数等...?我觉得我可以以某种方式使用pandas.rolling_apply,但它不会占用窗口参数的不规则间隔日期。我找到了类似的帖子https://stackoverflow.com/a/30244019/3128336,我正在尝试创建自定义功能,但仍然无法弄清楚..有人可以帮忙吗?

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})

df看起来像这样

    person  score   ts
0   A       9       2000-01-01
1   B       2       2000-01-01
2   C       1       2000-01-10
3   B       3       2000-01-20
4   A       8       2000-01-25
5   C       4       2000-01-30
6   A       2       2000-02-08
7   B       3       2000-02-12
8   C       1       2000-02-17
9   A       9       2000-02-20

3 个答案:

答案 0 :(得分:5)

您可以使用时间增量来选择窗口中的行,然后使用apply来遍历每一行并聚合:

import sys
sys.path.append('/usr/local/python3/dist-packages/')
import scipy

答案 1 :(得分:0)

我对滚动日期功能不够熟悉 - 所以我想知道添加缺失的数据(实际上是一个充满缺失数据的Dataframe)然后你的滚动窗口应该更容易实现。

from datetime import date
import pandas as pd
##############Your Initial DataFrame ##############
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, 15),
]
score = [9,2,1,3,8,4,2,3,1,9]
df = pd.DataFrame({'ts': ts, 'person': person, 'score': score})
################## Blank DataFrame in Same Format ###############
#Create some dates
start = date(2000,1,1)
end = date(2000,3,1)
#We have 3 people
Eperson=['A','B','C']
#They Score 0
Escore=[0]
#Need a date range in Days
ets=pd.date_range(start, end, freq='D')
dfEmpty=pd.DataFrame([(c,b,0) for b in Eperson for c in ets])
dfEmpty.columns=['ts','person','score']

################# Now Join them 

dfJoin=dfEmpty.merge(df,how='outer',on=['ts','person'])
dfJoin['score']=dfJoin.score_x+dfJoin.score_y
dfJoin.score.fillna(0,inplace=True)
del dfJoin['score_x']
del dfJoin['score_y']'

您现在拥有的数据框不会错过每个人的日期 - 如果原始日期丢失,那么此人/分数将为0.

我很感激,如果你要处理数百万条记录,这可能行不通。

非PEP类型评论道歉......它仍在进行中。

答案 2 :(得分:0)

根据Brian Huey的Sample excel image showing the inserted value vs. formula发布我的解决方案。

    person  score   ts           mad        med
0   A       9       2000-01-01   NaN        NaN
1   B       2       2000-01-01   NaN        NaN
2   C       1       2000-01-10   0.000000   1.0
3   B       3       2000-01-20   3.706506   5.5
4   A       8       2000-01-25   2.965204   6.0
5   C       4       2000-01-30   0.000000   4.0
6   A       2       2000-02-08   0.741301   2.5
7   B       3       2000-02-12   1.482602   2.0
8   C       1       2000-02-17   5.930409   5.0
9   A       9       2000-02-20   0.000000   9.0

结果

\u0637\u0631