увеличить значения середины года до месяца в пандах - PullRequest
1 голос
/ 15 октября 2019

после увеличить значения года до месяца в пандах

У меня есть:

pd.DataFrame({'comp':['a','b'], 'period':['20180331','20171231'],'value':[12,24]})
    comp    period  value
0   a   20180331    12
1   b   20171231    24

и я хочу экстраполировать на 201701–20181212 включительно. Значение следует распределить на 12 месяцев, предшествующих периоду.

comp yyymm value
a    201701 na
a    201702 na
...
a    201705 12
a    201706 12
...
a    201803 12
a    201804 na
b    201701 24
...
b    201712 24
b    201801 na
...

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Проверьте, работает ли это:

dftime = pd.DataFrame(pd.date_range('20170101','20181231'), columns=['dt']).apply(lambda x: x.dt.strftime('%Y-%m'), axis=1) # Populating full range including dates
dftime = dftime.assign(dt=dftime.dt.drop_duplicates().reset_index(drop=True)).dropna()  # Dropping duplicates from above range

df['dt'] = pd.to_datetime(df.period).apply(lambda x: x.strftime('%Y-%m'))  # Adding column for merging purpose
target = df.groupby('comp').apply(lambda x: dftime.merge(x[['comp','dt','value']], on='dt', how='left').fillna({'comp':x.comp.unique()[0]})).reset_index(drop=True) # Populating data for each company

Это дает желаемый результат: print(target)

dt comp  value
0   2017-01    a    NaN
1   2017-02    a    NaN
2   2017-03    a    NaN
3   2017-04    a    NaN
4   2017-05    a    NaN
5   2017-06    a    NaN
6   2017-07    a    NaN

и т. Д.

0 голосов
/ 15 октября 2019

Использование:

#create month periods with min and max value
r = pd.period_range('2017-01', '2018-12', freq='m')
#convert column to period
df['period'] = pd.to_datetime(df['period']).dt.to_period('m')
#create MultiIndex for add all possible values
mux = pd.MultiIndex.from_product([df['comp'], r], names=('comp','period'))
#reindex for append values
df = df.set_index(['comp','period'])['value'].reindex(mux).reset_index()

#back filling by 11 values of missing values per groups
df['new'] = df.groupby('comp')['value'].bfill(limit=11)

print (df)

   comp   period  value   new
0     a  2017-01    NaN   NaN
1     a  2017-02    NaN   NaN
2     a  2017-03    NaN   NaN
3     a  2017-04    NaN  12.0
4     a  2017-05    NaN  12.0
...
...
10    a  2017-11    NaN  12.0
11    a  2017-12    NaN  12.0
12    a  2018-01    NaN  12.0
13    a  2018-02    NaN  12.0
14    a  2018-03   12.0  12.0
15    a  2018-04    NaN   NaN
16    a  2018-05    NaN   NaN
17    a  2018-06    NaN   NaN
18    a  2018-07    NaN   NaN
19    a  2018-08    NaN   NaN
20    a  2018-09    NaN   NaN
21    a  2018-10    NaN   NaN
22    a  2018-11    NaN   NaN
23    a  2018-12    NaN   NaN
24    b  2017-01    NaN  24.0
25    b  2017-02    NaN  24.0
26    b  2017-03    NaN  24.0
...
...
32    b  2017-09    NaN  24.0
33    b  2017-10    NaN  24.0
34    b  2017-11    NaN  24.0
35    b  2017-12   24.0  24.0
36    b  2018-01    NaN   NaN
37    b  2018-02    NaN   NaN
38    b  2018-03    NaN   NaN
...
...
44    b  2018-09    NaN   NaN
45    b  2018-10    NaN   NaN
46    b  2018-11    NaN   NaN
47    b  2018-12    NaN   NaN
...