使用Python、pandas、pyecharts进行数据分析——实例讲解

 目录

1导入分析过程中所需要用到的包

2 获取数据

3对数据进行需求处理

3.1对数据列得重新命名——rename 

3.2 表连接——concat

3.3 缺失值处理——isnull、dropna、fillna

3.4 正则化匹配——re.match\re.search 

3.5 日期类型——datetime

3.6获取子集

3.7 分组操作——gruopby

3.8根据实际需要进行操作

4 数据可视化


 1导入分析过程中所需要用到的包

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pyecharts.charts import Bar

2 获取数据

以下数据从网络获取,仅供实验,可于1-4月份畅销书排行榜-数据挖掘文档类资源-CSDN文库

a_1=pd.read_csv('D:/data-ana/3月畅销书排行榜.csv',encoding='gbk')
a_2=pd.read_csv('D:/data-ana/4月畅销书排行榜.csv',encoding='gbk')
print(a_1.columns,a_2.columns)#查看获取的数据列名
print(a_1.shape,a_2.shape)#查看获取的数据的行列数
print(a_1.iloc[:5,:5])
print(a_2.iloc[:5,:5])#分别查看两个文件的前五行五列


'''以下为输出结果:
Index(['标题', 'list_num', '作者', '出版日期', '价格', '评价数', '出版单位', '推荐率', '电子书'], dtype='object') Index(['标题', 'list_num', '出版日期', '价格', '评价数', '出版单位', '推荐率', '电子书'], dtype='object')
(55, 9) (55, 8)
                                    标题  list_num       作者       出版日期    价格
0                      医路向前巍子给中国人的救护指南         1   医路向前巍子  2020/12/1  46.9
1                        小熊和最好的爸爸(全7册)         2   阿兰德·丹姆  2007/11/1  35.0
2  你当像鸟飞往你的山(中文版销量超200万册,比尔·盖茨年度特别推...         3       塔拉  2019/11/1  34.8
3  蛤蟆先生去看心理医生(畅销100万册!英国经典心理咨询入门书,知...         4  罗伯特·戴博德   2020/7/1  26.0
4    人间失格(日本小说家太宰治代表作,一个对村上春树影响至深的绝...         5      太宰治   2015/8/1  20.0
                                    标题  list_num       出版日期     价格         评价数
0  你当像鸟飞往你的山(中文版销量超200万册,比尔·盖茨年度特别推...         1  2019/11/1   34.8  1136877条评论
1       文城(余华新书,时隔8年重磅归来,《活着》之后又一精彩力作)         2   2021/3/3   59.0   196742条评论
2  蛤蟆先生去看心理医生(畅销100万册!英国经典心理咨询入门书,知...         3   2020/7/1   26.0   482573条评论
3                         少年读史记(套装全5册)         4   2015/9/1  100.0  1052455条评论
4    心安即是归处(季羡林百年生命智慧。央视《朗读者》多次动情朗读...         5   2020/8/1   36.8   188789条评论'''

3对数据进行需求处理

3.1对数据列得重新命名——rename 

#将a_1和a_2中的标题列名修改位书名,list_num列名修改位书号,并通过inplace参数直接修改原数据,这里的直接修改指的是不再创建一个新的数据对象,在原数据对象比如a_1上修改
a_1.rename(columns={'标题':'书名','list_num':'书号'},inplace=True)
a_2.rename(columns={'标题':'书名','list_num':'书号'},inplace=True)
print(a_1.info())
print(a_2.info())#分别查看a_1和a_2的详细信息,其中包括多少行,列值得类型设置等


'''以下为输出结果:

RangeIndex: 55 entries, 0 to 54
Data columns (total 9 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   书名      55 non-null     object 
 1   书号      55 non-null     int64  
 2   作者      55 non-null     object 
 3   出版日期    55 non-null     object 
 4   价格      55 non-null     float64
 5   评价数     55 non-null     object 
 6   出版单位    55 non-null     object 
 7   推荐率     55 non-null     float64
 8   电子书     24 non-null     object 
dtypes: float64(2), int64(1), object(6)
memory usage: 4.0+ KB
None

RangeIndex: 55 entries, 0 to 54
Data columns (total 8 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   书名      55 non-null     object 
 1   书号      55 non-null     int64  
 2   出版日期    55 non-null     object 
 3   价格      55 non-null     float64
 4   评价数     55 non-null     object 
 5   出版单位    55 non-null     object 
 6   推荐率     55 non-null     float64
 7   电子书     29 non-null     object 
dtypes: float64(2), int64(1), object(5)
memory usage: 3.6+ KB
None'''

3.2 表连接——concat

a_12=pd.concat([a_1,a_2],ignore_index=True)#对表进行连接
print(a_12.shape)

'''以下为输出结果:
(110, 9)'''

3.3 缺失值处理——isnull、dropna、fillna

print(a_1.isnull().sum())#先分别查看a_1和a_2表中都缺失什么数据
print('----'*5)
print(a_2.isnull().sum())
print('----'*5)
print(a_12.isnull().sum())#查看联合表中每一列的缺失值个数
print('----'*5)#输出一行横线用于区分三次输出
for i in range(55,109):
    for j in range(55):
        if ac.loc[i,'书名']==ac.loc[j,'书名']:
            ac.loc[i,'作者']=ac.loc[j,'作者']
for i in range(0,109):
    for j in range(109):
        if ac.loc[i,'书名']==ac.loc[j,'书名']:
            ac.loc[i,'电子书']=ac.loc[j,'电子书']
#上面两个for循环是尝试将1月和2月都销售了,但是有信息缺失的补全,比如一本书在1月卖出的数据是全的,在2月卖出的作者或电子书信息缺失,可以利用1月份的信息进行填充
print(a_12.isnull().sum())
a_12.fillna('未知',inplace=True)#由于上两个表中没有重复的书籍,因此对缺失值进行‘未知’的填充
'''也可以使用dropna(how='any'任何包含缺失值/'all'全部都为缺失值,axis=0/1指定行列,thresh指定删除行列需要包含至少多少个缺失值'''
print('----'*5)
print(a_12.isnull().sum())#填充玩完之后查看每一列缺失值个数

'''书名       0
书号       0
作者       0
出版日期     0
价格       0
评价数      0
出版单位     0
推荐率      0
电子书     31
dtype: int64
--------------------
书名       0
书号       0
出版日期     0
价格       0
评价数      0
出版单位     0
推荐率      0
电子书     26
dtype: int64
--------------------
书名       0
书号       0
作者      55
出版日期     0
价格       0
评价数      0
出版单位     0
推荐率      0
电子书     57
dtype: int64
--------------------
书名       0
书号       0
作者      55
出版日期     0
价格       0
评价数      0
出版单位     0
推荐率      0
电子书     57
dtype: int64
--------------------
书名      0
书号      0
作者      0
出版日期    0
价格      0
评价数     0
出版单位    0
推荐率     0
电子书     0
dtype: int64'''

3.4 正则化匹配——re.match\re.search 

关于正则化匹配在下一个文章介绍,如若已经写出将会添加链接在此处

import re#导入正则化需要的re包
a_12_time=list(a_12['出版日期'])#将出版日期列转换成列表形式方便下面的循环使用
a_12_year=[]#创建一个空列表,用于存储下面的出版年份
for v in a_12_time:#使用for循环对每一本书的出版日期进行下列操作
    year=v.split('/')[0]#使用split对字符串进行分割,并获取返回的列表中的第一个值赋值给year
    ac_year.append(year)#将上面获取的year添加到上面的空列表中
a_12['出版年份']=pd.Series(ac_year)#将列表转换成series类型,并添加到a_12一个新列‘出版年份’
#以同样的方法将评价数取出添加到新列‘销售数量’
a_12_size=list(ac['评价数'])
a_12_num=[]
for v in a_12_size:
    r=re.match('^\d+',string=v)#首先\d代表一个数字,^表示以数字开头,+表示一个或多个
    a_12_num.append(r.group())#group用来获取与指定模式相匹配的字符串
a_12['销售数量']=pd.Series(ac_num)
print(a_12.columns)#查看添加后的列名
print('----'*5)
print(a_12.head())


'''以下位输出结果:
Index(['书名', '书号', '作者', '出版日期', '价格', '评价数', '出版单位', '推荐率', '电子书', '出版年份',
       '销售数量'],
      dtype='object')
--------------------
                                    书名  书号       作者       出版日期    价格  \
0                      医路向前巍子给中国人的救护指南   1   医路向前巍子  2020/12/1  46.9   
1                        小熊和最好的爸爸(全7册)   2   阿兰德·丹姆  2007/11/1  35.0   
2  你当像鸟飞往你的山(中文版销量超200万册,比尔·盖茨年度特别推...   3       塔拉  2019/11/1  34.8   
3  蛤蟆先生去看心理医生(畅销100万册!英国经典心理咨询入门书,知...   4  罗伯特·戴博德   2020/7/1  26.0   
4    人间失格(日本小说家太宰治代表作,一个对村上春树影响至深的绝...   5      太宰治   2015/8/1  20.0   

          评价数        出版单位    推荐率     电子书  出版年份     销售数量  
0   420636条评论  北京联合出版有限公司  1.000  ¥40.80  2020   420636  
1  1416977条评论     贵州人民出版社  0.996      未知  2007  1416977  
2  1136877条评论      南海出版公司  1.000  ¥24.99  2019  1136877  
3   482574条评论     天津人民出版社  1.000  ¥18.99  2020   482574  
4  2128286条评论       作家出版社  1.000   ¥4.99  2015  2128286  '''

3.5 日期类型——datetime

from datetime import datetime#导入需要的datetime包

nowtime=datetime.now()#获取当前时间
time_list=[]
for v in a_12_time:
    vd=pd.to_datetime(v)#转换成datetime类型
    time_delta=(nowtime-vd).days#获取从出版到现在的天数
    time_list.append(time_delta)
a_12['已出版天数']=pd.Series(time_list)#添加新列‘已出版天数’
print(a_12.columns)
print('----'*5)
print(a_12.head())#查看数据

'''输出结果如下:
Index(['书名', '书号', '作者', '出版日期', '价格', '评价数', '出版单位', '推荐率', '电子书', '出版年份',
       '销售数量', '已出版天数'],
      dtype='object')
--------------------
                                    书名  书号       作者       出版日期    价格  \
0                      医路向前巍子给中国人的救护指南   1   医路向前巍子  2020/12/1  46.9   
1                        小熊和最好的爸爸(全7册)   2   阿兰德·丹姆  2007/11/1  35.0   
2  你当像鸟飞往你的山(中文版销量超200万册,比尔·盖茨年度特别推...   3       塔拉  2019/11/1  34.8   
3  蛤蟆先生去看心理医生(畅销100万册!英国经典心理咨询入门书,知...   4  罗伯特·戴博德   2020/7/1  26.0   
4    人间失格(日本小说家太宰治代表作,一个对村上春树影响至深的绝...   5      太宰治   2015/8/1  20.0   

          评价数        出版单位    推荐率     电子书  出版年份     销售数量  已出版天数  
0   420636条评论  北京联合出版有限公司  1.000  ¥40.80  2020   420636    390  
1  1416977条评论     贵州人民出版社  0.996      未知  2007  1416977   5169  
2  1136877条评论      南海出版公司  1.000  ¥24.99  2019  1136877    786  
3   482574条评论     天津人民出版社  1.000  ¥18.99  2020   482574    543  
4  2128286条评论       作家出版社  1.000   ¥4.99  2015  2128286   2339 '''

3.6获取子集

ac_son=ac[['书号','作者','价格','销售数量','已出版天数']]
print(ac_son)

'''输出结果如下:
     书号       作者    价格     销售数量  已出版天数
0     1   医路向前巍子  46.9   420636    390
1     2   阿兰德·丹姆  35.0  1416977   5169
2     3       塔拉  34.8  1136877    786
3     4  罗伯特·戴博德  26.0   482574    543
4     5      太宰治  20.0  2128286   2339
..   ..      ...   ...      ...    ...
105  51       未知  37.5  1280779   1811
106  52       未知  40.1   247441   1360
107  53       未知  35.0   433350   1669
108  54       未知  23.9    96616    934
109  55       未知  51.7    49997    328

[220 rows x 5 columns]'''

3.7 分组操作——gruopby

essay_num=a_12_son.groupby('作者')['书号'].count()#得出每一个作者出版的图书
print(list(essay_num))#输出每个作者作品的数量
print('------'6)
print(essay_num.index)#查看每个数量对应的作者
print('------'6)
print(len(essay_num),len(essay_num.index))#通过长度查看可以明确对应的数值准确
print('------'6)
'''输出结果如下:
[1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 55, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
------------------------------------
Index(['东野圭吾', '中国法制出版社', '乔安娜柯尔', '亚历克斯·麦克利兹', '伊林', '克里斯多福·孟', '克雷洛夫', '刘慈欣',
       '刘擎', '刘易斯·卡罗尔', '加西亚·马尔克斯', '医路向前巍子', '博多·舍费尔', '卡夫卡', '古斯塔夫·勒庞',
       '叶永烈', '哈珀·李', '圣埃克苏佩里', '埃·拉斯伯', '埃列娜·多丽', '塔尔莱特·赫里姆', '塔拉',
       '塞尔玛·拉格洛夫', '太宰治', '季羡林', '岸見一郎', '张嘉佳', '张嘉骅', '未知', '李诞',
       '歪歪兔关键期早教项目组', '毛姆', '水野雅登', '沙尼·金', '渡边淳一', '玖月晞', '珍·戈德温', '盖温·肯尼迪',
       '简·尼尔森', '罗伯特·戴博德', '莫里斯桑达克', '萧红', '许仲琳', '趣哥', '金伯莉·布雷恩', '钱穆',
       '阿兰德·丹姆', '陈磊', '项华', '马克·吐温', '马可.奥勒留', '马歇尔', '高野和明', '麦家'],
      dtype='object', name='作者')
------------------------------------
54 54
------------------------------------'''

3.8根据实际需要进行操作

a_12_son.销售数量=a_12_son['销售数量'].astype('int64')#将销售数量转换成整型
print(a_12_son.info())#输出查看类型转换
for i in range(len(ac_son.index)):
    #添加新列'平均日销量'
    a_12_son.loc[i,'平均日销量']=a_12_son.loc[i,'销售数量']/a_12_son.loc[i,'已出版天数']
print('------'*6)
print(a_12_son)#输出数据查看新列是否已添加
print('------'*6)
num_count=ac_son.groupby(['作者'])['平均日销量'].sum()#将每一个作者的平均日销售数量进行累加
print(num_count)#查看数据发现有未知这一行的数目
num_count=num_count.drop(index='未知')#删除未知这一异常数据
print('------'*6)
print(num_count)


'''以下为输出结果:

RangeIndex: 110 entries, 0 to 109
Data columns (total 5 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   书号      110 non-null    int64  
 1   作者      110 non-null    object 
 2   价格      110 non-null    float64
 3   销售数量    110 non-null    int64  
 4   已出版天数   110 non-null    int64  
dtypes: float64(1), int64(3), object(1)
memory usage: 4.4+ KB
None
------------------------------------
 书号       作者    价格     销售数量  已出版天数        平均日销量
0     1   医路向前巍子  46.9   420636    390  1078.553846
1     2   阿兰德·丹姆  35.0  1416977   5169   274.129812
2     3       塔拉  34.8  1136877    786  1446.408397
3     4  罗伯特·戴博德  26.0   482574    543   888.718232
4     5      太宰治  20.0  2128286   2339   909.912783
..   ..      ...   ...      ...    ...          ...
105  51       未知  37.5  1280779   1811   707.221977
106  52       未知  40.1   247441   1360   181.941912
107  53       未知  35.0   433350   1669   259.646495
108  54       未知  23.9    96616    934   103.443255
109  55       未知  51.7    49997    328   152.429878

[110 rows x 6 columns]
------------------------------------
作者
东野圭吾            4520.667500
中国法制出版社          884.359511
乔安娜柯尔           6505.007003
亚历克斯·麦克利兹       1184.757033
伊林               278.423012
克里斯多福·孟         1266.270000
克雷洛夫              60.426117
刘慈欣             3311.553748
刘擎               763.825073
刘易斯·卡罗尔          130.405104
加西亚·马尔克斯        4668.751244
医路向前巍子          4314.215385
博多·舍费尔          2419.835294
卡夫卡              271.917949
古斯塔夫·勒庞         1853.694118
叶永烈              656.844037
哈珀·李             904.415875
圣埃克苏佩里           512.471338
埃·拉斯伯            377.895020
埃列娜·多丽           397.585421
塔尔莱特·赫里姆          39.007854
塔拉              5785.633588
塞尔玛·拉格洛夫         167.470116
太宰治             3639.651133
季羡林             1474.914062
岸見一郎            2192.865356
张嘉佳             3594.935636
张嘉骅             1824.012132
未知             22847.772804
李诞               726.384858
歪歪兔关键期早教项目组      415.163571
毛姆              2828.887907
水野雅登            1231.689579
沙尼·金             553.150685
渡边淳一            1008.464605
玖月晞              253.602000
珍·戈德温            196.591029
盖温·肯尼迪           727.767647
简·尼尔森           3593.185629
罗伯特·戴博德         3554.869245
莫里斯桑达克           188.284268
萧红               198.030984
许仲琳               84.820879
趣哥              1318.038095
金伯莉·布雷恩         5198.003008
钱穆               413.773019
阿兰德·丹姆          1096.519249
陈磊              6334.933628
项华              1515.312500
马克·吐温            240.884393
马可.奥勒留            85.298011
马歇尔             2875.142622
高野和明             973.227723
麦家              2917.366497
Name: 平均日销量, dtype: float64
------------------------------------
作者
东野圭吾           4520.667500
中国法制出版社         884.359511
乔安娜柯尔          6505.007003
亚历克斯·麦克利兹      1184.757033
伊林              278.423012
克里斯多福·孟        1266.270000
克雷洛夫             60.426117
刘慈欣            3311.553748
刘擎              763.825073
刘易斯·卡罗尔         130.405104
加西亚·马尔克斯       4668.751244
医路向前巍子         4314.215385
博多·舍费尔         2419.835294
卡夫卡             271.917949
古斯塔夫·勒庞        1853.694118
叶永烈             656.844037
哈珀·李            904.415875
圣埃克苏佩里          512.471338
埃·拉斯伯           377.895020
埃列娜·多丽          397.585421
塔尔莱特·赫里姆         39.007854
塔拉             5785.633588
塞尔玛·拉格洛夫        167.470116
太宰治            3639.651133
季羡林            1474.914062
岸見一郎           2192.865356
张嘉佳            3594.935636
张嘉骅            1824.012132
李诞              726.384858
歪歪兔关键期早教项目组     415.163571
毛姆             2828.887907
水野雅登           1231.689579
沙尼·金            553.150685
渡边淳一           1008.464605
玖月晞             253.602000
珍·戈德温           196.591029
盖温·肯尼迪          727.767647
简·尼尔森          3593.185629
罗伯特·戴博德        3554.869245
莫里斯桑达克          188.284268
萧红              198.030984
许仲琳              84.820879
趣哥             1318.038095
金伯莉·布雷恩        5198.003008
钱穆              413.773019
阿兰德·丹姆         1096.519249
陈磊             6334.933628
项华             1515.312500
马克·吐温           240.884393
马可.奥勒留           85.298011
马歇尔            2875.142622
高野和明            973.227723
麦家             2917.366497
Name: 平均日销量, dtype: float64'''

4 数据可视化

在这里我选择了pyecharts来绘制图表,加入了区域缩放等配置项,

具体关于pyecharts的全局配置项的介绍大家可以参考

pyecharts的各个系列配置项设置示例——个人整理与分享_我就是一个小怪兽的博客-CSDN博客

from pyecharts.charts import Bar#导入Bar,绘制柱状图
from pyecharts import options as opts
from pyecharts.globals import ThemeType
bar=Bar(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION,bg_color='green'))
bar.add_xaxis(list(num_count.index)).add_yaxis('y',list(num_count),itemstyle_opts=opts.ItemStyleOpts(color='black'))    
bar.set_global_opts(title_opts=opts.TitleOpts(title='我就是一个小怪兽',subtitle='SSS'),
                   datazoom_opts=opts.DataZoomOpts(is_show=True,range_start=10,range_end=30,start_value='天津',end_value='大庆'))
bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
                    markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_='max',name='最大值')]),
                   markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_='min',name='最小值')]))

bar.render_notebook()#用于在jupyter notebook上显示创建的图标bar

使用Python、pandas、pyecharts进行数据分析——实例讲解_第1张图片

根据每个作者的日销售量我们可以大体看出每个作者的受欢迎程度,作者的书销售的越好,证明这个作者更受欢迎,现实中还可以获得更多的信息,以上仅为冰山一角,以上就是我目前学习到的数据分析的大体流程的一部分,希望对你有所借鉴

你可能感兴趣的:(数据可视化,python,pyecharts,python,数据分析,数据挖掘)