交易流水指标统计——pandas

这篇具有很好参考价值的文章主要介绍了交易流水指标统计——pandas。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、根据交易流水,计算每个交易交易对象的如下指标,
总收入笔数、总收入月数、最大月收入笔数、最大月收入笔数所在日期(年月日格式)

import pandas as pd
path = r"C:\Users\xxx\Desktop\科技数据.xlsx"
df = pd.read_excel(path)                  #读取excel数据
df['_COL0']= pd.to_datetime(df['_COL0'])  #日期数据格式转换
res = df[df['_COL4 '] == '收入']          #查询收入数据
res.reset_index(inplace=True, drop=True)
res.info() 
res.head() #查看数据
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2134 entries, 0 to 2133
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   id      2134 non-null   object        
 1   _COL0   2134 non-null   datetime64[ns]
 2   x       2134 non-null   object        
 3   _COL4   2134 non-null   object        
 4   _col5   2134 non-null   float64       
 5   交易对方    2133 non-null   object        
dtypes: datetime64[ns](1), float64(1), object(4)
memory usage: 100.2+ KB
id _COL0 x _COL4 _col5 交易对方
0 1000050001202305060010\n153222358 2023-05-06 18:10:45 转账 收入 676.0 三巷7号303
1 1000050001202305060717\n985751052 2023-05-06 18:10:10 转账 收入 1120.0 北围401
2 1000050001202305061319\n409873668 2023-05-06 17:32:31 转账 收入 1100.0 百花洞北围\n501
3 1000050001202305061412\n834865884 2023-05-06 17:31:41 转账 收入 2002.0 一巷5号店\n铺童权枝15\n323538188
4 1000050001202305060217\n908459280 2023-05-06 17:26:32 转账 收入 887.0 一巷5号401\n(交租人)
 # 计算每个交易对象的指标
def max_count_date(x):
    idx = x.groupby(x['_COL0'].dt.month)['_col5'].transform('count').idxmax()
    return  res.iloc[idx,1].strftime('%Y%m%d')

grouped = res.groupby('交易对方')
summary = grouped.agg(总收入笔数=('交易对方', 'count'), 总收入月数=('_COL0',lambda x: x.dt.month.nunique()) )
max_monthly_income = grouped.apply(lambda x: x['_col5'].groupby(x['_COL0'].dt.month).count().max())
summary['最大月收入笔数'] = max_monthly_income.astype('int')
summary['最大月收入笔数所在日期'] = grouped.apply(max_count_date)
summary                  #查看指标结果
总收入笔数 总收入月数 最大月收入笔数 最大月收入笔数所在日期
交易对方
.San 1 1 1 20230126
/ 20 6 5 20230214
166858006\n45 1 1 1 20220619
30号201(\n已搬) 1 1 1 20220802
30号202 3 3 1 20230506
... ... ... ... ...
龙江802烧\n烤 6 5 2 20230119
龙江804(电\n费改1元) 1 1 1 20220702
龙江901业\n主 10 10 1 20230405
ꦿ封訫ꦿ鎖\n愛꧔ꦿএ᭄ 1 1 1 20230412
꧁꫞꯭独一无\n二꫞꧂ 2 2 1 20221103

502 rows × 4 columns


2、将上面计算的指标匹配到原始数据表中,按交易对象(人名)匹配,原始表新增上面几个指标列。

# 将指标匹配到原始数据表中
df = df.merge(summary, on='交易对方', how='left')
df[df.duplicated('交易对方')].sort_values('交易对方') #查看指标是否正确
id _COL0 x _COL4 _col5 交易对方 总收入笔数 总收入月数 最大月收入笔数 最大月收入笔数所在日期
164 1800008005230419011159\n1100710500 2023-04-19 15:55:11 零钱通转出-\n到零钱 其他 6000.0 / 20.0 6.0 5.0 20230214
1806 4200001705202212059573\n010442 2022-12-05 16:34:49 转入零钱通-\n来自零钱 其他 7714.0 / 20.0 6.0 5.0 20230214
1777 4200001709202212080999\n467748 2022-12-08 12:05:07 转入零钱通-\n来自零钱 其他 9806.0 / 20.0 6.0 5.0 20230214
1516 4200001715202301033827\n069012 2023-01-03 22:01:40 转入零钱通-\n来自零钱 其他 193.5 / 20.0 6.0 5.0 20230214
800 4200001788202303023467\n241839 2023-03-02 18:29:55 转入零钱通-\n来自零钱 其他 10321.5 / 20.0 6.0 5.0 20230214
... ... ... ... ... ... ... ... ... ... ...
638 1000050001202303070411\n163291909 2023-03-07 15:31:25 转账 收入 332.0 龙江901业\n主 10.0 10.0 1.0 20230405
2329 1000050001202210051317\n077385423 2022-10-05 17:41:53 转账 收入 591.0 龙江901业\n主 10.0 10.0 1.0 20230405
1752 1000050001202212081215\n944574957 2022-12-08 15:34:45 转账 收入 338.0 龙江901业\n主 10.0 10.0 1.0 20230405
2145 1000050001202211050215\n131777661 2022-11-05 14:03:06 转账 收入 388.0 龙江901业\n主 10.0 10.0 1.0 20230405
2224 1000039901000210306181\n885746052 2022-10-30 15:31:23 微信红包 收入 88.0 ꧁꫞꯭独一无\n二꫞꧂ 2.0 2.0 1.0 20221103

2597 rows × 10 columns


3、将交易月份数大于等于2的交易对象的前两个月定义为1,2,交易月份数小于2的不定义。并匹配到原始表中,即,原始表新增一列,first_twoM。

df['first_twoM'] = np.nan
def get_first_two_m(x):
    months = x.dt.month.drop_duplicates()
    if len(months) >=2:
        first_t = months[0:2].values
        arr1 = x.dt.month.values == first_t[0]
        idx1 = np.where(arr1 == True)
        arr2 = x.dt.month.values == first_t[1]
        arr2 = np.where(arr2, 2, np.nan)
        arr2[idx1]  = 1
        return arr2
    
df.sort_values(['交易对方', '_COL0'], inplace=True)
df['first_twoM'] = df.groupby('交易对方')['_COL0'].transform(get_first_two_m)
df        
id _COL0 x _COL4 _col5 交易对方 总收入笔数 总收入月数 最大月收入笔数 最大月收入笔数所在日期 first_twoM 交易月份是否连续
1293 1000039801000301266118\n805364803 2023-01-26 19:03:36 微信红包 收入 30.0 .San 1.0 1.0 1.0 20230126 NaN NaN
2584 1000039801202209056110\n700265037 2022-09-06 14:35:30 微信红包-退\n款 收入 1.0 / 20.0 6.0 5.0 20230214 1.0 0.0
2154 1000050001202211040915\n379319646 2022-11-04 21:08:44 转账-退款 收入 2250.0 / 20.0 6.0 5.0 20230214 2.0 1.0
2036 4200001605202211089277\n950418 2022-11-08 00:48:37 转入零钱通-\n来自零钱 其他 1.0 / 20.0 6.0 5.0 20230214 2.0 1.0
2034 4200001627202211082029\n141916 2022-11-08 00:50:31 转入零钱通-\n来自零钱 其他 12500.0 / 20.0 6.0 5.0 20230214 2.0 1.0
... ... ... ... ... ... ... ... ... ... ... ... ...
199 1000039801000304126238\n646974024 2023-04-12 22:45:58 微信红包 收入 100.0 ꦿ封訫ꦿ鎖\n愛꧔ꦿএ᭄ 1.0 1.0 1.0 20230412 NaN NaN
2224 1000039901000210306181\n885746052 2022-10-30 15:31:23 微信红包 收入 88.0 ꧁꫞꯭独一无\n二꫞꧂ 2.0 2.0 1.0 20221103 1.0 1.0
2196 1000039801000211036179\n418892051 2022-11-03 13:01:38 微信红包 收入 2.0 ꧁꫞꯭独一无\n二꫞꧂ 2.0 2.0 1.0 20221103 2.0 1.0
2045 1000050001221107000531\n19264996526500 2022-11-07 16:57:13 转账 支出 220.0 (违约退租\n)30号302 NaN NaN NaN NaN NaN NaN
1674 1000107101202212160157\n5756505506 2022-12-16 19:11:46 二维码收款 收入 254.0 NaN NaN NaN NaN NaN NaN NaN

3283 rows × 12 columns


4、根据交易日期,将连续的月份定义为1,不连续定义为0。例如一个人交易月份
202201、202202、202205、202206 、202208、202210、202211、202302

def transaction_date(x):
    x.sort_values(inplace=True)
    month = x.dt.month.drop_duplicates()
    if len(month) <=1 :
        return           #0 只有一个月份数的可以在这里设置返回零
    dif1 = abs(month.diff(periods=-1))
    dif1 = dict(zip(month.values,dif1.values))
    dif2 = abs(month.diff(periods=1))
    dif2 =dict(zip(month.values,dif2.values))
    transaction_month = set([i for i,j in dif2.items() if j in [1,11]] + [i for i,j in dif1.items() if j in [1,11]])
    return x.dt.month.isin(transaction_month).astype('int')

df['交易月份是否连续'] = df.groupby('交易对方')['_COL0'].transform(transaction_date)
df
id _COL0 x _COL4 _col5 交易对方 总收入笔数 总收入月数 最大月收入笔数 最大月收入笔数所在日期 first_twoM 交易月份是否连续
1293 1000039801000301266118\n805364803 2023-01-26 19:03:36 微信红包 收入 30.0 .San 1.0 1.0 1.0 20230126 NaN NaN
2584 1000039801202209056110\n700265037 2022-09-06 14:35:30 微信红包-退\n款 收入 1.0 / 20.0 6.0 5.0 20230214 1.0 0.0
2154 1000050001202211040915\n379319646 2022-11-04 21:08:44 转账-退款 收入 2250.0 / 20.0 6.0 5.0 20230214 2.0 1.0
2036 4200001605202211089277\n950418 2022-11-08 00:48:37 转入零钱通-\n来自零钱 其他 1.0 / 20.0 6.0 5.0 20230214 2.0 1.0
2034 4200001627202211082029\n141916 2022-11-08 00:50:31 转入零钱通-\n来自零钱 其他 12500.0 / 20.0 6.0 5.0 20230214 2.0 1.0
... ... ... ... ... ... ... ... ... ... ... ... ...
199 1000039801000304126238\n646974024 2023-04-12 22:45:58 微信红包 收入 100.0 ꦿ封訫ꦿ鎖\n愛꧔ꦿএ᭄ 1.0 1.0 1.0 20230412 NaN NaN
2224 1000039901000210306181\n885746052 2022-10-30 15:31:23 微信红包 收入 88.0 ꧁꫞꯭独一无\n二꫞꧂ 2.0 2.0 1.0 20221103 1.0 1.0
2196 1000039801000211036179\n418892051 2022-11-03 13:01:38 微信红包 收入 2.0 ꧁꫞꯭独一无\n二꫞꧂ 2.0 2.0 1.0 20221103 2.0 1.0
2045 1000050001221107000531\n19264996526500 2022-11-07 16:57:13 转账 支出 220.0 (违约退租\n)30号302 NaN NaN NaN NaN NaN NaN
1674 1000107101202212160157\n5756505506 2022-12-16 19:11:46 二维码收款 收入 254.0 NaN NaN NaN NaN NaN NaN NaN

3283 rows × 12 columns文章来源地址https://www.toymoban.com/news/detail-610286.html


  • 自定义excel表格式导出
class writer():
    def __init__(self, df: list, sheet_name: list, key: list, path: str):
        self.df = df                 #dataframe数据
        self.sheet_name = sheet_name #sheet名称
        self.key = key               #需要上色字段
        self.path = path             #excel保存地址
    def save(self):
        path = "C:/Users/15028/Desktop/{}{}(导出时间{}).xlsx".format(pd.Timestamp.now().strftime("%y%m%d"),self.path,pd.Timestamp.now().strftime("%H时%M分%S秒"))
        writer = pd.ExcelWriter(path,engine='xlsxwriter') #创建pandas.ExcelWriter实例,赋值给writer
        for j in range(len(self.sheet_name)):            #遍历sheet名称列表
            #创建sheet表并写入dataframe数据
            self.df[j].to_excel(writer, sheet_name=self.sheet_name[j], index=False #不写入索引index=False
                                ,freeze_panes=(1,2))      #设置固定1、2列(固定列无法左右移动)
            workbook = writer.book                        #工作蒲格式方法
            worksheet = writer.sheets[self.sheet_name[j]] #读取sheet表
            #  计算每列的合适字符宽度,放到元组中
            widths = (self.df[j].astype(str).applymap(lambda x: 40 if len(x)>61 else len(x)+9 if len(x)<9 else len(x)).agg(max).values)
            #设置每列宽度大小
            [worksheet.set_column(i, i, width) for i, width in enumerate(widths)]  #计算的宽度,设置列宽
            color = ['#03A89E','#00C78C','#FFFFCD','#FFC0CB','#808A87','#FFE384','#ED9121','#40E0D0','#FFFFCD']*5 #颜色列表
            (worksheet.set_column(i,i,widths[i],workbook.add_format({'fg_color': color[i-11],
                                                        'valign': 'vcenter',# 垂直对齐方式
                                                        'font_size': 10,    #字体大小
                                                        'border': 4,        #单元格边框宽度
                                                        'align': 'left'    # 水平对齐方式
                                                                    })) for 
            i,x in enumerate(self.df[j].columns) if self.df[j].columns[i] in self.key[0])
            #设置首行宽度 
            worksheet.set_row(0,20,workbook.add_format({'fg_color':'#40E0D0'#背景颜色
                                                        ,'bold': True,#字体加粗
                                                        'valign': 'vcenter',# 垂直对齐方式
                                                        'font_size': 16, #字体大小
                                                        'border': 10, #单元格边框宽度
                                                        'align': 'left' # 水平对齐方式
                                                       }))
#         worksheet.set_column("A:B",None,None,{'hidden':1})  #A至B列,隐藏
        writer.close()
writer1 = writer(df=[df],path='交易数据',key=[df.columns[-6:]],sheet_name=['交易表'])
writer1.save()

到了这里,关于交易流水指标统计——pandas的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C51单片机开发心形灯流水灯(C语言)

    利用Keil uVision4编程程序,在Proteus 8 Professional中创建仿真电路 仿真电路 16进制样式花型 延迟函数 循环调用函数 led1() 是指操作P0端口, 以此类推,led4() 是调用四个输出端口,循环闪烁 C语言代码 仿真电路和代码 链接:https://pan.baidu.com/s/1vx33QiXO0uhXMq1ItUebNQ 提取码:5151

    2024年02月07日
    浏览(41)
  • 【100天精通Python】Day57:Python 数据分析_Pandas数据描述性统计,分组聚合,数据透视表和相关性分析

    目录 1 描述性统计(Descriptive Statistics) 2 数据分组和聚合 3 数据透视表 4 相关性分析

    2024年02月07日
    浏览(57)
  • 37 | Kafka & ZMQ:自动化交易流水线

    在进行这节的学习前,我们先来回顾一下,前面三节,我们学了些什么。 第 34 讲,我们介绍了如何通过 RESTful API 在交易所下单;第 35 讲,我们讲解了如何通过 Websocket ,来获取交易所的 orderbook 数据;第 36 讲,我们介绍了如何实现一个策略,以及如何对策略进行历史回测。

    2024年01月16日
    浏览(52)
  • chatgpt赋能python:Python语言中的Pandas库介绍

    Python语言是一种十分流行的编程语言,以其易读易写等特点而受到工程师和数据科学家的青睐。在Python语言中,有一款非常流行的数据处理和分析库,也就是Pandas库。Pandas库在数据处理和分析方面有着出色的表现,其提供了许多方便的数据处理功能,可以帮助用户快速地处理

    2024年02月08日
    浏览(44)
  • 数据挖掘:汽车车交易价格预测(测评指标;EDA)

    目录 一、前期工作 1.赛题介绍  赛题分析: 分类和回归问题的评价指标有如下一些形式: (下文2.1和2.2会用到) 2.数据简介 3.探索性分析-EDA介绍 二、实战演练 2.1分类指标评价计算示例  2.2回归指标评价计算示例 2.3数据探索性分析(EDA) 2.3.1 导入函数工具箱 2.3.2 数据信息

    2024年02月04日
    浏览(37)
  • ATR指标在外汇交易中的另类运用方法

    当涉及到外汇交易时,有许多不同的指标可以使用。然而,ATR指标可能是一个被低估的工具,可以帮助您发现有利可图的交易机会。本文将介绍ATR指标是什么,如何使用它来识别价格波动和制定交易策略,以及如何在外汇市场中另辟蹊径地使用ATR指标。 什么是ATR指标? ATR指

    2024年02月17日
    浏览(38)
  • 利用Prometheus做指标统计

    背景:目前公司需要统计一些数据, 而这些数据有些量非常大(千万量级的数据)。 如果在mysql中做统计, 可能会引发慢查询或者造成mysql集群负载过高的问题。 目前业务没有将这些数据同步到ES等数据库, 如果为了统计而调整业务, 这个改造成本比较高。 目前这些指标,

    2024年02月12日
    浏览(39)
  • 【pandas基础】--数据统计

    在进行统计分析时, pandas 提供了多种工具来帮助我们理解数据。 pandas 提供了多个聚合函数,其中包括均值、标准差、最大值、最小值等等。 此外, pandas 还可以进行基于列的统计分析,例如通过 groupby() 函数对数据进行聚合,并计算每组的统计分析结果。 除了基本的统计分

    2024年02月08日
    浏览(43)
  • 以实战学习pandas使用方式:统计考生成绩统计及分布

    老顾日常工作,是用不到 python 的,所以,老顾的 python 学习进度推进的非常缓慢,至今没用上 pandas 和 numpy,即便参加了新星计划艾派森的学习小组,也没什么动力去看这方面的内容。 结果,昨天在群里,有个小伙伴问老顾能不能帮忙做个数据统计。由于老顾最近准备开营做

    2024年02月03日
    浏览(50)
  • Pandas怎样实现groupby分组统计

    一、如何实现分组统计 导入数据 二、分组使用聚合函数做数据统计 1、单个列groupby,查询所有数据列的统计 我们看到: 2、多个列groupby,查询所有数据列的统计 我们看到:(‘A’,‘B’)成对变成了二级索引 3、同时查看多种数据统计 4、查看单列的结果数据统计 5、不同列使

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包