【问题标题】:rolling weekly max from daily high (dataframe)从每日最高点滚动每周最大值(数据框)
【发布时间】:2021-01-06 16:19:14
【问题描述】:
               Open     High      Low    Close
Date                                          
2007-11-27   770.00  1050.00   770.00   962.90
2007-11-28   984.00   990.00   874.00   893.90
2007-11-29   909.00   914.75   841.00   884.20
2007-11-30   890.00   958.00   890.00   921.55
2007-12-03   939.75   995.00   922.00   969.30
2007-12-04   985.00  1056.00   976.00  1041.45
2007-12-05  1061.00  1099.50  1050.00  1082.45
2007-12-06  1089.00  1109.70  1051.00  1081.30
2007-12-07  1100.00  1134.00  1078.00  1102.40
2007-12-10  1110.00  1110.00  1061.10  1075.40
2007-12-11  1081.00  1089.00  1041.00  1047.65
2007-12-12  1032.00  1065.00  1016.00  1036.80
2007-12-14  1139.90  1140.00  1101.10  1110.50
2007-12-17  1140.00  1168.00  1021.50  1044.25
2007-12-18  1045.00  1109.90  1031.55  1074.95
2007-12-19  1091.00  1116.00  1046.30  1066.90
2007-12-20  1083.50  1083.50  1051.00  1060.20
2007-12-24  1095.00  1192.00  1085.25  1156.80
2007-12-26  1175.00  1214.00  1148.00  1199.90
2007-12-27  1215.00  1240.00  1204.00  1211.65
2007-12-28  1189.40  1274.00  1175.00  1249.10
2007-12-31  1263.35  1295.00  1261.00  1268.80
2008-01-01  1279.00  1319.00  1263.70  1296.85
2008-01-02  1310.25  1324.00  1270.00  1307.45

如何获得每个日期行的每周最高值(即从当前日期行回溯一周)?我可以使用 df["High"].rolling(7).max() 获得 7 天的滚动最大值,但这不是基于日期,而是基于 7 个滚动行。

预期输出:

Date
2007-11-27    1050.0   # from (2007, 11, 27), as no data before that
2007-11-28    1050.0   # from (2007, 11, 27), as no data before that
2007-11-29    1050.0   # from (2007, 11, 27), as no data before that
2007-11-30    1050.0   # from (2007, 11, 27), as no data before that
2007-12-03    1050.0   # from (2007, 11, 27)
2007-12-04    1056.0   # from (2007, 11, 28)
2007-12-05    1099.5   # from (2007, 11, 29)
2007-12-06    1109.7   # from (2007, 11, 30)
2007-12-07    1134.0   # from (2007, 12, 1)
2007-12-10    1134.0   # from (2007, 12, 4)
2007-12-11    1134.0   # from (2007, 12, 5)
2007-12-12    1134.0   # from (2007, 12, 6)
2007-12-14    1140.0   # from (2007, 12, 10), as no data for 8, and 10 is the immediate next date
2007-12-17    1168.0   # from (2007, 12, 11)
...

【问题讨论】:

  • 给出预期的输出会很有用
  • 如果你用 0 填满所有缺失的日子,你可以轻松使用你的 7 天滚动

标签: python python-3.x pandas dataframe


【解决方案1】:

如果性能不是问题,您可以使用以下代码通过循环来实现。只需注意前 2 个值:

from datetime import date
def dif(x,y):
   t=date(int(x[:4]), int(x[5:7]), int(x[8:]))-date(int(y[:4]), int(y[5:7]), int(y[8:]))
   return t.days

df['prevmax']=0
for i in range(2,len(df)):
    p=max(i-8, 0)
    df.prevmax.iloc[i]=max([df.High.iloc[k] for k in range(p,i+1) if dif(df.Date.iloc[i],df.Date.iloc[k])<7])
result=df[['Date', 'prevmax']]

输出:

      Date       prevmax
0   2007-11-27      0.0
1   2007-11-28      0.0
2   2007-11-29   1050.0
3   2007-11-30   1050.0
4   2007-12-03   1050.0
5   2007-12-04   1056.0
6   2007-12-05   1099.5
7   2007-12-06   1109.7
8   2007-12-07   1134.0
9   2007-12-10   1134.0
10  2007-12-11   1134.0
11  2007-12-12   1134.0
12  2007-12-14   1140.0
13  2007-12-17   1168.0
14  2007-12-18   1168.0
15  2007-12-19   1168.0
16  2007-12-20   1168.0
17  2007-12-24   1192.0
18  2007-12-26   1214.0
19  2007-12-27   1240.0
20  2007-12-28   1274.0
21  2007-12-31   1295.0
22  2008-01-01   1319.0
23  2008-01-02   1324.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 2015-05-30
    相关资源
    最近更新 更多