大熊猫偏移日期

时间:2019-04-17 23:16:43

标签: python pandas date datetime

我正在尝试修改我的熊猫数据框,但仍然没有得到任何结果。我有这种形式的数据框:

fc.iloc[:,:2][:10]
Out[309]: 
             DATE  TOTAL_REVENUE_TTM
TIC                                 
AMZN.O 2018-01-01       3.769385e+11
AMZN.O 2018-01-01       3.775364e+11
AMZN.O 2018-01-01       3.772219e+11
AMZN.O 2018-01-01       3.766596e+11
AMZN.O 2018-01-01       3.757391e+11
AMZN.O 2018-02-01       3.931331e+11
AMZN.O 2018-02-01       3.935390e+11
AMZN.O 2018-02-01       3.932100e+11
AMZN.O 2018-02-01       3.926973e+11
AMZN.O 2018-02-01       3.917282e+11

我需要正确修改DATE列,该列不能反映真实日期。困难的是,我需要按照某种模式对其进行修改。 在这里,我只打印了10列,但是我观察到的很多列都遵循相同的规则。

总而言之,这些是LSTM网络大小为5的输出(我仅打印了两个输出),并且打印日期仅仅是该输出的最后日期。我需要恢复所有其他日期,因为它们都将时间倒退了12个月。实际上,我应该将第4行中的日期偏移1年,将第3行中的日期偏移2年,依此类推。这应该应用于每个输出(例如,数据框的每5行),以及数据框中的每个公司。

还应该概括代码的工作方式,例如,如果我更改输出的大小,以便我可以重复3个日期而不是5个日期,并且还可以将偏移量改回过去。

我试图编写一个使用这两个参数并返回正确偏移日期的整个数据帧的函数,但是我很难找到正确地再现模式的方法。

这里,我的函数有一段代码应该将每个数据框都引用到公司,进行详细说明,然后再次连接以形成新的数据框:

def modify_forecasts_dates(fc,offset,output_size):


    #extract the company names
    companies = fc.index.get_level_values(0).unique()
    cmp_to_concat = []

    for tick in companies:

        cmp = fc.loc[tick]      
        cmp.insert(0, 'ROW_NUM', range(1,len(cmp)+1))
        cmp['BOOL'] = np.where((np.mod(cmp['ROW_NUM'],output_size)==0), 'OK', 'MODIFY')   



        #cmp.drop(labels=['ROW_NUM','BOOL'],inplace=True)
        cmp_to_concat.append(cmp)

    final_df = pd.concat(cmp_to_concat)

    return final_df

我首先尝试插入一个计数行号,以识别哪些行是不需要更改的,即输出的最后一行。问题仍然存在,因为那时我不知道如何更新最后一个输出行之前的所有观测值。

有没有一种简单的方法可以按5行的步长获取数据帧(或等效地按输出大小的步长),并适当地偏移所有先前的日期,从而获得t,t-offset,t-2 * offset等上吗?

我知道了解我需要做的事情有点复杂,但是我真的很努力。我可以手工完成,但是最好是自动执行该过程。

1 个答案:

答案 0 :(得分:1)

我假设您的数据将以num_year行的组(在这种情况下为num_year=5)的形式出现。另外,我发现拥有非唯一索引是不安全的,这会使更新列更加困难。所以我选择重置索引:

# sample data
df = pd.DataFrame({'tic':['a']*10+['b']*20,
                   'date': sorted(list(pd.date_range('2018-01-01', '2018-01-06', freq='d')
                           )* 5 )}).set_index('tic')

# make sure companies are grouped together, 
# skip if they are already
df = df.reset_index().sort_values(['tic','date'])

num_year = 5

# offset pattern
delta = pd.Series([pd.DateOffset(years=i) 
                      for i in range(num_year-1,-1,-1)] * (len(df)//num_year))

# update date
df.date = df.date - delta

df.head(10)

输出:

+----+------+------------+
|    | tic  |    date    |
+----+------+------------+
| 0  | a    | 2014-01-01 |
| 1  | a    | 2015-01-01 |
| 2  | a    | 2016-01-01 |
| 3  | a    | 2017-01-01 |
| 4  | a    | 2018-01-01 |
| 5  | a    | 2014-01-02 |
| 6  | a    | 2015-01-02 |
| 7  | a    | 2016-01-02 |
| 8  | a    | 2017-01-02 |
| 9  | a    | 2018-01-02 |
+----+------+------------+