iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0
自我挑戰組

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

[Day17] 資料視覺化(III)-seaborn/matplotlib

  • 分享至 

  • xImage
  •  

Today's Goal

視覺化:時間與距離之關係(scatter plot)
以座標觀察各租借站點位置(Google Data Studio)

時間與距離之關係(scatter plot)

查詢網路資源發現Python計算經緯度距離的函數---haversine
(Note:The Haversine (or great circle) distance is the angular distance between two points on the surface of a sphere.--sklearn)

身為一個不是很懂數學的人,只能大概嘗試認識一下函數的內容/images/emoticon/emoticon39.gif

Step.1 從資料庫讀取內容(不然每次都重跑其實蠻累的XD)

import pymysql
db1 = pymysql.connect(host = "127.0.0.1",
                      user = "root",
                      passwd = "12345678",
                      database = "bike_clean_data",
                      port = 3306)

cursor = db1.cursor()
cursor.execute('''SELECT * FROM clean_data
WHERE (ride_length >= '00:01:00')''')
data=cursor.fetchall()
L1=['index']
for i in range(len(L[0])):
    L1.append(L[0][i])
    
data=pd.DataFrame(data,columns=L1)

Step.2 使用haversine()計算騎乘距離,自訂義語法部分參考stackoverflow

from math import radians,cos,sin,asin,sqrt
def haversine(lon1,lat1,lon2,lat2): #開始經度/開始緯度/結束經度/結束緯度

    lon1,lat1,lon2,lat2=map(radians,[lon1,lat1,lon2,lat2])
    
    dlon=lon2-lon1
    dlat=lat2-lat1
    a=sin(dlat/2)**2+cos(lat1)*cos(lat2)*sin(dlon/2)**2
    c=2*asin(sqrt(a))
    r=6371
    
    return c*r*1000

haversine(float(data['start_lng'][0]),float(data['start_lat'][0]),
          float(data['end_lng'][0]),float(data['end_lat'][0]))
L2=[]
for i in range(len(data)):
    L2.append(haversine(float(data['start_lng'][i]),float(data['start_lat'][i]),
              float(data['end_lng'][i]),float(data['end_lat'][i])))
L3=[]
for i in L2:
    try:
        j=round(i,2) #取至小數點第二位
        L3.append(j)
    except:
        L3.append(i)
        pass

data.insert(16,column='distance',value=L3)

Step.3 製作散佈圖(x軸:距離;y軸:時間)

import pandas as pd
import seaborn as sns

# data[14]=data[14].astype('timedelta64')
# data['distance']=data['distance'].astype('float64')

ax = sns.scatterplot(x=data['distance'], y=data['ride_length'], hue=data['member_casual'])
ax.set_title('Scatter Chart')

結果出現TypeError錯誤訊息,說兩個的dtype型態不同無法作圖(果然跟時間扯上關係就會花我很久時間XDD)。順帶一提,dtype[timedelta64]是指兩個時間相減後的資料型態

TypeError: The DTypes <class 'numpy.dtype[timedelta64]'> and <class 'numpy.dtype[float64]'> do not have a common DType. For example they cannot be stored in a single array unless the dtype is `object`.

於是我決定將timedelta64轉換成可計算的數值,參考stackoverflow成功將此欄轉換為小時(hours),並且是float64資料型態。
此處須注意:如果用datetime(dt)來轉換,只有days;seconds;mircoseconds的選項,所以我除以3600讓他變成是小時。

data['ride_length']=(data['ride_length'].dt.seconds)/3600

Out[20]: 
0         23.946944
1         23.945833
2         23.931944
3         23.910278
4         23.907500
   
419210     0.016667
419211     0.016667
419212     0.016667
419213     0.016667
419214     0.016667
Name: ride_length, Length: 419215, dtype: float64

執行上方程式呈現散佈圖,但好像看不太出來一個規則就是了/images/emoticon/emoticon10.gif,因為原本假設是租借時間愈久、距離愈長。此外還有一點是distance的部分,有蠻多騎很久的使用者是同站租同站還,這部分就沒辦法估算騎乘距離,可能要再思考一下有沒有更好的表達方式。
https://ithelp.ithome.com.tw/upload/images/20220919/20143863jlgDqT4AEy.png

以座標觀察各租借站點位置(GDS)

發文的現在已時候不早了...XD
明天再來進行比較有趣的部分,將原始csv檔案丟到GDS觀察,想使用原檔的經緯度等資訊來產出地理熱視圖,用以顯示租借次數多寡與位置的關係
希望能成功!


上一篇
[Day 16] 資料視覺化(II)-seaborn/matplotlib
下一篇
[Day 18] 以Google Data Studio觀察地理資訊
系列文
商業數據分析應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言