如何解决使用 Pandas GroupBy 和时间序列重采样的平均聚合
我在使用 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()
这是我导入后的 DataFrame:
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
有人知道我错过了什么/做错了什么吗?
解决方法
这对您有用吗:
df['Year']=df['DateTime'].dt.year
(df
.groupby(['Year','Session'])
.apply(lambda x: x['Volume'].sum()/len(x['DateTime'].dt.date.unique()))
)
请注意,“DateTime”现在应该是一列。
我认为这计算了每年和会话的每天平均交易量。可以试一下吗?
,以下也应该有效,根据您的问题,“sum”显示基于“Year”的“sum of Volume”,“mean”显示基于“Daily mean”的“mean of volume”,两者均按“Session”分组和“日期时间”。 (只是使用了一些带连接的 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,1000],'Session':['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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。