gpt4 book ai didi

python - 创建一个新变量,它是 python 中另一个变量的每周最小/最大值

转载 作者:太空宇宙 更新时间:2023-11-03 14:40:33 24 4
gpt4 key购买 nike

A 列的值在一周内最高时,如何将值 1 赋给变量 S?还有,当B的值是一周内的最小值时,如何将值2赋给变量S。我正在处理按日期时间索引的每小时数据。这是我的数据框的样子:

                 A       B      S
datetime
6/14/2004 1:00 384.5 383.6 0
6/14/2004 2:00 384.3 382.3 0
6/14/2004 3:00 383.3 382.3 0
6/14/2004 4:00 383.3 382.6 0
6/14/2004 5:00 383.3 382.8 0
6/14/2004 6:00 383.3 382.5 0
6/14/2004 7:00 383.3 382.3 0
6/14/2004 8:00 383.8 382.3 0
6/14/2004 9:00 382.8 382.1 0
6/14/2004 10:00 382.6 382.1 0

我曾尝试每周使用重采样并获得最大值,但我不知道如何对此进行编码,因为它比我最初想象的要复杂。这是我希望最终数据的样子。

                  A      B      S
datetime
6/14/2004 1:00 384.5 383.6 0
6/14/2004 2:00 384.3 382.3 0
6/14/2004 3:00 383.3 382.3 0
6/14/2004 4:00 383.3 382.6 0
6/14/2004 5:00 383.3 382.8 0
6/14/2004 6:00 383.3 382.5 0
6/14/2004 7:00 383.3 382.3 0
6/14/2004 8:00 383.8 382.3 0
6/14/2004 9:00 382.8 382.1 0
6/14/2004 10:00 382.6 382.1 0
6/14/2004 11:00 382.5 381.8 0
6/14/2004 12:00 382.8 382.3 0
6/14/2004 13:00 383.1 382.3 0
6/14/2004 14:00 385.8 382.5 0
6/14/2004 15:00 385.1 383.6 0
6/14/2004 16:00 384.8 383.5 0
6/14/2004 17:00 384.8 382.5 0
6/14/2004 18:00 383.6 382.8 0
6/14/2004 19:00 383.8 382.8 0
6/14/2004 20:00 383.3 382.8 0
6/14/2004 21:00 383.1 382.6 0
6/14/2004 22:00 383.1 382.6 0
6/14/2004 23:00 383.1 382.6 0
6/15/2004 0:00 382.8 382.6 0
6/15/2004 1:00 383.3 382.6 0
6/15/2004 2:00 383.6 382.3 0
6/15/2004 3:00 383.8 382.5 0
6/15/2004 4:00 382.8 382.1 0
6/15/2004 5:00 383.0 382.1 0
6/15/2004 6:00 382.8 382.0 0
... ... ... ...
6/24/2004 20:00 402.8 401.8 0
6/24/2004 21:00 402.3 401.8 0
6/24/2004 22:00 402.3 401.8 0
6/24/2004 23:00 402.1 401.1 0
6/25/2004 0:00 402.1 401.8 0
6/25/2004 1:00 402.1 401.3 0
6/25/2004 2:00 402.1 400.1 0
6/25/2004 3:00 401.6 400.8 0
6/25/2004 4:00 401.5 400.8 0
6/25/2004 5:00 401.3 400.8 0
6/25/2004 6:00 401.1 400.6 0
6/25/2004 7:00 402.1 400.8 0
6/25/2004 8:00 402.1 400.6 0
6/25/2004 9:00 401.6 400.5 0
6/25/2004 10:00 401.8 400.8 0
6/25/2004 11:00 401.5 400.6 0
6/25/2004 12:00 401.3 400.1 0
6/25/2004 13:00 402.8 401.3 0
6/25/2004 14:00 402.8 401.0 **1**
6/25/2004 15:00 401.5 400.1 0
6/25/2004 16:00 401.6 400.6 0
6/25/2004 17:00 401.8 401.0 0
6/25/2004 18:00 402.1 400.8 0
6/25/2004 19:00 402.3 400.8 0
6/25/2004 20:00 402.6 401.6 0
6/25/2004 21:00 401.8 401.3 0
6/25/2004 22:00 401.8 400.6 0
6/28/2004 0:00 401.8 401.6 0
6/28/2004 1:00 402.3 401.6 0
6/28/2004 2:00 402.3 401.5 0

对于第一周,S 列在 6/18/2004 18:00 中的值为 1,在 6/15/2004 11:00 中的值为 2对于第二周,列 S 在 6/25/2004 14:00 中的值为 1,在 6/21/2004 18:00

中的值为 2

我想出了四个规则:

1. 当 A = max(A) 在当前周内,将值 1 放入 S。如果 A 最大值在一周内不唯一,则在最后一次出现时将 1 放入 S A 中的最大值。

2. 当 B = min(B) 在当前周内,将值 2 放入 S。如果 B 的最小值在该周内不唯一,则在最后一次出现时将 2 放入 S B 中的最小值。

3. 在所有周内重复此操作。整个数据集每小时可能有 80k+ 数据行。

4. 在每周内:如果 max(A) 和 min(B) 出现在相同的日期时间索引处,则在 S 中保留值 0(不变)。

读取数据的代码如下:

import pandas as pd

url = 'https://www.dropbox.com/s/x7wl75rkzsqgkoj/dataset.csv?dl=1'

p = pd.read_csv(url)
p.set_index('datetime', drop=True, inplace=True)
p

这是一张图片,解释了我希望输出的样子: Final dataframe explanation

最佳答案

所以我减小了数据框的大小,以便我们可以看到一些东西,并且我添加了一个列 week ("w"),以便我们可以更好地检查。

首先,您需要将索引的类型设置为 datetime 对象,以便您可以访问日期属性,例如 week 到 groupby on。

p.index = pd.to_datetime(p.index)
p["w"] = p.index.week

p
A B S w
datetime
2004-06-14 01:00:00 384.5 383.6 0 25
2004-06-14 09:00:00 382.8 382.1 0 25
2004-06-14 17:00:00 384.8 382.5 0 25
2004-06-15 01:00:00 383.3 382.6 0 25
2004-06-15 09:00:00 382.3 381.6 0 25
2004-06-15 17:00:00 388.6 384.6 0 25
2004-06-16 01:00:00 387.3 387.1 0 25
2004-06-16 09:00:00 388.8 387.6 0 25
2004-06-16 17:00:00 384.5 382.6 0 25
2004-06-17 01:00:00 384.6 383.6 0 25
2004-06-17 09:00:00 385.6 384.0 0 25
2004-06-17 17:00:00 386.8 386.0 0 25
2004-06-18 01:00:00 388.6 387.3 0 25
2004-06-18 09:00:00 387.5 385.8 0 25
2004-06-18 17:00:00 395.8 394.1 0 25
2004-06-21 02:00:00 394.3 392.8 0 26
2004-06-21 10:00:00 393.3 392.3 0 26
2004-06-21 18:00:00 394.8 392.1 0 26
2004-06-22 02:00:00 394.6 393.0 0 26
2004-06-22 10:00:00 394.0 392.6 0 26
2004-06-22 18:00:00 395.3 393.8 0 26
2004-06-23 02:00:00 394.3 393.6 0 26
2004-06-23 10:00:00 395.8 395.0 0 26
2004-06-23 18:00:00 394.6 393.6 0 26
2004-06-24 02:00:00 394.6 393.1 0 26
2004-06-24 10:00:00 397.8 394.8 0 26
2004-06-24 18:00:00 401.3 400.6 0 26
2004-06-25 02:00:00 402.1 400.1 0 26
2004-06-25 10:00:00 401.8 400.8 0 26
2004-06-25 18:00:00 402.1 400.8 0 26
2004-06-28 03:00:00 402.3 401.5 0 27
2004-06-28 11:00:00 402.1 400.8 0 27
2004-06-28 19:00:00 400.3 399.1 0 27
2004-06-29 03:00:00 399.6 399.1 0 27
2004-06-29 11:00:00 397.1 395.3 0 27
2004-06-29 19:00:00 392.3 391.0 0 27
2004-06-30 03:00:00 392.3 391.8 0 27
2004-06-30 11:00:00 393.6 393.1 0 27
2004-06-30 19:00:00 393.5 391.3 0 27

然后,您需要定义每周应用的函数:

def minmax(grp): 
Amax = grp.A[::-1].idxmax() # reverse your Series since you want the last occurence, and idxmax return the first in case of tie
grp.loc[Amax, "S"] = 1
Bmin = grp.B[::-1].idxmin()
if Bmin != Amax:
grp.loc[Bmin, "S"] = 2
else:
grp.loc[Bmin, "S"] = 0 # no change
return grp

然后每年每周分组并应用函数:

p.groupby([p.index.week, p.index.year]).apply(minmax)                                 
A B S w
datetime
2004-06-14 01:00:00 384.5 383.6 0 25
2004-06-14 09:00:00 382.8 382.1 0 25
2004-06-14 17:00:00 384.8 382.5 0 25
2004-06-15 01:00:00 383.3 382.6 0 25
2004-06-15 09:00:00 382.3 381.6 2 25
2004-06-15 17:00:00 388.6 384.6 0 25
2004-06-16 01:00:00 387.3 387.1 0 25
2004-06-16 09:00:00 388.8 387.6 0 25
2004-06-16 17:00:00 384.5 382.6 0 25
2004-06-17 01:00:00 384.6 383.6 0 25
2004-06-17 09:00:00 385.6 384.0 0 25
2004-06-17 17:00:00 386.8 386.0 0 25
2004-06-18 01:00:00 388.6 387.3 0 25
2004-06-18 09:00:00 387.5 385.8 0 25
2004-06-18 17:00:00 395.8 394.1 1 25
2004-06-21 02:00:00 394.3 392.8 0 26
2004-06-21 10:00:00 393.3 392.3 0 26
2004-06-21 18:00:00 394.8 392.1 2 26
2004-06-22 02:00:00 394.6 393.0 0 26
2004-06-22 10:00:00 394.0 392.6 0 26
2004-06-22 18:00:00 395.3 393.8 0 26
2004-06-23 02:00:00 394.3 393.6 0 26
2004-06-23 10:00:00 395.8 395.0 0 26
2004-06-23 18:00:00 394.6 393.6 0 26
2004-06-24 02:00:00 394.6 393.1 0 26
2004-06-24 10:00:00 397.8 394.8 0 26
2004-06-24 18:00:00 401.3 400.6 0 26
2004-06-25 02:00:00 402.1 400.1 0 26
2004-06-25 10:00:00 401.8 400.8 0 26
2004-06-25 18:00:00 402.1 400.8 1 26
2004-06-28 03:00:00 402.3 401.5 1 27
2004-06-28 11:00:00 402.1 400.8 0 27
2004-06-28 19:00:00 400.3 399.1 0 27
2004-06-29 03:00:00 399.6 399.1 0 27
2004-06-29 11:00:00 397.1 395.3 0 27
2004-06-29 19:00:00 392.3 391.0 2 27
2004-06-30 03:00:00 392.3 391.8 0 27
2004-06-30 11:00:00 393.6 393.1 0 27
2004-06-30 19:00:00 393.5 391.3 0 27

HTH

关于python - 创建一个新变量,它是 python 中另一个变量的每周最小/最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53743553/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com