如果要說為什麼我會從 php 特別把某些計畫改用 python 撰寫,那麼 pandas 會是最大的理由。在 php 中如果我們要進行將一堆連續時間的 log 拉出來做區間分時統計報告會是個大工程。不只撰寫不易,同時還會導致系統過載。
敗 DataFrame 所賜,我們可以把一堆資料更容易的處理。
首先當然是取得所有的log資料(對完全不用怕)一次直接取出。
# 搜尋區間資料
users = db.dbname.colname.find(
{
"created_datetime":{
"$gte" : datetime.datetime(int(start.split("-")[0]), int(start.split("-")[1]), int(start.split("-")[2])),
"$lt": datetime.datetime(int(end.split("-")[0]), int(end.split("-")[1]), int(end.split("-")[2]))
}
}
)
datalist = []
for row in users:
del row["_id"]
datalist.append(row)
這樣就可以取得在某個時間區間的所有資料。但是這樣會是上千筆或上萬筆資料,我們如果要看以天為記算單位的加總而已,這時我們就要交給 DataFrame 處理。
# 將資料轉成 DataFrame
df = pd.DataFrame(datalist)
df = df.set_index('created_datetime', inplace = False)
# 設定每日數量統計
df2 = df.resample('D')["user_id"].count()
set_index 這個滿重要的,我們這次要用 created_datetime 下去做統計的依據 ,而 resample 可以把資料做依照時間序列做重新採樣的動作,這個用白話一點說就是將一連串的時間序列,針對我們指定的單位進行調整,這樣我們就可以做時間分組。
後面的 ["user_id"].count() 就是抓取 user_id 在同一組的數量
我們如果這時候直接印出來 會是長 DataFrame 的格式 ,這個在指令列中可以清楚可見但是無法直接變成 JSON 給前端使用
created_datetime
2020-04-01 84
2020-04-02 67
2020-04-03 70
2020-04-04 35
2020-04-05 72
2020-04-06 33
2020-04-07 76
2020-04-08 73
2020-04-09 95
2020-04-10 39
所以我們在做個處理 讓 DataFrame 可以轉成我們要的 JSON
# 製作 data list
d_list = []
for d in df2.values:
d = int(d)
d_list.append(d)
# 製做 index list
i_list =[]
for i in df2.index:
i = str(i)
i = i.split(' ')
i_list.append(i[0])
json_data = {'sys_code':"200","sys_msg":"success",'index':i_list,'data':d_list}
return json_data
這樣就可以讓前端處理摟!
留言
張貼留言