【问题标题】:Resampled data not matching in PandasPandas 中的重采样数据不匹配
【发布时间】:2022-06-13 11:18:21
【问题描述】:

无法使用重新采样的数据获得相同的结果。例如:

import yfinance as yf
import pandas as pd
df = yf.download('f', interval = '1mo')
df = df[~df.index.duplicated(keep='last')]
# df = df.resample('CM').mean()
df['pct'] = df['Close'].pct_change()

print(df)

产生这个DataFrame

             Open    High    Low  Close  Adj Close        Volume       pct
Date                                                                      
1972-10-25    NaN     NaN    NaN    NaN        NaN           NaN       NaN
1973-01-23    NaN     NaN    NaN    NaN        NaN           NaN       NaN
1973-07-24    NaN     NaN    NaN    NaN        NaN           NaN       NaN
1973-10-23    NaN     NaN    NaN    NaN        NaN           NaN       NaN
1975-04-24    NaN     NaN    NaN    NaN        NaN           NaN       NaN
          ...     ...    ...    ...        ...           ...       ...
2022-03-01  17.41  18.250  15.51  16.91  16.798235  1.749488e+09 -0.037016
2022-04-01  17.01  17.150  13.90  14.16  14.066411  1.341340e+09 -0.162626
2022-05-01  14.02  15.000  12.07  13.68  13.680000  1.359644e+09 -0.033898
2022-06-01  13.88  13.970  13.36  13.50  13.500000  1.372803e+08 -0.013158
2022-06-03  13.63  13.775  13.36  13.50  13.500000  4.362525e+07  0.000000

我使用'MS' calendar month begin 重新采样了每日数据。这样重采样数据与我们使用 interval = '1mo' 获得的默认数据相匹配

df = yf.download('f')
df = df[~df.index.duplicated(keep='last')]
df = df.resample('MS').mean()
df['pct'] = df['Close'].pct_change()

print(df) 

这会产生

Date                                         ...                                   
1972-06-01   2.015902   2.127047   2.098477  ...   0.267396  1.545780e+06       NaN
1972-07-01   2.053871   2.071511   2.039882  ...   0.260849  1.061645e+06 -0.027089
1972-08-01   2.155512   2.171732   2.140879  ...   0.276273  1.683096e+06  0.050896
1972-09-01   2.124429   2.136392   2.110845  ...   0.271796  9.511339e+05 -0.016205
1972-10-01   2.118384   2.128706   2.106587  ...   0.271777  1.152049e+06 -0.002440
              ...        ...        ...  ...        ...           ...       ...
2022-02-01  18.114211  18.490000  17.770526  ...  18.019060  9.611196e+07 -0.194397
2022-03-01  16.770435  17.036521  16.379565  ...  16.583577  7.606470e+07 -0.079665
2022-04-01  15.530500  15.796500  15.176500  ...  15.341886  6.706698e+07 -0.076340
2022-05-01  13.387619  13.679048  13.084762  ...  13.387619  6.474497e+07 -0.131773
2022-06-01  13.716667  13.903333  13.453333  ...  13.646667  4.576010e+07  0.019350

[601 rows x 7 columns]

在这两个 DataFrame 中比较相同日期时,可以看到数据不匹配。我对最后一列特别感兴趣,即pct_change(),因为它们已经很遥远了。

2022-05-01  14.02  15.000  12.07  13.68  13.680000  1.359644e+09 -0.03389

通过指定interval = '1mo'

2022-05-01  13.387619  13.679048  13.084762  ...  13.387619  6.474497e+07 -0.131773

通过将数据从每日重新采样到每月。

我之前的印象是,与从月初开始的 Yahoo 数据相比,重新采样的数据是在月末采样的。然而,即使在日历月初重新采样,数据也不匹配。您能否告知为什么重新采样的数据与月度数据不匹配?

【问题讨论】:

    标签: python pandas-resample


    【解决方案1】:

    第一个数据

    您在第一次采样时采用了不同的采样:

    df = yf.download('f', interval = '1mo')
    

    您使用一个月蜡烛,开盘价是第一天 01/07/2022,而收盘价是该月最后一天,例如今天 07/06/2022。

    第二个数据

    df = yf.download('f')
    

    虽然在pypi page 中说默认间隔是“1mo”,但我已经对其进行了测试,似乎是“1d”(工作日)。

    因此,平均值是针对相应月份的所有天数计算的。这条线是一个月中所有日子的收盘价的平均值。这通常是不受欢迎的。

    df2.resample('MS').mean()
    

    测试

    df2 = yf.download('f')
    df2 = df2[~df2.index.duplicated(keep='last')]
    # df2 = df2.resample('MS').first()
    # df2['pct'] = df2['Close'].pct_change()
    df2.tail(10)
    

    这里我使用...agg.first() 来跟踪聚合数据的第一个值是什么。

    然后为 df2 打印更多行(使用默认间隔):

    注意它与月份天数的最低值相匹配,并取最后收盘价(昨天)。

    解决方案

    请注意定义时间间隔,并注意月平均天数与一个月的蜡烛价格无关。您应该使用min(low)last(close) 而不是mean(low)mean(close)

    df2.resample('MS').agg({'Open':'first','High':'max','Low': 'min','Close':'last'})
    

    【讨论】:

    • 你的意思是这样的吗? df.groupby('day').nth(-1).agg({'Low': ['min']})
    猜你喜欢
    • 2020-11-29
    • 1970-01-01
    • 2019-04-15
    • 2017-09-19
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2013-06-09
    • 2018-02-01
    相关资源
    最近更新 更多