【问题标题】:looping over variables in pandas and for each month, computing OHLC and storing data into new dataframe's columns循环遍历 pandas 和每个月的变量,计算 OHLC 并将数据存储到新数据框的列中
【发布时间】:2021-09-07 19:30:23
【问题描述】:

我有一个财务收盘价(每周)数据,如下所示:

Date        V1      V2      V3      V4      V5      V6      V7
2010-01-01  77.31   66.94   52.33   34.94   81.38   84.75   482
2010-01-08  78.05   68.85   52.84   34.66   90.15   95.61   508
2010-01-15  79.29   68.3    53.61   35.33   86.97   97.87   490
2010-01-22  80.57   68.19   55.43   35.8    86.04   99.26   480
2010-01-29  81.87   68.79   55.84   35.6    83.36   98.53   462
2010-02-05  83.7    70.35   57.3    36.57   84.54   91.83   464
2010-02-12  81.85   68.32   56.4    37.35   81.2    90.75   455
2010-02-19  82.66   69.04   56.21   36.89   81.85   93.98   457
2010-02-26  86.32   69.7    57.43   37.12   83.96   96.43   467
2010-03-05  85.37   69.98   57.34   36.71   84.01   94.83   466
2010-03-12  84.04   69.76   56.74   36.98   83.02   93.92   466
2010-03-19  84.37   69.76   56.77   37.07   83.29   95.04   458
2010-03-26  85.7    70.06   56.62   36.81   81.64   94.84   459
2010-04-02  85.38   70.72   56.03   36.78   83.91   94.98   464
2010-04-09  89.21   71.7    58.38   37.49   86.95   98.74   471
2010-04-16  89.74   72.35   58.74   38.05   85.58   98.28   487
2010-04-23  90.72   74.26   60.61   38.64   90.5    100.18  492
2010-04-30  99.79   78.67   65.14   38.89   95.82   108.87  494
2010-05-07  102.34  81.48   63.45   41.87   93.18   106.2   478
2010-05-14  96.42   79.81   62.57   41.23   88.94   102.23  484
2010-05-21  96.17   76.9    61.06   39.28   88.22   97.8    444
2010-05-28  95.73   77.67   61.1    39.88   92.88   96.84   421

这里V1,V2...V7是一些公司,在上表数据中给出了每周收盘价。

我要做的是计算:

  1. 每个月的开盘价、收盘价、最高价和最低价
  2. open 应该是该月 Date 列中第一个日期的价格,而 close 应该是最后一个日期,对吧?

我正在使用下面的代码,它会返回如下代码所示的结果:

def calculate(x):
    open = x.loc[x.index.min(), "V1"]
    high = x.loc[x.index, "V1"].max()
    low = x.loc[x.index, "V1"].min()
    close = x.loc[x.index.max(), "V1"]
    return open, high, low, close

result = pd.DataFrame()
result = df.groupby(df["Date"].dt.to_period("M")).apply(calculate)

result

以上结果:

Date
2010-01    (77.31, 81.87, 77.31, 81.87)  
2010-02    (83.7, 86.32, 81.85, 86.32)   
2010-03    (85.37, 85.7, 84.04, 85.7)    
2010-04    (85.38, 99.79, 85.38, 99.79)  
2010-05    (102.34, 102.34, 95.73, 95.73)
                        ...            

现在我想将这些元组连同日期一起放入相应的列中:

  1. 日期、开盘价、最高价、最低价、收盘价

还有, 2. 我想使用单循环操作或其他方式对所有变量(V1 到 V7)重复上述函数。

有人可以建议我如何做到这一点吗?

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    IIUC,你也可以试试:

    df.Date = pd.to_datetime(df.Date)
    df = df.sort_values('Date')
    df = (df.groupby(pd.Grouper(key = 'Date', freq = '1M')).agg(**{'open': ('V1','first'), 'high' : ('V1', 'max'), 'low' : ('V1', 'min'), 'close': ('V1','last')}))
    

    输出:

                  open    high    low  close
    Date                                    
    2010-01-31   77.31   81.87  77.31  81.87
    2010-02-28   83.70   86.32  81.85  86.32
    2010-03-31   85.37   85.70  84.04  85.70
    2010-04-30   85.38   99.79  85.38  99.79
    2010-05-31  102.34  102.34  95.73  95.73
    

    注意:您也可以使用resample:

    df = df.set_index('Date').resample('1M').agg({'V1': ['min', 'max', 'first', 'last']})
    

    更新的答案: `

    df1 = df.set_index('Date').resample('1M').agg(['min', 'max', 'first', 'last'])
    df1.columns = [f'{i}_{j}' for i,j in zip(df1.columns.get_level_values(0),df1.columns.get_level_values(1).map({'min': 'low', 'max': 'high', 'first': 'open', 'last': 'close'}))]
    

    【讨论】:

    • resampe 仅返回最小、最大、第一列和最后一列名称.. 我可以重命名这些,没有问题,但是如果我想遍历所有 V,例如V1、V2、V3,我可以在这里申请循环吗?
    • @I_m_LeMarque 检查更新的答案。此外,有几种方法可以重命名我添加的列 1 方式。
    • 谢谢 :) 它解决了很多问题……我也学到了一些新东西……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 2013-05-18
    • 2023-02-04
    • 2018-05-30
    • 2018-03-07
    • 1970-01-01
    相关资源
    最近更新 更多