香港金曲奖分析(1983-2017 by SIRMAN)

    以前的金曲奖就是华语音乐的代表,特别是80、90年代,谭张争霸,四大天王等,虽然近来影响力已不如之前,但让我们来看看1983-2017的获奖名单。
    数据来源于百度百科“十大劲歌金曲颁奖典礼”,由于名单较多,我们只选取了前20位进行图形化展视。可能有些奖项由于个人原因没有参加,例如谭咏麟87年之后未参加颁奖,张国荣更是89-97退出歌坛等,但从这些结果仍然可能与大家想象的不太一样:
    1)最受欢迎男歌星,张学友只有1次获奖,张敬轩、古巨基各有4次获奖,歌神有点委曲哈;
    2)最受欢迎女歌星,容祖儿12次获奖可以说是一枝独秀,像王菲仅有2次获奖,差距确实有点大;
    3)金曲金奖,这一次歌神张学友终于获得最多的4次,但大众情人刘德华1次没有,也是出乎大家意料;
    4)金曲奖,也是容祖儿拨得头筹,这一次天王刘德华终于站在了第一梯队(注:金曲奖每届有10-20首,而金曲金奖每届只有1首);
    5)最佳作曲奖,不是太熟悉,但像黄沾这样的大佬我们还是知道的;
    6)最佳填词奖,这个和大家预期一样,林夕以10次遥遥领先;
    7)最佳编曲奖,这个还不如最佳作曲奖的名字熟悉;
    8)总次数,是指示所有奖项中出现名字相加(不局限于以上7个奖项),容祖儿在奖项上的强大优势折桂。

具体分析(代码及图片)如下,首先抓取数据

#从百度百科获取数据
def get_data():
    url = "https://baike.baidu.com/item/%E5%8D%81%E5%A4%A7%E5%8A%B2%E6%AD%8C%E9%87%91%E6%9B%B2%E9%A2%81%E5%A5%96%E5%85%B8%E7%A4%BC/477072?fr=aladdin"
    #pandas直接获取url数据,并设置第0行为列标题
    html_text = pd.read_html(url, encoding="utf-8", header=0) 
    #将数据存入列表lst 
    global lst   
    lst = []
    for i in range(0,37):
        lst.append(html_text[i])   

一、最受欢迎男歌星获奖次数统计

#历届大奖,最受欢迎男歌星
def man_lijiedajiang():
    #获取历届大奖的数据
    pd_data = pd.DataFrame(lst[1])
    # print(pd_data)
    #写入oracle,表名需要小写
    pd_data.to_sql('历届大奖', engine, if_exists='replace', index=True, \
    dtype={'年度': sqlalchemy.types.NVARCHAR(50),\
        '届次': sqlalchemy.types.String(length=50),\
        '最受欢迎男歌星': sqlalchemy.types.String(50),\
        '最受欢迎女歌星':  sqlalchemy.types.String(length=50),\
        '金曲金奖':  sqlalchemy.types.String(length=50),\
        })
    #查询获取数据用sql语句,不要分号,表名如果是英文要小写
    sql = "select 最受欢迎男歌星 as 最受欢迎男歌星,count(*) as 次数 \
        from 历届大奖 group by 最受欢迎男歌星 \
        order by 次数 desc,最受欢迎男歌星 DESC"
    print("从数据库读取前------------------------------")
    #执行sql语句,从数据库取出数据
    m_data = pd.read_sql(sql,engine)
    #取出的数据只保留前20行
    df = m_data[0:20]
    # print('最受欢迎男歌星',df)
    #画图,直方图,x轴标签为列“最受欢迎男歌星”
    df.plot(kind="bar",x='最受欢迎男歌星',title='最受欢迎男歌星获奖次数')
    #保存为图片,也可保存为pdf
    plt.savefig('最受欢迎男歌星.png', dpi=300)

输出
在这里插入图片描述
二、最受欢迎女歌星获奖次数统计

#历届大奖,最受欢迎女歌星
def woman_lijiedajiang():
    #查询获取数据用sql语句,不要分号,表名如果是英文要小写
    sql = "select 最受欢迎女歌星 as 最受欢迎女歌星,count(*) as 次数 \
        from 历届大奖 group by 最受欢迎女歌星 \
        order by 次数 desc,最受欢迎女歌星 DESC"
    print("从数据库读取前------------------------------")
    #执行sql语句,从数据库取出数据
    m_data = pd.read_sql(sql,engine)
    #取出的数据只保留前13行
    df = m_data[0:20]
    # print('最受欢迎女歌星',df)
    #画图,直方图,x轴标签为列“最受欢迎男歌星”
    df.plot(kind="bar",x='最受欢迎女歌星',title='最受欢迎女歌星获奖次数')
    #保存为图片,也可保存为pdf
    plt.savefig('最受欢迎女歌星.png', dpi=300)

输出
在这里插入图片描述
三、金曲金奖获奖次数统计

#历届大奖,金曲金奖
def jinquJJ_lijiedajiang():
    #查询获取数据用sql语句,不要分号,表名如果是英文要小写
    sql = "select 金曲金奖, count(*) as 次数 \
        from (select substr(金曲金奖,instr(金曲金奖,'》',-1,1)+1) as 金曲金奖  from 历届大奖) \
        group by 金曲金奖 order by 次数 desc,金曲金奖 DESC"
    print("从数据库读取前------------------------------")
    #执行sql语句,从数据库取出数据
    m_data = pd.read_sql(sql,engine)
    #取出的数据只保留前13行
    df = m_data[0:20]
    # print('金曲金奖',df)
    #画图,直方图,x轴标签为列“金曲金奖”
    df.plot(kind="bar",x='金曲金奖',title='金曲金奖获奖次数')
    #保存为图片,也可保存为pdf
    plt.savefig('金曲金奖.png', dpi=300)

输出
在这里插入图片描述
四、金曲奖获奖次数统计(注:金曲奖每届有10-20首,而金曲金奖每届只有1首)

#获奖名单,金曲
def jinqu_huojiangmingdan():
    #为了for循环下不会累积数据,每次for循环前先删除表
    cursor = db.cursor()   # 获取游标,用于进行 SQL 操作
    #如果存在table'获奖名单',则先删除
    str_sql = "declare \
                    num   number; \
                begin \
                    select count(1) into num from all_tables where TABLE_NAME = '获奖名单' and OWNER='ZCK'; \
                    if   num=1   then \
                        execute immediate 'drop table 获奖名单'; \
                    end   if; \
                end;"
    cursor.execute(str_sql)
    cursor.close()  # 关闭游标
    db.close()  # 关闭数据库
    #将lst里面的列表数据取出,并写入到数据库,table为'获奖名单' 
    for i in range(2,36):
        pd_data = pd.DataFrame(lst[i])
        # print(pd_data)
        pd_data.to_sql('获奖名单', engine, if_exists='append', index=True, \
        dtype={'奖项名称': sqlalchemy.types.String(500),\
            '获奖人及作品': sqlalchemy.types.String(500),              
            })     
    #查询获取数据用sql语句,不要分号,表名如果是英文要小写
    sql = "select 获奖人及作品, count(*) as 次数 from \
            (select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'、',1,1)+1) as 获奖人及作品  \
            from (select * from 获奖名单 t where 奖项名称 LIKE '%劲歌金曲奖%' and 获奖人及作品 like '%、%') \
            union all \
            select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'》',-1,1)+1) as 获奖人及作品 \
            from (select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'、',-1,1)-1) as 获奖人及作品  \
            from (select * from 获奖名单 t where 奖项名称 LIKE '%劲歌金曲奖%' and 获奖人及作品 like '%、%')) \
            union all \
            select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'》',-1,1)+1) as 获奖人及作品 \
            from 获奖名单 WHERE 奖项名称 LIKE '%劲歌金曲奖%'and 获奖人及作品 not LIKE '%、%') \
            group by 获奖人及作品 order by 次数 desc,获奖人及作品 DESC"
    print("从数据库读取前------------------------------")
    #执行sql语句,从数据库取出数据
    m_data = pd.read_sql(sql,engine)
    # 取出的数据只保留前20行
    df = m_data[0:20]
    # print('获奖名单',df) 
    # SQL选出“次数”中值最大值,作为y轴标签最大值
    sql_yticks = "select max(次数) from \
        (select 获奖人及作品, count(*) as 次数 from \
            (select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'、',1,1)+1) as 获奖人及作品  \
                from (select * from 获奖名单 t where 奖项名称 LIKE '%劲歌金曲奖%' and 获奖人及作品 like '%、%') \
        union all \
            select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'》',-1,1)+1) as 获奖人及作品 \
                from (select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'、',-1,1)-1) as 获奖人及作品  \
                    from (select * from 获奖名单 t where 奖项名称 LIKE '%劲歌金曲奖%' and 获奖人及作品 like '%、%')) \
        union all \
            select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'》',-1,1)+1) as 获奖人及作品 \
                from 获奖名单 WHERE 奖项名称 LIKE '%劲歌金曲奖%'and 获奖人及作品 not LIKE '%、%') \
        group by 获奖人及作品 order by 次数 desc,获奖人及作品 DESC)"
    # pandas读出“次数”中值最大值
    data_yticks = pd.read_sql(sql_yticks,engine)  
    # 值类型转换  
    int_ticks = data_yticks["MAX(次数)"].astype("int")  
    # print(type(int_ticks))  
    # 生成y轴标签
    yticks = list(range(1,int(int_ticks)+1,1))       
    #画图,直方图,x轴标签为列“获奖名单”
    ax = df.plot(x='获奖人及作品', kind="bar", title='金曲获奖次数', yticks=yticks,
    color='red')
    ax.set_ylabel('获奖次数') #设置Y轴名称
    ax.set_xlabel('名字') #设置X轴名称
    ax.legend(loc='upper right') #设置图例的位置
    plt.gcf().subplots_adjust( bottom=0.2) #图形居画布边距
    #保存为图片,也可保存为pdf
    plt.savefig('金曲获奖名单.png', dpi=300)

输出
在这里插入图片描述
五、最佳作曲奖获奖次数统计

#获奖名单,最佳作曲奖
def zuoqu_huojiangmingdan():    
    #查询获取数据用sql语句,不要分号,表名如果是英文要小写
    sql = "select 获奖人及作品, count(*) as 次数 from \
            (select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'《',-1,1)-1) as 获奖人及作品  \
                            from (select * from 获奖名单 t where 奖项名称 LIKE '%最佳作曲奖%'and 获奖人及作品 not LIKE '%、%')  \
            union all \
            select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'、',1,1)-1) as 获奖人及作品  \
                    from (select * from 获奖名单 t where 奖项名称 LIKE '%最佳作曲奖%' and 获奖人及作品 like '%、%') \
            union all \
            select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'、',-1,1)+1) as 获奖人及作品 \
                        from (select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'《',-1,1)-1) as 获奖人及作品  \
                            from (select * from 获奖名单 t where 奖项名称 LIKE '%最佳作曲奖%'and 获奖人及作品 LIKE '%、%'))) \
            group by 获奖人及作品 order by 次数 desc,获奖人及作品 DESC"
    print("从数据库读取前------------------------------")
    #执行sql语句,从数据库取出数据
    m_data = pd.read_sql(sql,engine)
    # print(m_data)
    # 取出的数据只保留前20行
    df = m_data[0:20]
    # print('最佳作曲奖',df) 
    # SQL选出“次数”中值最大值,作为y轴标签最大值
    sql_yticks = "select max(次数) from \
        (select 获奖人及作品, count(*) as 次数 from \
            (select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'《',-1,1)-1) as 获奖人及作品  \
                            from (select * from 获奖名单 t where 奖项名称 LIKE '%最佳作曲奖%'and 获奖人及作品 not LIKE '%、%')  \
            union all \
            select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'、',1,1)-1) as 获奖人及作品  \
                    from (select * from 获奖名单 t where 奖项名称 LIKE '%最佳作曲奖%' and 获奖人及作品 like '%、%') \
            union all \
            select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'、',-1,1)+1) as 获奖人及作品 \
                        from (select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'《',-1,1)-1) as 获奖人及作品  \
                            from (select * from 获奖名单 t where 奖项名称 LIKE '%最佳作曲奖%'and 获奖人及作品 LIKE '%、%'))) \
            group by 获奖人及作品 order by 次数 desc,获奖人及作品 DESC)"
    # pandas读出“次数”中值最大值
    data_yticks = pd.read_sql(sql_yticks,engine)  
    # 值类型转换  
    int_ticks = data_yticks["MAX(次数)"].astype("int")  
    # print(type(int_ticks))  
    # 生成y轴标签
    yticks = list(range(1,int(int_ticks)+1,1))       
    #画图,直方图,x轴标签为列“获奖名单”
    ax = df.plot(x='获奖人及作品', kind="bar", title='最佳作曲奖', yticks=yticks,
    color='red')
    ax.set_ylabel('获奖次数') #设置Y轴名称
    ax.set_xlabel('名字') #设置X轴名称
    ax.legend(loc='upper right') #设置图例的位置
    plt.gcf().subplots_adjust( bottom=0.2) #图形居画布边距
    #保存为图片,也可保存为pdf
    plt.savefig('最佳作曲奖.png', dpi=300)

输出
在这里插入图片描述
六、最佳填词奖获奖次数统计

#获奖名单,最佳填词奖
def tianci_huojiangmingdan():    
    #查询获取数据用sql语句,不要分号,表名如果是英文要小写
    sql = "select 获奖人及作品, count(*) as 次数 from \
        (select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'《',-1,1)-1) as 获奖人及作品  \
                    from (select * from 获奖名单 t where 奖项名称 LIKE '%最佳填词奖%'and 获奖人及作品 not LIKE '%、%') \
        union all \
        select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'、',1,1)-1) as 获奖人及作品  \
                from (select * from 获奖名单 t where 奖项名称 LIKE '%最佳填词奖%' and 获奖人及作品 like '%、%') \
        union all \
        select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'、',-1,1)+1) as 获奖人及作品 \
                    from (select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'《',-1,1)-1) as 获奖人及作品  \
                        from (select * from 获奖名单 t where 奖项名称 LIKE '%最佳填词奖%'and 获奖人及作品 LIKE '%、%'))) \
        group by 获奖人及作品 order by 次数 desc,获奖人及作品 DESC"
    print("从数据库读取前------------------------------")
    #执行sql语句,从数据库取出数据
    m_data = pd.read_sql(sql,engine)
    # 取出的数据只保留前20行
    df = m_data[0:20]
    # print('最佳作曲奖',df) 
    # SQL选出“次数”中值最大值,作为y轴标签最大值
    sql_yticks = "select max(次数) from \
        (select 获奖人及作品, count(*) as 次数 from \
        (select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'《',-1,1)-1) as 获奖人及作品  \
                    from (select * from 获奖名单 t where 奖项名称 LIKE '%最佳填词奖%'and 获奖人及作品 not LIKE '%、%') \
        union all \
        select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'、',1,1)-1) as 获奖人及作品  \
                from (select * from 获奖名单 t where 奖项名称 LIKE '%最佳填词奖%' and 获奖人及作品 like '%、%') \
        union all \
        select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'、',-1,1)+1) as 获奖人及作品 \
                    from (select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'《',-1,1)-1) as 获奖人及作品  \
                        from (select * from 获奖名单 t where 奖项名称 LIKE '%最佳填词奖%'and 获奖人及作品 LIKE '%、%'))) \
        group by 获奖人及作品 order by 次数 desc,获奖人及作品 DESC)"
    # pandas读出“次数”中值最大值
    data_yticks = pd.read_sql(sql_yticks,engine)  
    # 值类型转换  
    int_ticks = data_yticks["MAX(次数)"].astype("int")  
    # print(type(int_ticks))  
    # 生成y轴标签
    yticks = list(range(1,int(int_ticks)+1,1))       
    #画图,直方图,x轴标签为列“获奖名单”
    ax = df.plot(x='获奖人及作品', kind="bar", title='最佳填词奖', yticks=yticks,
    color='red')
    ax.set_ylabel('获奖次数') #设置Y轴名称
    ax.set_xlabel('名字') #设置X轴名称
    ax.legend(loc='upper right') #设置图例的位置
    plt.gcf().subplots_adjust( bottom=0.2) #图形居画布边距
    #保存为图片,也可保存为pdf
    plt.savefig('最佳填词奖.png', dpi=300)

输出
在这里插入图片描述
七、最佳编曲奖获奖次数统计

#获奖名单,最佳编曲奖
def bianqu_huojiangmingdan():    
    #查询获取数据用sql语句,不要分号,表名如果是英文要小写
    sql = "select 获奖人及作品, count(*) as 次数 from \
        (select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'《',-1,1)-1) as 获奖人及作品  \
                        from (select * from 获奖名单 t where 奖项名称 LIKE '%最佳编曲奖%'and 获奖人及作品 not LIKE '%、%') \
        union all \
        select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'、',1,1)-1) as 获奖人及作品  \
                from (select * from 获奖名单 t where 奖项名称 LIKE '%最佳编曲奖%' and 获奖人及作品 like '%、%')\
        union all \
        select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'、',-1,1)+1) as 获奖人及作品 \
                    from (select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'《',-1,1)-1) as 获奖人及作品 \
                        from (select * from 获奖名单 t where 奖项名称 LIKE '%最佳编曲奖%'and 获奖人及作品 LIKE '%、%'))) \
        group by 获奖人及作品 order by 次数 desc,获奖人及作品 DESC"
    print("从数据库读取前------------------------------")
    #执行sql语句,从数据库取出数据
    m_data = pd.read_sql(sql,engine)
    # 取出的数据只保留前20行
    df = m_data[0:20]
    # print('最佳编曲奖',df) 
    # SQL选出“次数”中值最大值,作为y轴标签最大值
    sql_yticks = "select max(次数) from \
        (select 获奖人及作品, count(*) as 次数 from \
        (select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'《',-1,1)-1) as 获奖人及作品  \
                        from (select * from 获奖名单 t where 奖项名称 LIKE '%最佳编曲奖%'and 获奖人及作品 not LIKE '%、%') \
        union all \
        select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'、',1,1)-1) as 获奖人及作品  \
                from (select * from 获奖名单 t where 奖项名称 LIKE '%最佳编曲奖%' and 获奖人及作品 like '%、%')\
        union all \
        select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'、',-1,1)+1) as 获奖人及作品 \
                    from (select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'《',-1,1)-1) as 获奖人及作品 \
                        from (select * from 获奖名单 t where 奖项名称 LIKE '%最佳编曲奖%'and 获奖人及作品 LIKE '%、%'))) \
        group by 获奖人及作品 order by 次数 desc,获奖人及作品 DESC)"
    # pandas读出“次数”中值最大值
    data_yticks = pd.read_sql(sql_yticks,engine)  
    # 值类型转换  
    int_ticks = data_yticks["MAX(次数)"].astype("int")  
    # print(type(int_ticks))  
    # 生成y轴标签
    yticks = list(range(1,int(int_ticks)+1,1))       
    #画图,直方图,x轴标签为列“获奖名单”
    ax = df.plot(x='获奖人及作品', kind="bar", title='最佳编曲奖', yticks=yticks,
    color='red')
    ax.set_ylabel('获奖次数') #设置Y轴名称
    ax.set_xlabel('名字') #设置X轴名称
    ax.legend(loc='upper right') #设置图例的位置
    plt.gcf().subplots_adjust( bottom=0.2) #图形居画布边距
    #保存为图片,也可保存为pdf
    plt.savefig('最佳编曲奖.png', dpi=300)

输出
在这里插入图片描述
八、总数统计(包含所有奖项,不局仅于前面列的七个奖项)

#获奖名单,总数统计(包含所有奖项)
def total_huojiangmingdan():    
    #查询获取数据用sql语句,不要分号,表名如果是英文要小写
    sql = "select 获奖人及作品, count(*) as 次数 from \
    (SELECT * FROM\
    (select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'《',-1,1)-1) as 获奖人及作品  \
        from (select * from 获奖名单 t where 获奖人及作品 not LIKE '%、%' and 获奖人及作品 LIKE '%》%'))\
    WHERE 获奖人及作品 not like '%:%' and 获奖人及作品 not like '%.%' and 获奖人及作品 not like '%《%'\
    UNION ALL\
    SELECT * FROM\
    (select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'》',-1,1)+1) as 获奖人及作品  \
        from (select * from 获奖名单 t where 获奖人及作品 not LIKE '%、%' and 获奖人及作品 LIKE '%》%'))\
    WHERE 获奖人及作品 not like '%:%' and 获奖人及作品 not like '%.%'\
    UNION ALL\
    select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,':',-1,1)+1) as 获奖人及作品\
    from (select * from 获奖名单 t where 获奖人及作品 not LIKE '%、%' and 获奖人及作品 not LIKE '%》%' and 获奖人及作品 LIKE '%:%')\
    UNION ALL\
    select 奖项名称, 获奖人及作品 from 获奖名单 t where 获奖人及作品 not LIKE '%、%' and 获奖人及作品 not LIKE '%》%' and 获奖人及作品 not LIKE '%:%'\
    UNION ALL\
    select * from(\
        select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'、',-1,1)+1) as 获奖人及作品\
        FROM (select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'》',-1,1)+1) as 获奖人及作品\
            FROM (select * from 获奖名单 t where 获奖人及作品 LIKE '%、%' and 获奖人及作品 LIKE '%》%')))\
    WHERE 获奖人及作品 is not null\
    UNION ALL\
    select * from(\
        select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'、',-1,1)-1) as 获奖人及作品\
        FROM (select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'》',-1,1)+1) as 获奖人及作品\
            FROM (select * from 获奖名单 t where 获奖人及作品 LIKE '%、%' and 获奖人及作品 LIKE '%》%')))\
    WHERE 获奖人及作品 is not null\
    UNION ALL\
    select 奖项名称, 获奖人及作品 from 获奖名单 t where 获奖人及作品 LIKE '%、%' and 获奖人及作品 not LIKE '%》%' and 获奖人及作品 LIKE '%:%'\
    UNION ALL\
    select 奖项名称, 获奖人及作品 from 获奖名单 t where 获奖人及作品 LIKE '%、%' and 获奖人及作品 not LIKE '%》%' and 获奖人及作品 not LIKE '%:%')\
    group by 获奖人及作品 order by 次数 desc,获奖人及作品 DESC"
    print("从数据库读取前------------------------------")
    #执行sql语句,从数据库取出数据
    m_data = pd.read_sql(sql,engine)
    # 取出的数据只保留前20行
    df = m_data[0:20]
    # print('总数统计(包含所有奖项)',df) 
    # SQL选出“次数”中值最大值,作为y轴标签最大值
    sql_yticks = "select max(次数) from \
        (select 获奖人及作品, count(*) as 次数 from \
    (SELECT * FROM\
    (select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'《',-1,1)-1) as 获奖人及作品  \
        from (select * from 获奖名单 t where 获奖人及作品 not LIKE '%、%' and 获奖人及作品 LIKE '%》%'))\
    WHERE 获奖人及作品 not like '%:%' and 获奖人及作品 not like '%.%' and 获奖人及作品 not like '%《%'\
    UNION ALL\
    SELECT * FROM\
    (select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'》',-1,1)+1) as 获奖人及作品  \
        from (select * from 获奖名单 t where 获奖人及作品 not LIKE '%、%' and 获奖人及作品 LIKE '%》%'))\
    WHERE 获奖人及作品 not like '%:%' and 获奖人及作品 not like '%.%'\
    UNION ALL\
    select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,':',-1,1)+1) as 获奖人及作品\
    from (select * from 获奖名单 t where 获奖人及作品 not LIKE '%、%' and 获奖人及作品 not LIKE '%》%' and 获奖人及作品 LIKE '%:%')\
    UNION ALL\
    select 奖项名称, 获奖人及作品 from 获奖名单 t where 获奖人及作品 not LIKE '%、%' and 获奖人及作品 not LIKE '%》%' and 获奖人及作品 not LIKE '%:%'\
    UNION ALL\
    select * from(\
        select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'、',-1,1)+1) as 获奖人及作品\
        FROM (select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'》',-1,1)+1) as 获奖人及作品\
            FROM (select * from 获奖名单 t where 获奖人及作品 LIKE '%、%' and 获奖人及作品 LIKE '%》%')))\
    WHERE 获奖人及作品 is not null\
    UNION ALL\
    select * from(\
        select 奖项名称,substr(获奖人及作品,1,instr(获奖人及作品,'、',-1,1)-1) as 获奖人及作品\
        FROM (select 奖项名称,substr(获奖人及作品,instr(获奖人及作品,'》',-1,1)+1) as 获奖人及作品\
            FROM (select * from 获奖名单 t where 获奖人及作品 LIKE '%、%' and 获奖人及作品 LIKE '%》%')))\
    WHERE 获奖人及作品 is not null\
    UNION ALL\
    select 奖项名称, 获奖人及作品 from 获奖名单 t where 获奖人及作品 LIKE '%、%' and 获奖人及作品 not LIKE '%》%' and 获奖人及作品 LIKE '%:%'\
    UNION ALL\
    select 奖项名称, 获奖人及作品 from 获奖名单 t where 获奖人及作品 LIKE '%、%' and 获奖人及作品 not LIKE '%》%' and 获奖人及作品 not LIKE '%:%')\
    group by 获奖人及作品 order by 次数 desc,获奖人及作品 DESC)"
    # pandas读出“次数”中值最大值
    data_yticks = pd.read_sql(sql_yticks,engine)  
    # 值类型转换  
    int_ticks = data_yticks["MAX(次数)"].astype("int")  
    # print(type(int_ticks))  
    # 生成y轴标签
    yticks = list(range(1,int(int_ticks)+1,1))       
    #画图,直方图,x轴标签为列“获奖名单”指定x轴为'获奖人及作品',颜色为'red',尺寸为figsize=(10,10)
    ax = df.plot(x='获奖人及作品', kind="bar", title='总数统计(包含所有奖项)', yticks=yticks,
    color='red',figsize=(10,10))
    ax.set_ylabel('获奖次数') #设置Y轴名称
    ax.set_xlabel('名字') #设置X轴名称
    ax.legend(loc='upper right') #设置图例的位置
    plt.gcf().subplots_adjust( bottom=0.2) #图形居画布边距    
    #保存为图片,也可保存为pdf
    plt.savefig('总数统计(包含所有奖项).png', dpi=900)

输出
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值