python pandas 计算环比、同比 pct_change -- 自定义函数

加载库

import random
import pandas as pd
import numpy as np

随机生成数据集(DataFrame格式)

DataRanges = pd.date_range("2020-01", "2022-12", freq="MS")                                    # 获取月份列表,dtype: pd.Timestamp
data_list = [[random.randint(10,100),random.randint(10,50)] for i in range(len(DataRanges))] # 产生整数型随机数    
df = pd.DataFrame(data_list,index=DataRanges,columns=['销售额','费用'])

# 添加干扰信息(含空值、缺失日期)
df.loc[[DataRanges[5],DataRanges[10]]] = np.nan         # 将第5、10行数据赋于空值
df.drop([DataRanges[3],DataRanges[7]],inplace=True)    # 删去两个日期的数据

python pandas 计算环比、同比 pct_change -- 自定义函数_第1张图片

自定义计算同比、环比函数(目前只支持周期为年、季、月、日 的数据集)

def GetPct(df, columns_list=None, freq=None):
    '''
        功能:计算环比、同比(目前只支持周期为年、季、月、日)
        传入:df           —— 一个DataFrame,index必须是日期,且格式为pd.Timestamp(可参考pd.date_range输出的日期)
              columns_list —— 需要计算的columns列表,默认整个dataframe都计算
              freq         —— 计算周期,默认D(天),可参考:https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html
                                                         或:https://blog.csdn.net/small__roc/article/details/122877197?spm=1001.2014.3001.5502
                                常用:
                                    QS        -- 季度(取第一天)
                                    Q         -- 季度(取最后一天)
                                    SMS       -- 当月第15天(或每月的其他日期)和日历月初
                                    SM        -- 当月第15天(或每月的其他日期)和日历月末
                                    MS        -- 月初
                                    M         -- 月末
                                    W         -- 周/周日(周日为第一天)
                                    B         -- 工作日
                                    D         -- 天
                                    H         -- 时
                                    T or min -- 分
                                    S         -- 秒     
        输出:
              计算结果
    '''
    t_min = df.index.min()
    t_max = df.index.max()
    df_ = pd.DataFrame()
    df_.index = pd.date_range(t_min, t_max, freq=freq)
    result = pd.merge(df_, df, how='left', left_index=True, right_index=True)
    if columns_list == None:
        targets = df.columns.to_list()
    else:
        targets = columns_list
    for tg in targets:
        result['环比_%s' % tg] = result[tg].pct_change(periods=1, fill_method=None)
        result['环比_%s' % tg] = result['环比_%s' % tg].apply(lambda x: str(round(x * 100, 2)) + '%').str.replace('nan%', '')
        if freq in ['Y','y','YS','ys']:
            result['同比_%s' % tg] = result[tg].pct_change(periods=1, fill_method=None)
            result['同比_%s' % tg] = result['同比_%s' % tg].apply(lambda x: str(round(x * 100, 2)) + '%').str.replace('nan%', '')
        if freq in ['Q','q','QS','qs']:
            result['同比_%s' % tg] = result[tg].pct_change(periods=4, fill_method=None)
            result['同比_%s' % tg] = result['同比_%s' % tg].apply(lambda x: str(round(x * 100, 2)) + '%').str.replace('nan%', '')
        if freq in ['M','m','MS']:
            result['同比_%s' % tg] = result[tg].pct_change(periods=12, fill_method=None)
            result['同比_%s' % tg] = result['同比_%s' % tg].apply(lambda x: str(round(x * 100, 2)) + '%').str.replace('nan%', '')

    return result

GetPct(df,freq="MS")  # 运行函数

python pandas 计算环比、同比 pct_change -- 自定义函数_第2张图片

  • 参考:https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html
  • 参考:https://blog.csdn.net/small__roc/article/details/122877197?spm=1001.2014.3001.5502

你可能感兴趣的:(python,数据挖掘,数据分析,pandas)