numpy第五次作业修正版本20200830

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

以上为英国与美国Youtube数据,其每列对应的是:点击,喜欢,不喜欢,评论GB_video_data_numbers.csv US_video_data_numbers.csv

练习1

#结合Matplotlib绘制各自的评论数量的图形,体现其评论数主要分布在哪个区间。—直方图

#!/user/bin/env python
#-*-coding: utf-8-*-
#@Time        : 2020/8/28 22:23
#@Author      : GodSpeed
#@File        : Numpy05次作业01.py
#@Software    : PyCharm


from matplotlib.ticker import MultipleLocator, FormatStrFormatter
from matplotlib import pyplot as plt
import random
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False   # 步骤二(解决坐标轴负数的负号显示问题)

'''
以上为英国与美国Youtube数据,其每列对应的是:点击,喜欢,不喜欢,评论
GB_video_data_numbers.csv US_video_data_numbers.csv
'''

#练习1
#结合Matplotlib绘制各自的评论数量的图形,体现其评论数主要分布在哪个区间。

# 分析: 直方图是用来整理计量值bai的观测数据,分析其分布状态的统计方法


#按照评论数列绘制直方图,推断分布
def draw_comments_histogram(file_name,draw_name,color):

    # 1.获取评论数据(评论数据为最后一列)
    np_arr = np.loadtxt ( file_name, delimiter=",", dtype=int, skiprows=0 )
    print(np_arr)

    np_arr_data = np_arr[:,3]
    #comments_list = np_arr[:,3].tolist()  # 提高效率的角度,这里不用转换List了

    # 2. 绘制直方图
    # 2.1 计算极差

    # 用截取的方法去过滤太离散的数据
    diff_comments = np_arr_data.ptp()

    print(diff_comments)
    #np_arr_data = np_arr_data[np_arr_data<30000]
    #3.计算组数
    g_distance = 25000
    g_num = round(diff_comments)//g_distance # 注意组数必须为整数,不能为小数
    print ( 'g_num = ',g_num )
    plt.xlabel( '评论数' )
    plt.ylabel( '频数' )
    plt.title ( draw_name )
    # 绘制直方图
    plt.hist ( np_arr_data, bins=g_num,color=color, alpha=0.7, rwidth=0.9 )  # 频率图 增加density
    plt.grid ( axis='y', alpha=0.7 )
    plt.show()


if __name__ == '__main__':

    # 绘制直方图
    draw_comments_histogram ( 'GB_video_data_numbers.csv', '英国评论数量分布分析' ,'g')
    

在这里插入图片描述

分析不足:

数据源研究对象需要调整范围,充分保留有效数据:从直方图效果明显看出,数据源分布几乎总体分布到0到10000之间,10000 到 1000000几乎没有数据。

应对方法:

可以对数据源numpy数组采用布尔索引法来实现有效范围的截取,因此对函数中增加:


#练习1
#结合Matplotlib绘制各自的评论数量的图形,体现其评论数主要分布在哪个区间。

# 分析: 直方图是用来整理计量值bai的观测数据,分析其分布状态的统计方法


#按照评论数列绘制直方图,推断分布
def draw_comments_histogram(file_name,draw_name,color):

    # 1.获取评论数据(评论数据为最后一列)
    np_arr = np.loadtxt ( file_name, delimiter=",", dtype=int, skiprows=0 )
    #print(np_arr)
    print ( np_arr.shape )
    # 增加有效数据的截取
    #np_arr = np_arr[np_arr<(10000)] #报错,这样就变成一维数组了
    np_arr = np_arr[np_arr[:,3] < (10000)]
    print(np_arr)
    print ( np_arr.shape )

    np_arr_data = np_arr[:,3]
    #comments_list = np_arr[:,3].tolist()  # 提高效率的角度,这里不用转换List了

    # 2. 绘制直方图
    # 2.1 计算极差

    # 用截取的方法去过滤太离散的数据
    diff_comments = np_arr_data.ptp()

    print(diff_comments)
    #np_arr_data = np_arr_data[np_arr_data<30000]
    #3.计算组数
    #调整组距
    #g_distance = 25000
    g_distance = 1000
    g_num = round(diff_comments)//g_distance # 注意组数必须为整数,不能为小数
    print ( 'g_num = ',g_num )
    plt.xlabel( '评论数' )
    plt.ylabel( '频数' )
    plt.title ( draw_name )
    # 绘制直方图
    plt.hist ( np_arr_data, bins=g_num,color=color, alpha=0.7, rwidth=0.9 )  # 频率图 增加density
    plt.grid ( axis='y', alpha=0.7 )
    #调整刻度方法1:
    #x_t = [i for i in range ( 0, 10500, 500 )]
    #plt.xticks ( x_t, rotation=45 )  # 调整刻度
    #调整刻度方法2:
    # 把x轴的刻度间隔设置为500,并存在变量里
    x_major_locator = MultipleLocator ( 500)
    # ax为两条坐标轴的实例
    ax = plt.gca ()
    # 把x轴的主刻度设置为500的倍数
    ax.xaxis.set_major_locator ( x_major_locator )
    # 把x轴的刻度范围设置为0到10000
    plt.xlim ( 0, 10000)
    plt.xticks(rotation=45 )
    plt.show ()



if __name__ == '__main__':

    # 绘制直方图
    draw_comments_histogram ( 'GB_video_data_numbers.csv', '英国评论数量分布分析' ,'g')

    draw_comments_histogram ( 'US_video_data_numbers.csv', '美国评论数量分布分析' ,'r')

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

练习2

绘制图形,分析英国的Youtube中视频的评论数与喜欢数的关系。(注意预测分布要用散点图,而不是折线图)

#!/user/bin/env python
#-*-coding: utf-8-*-
#@Time        : 2020/8/29 00292:02
#@Author      : GodSpeed
#@File        : Numpy05次作业02.py
#@Software    : PyCharm

'''
# 散点图
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
from matplotlib import pyplot as plt
import random
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False   # 步骤二(解决坐标轴负数的负号显示问题)
'''

def en_scatter_comments_liks(file_name):

    #1.用np读取csv数据,赋值np.ndarrage返回
    np_arr = np.loadtxt ( file_name, delimiter=",", dtype=int, skiprows=0 )

    comments_np = np_arr[:, 3]
    likes_np = np_arr[:, 1]

    #2.绘制直方图 plt.hist

    plt.figure ( figsize=(8, 6) )
    plt.xticks ( rotation=45 )  # x轴旋转45
    plt.scatter ( comments_np, likes_np)  # 绘制散点图

    plt.xlabel ( "评论数" )  # 设置x轴标签
    plt.ylabel ( '喜欢数' )  # 设置y轴标签
    plt.title ( '评论数与喜欢数变化趋势图' )  # 设置图标题

    plt.grid ()  # 根据x轴和y轴的数值展示轴网格
    plt.draw ()
    plt.savefig ( '第5节课作业01.png' )  # 保存图片
    plt.show ()


if __name__ == '__main__':

    en_scatter_comments_liks ( 'GB_video_data_numbers.csv')

在这里插入图片描述

分析:

从散点图中看出100000以后,数据非常少,因此考虑用条件索引缩小观测研究范围。

#!/user/bin/env python
#-*-coding: utf-8-*-
#@Time        : 2020/8/29 00292:02
#@Author      : GodSpeed
#@File        : Numpy05次作业02.py
#@Software    : PyCharm

# 散点图
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
from matplotlib import pyplot as plt
import random
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False   # 步骤二(解决坐标轴负数的负号显示问题)

'''
练习2
绘制图形,分析英国的Youtube中视频的评论数与喜欢数的关系。(注意预测分布要用散点图,而不是折线图)
'''
def en_scatter_comments_liks(file_name):

    #1.用np读取csv数据,赋值np.ndarrage返回
    np_arr = np.loadtxt ( file_name, delimiter=",", dtype=int, skiprows=0 )

    np_arr = np_arr[np_arr[:, 3]<100000]
    comments_np = np_arr[:, 3]
    likes_np = np_arr[:, 1]

    #2.绘制直方图 plt.hist

    plt.figure ( figsize=(8, 6) )
    plt.xticks ( rotation=45 )  # x轴旋转45
    plt.scatter ( comments_np, likes_np)  # 绘制散点图

    # 把x轴的刻度间隔设置为500,并存在变量里
    x_major_locator = MultipleLocator ( 500 )
    # ax为两条坐标轴的实例
    ax = plt.gca ()
    # 把x轴的主刻度设置为500的倍数
    ax.xaxis.set_major_locator ( x_major_locator )
    # 把x轴的刻度范围设置为0到10000
    plt.xlim ( 0, 11000 )
    plt.xticks ( rotation=45 )


    plt.xlabel ( "评论数" )  # 设置x轴标签
    plt.ylabel ( '喜欢数' )  # 设置y轴标签
    plt.title ( '评论数与喜欢数变化趋势图' )  # 设置图标题

    plt.grid ()  # 根据x轴和y轴的数值展示轴网格
    plt.draw ()
    plt.savefig ( '第5节课作业01.png' )  # 保存图片
    plt.show ()


if __name__ == '__main__':

    en_scatter_comments_liks ( 'GB_video_data_numbers.csv')

在这里插入图片描述

练习3

当希望将两个国家的数据拼接一起来研究分析。

拼接全为0的数组标识为英国
拼接全为1的数组标识为美国
将两个国家的数据拼接

#!/user/bin/env python
#-*-coding: utf-8-*-
#@Time        : 2020/8/29 002913:09
#@Author      : GodSpeed
#@File        : Numpy05次作业03.py
#@Software    : PyCharm

import numpy as np

'''
 # 练习3
当希望将两个国家的数据拼接一起来研究分析。
• 拼接全为0的数组标识为英国
• 拼接全为1的数组标识为美国
• 将两个国家的数据拼接
'''

#实现自定义水平拼接一列全0或是全1,返回拼接后的arr
def hstack_def_v(file_name,v_1_0):
    np_arr = np.loadtxt ( file_name, delimiter=",", dtype=int, skiprows=0 )
    if v_1_0 == 0:
        en_col0 = np.zeros ( (np_arr.shape[0], 1), dtype=int )
    elif v_1_0 == 1:
        en_col0 = np.ones ( (np_arr.shape[0], 1), dtype=int )
    else:
        print('v_1_0 的值必须为0或1')
        return np.array([])
    new_np_arr = np.hstack((en_col0,np_arr))
    return new_np_arr

if __name__ == '__main__':

    # GB_video_data_numbers
    # 从csv中读取数据英国数据,返回给np_en_arr

    new_np_en_arr = hstack_def_v ( 'GB_video_data_numbers.csv', 0)

    # GB_video_data_numbers
    # 从csv中读取数据英国数据,返回给np_en_arr
    new_np_us_arr = hstack_def_v ( 'US_video_data_numbers.csv', 1 )

    if new_np_en_arr.size != 0 and new_np_us_arr.size != 0:
        #将两个国家的数据拼接
        np_en_and_us_arr = np.vstack ( (new_np_en_arr, new_np_us_arr) )
        print(np_en_and_us_arr)


运行结果:

[[ 0 7426393 78240 13548 705]
[ 0 494203 2651 1309 0]
[ 0 142819 13119 151 1141]

[ 1 142463 4231 148 279]
[ 1 2162240 41032 1384 4737]
[ 1 515000 34727 195 4722]]

小结:


1、数据分析首先要根据实际需求选对图形:如研究分布采用直方图,研究两个变量的关系用散点图。;
2、如果数据出现很多没价值的数据,或个别数据特别离散,可以采用布尔索引来缩小范围。.
3、数据分析一定要采用ndarray去操作,这样效率高,符合统计要求。.

猜你喜欢

转载自blog.csdn.net/Narutolxy/article/details/108302224