2.4_Date_Type_analysis数据类型分析

# * coding:utf-8_*_
# 作者     :XiangLin
# 创建时间 :11/02/2020 11:03
# 文件     :2-4_Date_Type_analysis.py
# IDE      :PyCharm
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')
print(bikes.head())
print(bikes.columns)
print(bikes['Berri 1'].unique()[:5])
print(bikes['Berri 1'].value_counts()[:5])
bikes['Berri 1'].plot(figsize=(20,10))
plt.show()
输出:

            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)
Date                                                                                                                                                                                
2012-01-01       35                                  NaN                       0             38             51       26            10       16                                   NaN
2012-01-02       83                                  NaN                       1             68            153       53             6       43                                   NaN
2012-01-03      135                                  NaN                       2            104            248       89             3       58                                   NaN
2012-01-04      144                                  NaN                       1            116            318      111             8       61                                   NaN
2012-01-05      197                                  NaN                       2            124            330       97            13       95                                   NaN
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')
[ 35  83 135 144 197]
3341    3
1986    2
303     2
3698    2
3964    2

在这里插入图片描述
咱们先随便选一列出来吧,比如选’Berri 1’单独成一个berri_bikes的dataframe

berri_bikes = bikes[['Berri 1']].copy()
print(berri_bikes[:5])
输出:
Name: Berri 1, dtype: int64
            Berri 1
Date               
2012-01-01       35
2012-01-02       83
2012-01-03      135
2012-01-04      144
2012-01-05      197

然后为了区分工作日和周末,我们加一列’weekday’。
对了,这里要提到一个概念,叫做index,也就是大家在数据库里面熟知的索引,在dataframe里面也有,比如我们刚才的数据,index就是日期。

print(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可以直接看到是一个月的第几天。*

print(berri_bikes.index.day)  #一个月的第几天
# 然后我们发个大招,其实dataframe对于日期类型的数据,可以直接知道是星期几!!!
print(berri_bikes.index.weekday) # 一周的第几天
# 其中0是星期一,1是星期二,以此类推。所以我们可以直接生成一列,指明是星期几啦。
berri_bikes.loc[:,'weekday'] = berri_bikes.index.weekday
print(berri_bikes[:5])
输出:
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)
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)
            Berri 1  weekday
Date                        
2012-01-01       35        6
2012-01-02       83        0
2012-01-03      135        1
2012-01-04      144        2
2012-01-05      197        3

4.2 分组+排序+聚合统计

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

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

print(berri_bikes.loc[berri_bikes['weekday'] == 0, 'Berri 1'].max())
weekday_counts = berri_bikes.groupby('weekday').aggregate(sum)
print(weekday_counts)
print(weekday_counts.index)
输出:
6206
         Berri 1
weekday         
0         134298
1         135305
2         152972
3         160131
4         141771
5         101578
6          99310
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']
print(weekday_counts)
输出:
           Berri 1
Monday      134298
Tuesday     135305
Wednesday   152972
Thursday    160131
Friday      141771
Saturday    101578
Sunday       99310

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

weekday_counts.plot(figsize = (20,10),kind = 'bar')
plt.show()

在这里插入图片描述
看似这个地区的同学骑自行车很多时候是工作日骑的,是去上班?

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(figsize = (20,10),kind = "bar")
plt.show()

在这里插入图片描述
数据链接:链接:https://pan.baidu.com/s/1Mt3sCUeJGkTs8wefOdilpQ
提取码:ysjc
来自七月在线数据挖掘算法
向林
2020年2月11日于重庆城口
好好学习,天天向上,终有所获

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值