趋势时间序列数据框

时间:2019-05-19 00:33:20

标签: python pandas

我有一个看起来像这样的数据框:

d={'business':['FX','FX','IR','IR'],\
'date':(['01/01/2018','05/01/2018','01/01/2018','05/01/2018']),\
'amt':[1,5,101,105]}
df=pd.DataFrame(data=d)
df['date'] = pd.to_datetime(df['date'],format='%d/%m/%Y')
df

是否有一个函数可以扩展上面的数据框,使其看起来像这样:

 d_out={'business':['FX','FX','FX','FX','FX','IR','IR','IR','IR','IR'],\
'date':(['01/01/2018','02/01/2018','03/01/2018','04/01/2018','05/01/2018',\
        '01/01/2018','02/01/2018','03/01/2018','04/01/2018','05/01/2018']),\
'amt':[1,2,3,4,5,101,102,103,104,105]}

d_out=pd.DataFrame(data=d_out)

d_out

我试图根据两个日期之间的天数插入行,并基于某种简单的平均值填充amt字段。

只需检查一下,即可发现执行上述操作的最有效的 read easy 方法!

谢谢

3 个答案:

答案 0 :(得分:1)

我认为,最好使用date列作为时间索引,而将FX / IR业务的amt用作两列(例如,称为IR_amt和FX_amt)。
然后,您可以在数据帧上使用.interpolate并立即获得解决方案。没有定义其他功能,等等。
代码示例:

import numpy as np

for business in set(df['business'].values):
    df['{}_amt'.format(business)] = df.apply(lambda row: row['amt'] if row['business']==business else np.nan, axis=1)

df = df.drop(['business','amt'],axis=1).groupby('date').mean()
df = df.resample('1D').interpolate()

答案 1 :(得分:0)

agg将df返回到list模式,然后查看unnesting

x=df.groupby('business').agg({'amt':lambda x : list(range(x.min(),x.max()+1)),'date':lambda x : list(pd.date_range(x.min(),x.max()))})
yourdf=unnesting(x,['amt','date'])
yourdf#yourdf=yourdf.reset_index)
Out[108]: 
          amt       date
business                
FX          1 2018-01-01
FX          2 2018-01-02
FX          3 2018-01-03
FX          4 2018-01-04
FX          5 2018-01-05
IR        101 2018-01-01
IR        102 2018-01-02
IR        103 2018-01-03
IR        104 2018-01-04
IR        105 2018-01-05

def unnesting(df, explode):
    idx = df.index.repeat(df[explode[0]].str.len())
    df1 = pd.concat([
        pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1)
    df1.index = idx

    return df1.join(df.drop(explode, 1), how='left')

答案 2 :(得分:0)

您需要注意以下几点:

  1. 创建一个空数组
  2. 检查“日期”列中是否有超过一天的间隔,如果有,则附加:

    -在上面的数组中添加新的连续日期。

    -添加“业务”值,通过获取原始数据帧中连续行的平均值来添加“修改”

下面是我的做法:

import pandas as pd
import numpy as np
d={'business':['FX','FX','IR','IR'],\
'date':(['01/01/2018','05/01/2018','01/01/2018','05/01/2018']),\
'amt':[1,5,101,105]}
df=pd.DataFrame(data=d)
df['date'] = pd.to_datetime(df['date'],format='%d/%m/%Y')
df_array = []
result_df = df
orig_row=0
new_row=0
for i in range(len(df)):
    df_array.append(df.values[orig_row])
    if orig_row <len(df)-1:
        if ((df.date[orig_row+1] - df.date[orig_row]).days > 1):
            amt_avg = (df.amt[orig_row]+df.amt[orig_row+1])/2
            for i in range(((df.date[orig_row+1] - df.date[orig_row]).days)-1):
                df_array.append([df.business[orig_row],df.date[orig_row]+timedelta(days=i+1), amt_avg])
    orig_row+=1
result_df = pd.DataFrame(df_array,columns=['business','date','amt'])

输出:

  business       date    amt
0       FX 2018-01-01    1.0
1       FX 2018-01-02    3.0
2       FX 2018-01-03    3.0
3       FX 2018-01-04    3.0
4       FX 2018-01-05    5.0
5       IR 2018-01-01  101.0
6       IR 2018-01-02  103.0
7       IR 2018-01-03  103.0
8       IR 2018-01-04  103.0
9       IR 2018-01-05  105.0