iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0
自我挑戰組

商業數據分析應用系列 第 4

[Day4]資料載入

  • 分享至 

  • xImage
  •  

今天來將資料載入Python中,並進行一些簡單的運算。
發現資料共有426887筆數據,因此花了一點時間來跑。

首先使用import匯入所需套件,並載入csv檔案。

import csv
import pandas as pd
import numpy as np
import datetime as dt

with open("data of 12 months 2020.csv","r") as csvfile:
    rows=csv.reader(csvfile)
    L=[]
    for row in rows:
        L.append(row)
data=pd.DataFrame(L[1:426888],columns=L[0])

接著檢查資料是否有空值

data.info()
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 426887 entries, 0 to 426886
Data columns (total 15 columns):
 #   Column              Non-Null Count   Dtype 
---  ------              --------------   ----- 
 0   ride_id             426887 non-null  object
 1   rideable_type       426887 non-null  object
 2   started_at          426887 non-null  object
 3   ended_at            426887 non-null  object
 4   start_station_name  426887 non-null  object
 5   start_station_id    426887 non-null  object
 6   end_station_name    426887 non-null  object
 7   end_station_id      426887 non-null  object
 8   start_lat           426887 non-null  object
 9   start_lng           426887 non-null  object
 10  end_lat             426887 non-null  object
 11  end_lng             426887 non-null  object
 12  member_casual       426887 non-null  object
 13  ride_length         426887 non-null  object
 14  day_of_the_week     426887 non-null  object
dtypes: object(15)
memory usage: 48.9+ MB

因為已知有兩個欄位是日期,故修改資料屬性(dtype)為日期。

data['started_at']=pd.to_datetime(data['started_at'])
data['ended_at']=pd.to_datetime(data['ended_at'])

此時在查詢dataframe,即可發現屬性已更改。

data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 426887 entries, 0 to 426886
Data columns (total 15 columns):
 #   Column              Non-Null Count   Dtype         
---  ------              --------------   -----         
 0   ride_id             426887 non-null  object        
 1   rideable_type       426887 non-null  object        
 2   started_at          426887 non-null  datetime64[ns]
 3   ended_at            426887 non-null  datetime64[ns]
 4   start_station_name  426887 non-null  object        
 5   start_station_id    426887 non-null  object        
 6   end_station_name    426887 non-null  object        
 7   end_station_id      426887 non-null  object        
 8   start_lat           426887 non-null  object        
 9   start_lng           426887 non-null  object        
 10  end_lat             426887 non-null  object        
 11  end_lng             426887 non-null  object        
 12  member_casual       426887 non-null  object        
 13  ride_length         426887 non-null  object        
 14  day_of_the_week     426887 non-null  object        
dtypes: datetime64[ns](2), object(13)
memory usage: 48.9+ MB

進行基礎計算

data['ride_id'].nunique() #不重複使用者數量
sum(data['member_casual']=='member')#會員數量
sum(data['member_casual']=='casual')#非會員數量

###
data['ride_id'].nunique()
Out[5]: 426870

sum(data['member_casual']=='member')
Out[7]: 378407

sum(data['member_casual']=='casual')
Out[8]: 48480

因為【租借時間長短】與【會員】是這份數據中蠻重要的資訊,因此我先將data用'ride_length'這欄來降冪排序觀察

data1=data.sort_values('ride_length',ascending=False)
print(data1.head(5))
print(data1.tail(10)) 

                 ride_id rideable_type  ... ride_length day_of_the_week
1354    2D4EA0D9064662D6   docked_bike  ...    23:56:49               3
353057  651C959936BA3227   docked_bike  ...    23:56:45               4
226720  EB83072244DF5183   docked_bike  ...    23:55:55               4
107043  8994CCC830A3DDF1   docked_bike  ...    23:54:37               5
341354  B6DE81A51970FF21   docked_bike  ...    23:54:27               7

[5 rows x 15 columns]

                ride_id  ... day_of_the_week
36003  A2DB7BCC7AB7F146  ...               2
49001  323CAC41316F59B2  ...               6
28252  20F8FA5027ACB687  ...               4
35697  A942AA191C6BE467  ...               2
28009  4B1478D45C94AB00  ...               4
24409  8151A1ECCD4115C9  ...               6
26425  3CC0D87545CE223B  ...               5
48966  F11811E0E538496C  ...               6
35889  35FA27C6C7E9CF72  ...               2
26078  0471ABC706B0F5D9  ...               5

[10 rows x 15 columns]

此時發現沒有出現後十筆的時間,選了幾個index想一探究竟
卻發現印出來的是無數個#

原以為資料沒有空值蠻乾淨的,結果還是有一些需要清理的資料xd
回去原始檔案看,也發現真的有不少租借時間為「#」的欄位。
也有大概看一下這幾個是「#」的資料,在租借與租還的地點都是HQ,猜測大概是在車輛維護時的資料吧。

原本想要在今天將含有#的資料從DataFrame中刪除的,但是試了幾種方法都沒有成功。
眼看交稿時間要到了,就先來更新文章xd
明天再來更新進度!/images/emoticon/emoticon13.gif

順便附上測試時回報錯誤的資訊:

#test1
data_clear=data.drop(data[data['ride_length']=='#*'].index)
#test2
L1=[]
for i in data1:
    if data1.iloc[i,13]!='#%':
        L1.append(data1[:,:])       
    else:
        pass

第一筆雖然沒有錯誤,但是筆數卻沒有減少/images/emoticon/emoticon02.gif
第二筆出現了以下訊息
ValueError: Location based indexing can only have [integer, integer slice (START point is INCLUDED, END point is EXCLUDED), listlike of integers, boolean array] types

明天見!


上一篇
[Day3] 資料的選擇及初步數據觀察
下一篇
[Day5] 資料清理
系列文
商業數據分析應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言