知识点回顾
需求描述
如上数据有问题如下:
• 索引无序
• 单价中包含各种各样单位
所以需求如下:
• 读取数据 重置索引
• 将单价列取出 整数 或 浮点数 并转为可计算类型
• 将评分列进行降序
• 直观体现评分数据主要分布在哪个区间
• 直观体现单价与评分的分布
• 取出评分前100条数据 直观体现不同出版社的出书次数
相关文件内容
代码实现
#!/user/bin/env python
#-*-coding: utf-8-*-
#@Time : 2020/9/21 002121:33
#@Author : GodSpeed
#@File : seaborn第一次作业20200921.py
#@Software : PyCharm
import numpy as np
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt
'''
如上数据有问题如下:
• 索引无序
• 单价中包含各种各样单位
所以需求如下:
• 读取数据 重置索引
• 将单价列取出 整数 或 浮点数 并转为可计算类型
• 将评分列进行降序
• 直观体现评分数据主要分布在哪个区间
• 直观体现单价与评分的分布
• 取出评分前100条数据 直观体现不同出版社的出书次数
'''
#Data analysis and processing
class Data_an_pro(object):
def __init__(self,file_name):
self.file_name = file_name
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)
# 静态方法:被@staticmethod修饰的类方法
# 静态方法一般都作为工具方法调用,与当前类没有关联,但与普通的函数不同的是,
# 静态方法的调用必须用类或类的实例进行调用
@staticmethod
def judge_pro_duplicate(df):
'''
:param df: 被研究的对象,类型为DataFrame
:return: 返回处理后的DataFrame
'''
# 判断数据是否存在nan
if df.duplicated ().values.any ():
print ( '存在重复数据' )
return df.drop_duplicates ()
else:
print ( '不存在重复数据' )
return df
#判断是否存在缺失值
@staticmethod
def judge_pro_NaN_fun(df):
'''
:param df: 被研究的对象,类型为DataFrame
:return: 返回处理后的DataFrame
'''
# 判断数据是否存在nan
if df.isnull().values.any():
#print('存在nan数据')
#打印nan所在的行
#print(df[df.isnull().values == True])
# 删除重复数据
return df.dropna () # 删除包含NaN的行
else:
print('不存在nan数据')
return df
# 保留数字和小数点
@staticmethod
def keep_value(data):
'''
:param data: 待处理的数据
:return: 返回数据中包含数字和.的内容
'''
return "".join ( list ( filter ( lambda x: x in "0123456789.", data ) ) )
'''
需求:去字符串中匹配部分符合条件的子字符串
实现:
- 使用正则(re)
- pandas中Series每行字符串对接的正则方法:Series.str.extract(pattern)
- 提取 浮点数或者整数 pattern:数值.数值
- \d 匹配数值
- + 贪婪匹配(匹配多个符合条件的)
- \. 匹配出小数点
- () 分组
- | 或
'''
# 格式化数据,保留数字
@staticmethod
def data_format_pd_str_extract(df, key):
df_new = df
# bfill向后差补
df_new[key] = df[key].str.extract ( "(\d+\.\d+)|(\d+)" ).fillna ( axis=1, method="bfill" )
return df_new
# 格式化数据,保留数字
@staticmethod
def data_format_fun(df, key):
df_new = df
df_new[key] = df[key].apply ( Data_an_pro.keep_value ).astype(float)
return df_new
# 处理异常值,保留原始数据中含有dict_data中key对应的values值的内容
@staticmethod
def deal_exception_value(df, dict_data):
for key, values in dict_data.items ():
df_new = df[(df[key] == df[key]) & (df[key].str.contains ( values ))]
return df_new
# 读取和分析数据
# 类方法:
@classmethod
def read_analyze(self):
df = pd.read_excel ( "豆瓣读书.xlsx",index_col=0)
print(df.head())
print ( df.info() )
Data_an_pro.judge_pro_duplicate(df)#静态方法已经没有self了,不能在静态方法里面访问实例属性和实例方法,与类没有关系,只是寄存于类中的函数
Data_an_pro.judge_pro_NaN_fun(df)
return df
# 读取和数据清洗Read and data cleaning
# 类方法:
@classmethod
def read_data_cleaning(self):
df = pd.read_excel ( "豆瓣读书.xlsx",index_col=0)
print(df.head())
print ( df.info () )
df = Data_an_pro.judge_pro_duplicate(df)#静态方法已经没有self了,不能在静态方法里面访问实例属性和实例方法,与类没有关系,只是寄存于类中的函数
df = Data_an_pro.judge_pro_NaN_fun(df)
return df
# 整理数据
@property
def processing_data(self):
try:
df = Data_an_pro.read_analyze()
except OSError:
print ( f'没有找到文件或读取文件失败,请查看是否存在{self.file_name}文件' )
return
else:
print ( df.index )
# 重置索引
# df.reset_index ( inplace=True )
# drop=True删除已成为行索引的列数据
df.reset_index ( drop=True,inplace=True )
# 将单价列取出 整数 或 浮点数 并转为可计算类型
df = Data_an_pro.data_format_fun(df,"单价")
print(df["单价"],df["单价"].dtype)
#评分 412 non-null float64
#将评分列进行降序
df.sort_values(by="评分",ascending=False,inplace=True)
print(df.head)
#直观体现评分数据主要分布在哪个区间
sns.displot(df["评分"], kde=True, rug=True)
#直观体现单价与评分的分布
sns.jointplot(x="评分", y="单价", data=df, kind="reg")
#plt.show()
#取出评分前100条数据 直观体现不同出版社的出书次数
df_top100 = df.iloc[0:100,:]
print("===========df_top100=========",df_top100)
#前100条数据,直观体现不同出版社的出书次数
print(df_top100)
dff = df_top100.groupby(by="出版社").count()["书名"]
print(dff)
#sns.catplot(x="出版社",y="index",data=df_top100,kind="bar",estimator=sum)
#sns.catplot(x="出版社",data=df_top100,kind="bar",estimator=sum)
sns.catplot ( x="出版社", data=df_top100, kind="count", height=3 )
plt.xticks(rotation=90)
plt.show()
if __name__ == '__main__':
Data_an_pro = Data_an_pro("豆瓣读书.xlsx")
Data_an_pro.processing_data
df = Data_an_pro.read_analyze ()
df = Data_an_pro.data_format_pd_str_extract ( df, "单价" )
df["单价"].astype ( float )
print ( df.info () )
print ( df )
'''
<class 'pandas.core.frame.DataFrame'>
Int64Index: 412 entries, 0 to 4
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 书名 412 non-null object
1 作者名 412 non-null object
2 出版日期 412 non-null object
3 出版社 412 non-null object
4 单价 412 non-null object
5 翻译者 254 non-null object
6 评分 412 non-null float64
dtypes: float64(1), object(6)
memory usage: 25.8+ KB
None
书名 作者名 出版日期 出版社 单价 翻译者 评分
0 白夜行 [日] 东野圭吾 2013-1-1 南海出版公司 39.50 刘姿君 9.1
1 小王子 [法] 圣埃克苏佩里 2003-8 人民文学出版社 22.00 马振聘 9.0
2 解忧杂货店 [日] 东野圭吾 2014-5 南海出版公司 39.50 李盈春 8.5
3 追风筝的人 [美] 卡勒德·胡赛尼 2006-5 上海人民出版社 29.00 李继宏 8.9
4 百年孤独 [哥伦比亚] 加西亚·马尔克斯 2011-6 南海出版公司 39.50 范晔 9.2
.. ... ... ... ... ... ... ...
0 你好,旧时光 八月长安 2015-10 长江文艺出版社 86 NaN 8.5
1 余生,请多指教 柏林石匠 2016-10 百花洲文艺出版社 32.00 NaN 6.6
2 东宫 匪我思存 2010-07 新世界出版社 28.0 NaN 7.3
3 一个人张灯结彩 田耳 2017-9-1 作家出版社 38.00 NaN 7.5
4 1988:我想和这个世界谈谈 韩寒 2010-9 国际文化出版公司 25.00 NaN 7.9
[412 rows x 7 columns]
'''