同比年初至今百分比变化

时间:2018-06-29 09:23:24

标签: python pandas

我正在尝试计算逐年至今的变化。 我写了一些“行得通”的东西,但是我认为这不好,因为如果我缺少数据,我会发现它会破裂。

任何人都可以建议是否有一种更优雅和或更可靠的方法来实现这一目标?

请明确说明: 假设我有2018年1月= 10,2018年2月= 30,那么2018年2月至今= 10 + 30 = 40 然后2017年1月= 5,2017年2月= 15,然后2017年2月至今= 5 + 15 = 20

所以我希望2018年1月acc更改= 10/5-1 = 100%和2018年2月acc更改= 40 / 20-1 = 100%

这是我尝试的代码示例。 任何反馈都非常感谢。

import pandas as pd
import numpy as np

df1 = pd.DataFrame(columns=["YEAR", "MONTH", "VALUE"], dtype= np.float64)
i = 0


for year in range(2014, 2018, 1):
    for month in range(1, 13, 1):
        i += 1
        #print ('year ' + str(year) + ' month ' + str(month))
        df1.at[i - 1, 'YEAR'] = year
        df1.at[i - 1, 'MONTH'] = month
        df1.at[i - 1, 'VALUE'] = i

df1.at[48, 'YEAR'] = 2018
df1.at[48, 'MONTH'] = 1
df1.at[48, 'VALUE'] = 10
df1.at[49, 'YEAR'] = 2018
df1.at[49, 'MONTH'] = 2
df1.at[49, 'VALUE'] = 34
df1.at[50, 'YEAR'] = 2013
df1.at[50, 'MONTH'] = 12
df1.at[50, 'VALUE'] = 25



yearlist = df1['YEAR'].unique()

df1.sort_values(by=['YEAR', 'MONTH'], ascending=[True, True], inplace=True)

for year in yearlist:
    df1.loc[df1['YEAR'] == year, 'ACC'] = df1[df1['YEAR'] == year]['VALUE'].rolling(min_periods=1, window=12).sum()


df1.sort_values(by=['YEAR', 'MONTH'], ascending=[False, False], inplace=True) 
df1['CHANGE'] = df1['ACC'] / df1['ACC'].shift(-12) - 1 
df1.sort_values(by=['YEAR', 'MONTH'], ascending=[True, True], inplace=True)

1 个答案:

答案 0 :(得分:0)

df1.sortvalues...准备数据之前,一切都是AFAIU,但至少for循环可以替换为

df1['ACC'] = df1.groupby('YEAR').cumsum().VALUE

对我来说,df['CHANGE']的计算尚不清楚,但是如果您想将当前值除以去年的值之一,然后再减一,那么您已经可以了...