【问题标题】:Dealing with time-series data in pandas在 pandas 中处理时间序列数据
【发布时间】:2017-09-06 09:37:37
【问题描述】:

我有一个每日时间序列数据。我试图通过乘以一些月度因子来纠正这些时间序列值。它就像手动校正一样:

我的时间序列数据如下:

model:

2010-01-30    0.008909
2010-01-31    0.007562
2010-02-01    0.012377
2010-02-02    0.010286
2010-02-03    0.012244
2010-02-04    0.011367
2010-02-05    0.010800
2010-02-06    0.007610
2010-02-07    0.006534
2010-02-08    0.004721
                ...   
2015-12-02    0.005415
2015-12-03    0.004358
2015-12-04    0.006844
2015-12-05    0.002373

我有一个每月的因素,例如:

mon_slope:

month
January     -0.168627
February    -0.165102
March       -0.112321
April       -0.112232
May         -0.080092
June        -0.129905
July        -0.078751
August      -0.095756
September   -0.090188
October     -0.109919
November    -0.155380
December    -0.137885
Name: slope, dtype: float64

我做了什么:

jan_corr = pd.DataFrame(model[model.index.month ==1]*mon_slope.ix[0][1])
feb_corr = pd.DataFrame(model[model.index.month ==2]*mon_slope.ix[1][1])
mar_corr = pd.DataFrame(model[model.index.month ==3]*mon_slope.ix[2][1])

..................
..................

final = pd.concat([jan_corr,feb_corr,mar_corr])

但我确信这不是正确的做法。有没有更简单的方法来做到这一点:

【问题讨论】:

    标签: python pandas dataframe time-series


    【解决方案1】:

    首先,创建一个映射:

    mapping = dict(months.values)
    mapping
    
    {'April': -0.112232,
     'August': -0.095756,
     'December': -0.13788499999999998,
     'February': -0.165102,
     'January': -0.168627,
     'July': -0.078751,
     'June': -0.129905,
     'March': -0.112321,
     'May': -0.080092,
     'November': -0.15538,
     'October': -0.109919,
     'September': -0.090188}
    

    您可以使用Series.dt.strftime 检索月份名称:

    df.iloc[:, 0].dt.strftime('%B')
    Out[143]: 
    0      January
    1      January
    2     February
    3     February
    4     February
    5     February
    6     February
    7     February
    8     February
    9     February
    10    December
    11    December
    12    December
    13    December
    Name: 0, dtype: object
    

    现在,使用它通过df.replacedf.map 访问乘数:

    df.iloc[:, 1] = df.iloc[:, 0].dt.strftime('%B').map(mapping) * df.iloc[:, 1]
    df
    
                0         1
    0  2010-01-30 -0.001502
    1  2010-01-31 -0.001275
    2  2010-02-01 -0.002043
    3  2010-02-02 -0.001698
    4  2010-02-03 -0.002022
    5  2010-02-04 -0.001877
    6  2010-02-05 -0.001783
    7  2010-02-06 -0.001256
    8  2010-02-07 -0.001079
    9  2010-02-08 -0.000779
    10 2015-12-02 -0.000747
    11 2015-12-03 -0.000601
    12 2015-12-04 -0.000944
    13 2015-12-05 -0.000327
    

    详情:

    df
    
                0         1
    0  2010-01-30  0.008909
    1  2010-01-31  0.007562
    2  2010-02-01  0.012377
    3  2010-02-02  0.010286
    4  2010-02-03  0.012244
    5  2010-02-04  0.011367
    6  2010-02-05  0.010800
    7  2010-02-06  0.007610
    8  2010-02-07  0.006534
    9  2010-02-08  0.004721
    10 2015-12-02  0.005415
    11 2015-12-03  0.004358
    12 2015-12-04  0.006844
    13 2015-12-05  0.002373
    
    months
    
                0         1
    0     January -0.168627
    1    February -0.165102
    2       March -0.112321
    3       April -0.112232
    4         May -0.080092
    5        June -0.129905
    6        July -0.078751
    7      August -0.095756
    8   September -0.090188
    9     October -0.109919
    10   November -0.155380
    11   December -0.137885
    

    【讨论】:

    • @COLDSPEED,这就是我想要的。谢谢你:)
    • @bikuser 很高兴我能帮上忙!
    猜你喜欢
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    相关资源
    最近更新 更多