【大数据基础】基于信用卡逾期数据的Spark数据处理与分析

news2024/12/24 20:30:48

https://dblab.xmu.edu.cn/blog/2707/

实验过程

数据预处理

本次实验数据集来自和鲸社区的信用卡评分模型构建数据,以数据集cs-training.csv为分析主体,其中共有15万条记录,11列属性。
每个数据包含以下字段:
字段名称 字段含义 例子
(1)SeriousDlqin2yrs 是否逾期 0,1
(2)RevolvingUtilizationOfUnsecuredLines 信用卡和个人信贷额度的总余额 0.766126609
(3)Age 年龄 45,20,30
(4)NumberOfTime30-59DaysPastDueNotWorse 借款人逾期30-59天的次数 0,2,3
(5)DebtRatio 负债比率 0.802982129
(6)MonthlyIncome 月收入 9120,3000
(7)NumberOfOpenCreditLinesAndLoans 未偿还贷款数量 ,0,4,13
(8)NumberOfTimes90DaysLate 借款人逾期90天以上的次数 0,1,3
(9)NumberRealEstateLoansOrLines 房地产贷款的数量 3,6
(10)NumberOfTime60-89DaysPastDueNotWorse 借款人逾期60-89天的次数 0,3
(11)NumberOfDependents 家庭中的家属人数 0,1,3
在这里插入图片描述

本次实验采用pandas库对数据进行预处理。在实验中,不对信用卡和个人信贷额度的总余额、负债比率、未偿还贷款数量、逾期90天以上的次数这4个属性进行处理分析。
具体处理步骤如下:
(1)读取数据
(2)查看数据是否具有重复值,去除重复值
(3)查看各字段缺失率,缺失值以均值填充
(4)选取要研究的属性,删除不研究的属性
(5)保存文件到本地
使用代码文件data_preprocessing.py对数据预处理,运行data_preprocessing.py文件的步骤如下:

import pandas as pd
 
# 读取数据
df = pd.read_csv("~/Desktop/cs-training.csv")
 
# 去除重复值
df.duplicated()
df.drop_duplicates()
 
# 查看各字段缺失率
df.info()
# 缺失值按均值填充
for col in list(df.columns[df.isnull().sum() > 0]):
    mean_val = df[col].mean()
    df[col].fillna(mean_val, inplace=True)
 
# 删除不分析的列
columns = ["RevolvingUtilizationOfUnsecuredLines","DebtRatio","NumberOfOpenCreditLinesAndLoans","NumberOfTimes90DaysLate"]
df.drop(columns,axis=1,inplace=True)
 
# 保存到本地
df.to_csv("~/OverDue/data.csv")

在这里插入图片描述

将文件上传至HDFS文件系统

# 启动Hadoop
cd /usr/local/hadoop
./sbin/start-dfs.sh
# 在HDFS文件系统中创建/OverDue目录
./bin/hdfs dfs -mkdir /data
# 上传文件到HDFS文件系统中
./bin/hdfs dfs -put ~/OverDue/data.csv /OverDue/data.csv

在这里插入图片描述

使用Spark对数据处理分析

我们将采用Python编程语言和Spark大数据框架对数据集“data.csv”进行处理分析,具体步骤如下:
(1)读取HDFS文件系统中的数据文件,生成DataFrame
(2)修改列名
(3)本次信用卡逾期的总体统计
(4)年龄与本次信用卡逾期的结合统计
(5)两次逾期记录与本次信用卡逾期的结合统计
(6)房产抵押数量与本次信用卡逾期的结合统计
(7)家属人数与本次信用卡逾期的结合统计
(8)月收入与本次信用卡逾期的结合统计
(9)将统计数据返回给数据可视化文件data_web.py

./bin/hdfs dfs -put ~/OverDue/data1.csv /user/hadoop

代码文件data_analysis.py的内容如下:

from pyspark.sql import SparkSession
from pyspark import SparkContext,SparkConf
from pyspark.sql import Row
from pyspark.sql.types import *
from pyspark.sql import functions
 
def analyse(filename):
    # 读取数据
    spark = SparkSession.builder.config(conf = SparkConf()).getOrCreate()
    df = spark.read.format("csv").option("header","true").load(filename)
 
    # 修改列名
    df = df.withColumnRenamed('SeriousDlqin2yrs','y')
    df = df.withColumnRenamed('NumberOfTime30-59DaysPastDueNotWorse','30-59days')
    df = df.withColumnRenamed('NumberOfTime60-89DaysPastDueNotWorse','60-89days')
    df = df.withColumnRenamed('NumberRealEstateLoansOrLines','RealEstateLoans')
    df = df.withColumnRenamed('NumberOfDependents','families')
 
    # 返回data_web.py的数据列表
    all_list = []
    # 本次信用卡逾期分析
    # 共有逾期10026人,139974没有逾期,总人数150000
    total_y = []
    for i in range(2):
        total_y.append(df.filter(df['y'] == i).count())
    all_list.append(total_y)
 
    # 年龄分析
    df_age = df.select(df['age'],df['y'])
    agenum = []
    bin = [0,30,45,60,75,100]
    # 统计各个年龄段的人口
    for i in range(5):
        agenum.append(df_age.filter(df['age'].between(bin[i],bin[i+1])).count())
    all_list.append(agenum)
    # 统计各个年龄段逾期与不逾期的数量
    age_y = []
    for i in range(5):
        y0 = df_age.filter(df['age'].between(bin[i],bin[i+1])).\
            filter(df['y']=='0').count()
        y1 = df_age.filter(df['age'].between(bin[i],bin[i+1])).\
            filter(df['y']=='1').count()
        age_y.append([y0,y1])
    all_list.append(age_y)
 
    # 有逾期记录的人的本次信用卡逾期数量
    df_pastDue = df.select(df['30-59days'],df['60-89days'],df['y'])
    # 30-59有23982人,4985逾期,18997不逾期
    numofpastdue = []
    numofpastdue.append(df_pastDue.filter(df_pastDue['30-59days'] > 0).count())
    y_numofpast1 = []
    for i in range(2):
        x = df_pastDue.filter(df_pastDue['30-59days'] > 0).\
            filter(df_pastDue['y'] == i).count()
        y_numofpast1.append(x)
    # 60-89有7604人,2770逾期,4834不逾期
    numofpastdue.append(df_pastDue.filter(df_pastDue['60-89days'] > 0).count())
    y_numofpast2 = []
    for i in range(2):
        x = df_pastDue.filter(df_pastDue['60-89days'] > 0).\
            filter(df_pastDue['y'] == i).count()
        y_numofpast2.append(x)
    # 两个记录都有的人有4393人,逾期1907,不逾期2486
    numofpastdue.append(df_pastDue.filter(df_pastDue['30-59days'] > 0).
                        filter(df_pastDue['60-89days'] > 0).count())
    y_numofpast3 = []
    for i in range(2):
        x = df_pastDue.filter(df_pastDue['30-59days'] > 0).\
            filter(df_pastDue['60-89days'] > 0).filter(df_pastDue['y'] == i).count()
        y_numofpast3.append(x)
    all_list.append(numofpastdue)
    all_list.append(y_numofpast1)
    all_list.append(y_numofpast2)
    all_list.append(y_numofpast3)
 
    # 房产抵押数量分析
    df_Loans = df.select(df['RealEstateLoans'],df['y'])
    # 有无抵押房产人数情况
    numofrealandnoreal = []
    numofrealandnoreal.append(df_Loans.filter(df_Loans['RealEstateLoans']==0).count())
    numofrealandnoreal.append(df_Loans.filter(df_Loans['RealEstateLoans']>0).count())
    all_list.append(numofrealandnoreal)
    ## 房产无抵押共有56188人,逾期4672人,没逾期51516人
    norealnum = []
    for i in range(2):
        x = df_Loans.filter(df_Loans['RealEstateLoans']==0).\
            filter(df_Loans['y'] == i).count()
        norealnum.append(x)
    all_list.append(norealnum)
    # 房产抵押共有93812人,逾期5354人,不逾期88458人
    realnum = []
    for i in range(2):
        x = df_Loans.filter(df_Loans['RealEstateLoans']>0).\
            filter(df_Loans['y'] == i).count()
        realnum.append(x)
    all_list.append(realnum)
 
    # 家属人数分析
    df_families = df.select(df['families'],df['y'])
    # 有无家属人数统计
    nofamiliesAndfamilies = []
    nofamiliesAndfamilies.append(df_families.filter(df_families['families']>0).count())
    nofamiliesAndfamilies.append(df_families.filter(df_families['families']==0).count())
    all_list.append(nofamiliesAndfamilies)
    # 有家属59174人,逾期4752人,没逾期54422人
    y_families = []
    y_families.append(df_families.filter(df_families['families']>0).
                      filter(df_families['y']==0).count())
    y_families.append(df_families.filter(df_families['families']>0).
                      filter(df_families['y']==1).count())
    all_list.append(y_families)
    # 没家属90826人,逾期5274人,没逾期85552人
    y_nofamilies = []
    y_nofamilies.append(df_families.filter(df_families['families']==0).
                        filter(df_families['y']==0).count())
    y_nofamilies.append(df_families.filter(df_families['families']==0).
                        filter(df_families['y']==1).count())
    all_list.append(y_nofamilies)
 
    # 月收入分析
    df_income = df.select(df['MonthlyIncome'],df['y'])
    # 获取平均值,其中先返回Row对象,再获取其中均值
    mean_income = df_income.agg(functions.avg(df_income['MonthlyIncome'])).head()[0]
    # 收入分布,105854人没超过均值6670,44146人超过均值6670
    numofMeanincome = []
    numofMeanincome.append(df_income.filter(df['MonthlyIncome'] < mean_income).count())
    numofMeanincome.append(df_income.filter(df['MonthlyIncome'] > mean_income).count())
    all_list.append(numofMeanincome)
    # 未超过均值的逾期情况分析,97977人没逾期,7877人逾期
    y_NoMeanIncome = []
    y_NoMeanIncome.append(df_income.filter(df['MonthlyIncome'] < mean_income).filter(df['y']==0).count())
    y_NoMeanIncome.append(df_income.filter(df['MonthlyIncome'] < mean_income).filter(df['y']==1).count())
    all_list.append(y_NoMeanIncome)
    # 超过均值的逾期情况分析,41997人没逾期,2149人逾期
    y_MeanIncome = []
    y_MeanIncome.append(df_income.filter(df['MonthlyIncome'] > mean_income).filter(df['y']==0).count())
    y_MeanIncome.append(df_income.filter(df['MonthlyIncome'] > mean_income).filter(df['y']==1).count())
    all_list.append(y_MeanIncome)
 
    # 数据可视化data_web.py
    return all_list

数据可视化

选择使用python第三方库pyecharts作为可视化工具,其中pyecharts版本为1.7.0。采用其中的柱状图和饼图来详细展现分析结果。
代码文件data_web.py的内容如下:

from pyecharts.charts import Bar
from pyecharts.charts import Pie
from pyecharts.charts import Page
from pyecharts import options as opts
import data_analysis
# --------总体逾期人数情况--------------
def draw_total(total_list):
    attr = ["未逾期人数", "逾期人数"]
    pie = (
        Pie()
            .add("总体逾期人数", [list(z) for z in zip(attr,total_list)])
            .set_global_opts(title_opts=opts.TitleOpts(title="总体逾期人数分布"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
            )
    )
    return pie
# --------年龄与逾期人数情况--------------
def draw_age(age_list,y_ageList):
    total_pie = draw_total(all_list[0])
    attr = ["0-30", "30-45", "45-60", "60-75", "75-100"]
    y0_agenum = []
    y1_agenum = []
    for i in range(5):
        y0_agenum.append(y_ageList[i][0])
        y1_agenum.append(y_ageList[i][1])
 
    bar = (
        Bar()
            .add_xaxis(attr)
            .add_yaxis("人数分布", age_list)
            .add_yaxis("未逾期人数分布", y0_agenum)
            .add_yaxis("逾期人数分布", y1_agenum)
            .set_global_opts(title_opts=opts.TitleOpts(title="各年龄段逾期情况"))
    )
    attr = ["未逾期","逾期"]
    pie1 = (
        Pie()
            .add("0-30年龄段", [list(z) for z in zip(attr,y_ageList[0])])
            .set_global_opts(title_opts=opts.TitleOpts(title="0-30年龄段逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
            )
    )
    pie2 = (
        Pie()
            .add("30-45年龄段", [list(z) for z in zip(attr,y_ageList[1])])
            .set_global_opts(title_opts=opts.TitleOpts(title="30-45年龄段逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
            )
    )
    pie3 = (
        Pie()
            .add("45-60年龄段", [list(z) for z in zip(attr,y_ageList[2])])
            .set_global_opts(title_opts=opts.TitleOpts(title="45-60年龄段逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
            )
    )
    pie4 = (
        Pie()
            .add("60-75年龄段", [list(z) for z in zip(attr,y_ageList[3])])
            .set_global_opts(title_opts=opts.TitleOpts(title="60-75年龄段逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    pie5 = (
        Pie()
            .add("75-100年龄段", [list(z) for z in zip(attr,y_ageList[4])])
            .set_global_opts(title_opts=opts.TitleOpts(title="75-100年龄段逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
 
    page = Page()
    page.add(bar)
    page.add(total_pie)
    page.add(pie1)
    page.add(pie2)
    page.add(pie3)
    page.add(pie4)
    page.add(pie5)
    page.render('age_OverDue.html')
 
# --------逾期记录与逾期人数情况--------------
def draw_pastdue(numofpastdue,pastdue1num,pastdue2num,pastdue12num):
    total_pie = draw_total(all_list[0])
    attr = ["有30-59days逾期记录的人数", "有60-89days逾期记录的人数", "有长短期逾期记录的人数"]
    bar = (
        Bar()
            .add_xaxis(attr)
            .add_yaxis("人数", numofpastdue)
            .set_global_opts(title_opts=opts.TitleOpts(title="有逾期记录的人数"))
    )
    attr = ["未逾期","逾期"]
    pie1 = (
        Pie()
            .add("有短期逾期记录的人的逾期情况", [list(z) for z in zip(attr,pastdue1num)])
            .set_global_opts(title_opts=opts.TitleOpts(title="有短期逾期记录的人的逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    pie2 = (
        Pie()
            .add("有长期逾期记录的人的逾期情况", [list(z) for z in zip(attr,pastdue2num)])
            .set_global_opts(title_opts=opts.TitleOpts(title="有长期逾期记录的人的逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    pie3 = (
        Pie()
            .add("长短期逾期记录都有的人的逾期情况", [list(z) for z in zip(attr,pastdue12num)])
            .set_global_opts(title_opts=opts.TitleOpts(title="长短期逾期记录都有的人的逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    page = Page()
    page.add(bar)
    page.add(total_pie)
    page.add(pie1)
    page.add(pie2)
    page.add(pie3)
    page.render('pastDue_OverDue.html')
# --------房产抵押与逾期人数情况--------------
def draw_realestateLoans(numofrealornoreal,y_norealnum,y_realnum):
    total_pie = draw_total(all_list[0])
    attr = ["无房产抵押人数", "有房产抵押人数"]
    bar = (
        Bar()
            .add_xaxis(attr)
            .add_yaxis("人数", numofrealornoreal)
            .set_global_opts(title_opts=opts.TitleOpts(title="房产抵押人数分布"))
    )
    attr = ["未逾期","逾期"]
    pie1 = (
        Pie()
            .add("无房产抵押的人的逾期情况", [list(z) for z in zip(attr,y_norealnum)])
            .set_global_opts(title_opts=opts.TitleOpts(title="无房产抵押的人的逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    pie2 = (
        Pie()
            .add("有房产抵押的人的逾期情况", [list(z) for z in zip(attr,y_realnum)])
            .set_global_opts(title_opts=opts.TitleOpts(title="有房产抵押的人的逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    page = Page()
    page.add(bar)
    page.add(total_pie)
    page.add(pie1)
    page.add(pie2)
    page.render('realestateLoans_OverDue.html')
 
# --------家属人数与逾期人数情况--------------
def draw_families(nofamiliesAndfamilies,y_families,y_nofamilies):
    total_pie = draw_total(all_list[0])
    attr = ["有家属人数", "无家属人数"]
    bar = (
        Bar()
            .add_xaxis(attr)
            .add_yaxis("人数", nofamiliesAndfamilies)
            .set_global_opts(title_opts=opts.TitleOpts(title="有无家属人数分布"))
    )
    attr = ["未逾期","逾期"]
    pie1 = (
        Pie()
            .add("无家属的人的逾期情况", [list(z) for z in zip(attr,y_nofamilies)])
            .set_global_opts(title_opts=opts.TitleOpts(title="无家属的人的逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    pie2 = (
        Pie()
            .add("有家属的人的逾期情况", [list(z) for z in zip(attr,y_families)])
            .set_global_opts(title_opts=opts.TitleOpts(title="有家属的人的逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    page = Page()
    page.add(bar)
    page.add(total_pie)
    page.add(pie1)
    page.add(pie2)
    page.render('families_OverDue.html')
# --------月收入与逾期人数情况--------------
def draw_income(numofMeanincome,y_NoMeanIncome,y_MeanIncome):
    total_pie = draw_total(all_list[0])
    attr = ["未超过均值收入人数", "超过均值收入人数"]
    bar = (
        Bar()
            .add_xaxis(attr)
            .add_yaxis("人数", numofMeanincome)
            .set_global_opts(title_opts=opts.TitleOpts(title="有无超过均值收入人数分布"))
    )
    attr = ["未逾期","逾期"]
    pie1 = (
        Pie()
            .add("未超过均值收入的人的逾期情况", [list(z) for z in zip(attr,y_NoMeanIncome)])
            .set_global_opts(title_opts=opts.TitleOpts(title="未超过均值收入的人的逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    pie2 = (
        Pie()
            .add("超过均值收入的人的逾期情况", [list(z) for z in zip(attr,y_MeanIncome)])
            .set_global_opts(title_opts=opts.TitleOpts(title="超过均值收入的人的逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    page = Page()
    page.add(bar)
    page.add(total_pie)
    page.add(pie1)
    page.add(pie2)
    page.render('meanIncome_OverDue.html')
 
if __name__ == '__main__':
    print("开始总程序")
    Filename = "/OverDue/data.csv"
    all_list = data_analysis.analyse(Filename) 
    # 年龄与是否逾期情况
    draw_age(all_list[1],all_list[2])
    # 有无逾期记录与是否逾期情况
    draw_pastdue(all_list[3],all_list[4],all_list[5],all_list[6])
    # 房产抵押数量与是否逾期情况
    draw_realestateLoans(all_list[7],all_list[8],all_list[9])
    # 家属人数与是否逾期情况
    draw_families(all_list[10],all_list[11],all_list[12])
    # 月收入与是否逾期情况
    draw_income(all_list[13],all_list[14],all_list[15])
    print("结束总程序")

完整代码

from pyspark.sql import SparkSession
from pyspark import SparkContext,SparkConf
from pyspark.sql import Row
from pyspark.sql.types import *
from pyspark.sql import functions
 
def analyse(filename):
    # 读取数据
    spark = SparkSession.builder.config(conf = SparkConf()).getOrCreate()
    df = spark.read.format("csv").option("header","true").load(filename)
 
    # 修改列名
    df = df.withColumnRenamed('SeriousDlqin2yrs','y')
    df = df.withColumnRenamed('NumberOfTime30-59DaysPastDueNotWorse','30-59days')
    df = df.withColumnRenamed('NumberOfTime60-89DaysPastDueNotWorse','60-89days')
    df = df.withColumnRenamed('NumberRealEstateLoansOrLines','RealEstateLoans')
    df = df.withColumnRenamed('NumberOfDependents','families')
 
    # 返回data_web.py的数据列表
    all_list = []
    # 本次信用卡逾期分析
    # 共有逾期10026人,139974没有逾期,总人数150000
    total_y = []
    for i in range(2):
        total_y.append(df.filter(df['y'] == i).count())
    all_list.append(total_y)
 
    # 年龄分析
    df_age = df.select(df['age'],df['y'])
    agenum = []
    bin = [0,30,45,60,75,100]
    # 统计各个年龄段的人口
    for i in range(5):
        agenum.append(df_age.filter(df['age'].between(bin[i],bin[i+1])).count())
    all_list.append(agenum)
    # 统计各个年龄段逾期与不逾期的数量
    age_y = []
    for i in range(5):
        y0 = df_age.filter(df['age'].between(bin[i],bin[i+1])).\
            filter(df['y']=='0').count()
        y1 = df_age.filter(df['age'].between(bin[i],bin[i+1])).\
            filter(df['y']=='1').count()
        age_y.append([y0,y1])
    all_list.append(age_y)
 
    # 有逾期记录的人的本次信用卡逾期数量
    df_pastDue = df.select(df['30-59days'],df['60-89days'],df['y'])
    # 30-59有23982人,4985逾期,18997不逾期
    numofpastdue = []
    numofpastdue.append(df_pastDue.filter(df_pastDue['30-59days'] > 0).count())
    y_numofpast1 = []
    for i in range(2):
        x = df_pastDue.filter(df_pastDue['30-59days'] > 0).\
            filter(df_pastDue['y'] == i).count()
        y_numofpast1.append(x)
    # 60-89有7604人,2770逾期,4834不逾期
    numofpastdue.append(df_pastDue.filter(df_pastDue['60-89days'] > 0).count())
    y_numofpast2 = []
    for i in range(2):
        x = df_pastDue.filter(df_pastDue['60-89days'] > 0).\
            filter(df_pastDue['y'] == i).count()
        y_numofpast2.append(x)
    # 两个记录都有的人有4393人,逾期1907,不逾期2486
    numofpastdue.append(df_pastDue.filter(df_pastDue['30-59days'] > 0).
                        filter(df_pastDue['60-89days'] > 0).count())
    y_numofpast3 = []
    for i in range(2):
        x = df_pastDue.filter(df_pastDue['30-59days'] > 0).\
            filter(df_pastDue['60-89days'] > 0).filter(df_pastDue['y'] == i).count()
        y_numofpast3.append(x)
    all_list.append(numofpastdue)
    all_list.append(y_numofpast1)
    all_list.append(y_numofpast2)
    all_list.append(y_numofpast3)
 
    # 房产抵押数量分析
    df_Loans = df.select(df['RealEstateLoans'],df['y'])
    # 有无抵押房产人数情况
    numofrealandnoreal = []
    numofrealandnoreal.append(df_Loans.filter(df_Loans['RealEstateLoans']==0).count())
    numofrealandnoreal.append(df_Loans.filter(df_Loans['RealEstateLoans']>0).count())
    all_list.append(numofrealandnoreal)
    ## 房产无抵押共有56188人,逾期4672人,没逾期51516人
    norealnum = []
    for i in range(2):
        x = df_Loans.filter(df_Loans['RealEstateLoans']==0).\
            filter(df_Loans['y'] == i).count()
        norealnum.append(x)
    all_list.append(norealnum)
    # 房产抵押共有93812人,逾期5354人,不逾期88458人
    realnum = []
    for i in range(2):
        x = df_Loans.filter(df_Loans['RealEstateLoans']>0).\
            filter(df_Loans['y'] == i).count()
        realnum.append(x)
    all_list.append(realnum)
 
    # 家属人数分析
    df_families = df.select(df['families'],df['y'])
    # 有无家属人数统计
    nofamiliesAndfamilies = []
    nofamiliesAndfamilies.append(df_families.filter(df_families['families']>0).count())
    nofamiliesAndfamilies.append(df_families.filter(df_families['families']==0).count())
    all_list.append(nofamiliesAndfamilies)
    # 有家属59174人,逾期4752人,没逾期54422人
    y_families = []
    y_families.append(df_families.filter(df_families['families']>0).
                      filter(df_families['y']==0).count())
    y_families.append(df_families.filter(df_families['families']>0).
                      filter(df_families['y']==1).count())
    all_list.append(y_families)
    # 没家属90826人,逾期5274人,没逾期85552人
    y_nofamilies = []
    y_nofamilies.append(df_families.filter(df_families['families']==0).
                        filter(df_families['y']==0).count())
    y_nofamilies.append(df_families.filter(df_families['families']==0).
                        filter(df_families['y']==1).count())
    all_list.append(y_nofamilies)
 
    # 月收入分析
    df_income = df.select(df['MonthlyIncome'],df['y'])
    # 获取平均值,其中先返回Row对象,再获取其中均值
    mean_income = df_income.agg(functions.avg(df_income['MonthlyIncome'])).head()[0]
    # 收入分布,105854人没超过均值6670,44146人超过均值6670
    numofMeanincome = []
    numofMeanincome.append(df_income.filter(df['MonthlyIncome'] < mean_income).count())
    numofMeanincome.append(df_income.filter(df['MonthlyIncome'] > mean_income).count())
    all_list.append(numofMeanincome)
    # 未超过均值的逾期情况分析,97977人没逾期,7877人逾期
    y_NoMeanIncome = []
    y_NoMeanIncome.append(df_income.filter(df['MonthlyIncome'] < mean_income).filter(df['y']==0).count())
    y_NoMeanIncome.append(df_income.filter(df['MonthlyIncome'] < mean_income).filter(df['y']==1).count())
    all_list.append(y_NoMeanIncome)
    # 超过均值的逾期情况分析,41997人没逾期,2149人逾期
    y_MeanIncome = []
    y_MeanIncome.append(df_income.filter(df['MonthlyIncome'] > mean_income).filter(df['y']==0).count())
    y_MeanIncome.append(df_income.filter(df['MonthlyIncome'] > mean_income).filter(df['y']==1).count())
    all_list.append(y_MeanIncome)
 
    # 数据可视化data_web.py
    return all_list

from pyecharts.charts import Bar
from pyecharts.charts import Pie
from pyecharts.charts import Page
from pyecharts import options as opts

# --------总体逾期人数情况--------------
def draw_total(total_list):
    attr = ["未逾期人数", "逾期人数"]
    pie = (
        Pie()
            .add("总体逾期人数", [list(z) for z in zip(attr,total_list)])
            .set_global_opts(title_opts=opts.TitleOpts(title="总体逾期人数分布"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
            )
    )
    return pie
# --------年龄与逾期人数情况--------------
def draw_age(age_list,y_ageList):
    total_pie = draw_total(all_list[0])
    attr = ["0-30", "30-45", "45-60", "60-75", "75-100"]
    y0_agenum = []
    y1_agenum = []
    for i in range(5):
        y0_agenum.append(y_ageList[i][0])
        y1_agenum.append(y_ageList[i][1])
 
    bar = (
        Bar()
            .add_xaxis(attr)
            .add_yaxis("人数分布", age_list)
            .add_yaxis("未逾期人数分布", y0_agenum)
            .add_yaxis("逾期人数分布", y1_agenum)
            .set_global_opts(title_opts=opts.TitleOpts(title="各年龄段逾期情况"))
    )
    attr = ["未逾期","逾期"]
    pie1 = (
        Pie()
            .add("0-30年龄段", [list(z) for z in zip(attr,y_ageList[0])])
            .set_global_opts(title_opts=opts.TitleOpts(title="0-30年龄段逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
            )
    )
    pie2 = (
        Pie()
            .add("30-45年龄段", [list(z) for z in zip(attr,y_ageList[1])])
            .set_global_opts(title_opts=opts.TitleOpts(title="30-45年龄段逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
            )
    )
    pie3 = (
        Pie()
            .add("45-60年龄段", [list(z) for z in zip(attr,y_ageList[2])])
            .set_global_opts(title_opts=opts.TitleOpts(title="45-60年龄段逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
            )
    )
    pie4 = (
        Pie()
            .add("60-75年龄段", [list(z) for z in zip(attr,y_ageList[3])])
            .set_global_opts(title_opts=opts.TitleOpts(title="60-75年龄段逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    pie5 = (
        Pie()
            .add("75-100年龄段", [list(z) for z in zip(attr,y_ageList[4])])
            .set_global_opts(title_opts=opts.TitleOpts(title="75-100年龄段逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
 
    page = Page()
    page.add(bar)
    page.add(total_pie)
    page.add(pie1)
    page.add(pie2)
    page.add(pie3)
    page.add(pie4)
    page.add(pie5)
    page.render('age_OverDue.html')
 
# --------逾期记录与逾期人数情况--------------
def draw_pastdue(numofpastdue,pastdue1num,pastdue2num,pastdue12num):
    total_pie = draw_total(all_list[0])
    attr = ["有30-59days逾期记录的人数", "有60-89days逾期记录的人数", "有长短期逾期记录的人数"]
    bar = (
        Bar()
            .add_xaxis(attr)
            .add_yaxis("人数", numofpastdue)
            .set_global_opts(title_opts=opts.TitleOpts(title="有逾期记录的人数"))
    )
    attr = ["未逾期","逾期"]
    pie1 = (
        Pie()
            .add("有短期逾期记录的人的逾期情况", [list(z) for z in zip(attr,pastdue1num)])
            .set_global_opts(title_opts=opts.TitleOpts(title="有短期逾期记录的人的逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    pie2 = (
        Pie()
            .add("有长期逾期记录的人的逾期情况", [list(z) for z in zip(attr,pastdue2num)])
            .set_global_opts(title_opts=opts.TitleOpts(title="有长期逾期记录的人的逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    pie3 = (
        Pie()
            .add("长短期逾期记录都有的人的逾期情况", [list(z) for z in zip(attr,pastdue12num)])
            .set_global_opts(title_opts=opts.TitleOpts(title="长短期逾期记录都有的人的逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    page = Page()
    page.add(bar)
    page.add(total_pie)
    page.add(pie1)
    page.add(pie2)
    page.add(pie3)
    page.render('pastDue_OverDue.html')
# --------房产抵押与逾期人数情况--------------
def draw_realestateLoans(numofrealornoreal,y_norealnum,y_realnum):
    total_pie = draw_total(all_list[0])
    attr = ["无房产抵押人数", "有房产抵押人数"]
    bar = (
        Bar()
            .add_xaxis(attr)
            .add_yaxis("人数", numofrealornoreal)
            .set_global_opts(title_opts=opts.TitleOpts(title="房产抵押人数分布"))
    )
    attr = ["未逾期","逾期"]
    pie1 = (
        Pie()
            .add("无房产抵押的人的逾期情况", [list(z) for z in zip(attr,y_norealnum)])
            .set_global_opts(title_opts=opts.TitleOpts(title="无房产抵押的人的逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    pie2 = (
        Pie()
            .add("有房产抵押的人的逾期情况", [list(z) for z in zip(attr,y_realnum)])
            .set_global_opts(title_opts=opts.TitleOpts(title="有房产抵押的人的逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    page = Page()
    page.add(bar)
    page.add(total_pie)
    page.add(pie1)
    page.add(pie2)
    page.render('realestateLoans_OverDue.html')
 
# --------家属人数与逾期人数情况--------------
def draw_families(nofamiliesAndfamilies,y_families,y_nofamilies):
    total_pie = draw_total(all_list[0])
    attr = ["有家属人数", "无家属人数"]
    bar = (
        Bar()
            .add_xaxis(attr)
            .add_yaxis("人数", nofamiliesAndfamilies)
            .set_global_opts(title_opts=opts.TitleOpts(title="有无家属人数分布"))
    )
    attr = ["未逾期","逾期"]
    pie1 = (
        Pie()
            .add("无家属的人的逾期情况", [list(z) for z in zip(attr,y_nofamilies)])
            .set_global_opts(title_opts=opts.TitleOpts(title="无家属的人的逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    pie2 = (
        Pie()
            .add("有家属的人的逾期情况", [list(z) for z in zip(attr,y_families)])
            .set_global_opts(title_opts=opts.TitleOpts(title="有家属的人的逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    page = Page()
    page.add(bar)
    page.add(total_pie)
    page.add(pie1)
    page.add(pie2)
    page.render('families_OverDue.html')
# --------月收入与逾期人数情况--------------
def draw_income(numofMeanincome,y_NoMeanIncome,y_MeanIncome):
    total_pie = draw_total(all_list[0])
    attr = ["未超过均值收入人数", "超过均值收入人数"]
    bar = (
        Bar()
            .add_xaxis(attr)
            .add_yaxis("人数", numofMeanincome)
            .set_global_opts(title_opts=opts.TitleOpts(title="有无超过均值收入人数分布"))
    )
    attr = ["未逾期","逾期"]
    pie1 = (
        Pie()
            .add("未超过均值收入的人的逾期情况", [list(z) for z in zip(attr,y_NoMeanIncome)])
            .set_global_opts(title_opts=opts.TitleOpts(title="未超过均值收入的人的逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    pie2 = (
        Pie()
            .add("超过均值收入的人的逾期情况", [list(z) for z in zip(attr,y_MeanIncome)])
            .set_global_opts(title_opts=opts.TitleOpts(title="超过均值收入的人的逾期情况"))
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
    )
    page = Page()
    page.add(bar)
    page.add(total_pie)
    page.add(pie1)
    page.add(pie2)
    page.render('meanIncome_OverDue.html')
 
if __name__ == '__main__':
    print("开始总程序")
    Filename = "hdfs://localhost:8020/user/hadoop/data1.csv"
    all_list = analyse(Filename) 
    # 年龄与是否逾期情况
    draw_age(all_list[1],all_list[2])
    # 有无逾期记录与是否逾期情况
    draw_pastdue(all_list[3],all_list[4],all_list[5],all_list[6])
    # 房产抵押数量与是否逾期情况
    draw_realestateLoans(all_list[7],all_list[8],all_list[9])
    # 家属人数与是否逾期情况
    draw_families(all_list[10],all_list[11],all_list[12])
    # 月收入与是否逾期情况
    draw_income(all_list[13],all_list[14],all_list[15])
    print("结束总程序")

在这里插入图片描述
运行结果如下:(带overdue.html的文件)

在这里插入图片描述

数据可视化结果

# 进入OverDue目录
cd ~/OverDue
# 提交data_web.py文件到spark-submit
/usr/local/spark/bin/spark-submit --master local ~/OverDue/data_web.py

家属人数

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

逾期记录

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

房产抵押数量

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

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

月收入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述### 总体
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

年龄

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

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

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

相关文章

【PyTorch】第四节:梯度下降算法

作者&#x1f575;️‍♂️&#xff1a;让机器理解语言か 专栏&#x1f387;&#xff1a;PyTorch 描述&#x1f3a8;&#xff1a;PyTorch 是一个基于 Torch 的 Python 开源机器学习库。 寄语&#x1f493;&#xff1a;&#x1f43e;没有白走的路&#xff0c;每一步都算数&#…

java--HtmlUnit--模拟浏览器操作--自动化操作浏览器--自动登录校园网为案例

写在前面&#xff1a; 闲来无事&#xff0c;因为宿舍每次嫌登录校园网有点免费。然后想着能不能一键自动化实现。然后更麻烦了&#xff0c;哈哈哈。不过倒是写一次代码就可以了。 可能不是特别系统&#xff0c;因为资料太少了。都是案例驱动找的资料。花了3大节课才搞完了。 会…

Redis运维之swap影响及解决方案

一、操作系统SWAP swap空间对于操作系统来说比较重要&#xff0c;当我们使用操作系统的时候&#xff0c;如果系统内存不足&#xff0c;常常会将一部分内存数据页进行swap操作&#xff0c;以解决临时的内存困境。swap空间由磁盘提供&#xff0c;对于高并发场景下&#xff0c;sw…

全球土壤湿度数据获取方法

土壤湿度亦称土壤含水率&#xff0c;表示土壤干湿程度的物理量。是土壤含水量的一种相对变量。通常用土壤含水量占干土重的百分数是示&#xff0c;亦称土壤质量湿度&#xff0c;如用土壤水分容积占土壤总容积的百分数表示&#xff0c;则称土壤容积湿度。通常说的土壤湿度&#…

Vivado中VIO IP核的使用

Vivado中VIO IP核的使用一、写在前面二、VIO IP核配置三、VIO联调四、写在后面一、写在前面 Vivado中的VIO&#xff08;Virtual Input/Output&#xff09; IP核是一种用于调试和测试FPGA设计的IP核。它允许设计者通过使用JTAG接口读取和写入FPGA内部的寄存器&#xff0c;从而检…

【JavaEE】关于synchronized总结-Callable用法及JUC的常见问题

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶synchronized原理是什么&#xff1f;synchronized到底有什么特点&#xff0c;synchronized的锁策略是什么&#xff0c;是怎么变化的呢&#xff1f;本篇文章总结出, Synchronized 具有以下特性…

【Java|golang】1041. 困于环中的机器人

在无限的平面上&#xff0c;机器人最初位于 (0, 0) 处&#xff0c;面朝北方。注意: 北方向 是y轴的正方向。 南方向 是y轴的负方向。 东方向 是x轴的正方向。 西方向 是x轴的负方向。 机器人可以接受下列三条指令之一&#xff1a; “G”&#xff1a;直走 1 个单位 “L”&…

Markdown 语法大全

Markdown是一种轻量级标记语言&#xff0c;常用于撰写博客、文档、论文等。它可以让你使用易读易写的纯文本格式来编写文档&#xff0c;然后通过转换成有效的HTML文档进行发布。以下是Markdown常用的语法&#xff1a; 这里写目录标题标题列表引用一级引用嵌套引用粗体和斜体删除…

技术复盘(1)--redis

技术复盘--redis技术复盘(1)--redis资料地址准备工作发展史redis-windowsredis-windows-说明redis-centos7安装jdk安装redisredis-key基本命令redis-string命令redis-list命令redis-set命令redis-hash命令redis-zset命令redis-geospatial命令redis-hyperloglog命令redis-bitmap…

【Linux驱动开发】024 INPUT子系统

一、前言 按键、鼠标、键盘、触摸屏等都属于输入(input)设备&#xff0c;Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设备&#xff0c;只是在此基础上套上了 input 框架&#xff0c;用户只需要负责上报输入事件&#xff0c;比如…

文本聚类与摘要,让AI帮你做个总结

你好&#xff0c;我是徐文浩。 上一讲里&#xff0c;我们用上了最新的ChatGPT的API&#xff0c;注册好了HuggingFace的账号&#xff0c;也把我们的聊天机器人部署了出去。希望通过这个过程&#xff0c;你对实际的应用开发过程已经有了充足的体验。那么这一讲里&#xff0c;我们…

[目标识别-论文笔记]Object Detection in Videos by Short and Long Range Object Linking

文章标题&#xff1a;2018_Cite13_Tang——Object Detection in Videos by Short and Long Range Object Linking 这篇论文也被叫做“2019_Cite91_TPAMI_Tang——Object Detection in Videos by High Quality Object Linking” 如果这篇博客对你有帮助&#xff0c;希望你 点赞…

ES索引库操作

文章目录1、对索引库的操作&#xff1a;创建、删除、查看2、文档操作3、 RestClient操作索引库4、利用RestClient实现文档的CRUD5、 批量导入功能有了索引库相当于数据库database&#xff0c;而接下来&#xff0c;就是需要索引库中的类型了&#xff0c;也就是数据库中的表&…

nssctf web入门(1)

这里通过nssctf的题单web安全入门来写&#xff0c;会按照题单详细解释每题。题单在NSSCTF中。 想入门ctfweb的可以看这个系列&#xff0c;之后会一直出这个题单的解析&#xff0c;题目一共有28题&#xff0c;打算写10篇。 [SWPUCTF 2021 新生赛]jicao [SWPUCTF 2021 新生赛]j…

RL4RS,离线强化学习,无模型强化学习等等资源汇总

发现好文章&#xff1a; 强化学习推荐系统综述&#xff1a;Reinforcement Learning based Recommender Systems: A Survey 强化学习图鉴&#xff5c;你与最优策略之间&#xff0c;可能还差一本离线强化学习秘籍 科学应用强化学习创新论文洞察 https://hub.baai.ac.cn/view/18…

【论文精读】PP-YOLOE: An evolved version of YOLO

文章目录前言一、可扩展的 Backbone 和 Neck二、更高效的标签分配策略 TAL (Task Alignment Learning)三、更简洁有效的 ET-Head (Efficient Task-aligned Head)前言 百度飞桨团队发布了 PP-YOLOE&#xff0c;与其他 YOLO 系列算法相比&#xff0c;其具有更强的性能、更丰富灵…

8.2 正态总体的参数的检验

学习目标&#xff1a; 如果我要学习正态总数的参数检验&#xff0c;我会按照以下步骤进行学习&#xff1a; 学习正态分布的基本知识&#xff1a;正态分布是统计学中非常重要的概率分布之一&#xff0c;掌握其基本知识包括概率密度函数、期望值、方差、标准差等是非常重要的。 …

Prometheus - Grafana 监控 MySQLD Linux服务器 demo版

目录 首先是下载Prometheus 下载和安装 配置Prometheus 查看监控数据 监控mysql demo 部署 mysqld_exporter 组件 配置 Prometheus 获取监控数据 -------------------------------------- 安装和使用Grafana 启动Grafana -------------------------------------- 配…

MySQL5.5安装图解

一、MYSQL的安装 &#xff11;、打开下载的mysql安装文件mysql-5.5.27-win32.zip&#xff0c;双击解压缩&#xff0c;运行“setup.exe” &#xff12;、选择安装类型&#xff0c;有“Typical(默认)”、“Complete(完全)”、“Custom(用户自定义)”三个选项&#xff0c;选择“Cu…

VSD Viewer for Mac,Visio绘图文件阅读器

VSD Viewer for Mac版是mac上一款非常强大的Visio绘图文件阅读器&#xff0c;它为打开和打印Visio文件提供了简单的解决方案。可以显示隐藏的图层&#xff0c;查看对象的形状数据&#xff0c;预览超链接。还可以将Visio转换为包含图层&#xff0c;形状数据和超链接的PDF文档。 …