zoukankan      html  css  js  c++  java
  • 第三周:描述性统计-实践

    python环境安装

    过于基础,此处就不细写了,可参考:https://www.runoob.com/python/python-install.html

    Python基本数据类型

    可变、不可变数据类型

    可变数据类型
        列表、字典、集合--不可哈希
        集合里存的元素必须是不可变的数据类型,无序,不重复(去重)
    不可变数据类型
        元组、数字、字符串--可哈希

    字符串

    字符串是 Python 中最常用的数据类型。我们可以使用引号('或")来创建字符串。创建字符串很简单,只要为变量分配一个值即可

    'strs'.capitalize()        #首字母大写
    'strs'.title()             #每个单词首字母大写
    'strs'.upper()             #每个字母变为大写
    'strs'.lower()             #每个字母变为小写
    'strs'.swapcase()          #大小写互换
    'strs'.count()             #计算指定字符串或字符出现的次数
    'strs'.find()              #根据指定的字符获取该字符在字符串中第一次出现的索引位置(找不到索引返回-1)
    'strs'.index()             #根据指定的字符获取该字符在字符串中第一次出现的索引位置(找不到索引返回一个异常错误)
    'strs'.startswith()        #检测字符串是否以指定字符开头
    'strs'.endswith()          #检测字符串是否以指定字符结尾
    'strs'.isupper()           #检测字符串是否都为大写字母
    'strs'.islower()           #检测字符串是否都为小写字母
    'strs'.istitle()           #检测字符串是否都为单词首字母大写
    'strs'.isalnum()           #检测字符串是否只由字母和数字字符组成
    'strs'.isalpha()           #检测字符串是否只由字母字符(含中文字符)组成
    'strs'.isdigit()           #检测字符串是否只由十进制数字字符组成
    'strs'.isnumeric()         #检测字符串是否以数字字符组成
    'strs'.isdecimal()         #检测字符串是否以数字字符组成
    'strs'.isspace()           #检测字符串是否由空白字符组成
    'strs'.split()             #使用指定字符,将字符串进行切割并装入列表
    'strs'.splitlines()        #使用回车字符,切割字符串并装入列表中
    'strs'.join(['a','b','c']) #将容器中的字符串使用指定字符拼接成一个字符串
    'strs'.zfill()             #使用0填充字符串,参数为填充后的总位数
    'strs'.center()            #用指定字符,将字符串居中填充到指定长度,参数(长度,使用的字符)
    'strs'.ljust()             #用指定字符,将字符串左对齐填充到指定长度,参数(长度,使用的字符)
    'strs'.rjust()             #用指定字符,将字符串右对齐填充到指定长度,参数(长度,使用的字符)
    'strs'.strip()             #去掉字符串中,两侧指定重复的字符(如果不指定字符,则删除空格)
    'strs'.lstrip()            #去掉字符串中,左侧指定重复的字符(如果不指定字符,则删除空格)
    'strs'.rjust()             #去掉字符串中,右侧指定重复的字符(如果不指定字符,则删除空格)
    #替换字符串中的字符
    'strs'.maketrans()         #制作字典
    'strs'.translate()         #使用字典替换
    #exampel
    var = 'wiz good guy,wiz super cool'
    flag = ''.maketrans('wiz','wwr')
    res = var.translate(flag)
    字符串内建函数

    字典

    字典中的每个元素都有一个名字,这个名字叫键(key)。

    字典(也叫散列表)是Python中唯一内建的映射类型。

    字典的键可以是数字、字符串或者是元组,键必须唯一

    在Python中,数字、字符串和元组都被设计成不可变类型,而常见的列表以及集合(set)都是可变的,所以列表和集合不能作为字典的键。

    键可以为任何不可变类型,这正是Python中的字典最强大的地方。

    函数

    说明

    D

    代表字典对象

    D.clear()

    清空字典

    D.pop(key)

    移除键,同时返回此键所对应的值

    D.copy()

    返回字典D的副本,只复制一层(浅拷贝)

    D.update(D2)

    将字典 D2 合并到D中,如果键相同,则此键的值取D2的值作为新值

    D.get(key, default)

    返回键key所对应的值,如果没有此键,则返回default

    D.keys()

    返回可迭代的 dict_keys 集合对象

    D.values()

    返回可迭代的 dict_values 值对象

    D.items()

    返回可迭代的 dict_items 对象

    集合

    集合(Set)在Python 2.3引入,通常使用较新版Python可直接创建,如下所示:

    strs=set(['jeff','wong','cnblogs'])
    nums=set(range(10))

    看上去,集合就是由序列(或者其他可迭代的对象)构建的。

    集合的几个重要特点和方法如下(S 为集合对象):

    方法

    意义

    S.add(e)

    在集合中添加一个新的元素e;如果元素已经存在,则不添加

    S.remove(e)

    从集合中删除一个元素,如果元素不存在于集合中,则会产生一个KeyError错误

    S.discard(e)

    从集合S中移除一个元素e,在元素e不存在时什么都不做;

    S.clear()

    清空集合内的所有元素

    S.copy()

    将集合进行一次浅拷贝

    S.pop()

    从集合S中删除一个随机元素;如果此集合为空,则引发KeyError异常

    S.update(s2)

    用 S与s2得到的全集更新变量S

    S.difference(s2)

    用S - s2 运算,返回存在于在S中,但不在s2中的所有元素的集合

    S.difference_update(s2)

    等同于 S = S - s2

    S.intersection(s2)

    等同于 S & s2

    S.intersection_update(s2)

    等同于S = S & s2

    S.isdisjoint(s2)

    如果S与s2交集为空返回True,非空则返回False

    S.issubset(s2)

    如果S与s2交集为非空返回True,空则返回False

    S.issuperset(...)

    如果S为s2的子集返回True,否则返回False

    S.symmetric_difference(s2)

    返回对称补集,等同于 S ^ s2

    S.symmetric_difference_update(s2)

    用 S 与 s2 的对称补集更新 S

    S.union(s2)

    生成 S 与 s2的全集

    列表

    列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能。

    列表操作包含以下函数:

    cmp(list1, list2):比较两个列表的元素
    len(list):列表元素个数
    max(list):返回列表元素最大值
    min(list):返回列表元素最小值
    list(seq):将元组转换为列表
    View Code

    列表操作包含以下方法:

    list.append(obj):在列表末尾添加新的对象
    list.count(obj):统计某个元素在列表中出现的次数
    list.extend(seq):在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
    list.index(obj):从列表中找出某个值第一个匹配项的索引位置
    list.insert(index, obj):将对象插入列表
    list.pop(obj=list[-1]):移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
    list.remove(obj):移除列表中某个值的第一个匹配项
    list.reverse():反向列表中元素
    list.sort([func]):对原列表进行排序
    View Code

    copy()与deepcopy()的区别:

    对于不可变的对象来说(数字,字符串,元组),深浅拷贝没有区别
    深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。 
    
    等于赋值,并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。
    
    浅复制要分两种情况进行讨论:
    1)当浅复制的值是不可变对象(数值,字符串,元组)时和“等于赋值”的情况一样,对象的id值与浅复制原来的值相同。
    2)当浅复制的值是可变对象(列表和元组)时会产生一个“不是那么独立的对象”存在。有两种情况:
    
    第一种情况:复制的对象中无复杂子对象,原来值的改变并不会影响浅复制的值,同时浅复制的值改变也并不会影响原来的值。
    原来值的id值与浅复制原来的值不同。
    第二种情况:复制的对象中有 复杂 子对象 (例如列表中的一个子元素是一个列表),如果不改变其中复杂子对象,
    浅复制的值改变并不会影响原来的值。 但是改变原来的值 中的复杂子对象的值 会影响浅复制的值。
    深浅cpoy区别

    元组

    Python的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

    元组操作包含以下函数:

    cmp(list1, list2):比较两个元组的元素
    len(list):元组元素个数
    max(list):返回元组元素最大值
    min(list):返回元组元素最小值
    tuple(seq):将列表转换为元组
    View Code

    修改元组:

    元组中的元素值是不允许修改的,但我们可以对元组进行连接组合,如下实例:
    
    tup1 = (12, 34.56)
    tup2 = ('abc', 'xyz')
     
    # 以下修改元组元素操作是非法的。
    # tup1[0] = 100
     
    # 创建一个新的元组
    tup3 = tup1 + tup2
    print(tup3)
    View Code

    删除元组:

    元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组
    
    注意:只含一个值的元组,必须加个逗号(,);

    栈、队列

    堆栈:先进后出
    队列:先进先出 FIFO

    from collections import namedtuple
    Point=namedtuple('point', ['x','y'])
    p=Point(1,2)
    print(p.x) #1
    print(p.y) #2
    print(p) #point(x=1,y=2)
    namedTuple(typename, fields)
    队列:先进先出
    
    import queue
    Q=queue.Queue()
    Q.put(10)
    Q.put(5)
    Q.put(6)
    print(Q) #<queue.Queue object at 0x0000000001DCA198>
    print(Q.get())
    print(Q.get())
    print(Q.get())
    print(Q.get()) #阻塞
    print(Q.qsize()) #查看大小
    deque([iterable[, maxlen]])
    from collections import deque
    q=deque([1,2])
    q.append('a')#从后面放数据
    q.appendleft('b')#从前面放数据
    q.insert(1,3)
    print(q.pop())#从后面取数据 #a
    print(q.popleft())#从前面取数据 #b
    print(q) #deque([3, 1, 2])
    双端队列,可以快速的从另外一侧追加和推出对象

    Python基本语法

    控制语句

    条件语句

    while循环

    for循环

    break

    continue

    函数

    python函数

    文件读写

    参考廖大的教程:文件读写

    pandas|numpy环境安装

    python终端下,执行:

    pip install pandas # 安装pandas
    pip install numpy  # 安装numpy

    【强烈推荐使用Anaconda:anaconda安装步骤  (anaconda是个集成式的工具包,能一站式的完成你工作学习所需的大部分文件安装)】

    pandas数据结构

    Seriers

    一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。注意:Series中的索引值是可以重复的。

    Seriers的创建

    使用列表生成Seriers:

    import numpy as np
    import pandas as pd
    
    # 使用一个列表生成一个Series
    s1 = pd.Series([1, 2, 3, 4])
    print(s1)
    '''
    0    1
    1    2
    2    3
    3    4
    dtype: int64
    '''
    # 返回所有的索引
    print(s1.index)
    '''
    RangeIndex(start=0, stop=4, step=1)
    '''
    View Code

    使用数组生成Seriers:

    import numpy as np
    import pandas as pd
    
    # 使用数组生成一个Series
    s2  = pd.Series(np.arange(7))
    print(s2)
    '''
    0    0
    1    1
    2    2
    3    3
    4    4
    5    5
    6    6
    dtype: int64
    '''
    View Code

    使用字典生成Seriers:

    # 使用一个字典生成Series,其中字典的键,就是索引
    s3 = pd.Series({'1':1, '2':2, '3':3})
    print(s3)
    print(s3.values)
    print(s3.index)
    '''
    1    1
    2    2
    3    3
    dtype: int64
    [1 2 3]
    Index(['1', '2', '3'], dtype='object')
    '''
    View Code

    Seriers基本操作

    #series
    #操作的基本技巧:数据查看 / 重新索引 / 对齐 / 添加、修改、删除值
    
    # 数据查看
    s = pd.Series(np.random.rand(50))
    print(s.head(10))
    print(s.tail())
    
    # 重新索引reindex
    # .reindex将会根据索引重新排序,如果当前索引不存在,则引入缺失值
    s = pd.Series(np.random.rand(3), index = ['a','b','c'])
    print(s)
    s1 = s.reindex(['c','b','a','d'])
    print(s1)
    # .reindex()中也是写列表
    # 这里'd'索引不存在,所以值为NaN
    
    s2 = s.reindex(['c','b','a','d'], fill_value = 0)
    print(s2)
    # fill_value参数:填充缺失值的值
    
    # 删除:.drop
    s = pd.Series(np.random.rand(5), index = list('ngjur'))
    print(s)
    s1 = s.drop('n')
    s2 = s.drop(['g','j'])
    
    # 添加:
    # 直接通过下标索引/标签index添加值
    s2 = pd.Series(np.random.rand(5), index = list('ngjur'))
    s2['a'] = 100
    
    s1 = pd.Series(np.random.rand(5))
    s1[5] = 100
    
    # 通过.append方法,直接添加一个数组
    s3 = s1.append(s2)
    # .append方法生成一个新的数组,不改变之前的数组
    
    # 修改
    s = pd.Series(np.random.rand(3), index = ['a','b','c'])
    print(s)
    s['a'] = 100
    s[['b','c']] = 200
    print(s)
    # 通过索引直接修改,类似序列
    Seriers基本操作

    Dataframe

    一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。

    Dataframe的创建

    包含列表的字典创建:

    data = {'水果':['苹果','','草莓'],
           '数量':[3,2,5],
           '价格':[10,9,8]}
    df = DataFrame(data)
    print(df)
       价格  数量  水果
    0  10   3  苹果
    1   9   22   8   5  草莓

    嵌套字典创建:

    data = {'数量':{'苹果':3,'':2,'草莓':5},
           '价格':{'苹果':10,'':9,'草莓':8}}
    df = DataFrame(data)
    print(df)
    
    
        价格  数量
    梨    9   2
    苹果  10   3
    草莓   8   5

    包含Series的字典创建

    data = {'水果':Series(['苹果','','草莓']),
           '数量':Series([3,2,5]),
           '价格':Series([10,9,8])}
    df = DataFrame(data)
    print(df)
    
    
       价格  数量  水果
    0  10   3  苹果
    1   9   22   8   5  草莓

    Dataframe基本操作

    #dataframe
    #数据查看、转置 / 添加、修改、删除值 / 对齐 / 排序
    
    # 数据查看、转置 同series
    df = pd.DataFrame(np.random.rand(16).reshape(8,2)*100,
                       columns = ['a','b'])
    print(df.head(2))
    print(df.tail())
    
    print(df.T)
    
    # 添加与修改
    df = pd.DataFrame(np.random.rand(16).reshape(4,4)*100,
                       columns = ['a','b','c','d'])
    # 新增列
    df['e'] = 10
    
    # 新增行并赋值
    df.loc[4] = 20
    
         a          b          c            d       e
    0  17.148791  73.833921  39.069417   5.675815  10
    1  91.572695  66.851601  60.320698  92.071097  10
    2  79.377105  24.314520  44.406357  57.313429  10
    3  84.599206  61.310945   3.916679  30.076458  10
    4  20.000000  20.000000  20.000000  20.000000  20
    
    # 索引后直接修改值
    df['e'] = 20
    df[['a','c']] = 100
    
    
    # 删除  del / drop()
    
    # drop()删除行,inplace=False → 删除后生成新的数据,不改变原数据
    df.drop(0)
    df.drop([1,2])
    
    # drop()删除列,需要加上axis = 1,inplace=False → 删除后生成新的数据,不改变原数据
    df.drop(['d'], axis = 1)
    
    # del语句 - 删除列
    del df['a']
    dataframe基本操作

    pandas简单实现描述性数据分析

  • 相关阅读:
    蓝桥杯算法训练 区间k大数查询
    【模板】快读
    [ACM] hdu 2544 最短路(dijkstra算法)
    [ACM] hdu 3791 二叉搜索树
    [ACM] hdu 2141 Can you find it? (二分查找)
    [ACM] hdu 2025查找最大元素(水题)
    [ACM] hdu 1232 畅通工程(并查集)
    [ACM] hdu 1022 Train Problem I(栈的使用)
    [ACM] hdu 2857 Mirror and Light (对称点+两条直线的交点)
    [ACM] hdu 爆头(点到直线距离)
  • 原文地址:https://www.cnblogs.com/bigtreei/p/11260893.html
Copyright © 2011-2022 走看看