目录
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 数据可视化
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pyecharts.charts import Bar
以下数据从网络获取,仅供实验,可于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条评论'''
#将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'''
a_12=pd.concat([a_1,a_2],ignore_index=True)#对表进行连接
print(a_12.shape)
'''以下为输出结果:
(110, 9)'''
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'''
关于正则化匹配在下一个文章介绍,如若已经写出将会添加链接在此处
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 '''
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 '''
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]'''
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
------------------------------------'''
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'''
在这里我选择了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
根据每个作者的日销售量我们可以大体看出每个作者的受欢迎程度,作者的书销售的越好,证明这个作者更受欢迎,现实中还可以获得更多的信息,以上仅为冰山一角,以上就是我目前学习到的数据分析的大体流程的一部分,希望对你有所借鉴