【问题标题】:Resampling a Time Series in a MultiIndex DataFrame在 MultiIndex DataFrame 中重新采样时间序列
【发布时间】:2018-01-20 21:40:21
【问题描述】:

我在 MultiIndex DataFrame 中有一个包含时间序列数据的分层表 - 请参阅下面的示例数据 - 请注意,第 1 级索引填充不均。

如何对 DataFrame 重新采样以生成每周时间序列,该时间序列从当前日期每周向后重新采样。

我试过这个但失败了:

df.index.levels[0].name = 'date'
df.reset_index().groupby(pandas.Grouper(key='date', freq='W'))

样本数据:

                                Price   Sector
2016-08-08  Equity(24 [AAPL])   107.47  311
            Equity(4151 [JNJ])  124.19  206
            Equity(5061 [MSFT]) 57.95   311
            Equity(8347 [XOM])  87.52   309
            Equity(11100 [BRK_B])   145.52  103
            Equity(16841 [AMZN])    765.87  102
            Equity(26578 [GOOG_L])  806.93  311
            Equity(42950 [FB])  125.11  311
2016-08-09  Equity(24 [AAPL])   108.37  311
            Equity(4151 [JNJ])  123.69  206
            Equity(5061 [MSFT]) 58.06   311
            Equity(8347 [XOM])  88.55   309
            Equity(11100 [BRK_B])   145.45  103
            Equity(16841 [AMZN])    766.56  102
            Equity(26578 [GOOG_L])  805.39  311
            Equity(42950 [FB])  125.26  311
2016-08-10  Equity(24 [AAPL])   108.81  311
            Equity(4151 [JNJ])  123.44  206
            Equity(5061 [MSFT]) 58.20   311
            Equity(8347 [XOM])  87.98   309
            Equity(11100 [BRK_B])   147.30  103
            Equity(16841 [AMZN])    768.32  102
            Equity(26578 [GOOG_L])  807.47  311
            Equity(42950 [FB])  125.06  311
2016-08-11  Equity(24 [AAPL])   108.00  311
            Equity(4151 [JNJ])  123.43  206
            Equity(5061 [MSFT]) 58.02   311
            Equity(8347 [XOM])  86.41   309
            Equity(11100 [BRK_B])   146.73  103
            Equity(16841 [AMZN])    768.44  102
            Equity(26578 [GOOG_L])  808.66  311
            Equity(42950 [FB])  124.87  311
2016-08-12  Equity(24 [AAPL])   107.93  311
            Equity(4151 [JNJ])  123.76  206
            Equity(5061 [MSFT]) 58.31   311
            Equity(8347 [XOM])  86.73   309
            Equity(11100 [BRK_B])   147.72  103
            Equity(16841 [AMZN])    771.30  102
            Equity(26578 [GOOG_L])  808.20  311
            Equity(42950 [FB])  124.91  311
2016-08-15  Equity(24 [AAPL])   108.16  311
            Equity(4151 [JNJ])  123.21  206
            Equity(5061 [MSFT]) 57.93   311
            Equity(8347 [XOM])  87.80   309
            Equity(11100 [BRK_B])   147.64  103
            Equity(16841 [AMZN])    772.56  102
            Equity(26578 [GOOG_L])  807.05  311
            Equity(42950 [FB])  124.87  311
2016-08-16  Equity(24 [AAPL])   109.50  311
            Equity(4151 [JNJ])  122.33  206
            Equity(5061 [MSFT]) 57.76   311
            Equity(8347 [XOM])  87.81   309
            Equity(11100 [BRK_B])   147.78  103
            Equity(16841 [AMZN])    768.49  102
            Equity(26578 [GOOG_L])  806.00  311
            Equity(42950 [FB])  123.90  311
2016-08-17  Equity(24 [AAPL])   109.38  311
            Equity(4151 [JNJ])  120.34  206
            Equity(5061 [MSFT]) 57.44   311
            Equity(8347 [XOM])  87.94   309
……      ……          ……  ……
2017-07-31  Equity(8347 [XOM])  79.60   309
            Equity(11100 [BRK_B])   173.99  103
            Equity(16841 [AMZN])    1020.01 102
            Equity(25006 [JPM]) 91.27   103
            Equity(26578 [GOOG_L])  958.20  311
            Equity(42950 [FB])  172.46  311
2017-08-01  Equity(24 [AAPL])   148.77  311
            Equity(4151 [JNJ])  132.72  206
            Equity(5061 [MSFT]) 72.72   311
            Equity(8347 [XOM])  80.04   309
            Equity(11100 [BRK_B])   175.07  103
            Equity(16841 [AMZN])    987.50  102
            Equity(25006 [JPM]) 91.81   103
            Equity(26578 [GOOG_L])  945.83  311
            Equity(42950 [FB])  169.28  311
2017-08-02  Equity(24 [AAPL])   150.05  311
            Equity(4151 [JNJ])  132.55  206
            Equity(5061 [MSFT]) 72.55   311
            Equity(8347 [XOM])  80.15   309
            Equity(11100 [BRK_B])   176.29  103
            Equity(16841 [AMZN])    996.19  102
            Equity(25006 [JPM]) 93.00   103
            Equity(26578 [GOOG_L])  946.56  311
            Equity(42950 [FB])  169.85  311
2017-08-03  Equity(24 [AAPL])   157.15  311
            Equity(4151 [JNJ])  132.14  206
            Equity(5061 [MSFT]) 72.25   311
            Equity(8347 [XOM])  80.59   309
            Equity(11100 [BRK_B])   177.78  103
            Equity(16841 [AMZN])    995.32  102
            Equity(25006 [JPM]) 93.08   103
            Equity(26578 [GOOG_L])  947.18  311
            Equity(42950 [FB])  169.25  311
2017-08-04  Equity(24 [AAPL])   155.53  311
            Equity(4151 [JNJ])  133.35  206
            Equity(5061 [MSFT]) 72.14   311
            Equity(8347 [XOM])  80.46   309
            Equity(11100 [BRK_B])   178.94  103
            Equity(16841 [AMZN])    987.14  102
            Equity(25006 [JPM]) 92.46   103
            Equity(26578 [GOOG_L])  940.63  311
            Equity(42950 [FB])  168.58  311
2017-08-07  Equity(24 [AAPL])   156.34  311
            Equity(4151 [JNJ])  133.11  206
            Equity(5061 [MSFT]) 72.66   311
            Equity(8347 [XOM])  80.17   309
            Equity(11100 [BRK_B])   179.79  103
            Equity(16841 [AMZN])    987.41  102
            Equity(25006 [JPM]) 93.68   103
            Equity(26578 [GOOG_L])  945.34  311
            Equity(42950 [FB])  169.59  311
2017-08-08  Equity(24 [AAPL])   158.79  311
            Equity(4151 [JNJ])  132.84  206
            Equity(5061 [MSFT]) 72.40   311
            Equity(8347 [XOM])  80.15   309
            Equity(11100 [BRK_B])   178.00  103
            Equity(16841 [AMZN])    991.80  102
            Equity(25006 [JPM]) 94.02   103
            Equity(26578 [GOOG_L])  945.31  311
            Equity(42950 [FB])  171.96  311

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    根据您想要汇总价格的方式,resample 为您提供了多种选择。以下是涵盖 2 个工作日的部分时间的 2 只股票的示例数据框:

    np.random.seed(123)
    df1 = pd.DataFrame({ 'price':abs(np.random.randn(5)).cumsum(), 'ticker':'GOOG_L' }, 
                       index=pd.date_range('1-4-2017', periods=5, freq='B') )
    df2 = pd.DataFrame({ 'price':abs(np.random.randn(5)).cumsum(), 'ticker':'AAPL' }, 
                       index=pd.date_range('1-4-2017', periods=5, freq='B') )
    df = df1.append(df2).sort_index()
    
                   price ticker
    2017-01-04  1.085631   GOOG_L
    2017-01-04  1.651437   AAPL
    2017-01-05  2.082976   GOOG_L
    2017-01-05  4.078116   AAPL
    2017-01-06  2.365955   GOOG_L
    2017-01-06  4.507028   AAPL
    2017-01-09  3.872249   GOOG_L
    2017-01-09  5.772965   AAPL
    2017-01-10  4.450850   GOOG_L
    2017-01-10  6.639705   AAPL
    

    您可以从那里以多种方式重新采样(平均值、最大值、第一等):

    df.groupby('ticker')['price'].resample('W').mean()
    
    ticker            
    AAPL    2017-01-08    3.412194
            2017-01-15    6.206335
    GOOG_L  2017-01-08    1.844854
            2017-01-15    4.161549
    Name: price, dtype: float64
    
    df.groupby('ticker')['price'].resample('W').max()
    
    ticker            
    AAPL    2017-01-08    4.507028
            2017-01-15    6.639705
    GOOG_L  2017-01-08    2.365955
            2017-01-15    4.450850
    Name: price, dtype: float64
    
    df.groupby('ticker')['price'].resample('W').first()
    
    ticker            
    AAPL    2017-01-08    1.651437
            2017-01-15    5.772965
    GOOG_L  2017-01-08    1.085631
            2017-01-15    3.872249
    Name: price, dtype: float64
    

    编辑添加:您可以使用“loffset”可选参数调整星期几。例如,以上日期均为星期日。要在星期一,请使用:

    df.groupby('ticker')['price'].resample('W',loffset='1D').first()
    

    【讨论】:

    • 是否可以指定当前日期 2017-08-08 进行重采样,即。之前的所有几周都以该日期为基础?另外,我需要将每周日期作为第一个索引,而不是代码。谢谢
    • @artDeco 我不明白第一个问题。您的意思是,如果当前日期是星期一,那么所有采样日期都应该是星期一?至于第二个问题,您可以随意设置或重置索引。结果都是数据框本身
    • 是的,如果当前日期是星期一,那么所有采样日期都是星期一。
    • 我无法在收到的基础上更改当前日期,收到的所有数据都是每天的。我需要准确地制作:取当前日期,向后重新采样数周。衷心感谢您的意见。
    • @artDeco 只是参数化它。像他们在这里一样获取星期几:stackoverflow.com/questions/9847213/… 然后将其插入loffset(我想从中减去一个)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 2021-03-11
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多