【大数据】个人财务健康状况分析系统 计算机毕业设计项目 Hadoop+Spark环境配置 数据科学与大数据技术 附源码+文档+讲解

55 阅读9分钟

一、个人简介

💖💖作者:计算机编程果茶熊 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 计算机毕业设计选题 💕💕文末获取源码联系计算机编程果茶熊

二、系统介绍

大数据框架:Hadoop+Spark(Hive需要定制修改) 开发语言:Java+Python(两个版本都支持) 数据库:MySQL 后端框架:SpringBoot(Spring+SpringMVC+Mybatis)+Django(两个版本都支持) 前端:Vue+Echarts+HTML+CSS+JavaScript+jQuery

基于大数据的个人财务健康状况分析系统是一个集成数据采集、存储、分析与可视化于一体的综合性财务管理平台。该系统运用Hadoop分布式存储架构和Spark大数据计算引擎,结合Django后端框架与Vue前端技术栈,为用户提供全方位的财务健康评估服务。系统通过HDFS分布式文件系统存储海量财务数据,利用Spark SQL进行高效的数据查询与分析,结合Pandas和NumPy进行深度数据挖掘。平台核心功能涵盖用户个人财务档案管理、收支结构与消费行为深度分析、储蓄投资习惯评估、债务水平与信用风险监控,以及财务稳定性压力测试等模块。通过ElementUI组件库构建友好的用户交互界面,运用Echarts图表库实现多维度数据可视化展示,帮助用户直观了解自身财务状况。系统采用MySQL数据库确保数据的一致性与安全性,为个人财务决策提供科学的数据支撑和专业的分析建议。

三、视频解说

个人财务健康状况分析系统

四、部分功能展示

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

五、部分代码展示


from pyspark.sql import SparkSession
from pyspark.sql.functions import col, sum, avg, count, when, desc, asc, month, year, datediff, max, min
from pyspark.sql.types import StructType, StructField, StringType, FloatType, DateType, IntegerType
import pandas as pd
import numpy as np
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json
from datetime import datetime, timedelta
from decimal import Decimal
import mysql.connector

spark = SparkSession.builder.appName("PersonalFinanceAnalysis").config("spark.sql.adaptive.enabled", "true").config("spark.sql.adaptive.coalescePartitions.enabled", "true").getOrCreate()

@csrf_exempt
def analyze_income_expense_structure(request):
    user_id = request.POST.get('user_id')
    analysis_period = request.POST.get('period', '12')
    transaction_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/finance_db").option("dbtable", "transactions").option("user", "root").option("password", "password").load()
    user_transactions = transaction_df.filter(col("user_id") == user_id).filter(col("transaction_date") >= (datetime.now() - timedelta(days=int(analysis_period)*30)).strftime('%Y-%m-%d'))
    income_data = user_transactions.filter(col("transaction_type") == "income").groupBy("category").agg(sum("amount").alias("total_income"), count("*").alias("transaction_count"), avg("amount").alias("avg_amount"))
    expense_data = user_transactions.filter(col("transaction_type") == "expense").groupBy("category").agg(sum("amount").alias("total_expense"), count("*").alias("transaction_count"), avg("amount").alias("avg_amount"))
    monthly_trend = user_transactions.groupBy(year("transaction_date").alias("year"), month("transaction_date").alias("month"), "transaction_type").agg(sum("amount").alias("monthly_total"))
    total_income = user_transactions.filter(col("transaction_type") == "income").agg(sum("amount").alias("total")).collect()[0]["total"] or 0
    total_expense = user_transactions.filter(col("transaction_type") == "expense").agg(sum("amount").alias("total")).collect()[0]["total"] or 0
    savings_rate = (total_income - total_expense) / total_income * 100 if total_income > 0 else 0
    expense_categories = expense_data.orderBy(desc("total_expense")).collect()
    income_stability = user_transactions.filter(col("transaction_type") == "income").groupBy(month("transaction_date")).agg(sum("amount").alias("monthly_income")).agg(avg("monthly_income").alias("avg_monthly"), (max("monthly_income") - min("monthly_income")).alias("income_variance")).collect()[0]
    category_analysis = []
    for category in expense_categories[:10]:
        category_transactions = user_transactions.filter(col("category") == category["category"]).filter(col("transaction_type") == "expense")
        category_trend = category_transactions.groupBy(month("transaction_date")).agg(sum("amount").alias("monthly_spend")).orderBy("month").collect()
        trend_data = [row["monthly_spend"] for row in category_trend]
        if len(trend_data) >= 2:
            trend_slope = np.polyfit(range(len(trend_data)), trend_data, 1)[0]
        else:
            trend_slope = 0
        category_analysis.append({"category": category["category"], "total_amount": float(category["total_expense"]), "percentage": float(category["total_expense"]) / total_expense * 100, "trend_slope": float(trend_slope), "transaction_frequency": category["transaction_count"]})
    consumption_pattern = user_transactions.filter(col("transaction_type") == "expense").groupBy("merchant_name").agg(sum("amount").alias("merchant_total"), count("*").alias("visit_frequency")).orderBy(desc("merchant_total")).limit(20).collect()
    financial_health_score = min(100, max(0, (savings_rate * 0.4 + (100 - (total_expense / total_income * 100)) * 0.3 + min(100, income_stability["avg_monthly"] / 1000) * 0.3)))
    return JsonResponse({"status": "success", "data": {"income_structure": [row.asDict() for row in income_data.collect()], "expense_structure": category_analysis, "monthly_trend": [row.asDict() for row in monthly_trend.collect()], "savings_rate": round(savings_rate, 2), "financial_health_score": round(financial_health_score, 2), "consumption_patterns": [{"merchant": row["merchant_name"], "total_spent": float(row["merchant_total"]), "visit_count": row["visit_frequency"]} for row in consumption_pattern], "period_summary": {"total_income": float(total_income), "total_expense": float(total_expense), "net_savings": float(total_income - total_expense), "income_stability": float(income_stability["income_variance"])}}})

@csrf_exempt
def evaluate_debt_credit_risk(request):
    user_id = request.POST.get('user_id')
    evaluation_months = int(request.POST.get('months', '6'))
    debt_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/finance_db").option("dbtable", "user_debts").option("user", "root").option("password", "password").load()
    credit_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/finance_db").option("dbtable", "credit_records").option("user", "root").option("password", "password").load()
    income_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/finance_db").option("dbtable", "transactions").option("user", "root").option("password", "password").load()
    user_debts = debt_df.filter(col("user_id") == user_id).filter(col("status") == "active")
    user_income = income_df.filter(col("user_id") == user_id).filter(col("transaction_type") == "income").filter(col("transaction_date") >= (datetime.now() - timedelta(days=evaluation_months*30)).strftime('%Y-%m-%d'))
    monthly_income = user_income.groupBy(month("transaction_date")).agg(sum("amount").alias("monthly_income")).agg(avg("monthly_income").alias("avg_monthly_income")).collect()[0]["avg_monthly_income"] or 0
    total_debt_amount = user_debts.agg(sum("remaining_balance").alias("total_debt")).collect()[0]["total_debt"] or 0
    monthly_debt_payment = user_debts.agg(sum("monthly_payment").alias("total_payment")).collect()[0]["total_payment"] or 0
    debt_to_income_ratio = (monthly_debt_payment / monthly_income * 100) if monthly_income > 0 else 0
    debt_types_analysis = user_debts.groupBy("debt_type").agg(sum("remaining_balance").alias("type_total"), avg("interest_rate").alias("avg_interest"), count("*").alias("debt_count")).collect()
    credit_history = credit_df.filter(col("user_id") == user_id).filter(col("record_date") >= (datetime.now() - timedelta(days=365)).strftime('%Y-%m-%d')).orderBy(desc("record_date"))
    payment_history = credit_history.groupBy("payment_status").count().collect()
    on_time_payments = sum([row["count"] for row in payment_history if row["payment_status"] == "on_time"])
    total_payments = sum([row["count"] for row in payment_history])
    payment_reliability_score = (on_time_payments / total_payments * 100) if total_payments > 0 else 0
    credit_utilization = credit_df.filter(col("user_id") == user_id).filter(col("account_type") == "credit_card").agg(sum("current_balance").alias("used_credit"), sum("credit_limit").alias("total_limit")).collect()[0]
    utilization_rate = (credit_utilization["used_credit"] / credit_utilization["total_limit"] * 100) if credit_utilization["total_limit"] and credit_utilization["total_limit"] > 0 else 0
    debt_aging_analysis = user_debts.withColumn("debt_age_months", datediff(col("current_date"), col("origination_date")) / 30).groupBy("debt_type").agg(avg("debt_age_months").alias("avg_age"), sum(when(col("debt_age_months") > 24, col("remaining_balance")).otherwise(0)).alias("long_term_debt")).collect()
    risk_factors = []
    if debt_to_income_ratio > 40:
        risk_factors.append({"factor": "高债务收入比", "severity": "high", "impact": debt_to_income_ratio})
    if utilization_rate > 80:
        risk_factors.append({"factor": "信用卡高使用率", "severity": "medium", "impact": utilization_rate})
    if payment_reliability_score < 90:
        risk_factors.append({"factor": "还款记录不佳", "severity": "high", "impact": 100 - payment_reliability_score})
    overall_risk_score = max(0, min(100, 100 - (debt_to_income_ratio * 0.4 + (100 - payment_reliability_score) * 0.3 + utilization_rate * 0.2 + (total_debt_amount / (monthly_income * 12) * 100) * 0.1)))
    repayment_capacity = monthly_income - monthly_debt_payment
    debt_consolidation_benefit = sum([debt["remaining_balance"] * (debt["interest_rate"] - 8) / 100 / 12 for debt in [row.asDict() for row in user_debts.collect()]])
    return JsonResponse({"status": "success", "data": {"debt_summary": {"total_debt": float(total_debt_amount), "monthly_payment": float(monthly_debt_payment), "debt_to_income_ratio": round(debt_to_income_ratio, 2), "debt_types": [{"type": row["debt_type"], "total_amount": float(row["type_total"]), "average_interest": float(row["avg_interest"]), "count": row["debt_count"]} for row in debt_types_analysis]}, "credit_analysis": {"payment_reliability_score": round(payment_reliability_score, 2), "credit_utilization_rate": round(utilization_rate, 2), "total_credit_limit": float(credit_utilization["total_limit"]) if credit_utilization["total_limit"] else 0, "used_credit": float(credit_utilization["used_credit"]) if credit_utilization["used_credit"] else 0}, "risk_assessment": {"overall_risk_score": round(overall_risk_score, 2), "risk_level": "低风险" if overall_risk_score > 70 else "中等风险" if overall_risk_score > 40 else "高风险", "risk_factors": risk_factors, "repayment_capacity": float(repayment_capacity)}, "recommendations": {"debt_consolidation_savings": float(debt_consolidation_benefit), "suggested_payment_increase": max(0, monthly_debt_payment * 0.1), "priority_debts": [row.asDict() for row in user_debts.orderBy(desc("interest_rate")).limit(3).collect()]}}})

@csrf_exempt
def assess_financial_stability_stress(request):
    user_id = request.POST.get('user_id')
    stress_scenarios = json.loads(request.POST.get('scenarios', '["income_loss_25", "income_loss_50", "emergency_expense_5k", "emergency_expense_10k"]'))
    financial_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/finance_db").option("dbtable", "transactions").option("user", "root").option("password", "password").load()
    assets_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/finance_db").option("dbtable", "user_assets").option("user", "root").option("password", "password").load()
    debt_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/finance_db").option("dbtable", "user_debts").option("user", "root").option("password", "password").load()
    recent_transactions = financial_df.filter(col("user_id") == user_id).filter(col("transaction_date") >= (datetime.now() - timedelta(days=180)).strftime('%Y-%m-%d'))
    monthly_income = recent_transactions.filter(col("transaction_type") == "income").groupBy(month("transaction_date")).agg(sum("amount").alias("monthly_income")).agg(avg("monthly_income").alias("avg_income")).collect()[0]["avg_income"] or 0
    monthly_expenses = recent_transactions.filter(col("transaction_type") == "expense").groupBy(month("transaction_date")).agg(sum("amount").alias("monthly_expense")).agg(avg("monthly_expense").alias("avg_expense")).collect()[0]["avg_expense"] or 0
    essential_expenses = recent_transactions.filter(col("transaction_type") == "expense").filter(col("category").isin(["房租", "水电费", "食物", "交通", "保险", "债务还款"])).groupBy(month("transaction_date")).agg(sum("amount").alias("essential_monthly")).agg(avg("essential_monthly").alias("avg_essential")).collect()[0]["avg_essential"] or 0
    user_assets = assets_df.filter(col("user_id") == user_id)
    liquid_assets = user_assets.filter(col("asset_type").isin(["储蓄账户", "活期存款", "货币基金"])).agg(sum("current_value").alias("total_liquid")).collect()[0]["total_liquid"] or 0
    total_assets = user_assets.agg(sum("current_value").alias("total_assets")).collect()[0]["total_assets"] or 0
    emergency_fund_months = (liquid_assets / essential_expenses) if essential_expenses > 0 else 0
    monthly_debt_payment = debt_df.filter(col("user_id") == user_id).filter(col("status") == "active").agg(sum("monthly_payment").alias("total_payment")).collect()[0]["total_payment"] or 0
    fixed_obligations = essential_expenses + monthly_debt_payment
    financial_flexibility = (monthly_income - fixed_obligations) / monthly_income * 100 if monthly_income > 0 else 0
    stress_test_results = []
    for scenario in stress_scenarios:
        if scenario == "income_loss_25":
            adjusted_income = monthly_income * 0.75
            survival_months = liquid_assets / (fixed_obligations - (monthly_income - adjusted_income)) if (fixed_obligations - (monthly_income - adjusted_income)) > 0 else float('inf')
            impact_score = max(0, 100 - survival_months * 10)
        elif scenario == "income_loss_50":
            adjusted_income = monthly_income * 0.5
            survival_months = liquid_assets / (fixed_obligations - (monthly_income - adjusted_income)) if (fixed_obligations - (monthly_income - adjusted_income)) > 0 else float('inf')
            impact_score = max(0, 100 - survival_months * 5)
        elif scenario == "emergency_expense_5k":
            remaining_liquid = liquid_assets - 5000
            months_covered = remaining_liquid / essential_expenses if essential_expenses > 0 and remaining_liquid > 0 else 0
            impact_score = max(0, 100 - months_covered * 15)
        elif scenario == "emergency_expense_10k":
            remaining_liquid = liquid_assets - 10000
            months_covered = remaining_liquid / essential_expenses if essential_expenses > 0 and remaining_liquid > 0 else 0
            impact_score = max(0, 100 - months_covered * 10)
        else:
            survival_months = 0
            impact_score = 50
        stress_test_results.append({"scenario": scenario, "survival_months": round(survival_months, 1) if 'survival_months' in locals() else 0, "impact_score": round(impact_score, 2), "severity": "低风险" if impact_score < 30 else "中等风险" if impact_score < 60 else "高风险"})
    income_volatility = recent_transactions.filter(col("transaction_type") == "income").groupBy(month("transaction_date")).agg(sum("amount").alias("monthly_income")).agg((max("monthly_income") - min("monthly_income")) / avg("monthly_income") * 100).collect()[0][0] or 0
    expense_predictability = recent_transactions.filter(col("transaction_type") == "expense").groupBy(month("transaction_date")).agg(sum("amount").alias("monthly_expense")).agg(1 - ((max("monthly_expense") - min("monthly_expense")) / avg("monthly_expense"))).collect()[0][0] or 0
    stability_indicators = {"emergency_fund_adequacy": round(emergency_fund_months, 1), "income_stability": round(100 - income_volatility, 2), "expense_predictability": round(expense_predictability * 100, 2), "debt_burden": round(monthly_debt_payment / monthly_income * 100, 2) if monthly_income > 0 else 0, "liquidity_ratio": round(liquid_assets / total_assets * 100, 2) if total_assets > 0 else 0}
    overall_stability_score = (stability_indicators["emergency_fund_adequacy"] * 10 + stability_indicators["income_stability"] * 0.3 + stability_indicators["expense_predictability"] * 0.2 + max(0, 100 - stability_indicators["debt_burden"]) * 0.3 + stability_indicators["liquidity_ratio"] * 0.2)
    improvement_recommendations = []
    if emergency_fund_months < 3:
        improvement_recommendations.append({"priority": "高", "action": "建立应急资金", "target": f"增加{round((3 * essential_expenses) - liquid_assets, 0)}元应急储备"})
    if financial_flexibility < 20:
        improvement_recommendations.append({"priority": "中", "action": "优化支出结构", "target": "减少非必要支出,提高财务灵活性"})
    if income_volatility > 30:
        improvement_recommendations.append({"priority": "中", "action": "稳定收入来源", "target": "寻找更稳定的收入渠道"})
    return JsonResponse({"status": "success", "data": {"stability_overview": {"overall_score": round(min(100, max(0, overall_stability_score)), 2), "financial_flexibility": round(financial_flexibility, 2), "emergency_preparedness": round(emergency_fund_months, 1), "monthly_surplus": float(monthly_income - monthly_expenses)}, "stress_test_results": stress_test_results, "stability_indicators": stability_indicators, "risk_mitigation": {"current_buffers": {"liquid_assets": float(liquid_assets), "monthly_surplus": float(monthly_income - monthly_expenses), "asset_diversification": len([row.asDict() for row in user_assets.collect()])}, "improvement_plan": improvement_recommendations}, "scenario_planning": {"best_case": {"description": "收入增长10%", "projected_stability": round(overall_stability_score * 1.1, 2)}, "worst_case": {"description": "收入下降30%", "projected_stability": round(overall_stability_score * 0.7, 2)}}}})


六、部分文档展示

在这里插入图片描述

七、END

💕💕文末获取源码联系计算机编程果茶熊