如何获取idmax-admin在时序数据中的分布?
How to obtain the distribution of idmax-idmin in timeseries data?
这是我的数据的简化外观:
Open High Low Close
2005-09-06 09:00:00 1234.25 1234.50 1234.00 1234.25
2005-09-06 12:00:00 1234.50 1234.75 1234.25 1234.50
2005-09-06 16:00:00 1234.50 1234.50 1234.25 1234.50
2005-09-07 09:00:00 1234.25 1234.50 1234.00 1234.25
2005-09-07 12:00:00 1234.25 1234.50 1234.25 1234.50
2005-09-07 16:00:00 1234.25 1234.75 1234.25 1234.25
2005-09-08 09:00:00 1234.25 1234.25 1234.00 1234.25
2005-09-08 12:00:00 1234.25 1234.25 1233.75 1234.25
2005-09-08 16:00:00 1234.25 1234.50 1234.00 1234.00
我想获取每一天的最大值和最小值的时间。最大值将是列 'High' 的最大值,最小值将是列 'Low' 的最小值。在此示例中,输出将是:
Max_Time Min_Time
2005-09-06 12:00:00 09:00:00
2005-09-07 16:00:00 09:00:00
2005-09-08 16:00:00 12:00:00
由于这个摘要会很长,所以总结它以获得每个时间戳的分布很有用,但是使用每小时的 bin,所以它看起来像:
Max Min
09:00:00 0 2
12:00:00 1 1
16:00:00 2 0
我该怎么做?
假设索引已经是 DatetimeIndex,我会尝试类似的方法:
>>> g = df.groupby(df.index.date) # groupby date
>>> max_min = pd.DataFrame({'Max_Time': g['High'].idxmax().dt.time,
'Min_Time': g['Low'].idxmin().dt.time})
>>> max_min
Max_Time Min_Time
2005-09-06 12:00:00 09:00:00
2005-09-07 16:00:00 09:00:00
2005-09-08 16:00:00 12:00:00
(如果你只想要小时,而不是完整的时间,你可以使用 dt.hour
。)
要获取每列中时间的单独计数,您可以调用 pd.value_counts
:
>>> pd.DataFrame({'Max': max_min.Max_Time.value_counts(),
'Min': max_min.Min_Time.value_counts()})
Max Min
09:00:00 NaN 2
12:00:00 1 1
16:00:00 2 NaN
import pandas as pd
import numpy as np
我们将从 dat
中的数据开始。我刚刚复制了你的数据进行实验。
您需要按索引中的日期对数据框进行分组,因为您需要每个日期的最小值和最大值。这可以通过以下方式完成:
gb=dat.groupby(dat.index.date)
然后,因为你想找到每个最小值和最大值的索引,你可以在每个groupby系列(gb.High和gb.Low)上使用idxmax和idxmin来获取最大值的索引和每个日期的分钟。首先,这些将包括日期和时间,因为它们都在索引中。您可以使用 .dt.time
来节省时间。
mm=pd.DataFrame({ 'Max_Time': gb.High.idxmax().dt.time,
'Min_Time': gb.Low.idxmin().dt.time } )
mm
这里会是你想要的第一件事。现在,为了获得计数,每列上的 value_counts 将为您提供一系列时间以及该时间出现的次数。但是,它不会包括从未出现在 max/min 中的时间,因此当您将最大计数和最小计数组合到一个数据帧中时,您会得到一些 NaN 值。您可以使用 fillna 删除这些并用 0 替换它们。
pd.DataFrame( { 'Max': mm.Max_Time.value_counts(),
'Min': mm.Min_Time.value_counts() } ).fillna(0)
这是我的数据的简化外观:
Open High Low Close
2005-09-06 09:00:00 1234.25 1234.50 1234.00 1234.25
2005-09-06 12:00:00 1234.50 1234.75 1234.25 1234.50
2005-09-06 16:00:00 1234.50 1234.50 1234.25 1234.50
2005-09-07 09:00:00 1234.25 1234.50 1234.00 1234.25
2005-09-07 12:00:00 1234.25 1234.50 1234.25 1234.50
2005-09-07 16:00:00 1234.25 1234.75 1234.25 1234.25
2005-09-08 09:00:00 1234.25 1234.25 1234.00 1234.25
2005-09-08 12:00:00 1234.25 1234.25 1233.75 1234.25
2005-09-08 16:00:00 1234.25 1234.50 1234.00 1234.00
我想获取每一天的最大值和最小值的时间。最大值将是列 'High' 的最大值,最小值将是列 'Low' 的最小值。在此示例中,输出将是:
Max_Time Min_Time
2005-09-06 12:00:00 09:00:00
2005-09-07 16:00:00 09:00:00
2005-09-08 16:00:00 12:00:00
由于这个摘要会很长,所以总结它以获得每个时间戳的分布很有用,但是使用每小时的 bin,所以它看起来像:
Max Min
09:00:00 0 2
12:00:00 1 1
16:00:00 2 0
我该怎么做?
假设索引已经是 DatetimeIndex,我会尝试类似的方法:
>>> g = df.groupby(df.index.date) # groupby date
>>> max_min = pd.DataFrame({'Max_Time': g['High'].idxmax().dt.time,
'Min_Time': g['Low'].idxmin().dt.time})
>>> max_min
Max_Time Min_Time
2005-09-06 12:00:00 09:00:00
2005-09-07 16:00:00 09:00:00
2005-09-08 16:00:00 12:00:00
(如果你只想要小时,而不是完整的时间,你可以使用 dt.hour
。)
要获取每列中时间的单独计数,您可以调用 pd.value_counts
:
>>> pd.DataFrame({'Max': max_min.Max_Time.value_counts(),
'Min': max_min.Min_Time.value_counts()})
Max Min
09:00:00 NaN 2
12:00:00 1 1
16:00:00 2 NaN
import pandas as pd
import numpy as np
我们将从 dat
中的数据开始。我刚刚复制了你的数据进行实验。
您需要按索引中的日期对数据框进行分组,因为您需要每个日期的最小值和最大值。这可以通过以下方式完成:
gb=dat.groupby(dat.index.date)
然后,因为你想找到每个最小值和最大值的索引,你可以在每个groupby系列(gb.High和gb.Low)上使用idxmax和idxmin来获取最大值的索引和每个日期的分钟。首先,这些将包括日期和时间,因为它们都在索引中。您可以使用 .dt.time
来节省时间。
mm=pd.DataFrame({ 'Max_Time': gb.High.idxmax().dt.time,
'Min_Time': gb.Low.idxmin().dt.time } )
mm
这里会是你想要的第一件事。现在,为了获得计数,每列上的 value_counts 将为您提供一系列时间以及该时间出现的次数。但是,它不会包括从未出现在 max/min 中的时间,因此当您将最大计数和最小计数组合到一个数据帧中时,您会得到一些 NaN 值。您可以使用 fillna 删除这些并用 0 替换它们。
pd.DataFrame( { 'Max': mm.Max_Time.value_counts(),
'Min': mm.Min_Time.value_counts() } ).fillna(0)