专栏首页源懒由码pandas系列 - (二)关于两期时点数据的比较

pandas系列 - (二)关于两期时点数据的比较

统计数据来说,有时点数据和时期数据。通常情况下,会进行两期数据的比较,现整理一个两期数据比较的场景应用。主要流程分为:

1、数据读取

2、数据预处理

3、数据分类汇总

4、两期数据比较

5、数据输出到EXCEL

主程序如下:

df = get_src_data(r'../data/learn_pandas/20200930 zongheqixian/')
# 预处理数据
df = pre_handle_data(df)
df = hz_data(df)
# 进行数据比较
df = compare_data(df,'20200930','20200831')
df.sort_values(by=['产品品种','机构名称', '数据表名称','列指标名称','行指标名称'],inplace=True)

name = r'data/output/20200930 数据审核.xlsx'
with pd.ExcelWriter(name) as writer:
    df.to_excel(writer,'仅合计项',index=False,freeze_panes=(1,6))   # freeze_panes可以EXCEL设置冻结位置
    writer.save()

1、源数据读取,出入文件夹作为参数,合并所有源数据到一起。使用pd.concat进行数据合并。

# 获取数据源
def get_src_data(folder_name):
    file_list = os.listdir(folder_name)
    ldf = [] # 先放入list,最后一起concat比较高效率
    if len(file_list) > 0 :
        # 遍历文件夹下所有文件
        for i in range(len(file_list)):
            # 如果是excel择用这个,如果是csv择用另一个
            ldf.append(pd.read_excel(folder_name + str(file_list[i]),dtype=object))
        return pd.concat(ldf,ignore_index=True)
    else:
        return None

2、进行数据预处理,如单位转换,不需要的数据剔除。

# 数据预处理,指标归并、数据删除
def pre_handle_data(df):
    # 预处理数据
    return df

3、由于当前处理的数据是单机构的数据,想进行汇总查看整体数据情况。使用pivot_table进行汇总,接着使用reset_index转化为明细项进行合并到源数据中。

def hz_data(df):
    # 分产品、全部汇总
    hz_list = []
    table =  pd.pivot_table(df,values=['数据值'],index=['数据日期','产品品种','数据表名称', '行指标名称', '列指标名称'],aggfunc=np.sum,fill_value = 0)
    table.reset_index(inplace=True)
    table['机构名称'] = '# 合计 ' + table['产品品种']
    hz_list.append(table)
    table =  pd.pivot_table(df,values=['数据值'],index=['数据日期','数据表名称', '行指标名称', '列指标名称'],aggfunc=np.sum,fill_value = 0)
    table.reset_index(inplace=True)
    table['机构名称'] = '# 合计 '
    table['产品品种'] = '# 合计 '
    hz_list.append(table)
    hz_list.append(df)
    return pd.concat(hz_list,ignore_index=True)

4、进行两期数据比较,将数据拆分成两个时点,并使用pd.merge拼接到一起。

# 数据比较
def compare_data(df,cur_date,pre_date):
    # 进行拼接
    cur = df[df['数据日期'] == cur_date].copy()
    pre = df[df['数据日期'] == pre_date].copy()
    pre.drop(columns=['数据日期','数据ID','指标ID','行序号','列序号', '数据表序号', '数据位数','数据批次'],inplace=True)
    cur.drop(columns=['数据ID','指标ID','行序号','列序号', '数据表序号', '数据位数','数据批次'],inplace=True)
    # on为合并依赖字段
    df = pd.merge(cur,pre,how='outer',on=[ '行指标编码', '行指标名称', '列指标编码', '列指标名称', '数据表名称', '数据管理机构', '产品品种',
           '机构名称', '社会信用代码','机构产品标识'],suffixes=['_当期','_上期'])
    # 列位置调整
    df = df[order]
    # 修改一个列名
    df.rename(columns={'数据值_当期':'当期值(亿元/只)','数据值_上期':'上期值(亿元/只)'},inplace = True)
    # 删除无用列名
    df.drop(columns=['社会信用代码','行指标编码', '列指标编码','机构产品标识'],inplace=True)

    # 补充数据日期,注意这里要先补充缺失字段,否则进行批量计算的时候,会跳过空值,因此要先fillna(0)
    df['数据日期'] = cur_date
    df.fillna(0,inplace=True)
    df['变动值'] = df['当期值(亿元/只)'] - df['上期值(亿元/只)']
    dfsel = ~(df['上期值(亿元/只)'] == 0)
    df.loc[dfsel,'变幅(%)'] = df.loc[dfsel,'变动值'] / df.loc[dfsel,'上期值(亿元/只)']
    # 增加比例判断
    df.loc[(abs(df['变幅(%)'])>0.3) & (abs(df['变幅(%)'])<1),'备注'] = "变幅大于30%"
    df.loc[(abs(df['变幅(%)'])>=1) & (abs(df['变幅(%)'])<100),'备注'] = "变幅大于100%"
    df.loc[(abs(df['变幅(%)'])>=100),'备注'] = "变幅大于100倍"
    df.loc[df['上期值(亿元/只)'].isnull(),'备注'] = '本期新增'
    df.loc[df['当期值(亿元/只)'].isnull(),'备注'] = '上期有,本期无'
    df[df == 0] = np.nan
    return df

5、最后输出,见主程序。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于pandas.eval使用的一些问题。

    https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.eval...

    forxtz
  • pandas系列 - (一)明细数据汇总简单场景应用

    官方文档:https://pandas.pydata.org/pandas-docs/stable/user_guide/index.html

    forxtz
  • python selenium 关于将网页打包为静态网页(mhtml)下载。

    需求:单纯的将page.source写入文件的方式,会导致一些图片无法显示,对于google浏览器,直接将页面打包下载成一个mhtml格式的文件,则可以进行离线...

    forxtz
  • 50道练习实践学习Pandas!

    原文地址:https://www.kesci.com/home/project/5ddc974ef41512002cec1dca

    Datawhale
  • Python-科学计算-pandas-07-Df多条件筛选

    系统:Windows 7 语言版本:Anaconda3-4.3.0.1-Windows-x86_64 编辑器:pycharm-community-2016.3....

    zishendianxia
  • 快乐学习Pandas入门篇:Pandas基础

    寄语:本文对Pandas基础内容进行了梳理,从文件读取与写入、Series及DataFrame基本数据结构、常用基本函数及排序四个模块快速入门。同时,文末给出了...

    Datawhale
  • Pandas数据分析小技巧系列 第四集

    与时间相关,自然第一感觉便是转化为datetime格式,这里需要注意:需要首先将两列转化为 str 类型。

    double
  • Python中字段抽取、字段拆分、记录抽取

    1、字段抽取 字段抽取是根据已知列数据的开始和结束位置,抽取出新的列 字段截取函数:slice(start,stop) 注意:和数据结构的访问方式一样,开始位置...

    Erin
  • 使用Pandas读取复杂Excel表单

    传统企业里,Excel仍然是数据存储,报表生成和数据分析的主力军,随着数据体量的增长,和数据分析、挖掘,BI更进一步需要,如何快速地使用Pandas来ETL E...

    Lenis
  • 如何将数据处理速度提升1000+倍

    利用Python进行数据处理时经常使用的是pandas和numpy,这两个工具的功能都很强大,尤其是pandas,更是Python中数据处理方面最强大的工具之一...

    气象学家

扫码关注云+社区

领取腾讯云代金券