根据月环比变化和 Pandas 中的值计算年环比变化
Calculate year-over-year changes based month-over-month changes and values in Pandas
给定可以从 here 下载的示例数据:
假设 2022-04-30
中的 MoM
列值是用单位百分比 (%) 预测的每月变化。
我将需要根据 MoM 和值列分别计算年同比变化,用于导入和导出。
我已经通过下面的代码实现了这一点,但是如何将其转换为函数以使其更容易实现多列(假设我还有其他列:GDP_MoM、GDP_value、 CPI_MoM、CPI_value 等 df
)?感谢您的提前帮助。
import pandas as pd
df = pd.read_excel('./sample_data1.xlsx')
df.tail(5)
df['import_value_YoY_based_MoM'] = ((df['import_MoM']/100 +1)*df['import_value'].shift(1) / df['import_value'].shift(12))-1
df['export_value_YoY_based_MoM'] = ((df['export_MoM']/100 +1)*df['export_value'].shift(1) / df['export_value'].shift(12))-1
df['import_value_YoY'] = df['import_value'] / df['import_value'].shift(12) -1
df['export_value_YoY'] = df['export_value'] / df['export_value'].shift(12) -1
print(df.tail(5))
输出:
将自定义函数与 f-string
一起使用,并为列表 cols
中的两个列名称成对输入:
def f(df, col1, col2):
df[f'{col2}_YoY_based_{col1}'] = ((df[col1]/100 +1)*df[col2].shift(1) / df[col2].shift(12))-1
df[f'{col2}_YoY'] = df[col2] / df[col2].shift(12) -1
return df
cols = [('import_MoM','import_value'), ('export_MoM','export_value')]
for col1, col2 in cols:
df = f(df, col1, col2)
给定可以从 here 下载的示例数据:
假设 2022-04-30
中的 MoM
列值是用单位百分比 (%) 预测的每月变化。
我将需要根据 MoM 和值列分别计算年同比变化,用于导入和导出。
我已经通过下面的代码实现了这一点,但是如何将其转换为函数以使其更容易实现多列(假设我还有其他列:GDP_MoM、GDP_value、 CPI_MoM、CPI_value 等 df
)?感谢您的提前帮助。
import pandas as pd
df = pd.read_excel('./sample_data1.xlsx')
df.tail(5)
df['import_value_YoY_based_MoM'] = ((df['import_MoM']/100 +1)*df['import_value'].shift(1) / df['import_value'].shift(12))-1
df['export_value_YoY_based_MoM'] = ((df['export_MoM']/100 +1)*df['export_value'].shift(1) / df['export_value'].shift(12))-1
df['import_value_YoY'] = df['import_value'] / df['import_value'].shift(12) -1
df['export_value_YoY'] = df['export_value'] / df['export_value'].shift(12) -1
print(df.tail(5))
输出:
将自定义函数与 f-string
一起使用,并为列表 cols
中的两个列名称成对输入:
def f(df, col1, col2):
df[f'{col2}_YoY_based_{col1}'] = ((df[col1]/100 +1)*df[col2].shift(1) / df[col2].shift(12))-1
df[f'{col2}_YoY'] = df[col2] / df[col2].shift(12) -1
return df
cols = [('import_MoM','import_value'), ('export_MoM','export_value')]
for col1, col2 in cols:
df = f(df, col1, col2)