一、数据分析
1.数据特征
总共15个特征:
特征名 | 含义 | 数据形式 | 单位 |
---|---|---|---|
Trip duration | 骑行持续时间 | 23 | 秒 |
start time | 骑行起始日期 | 2014/1/1 0:00:06 | 年月日 |
stop time | 骑行终止日期 | 2014/1/1 0:00:12 | 年月日 |
start station id | 起始站ID | 2009 | |
start station name | 终止站名称 | Catherine St & Monroe St | |
start station latitude | 起始站纬度 | 40.71117444 | |
start station longitude | 起始站经度 | -73.99682619 | |
end station id | 终止站ID | 259 | |
end station name | 终止站名称 | Elizabeth St & Hester St | |
end station latitude | 终止站纬度 | 40.71729 | |
end station longitude | 终止站经度 | -73.996375 | |
bike id | 单车ID | 16379 | |
user type | 用户类型 | Subscriber或Customer | |
birth year | 用户生日 | 1989,单位:年 | |
gender | 性别 | 0或1或2 |
注:性别(0=未知; 1 =男性; 2 =女性)
2.数据预处理
(1)数据文件读取
首先在本地创建一个文件夹dataSet,将12 个.csv数据集文件存入该文件夹。然后输入Python的文件操作模块glob,将dataSet文件夹下所有.csv文件读取到filename中,读取文件后返回的filename为列表List格式,然后通过列表排序函数.sort(),对文件名数字排序后再打印出来。
# 获取文件名
import glob
filenames = glob.glob('dataSet/*.csv')
filenames.sort()
print(filenames)
打印输出文件名列表:
['dataSet\\2014-01 - Citi Bike trip data.csv', 'dataSet\\2014-02 - Citi Bike trip data.csv', 'dataSet\\2014-03 - Citi Bike trip data.csv', 'data
Set\\2014-04 - Citi Bike trip data.csv', 'dataSet\\2014-05 - Citi Bike trip data.csv', 'dataSet\\2014-06 - Citi Bike trip data.csv', 'dataSet\\2014-07 - Citi Bike trip data.csv', 'dataSet\\2014-08 - Citi Bike trip data.csv', 'dataSet\\2014-09 - Citi Bike trip data.csv', 'dataSet\\2014-10 - Citi Bike trip data.csv', 'dataSet\\2014-11 - Citi Bike trip data.csv', 'dataSet\\2014-12 - Citi Bike trip data.csv']
(2)合并数据文件
输入pandas模块,利用循环,逐个通过函数pd.read_csv(file)读取12个数据文件flie,然后使用函数dfs.append(pd.read_csv(file)),将12个数据文件合并为一个列表dfs,该列表含有12个元素,每个元素为一个月的数据。
import pandas as pd
# 循环读取文件数据
dfs = []
for file in filenames:
print('Reading ' + file)
dfs.append(pd.read_csv(file))
打印输出拼接进程:
Reading dataSet\2014-01 - Citi Bike trip data.csv
Reading dataSet\2014-02 - Citi Bike trip data.csv
Reading dataSet\2014-03 - Citi Bike trip data.csv
Reading dataSet\2014-04 - Citi Bike trip data.csv
Reading dataSet\2014-05 - Citi Bike trip data.csv
Reading dataSet\2014-06 - Citi Bike trip data.csv
Reading dataSet\2014-07 - Citi Bike trip data.csv
Reading dataSet\2014-08 - Citi Bike trip data.csv
Reading dataSet\2014-09 - Citi Bike trip data.csv
Reading dataSet\2014-10 - Citi Bike trip data.csv
Reading dataSet\2014-11 - Citi Bike trip data.csv
Reading dataSet\2014-12 - Citi Bike trip data.csv
--------------------------------------------------------------注释分割线--------------------------------------------------------------
注:
通过pd.read_csv(file)函数读取的文件,会被转化为DataFrame文件,即表格型的数据,所以dfs中的12个元素均为DataFrame文件格式。
--------------------------------------------------------------注释分割线--------------------------------------------------------------
(3)数据格式转换
在检查数据格式的时候发现9月份以后所有数据的sarttime和stoptime日期格式与其他月份的格式不同,需要进行转换。
首先检查一下8月和9月的数据格式,输出前2行查看:
dfs[7].head(2) # 检查8月份的数据
输出:
dfs[8].head(2) #检查9月的数据
输出:
dfs[9].head(2) #检查10月的数据
输出:
很明显,8月和9月份及以后的数据的sarttime和stoptime日期格式统一,因此对数据的日期格式进行统一转化为日期格式。利用pandas库的pd.to_datetime()函数。
print('Converting month:')
for month in range(12):
if month < 8:
print('... ' + str(month + 1))
dfs[month]['starttime'] = pd.to_datetime(dfs[month]['starttime'])
dfs[month]['stoptime'] = pd.to_datetime(dfs[month]['stoptime'])
else:
print('... ' + str(month + 1))
dfs[month]['starttime'] = pd.to_datetime(dfs[month]['starttime'],
format = '%m/%d/%Y %H:%M:%S')
dfs[month]['stoptime'] = pd.to_datetime(dfs[month]['stoptime'],
format = '%m/%d/%Y %H:%M:%S')
输出转化过程:
Converting month:
... 1
... 2
... 3
... 4
... 5
... 6
... 7
... 8
... 9
... 10
... 11
... 12
--------------------------------------------------------------注释分割线--------------------------------------------------------------
注:
在上述转化中,为什么将8月份以前的正确的日期也转化为datetime呢?因为在DataFrame中,日期有专门的格式,为datetime。而我们原始数据中的日期,虽然字面上和日期格式相同,但Python并不能识别出来是日期格式(人和机器的区别在此),我们通过代码查看一下两种日期的格式:
#打印出未处理的9月份starttime前两行的时间
dfs[9]['starttime'].head(2)
#打印出经过转化的8月份starttime前两行的时间
dfs[7]['starttime'].head(2)
如上两图所示,日期未转化前类型为:dtype:object,经过转化的日期格式为:dtype: datetime。这个object格式一般是python用来记录可变化的兑现的格式。这个格式python并不能认出是时间格式,尽管我们一眼就能看出。
--------------------------------------------------------------注释分割线--------------------------------------------------------------
(4)拼接数据
前面通过dfs.append(pd.read_csv(file))将所有的数据都放在了dfs列表中,其有12个DataFrame元素,现在将12个DataFrame数据拼接为一个数据表df。
df = pd.concat(dfs)
查看该数据表的大小:
df.shape
输出:
(8081216, 15)
即总共有808万次骑行数据,15个特征。