【问题标题】:Get stock Low of Day (LOD) price for incomplete daily bar using minute bar data (multiple stocks, multiple sessions in one df) SettingWithCopyWarning使用分钟柱数据(多个股票,一个 df 中的多个会话)获取不完整每日柱的股票日低 (LOD) 价格 SettingWithCopyWarning
【发布时间】:2021-09-11 18:47:37
【问题描述】:

我有一个包含多只股票的 分钟 数据的数据框,每只股票都有多个会话。请参阅下面的示例

         Symbol            Time     Open    High    Low  Close  Volume  LOD
2724312   AEHR 2019-09-23 09:31:00   1.42   1.42   1.42   1.42     200  NaN
2724313   AEHR 2019-09-23 09:43:00   1.35   1.35   1.34   1.34    6062  NaN
2724314   AEHR 2019-09-23 09:58:00   1.35   1.35   1.29   1.30    8665  NaN
2724315   AEHR 2019-09-23 09:59:00   1.32   1.32   1.32   1.32     100  NaN
2724316   AEHR 2019-09-23 10:00:00   1.35   1.35   1.35   1.35     400  NaN
...        ...                 ...    ...    ...    ...    ...     ...  ...
4266341     ZI 2021-09-10 15:56:00  63.08  63.16  63.08  63.15   18205  NaN
4266342     ZI 2021-09-10 15:57:00  63.14  63.14  63.07  63.07   19355  NaN
4266343     ZI 2021-09-10 15:58:00  63.07  63.12  63.07  63.10   16650  NaN
4266344     ZI 2021-09-10 15:59:00  63.09  63.12  63.06  63.11   25775  NaN
4266345     ZI 2021-09-10 16:00:00  63.11  63.17  63.11  63.17   28578  NaN

我需要会话(9:30-4pm)到每一行的时间的(LOD)的最低值。

完成的df应该是这样的

         Symbol            Time     Open    High    Low  Close  Volume  LOD
2724312   AEHR 2019-09-23 09:31:00   1.42   1.42   1.42   1.42     200  1.42   
2724313   AEHR 2019-09-23 09:43:00   1.35   1.35   1.34   1.34    6062  1.34   
2724314   AEHR 2019-09-23 09:58:00   1.35   1.35   1.29   1.30    8665  1.29   
2724315   AEHR 2019-09-23 09:59:00   1.32   1.32   1.32   1.32     100  1.29   
2724316   AEHR 2019-09-23 10:00:00   1.35   1.35   1.35   1.35     400  1.29   
...        ...                 ...    ...    ...    ...    ...     ...  ...
4266341     ZI 2021-09-10 15:56:00  63.08  63.16  63.08  63.15   18205  63.08  
4266342     ZI 2021-09-10 15:57:00  63.14  63.14  63.07  63.07   19355  63.07  
4266343     ZI 2021-09-10 15:58:00  63.07  63.12  63.07  63.10   16650  63.07  
4266344     ZI 2021-09-10 15:59:00  63.09  63.12  63.06  63.11   25775  63.06  
4266345     ZI 2021-09-10 16:00:00  63.11  63.17  63.11  63.17   28578  63.06 

我目前的解决方案

prev_symbol = "WXYZ"
prev_low = 10000000
prev_session = datetime.date(1920, 1, 1)
session_start = 1

for i, row in df.iterrows():
    current_session = (df['Time'].iloc[i]).time()
    current_symbol = df['Symbol'].iloc[i]
    if current_symbol == prev_symbol:
        if current_session == prev_session:
            sesh_low = df.iloc[session_start:i, 'Low'].min()
            df.at[i, 'LOD'] = sesh_low
        else:
            df.at[i, 'LOD'] = df.at[i, 'Low']
            prev_session = current_session
            session_start = i
    else:
        df.at[i, 'LOD'] = df.at[i, 'Low']
        prev_symbol = current_symbol
        prev_session = current_session
        session_start = i

这会返回一个SettingWithCopyWarning 错误。请帮忙

【问题讨论】:

    标签: pandas dataframe loops stockquotes ohlc


    【解决方案1】:

    你可以试试.groupby() + .expanding():

    # if you have values already converted/sorted, skip:
    # df["Time"] = pd.to_datetime(df["Time"])
    # df = df.sort_values(by=["Symbol", "Time"])
    
    df["LOD"] = df.groupby("Symbol")["Low"].expanding().min().values
    print(df)
    

    打印:

            Symbol                 Time   Open   High    Low  Close  Volume    LOD
    2724312   AEHR  2019-09-23 09:31:00   1.42   1.42   1.42   1.42     200   1.42
    2724313   AEHR  2019-09-23 09:43:00   1.35   1.35   1.34   1.34    6062   1.34
    2724314   AEHR  2019-09-23 09:58:00   1.35   1.35   1.29   1.30    8665   1.29
    2724315   AEHR  2019-09-23 09:59:00   1.32   1.32   1.32   1.32     100   1.29
    2724316   AEHR  2019-09-23 10:00:00   1.35   1.35   1.35   1.35     400   1.29
    4266341     ZI  2021-09-10 15:56:00  63.08  63.16  63.08  63.15   18205  63.08
    4266342     ZI  2021-09-10 15:57:00  63.14  63.14  63.07  63.07   19355  63.07
    4266343     ZI  2021-09-10 15:58:00  63.07  63.12  63.07  63.10   16650  63.07
    4266344     ZI  2021-09-10 15:59:00  63.09  63.12  63.06  63.11   25775  63.06
    4266345     ZI  2021-09-10 16:00:00  63.11  63.17  63.11  63.17   28578  63.06
    

    【讨论】:

    • 抱歉,您将如何解释同一股票代码中的不同会话。此解决方案似乎找到了符号的所有会话的低跨度。一节课从每天 9:30 到 4:00 进行
    • @AnthonyShi 您可以创建“临时”列,通过“符号”和此列标识各种会话和分组。类似于df.groupby(["Symbol", "temporary column name"])["Low"].expanding().min()
    猜你喜欢
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多