日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
利用SQL和Python分別實現(xiàn)人流量查詢,考驗邏輯思維的時候到了

本來這篇是要寫Python的可視化的,但無意中發(fā)現(xiàn)了一道題目,發(fā)現(xiàn)通過這道題可以很好地鍛煉一下邏輯思維能力,而且也可以復(fù)習(xí)下SQL和Python的編寫,于是便決定先寫這篇了。

成都創(chuàng)新互聯(lián)是少有的網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、營銷型企業(yè)網(wǎng)站、微信平臺小程序開發(fā)、手機APP,開發(fā)、制作、設(shè)計、賣友情鏈接、推廣優(yōu)化一站式服務(wù)網(wǎng)絡(luò)公司,于2013年成立,堅持透明化,價格低,無套路經(jīng)營理念。讓網(wǎng)頁驚喜每一位訪客多年來深受用戶好評

通過這道題我們會發(fā)現(xiàn),其實在分析工作中,最重要的能力是邏輯思維,程序只不過是實現(xiàn)邏輯的工具,沒有邏輯思維能力,程序就是無本之源。而且,雖然實現(xiàn)一個結(jié)果會有多種邏輯,但好的邏輯會讓我們的程序更具簡潔性、可觀性、高效性。

下面是結(jié)合自身理解所總結(jié)的兩類實現(xiàn)邏輯,我相信肯定還會有更優(yōu)秀的邏輯在某些大牛的腦中!

案例介紹

案例來源于LeetCode,這樣的需求在時間序列數(shù)據(jù)中還是較為常見的。

某市體育館每日人流量信息被記錄在stadium表的三列信息中:序號 (id)、日期 (visit_date)、 人流量 (people),找出至少連續(xù)三行人流量不少于100的記錄。

思路分析

最簡單的思路肯定是對stadium表進(jìn)行三次笛卡爾積連接,但這種方式在數(shù)據(jù)量大時不可取,而且也不具備泛化性(譬如需求改成至少連續(xù)十行)。網(wǎng)上也流傳著阿里的編程規(guī)范——禁止三表以上的連接。

總之,這種思路不是我們該采取的,我們需要尋找其它思路。

(1)構(gòu)建等差數(shù)列

從上圖中我們能發(fā)現(xiàn)一個規(guī)律,滿足條件的數(shù)據(jù)區(qū)域在原始表和結(jié)果表中的行編號均是等差數(shù)列,兩個等差數(shù)列的差值是固定的。譬如,數(shù)列A1和B1的差值均為1;數(shù)列A2和B2的差值均為2。

只要我們保證每塊區(qū)域等差數(shù)列的差值各不相等,那我們就可以通過篩選差值出現(xiàn)的次數(shù)來篩選滿足條件的區(qū)域。例如,差值2出現(xiàn)了4次,滿足條件,那該差值對應(yīng)的記錄就是我們需要的數(shù)據(jù)。

構(gòu)建差值的方式除了通過行編號外,也還有其它方式,大家可以想一想。

(2)數(shù)據(jù)切片

從圖中可看出,if_true是輔助列,表示是否滿足條件,1為True,0為False。我們要選擇滿足條件的區(qū)域,可通過用0對該列進(jìn)行切片,得到的是全為1的不同長度的小數(shù)列,根據(jù)每個小數(shù)列的長度來篩選滿足條件的區(qū)域。

在圖中就是得到了長度為a和b的數(shù)列,通過計算數(shù)列的長度來找出滿足條件的區(qū)域。

程序?qū)崿F(xiàn)

上節(jié)我們選擇了兩種思路,其中Python兩種思路都可以實現(xiàn),SQL可實現(xiàn)第一種思路。本節(jié)用SQL實現(xiàn)第一種思路,用Python實現(xiàn)第二種思路。

(1)SQL

 
 
 
  1. select id,visit_date,people 
  2. from 
  3. (select t2.*,count(1) over(partition by rn2) rn3 
  4. from  
  5. (selectt1.*,rn1 - row_number() over(order by visit_date) rn2 
  6. from 
  7. (select *,row_number() over() as rn1 
  8. from stadium order by visit_date)t1 #t1表對日期升序排列后生成行編號 
  9. where people>=100) t2 #t2表篩選人數(shù)不低于100的數(shù)據(jù),并用原行編號減去新生成的行編號得到差值 
  10. where 1=1) t3 #t3表統(tǒng)計每類差值出現(xiàn)的次數(shù) 
  11. where rn3>2 #篩選次數(shù)大于2的數(shù)據(jù)即為所需要的數(shù)據(jù) 

因為實際中表中的ID幾乎都不是連續(xù)的數(shù)字,所以為了保證泛化性就先生成了行編號,這樣就不用依賴于ID了。

除此之外也還可以通過用戶變量等方式實現(xiàn),大家可以試著想一想。

(2)Python

 
 
 
  1. import pandas as pd 
  2. dt=pd.DataFrame({"id":range(1,9),  
  3.                  "visit_date":pd.date_range(start="2017-01-01",periods=8),  
  4.                  "people":[10,109,150,99,145,1455,199,188]}) 
  5. dt["col1"]=dt["people"].apply(lambda x : 1 if x>=100 else 0) 
  6. #生成人數(shù)是否不低于100的新列 
  7. dt['counter'] = (dt["col1"]==0).cumsum() 
  8. #按照col1列是否為0計算累計和,標(biāo)記每個連續(xù)區(qū)域 
  9. dt = dt[dt["col1"] !=0] 
  10. #剔除人數(shù)低于100的記錄 
  11. gb=dt.groupby("counter")["id"].count() 
  12. # 統(tǒng)計各標(biāo)記值的次數(shù) 
  13. result=dt[dt["counter"].isin(gb[gb>2].index)] 
  14. #篩選滿足條件的數(shù)據(jù) 

這里有一點需要注意,如果直接將col1列轉(zhuǎn)為字符串按0進(jìn)行切片的話,雖然可以求出滿足條件的區(qū)域數(shù)量和長度,但很難再尋找到具體的區(qū)域。

 
 
 
  1. split_col1="".join([str(i) for i in dt["col1"]]).split("0") 

原本是按照的這種思路,但發(fā)現(xiàn)尋找長度符合字符串在原列表中的索引時會比較麻煩,尤其是當(dāng)需要查找多個索引值時。

但此種思路還是非常重要,因為在只是計算連續(xù)區(qū)域的最大值時會非常簡單。

結(jié)語

以上只是兩種簡單的邏輯,其實還有一些邏輯方法,但其本質(zhì)大都差不多,本文就不一一列舉了。至于是否還有更高效的邏輯方法,就等著大牛們來指導(dǎo)吧。

如果有完整看完的朋友就會發(fā)現(xiàn),一個簡單的例子就可以有多種實現(xiàn)方法,在將每種方法都自己寫一遍的過程中,就是對已有知識的一種梳理和復(fù)習(xí)。


分享文章:利用SQL和Python分別實現(xiàn)人流量查詢,考驗邏輯思維的時候到了
網(wǎng)站地址:http://www.dlmjj.cn/article/djjcece.html