• 数据分析学习总结


    1、matplotlib学习归纳

    """ test 1 简单画图"""
    # from matplotlib import pyplot as plt
    #
    # fig = plt.figure(figsize=(20, 8), dpi=80)  # figure图形图标的意思,这里是指我们画的图,figsize表示图像大小,dpi表示图片清晰度
    # x = range(2, 26, 2)  # 数据在x轴的位置,是一个可迭代对象
    #
    # y = [15, 13, 14.5, 17, 20, 25, 26, 26, 27, 22, 18, 15]  # 数据在y轴的位置,是一个可迭代对象
    # plt.plot(x, y)  # 传入x和y,通过plot绘制出折线图
    #
    # plt.xticks(x) # 设置x轴的刻度
    # # plt.xticks(x[::2]) # 当刻度太密集的时候使用列表步长来解决,matplotlib自动帮我们对应
    #
    # # plt.savefig('./pic.png')  # 保存图片
    # plt.show()  # 在执行程序的是否展示图形
    
    """ test 2 自定义x轴标签,中文乱码解决,添加图例等"""
    # # 使用 fc-list :lang=zh 查看中文字体
    # # 指定字体的路径,然后在使用的时候使用fontproperties指定字体
    #
    # from matplotlib import pyplot as plt
    # from matplotlib import font_manager
    # import random
    #
    # my_font = font_manager.FontProperties(fname='/home/felix/.local/share/fonts/SIMHEI.TTF')  # 字体的路径
    #
    # plt.figure(figsize=(20, 8), dpi=80)
    # x = range(120)
    #
    # random.seed(10)  # 设置随机种子,让不同时候随机得到的结果都相同
    # y = [random.uniform(20, 35) for i in range(120)]  # 随机产生数据
    # y2 = [random.uniform(20, 35) for i in range(120)]  # 随机产生数据
    #
    # plt.plot(x, y, label='10点到12点天气变化')  # 如果要添加图例则使用label指定图例名称
    # plt.plot(x, y2, label='13点到14点天气变化')
    # plt.legend(prop=my_font, loc='best')  # 图例通过prop指定字体,通过loc指定位置
    #
    # _x_ticks = ['10点{}分'.format(i) if i < 60 else '11点{}分'.format(i - 60) for i in x]  # 产生自定义的x轴数组
    #
    # # 将第一个参数的x的位置用第二个参数的数组一一对应显示,rotation表示旋转,fontproperties表示指定字体
    # plt.xticks(x[::5], _x_ticks[::5], rotation=90, fontproperties=my_font)
    # # 添加描述信息
    # plt.xlabel('时间', fontproperties=my_font)  # 设置x轴的标签
    # plt.ylabel('温度(℃)', fontproperties=my_font)  # 设置y轴的标签
    # plt.title('10点到12点每分钟的时间变化情况', fontproperties=my_font)  # 设置title
    #
    # plt.grid(alpha=0.4,linestyle=':') # 绘制网格
    # plt.show()
    
    """ 常用统计图对比 """
    # 折线图:以折线的上升或下降来表示统计数量的增减变化的统计图
    # 特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)
    #
    # 直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。
    # 一般用横轴表示数据范围,纵轴表示分布情况。
    # 特点:绘制连续性的数据,展示一组或者多组数据的分布状况(统计)
    #
    # 条形图:排列在工作表的列或行中的数据可以绘制到条形图中。
    # 特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计)
    #
    # 散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量
    # 之间是否存在某种关联或总结坐标点的分布模式。
    # 特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
    
    """ test 3 散点图 """
    
    # import random
    # from matplotlib import (
    #     pyplot as plt,
    #     font_manager,
    # )
    #
    # # 设置字体
    # my_font = font_manager.FontProperties(fname='/home/felix/.local/share/fonts/SIMHEI.TTF')
    #
    # y_3 = [random.randint(8, 15) for i in range(31)]
    # y_10 = [random.randint(10, 25) for j in range(31)]
    #
    # x_3 = range(1, 32)
    # x_10 = range(51, 82)
    #
    # # 设置图形大小
    # plt.figure(figsize=(20, 8), dpi=80)
    #
    # # 使用scatter绘制散点图
    # plt.scatter(x_3, y_3, label="3月份")
    # plt.scatter(x_10, y_10, label='10月份')
    #
    # # 调整x轴的刻度
    # _x = list(x_3) + list(x_10)
    # _xtick_labels = ['3月{}日'.format(i) for i in x_3]
    # _xtick_labels += ['10月{}日'.format(i - 50) for i in x_10]
    #
    # plt.xticks(_x[::3], _xtick_labels[::3], fontproperties=my_font, rotation=45)
    #
    # # 添加图例
    # plt.legend(prop=my_font, loc='upper left')
    #
    # # 添加描述信息
    # plt.xlabel('时间', fontproperties=my_font)
    # plt.ylabel('温度 单位(t)', fontproperties=my_font)
    # plt.title('3月份和10月份的温度变化散点图', fontproperties=my_font)
    #
    # plt.show()
    
    
    """ test 4 条形图1 """
    
    # import random
    # from matplotlib import (
    #     pyplot as plt,
    #     font_manager,
    # )
    #
    # # 设置字体
    # my_font = font_manager.FontProperties(fname='/home/felix/.local/share/fonts/SIMHEI.TTF')
    #
    # a = ['电影{}'.format(i) for i in range(30)]  # 电影名称
    # b = [random.randint(10, 50) for i in range(30)]  # 电影票房
    #
    # # 设置图形大小
    # plt.figure(figsize=(20, 8), dpi=80)
    # # 绘制条形图
    # plt.bar(range(len(a)), b, width=0.3)
    # # 设置字符串到x轴
    # plt.xticks(range(len(a)), a, fontproperties=my_font, rotation=45)  # x轴对应
    # plt.savefig('电影统计.png')
    # plt.show()
    
    """ test 5 条形图2 """
    
    # 绘制横着的条形图
    # import random
    # from matplotlib import (
    #     pyplot as plt,
    #     font_manager,
    # )
    #
    # # 设置字体
    # my_font = font_manager.FontProperties(fname='/home/felix/.local/share/fonts/SIMHEI.TTF')
    #
    # a = ['电影{}'.format(i) for i in range(30)]  # 电影名称
    # b = [random.randint(10, 50) for i in range(30)]  # 电影票房
    #
    # # 设置图形大小
    # plt.figure(figsize=(8, 20), dpi=80)
    # # 绘制横着的条形图
    # plt.barh(range(len(a)), b, height=0.3, color='orange')
    # # 设置字符串到x轴
    # plt.yticks(range(len(a)), a, fontproperties=my_font)  # x轴对应
    # # 添加网格
    # plt.grid(alpha=0.3)
    #
    # plt.savefig('电影统计.png')
    # plt.show()
    
    """ test 6 条形图3 """
    # from matplotlib import (
    #     pyplot as plt,
    #     font_manager,
    # )
    #
    # # 设置字体
    # my_font = font_manager.FontProperties(fname='/home/felix/.local/share/fonts/SIMHEI.TTF')
    #
    # a = ['猩球崛起', '敦刻尔克', '蜘蛛侠', '战狼2']
    # b_16 = [15746, 312, 4497, 319]
    # b_15 = [12357, 156, 2045, 168]
    # b_14 = [2358, 399, 2357, 362]
    #
    # bar_width = 0.1
    # x_14 = list(range(len(a)))
    # x_15 = [i + bar_width for i in x_14]
    # x_16 = [i + bar_width for i in x_15]
    #
    # plt.figure(dpi=80)
    #
    # plt.barh(x_14, b_14, color='red', height=bar_width, label='9月14日')
    # plt.barh(x_15, b_15, color='yellow', height=bar_width, label='9月15日')
    # plt.barh(x_16, b_16, color='blue', height=bar_width, label='9月16日')
    #
    # plt.yticks(x_15, a, fontproperties=my_font)
    # plt.legend(prop=my_font)  # 标签
    # plt.show()
    
    """ test 7 直方图1 """
    
    # import random
    # from matplotlib import (
    #     pyplot as plt,
    #     font_manager,
    # )
    #
    # # 一般来说能够使用直方图的都是那些没有统计过的数据
    #
    # # 设置字体
    # my_font = font_manager.FontProperties(fname='/home/felix/.local/share/fonts/SIMHEI.TTF')
    #
    # a = [random.randint(10, 100) for i in range(100)]
    # # 直方图组数计算方式:将数据分组,当数据在100个以内时,按数据多少常分5-12组
    # # 组距:指每个小组的两个端点的距离
    # # 组数:极差/组距
    # d = 5  # 组距
    # num_bins = (max(a) - min(a)) // d  # 注意组距一定要被numbins整除,否则会不均匀
    # print(num_bins)
    #
    # plt.hist(a, num_bins)
    #
    # # 设置x轴的刻度
    # plt.xticks(range(min(a), max(a) + d, d))
    # # 显示网格
    # plt.grid()
    # plt.show()
    
    
    """ test 8 直方图2 """
    # import random
    # from matplotlib import (
    #     pyplot as plt,
    #     font_manager,
    # )
    #
    # # 直方图应用场景
    # # 1、用户的年龄分布状态
    # # 2、一段时间内用户的点击次数的分布状态
    # # 3、用户活跃时间分布状态
    #
    # # 绘制不同刻度的x轴的直方图
    #
    # interval = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 60, 90]
    # width = [5, 5, 5, 5, 5, 5, 5, 5, 5, 15, 30, 60]
    # quantity = [random.randint(500, 9000) for i in range(len(interval))]
    #
    # plt.figure(figsize=(20, 8), dpi=80)
    #
    # plt.bar(range(len(quantity)), quantity, width=1)
    #
    # # 设置x轴的刻度
    # _x = [i - 0.5 for i in range(len(quantity) + 1)]
    # _xtick_labels = interval + [150]
    # plt.xticks(_x, _xtick_labels)
    # plt.grid()
    #
    # plt.show()
    #

    2、numpy学习总结

    # -*- coding: utf-8 -*-
    # @Time    : 18-12-26 下午7:01
    # @Author  : Felix Wang
    
    """ test1 numpy入门和简单使用"""
    #
    # # numpy简介
    # # 一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算
    #
    # import numpy as np
    #
    # # 创建数组
    # # 下面的a,b,c效果相同
    # a = np.array([1, 2, 3, 4, 5])
    # b = np.array(range(1, 6))
    # c = np.arange(1, 6)  # arange用法: arange([start,] stop[,step,],dtype=None)
    #
    # # 数组的类名:
    # a = np.array([1, 2, 3, 4, 5, 6])
    # print(type(a))  # <class 'numpy.ndarray'>
    # print(a.dtype)  # int64
    #
    # # 指定创建的数组的数据类型
    # a = np.array([1, 0, 1, 0], dtype=np.bool)
    # print(a)  # [ True False  True False]
    #
    # # 修改数组的数据类型
    # a = a.astype(np.int8)
    # print(a)  # [1 0 1 0]
    #
    # # 修改浮点型的小数位数
    # b = np.round(a, 2)  # 将浮点数保留两位
    # print(b)
    #
    # print('#' * 15)
    #
    # c = np.array([[3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9]])
    # print(c)
    #
    # # 查看数组的形状
    # print(c.shape)  # (2, 6)
    # d = c.reshape(3, 4)
    # # [[3 4 5 6]
    # #  [7 8 4 5]
    # #  [6 7 8 9]]
    # print(d)
    # print(d.shape)  # (3, 4)
    #
    # # 把数组转化为1维数组
    # e = d.flatten()
    # print(e)  # [3 4 5 6 7 8 4 5 6 7 8 9]
    # # 注意 下面这个不是转换为一维数组
    # ee = d.reshape(1, 12)
    # print(ee)  # [[3 4 5 6 7 8 4 5 6 7 8 9]]
    #
    # # 加减乘除法
    # # 注意:加减乘除在运算过程中,值被作用到所有的元素上
    # print('#' * 15)
    # print(d)
    # # [[3 4 5 6]
    # #  [7 8 4 5]
    # #  [6 7 8 9]]
    # print(d + 1)
    # # [[ 4  5  6  7]
    # #  [ 8  9  5  6]
    # #  [ 7  8  9 10]]
    # print(d * 2)
    # # [[ 6  8 10 12]
    # #  [14 16  8 10]
    # #  [12 14 16 18]]
    # print('#' * 15)
    #
    # #######################################
    # a = np.array([[3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9]])
    # b = np.array([[21, 22, 23, 24, 25, 26], [27, 28, 29, 30, 31, 32]])
    # # 数组和数组的加减法,对应的各个值相加减,或者相乘除
    # print(a + b)
    # # [[24 26 28 30 32 34]
    # #  [31 33 35 37 39 41]]
    # print(a * b)
    # # [[ 63  88 115 144 175 208]
    # #  [108 140 174 210 248 288]]
    #
    # # c = a.reshape(3, 4)  # 注意不同的维度的不能相乘除
    # # print(a * c)
    # # 但是:
    # # 2行6列的数组,和1行6列的数组
    # a = np.array([[3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9]])
    # c = np.array([1, 2, 3, 4, 5, 6])
    # print(a-c)
    # # [[2 2 2 2 2 2]
    # #  [3 3 3 3 3 3]]
    # print(a*c)
    # # [[ 3  8 15 24 35 48]
    # #  [ 4 10 18 28 40 54]]
    #
    # # 2行6列的数组,和2行一列的数组
    # a = np.array([[3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9]])
    # c=np.array([[1],[2]])
    # print(c+a)
    # # [[ 4  5  6  7  8  9]
    # #  [ 6  7  8  9 10 11]]
    # print(c*a)
    # # [[ 3  4  5  6  7  8]
    # #  [ 8 10 12 14 16 18]]
    # # 造成上面这种不同维度能计算的原因是:
    # # 如果两个数组的后缘长度,即从末尾开始算起的维度的轴长度相符或其中一方的长度为1,则认为他们是广播兼容的。广播会在缺失和长度为1的维度上进行
    #
    
    """ test2 numpy读取文件 """
    
    # import numpy as np
    #
    # # numpy读取数据方法
    # # np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
    # # frame: 文件、字符串或产生器,可以是.gz或bz2压缩文件
    # # dtype: 数据类型,可选,CSV的字符串以什么数据类型读入数组中,默认np.float
    # # delimiter: 分隔字符串,默认是任何空格,改为逗号
    # # skiprows: 跳过前x行,一般跳过第一行表头
    # # usecols: 读取指定的列,索引,元组类型
    # # unpack: 如果为True,读入属性将分为写入不同数组变量,False读入数据只写入一个数组变量,默认False
    #
    #
    # us_file_path = "US_video_data_numbers.csv"
    # uk_file_path = "GB_video_data_numbers.csv"
    #
    # # t1 = np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)
    # t2 = np.loadtxt(us_file_path, delimiter=",", dtype="int")
    #
    # # print(t1)
    # print(t2)
    #
    # print("*" * 100)
    #
    # # 取行
    # # print(t2[2])
    #
    # # 取连续的多行
    # # print(t2[2:])
    #
    # # 取不连续的多行
    # # print(t2[[2,8,10]])
    #
    # # print(t2[1,:])
    # # print(t2[2:,:])
    # # print(t2[[2,10,3],:])
    #
    # # 取列
    # # print(t2[:,0])
    #
    # # 取连续的多列
    # # print(t2[:,2:])
    #
    # # 取不连续的多列
    # # print(t2[:,[0,2]])
    #
    # # 去行和列,取第3行,第四列的值
    # # a = t2[2,3]
    # # print(a)
    # # print(type(a))
    #
    # # 取多行和多列,取第3行到第五行,第2列到第4列的结果
    # # 去的是行和列交叉点的位置
    # b = t2[2:5, 1:4]
    # # print(b)
    #
    # # 取多个不相邻的点
    # # 选出来的结果是(0,0) (2,1) (2,3)
    # c = t2[[0, 2, 2], [0, 1, 3]]
    # print(c)
    
    
    """ test3 numpy中的其他操作"""
    # import numpy as np
    #
    # # 求转置的三种方法
    # b = np.array([[1, 2, 3, 4, 5, 6], [4, 5, 6, 7, 8, 9]])
    # print(b)
    # print(b.T)
    # print(b.swapaxes(1, 0))
    # print(b.transpose())
    #
    # # numpy中的三目运算符
    # c = np.where(b < 5, 10, 0)  # 如果b中的数字小于5,则至10,否则置0
    # print(c)
    #
    # # 小于x替换为x,大于y替换为y
    # bb = np.array(
    #     [[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17], [18, 19, 20, np.nan, np.nan, np.nan]])
    # print(bb)
    # cc = bb.clip(10, 18)
    # print(cc)
    
    """ test4 numpy中的nan和inf """
    # # nan: 表示不是一个数字
    # #     当我们读取本地文件为float的时候,如果有缺失,就会出现nan
    # #     或者做了一个不合适的计算的时候。
    #
    # # inf:表示正无穷,-inf表示负无穷
    # #     比如:一个数字除以0(python中直接会报错,numpy中是一个inf或者-inf)
    # import numpy as np
    #
    # a = np.nan
    # b = np.inf
    # print(a, type(a))  # nan <class 'float'>
    # print(b, type(b))  # inf <class 'float'>
    #
    # # numpy中的nan的注意点
    # # 1、两个nan是不相等的
    # # 2、np.nan!=np.nan
    # # 3、利用2的特性判断数组中nan的个数 # np.count_nonzero(t!=t)
    # # 4、使用np.isnan(a)来判断一个数组中是否是nan,比如希望把nan替换为0,t[np.isnan(t)]=0
    # # 5、nan和任何值计算都为nan
    #
    # # 在一组数据中如果单纯的把nan替换为0,是不合适的,比如全部替换为0后,替换之前的平均值如果大于0,替换之后的均值肯定会变小,所以更一般的方式是把缺失的数字替换为均值(中值)
    # # 或者是直接删除有缺失值的一行
    # """ 将nan替换为均值的方法
    # def fill_ndarray(t1):
    #     for i in range(t1.shape[1]):  # 遍历每一列
    #         temp_col = t1[:, i]  # 当前的一列
    #         nan_num = np.count_nonzero(temp_col != temp_col)
    #         if nan_num != 0:  # 不为0,说明当前这一列中有nan
    #             temp_not_nan_col = temp_col[temp_col == temp_col]  # 当前一列不为nan的array
    #
    #             # 选中当前为nan的位置,把值赋值为不为nan的均值
    #             temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()
    #     return t1
    #
    #
    # if __name__ == '__main__':
    #     t1 = np.arange(24).reshape((4, 6)).astype("float")
    #     t1[1, 2:] = np.nan
    #     print(t1)
    #     t1 = fill_ndarray(t1)
    #     print(t1)
    # """
    #
    # # numpy中常用统计函数
    # # 求和:t.sum(axis=None)
    # # 均值:t.mean(a,axis=None)  受离群点的影响较大
    # # 中值:np.median(t,axis=None)
    # # 最大值:t.max(axis=None)
    # # 最小值:t.min(axis=None)
    # # 极值:np.ptp(t,axis=None) 即最大值和最小值之差
    # # 标准差:t.std(axis=None)
    #
    #
    # # 数组的拼接,注意:竖直拼接的时候,每一列代表的意义要相同,否则牛头不对马嘴
    # t1 = np.array([[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11]])
    # t2 = np.array([[12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23]])
    # tt1 = np.vstack((t1, t2))  # 竖直拼接
    # tt2 = np.hstack((t1, t2))
    # print(tt1)
    # # [[ 0  1  2  3  4  5]
    # #  [ 6  7  8  9 10 11]
    # #  [12 13 14 15 16 17]
    # #  [18 19 20 21 22 23]]
    # print(tt2)
    # # [[ 0  1  2  3  4  5 12 13 14 15 16 17]
    # #  [ 6  7  8  9 10 11 18 19 20 21 22 23]]
    #
    # # 数组的行列交换
    # print(tt1)
    # tt1[[1, 2], :] = tt1[[2, 1], :]  # 行交换
    # print(tt1)
    # tt1[:, [0, 2]] = tt1[:, [2, 0]]  # 列交换
    # print(tt1)
    
    
    """ test5 更多其他方法 """
    # import numpy as np
    #
    # # 1、获得最大值最小值的位置
    # #     # np.argmax(t,axis=0)
    # #     # np.argmin(t,axis=1)
    # # 2、创建全为0的数组: np.zeros((3,4))
    # # 3、创建全为1的数组: np.ones((3,4))
    # # 4、创建一个对角线为1的正方形数组(方阵):np.eye(3)
    #
    # # numpy生成随机数
    # # print(np.random.rand(4,2,3)) # 创建均匀分布的的随机数数组,浮点数,范围:0-1
    # # print(np.random.rand(1,2))
    #
    # print(np.random.randn(2, 2))  # 创建标准正态分布随机数,浮点数,平均数0,标准差1
    #
    # print(np.random.randint(1, 10, (3, 4)))  # 从给定上下限范围选取随机整数,最后一个参数为形状
    #
    # print(np.random.uniform(1, 10, (3, 4)))  # 产生具有均匀分布的数组,第一个参数为起始值,第二个参数为结束值,第三个参数为形状
    #
    # print(np.random.normal(1, 1, (3, 4)))  # 从指定正态分布中随机抽取样本,分布中心是第一个参数(均值),标准差为第二个值,第三个参数为形状
    #
    # print(np.random.seed(10))  # 随机数中值,可以通过设置相同的种子,使没吃生成的随机数相同

    3、pandas总结

    # -*- coding: utf-8 -*-
    # @Time    : 18-12-27 下午2:51
    # @Author  : Felix Wang
    
    """ test1 pandas简单操作 """
    # # pandas 常用数据
    # # 1、 Series 一维,带标签数组
    # # 2、 DataFrame 二维,Series容器
    #
    # import numpy as np
    # import pandas as pd
    # import string
    #
    # # 创建Series方式一:
    # t = pd.Series(np.arange(10), index=list(string.ascii_uppercase[:10]))
    # print(t)
    # print(type(t)) # <class 'pandas.core.series.Series'>
    #
    # # 创建Series方式二
    # a = {string.ascii_uppercase[i]:i for i in range(10)}
    # b = pd.Series(a)
    # print(a)
    # print(b)
    # c = pd.Series(a,index=list(string.ascii_uppercase[5:15]))
    # # 注意:重新给其指定其他的索引之后,如果能够对应上,就取其值,如果不能就为nan,因为nan为float类型,pandas会自动改变dtype
    # print(c)
    #
    # # pandas的索引和切片
    # print(c[2:10:2])
    # print(c[1])
    # print(c[c>4])
    #
    # print(b['A'])
    # print(b[[2,3,6]])
    #
    # # Series的索引和值
    # print(b.index)
    # print(b.values)
    # # 注:Series对象的本质上是由两个数组构成
    # # 一个数组构成对象的键(index,索引),一个数组构成对象的值(values)。键->值。
    
    """ test2 pandas读取数据 """
    # import pandas as pd
    #
    # #pandas读取csv中的文件
    # df = pd.read_csv("./dogNames2.csv")
    # df2 = pd.read_sql()
    # df3 = pd.read_excel()
    # df4 = pd.read_json()
    
    """ test3 DataFrame对象 """
    # import string
    # import pandas as pd
    # import numpy as np
    #
    # t = pd.DataFrame(np.arange(12).reshape((3, 4)))
    # #    0  1   2   3
    # # 0  0  1   2   3
    # # 1  4  5   6   7
    # # 2  8  9  10  11
    # print(t)
    #
    # # DataFrame对象既有行索引,又有列索引
    # # 行索引,表明不同行,横向索引,叫index,0轴,axis=0
    # # 列索引,表名不同列,纵向索引,叫columns,1轴,axis=1
    #
    # t2 = pd.DataFrame(np.arange(12).reshape((3, 4)), index=list(string.ascii_uppercase[:3]),
    #                   columns=list(string.ascii_uppercase[-4:]))
    # #    W  X   Y   Z
    # # A  0  1   2   3
    # # B  4  5   6   7
    # # C  8  9  10  11
    # print(t2)
    #
    # # DataFrame的基础属性
    # # df.shape # 行数,列数
    # # df.dtypes # 列数据类型
    # # df.ndim  # 数据维度
    # # df.index # 行索引
    # # df.columns # 列索引
    # # df.values # 对象值,二维ndarray数组
    #
    # # # DataFrame整体情况查询
    # # df.head(3) # 显示头部几行,默认5行
    # # df.tail(3) # 显示末尾几行,默认5行
    # # df.info() # 相关信息概览:行数,列数,列索引,列非空值个数,列类型,内存占用
    # # df.describe() # 快速综合统计结果:计数,均值,标准差,最大值,四分位数,最小值
    #
    # # 排序
    # ## 按值排序
    # # df.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')
    # # #### 参数说明
    # # axis:{0 or ‘index’, 1 or ‘columns’}, default 0,默认按照索引排序,即纵向排序,如果为1,则是横向排序
    # # by:str or list of str;如果axis=0,那么by="列名";如果axis=1,那么by="行名";
    # # ascending:布尔型,True则升序,可以是[True,False],即第一字段升序,第二个降序
    # # inplace:布尔型,是否用排序后的数据框替换现有的数据框
    # # kind:排序方法,{‘quicksort’, ‘mergesort’, ‘heapsort’}, default ‘quicksort’。似乎不用太关心
    # # na_position : {‘first’, ‘last’}, default ‘last’,默认缺失值排在最后面
    #
    #
    # # # pandas 之loc和iloc
    # # # 1、df.loc 通过标签索引行数据
    # # # 2、df.iloc 通过位置获取行数据
    # # print('*' * 30)
    # # print(t2)
    # #
    # # print(t2.loc['A', 'W'])  # 0
    # # print(t2.loc[['A', 'C'], ['W', 'Z']])  # 选择间隔的多行多列
    # # print(t2.loc['A':'C', ['W', 'Z']])  # 冒号是闭合的可以渠道冒号后面的值
    # #
    # # print(t2.iloc[1, 2])  # 6
    # # print(t2.iloc[1:3, 0:3])
    # #
    # # # 赋值更改数据
    # # print('*'*50)
    # # print(t2)
    # # t2.loc['A','W']=100
    # # print(t2)
    # # t2.iloc[1:2,0:3]=0
    # # print(t2)
    # #
    # # # pandas的布尔索引
    # # print(t2[t2['W']==0])
    #
    #
    # # pandas之字符串方法归纳
    # # cat : 实现元素级的字符串连接操作,可指定分隔符
    # # contains : 返回表示各字符串是否含有指定模式的布尔型数组
    # # count : 模式的出现次数
    # # endswith,startswith : 相当于对各个元素执行x.endswith()或x.startswith()
    # # findall : 计算各字符串的模式列表
    # # get : 获取个元素的第i个字符
    # # join : 根据指定的分隔符将Series中各元素的字符串连接起来
    # # len : 计算各字符串的长度
    # # lower,upper : 转换大小写,相当于对各个元素执行x.lower或者x.upper
    # # match : 根据指定的正则表达式对各个元素执行re.match
    # # pad : 在字符串的左边、右边或者左右两边添加空白
    # # center : 相当于pad(side='both')
    # # repeat : 重复值。例如,s.str.repeat(3)相当于各个字符串执行x*3
    # # replace : 用指定字符串替换找到的模式
    # # slice : 对Series中的各个字符串进行子串截取
    # # split : 根据分隔符或者正则表达式对字符串进行拆分
    # # strip,lstrip,rstrip : 去除空白,包括换行符
    #
    # # 缺失数据的处理
    # # 1、判断数据是否为NaN: pd.isnull(df),pd.notnull(df)
    # # 2、处理方式
    # # (1)、删除NaN所在的行列  t.dropna(axis=0,how='any',inplace=False)
    # # (2)、填充数据,t.fillna(t.mean()),t.fillna(t.median()),t.fillna(0)
    #
    # # 数据合并之join
    # t3 = pd.DataFrame(np.arange(12).reshape((3, 4)), index=list(string.ascii_uppercase[:3]),
    #                   columns=list(string.ascii_uppercase[-4:]))
    # t4 = pd.DataFrame(np.arange(12).reshape((2, 6)), index=list(string.ascii_uppercase[:2]),
    #                   columns=list(string.ascii_uppercase[-10:-4]))
    #
    # print(t3)
    # print(t4)
    # print(t3.join(t4))
    # #    W  X   Y   Z    Q    R    S    T     U     V
    # # A  0  1   2   3  0.0  1.0  2.0  3.0   4.0   5.0
    # # B  4  5   6   7  6.0  7.0  8.0  9.0  10.0  11.0
    # # C  8  9  10  11  NaN  NaN  NaN  NaN   NaN   NaN
    #
    #
    # # 数据合并值merge
    # # merge:按照指定的列把数据按照一定的方式合并到一起
    # print('*' * 30)
    # print(t3.merge(t4, left_on='Z', right_on='V'))  # left_on=right_on# 就相当于前面这个和后面这个相等的地方进行合并,默认how为inner
    # #    W  X   Y   Z  Q  R  S  T   U   V
    # # 0  8  9  10  11  6  7  8  9  10  11
    #
    # print(t3.merge(t4, left_on='Z', right_on='V', how='outer'))  # 交集,通过nan补全
    # #      W    X     Y     Z    Q    R    S    T     U     V
    # # 0  0.0  1.0   2.0   3.0  NaN  NaN  NaN  NaN   NaN   NaN
    # # 1  4.0  5.0   6.0   7.0  NaN  NaN  NaN  NaN   NaN   NaN
    # # 2  8.0  9.0  10.0  11.0  6.0  7.0  8.0  9.0  10.0  11.0
    # # 3  NaN  NaN   NaN   NaN  0.0  1.0  2.0  3.0   4.0   5.0
    #
    # print(t3.merge(t4, left_on='Z', right_on='V', how='left'))  # 左边为准,通过nan补全
    # #    W  X   Y   Z    Q    R    S    T     U     V
    # # 0  0  1   2   3  NaN  NaN  NaN  NaN   NaN   NaN
    # # 1  4  5   6   7  NaN  NaN  NaN  NaN   NaN   NaN
    # # 2  8  9  10  11  6.0  7.0  8.0  9.0  10.0  11.0
    # print(t3.merge(t4, left_on='Z', right_on='V', how='right'))  # 右边为准,通过nan补全
    # #      W    X     Y     Z  Q  R  S  T   U   V
    # # 0  8.0  9.0  10.0  11.0  6  7  8  9  10  11
    # # 1  NaN  NaN   NaN   NaN  0  1  2  3   4   5
    #
    #
    # # 分组和聚合
    # # grouped = df.groupby(by="columns_name")
    # # grouped是一个DataFrameGroupBy对象,是可迭代的
    # # grouped中的每一个元素是一个元组
    # # 元组里面是(索引(分组的值),分组之后的DataFrame)
    #
    # # DataFrameGroupBy对象有很多经过优化的方法
    # # count : 很注重非NAN值的数量
    # # sum : 非NA值的和
    # # mean : 非NA值的平均值
    # # median : 非NA值的算数中位数
    # # std,var : 无偏标准差和方差
    # # min,max : 非NA值的最小值和最大值
    
    """ test4 pandas其他知识点 """
    import numpy as np
    import pandas as pd
    
    # 生成一段时间序列
    print(pd.date_range(start='20180105', end='20180206', freq='D'))
    # DatetimeIndex(['2018-01-05', '2018-01-06', '2018-01-07', '2018-01-08',
    #                '2018-01-09', '2018-01-10', '2018-01-11', '2018-01-12',
    #                '2018-01-13', '2018-01-14', '2018-01-15', '2018-01-16',
    #                '2018-01-17', '2018-01-18', '2018-01-19', '2018-01-20',
    #                '2018-01-21', '2018-01-22', '2018-01-23', '2018-01-24',
    #                '2018-01-25', '2018-01-26', '2018-01-27', '2018-01-28',
    #                '2018-01-29', '2018-01-30', '2018-01-31', '2018-02-01',
    #                '2018-02-02', '2018-02-03', '2018-02-04', '2018-02-05',
    #                '2018-02-06'],
    #               dtype='datetime64[ns]', freq='D')
    
    # 其中频率的更多缩写
    # D   日历日
    # B   每工作日
    # H   每小时
    # T   每分钟
    # S   每秒
    # L   每毫秒
    # U   每微妙
    # M   每月最后一个日历日
    # BM  每月最后一个工作日
    # MS  每月第一个日历日
    # BMS 每月第一个工作日
    
    
    # index = pd.date_range(start='20180102', periods=10)  # periods表示周期
    # # 在DataFrame中使用时间序列
    # df = pd.DataFrame(index, range(10), columns=['w'])
    #
    # # t4 = pd.DataFrame(np.arange(12).reshape((2, 6)), index=list(string.ascii_uppercase[:2]),
    # #                   columns=list(string.ascii_uppercase[-10:-4]))
    # print(df)
    #
    # # 把时间戳转换为DataFrame格式
    # # df["timeStamp"] = pd.to_datetime(df["timeStamp"],format="")
    # # print()
    # #
    # # format参数大部分情况下可以不用写,但是对于pandas无法格式化的时间字符串,我们可以使用该参数,比如包含中文
    #
    #
    # # pandas重采样
    # # 重采样: 指的是将时间序列从一个频率转化为另一个频率进行处理的过程,将高频率数据转化为低频率数据为降采样,低频率转化为高频率为升采样
    # tt = pd.DataFrame(np.random.uniform(10,50,(100,1)),index=pd.date_range(start='20180508',periods=100))
    # print(tt)
    # print(tt.resample('M').mean())
    # print(tt.resample('10D').count())
    
    
    """ test5 北京pm2.5处理实例"""
    # coding=utf-8
    import pandas as pd
    from matplotlib import pyplot as plt
    
    file_path = "BeijingPM20100101_20151231.csv"
    
    df = pd.read_csv(file_path)
    
    # 把分开的时间字符串通过periodIndex的方法转化为pandas的时间类型
    period = pd.PeriodIndex(year=df["year"], month=df["month"], day=df["day"], hour=df["hour"], freq="H")
    df["datetime"] = period
    # print(df.head(10))
    
    # 把datetime 设置为索引
    df.set_index("datetime", inplace=True)
    
    # 进行降采样
    df = df.resample("7D").mean()
    print(df.head())
    # 处理缺失数据,删除缺失数据
    # print(df["PM_US Post"])
    
    data = df["PM_US Post"]
    data_china = df["PM_Nongzhanguan"]
    
    print(data_china.head(100))
    # 画图
    _x = data.index
    _x = [i.strftime("%Y%m%d") for i in _x]
    _x_china = [i.strftime("%Y%m%d") for i in data_china.index]
    print(len(_x_china), len(_x_china))
    _y = data.values
    _y_china = data_china.values
    
    plt.figure(figsize=(20, 8), dpi=80)
    
    plt.plot(range(len(_x)), _y, label="US_POST", alpha=0.7)
    plt.plot(range(len(_x_china)), _y_china, label="CN_POST", alpha=0.7)
    
    plt.xticks(range(0, len(_x_china), 10), list(_x_china)[::10], rotation=45)
    
    plt.legend(loc="best")
    
    plt.show()

    最后:

    个人笔记以及资料下载  -》 密码:8yra

  • 相关阅读:
    第五周总结
    第四周总结
    第三周总结
    第二周总结
    第一周总结
    暑假学习进度八
    使用nmtui文本框方式修改IP
    Linux 忘记密码配置
    关于公网IP和内网IP
    常见API编写方式(三种)
  • 原文地址:https://www.cnblogs.com/felixwang2/p/10187226.html
Copyright © 2020-2023  润新知