关于数据科学的学习,咸鱼也进行了一段时间,但是光学不练是学一点忘一点,所以咸鱼找了一些某共享单车的数据进行一点简单的数据分析。
思路整理咸鱼也是第一次动手写数据分析相关的代码,所以咸鱼上网找了一张大致的流程图,且以此整理思路,分隔代码。
图 | 源自网络
在企业实际开发中各个步骤的代码不会像咸鱼下面的代码一样各块分隔的那么清楚,肯定是相互交织且复杂的。
实战 分析目的
看标题就知道了,分析各季度共享单车的骑行时间。
数据收集因为这次的数据源自网络,所以先简单看下数据的结构:
可以看到数据有9个字段:
"Duration?(ms)","Start?date","End?date","Start?station?number","Start?station","End?station?number","End?station","Bike?number","Member?type"
按照我们的目标,我们只需要第一个字段 Duration(ms) 。
所以第一步先读取已经下载好的数据之后在第二步数据清洗中取出需要的字段:
#?数据收集 def?data_collection(): ????data_arr_list?=?[] ????for?data_filename?in?data_filenames: ????????file?=?os.path.join(data_path,?data_filename) ????????data_arr?=?np.loadtxt(file,dtype=bytes,delimiter=',',?skiprows=1).astype(str) ????????data_arr_list.append(data_arr) ????return?data_arr_list
这里关于numpy的用法,可以参考之前的几篇关于numpy的文章:
Data Science | Numpy基础(一)
Data Science | Numpy基础(二)
Data Science | 福利列表 | Numpy基础(三)
数据清洗因为数据是整理后导出的数据所以不需要清洗缺失值等操作,我们直接取出需要的字段,做一些处理即可。
这里骑行时间单位为ms,所以需要转化为min需要/1000/60。
#?数据清洗 def?data_clean(data_arr_list): ????duration_min_list?=?[] ????for?data_arr?in?data_arr_list: ????????data_arr?=?data_arr[:,0] ????????duration_ms?=?np.core.defchararray.replace(data_arr,'"','') ????????duration_min?=?duration_ms.astype('float')?/?1000?/?60 ????????duration_min_list.append(duration_min) ????return?duration_min_list数据分析
计算平均值在numpy中提供了计算函数,直接调用即可。
#?数据分析 def?mean_data(duration_min_list): ????duration_mean_list?=?[] ????for?duration_min?in?duration_min_list: ????????duration_mean?=?np.mean(duration_min) ????????duration_mean_list.append(duration_mean) ????return?duration_mean_list结果展示
这里可视化展示使用的是matplotlib.pyplot库,咸鱼目前还没有写相关的入门文章,可以上网看下文档学习下简单使用即可,之后会有系列文章写可视化的内容。
#?数据展示 def?show_data(duration_mean_list): ????plt.figure() ????name_list?=?['第一季度',?'第二季度',?'第三季度',?'第四季度'] ????plt.bar(range(len(duration_mean_list)),duration_mean_list,tick_label?=?name_list) ????plt.show()成果展示
单单从上面的图可以看到以炎热的夏季和凉爽的秋季为主调的二三季度的骑行时间要高于春冬为主调的一四季度,以此判断气温变化对人们使用的共享单车的影响。
一些踩过的坑 关于数据读取(一)在python中字符串是有字节字符串和文本字符串之分的,我们通常说的字符串是指文本字符串。而使用numpy的loadtxt函数读取的字符串默认是字节字符串,输出的话字符串前面会有个b,形如b’……’。通常是需要转换的,如果不转换将会出现问题。
在 数据收集 部分如果不注意这一点,在 数据清洗 部分,字段的格式就会因为 Duration 的值多了一个 b 转化上就会报错。
处理方式:
numpy.loadtxt读入的字符串总是bytes格式,总是在前面加了一个b 原因:np.loadtxt and np.genfromtxt operate in byte mode, which is the default string type in Python 2. But Python 3 uses unicode, and marks bytestrings with this b. numpy.loadtxt中也声明了:Note that generators should return byte strings for Python 3k.解决:使用numpy.loadtxt从文件读取字符串,最好使用这种方式np.loadtxt(filename, dtype=bytes).astype(str)
作者:Cameron 链接:https://HdhCmsTestzhihu测试数据/question/28690341/answer/164344688 来源:知乎
关于数据读取上的坑(二)可以看到咸鱼在读取数据的时候使用的是numpy.loadtxt,这样的操作固然方便,但是代价就是内存直接爆掉,还好这次的数据才500M,所以不推荐大家使用我这个方法,之后会加以改进(如果我会的话
)
这里分享一段代码,来自慕课网bobby老师的实战课,如何使用生成器读取大文本文件:
#500G,?特殊?一行 def?myreadlines(f,?newline): ??buf?=?"" ??while?True: ????while?newline?in?buf: ??????pos?=?buf.index(newline) ??????yield?buf[:pos] ??????buf?=?buf[pos?+?len(newline):] ????chunk?=?f.read(4096) ????if?not?chunk: ??????#说明已经读到了文件结尾 ??????yield?buf ??????break ????buf?+=?chunk with?open("input.txt")?as?f: ????for?line?in?myreadlines(f,?"{|}"): ????????print?(line)关于matplotlib.pyplot使用上的坑
在可视化的时候,柱状图的标识是中文,在显示的时候直接显示的是方块,无法显示中文。如下:
错误示范
处理方法:
解决方式一:修改配置文件 (1)找到matplotlibrc文件(搜索一下就可以找到了) (2)修改:font.serif和font.sans-serif,我的在205,206行 font.serif:?SimHei,?Bitstream?Vera?Serif,?New?Century?Schoolbook,?Century?Schoolbook?L,?Utopia,?ITC?Bookman,?Bookman,?Nimbus?Roman?No9?L,?Times?New?Roman,?Times,?Palatino,?Charter,?serif?Bookman,?Nimbus?Roman?No9?L,?Times?New?Roman,?Times,?Palatino,?Charter,?serif font.sans-serif:?SimHei,?Bitstream?Vera?Sans,?Lucida?Grande,?Verdana,?Geneva,?Lucid,?Arial,?Helvetica,?Avant?Garde,?sans-serif 解决方式二:在代码中修改 import?matplotlib 指定默认字体 matplotlib.rcParams[‘font.sans-serif’]?=?[‘SimHei’] matplotlib.rcParams[‘font.family’]=’sans-serif’ 解决负号’-‘显示为方块的问题 matplotlib.rcParams[‘axes.unicode_minus’]?=?False --------------------- 来源:CSDN 原文:https://blog.csdn.net/weixin_40283480/article/details/81613008
如果感觉有帮助的话,不妨点个好看?
查看更多关于数据分析 | Numpy实战(一) - 分析某单车骑行时间的详细内容...