首页 > 解决方案 > 生成具有年增长率的未来数据框

问题描述

当我有基准年和增长率的数据时,我正在尝试为某个产品生成年度数据。

在玩具示例中,每种产品的“颜色”都有不同的效率年增长率,我想生成到 2030 年的年度数据。

因此,我有如下基准年数据(base_year):

    year    color   shape    efficiency
0   2018    red     circle   50
1   2018    red     square   30
2   2018    blue    circle   100
3   2018    blue    square   60

而每类产品的增长率(growthrate)为:

    color   rate
0   red     30
1   blue    20

我想要的结果是:

    year    color   shape    efficiency
0   2018    red     circle   50
1   2018    red     square   30
2   2018    blue    circle   100
3   2018    blue    square   60
4   2019    red     circle   65
5   2019    red     square   39
6   2019    blue    circle   120
7   2019    blue    square   72
8   2020    red     circle   84.5
... (until 2030)

玩具代码中使用的数据是..

base_year = pd.DataFrame(data = {'year': [2018,2018,2018,2018],
                     'color': ['red', 'red', 'blue', 'blue'],
                     'shape' : ['circle', 'square', 'circle', 'square'],
                     'efficiency' : [50, 30, 100, 60]}, columns = ['year', 'color', 'shape', 'efficiency'])

growthrate = pd.DataFrame(data = {'color': ['red', 'blue'],
                     'rate' : [30, 20]}, columns = ['color', 'rate'])

我一直在尝试使用 .loc 的一些方法,但似乎这种方法效率很低。

任何建议或提示将不胜感激。先感谢您!

标签: pythonpandasdataframe

解决方案


这是执行此操作的一种方法:

years = 2031 - 2018

df = (pd.concat([df.assign(year=df['year']+i,
                          efficiency=df['efficiency']*((df['rate']/100+1)**i)) 
                for i, df in enumerate([base_year.merge(growthrate, on='color')] * years)])
      .drop('rate', axis=1))

推荐阅读