使用pandas GroupBy和时间序列重采样的平均聚合

2024-09-29 23:21:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Pandas groupby功能和时间序列方面遇到问题。我已经阅读了文档,但我看不出如何将聚合函数应用于多列,以及如何正确计算“聚合”的体积(平均值)的平均值

这是我导入CSV文件的代码:

#CSV Import
import pandas as pd
path = r'Z:\Python\30_Min_Data.txt'

from datetime import datetime
customdateparse = lambda x: datetime.strptime(x, '%Y/%m/%d %H:%M:%S.%f')
df = pd.read_csv(
        path,
        parse_dates={'DateTime': [0, 1]},
        date_parser=customdateparse)

# Set the Date as the Index --> needed for Resampling
df.set_index('DateTime', inplace=True)
df.sort_index()     

这是导入后的数据帧:

df
Out[3]: 
                     Volume Session
DateTime                           
2020-12-16 08:00:00    1000    PRTH
2020-12-16 08:30:00    5000    PRTH
2020-12-16 09:00:00    1000     RTH
2020-12-16 09:30:00    3000     RTH
2020-12-17 08:00:00    2000    PRTH
2020-12-17 08:30:00    2000    PRTH
2020-12-17 09:00:00    2000     RTH
2020-12-17 09:30:00    2000     RTH
2020-12-18 08:00:00    1000    PRTH
2020-12-18 08:30:00    1000    PRTH
2020-12-18 09:00:00    1000     RTH
2020-12-18 09:30:00    1000     RTH
2019-11-18 08:00:00    1000    PRTH
2019-11-18 08:30:00    1000    PRTH
2019-11-18 09:00:00    1000     RTH
2019-11-18 09:30:00    1000     RTH

这就是我尝试的: 由于时间序列重新采样,它计算每天的平均值。 我希望它首先对值进行求和,然后计算平均值。 但它确实意味着每天的大量数据

#2.Volume: Average per Year & Session & Day
funcs_year    = lambda idx: idx.year
(df
   .groupby([funcs_year,'Session', pd.Grouper(freq='D')])
    ['Volume']
   .mean()
)

Out[6]: 
      Session   DateTime  
2019   PRTH     2019-11-18    1000
       RTH      2019-11-18    1000
2020   PRTH     2020-12-16    3000
                2020-12-17    2000
                2020-12-18    1000
       RTH      2020-12-16    2000
                2020-12-17    2000
                2020-12-18    1000
Name: Volume, dtype: int64

这是我希望正确计算和显示结果的方式(我手动计算): 每日平均(平均)交易量(本年度和交易日分别显示):

Year    Session     Mean Volume
2020    RTH         3.333,33
        PRTH        4.000,00
2019    RTH         2.000,00
        PRTH        2.000,00

有人知道我错过了什么/做错了什么吗


Tags: csvimportdfdatetimesession时间序列year
2条回答

根据您的问题,“总和”显示基于“年”的“总量总和”,而“平均数”显示基于“日平均数”的“总量平均数”,两者均按“会话”和“日期时间”分组。(刚刚使用了一些带有连接的groupy链接)

import pandas as pd

data = { 
'DateTime':['2020-12-16 08:00:00','2020-12-16 08:30:00','2020-12-16 09:00:00','2020-12-16 09:30:00','2020-12-17 08:00:00','2020-12-17 08:30:00','2020-12-17 09:00:00','2020-12-17 09:30:00','2020-12-18 08:00:00','2020-12-18 08:30:00','2020-12-18 09:00:00','2020-12-18 09:30:00','2019-11-18 08:00:00','2019-11-18 08:30:00','2019-11-18 09:00:00','2019-11-18 09:30:00'],
'Volume':[1000,500,1000,3000,2000,2000,2000,2000,1000,1000,1000,1000,1000,1000,1000,1000],
'Session':['PRTH','PRTH','RTH','RTH','PRTH','PRTH','RTH','RTH','PRTH','PRTH','RTH','RTH','PRTH','PRTH','RTH','RTH']
}

df = pd.DataFrame(data)
df['DateTime'] = pd.to_datetime(df['DateTime'])
df.index = pd.to_datetime(df['DateTime'])


#See below code 
x = df.groupby([df.index.strftime('%Y'),'Session',df.index.strftime('%Y-%m-%d')]).agg({'Volume':['sum','mean']}).groupby(['DateTime','Session'],level=2).agg(['sum','mean'])
x['Volume'].drop('mean',axis=1,level=0)

这对你有用吗:

df['Year']=df['DateTime'].dt.year
(df
   .groupby(['Year','Session'])
   .apply(lambda x: x['Volume'].sum()/len(x['DateTime'].dt.date.unique()))
)

请注意,“DateTime”现在应该是一列

我认为这计算出了每年和每节课每天的平均音量。你能试一试吗

相关问题 更多 >

    热门问题