当前位置: 首页 > 面试题库 >

过去五分钟的pandas滚动总和

祁烨
2023-03-14
问题内容

假设我有以下数据框

Date, A
2014-11-21 11:00:00, 1
2014-11-21 11:03:00, 4
2014-11-21 11:04:00, 1
2014-11-21 11:05:00, 2
2014-11-21 11:07:00, 4
2014-11-21 11:08:00, 1
2014-11-21 11:12:00, 1
2014-11-21 11:13:00, 2

第一列是日期时间对象,第二列是整数。我想要的是为每行最后五分钟计算列“ A”的总和。

作为该行的示例 2014-11-21 11:12:00, 1,列“ A”的总和为2(1 + 1),而行的列“ A”的总和为2014-11-21 11:05:00, 27(2 + 1 + 4)。重要的是时间窗口(5分钟)的过去行数对于每一行都是不同的(因为时间序列是不规则的)。

如何在pandas中使用rolling_sum方法获取列“ A”的最后五分钟总和?提前致谢。


问题答案:

通常,如果日期是完全任意的,我认为您将不得不for-loop在行上使用Python或[使用df.apply,(实际上,它也使用Python循环。)

但是,如果您的日期(如上面的情况)共享一个公共频率,那么有一个比使用df.apply以下方法要快得多的技巧:根据公共频率扩展时间序列-
在这种情况下为1分钟-填写NaN为零,然后调用rolling_sum

In [279]: pd.rolling_sum(df.set_index(['Date']).asfreq('1T').fillna(0), window=5, min_periods=1).reindex(df['Date'])
Out[279]: 
                      A
Date                   
2014-11-21 11:00:00   1
2014-11-21 11:03:00   5
2014-11-21 11:04:00   6
2014-11-21 11:05:00   7
2014-11-21 11:07:00  11
2014-11-21 11:08:00   8
2014-11-21 11:12:00   2
2014-11-21 11:13:00   3

当然,如果您愿意接受足够小的粒度,则任何时间序列都具有相同的频率,但是所需的大小df.asfreq(...)可能会使此技巧不切实际。

这是使用的更通用方法的示例df.apply。请注意,调用searchsorted依赖df['Date']于排序顺序。

import numpy as np
import pandas as pd
df = pd.read_csv('data', parse_dates=[0], sep=',\s*')
start_dates = df['Date'] - pd.Timedelta(minutes=5)
df['start_index'] = df['Date'].values.searchsorted(start_dates, side='right')
df['end_index'] = np.arange(len(df))

def sum_window(row):
    return df['A'].iloc[row['start_index']:row['end_index']+1].sum()
df['rolling_sum'] = df.apply(sum_window, axis=1)

print(df[['Date', 'A', 'rolling_sum']])

产量

                 Date  A  rolling_sum
0 2014-11-21 11:00:00  1            1
1 2014-11-21 11:03:00  4            5
2 2014-11-21 11:04:00  1            6
3 2014-11-21 11:05:00  2            7
4 2014-11-21 11:07:00  4           11
5 2014-11-21 11:08:00  1            8
6 2014-11-21 11:12:00  1            2
7 2014-11-21 11:13:00  2            3

这是一个比较df.asfreq技巧和调用的基准df.apply

import numpy as np
import pandas as pd
df = pd.read_csv('data', parse_dates=[0], sep=',\s*')

def big_df(df):
    df = df.copy()
    for i in range(7):
        dates = df['Date'] + pd.Timedelta(df.iloc[-1]['Date']-df.iloc[0]['Date']) + pd.Timedelta('1 minute')
        df2 = pd.DataFrame({'Date': dates, 'A': df['A']})
        df = pd.concat([df, df2])
    df = df.reset_index(drop=True)
    return df

def using_apply():
    start_dates = df['Date'] - pd.Timedelta(minutes=5)
    df['start_index'] = df['Date'].values.searchsorted(start_dates, side='right')
    df['end_index'] = np.arange(len(df))

    def sum_window(row):
        return df['A'].iloc[row['start_index']:row['end_index']+1].sum()

    df['rolling_sum'] = df.apply(sum_window, axis=1)
    return df[['Date', 'rolling_sum']]

def using_asfreq():
    result = (pd.rolling_sum(
        df.set_index(['Date']).asfreq('1T').fillna(0), 
        window=5, min_periods=1).reindex(df['Date']))
    return result
In [364]: df = big_df(df)

In [367]: %timeit using_asfreq()
1000 loops, best of 3: 1.21 ms per loop

In [368]: %timeit using_apply()
1 loops, best of 3: 208 ms per loop


 类似资料:
  • 详情请参与 基本的二进制操作 统计(相关操作通常情况下不包括缺失值) 1、 执行描述性统计: In [61]: df.mean() Out[61]: A -0.004474 B -0.383981 C -0.687758 D 5.000000 F 3.000000 dtype: float64 2、 在其他轴上进行相同的操作: In [62]: df.mean(1) Out

  • 问题内容: 如何获得pandas系列值的某个长度n的滚动值? 例如,如果我有以下内容: 我如何获得长度为n的移动值,即类似,如果n = 3: [NaN,NaN,0],[NaN,0,1],…,[4,8.8,7.12] 编辑:如果我使用熊猫滚动,如: 然后滚动是该系列的移动平均线。在这里,我不希望每个移动的3个值集合的平均值,而是这些3个值的集合。 问题答案: 我认为您需要先添加s,然后再执行以下解决

  • 问题内容: 有谁知道有效的函数/方法(例如)来计算数组的滚动差 这是我最接近的解决方案: 但是,它仅计算单步滚动差。理想情况下,步长是可编辑的(即当前时间步长与最后n个步长之间的差)。 我也写了这个,但是对于更大的数组,它很慢: 问题答案: 关于什么: 通常,您可以使用自己的功能替换该功能。请注意,在这种情况下,第一项将是。 定义以下内容: 您可以在处计算值之间的差异。

  • 原文:10 Minutes to pandas 来源:【原】十分钟搞定pandas 官方网站上《10 Minutes to pandas》的一个简单的翻译,原文在这里。这篇文章是对 pandas 的一个简单的介绍,详细的介绍请参考:秘籍 。习惯上,我们会按下面格式引入所需要的包: In [1]: import pandas as pd In [2]: import numpy as np In [

  • 官方网站上《10 Minutes to pandas》的一个简单的翻译,原文在这里。这篇文章是对 pandas 的一个简单的介绍,详细的介绍请参考:秘籍 。习惯上,我们会按下面格式引入所需要的包。

  • 附录 B. 五分钟回顾 第 1 章 安装 Python 1.1. 哪一种 Python 适合您? 学习 Python 的第一件事就是安装, 不是吗? 1.2. Windows 上的 Python 在 Windows 上, 安装 Python 有两种选择。 1.3. Mac OS X 上的 Python 在 Mac OS X 上, 对于安装 Python 有两种选择: 安装或不安装。您可能想要安装它