1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
| print("=== 银行流水智能分类系统 ===")
银行流水 = pd.DataFrame({ '交易日期': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05', '2024-01-06', '2024-01-07', '2024-01-08'], '摘要': ['工资收入-张三', '支付宝转账-花呗还款', '微信支付-超市购物', '跨行转账-客户A货款', 'ATM取款', '信用卡还款', '微信红包-新年红包', '对公转账-供应商B货款'], '金额': [15000.00, -2500.00, -156.50, 35000.00, -3000.00, -5800.00, 88.88, -45000.00], '对方账户': ['工资专户', '支付宝(中国)网络技术有限公司', '财付通支付科技有限公司', '张三', 'ATM机', '中国工商银行信用卡中心', '微信红包', 'ABC有限公司'], '交易类型': ['转入', '转出', '转出', '转入', '转出', '转出', '转入', '转出'] })
def 智能流水分类(流水df): """智能银行流水分类""" print("🤖 开始智能流水分类...") df = 流水df.copy() 分类规则 = { '工资收入': { '关键词': ['工资', '薪资', '奖金', '津贴'], '金额特征': '>0', '优先级': 1 }, '投资理财': { '关键词': ['理财', '基金', '股票', '证券', '投资'], '金额特征': '任意', '优先级': 2 }, '生活消费': { '关键词': ['支付宝', '微信', '购物', '餐饮', '超市'], '金额特征': '<0', '优先级': 3 }, '信用卡还款': { '关键词': ['信用卡', '还款', 'creditcard'], '金额特征': '<0', '优先级': 1 }, '转账汇款': { '关键词': ['转账', '汇款', '跨行'], '金额特征': '任意', '优先级': 4 }, '现金业务': { '关键词': ['ATM', '取款', '存款', '现金'], '金额特征': '任意', '优先级': 5 }, '其他收入': { '关键词': ['红包', '退款', '返利'], '金额特征': '>0', '优先级': 6 }, '其他支出': { '关键词': [], '金额特征': '<0', '优先级': 7 } } df['分类结果'] = '未分类' df['分类置信度'] = 0.0 df['分类依据'] = '' def 计算置信度(关键词匹配数, 总关键词数, 金额匹配, 规则优先级): """计算分类置信度""" 关键词置信度 = 关键词匹配数 / max(总关键词数, 1) 金额置信度 = 1.0 if 金额匹配 else 0.5 优先级权重 = 1.0 / 规则优先级 return (关键词置信度 * 0.6 + 金额置信度 * 0.3 + 优先级权重 * 0.1) for 索引, 行 in df.iterrows(): 摘要 = str(行['摘要']).lower() 对方账户 = str(行['对方账户']).lower() 金额 = 行['金额'] 交易类型 = 行['交易类型'] 最佳分类 = None 最高置信度 = 0 for 分类名, 规则 in 分类规则.items(): 关键词 = 规则['关键词'] 金额特征 = 规则['金额特征'] 优先级 = 规则['优先级'] 关键词匹配数 = 0 匹配关键词 = [] for 关键词项 in 关键词: if 关键词项 in 摘要 or 关键词项 in 对方账户: 关键词匹配数 += 1 匹配关键词.append(关键词项) 金额匹配 = False if 金额特征 == '任意': 金额匹配 = True elif 金额特征 == '>0' and 金额 > 0: 金额匹配 = True elif 金额特征 == '<0' and 金额 < 0: 金额匹配 = True 置信度 = 计算置信度(关键词匹配数, len(关键词), 金额匹配, 优先级) if 置信度 > 最高置信度: 最高置信度 = 置信度 最佳分类 = 分类名 分类依据 = f"关键词:{匹配关键词},金额:{金额},优先级:{优先级}" if 最佳分类 and 最高置信度 > 0.3: df.loc[索引, '分类结果'] = 最佳分类 df.loc[索引, '分类置信度'] = 最高置信度 df.loc[索引, '分类依据'] = 分类依据 else: if 金额 > 0: df.loc[索引, '分类结果'] = '其他收入' df.loc[索引, '分类置信度'] = 0.3 else: df.loc[索引, '分类结果'] = '其他支出' df.loc[索引, '分类置信度'] = 0.3 print("📊 执行高级分析...") 分类统计 = df.groupby('分类结果').agg({ '金额': ['count', 'sum', 'mean'], '分类置信度': 'mean' }).round(2) 分类统计.columns = ['笔数', '总金额', '平均金额', '平均置信度'] 分类统计 = 分类统计.sort_values('总金额', ascending=False) print("\n分类统计结果:") print(分类统计) print("\n🔍 异常检测:") 大额阈值 = df['金额'].abs().quantile(0.95) 大额交易 = df[df['金额'].abs() > 大额阈值] if len(大额交易) > 0: print(f"发现{len(大额交易)}笔大额交易(>{大额阈值:.2f}元):") for _, 交易 in 大额交易.iterrows(): print(f" {交易['交易日期']}:{交易['分类结果']} - {交易['金额']:,.2f}元") 低置信度阈值 = 0.5 低置信度交易 = df[df['分类置信度'] < 低置信度阈值] if len(低置信度交易) > 0: print(f"\n发现{len(低置信度交易)}笔低置信度分类:") for _, 交易 in 低置信度交易.iterrows(): print(f" {交易['交易日期']}:{交易['分类结果']}(置信度:{交易['分类置信度']:.2f})") print("✅ 智能分类完成!") return df
流水_分类结果 = 智能流水分类(银行流水)
print(f"\n📈 分类结果摘要:") 分类汇总 = 流水_分类结果['分类结果'].value_counts() for 分类, 数量 in 分类汇总.items(): 平均置信度 = 流水_分类结果[流水_分类结果['分类结果'] == 分类]['分类置信度'].mean() print(f" {分类}:{数量}笔(平均置信度:{平均置信度:.2f})")
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 8))
plt.subplot(2, 2, 1) 分类统计 = 流水_分类结果['分类结果'].value_counts() plt.pie(分类统计.values, labels=分类统计.index, autopct='%1.1f%%', startangle=90) plt.title('交易分类分布')
plt.subplot(2, 2, 2) 收支对比 = 流水_分类结果.groupby(['分类结果', 流水_分类结果['金额'] > 0])['金额'].sum().unstack(fill_value=0) 收支对比.plot(kind='bar', stacked=True) plt.title('各类别收入vs支出') plt.xlabel('分类') plt.ylabel('金额') plt.xticks(rotation=45)
plt.subplot(2, 2, 3) 日分类金额 = 流水_分类结果.groupby(['交易日期', '分类结果'])['金额'].sum().unstack(fill_value=0) 日分类金额.plot(kind='line', marker='o') plt.title('各类别金额时间序列') plt.xlabel('日期') plt.ylabel('金额') plt.xticks(rotation=45)
plt.subplot(2, 2, 4) plt.hist(流水_分类结果['分类置信度'], bins=10, edgecolor='black') plt.title('分类置信度分布') plt.xlabel('置信度') plt.ylabel('频数')
plt.tight_layout() plt.savefig('银行流水智能分类分析.png', dpi=300, bbox_inches='tight') plt.close()
print("✅ 可视化分析图表已生成!")
|