Python 在一定时间段内与熊猫一起滚动的意思

Python 在一定时间段内与熊猫一起滚动的意思,python,pandas,time-series,Python,Pandas,Time Series,TL;DR:是否有解决方案: 将数据实时添加到数据帧中(采样率为非恒定值:每个新数据之间有时为1秒,有时为0.2秒,有时为2秒等) 能够在固定的5秒窗口内计算滚动平均值(无论此窗口中有10个或100个样本,还是只有2个样本) 更准确地说: import pandas as pd, time df = pd.DataFrame(columns = ['x']) for i in range(10): df.ix[pd.datetime.now()] = {'x': 10 + i}

TL;DR:是否有解决方案:

  • 将数据实时添加到数据帧中(采样率为非恒定值:每个新数据之间有时为1秒,有时为0.2秒,有时为2秒等)
  • 能够在固定的5秒窗口内计算
    滚动平均值
    (无论此窗口中有10个或100个样本,还是只有2个样本)

更准确地说:

import pandas as pd, time
df = pd.DataFrame(columns = ['x'])

for i in range(10):
    df.ix[pd.datetime.now()] = {'x': 10 + i}
    time.sleep(0.2)         # here 0.2 seconds between each new data...

df.ix[pd.datetime.now()] = {'x': 20}
time.sleep(1)               # here 1 second...
df.ix[pd.datetime.now()] = {'x': 21}
time.sleep(3)               # here 3 seconds...
df.ix[pd.datetime.now()] = {'x': 22}
df
提供此选项:

                          x
2016-01-08 13:57:10.679  10
2016-01-08 13:57:10.882  11
2016-01-08 13:57:11.085  12
2016-01-08 13:57:11.287  13
2016-01-08 13:57:11.489  14
2016-01-08 13:57:11.691  15
2016-01-08 13:57:11.893  16
2016-01-08 13:57:12.095  17
2016-01-08 13:57:12.297  18
2016-01-08 13:57:12.499  19
2016-01-08 13:57:12.701  20
2016-01-08 13:57:13.703  21
2016-01-08 13:57:16.706  22
这对于
pd.滚动平均值(df,5)

当然,
pd.rolling_mean(df,5)
计算5行周期内的滚动平均值,这不是我想要的:我想要5秒的周期

一个解决方案是
df.resample('1S',…)
,但由于我想在每次添加新数据时计算一个新的
rolling,这意味着我应该
。每分钟多次对整个数据帧进行重采样(…)
,这确实非常耗时,我认为这不是一个干净的解决方案。
(在我的实际用例中,数据帧很大)


什么是干净的解决方案?

添加新数据时,如何将滚动平均值存储在df中

import datetime as dt
latest = pd.datetime.now()
five_secs = datetime.timedelta(seconds=5)
new_x=99
df.ix[latest] = {'x':new_x,
                 'five_second_mean':df[df.index > latest - five_secs].x.append(pd.Series(new_x).mean()}
考虑使用函数捕获特定行的最后5秒。使用此方法,可以在所有数据完成后运行一次。设置的唯一警告是,您不能对索引使用
apply()
,因此请使用临时时间戳列(等于索引值):

导入日期时间
...
#级数平均函数
def运行平均值(世界其他地区):
ser=df.x[(df['timeval']>row-datetime.timedelta(秒=5))&

(df['timeval']您是否找到了一种不用花费大量时间就能奏效的解决方案?
import datetime as dt
latest = pd.datetime.now()
five_secs = datetime.timedelta(seconds=5)
new_x=99
df.ix[latest] = {'x':new_x,
                 'five_second_mean':df[df.index > latest - five_secs].x.append(pd.Series(new_x).mean()}
import datetime
...

# SERIES MEAN FUNCTION
def runMean(row):
    ser = df.x[(df['timeval'] > row - datetime.timedelta(seconds=5)) &
               (df['timeval'] <= row)]
    return ser.mean()

# APPLY FUNCTION
df['timeval'] = df.index
df['last5secMean'] = df['timeval'].apply(runMean)

df = df[['x','last5secMean']]