Как собирать временные ряды панд и применять сложную группировку

#python-3.x #pandas

Вопрос:

У меня есть фрейм данных временных рядов, как показано ниже

 ts_ms            a.       b.       c.       x.    y.    z
1614772770705.   10.      10.      4.       1     2     3
1614772770800.   10.      10.      2.       1     2     4
1614772770750.   10.      5.       4.       1     2     3
 

Мне нужно создать 5-минутные сегменты, а затем применить эквивалент фрейма данных SQL, приведенный ниже

 select sum(x), sum(y), sum(z)
group by a, b, c
 

То, что у меня есть до сих пор, — это

 #convert to datetimes 
df['ts_date'] = pd.to_datetime(df['ts_ms'])
# create bucket
df.set_index('ts_date').groupby(pd.Grouper(freq='5Min'))
 

Но я не уверен, как применить SQL-эквивалент к этому кадру данных после этого момента.

Пожалуйста, предложите.

Ответ №1:

Если требуется 5Min группировка по a,b,c столбцам, используйте один DataFrame.groupby :

 df['ts_date'] = pd.to_datetime(df['ts_ms'])
df1 = df.groupby(['a','b','c',pd.Grouper(freq='5Min',key='ts_date')])[["x", "y", "z"]].sum()

print (df1)
                                   x   y   z
a    b    c   ts_date                       
10.0 5.0  4.0 1970-01-01 00:25:00  7   8   9
              1970-01-01 00:45:00  7   8   9
     10.0 2.0 1970-01-01 00:25:00  8  10  12
          4.0 1970-01-01 00:25:00  2   4   6
 

Или возможно использование DataFrame.groupby с DataFrame.resample помощью 5Min :

 df['ts_date'] = pd.to_datetime(df['ts_ms'])

df2 = df.set_index('ts_date').groupby(['a','b','c'])[["x", "y", "z"]].resample('5Min').sum()
print (df2)
                                   x   y   z
a    b    c   ts_date                       
10.0 5.0  4.0 1970-01-01 00:25:00  7   8   9
              1970-01-01 00:30:00  0   0   0
              1970-01-01 00:35:00  0   0   0
              1970-01-01 00:40:00  0   0   0
              1970-01-01 00:45:00  7   8   9
     10.0 2.0 1970-01-01 00:25:00  8  10  12
          4.0 1970-01-01 00:25:00  2   4   6
 

Комментарии:

1. в вашем втором решении, где это sum ?

2. @nad Да, это совокупность с суммой.

Ответ №2:

Установка:

 # data.csv
ts_ms,a,b,c,x,y,z
1614772770705.,10.,10.,4.,1,2,3
1614772770800.,10.,10.,2.,4,5,6
1614772770750.,10.,5.,4.,7,8,9
1614772770805.,10.,10.,4.,1,2,3
1614772770900.,10.,10.,2.,4,5,6
2714772770850.,10.,5.,4.,7,8,9
 

Код:

 import pandas as pd

def func(grp):
    return grp.groupby(pd.Grouper(freq='5Min'))[["x", "y", "z"]].sum()

df = pd.read_csv("data.csv") 
df['ts_date'] = pd.to_datetime(df['ts_ms'])
df.set_index('ts_date', inplace=True)
df.groupby(["a", "b", "c"]).apply(func)
 

Выходы:

                                                 x   y   z
a       b       c       ts_date             
10.0    5.0     4.0     1970-01-01 00:25:00     7   8   9
                        1970-01-01 00:30:00     0   0   0
                        1970-01-01 00:35:00     0   0   0
                        1970-01-01 00:40:00     0   0   0
                        1970-01-01 00:45:00     7   8   9
        10.0    2.0     1970-01-01 00:25:00     8   10  12
                4.0     1970-01-01 00:25:00     2   4   6