美文网首页
21 Numpy、共享单车骑行数据

21 Numpy、共享单车骑行数据

作者: 夏威夷的芒果 | 来源:发表于2018-07-17 13:30 被阅读34次
    基本流程 Numpy模块适合做矢量化运算 Matplotlib模块适合做数据的呈现,绘图接口

    这里需要三个库

    import os
    import numpy as np
    import matplotlib.pyplot as plt
    

    数据源:https://video.mugglecode.com/data.zip

    CSV,又叫comma separated value,数据之间用逗号隔开的,第一行一般不存储数据,又叫表头。

    用文本编辑器打开csv 局部放大 可以可用表格软件打开,但是体积很大的时候打开的速度很慢,超大规模的数据会加载不完全

    先写一段简单的代码:

    import os
    import numpy as np
    
    data_path = '/Users/miraco/PycharmProjects/DataMining/bikeshare'
    data_filenames = ['2017-q2_trip_history_data.csv', '2017-q1_trip_history_data.csv',
                      '2017-q3_trip_history_data.csv','2017-q4_trip_history_data.csv']
    
    def collect_data():   #数据收集
        data_arr_list = []
        for data_filename in data_filenames:
            data_file = os.path.join(data_path, data_filename)
            #读数据的时候默认读取是浮点数, 但是看这个csv的数据类型,各种的都有还有年月日的,所以保险起见都使用字符串类型
            data_arr = np.loadtxt(data_file, delimiter=',', dtype = 'str',skiprows = 1)  #读进来的数据
            data_arr_list.append(data_arr)
        return data_arr_list
    def process_data():
        pass
    def analyze_data():
        pass
    def show_results():
        pass
    def main():
        collect_data()
        process_data()
        analyze_data()
        show_results()
    main()
    

    这个时候,做单步调试,可以一窥变量格式,还可以使用.ndim方法看数据变量是几维的。。

    用python读取时候,读取出来的对象可以看见是矩阵形式

    还记不记得字符串模板

        template='token={token}&user={user}&message={msg}&title={t}&url={url}'
        #这个是字符串模板,常常是复杂字符串拼接时候会用的,是一种很简明的办法
        query = template.format(
            token = token,
            user = user,
            msg  =message,
            t = title,
            url = url
        )
    
    format方法,字符串模板

    全部代码如下

    import os
    import numpy as np
    import matplotlib.pyplot as plt
    
    data_path = '/Users/miraco/PycharmProjects/DataMining/bikeshare'
    data_filenames = ['2017-q1_trip_history_data.csv', '2017-q2_trip_history_data.csv',
                      '2017-q3_trip_history_data.csv','2017-q4_trip_history_data.csv']
    
    def collect_data():   #数据收集
        data_arr_list = []
        for data_filename in data_filenames:
            data_file = os.path.join(data_path, data_filename)
            print(data_file)
            #读数据默认按浮点数读, 但看这csv数据类型,各种还有年月日的,保险起见都用字符串类型
            data_arr = np.loadtxt(data_file, delimiter=',', dtype = 'str',skiprows = 1)   #读进来的数据
            data_arr_list.append(data_arr)
        return data_arr_list
    
    def process_data(data_arr_list):  #数据处理
        duration_in_min_list = []
        for data_arr in data_arr_list:
            duration_str_col = data_arr[:,0]  #骑行时间取首列
            #得到str类型时间,是这种"23456"形式,需要去掉双引号然后再类型转换,
           #可以用replace+循环体,但是太麻烦,这里使用向量操作。
            duration_in_ms  = np.core.defchararray.replace(duration_str_col,'"','')
    
            #类型转换成浮点类型,再转换成分钟, 可以对列进行直接操作
            duration_in_min = duration_in_ms.astype('float')/1000/60
            duration_in_min_list.append(duration_in_min)
        return duration_in_min_list
    
    def analyze_data(duration_in_min_list):  #数据分析
        duration_mean_list = []
        for i, duration in enumerate(duration_in_min_list):
            duration_mean = np.mean(duration)    #均值内置方法
            print('第{}个季度的平均骑行时间: {:.2f}分钟'.format(i+1, duration_mean))
            duration_mean_list.append(duration_mean)
        return duration_mean_list
    
    def show_results(duration_mean_list):          #数据展示
        plt.figure()
        plt.bar(range(len(duration_mean_list)),duration_mean_list)
        plt.show()
    
    def main():
        #数据收集
        data_arr_list = collect_data()
    
        #数据处理
        duration_in_min_list  = process_data(data_arr_list)
    
        #数据分析
        duration_mean_list = analyze_data(duration_in_min_list)
    
        #数据呈现
        show_results(duration_mean_list)
    if __name__ == '__main__':
        main()
    
    

    通俗理解__name__ == '__main__'

    假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明');
    在你自己眼中,你是你自己(__name__ == '__main__')。

    if __name__ == '__main__'的意思是:
    .py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;
    .py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。

    用到的知识点

    image.png

    需要注意的地方

    • 因为numpy默认是读取成浮点型,你为了方便数据处理以及保险起见,读进去的时候强行指定你读取的dtype为str,这样就可以保留全部字面上的信息了,于是乎就多了引号了,所以要去除引号,再转float,比较保险。所以这句的意思就是:数据读取按照字符串读取,不按浮点数读取,跳过第一行,避免年月日之类的信息读取出错data_arr = np.loadtxt(目标文件, delimiter=',', dtype = 'str',skiprows = 1)

    • 字符串转换成浮点型时候,需要先去掉两边的双引号,这个操作不要使用循环体,数据很大的时候会特别慢,直接np.core.defchararray.replace(目标,'"','')即可实现向量级的操作

    • 类型转换成浮点类型,再转换成分钟, 可以对列进行直接操作
      目标.astype('float')

    • 能用内置方法用内置方法,np.mean之类的,速度快。

    • 画图
      plt.figure()
      plt.bar(range(len(duration_mean_list)),duration_mean_list)
      plt.show()

    结果图

    image.png

    图片美化事宜。来日再谈。

    相关文章

      网友评论

          本文标题:21 Numpy、共享单车骑行数据

          本文链接:https://www.haomeiwen.com/subject/snvbpftx.html