seaborn第一次作业20200921

知识点回顾

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

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

需求描述

如上数据有问题如下:
• 索引无序
• 单价中包含各种各样单位
所以需求如下:
• 读取数据 重置索引
• 将单价列取出 整数 或 浮点数 并转为可计算类型
• 将评分列进行降序
• 直观体现评分数据主要分布在哪个区间
• 直观体现单价与评分的分布
• 取出评分前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]
    
    '''

结果

直观体现评分数据主要分布在哪个区间

在这里插入图片描述

直观体现单价与评分的分布

在这里插入图片描述

前100条数据,直观体现不同出版社的出书次数

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Narutolxy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值