21 Numpy、共享单车骑行数据
这里需要三个库
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
方法看数据变量是几维的。。
还记不记得字符串模板
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图片美化事宜。来日再谈。