|
16 | 16 | def project(df):
|
17 | 17 | """Compute current year-end projection.
|
18 | 18 |
|
19 |
| - Assumes original DataFrame shape, suitable for calling like: |
| 19 | + Assumes transposed DataFrame shape, suitable for calling like: |
20 | 20 | ```
|
21 |
| - df.groupby(lambda x:x, axis=1, level=0).apply(project)) |
| 21 | + df.groupby(lambda x:x, level=0).apply(project)) |
22 | 22 | ```
|
| 23 | + Transposes all operations from `project` (e.g. `df[k]` → `df.loc[k]`) |
23 | 24 | """
|
24 |
| - [top_level] = df.columns.get_level_values(0).drop_duplicates() |
25 |
| - d = df.loc[:, top_level] |
26 |
| - prv_ytd = d.prv_ytd |
27 |
| - cur_ytd = d.cur_ytd |
| 25 | + [top_level] = df.index.get_level_values(0).drop_duplicates() |
| 26 | + d = df.loc[top_level] |
| 27 | + prv_ytd = d.loc['prv_ytd'] |
| 28 | + cur_ytd = d.loc['cur_ytd'] |
28 | 29 | zero_mask = prv_ytd == 0
|
29 |
| - prv_roy = d.prv_end - prv_ytd |
30 |
| - d.loc[ zero_mask, 'roy'] = (prv_roy + cur_ytd) * cur_roy_frac |
31 |
| - d.loc[~zero_mask, 'roy'] = prv_roy * (1 + cur_ytd_frac * (cur_ytd / prv_ytd - 1)) |
32 |
| - d['roy'] = round(d.roy).astype(int) |
33 |
| - d['projected'] = cur_ytd + d.roy |
34 |
| - return d[['roy', 'projected']] |
| 30 | + prv_roy = d.loc['prv_end'] - prv_ytd |
| 31 | + d.loc['roy', zero_mask] = (prv_roy + cur_ytd) * cur_roy_frac |
| 32 | + d.loc['roy', ~zero_mask] = prv_roy * (1 + cur_ytd_frac * (cur_ytd / prv_ytd - 1)) |
| 33 | + d.loc['roy'] = round(d.loc['roy']) |
| 34 | + d.loc['projected'] = cur_ytd + d.loc['roy'] |
| 35 | + return d.loc[['roy', 'projected']].astype(int) # casting d.loc['roy'] above doesn't work, for some reason |
35 | 36 |
|
36 | 37 |
|
37 | 38 | # Compute projections
|
38 |
| -proj = df.groupby(lambda x: x, axis=1, level=0).apply(project) |
| 39 | +proj = df.T.groupby(lambda x: x, level=0).apply(project).T |
39 | 40 | print(proj)
|
40 | 41 | proj.to_csv('proj.csv')
|
0 commit comments