2-4_Date_Type_analysis

%matplotlib inline

import pandas as pd
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
plt.style.use("bmh")
plt.rc('font', family='SimHei', size=20) #显示中文
pd.set_option('display.max_columns',1000)
pd.set_option('display.width', 1000)
pd.set_option('display.max_colwidth',1000)

这一部分我们做点时间维度相关的分析,比如看看到底这个城市的人周末骑自行车出行多,还是工作日多

也就是咱们看看大家都是骑车出去玩,还是去工作。

4.1 区分工作日和周末

加载数据

bikes = pd.read_csv('bikes.csv', sep=';', encoding='latin1', parse_dates=['Date'], dayfirst=True, index_col='Date')
bikes.head()
Berri 1Bré–Žeuf (donné–‘s non disponibles)Cé­Œe-Sainte-CatherineMaisonneuve 1Maisonneuve 2du ParcPierre-DupuyRachel1St-Urbain (donné–‘s non disponibles)
Date
2012-01-0135NaN03851261016NaN
2012-01-0283NaN16815353643NaN
2012-01-03135NaN210424889358NaN
2012-01-04144NaN1116318111861NaN
2012-01-05197NaN2124330971395NaN
bikes.columns
Index(['Berri 1', 'Bré–Žeuf (donné–‘s non disponibles)', 'Cé­Œe-Sainte-Catherine', 'Maisonneuve 1', 'Maisonneuve 2', 'du Parc', 'Pierre-Dupuy', 'Rachel1', 'St-Urbain (donné–‘s non disponibles)'], dtype='object')
bikes['Berri 1'].unique()[:5]
array([ 35,  83, 135, 144, 197], dtype=int64)
bikes['Berri 1'].value_counts()[:5]
3341    3
1986    2
303     2
3698    2
3964    2
Name: Berri 1, dtype: int64
bikes['Berri 1'].plot(figsize=(20,10))
<matplotlib.axes._subplots.AxesSubplot at 0xe8ff7b8>

在这里插入图片描述

咱们先随便选一列出来吧,比如选’Berri 1’单独成一个berri_bikes的dataframe

berri_bikes = bikes[['Berri 1']].copy()
berri_bikes[:5]
Berri 1
Date
2012-01-0135
2012-01-0283
2012-01-03135
2012-01-04144
2012-01-05197

然后为了区分工作日和周末,我们加一列’weekday’。

对了,这里要提到一个概念,叫做index,也就是大家在数据库里面熟知的索引,在dataframe里面也有,比如我们刚才的数据,index就是日期。

berri_bikes.index
DatetimeIndex(['2012-01-01', '2012-01-02', '2012-01-03', '2012-01-04', '2012-01-05', '2012-01-06', '2012-01-07', '2012-01-08', '2012-01-09', '2012-01-10',
               ...
               '2012-10-27', '2012-10-28', '2012-10-29', '2012-10-30', '2012-10-31', '2012-11-01', '2012-11-02', '2012-11-03', '2012-11-04', '2012-11-05'], dtype='datetime64[ns]', name='Date', length=310, freq=None)

*如果仔细观察,你会发现里面有些天的数据丢失了。(牛逼的数据分析师真的一眼能看出来,咳咳,反正我也没一眼看出来)

我们通过.day可以直接看到是一个月的第几天。

berri_bikes.index.day #一个月的第几天
Int64Index([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10,
            ...
            27, 28, 29, 30, 31,  1,  2,  3,  4,  5], dtype='int64', name='Date', length=310)

然后我们发个大招,其实dataframe对于日期类型的数据,可以直接知道是星期几!!!

berri_bikes.index.weekday #一周的第几天
Int64Index([6, 0, 1, 2, 3, 4, 5, 6, 0, 1,
            ...
            5, 6, 0, 1, 2, 3, 4, 5, 6, 0], dtype='int64', name='Date', length=310)

其中0是星期一,1是星期二,以此类推。所以我们可以直接生成一列,指明是星期几啦。

berri_bikes.loc[:,'weekday'] = berri_bikes.index.weekday
berri_bikes[:5]
Berri 1weekday
Date
2012-01-01356
2012-01-02830
2012-01-031351
2012-01-041442
2012-01-051973

4.2 分组+排序+聚合统计

用过SQL里面的groupby吗,恰巧pandas的dataframe也有一个.groupby()函数,而且好用得一塌糊涂。

比如呢,下面这句 berri_bikes.groupby('weekday').aggregate(sum) 的意思就是说,“你给老纸把数据按照星期几分一下组,然后给我加和一下,结果返给我!!!”

berri_bikes.loc[berri_bikes['weekday']==0,'Berri 1'].max()
6206
weekday_counts = berri_bikes.groupby('weekday').aggregate(sum)
weekday_counts
Berri 1
weekday
0134298
1135305
2152972
3160131
4141771
5101578
699310
weekday_counts.index
Int64Index([0, 1, 2, 3, 4, 5, 6], dtype='int64', name='weekday')

哦,对了,我也不喜欢数字0, 1, 2, 3, 4, 5, 6,像我这种智商欠费的同学,根本对应不上星期几,所以取个名字好了,然后加上去。

weekday_counts.index = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekday_counts
Berri 1
Monday134298
Tuesday135305
Wednesday152972
Thursday160131
Friday141771
Saturday101578
Sunday99310

完美!然后我们再画个图,哈哈哈,又是画图!

weekday_counts.plot(figsize=(20,10),kind='bar')
<matplotlib.axes._subplots.AxesSubplot at 0xee7fb00>

在这里插入图片描述

看似这个地区的同学骑自行车很多时候是工作日骑的,是去上班?

4.3 把刚才学的放一块儿

把刚才学到的东西串一块儿,能看到很神奇pandas处理结果啦。

你可以试试把sum 换做 max或者numpy.median,求最大和平均,也可以试试更多的函数!!

bikes = pd.read_csv('bikes.csv', 
                    sep=';', encoding='latin1', 
                    parse_dates=['Date'], dayfirst=True, 
                    index_col='Date')
# Add the weekday column
berri_bikes = bikes[['Berri 1']].copy()
berri_bikes.loc[:,'weekday'] = berri_bikes.index.weekday

# Add up the number of cyclists by weekday, and plot!
weekday_counts = berri_bikes.groupby('weekday').aggregate(sum)
weekday_counts.index = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekday_counts.plot(kind='bar')
<matplotlib.axes._subplots.AxesSubplot at 0x11518eb8>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安替-AnTi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值