• 20200303 pandas


    昨日内容

    1.数据分析的概述 将爬虫爬下来的数据,进行分析,以前使用的是R语言来进行分析,现在的使用Python中 的数据分析库 
    
    2.数据分析的应用 淘宝购物之后,商品推荐,会根据之前用户的浏览日志推荐相关的产品,用户画像 抖音(百度过来的推荐算法团队),快手的推荐算法,投喂 看电影,电影推荐等 
    
    3.数据分析的步骤 提出需求(产品经理或者leader提出) 收集数据爬虫爬取的数据或者掏钱买的 公司自己产生的各种数据 进行数据清洗 数据详细分析,得出结论,图表的形式展示结论 
    
    4.写代码的工具 以前使用的是pycharm,但是现在本次课程使用的是 jupyter 
    
    5.jupyter的安装 命令行安装和启动 (不推荐) pip3 install jupyter jupyter notebook 缺点是:需要额外的在进行安装numpy anaconda安装(推荐) 直接官网下载,傻瓜式安装 点击lunch按钮,直接启动 
    
    6.jupyternotebook的使用介绍 注意:notebook的文件后缀,是以 ipynb 结尾 
    
    7.jupyternotebook的快捷键
    两个模式: 编辑模式:光标闪动,颜色是绿色 命令模式:按esc,就能从编辑模式到命令行模式 常见的6个快捷键: 运行当前的代码:crtl + enter 运行当前的代码,并且运行完成之后自动的选择下一个单元格:shift+enter 删除当前单元格:切换到命令行模式,按dd直接删除 在当前单元格的上方添加一个单元格:切换到命令行模式,按a添加 在当前单元格的下方添加一个单元格:切换到命令行模式,按b添加 切换代码模式到标记模式:切换到命令模式,按m进行切换 如果命令不够,可以去键盘处打开命令配置查看 
    
    8.numpy的介绍 核心数据结构是:ndarray 
    
    9.numpy的基本属性 dtype: 数据类型 ndim:数组维度 shape:数组维度,以元组的形式展示 T:转置 (对高维数组而言) 
        
    10.numpy数组的创建方式 np.array([1,2,3,3,4]) np.arange() np.linspace() np.linspace? #### 查看函数的使用方法 np.zeros(5) np.ones(5) 
    
    11.数组的索引 一维数组索引 和python的列表用法是一样,都是从0开始 二维数组索引 存在行索引和列索引,需要逗号进行分割,逗号前面是行索引,后面是列索引 布尔型索引 数组可以把布尔值当成索引,来获取对应的值 
    
    12.数组的切片 一维数组切片 和Python中的列表的切片一样,也都是从0开始,前包后不包 二维数组的切片 存在行索引,和列索引,需要逗号进行分割,逗号前面是行切片,后面是列切片
    
    13.通用函数 abs() : 绝对值 ceil(): 向上取整 ceil(4.3) ===> 5 floor():向下取整 floor(5.7) ===> 5 rint() : 四舍五入 rint(3.4) ====>3 sum(): 求和 cumsum() max() min() 
                    
    14.随机数函数 np.random.rand() np.random.randint() np.random.shuffle() 15.向量运算和矢量运算
    

    pandas

    简介

    pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。

    数据结构

    Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。Series如今能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。

    Time- Series:以时间为索引的Series。

    DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。

    Panel :三维的数组,可以理解为DataFrame的容器。

    Panel4D:是像Panel一样的4维数据容器。

    PanelND:拥有factory集合,可以创建像Panel4D一样N维命名容器的模块。

    安装

    pip install pandas
    

    使用

    import pandas as pd
    import numpy as np
    

    Series 四种定义方式

    s1 = pd.Series([2,3,4,5,6])
    
    s1
    
    0    2
    1    3
    2    4
    3    5
    4    6
    dtype: int64
    
    s2 = pd.Series([2,3,4,5,6],index=['a','b','c','d','e'])
    
    s2
    
    a    2
    b    3
    c    4
    d    5
    e    6
    dtype: int64
    
    s1[1]
    
    3
    
    s2['b']
    
    3
    
    s2[2]    # 数字型索引和自定义索引是共存的
    
    4
    
    a3 = pd.Series({'a':2,'b':2})
    
    a3
    
    a    2
    b    2
    dtype: int64
    
    s4 = pd.Series(0,index=['a','b','c'])
    
    s4
    
    a    0
    b    0
    c    0
    dtype: int64
    

    Series的特性

    pd.Series(np.array([1,2,3,4,5]))
    
    0    1
    1    2
    2    3
    3    4
    4    5
    dtype: int32
    

    矢量运算

    s1 * 2
    
    0     4
    1     6
    2     8
    3    10
    4    12
    dtype: int64
    
    s1
    
    0    2
    1    3
    2    4
    3    5
    4    6
    dtype: int64
    

    布尔型索引

    s1[s1>4]
    
    3    5
    4    6
    dtype: int64
    

    通用函数

    abs(s1)
    
    0    2
    1    3
    2    4
    3    5
    4    6
    dtype: int64
    
    sum(s1)
    
    20
    
    # 适用于numpy
    

    缺失值数据的处理

    st = pd.Series({'sean':12,'yang':15,'cloud':20,'bella':23})
    
    st   # 得到一个Series
    
    sean     12
    yang     15
    cloud    20
    bella    23
    dtype: int64
    
    
    
    obj1 = pd.Series(st,index=['sean','yang','cloud','rocky'])
    obj1
    
    sean     12.0
    yang     15.0
    cloud    20.0
    rocky     NaN
    dtype: float64
    

    NAN

    # NaN 即是所谓的缺失值
    

    1.为啥值得类型从整型变为了浮点型

    因为NaN是浮点数类型,其他值兼容,会强制变为浮点型
    
    type(np.nan)
    
    float
    

    2.nan等于谁

    np.nan == np.nan
    
    False
    

    3.填充nan

    obj1.fillna(0)
    
    sean     12.0
    yang     15.0
    cloud    20.0
    rocky     0.0
    dtype: float64
    
    obj1   # 拷贝一份,填充
    
    sean     12.0
    yang     15.0
    cloud    20.0
    rocky     NaN
    dtype: float64
    

    4.删除nan所在的行

    obj1.dropna()
    
    sean     12.0
    yang     15.0
    cloud    20.0
    dtype: float64
    
    obj1    # 拷贝了一份删除,但是原obj没有更改
    
    sean     12.0
    yang     15.0
    cloud    20.0
    rocky     NaN
    dtype: float64
    
    obj1.dropna(inplace=True)   # inplace=True 在对象本身进行操作
    obj1
    
    sean     12.0
    yang     15.0
    cloud    20.0
    dtype: float64
    

    运算

    两个Series的运算

    ### 向量运算
    
    s4 = pd.Series({'height':170,'age':18,'salary':2000})
    s4
    
    height     170
    age         18
    salary    2000
    dtype: int64
    
    s5 = pd.Series({'height':110,'age':20,'salary':2367})
    s5
    
    height     110
    age         20
    salary    2367
    dtype: int64
    
    s4 + s5   # 索引所对应的值进行加减乘除
    
    height     280
    age         38
    salary    4367
    dtype: int64
    

    两个键值都会缺失

    s6 = pd.Series({'name':110,'age':20,'salary':2367})
    s6
    
    name       110
    age         20
    salary    2367
    dtype: int64
    
    s4
    
    height     170
    age         18
    salary    2000
    dtype: int64
    
    s4 + s6
    
    age         38.0
    height       NaN
    name         NaN
    salary    4367.0
    dtype: float64
    

    Series索引

    s1
    
    0    2
    1    3
    2    4
    3    5
    4    6
    dtype: int64
    

    花式索引

    # 中括号中套中括号,内层括号中写索引下标
    
    # 获取246 三个值
    
    s1[[0,2,4]]
    
    0    2
    2    4
    4    6
    dtype: int64
    
    arr = np.array([1,2,3,4,5])
    
    arr[[0,3,2]]
    
    array([1, 4, 3])
    

    整数索引

    sr = pd.Series(np.arange(10))
    sr
    
    0    0
    1    1
    2    2
    3    3
    4    4
    5    5
    6    6
    7    7
    8    8
    9    9
    dtype: int32
    
    sr1 = sr[3:].copy()
    sr1
    
    3    3
    4    4
    5    5
    6    6
    7    7
    8    8
    9    9
    dtype: int32
    
    # 想要获取值为3   不能直接索引取值了
    
    sr1.iloc[0]   # iloc == index + location   以索引下标取值
    
    3
    
    sr1.loc[6]     # 以标签取值
    
    6
    

    DataFrame

    DataFrame 是一个表个性的数据结构,相当于一个二维数组,含有一组有序的列.他可以看做成由Series组成的字典,并且共用一个索引

    df = pd.DataFrame({'one':[1,2,3,4],'two':[5,6,7,8]})
    df
    

    创建方式

    one two
    0 1 5
    1 2 6
    2 3 7
    3 4 8
    df['two']
    
    0    5
    1    6
    2    7
    3    8
    Name: two, dtype: int64
    
    df['one'].iloc[3]    # 先获取列,在获取行
    
    4
    

    DataFrame常见的属性

    df.index   # 获取行索引
    
    RangeIndex(start=0, stop=4, step=1)
    
    df.columns  # 获取列索引
    
    Index(['one', 'two'], dtype='object')
    
    df.T    # 转置,行变列
    
    0 1 2 3
    one 1 2 3 4
    two 5 6 7 8
    df.values    # 获取值
    
    array([[1, 5],
           [2, 6],
           [3, 7],
           [4, 8]], dtype=int64)
    
    df
    
    one two
    0 1 5
    1 2 6
    2 3 7
    3 4 8
    df.describe()   # 展示DataFrame表格的属性
    
    one two
    count 4.000000 4.000000
    mean 2.500000 6.500000
    std 1.290994 1.290994
    min 1.000000 5.000000
    25% 1.750000 5.750000
    50% 2.500000 6.500000
    75% 3.250000 7.250000
    max 4.000000 8.000000
    df['one'][0]
    
    1
    

    企业中处理数据的方式

    使用

    1.别的同事会给你一个excel文件或csv文件
    2.使用pandas读取csv文件
    

    打开读取文件

    movies = pd.read_csv('./douban_movie.csv')
    

    文件操作处理

    movies.index   # 查看文件信息
    
    RangeIndex(start=0, stop=38735, step=1)
    

    ​ 获取索引名(表头)

    movies.columns	
    
    Index(['名字', '投票人数', '类型', '产地', '上映时间', '时长', '年代', '评分', '首映地点'], dtype='object')
    

    修改表头

    import numpy as np
    import pandas as pd
    from pandas import Series, DataFrame
    
    使用rename方法(推荐)
    DataFrame.rename(mapper = None,index = None,columns = None,axis = None,copy = True,inplace = False,level = None )
    
    
    mapper,index,columns:可以任选其一使用,可以是将index和columns结合使用。index和column直接传入mapper或者字典的形式。
    
    df1.index = Series(['beijing', 'shanghai', 'guangzhou'])
    
    
    home_info.columns = Series(['地址','结构','朝向','楼层','大小','户型','装修风格','总价/万','名称','单价_万/平方'])
    
    

    获取数据

    movies.values
    

    获取数据的大概简介

    movies.describe()    
    

    数据另存为文件

    movies.to_csv('./文件.csv',index=False)    # 添加 index = False  不添加索引到文件中
    
    # 默认显示前5行  传入参数控制
    movies.head()
    
    # 默认显示后5行  传入参数控制
    movies.tail()
    

    高级操作之分组

    read_html

    相当于指定的爬虫,会获取网页中的所有的表格数据

    # 读取某一url网页的下面的所有的表格数据
    res = pd.read_html('https://baike.baidu.com/item/NBA%E6%80%BB%E5%86%A0%E5%86%9B/2173192?fr=aladdin')
    
    champion_res = res[0]  # 获取的是列表,直接取值获取第一个元素
    
    champion_res
    
    0 1 2 3 4 5
    0 年份 比赛日期 冠军 总比分 亚军 FMVP
    1 1947 4.16-4.22 费城勇士队 4-1 芝加哥牡鹿队
    2 1948 4.10-4.21 巴尔的摩子弹队 4-2 费城勇士队
    3 1949 4.4-4.13 明尼阿波利斯湖人队 4-2 华盛顿国会队
    4 1950 4.8-4.23 明尼阿波利斯湖人队 4-2 塞拉库斯民族队
    ... ... ... ... ... ... ...
    69 2015 6.5-6.17 金州勇士队 4-2 克里夫兰骑士队 安德烈·伊戈达拉
    70 2016 6.3-6.20 克里夫兰骑士队 4-3 金州勇士队 勒布朗·詹姆斯
    71 2017 6.2-6.13 金州勇士队 4-1 克利夫兰骑士队 凯文·杜兰特
    72 2018 6.1-6.9 金州勇士队 4-0 克利夫兰骑士队 凯文·杜兰特
    73 2019 5.31-6.14 多伦多猛龙队 4-2 金州勇士队 科怀·伦纳德

    74 rows × 6 columns

    改变

    将第一行数据变为列名

    champion_res.iloc[0]   # 获取第一行的数据
    
    0      年份
    1    比赛日期
    2      冠军
    3     总比分
    4      亚军
    5    FMVP
    Name: 0, dtype: object
    
    champion_res.columns = champion_res.iloc[0]    #直接赋值给列名
    
    champion_res
    
    年份 比赛日期 冠军 总比分 亚军 FMVP
    0 年份 比赛日期 冠军 总比分 亚军 FMVP
    1 1947 4.16-4.22 费城勇士队 4-1 芝加哥牡鹿队
    2 1948 4.10-4.21 巴尔的摩子弹队 4-2 费城勇士队
    3 1949 4.4-4.13 明尼阿波利斯湖人队 4-2 华盛顿国会队
    4 1950 4.8-4.23 明尼阿波利斯湖人队 4-2 塞拉库斯民族队
    ... ... ... ... ... ... ...
    69 2015 6.5-6.17 金州勇士队 4-2 克里夫兰骑士队 安德烈·伊戈达拉
    70 2016 6.3-6.20 克里夫兰骑士队 4-3 金州勇士队 勒布朗·詹姆斯
    71 2017 6.2-6.13 金州勇士队 4-1 克利夫兰骑士队 凯文·杜兰特
    72 2018 6.1-6.9 金州勇士队 4-0 克利夫兰骑士队 凯文·杜兰特
    73 2019 5.31-6.14 多伦多猛龙队 4-2 金州勇士队 科怀·伦纳德

    74 rows × 6 columns

    删除

    2.需要将第一行数据删除

    champion_res.drop([0],inplace=True)    # 删除多行或一行,inplace=True直接原对象删除
    
    champion_res
    
    年份 比赛日期 冠军 总比分 亚军 FMVP
    1 1947 4.16-4.22 费城勇士队 4-1 芝加哥牡鹿队
    2 1948 4.10-4.21 巴尔的摩子弹队 4-2 费城勇士队
    3 1949 4.4-4.13 明尼阿波利斯湖人队 4-2 华盛顿国会队
    4 1950 4.8-4.23 明尼阿波利斯湖人队 4-2 塞拉库斯民族队
    5 1951 4.7-4.21 罗切斯特皇家队 4-3 纽约尼克斯队
    ... ... ... ... ... ... ...
    69 2015 6.5-6.17 金州勇士队 4-2 克里夫兰骑士队 安德烈·伊戈达拉
    70 2016 6.3-6.20 克里夫兰骑士队 4-3 金州勇士队 勒布朗·詹姆斯
    71 2017 6.2-6.13 金州勇士队 4-1 克利夫兰骑士队 凯文·杜兰特
    72 2018 6.1-6.9 金州勇士队 4-0 克利夫兰骑士队 凯文·杜兰特
    73 2019 5.31-6.14 多伦多猛龙队 4-2 金州勇士队 科怀·伦纳德

    73 rows × 6 columns

    1.每个队获取冠军的次数

    查询

    # 对冠军球队进行分组   MySQL :  group by 分组对象
    champion_res.groupby('冠军').groups
    
    {'休斯顿火箭队': Int64Index([48, 49], dtype='int64'),
     '克里夫兰骑士队': Int64Index([70], dtype='int64'),
     '华盛顿子弹队': Int64Index([32], dtype='int64'),
     '圣安东尼奥马刺队': Int64Index([53, 57, 59, 61, 68], dtype='int64'),
     '圣路易斯老鹰队': Int64Index([12], dtype='int64'),
     '塞拉库斯民族队': Int64Index([9], dtype='int64'),
     '多伦多猛龙队': Int64Index([73], dtype='int64'),
     '密尔沃基雄鹿队': Int64Index([25], dtype='int64'),
     '巴尔的摩子弹队': Int64Index([2], dtype='int64'),
     '底特律活塞队': Int64Index([43, 44, 58], dtype='int64'),
     '明尼阿波利斯湖人队': Int64Index([3, 4, 6, 7, 8], dtype='int64'),
     '波士顿凯尔特人队': Int64Index([11, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 28, 30, 35, 38, 40,
                 62],
                dtype='int64'),
     '波特兰开拓者队': Int64Index([31], dtype='int64'),
     '洛杉矶湖人队': Int64Index([26, 34, 36, 39, 41, 42, 54, 55, 56, 63, 64], dtype='int64'),
     '纽约尼克斯队': Int64Index([24, 27], dtype='int64'),
     '罗切斯特皇家队': Int64Index([5], dtype='int64'),
     '芝加哥公牛队': Int64Index([45, 46, 47, 50, 51, 52], dtype='int64'),
     '西雅图超音速队': Int64Index([33], dtype='int64'),
     '费城76人队': Int64Index([21, 37], dtype='int64'),
     '费城勇士队': Int64Index([1, 10], dtype='int64'),
     '达拉斯小牛队': Int64Index([65], dtype='int64'),
     '迈阿密热火队': Int64Index([60, 66, 67], dtype='int64'),
     '金州勇士队': Int64Index([29, 69, 71, 72], dtype='int64')}
    

    聚合

    对数据进行聚合

    champion_res.groupby('冠军').size()
    
    冠军
    休斯顿火箭队        2
    克里夫兰骑士队       1
    华盛顿子弹队        1
    圣安东尼奥马刺队      5
    圣路易斯老鹰队       1
    塞拉库斯民族队       1
    多伦多猛龙队        1
    密尔沃基雄鹿队       1
    巴尔的摩子弹队       1
    底特律活塞队        3
    明尼阿波利斯湖人队     5
    波士顿凯尔特人队     17
    波特兰开拓者队       1
    洛杉矶湖人队       11
    纽约尼克斯队        2
    罗切斯特皇家队       1
    芝加哥公牛队        6
    西雅图超音速队       1
    费城76人队        2
    费城勇士队         2
    达拉斯小牛队        1
    迈阿密热火队        3
    金州勇士队         4
    dtype: int64
    

    排序

    champion_res.groupby('冠军').size().sort_values(ascending=False)   # 默认是升序排列
    
    冠军
    波士顿凯尔特人队     17
    洛杉矶湖人队       11
    芝加哥公牛队        6
    圣安东尼奥马刺队      5
    明尼阿波利斯湖人队     5
    金州勇士队         4
    迈阿密热火队        3
    底特律活塞队        3
    休斯顿火箭队        2
    纽约尼克斯队        2
    费城76人队        2
    费城勇士队         2
    塞拉库斯民族队       1
    克里夫兰骑士队       1
    华盛顿子弹队        1
    达拉斯小牛队        1
    圣路易斯老鹰队       1
    西雅图超音速队       1
    多伦多猛龙队        1
    密尔沃基雄鹿队       1
    罗切斯特皇家队       1
    波特兰开拓者队       1
    巴尔的摩子弹队       1
    dtype: int64
    

    matolotlib

    Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。 它也可以和图形工具包一起使用,如 PyQt 和 wxPython。

    导入

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    

    使用

    x = [5,7,2,10]
    plt.plot(x)   # 画折线图,传入一个值得话,这个值就是y轴
    plt.show()
    
    x = [5,7,2,10]
    y = [12,2,4,20]
    
    # 更改画布大小
    plt.figure(figsize=(10,6))   
    
    
    
    # 添加说明
    plt.title('这是一个标图说明',fontsize=20,color='blue')   # 标题
    plt.xlabel('x',fontsize=15,color='red')   # x轴的说明
    plt.ylabel('y',fontsize=20,color='red')   # y轴的说明
    
    
    plt.plot(x,y)   
    plt.show()
    
    

    中文显示

    Matplotlib 默认情况不支持中文,我们可以使用以下简单的方法来解决:

    首先下载字体(注意系统):https://www.fontpalace.com/font-details/SimHei/

  • 相关阅读:
    降低大气分
    99999
    88888
    77777
    HandlerThread实现原理
    Android 内存泄漏总结
    Handler实现机制,同步屏障,IdleHandler
    launcher 配置
    微信小程序 上传图片七牛
    微信小程序 跳转传参数 传对象
  • 原文地址:https://www.cnblogs.com/fwzzz/p/12460466.html
Copyright © 2020-2023  润新知