根据之前的行和条件列的平均值来创建和追加行

时间:2019-08-30 14:21:10

标签: python pandas time-series

我正在研究一个名为dataframe的{​​{1}},其中包含许多df值(用作主变量)的浮动变量(balance)的一年的每日信息。键)。我正在尝试通过匹配上个月的日期来创建新列account,计算平均值并将其用作预期的未来值。我现在将详细解释: 数据集是在附加并解析多个json值后生成的,一旦完成处理,就可以得到:

expected_balance

每个帐户值都有365个值(获取信息的开始日期和信息年份),并按天重新采样。之后,我将这个数据帧分为训练和测试。火车包含所有最近的值,除了最近2个月的信息,测试是最近2个月(最后一个月不一定都是满月,如果最后/最大日期值为 date balance account day month year fdate 0 2018-04-13 470.57 SP014 13 4 2018 201804 1 2018-04-14 375.54 SP014 14 4 2018 201804 2 2018-04-15 375.54 SP014 15 4 2018 201804 3 2018-04-16 229.04 SP014 16 4 2018 201804 4 2018-04-17 216.62 SP014 17 4 2018 201804 ... ... ... ... ... ... ... ... 414857 2019-02-24 381.26 KO012 24 2 2019 201902 414858 2019-02-25 181.26 KO012 25 2 2019 201902 414859 2019-02-26 160.82 KO012 26 2 2019 201902 414860 2019-02-27 0.82 KO012 27 2 2019 201902 414861 2019-02-28 109.50 KO012 28 2 2019 201902 ,则20-04-2019train will be from 20-04-2018 to 31-03-2019)。这就是我的管理方式:

test 01-03-2019 to 20-04-2019

我现在需要做的是为df_test_1 = df[df.fdate==df.groupby('account').fdate.transform('max')].copy() dft = df.drop(df_test_1.index) df_test_2 = dft[dft.fdate==dft.groupby('account').fdate.transform('max')].copy() df_train = dft.drop(df_test_2.index) df_test = pd.concat([df_test_2,df_test_1]) #print("Shape df: ",df.shape) #for validation purposes #print("Shape test: ",df_test.shape) #for validation purposes #print("Shape train: ",df_train.shape) #for validation purposes 中的每个日期创建一个新列exp_bal(预期余额),该列是通过将特定日期的所有火车值取平均值而得出的(这是请求的方法因此,我必须按照说明进行操作。 这是一个预期输出/结果的示例,我仅打印过去2个 train 月份中特定日期的帐户AA001值(假设这些值始终重复其他8个月):

df_test

我应该能够使用此信息为每一天添加一个新列,该列是 date balance account day month year fdate ... ... ... ... ... ... ... ... 0 2019-03-20 200.00 AA000 20 3 2019 201903 1 2019-04-20 100.00 AA000 20 4 2019 201904 所有月份中同一天值的平均值

df_train

因此,我可以为该帐户的预测计算出一个毫秒。

首先,我使用它来遍历每个帐户:

             date   balance account  day  month  year   fdate exp_bal
0      2018-05-20   470.57    AA000   20      5  2018  201805  150.00
30     2019-06-20   381.26    AA000   20      6  2019  201906  150.00

此后,我迷失了如何使用ids = list(df['account'].unique()) for i in range(0,len(ids)): dft_train = df_train[df_train['account'] == ids[i]] dft_test = df_test[df_test['account'] == ids[i]] first_date = min(dft_test['date']) last_date = max(df_ttest['date']) dft_train = dft_train.set_index('date') dft_test = dft_train.set_index('date') 值创建给定日期的平均值,该平均值将附加到dft_train的新列中。

我很感谢您的帮助或建议,也随时可以要求澄清/更多信息,我很乐意对此进行编辑。预先感谢!

1 个答案:

答案 0 :(得分:1)

不确定这是否是您唯一遇到的问题,但这是如何计算火车数据的预期余额:

import pandas as pd, numpy as np

# make test data
n = 60
df = pd.DataFrame({'Date': np.tile(pd.date_range('2018-01-01',periods=n).values, 2), 'Account': np.repeat(['A', 'B'], n), 'Balance': range(2*n)})
df['Day'] = df.Date.dt.day

# calculate expected balance
df['exp_bal'] = df.groupby(['Account', 'Day']).Balance.transform('mean')

# example output for day 5
print(df[df.Day==5])

输出:

         Date Account  Balance  Day  exp_bal
4  2018-01-05       A        4    5     19.5
35 2018-02-05       A       35    5     19.5
64 2018-01-05       B       64    5     79.5
95 2018-02-05       B       95    5     79.5