交易流水指标统计——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_COL0x_COL4_col5交易对方
01000050001202305060010\n1532223582023-05-06 18:10:45转账收入676.0三巷7号303
11000050001202305060717\n9857510522023-05-06 18:10:10转账收入1120.0北围401
21000050001202305061319\n4098736682023-05-06 17:32:31转账收入1100.0百花洞北围\n501
31000050001202305061412\n8348658842023-05-06 17:31:41转账收入2002.0一巷5号店\n铺童权枝15\n323538188
41000050001202305060217\n9084592802023-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                  #查看指标结果
总收入笔数总收入月数最大月收入笔数最大月收入笔数所在日期
交易对方
.San11120230126
/206520230214
166858006\n4511120220619
30号201(\n已搬)11120220802
30号20233120230506
...............
龙江802烧\n烤65220230119
龙江804(电\n费改1元)11120220702
龙江901业\n主1010120230405
ꦿ封訫ꦿ鎖\n愛꧔ꦿএ᭄11120230412
꧁꫞꯭独一无\n二꫞꧂22120221103

502 rows × 4 columns


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

# 将指标匹配到原始数据表中
df = df.merge(summary, on='交易对方', how='left')
df[df.duplicated('交易对方')].sort_values('交易对方') #查看指标是否正确
id_COL0x_COL4_col5交易对方总收入笔数总收入月数最大月收入笔数最大月收入笔数所在日期
1641800008005230419011159\n11007105002023-04-19 15:55:11零钱通转出-\n到零钱其他6000.0/20.06.05.020230214
18064200001705202212059573\n0104422022-12-05 16:34:49转入零钱通-\n来自零钱其他7714.0/20.06.05.020230214
17774200001709202212080999\n4677482022-12-08 12:05:07转入零钱通-\n来自零钱其他9806.0/20.06.05.020230214
15164200001715202301033827\n0690122023-01-03 22:01:40转入零钱通-\n来自零钱其他193.5/20.06.05.020230214
8004200001788202303023467\n2418392023-03-02 18:29:55转入零钱通-\n来自零钱其他10321.5/20.06.05.020230214
.................................
6381000050001202303070411\n1632919092023-03-07 15:31:25转账收入332.0龙江901业\n主10.010.01.020230405
23291000050001202210051317\n0773854232022-10-05 17:41:53转账收入591.0龙江901业\n主10.010.01.020230405
17521000050001202212081215\n9445749572022-12-08 15:34:45转账收入338.0龙江901业\n主10.010.01.020230405
21451000050001202211050215\n1317776612022-11-05 14:03:06转账收入388.0龙江901业\n主10.010.01.020230405
22241000039901000210306181\n8857460522022-10-30 15:31:23微信红包收入88.0꧁꫞꯭独一无\n二꫞꧂2.02.01.020221103

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].valuesarr1 = 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]  = 1return arr2df.sort_values(['交易对方', '_COL0'], inplace=True)
df['first_twoM'] = df.groupby('交易对方')['_COL0'].transform(get_first_two_m)
df        
id_COL0x_COL4_col5交易对方总收入笔数总收入月数最大月收入笔数最大月收入笔数所在日期first_twoM交易月份是否连续
12931000039801000301266118\n8053648032023-01-26 19:03:36微信红包收入30.0.San1.01.01.020230126NaNNaN
25841000039801202209056110\n7002650372022-09-06 14:35:30微信红包-退\n款收入1.0/20.06.05.0202302141.00.0
21541000050001202211040915\n3793196462022-11-04 21:08:44转账-退款收入2250.0/20.06.05.0202302142.01.0
20364200001605202211089277\n9504182022-11-08 00:48:37转入零钱通-\n来自零钱其他1.0/20.06.05.0202302142.01.0
20344200001627202211082029\n1419162022-11-08 00:50:31转入零钱通-\n来自零钱其他12500.0/20.06.05.0202302142.01.0
.......................................
1991000039801000304126238\n6469740242023-04-12 22:45:58微信红包收入100.0ꦿ封訫ꦿ鎖\n愛꧔ꦿএ᭄1.01.01.020230412NaNNaN
22241000039901000210306181\n8857460522022-10-30 15:31:23微信红包收入88.0꧁꫞꯭独一无\n二꫞꧂2.02.01.0202211031.01.0
21961000039801000211036179\n4188920512022-11-03 13:01:38微信红包收入2.0꧁꫞꯭独一无\n二꫞꧂2.02.01.0202211032.01.0
20451000050001221107000531\n192649965265002022-11-07 16:57:13转账支出220.0(违约退租\n)30号302NaNNaNNaNNaNNaNNaN
16741000107101202212160157\n57565055062022-12-16 19:11:46二维码收款收入254.0NaNNaNNaNNaNNaNNaNNaN

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_COL0x_COL4_col5交易对方总收入笔数总收入月数最大月收入笔数最大月收入笔数所在日期first_twoM交易月份是否连续
12931000039801000301266118\n8053648032023-01-26 19:03:36微信红包收入30.0.San1.01.01.020230126NaNNaN
25841000039801202209056110\n7002650372022-09-06 14:35:30微信红包-退\n款收入1.0/20.06.05.0202302141.00.0
21541000050001202211040915\n3793196462022-11-04 21:08:44转账-退款收入2250.0/20.06.05.0202302142.01.0
20364200001605202211089277\n9504182022-11-08 00:48:37转入零钱通-\n来自零钱其他1.0/20.06.05.0202302142.01.0
20344200001627202211082029\n1419162022-11-08 00:50:31转入零钱通-\n来自零钱其他12500.0/20.06.05.0202302142.01.0
.......................................
1991000039801000304126238\n6469740242023-04-12 22:45:58微信红包收入100.0ꦿ封訫ꦿ鎖\n愛꧔ꦿএ᭄1.01.01.020230412NaNNaN
22241000039901000210306181\n8857460522022-10-30 15:31:23微信红包收入88.0꧁꫞꯭独一无\n二꫞꧂2.02.01.0202211031.01.0
21961000039801000211036179\n4188920512022-11-03 13:01:38微信红包收入2.0꧁꫞꯭独一无\n二꫞꧂2.02.01.0202211032.01.0
20451000050001221107000531\n192649965265002022-11-07 16:57:13转账支出220.0(违约退租\n)30号302NaNNaNNaNNaNNaNNaN
16741000107101202212160157\n57565055062022-12-16 19:11:46二维码收款收入254.0NaNNaNNaNNaNNaNNaNNaN

3283 rows × 12 columns


  • 自定义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实例,赋值给writerfor 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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5G的发展过程

目录 1.什么是5G 2.5G与4G的区别 3.5G的应用领域 4.5G给人类带来的福利 5.5G未来的发展趋势 1.什么是5G 5G技术是第五代移动通信技术&#xff0c;它是对之前的2G、3G和4G技术的升级和革新。5G技术具有更高的数据传输速度、更低的延迟和更大的网络容量&#xff0c;为人们提供…

Java-API简析_java.net.InetSocketAddress类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131870760 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

GAMES104复习总结,课堂提炼(一)

主要是给自己看的&#xff0c;Games104课程很全面&#xff0c;王希老师学识广播&#xff0c;课程组也很认真努力。但是在文字版里面有大量的示例&#xff0c;比如可能会为了引入话题讲个故事等等。。。对于上课来说引人入胜&#xff0c;对于要找工作的我来说&#xff0c;每次看…

办公软件ppt的制作

毕业找工作太难了&#xff0c;赶紧多学点什么东西吧&#xff0c;今天开始办公软件ppt的制作学习。 本文以WPS作为默认办公软件&#xff0c;问为什么不是PowerPoint&#xff0c;问就是没钱买不起&#xff0c;绝对不是不会破解的原因。 一.认识软件 在快捷工具栏中顾名思义就是一…

微服务基础理论

微服务简介 微服务Microservices之父&#xff0c;马丁.福勒&#xff0c;对微服务大概的概述如下&#xff1a; 就目前而言&#xff0c;对于微服务业界并没有一个统一的、标准的定义&#xff08;While there is no precise definition of this architectural style ) 。但通在其…

Express 框架的基本操作

目录 1、应用生成器 2、基本路由 2.1、在跟路由下配置 GET请求&#xff0c;返回对应相应内容。 2.2、在跟路由下配置 POST请求&#xff0c;返回对应相应内容。 2.3、在跟路由下配置 PUT请求&#xff0c;返回对应相应内容。 2.4、在根路由下配置DELETE请求&#xff0c;返回对…

音视频开发-ffmpeg介绍-系列一

目录 一.简介 FFmpeg框架的基本组成包含: 二. FFmpeg框架梳理音视频的流程​编辑 基本概念&#xff1a; 三.ffmpeg、ffplay、ffprobe区别 4.1 ffmpeg是用于转码的应用程序 4.2 fffplay是用于播放的应用程序 4.3 ffprobe是用于查看文件格式的应用程序 4.4 ffmpeg是用于转…

华为鲲鹏920 aarch64 版本 Ambari HDP 下载地址

声明&#xff1a;为有效缓解各位同行兄弟们的痛&#xff0c;特推出此文 本文能够适配兼容 华为鲲鹏920 aarch64 版本&#xff0c;仅限 CentOS7、openEuler20.03-LTS 操作系统 以下是详细下载地址 1、CentOS7 aarch64版本 CentOS7 aarch64 https://mirrors.huaweicloud.com/…

Langchain 的 Conversation summary memory

Langchain 的 Conversation summary memory 现在让我们看一下使用稍微复杂的内存类型 - ConversationSummaryMemory 。这种类型的记忆会随着时间的推移创建对话的摘要。这对于随着时间的推移压缩对话中的信息非常有用。对话摘要内存对发生的对话进行总结&#xff0c;并将当前摘…

91、RabbitMQ事务消息

RabbitMQ事务消息 通过对信道的设置实现 channel.txSelect(); 通知服务器开启事务模式;服务端会返回Tx.Select-ok channel.basicPublish; 发送消息&#xff0c;可以是多条&#xff0c;可以是消费消息提交ack channel.txCommit() 提交事务 channel.txRollback() 回滚事务 …

《零基础入门学习Python》第054讲:论一只爬虫的自我修养2:实战

0. 请写下这一节课你学习到的内容&#xff1a;格式不限&#xff0c;回忆并复述是加强记忆的好方式&#xff01; 今天我们决定在实战中来进行学习&#xff0c;会举两个例子&#xff0c;第一个例子是我们会下载一只猫&#xff0c;第二个例子是我们用Python来模拟浏览器通过在线的…

MySQL8.0索引新特性

文章目录 1 支持降序索引2 隐藏索引 1 支持降序索引 举例&#xff1a;分别在MySQL 5.7版本和MySQL 8.0版本中创建数据表ts1&#xff0c;结果如下&#xff1a; CREATE TABLE ts1(a int,b int,index idx_a_b(a,b desc) );在MySQL 5.7版本中查看数据表ts1的结构&#xff0c;从结…

83、讲下Zookeeper watch机制

讲下Zookeeper watch机制 客户端&#xff0c;可以通过在znode上设置watch&#xff0c;实现实时监听znode的变化。 Watch事件是一个一次性的触发器&#xff0c;当被设置了Watch的数据发生了改变的时候&#xff0c;则服务器将这个改变发送给设置了Watch的客户端 父节点的创建&…

45:ECMAScript 6 简介

ECMAScript 6 简介 [ECMAScript 和 JavaScript 的关系](https://es6.ruanyifeng.com/#docs/intro#ECMAScript 和 JavaScript 的关系)[ES6 与 ECMAScript 2015 的关系](https://es6.ruanyifeng.com/#docs/intro#ES6 与 ECMAScript 2015 的关系)语法提案的批准流程[ECMAScript 的…

选择前端框架重要依据是什么?

状态更改检测&#xff0c;也就是检测应用程序对状态值的改变&#xff0c;这样才会相应地更新 UI。 &#xff08;#MVC模式中模型Model的改变会更新View界面UI&#xff0c;这点类似后端的ORM&#xff0c;对象状态更改通过ORM框架自动变更相应数据表值&#xff09; 变更检测是前…

IntelliJ IDEA2023中利用maven-archetype-quickstart模板创建项目无src文件夹及maven插件下载过慢问题的解决

目录 介绍问题之解决问题2的解决问题1的解决 介绍 昨天下载并安装了IntelliJ IDEA 2023的最新版&#xff08;以下简称为IDEA 2023&#xff09;&#xff0c;学习利用该IDE编写Java项目及将其与maven结合构建项目。我所安装的maven是去年暑假安装的&#xff0c;版本为Apache Mav…

linux系统如何使用GPT工具进行分区

GPT&#xff08;GUID Partition Table&#xff09;是一种用于硬盘分区的新分区表格式&#xff0c;它具有比旧的MBR&#xff08;Master Boot Record&#xff09;分区表更高的灵活性和可靠性。在Linux系统中&#xff0c;我们可以使用GPT工具进行分区操作&#xff0c;本文将对如何…

linux常用命令—— less、more、head、cat

文章目录 1、less&#xff1a;向前或向后查看文件内容&#xff08;推荐使用&#xff09;1.1、less 基本用法1.2、快捷键操作1.3、查找文件中的关键字使用说明 1.4、linux中 less和more 的区别 2、more&#xff1a; 分页显示文件内容3、head&#xff1a;查看文件开头的内容4、ca…

认识主被动无人机遥感数据、预处理无人机遥感数据、定量估算农林植被关键性状、期刊论文插图精细制作与Appdesigner应用开发

目录 第一章、认识主被动无人机遥感数据 第二章、预处理无人机遥感数据 第三章、定量估算农林植被关键性状 第四章、期刊论文插图精细制作与Appdesigner应用开发 更多推荐 遥感技术作为一种空间大数据手段&#xff0c;能够从多时、多维、多地等角度&#xff0c;获取大量的…

[SQL挖掘机] - 删除数据库

介绍: 使用 SQL 中的 drop database命令。它会删除指定的数据库及其所有相关的表、视图、索引等对象。 使用命令: 下面是 drop database命令的基本语法&#xff1a; drop database database_name;其中&#xff0c;database_name是要删除的数据库的名称。 请注意&#xff0…