成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

利用SQL和Python分別實現人流量查詢,考驗邏輯思維的時候到了

數據庫 SQL Server 后端
本來這篇是要寫Python的可視化的,但無意中發現了一道題目,發現通過這道題可以很好地鍛煉一下邏輯思維能力,而且也可以復習下SQL和Python的編寫,于是便決定先寫這篇了。

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

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

下面是結合自身理解所總結的兩類實現邏輯,我相信肯定還會有更優秀的邏輯在某些大牛的腦中!

案例介紹

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

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

 

利用SQL和Python分別實現人流量查詢,考驗邏輯思維的時候到了

思路分析

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

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

(1)構建等差數列

 

利用SQL和Python分別實現人流量查詢,考驗邏輯思維的時候到了

從上圖中我們能發現一個規律,滿足條件的數據區域在原始表和結果表中的行編號均是等差數列,兩個等差數列的差值是固定的。譬如,數列A1和B1的差值均為1;數列A2和B2的差值均為2。

只要我們保證每塊區域等差數列的差值各不相等,那我們就可以通過篩選差值出現的次數來篩選滿足條件的區域。例如,差值2出現了4次,滿足條件,那該差值對應的記錄就是我們需要的數據。

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

(2)數據切片

 

利用SQL和Python分別實現人流量查詢,考驗邏輯思維的時候到了

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

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

程序實現

上節我們選擇了兩種思路,其中Python兩種思路都可以實現,SQL可實現第一種思路。本節用SQL實現第一種思路,用Python實現第二種思路。

(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表篩選人數不低于100的數據,并用原行編號減去新生成的行編號得到差值 
  10. where 1=1) t3 #t3表統計每類差值出現的次數 
  11. where rn3>2 #篩選次數大于2的數據即為所需要的數據 

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

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

(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. #生成人數是否不低于100的新列 
  7. dt['counter'] = (dt["col1"]==0).cumsum() 
  8. #按照col1列是否為0計算累計和,標記每個連續區域 
  9. dt = dt[dt["col1"] !=0] 
  10. #剔除人數低于100的記錄 
  11. gb=dt.groupby("counter")["id"].count() 
  12. # 統計各標記值的次數 
  13. result=dt[dt["counter"].isin(gb[gb>2].index)] 
  14. #篩選滿足條件的數據 

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

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

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

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

結語

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

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

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2009-06-22 13:48:00

Java編程思想面向對象

2013-05-27 15:57:36

邏輯思維

2021-09-22 10:18:58

自然語言神經網絡人工智能

2014-11-17 17:37:13

2021-08-13 16:11:08

機器人AI人工智能

2016-04-09 17:37:57

銳捷網絡商業智能系統無線

2014-06-30 13:34:57

2020-02-06 16:38:53

辦公電腦互聯網

2021-09-08 05:49:25

機器人巡邏人工智能

2009-04-29 10:00:25

SQL邏輯查詢優化

2012-05-08 10:02:44

2013-04-25 14:44:28

飛魚星無線路由器Wi-Fi

2025-01-14 13:52:56

2020-10-25 19:12:01

人臉識別AI人工智能

2025-04-21 16:39:09

自動化機器人大型語言模型LLM

2020-03-18 09:23:24

Python數據SQL

2019-12-13 15:58:45

戴爾

2021-01-14 08:23:15

LeetCode變量

2021-10-21 06:39:41

限流熔斷系統

2011-03-17 13:54:42

查詢參數SQL語句利用率
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91大神新作在线观看 | 噜噜噜噜狠狠狠7777视频 | www.黄网| 国产精品免费一区二区三区 | 蜜桃精品在线 | 国产精品99久久久久久宅男 | 精品欧美一区二区三区久久久 | 黄片毛片在线观看 | 视频一区二区在线观看 | 日韩精品在线一区 | 久久久久国产一区二区三区 | 亚洲综合大片69999 | 国产一区久久 | 精品久久av| 亚洲第一视频网站 | 日韩一级免费大片 | 国产精品中文字幕一区二区三区 | av日韩在线播放 | 免费精品久久久久久中文字幕 | 国产精品不卡视频 | 精品一区二区三区在线视频 | 欧美精品久久久 | 在线观看中文字幕视频 | 久久久这里都是精品 | 成人一区二区视频 | 午夜在线 | 欧美一级在线 | 国产精品视频一二三区 | 自拍视频国产 | 精品亚洲二区 | 久久四虎 | 激情欧美一区二区三区中文字幕 | 超碰在线播 | 久久久www成人免费精品 | 欧美日韩在线不卡 | 自拍 亚洲 欧美 老师 丝袜 | 视频一区二区三区四区五区 | 亚洲一区久久久 | 西西裸体做爰视频 | av入口| 成人一区二区三区在线观看 |