#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