前文我们检查了与完整数据集相关的汇总统计数据,然后考虑在夜间提供更低的用车价格以增加夜间骑行人数。要实现这个想法,我们应该检查夜间的相关统计数据。
我们可以从使用loc()方法开始:
print(hour.loc[3,'count'])
loc()方法允许我们指定数据的子集。使用loc()时,需要使用方括号和格式“[<行>, <列>]”来指定要选择的子集。在这里,我们指定了[3, 'count'],表示选择数据的第3行和count列。我们从这里得到的输出是13,如果你查看图1-1或图1-2中的数据,会发现这个结果是正确的。
这里需要指出的一件重要的事情是,在Python和pandas中,标准做法是使用从0开始的索引。我们从0开始计数,所以如果数据有4行,我们会将这些行标记为0、1、2、3。数据的第4行对应的索引为3。类似地,数据的第3行的索引为2,第2行的索引为1,第1行的索引为0。这就是为什么当我们运行print(hour.loc[3, 'count'])时,得到的是13(它是存储在count列的第4个值,来自索引为3的行),而不是32(它是存储在count列的第3个值,来自索引为2的行)。许多人对使用从0开始的索引并不熟悉,但通过积累经验,你可以逐渐适应这种使用方式。
在之前的代码片段中,我们查看了一个由单个数字(单行和单列的count)组成的子集。但你可能想了解由多个行或多个列组成的子集。通过使用冒号(:),我们可以指定想要查看的行范围:
print(hour.loc[2:4,'registered'])
在这个代码片段中,我们指定了想要获取的registered列的值。在方括号中指定2:4,表示我们想要获取从第3行到第5行的所有行,因此输出结果为3个数字:27、10和1。查看这些行,你会发现这些是凌晨2点、3点和4点的相关数据。我们并没有输出所有的数据,而是只输出了3行数据。由于只输出了一个子集,可以称这种方法为子集选择——选择数据的子集。在探索和分析数据时,这种方法非常有效。
除了一次性查看几个相邻的行,我们还可以查看数据中的所有夜间观察结果。我们可以使用loc()方法结合逻辑条件来实现:
print(hour.loc[hour['hr']<5,'registered'].mean())
这个代码片段使用loc()方法来访问数据的子集,就像之前所做的一样。然而,它没有指定特定的行号,而是指定了一个逻辑条件hour['hr']<5,该条件意味着它将选择数据中hr变量值小于5的每一行,我们将得到凌晨0点到4点对应的数据子集。我们可以为更复杂的逻辑指定多个条件,例如,可以专门检查在寒冷的清晨和温暖的清晨的平均骑行人数:
print(hour.loc[(hour['hr']<5) & (hour['temp']<0.50),'count'].mean()) print(hour.loc[(hour['hr']<5) & (hour['temp']>0.50),'count'].mean())
在这里,我们指定了多个逻辑条件,用“&”字符来连接,表示“与”,这意味着两个条件必须同时成立。第一行选择了hr值小于5且temp值小于0.50的行。在hour数据集内,temp变量记录的是温度,但没有使用我们熟悉的华氏温度或摄氏温度,而是使用一种特殊的度量标准,将所有温度值转化为0~1,其中0表示较低的温度,1表示较高的温度。无论何时处理数据,确保准确知道每个变量使用的单位非常重要。我们通过指定hour['temp']<0.50选择较低温度的时间段,通过指定hour['temp']>0.50选择较高温度的时间段。将这些时间段的记录放在一起,就能够比较寒冷的清晨和温暖的清晨的平均骑行人数了。
我们还可以使用“|”符号表示“或”,如下面的例子所示:
print(hour.loc[(hour['temp']>0.5) | (hour['hum']>0.5),'count'].mean())
这行代码选择了温度较高或湿度较高的行中的平均骑行人数,并非要求两个条件同时满足。通过获取上面的数据,可以知道在天气状况不好的情况下各个时间段内的骑行人数。
夜间折扣并不是增加骑行人数和收入的唯一可行策略。你还可以考虑在特定季节或一年中的某些时间段提供特别优惠。在数据中,season变量使用1表示冬季,2表示春季,3表示夏季,4表示秋季。我们可以使用groupby()方法来获取每个季节每小时的平均骑行人数:
print(hour.groupby(['season'])['count'].mean())
这个代码片段中的很多内容,我们应该已经熟悉了。我们使用print()来查看与hour数据相关的指标,使用mean()方法获取均值,使用['count']来访问数据的count列。因此,这个代码片段的结果将显示按照季节进行分组之后的各个小时对应的平均骑行人数。
唯一的新部分是groupby(['season'])。这是一个将数据分组的方法,在本例中,每个出现在season列中的唯一值对应一个组。如下输出结果显示了每个季节的平均骑行人数:
season 1 111.114569 2 208.344069 3 236.016237 4 198.868856 Name: count, dtype: float64
解读这个输出结果很简单:在第一个季节(冬季),每小时的平均骑行人数约为111;在第二个季节(春季),每小时的平均骑行人数约为208;依此类推。结果明显存在季节性模式:春季和夏季的骑行人数较多,秋季和冬季的骑行人数较少。groupby()方法也可以用于在多个列上进行分组操作,如下所示:
print(hour.groupby(['season','holiday'])['count'].mean())
运行结果如下所示:
season holiday 1 0 112.685875 1 72.042683 2 0 208.428472 1 204.552083 3 0 235.976818 1 237.822917 4 0 199.965998 1 167.722222 Name: count, dtype: float64
在这里,我们指定了两个列进行分组:季节(season)和假期(holiday)。这将数据分成了4个季节,并将每个季节分成假期(用1表示)和非假期(用0表示),分别显示每个季节的假期和非假期的平均骑行人数。这样我们可以按照季节了解假期和非假期骑行人数的差异。在较寒冷的季节里,假期的骑行人数明显少于非假期的,而在较温暖的季节里,假期的骑行人数与非假期的大致相等。了解这些差异可以帮助你做出有关业务运营的决策,并可能为你在不同季节或不同假期制定策略提供灵感。
hour数据集很大,可以以许多不同的方式进行研究。我们查看了一些子集并得到了一些想法。你应该做更多的工作:检查与所有列相关的子集,并从多个角度探索数据。即使不进行高级统计和机器学习,你也可以了解很多内容,并获得许多有用的想法。