Pandas:基于时间的数据帧字典分块
Pandas: chunking of a dictionary of dataframes based on time
我有一个数据框字典,其中每个数据框都有价格和时间戳列。像这样 {'A':df1, 'B':df2}
我需要构建一个函数,它可以将 dict 中的数据帧切成 H 小时的时间戳块,然后将这个数据帧的 dict 传递给每个块的另一个函数(它进行一些计算)。
我该如何推进?
例如
def foo(dict_of_dataframes):
for id, df in dict_of_dataframes.items():
do_something()
def boo(dict_of_dataframes, chunksize):
"""
Needs to chunk up the @dict_of_dataframes in @chunksize hours
and needs to call foo function on these chunks of
@dicts_of_dataframes
"""
示例数据:
df1:
Time Price
2017-03-07 09:47:31+00:00 100
2017-03-07 11:27:31+00:00 120
2017-03-07 14:47:31+00:00 150
2017-03-07 17:17:31+00:00 135
2017-03-07 20:57:31+00:00 200
2017-03-08 03:27:31+00:00 120
2017-03-08 09:57:31+00:00 100
2017-03-08 11:27:31+00:00 150
df2:
Time Price
2017-03-07 09:07:31+00:00 200
2017-03-07 10:27:31+00:00 300
2017-03-07 12:47:31+00:00 100
2017-03-07 17:47:31+00:00 250
2017-03-07 22:27:31+00:00 300
2017-03-08 01:57:31+00:00 500
2017-03-08 02:57:31+00:00 500
2017-03-08 10:27:31+00:00 100
我需要有关 boo 函数的帮助。如何推进这一进程?
这些模拟其他函数调用的 boo 函数也有特定的术语。我已经看过几次了,如果您能指出一个解释如何设计这些 'function caller' 函数的资源,我将不胜感激。
我认为您真正想要的可以使用 resample
实现 - 基本上是日期时间的 groupby。假设你需要6小时内的交易金额,你可以使用这个:
def boo(dict_dfs, hours):
return {k: v.resample(f'{hours}H').sum() for k,v in dict_dfs.items()}
现在,如果你 100% 确定你需要听写,请使用 groupby
:
def boo(dict_dfs, hours):
return {k:{hr:v for hr, v in df.groupby(Grouper(key='Time', freq=f'{hours}H'))} for k, df in dict_dfs.items()}
顺便说一句,如果你想在字典上循环 {key, value},使用 dict.items(),而不是字典本身。
还有一点要注意:我多次看到人们过度复杂化他们的数据结构。大多数时候你不需要数据帧的字典——你可以使用一个数据帧,只有一个 category
列或者甚至是一个多索引(比如, [category, Time] 在你的情况下是多索引。随着这样,您将获得更多可重用、快速和干净的代码!
我有一个数据框字典,其中每个数据框都有价格和时间戳列。像这样 {'A':df1, 'B':df2}
我需要构建一个函数,它可以将 dict 中的数据帧切成 H 小时的时间戳块,然后将这个数据帧的 dict 传递给每个块的另一个函数(它进行一些计算)。
我该如何推进?
例如
def foo(dict_of_dataframes):
for id, df in dict_of_dataframes.items():
do_something()
def boo(dict_of_dataframes, chunksize):
"""
Needs to chunk up the @dict_of_dataframes in @chunksize hours
and needs to call foo function on these chunks of
@dicts_of_dataframes
"""
示例数据:
df1:
Time Price
2017-03-07 09:47:31+00:00 100
2017-03-07 11:27:31+00:00 120
2017-03-07 14:47:31+00:00 150
2017-03-07 17:17:31+00:00 135
2017-03-07 20:57:31+00:00 200
2017-03-08 03:27:31+00:00 120
2017-03-08 09:57:31+00:00 100
2017-03-08 11:27:31+00:00 150
df2:
Time Price
2017-03-07 09:07:31+00:00 200
2017-03-07 10:27:31+00:00 300
2017-03-07 12:47:31+00:00 100
2017-03-07 17:47:31+00:00 250
2017-03-07 22:27:31+00:00 300
2017-03-08 01:57:31+00:00 500
2017-03-08 02:57:31+00:00 500
2017-03-08 10:27:31+00:00 100
我需要有关 boo 函数的帮助。如何推进这一进程?
这些模拟其他函数调用的 boo 函数也有特定的术语。我已经看过几次了,如果您能指出一个解释如何设计这些 'function caller' 函数的资源,我将不胜感激。
我认为您真正想要的可以使用 resample
实现 - 基本上是日期时间的 groupby。假设你需要6小时内的交易金额,你可以使用这个:
def boo(dict_dfs, hours):
return {k: v.resample(f'{hours}H').sum() for k,v in dict_dfs.items()}
现在,如果你 100% 确定你需要听写,请使用 groupby
:
def boo(dict_dfs, hours):
return {k:{hr:v for hr, v in df.groupby(Grouper(key='Time', freq=f'{hours}H'))} for k, df in dict_dfs.items()}
顺便说一句,如果你想在字典上循环 {key, value},使用 dict.items(),而不是字典本身。
还有一点要注意:我多次看到人们过度复杂化他们的数据结构。大多数时候你不需要数据帧的字典——你可以使用一个数据帧,只有一个 category
列或者甚至是一个多索引(比如, [category, Time] 在你的情况下是多索引。随着这样,您将获得更多可重用、快速和干净的代码!