項(xiàng)目-實(shí)時(shí)刷新的低績(jī)效帶看BI看板-powerbi+python+mysql

1.項(xiàng)目目的:基于現(xiàn)有數(shù)據(jù)扬跋,以業(yè)務(wù)帶看情況為主題甩卓,搭建實(shí)時(shí)更新的BI看板倦卖。
2.基礎(chǔ)數(shù)據(jù)源介紹
現(xiàn)有數(shù)據(jù)源為三張表:帶看表洒擦,daikan_table;認(rèn)購(gòu)表怕膛,chengjiao_table熟嫩;人員架構(gòu)表;其中帶看表褐捻,認(rèn)購(gòu)表可以理解為多條記錄掸茅,人員架構(gòu)表每一行都記錄著經(jīng)紀(jì)人信息。
以上三張表的基礎(chǔ)數(shù)據(jù)源為后臺(tái)管理系統(tǒng)下載的.csv文件柠逞。
每張表包含的關(guān)鍵字段羅列如下:


image.png

3.項(xiàng)目步驟
(1)想要?jiǎng)?chuàng)建實(shí)時(shí)刷新的powerBI昧狮,因此考慮構(gòu)建寬表,使用python腳本板壮,將daikan_table+chengjiao_table進(jìn)行數(shù)據(jù)清洗逗鸣,將清洗后的數(shù)據(jù)存入mysql數(shù)據(jù)庫(kù)。定時(shí)執(zhí)行腳本即可實(shí)現(xiàn)最新數(shù)據(jù)的入庫(kù)绰精。
總體思路如下:


image.png

(2)使用powerbi 從數(shù)據(jù)庫(kù)讀取數(shù)據(jù)撒璧,根據(jù)業(yè)務(wù)所需搭建模型,例如構(gòu)建日期表茬底。同時(shí)隨著數(shù)據(jù)庫(kù)數(shù)據(jù)的刷新沪悲,powerBI看板也可實(shí)現(xiàn)刷新。
(3)對(duì)于人員架構(gòu)表阱表,個(gè)人采用了簡(jiǎn)易方式殿如,在powerBI里面之間嵌入了處理人員架構(gòu)表的腳本。
4.業(yè)務(wù)介紹
(1)數(shù)據(jù)源理解最爬。以上數(shù)據(jù)源涉馁,描述的是X房地產(chǎn)公司,每日產(chǎn)生業(yè)務(wù)帶看爱致,產(chǎn)生業(yè)務(wù)成交情況的基礎(chǔ)數(shù)據(jù)烤送。從經(jīng)紀(jì)人的維度看,組織架構(gòu)的層級(jí)為:事業(yè)部-大區(qū)-門店-分行-帶看經(jīng)紀(jì)人糠悯。每位經(jīng)紀(jì)人每天產(chǎn)生的每條帶看記錄都記在帶看表帮坚,daikan_table;每位經(jīng)紀(jì)人每天產(chǎn)生的每條成交記錄都記在認(rèn)購(gòu)表互艾,chengjiao_table试和;人員架構(gòu)表相對(duì)來(lái)說(shuō)比較好理解,記錄的是每位經(jīng)紀(jì)人所屬的組織架構(gòu)纫普,基礎(chǔ)信息阅悍,職業(yè)等。
(2)指標(biāo)計(jì)算規(guī)則。
帶看量=daikan_table的帶看標(biāo)記計(jì)數(shù)节视;

滲透率=帶看人數(shù)/在職人數(shù)拳锚;
人均帶看=帶看量/在職人數(shù);
人均業(yè)績(jī)=認(rèn)購(gòu)總業(yè)績(jī)/在職人數(shù)寻行;
5.數(shù)據(jù)源架構(gòu)
(1)將帶看數(shù)據(jù)霍掺、認(rèn)購(gòu)數(shù)據(jù)整合成一張寬表timeline,存入數(shù)據(jù)庫(kù)寡痰。
從數(shù)據(jù)庫(kù)讀取這個(gè)寬表timeline抗楔。根據(jù)業(yè)務(wù)場(chǎng)景,給用戶查看大概半年的數(shù)據(jù)拦坠,因此在SQL語(yǔ)句中將日期設(shè)定為從今天起向前回滾8個(gè)月连躏。


image.png

(2)在powerBI中構(gòu)建一個(gè)日期表,用日期表的日期關(guān)聯(lián)寬表timeline的日期贞滨。目的是:所有的日期篩選字段都從日期表出入热,實(shí)現(xiàn)時(shí)間篩選器的唯一性。
日期表的構(gòu)建比較簡(jiǎn)單晓铆,從某乎借鑒的勺良。
日期表 = ADDCOLUMNS (
    CALENDAR(DATE(2019,1,1),LASTDATE('YG_ALL Timeline'[日期])),
    "年",YEAR([Date]),
    "季度","Q" & ROUNDUP(MONTH([Date])/3,0),
    "月",MONTH([Date]),
    "日",day([Date]),
    "周",WEEKNUM([Date]),
    "年季度",YEAR([Date]) & "Q" & ROUNDUP(MONTH([Date])/3,0),
    "年月",YEAR([Date])*100+MONTH([Date]))

(3)人員架構(gòu)表的處理與搭建,ad_jg_shishi
人員架構(gòu)表的難點(diǎn)在于骄噪,每日一份人員架構(gòu)表(例如昨天1000個(gè)經(jīng)紀(jì)人尚困,今天可能有1500個(gè)經(jīng)紀(jì)人),因此這份人員架構(gòu)表是實(shí)時(shí)變動(dòng)的链蕊。目前采取處理方式是每天讀取一份.csv的人員架構(gòu)表事甜,進(jìn)行相關(guān)處理,導(dǎo)入powerBI滔韵。
引入相關(guān)包逻谦;

import pandas as pd
import datetime
import glob
import os
from sqlalchemy import create_engine
import warnings
import pymysql
pymysql.install_as_MySQLdb()
warnings.filterwarnings("ignore")

每天動(dòng)態(tài)查找文件夾,獲取最新架構(gòu)表的地址陪蜻;

# 文件地址獲取
path=os.path.join(r'\\10.8.29.213','日常文件存檔', '08 戰(zhàn)報(bào)每日存檔', today_1)
Ad_path=''.join(glob.glob(os.path.join(path,'在職人員明細(xì)*')))
Ad_path = Ad_path.strip()

if not os.path.exists(Ad_path):
    today_1=str(datetime.datetime.now().year)+'.'+str(datetime.datetime.now().month)+'.'+str(datetime.datetime.now().day-1)
    path = os.path.join(r'\\10.8.29.213', '日常文件存檔', '08 戰(zhàn)報(bào)每日存檔', today_1)
    Ad_path = ''.join(glob.glob(os.path.join(path, '在職人員明細(xì)*')))
    # print(Ad_path)

根據(jù)業(yè)務(wù)所需邦马,進(jìn)行相關(guān)字段處理,例如有些字段需要簡(jiǎn)稱宴卖,有些人員入職天數(shù)短被豁免不計(jì)入考核滋将;

df_aoding = pd.read_csv(Ad_path, header=0)
df_aoding.drop_duplicates(subset=['工號(hào)'],keep='first',inplace=True)
df_aoding_tichu = df_aoding[df_aoding.權(quán)限.isin(['綜合經(jīng)紀(jì)人','聯(lián)動(dòng)經(jīng)紀(jì)人','買賣經(jīng)紀(jì)人','新房經(jīng)紀(jì)人'])]
df_aoding_tichu.工號(hào) = df_aoding_tichu.工號(hào).astype(str)
df_aoding_tichu.事業(yè)部 = df_aoding_tichu.事業(yè)部.str.replace("事業(yè)部","").replace("鏈家豪宅","豪宅")
df_aoding_tichu["在職天數(shù)"] = (datetime.datetime.today()-pd.to_datetime(df_aoding_tichu.入職日期)).astype(str).str.split(" ",expand=True)[0]
df_aoding_tichu["在職天數(shù)"]=df_aoding_tichu["在職天數(shù)"].astype(int)
df_aoding_tichu.loc[df_aoding_tichu["事業(yè)部"]!="豪宅","大區(qū)"]=df_aoding_tichu['大區(qū)'].str.replace("區(qū)","大區(qū)")
df_aoding_tichu = df_aoding_tichu[df_aoding_tichu.在職天數(shù)>90]

根據(jù)經(jīng)紀(jì)人職級(jí)的不同,為其貼標(biāo)簽症昏;

zhiji_map = {'A0':'A0~2','A0/2':'A0~2','A1':'A0~2', 'A2':'A0~2','A3':'A3~5','A4':'A3~5','A5':'A3~5',
         'A6':'A6~10','A7':'A6~10','A8':'A6~10','A9':'A6~10','A10':'A6~10',
         'M1':'M1~M5','M2':'M1~M5','M3':'M1~M5','M4':'M1~M5','M5':'M1~M5',
         'M6':'M6~M10','M7':'M6~M10','M8':'M6~M10','M9':'M6~M10', 'M10':'M6~M10'}
df_aoding_tichu['職級(jí)分類'] = df_aoding_tichu['職級(jí)'].map(zhiji_map)

最新的人員架構(gòu)的工號(hào)耕渴,一對(duì)多關(guān)系連接timeline(含帶看+認(rèn)購(gòu)信息),并且計(jì)算好基礎(chǔ)字段(也可以在powerBI里面計(jì)算齿兔,但推薦能在代碼里面實(shí)現(xiàn)的盡量在代碼里面實(shí)現(xiàn),畢竟代碼比powerBI的DAX函數(shù)穩(wěn)定,本人在DAX函數(shù)里面踩過(guò)坑);

## 拼接最新帶看日期
engine_b = create_engine('mysql+pymysql://root:yunguan@520@10.8.29.213:3306/YG_ALL')
sql_b = '''
select aa.成交經(jīng)紀(jì)人工號(hào),aa.歷來(lái)最新帶看日期,bb.當(dāng)月帶看天數(shù),bb.當(dāng)月最新帶看日期
from
(select 成交經(jīng)紀(jì)人工號(hào),MAX(日期) as 歷來(lái)最新帶看日期 from Timeline_3 where 類別='A帶看' group by 成交經(jīng)紀(jì)人工號(hào)) aa
left join 
    (select 成交經(jīng)紀(jì)人工號(hào),count(distinct 日期) as 當(dāng)月帶看天數(shù),count(distinct 項(xiàng)目名稱) as 當(dāng)月帶看項(xiàng)目數(shù),max(日期) as 當(dāng)月最新帶看日期
    from Timeline_3
    where 類別='A帶看'
    and 日期>=date_add(curdate(), interval - day(curdate()) + 1 day) and 日期<=last_day(curdate())
    group by 成交經(jīng)紀(jì)人工號(hào)
  ) bb
on aa.成交經(jīng)紀(jì)人工號(hào)=bb.成交經(jīng)紀(jì)人工號(hào);
'''
df_c = pd.read_sql(sql=sql_b,con=engine_b)
###合并表分苇,拼接最新帶看日期
ad_jg_shishi = pd.merge(df_aoding_tichu,df_c,left_on='工號(hào)',right_on='成交經(jīng)紀(jì)人工號(hào)',how='left')
ad_jg_shishi["至今未帶看天數(shù)"] = (datetime.datetime.today()-pd.to_datetime(ad_jg_shishi.歷來(lái)最新帶看日期)).astype(str).str.split(" ",expand=True)[0]

###至今未帶看天數(shù)的分箱操作
ad_jg_shishi["至今未帶看天數(shù)"] = ad_jg_shishi["至今未帶看天數(shù)"].replace("NaT","1000000").astype(int)
ad_jg_shishi["至今未帶看標(biāo)簽"] = pd.cut(ad_jg_shishi.至今未帶看天數(shù),bins=[-1,7, 30, 60, 90, 200,1000003],
                                 labels=['A.7天內(nèi)','B.8~30天','C.31~60天','D.61~90天','E.91~200天','F.200天以上'] )

6.powerBI面板數(shù)據(jù)可視化
(1)表關(guān)系搭建
ad_jg_shishi的工號(hào)添诉,一對(duì)多關(guān)聯(lián)Timeline表的經(jīng)紀(jì)人工號(hào)。
新建的日期表的日期医寿,要一對(duì)多關(guān)聯(lián)Timeline表的日期栏赴。


image.png

(2)度量值
相關(guān)關(guān)鍵指標(biāo)計(jì)算如下。

帶看人數(shù) = CALCULATE(DISTINCTCOUNT('YG_ALL Timeline'[成交經(jīng)紀(jì)人工號(hào)]),FILTER('YG_ALL Timeline','YG_ALL Timeline'[客源編號(hào)]<>""),FILTER('YG_ALL Timeline','YG_ALL Timeline'[成交事業(yè)部]<>""))+0
帶看量 = CALCULATE(DISTINCTCOUNT('YG_ALL Timeline'[帶看標(biāo)記](méi)),FILTER('YG_ALL Timeline','YG_ALL Timeline'[類別]="A帶看"))
工號(hào)計(jì)數(shù) = DISTINCTCOUNT(ad_jg_shishi[工號(hào)])
至今未帶看標(biāo)簽分類 = COUNTA(ad_jg_shishi[至今未帶看標(biāo)簽])
各職級(jí)計(jì)數(shù) = COUNTA(ad_jg_shishi[職級(jí)分類])
產(chǎn)生過(guò)帶看的人數(shù) = DISTINCTCOUNT(ad_jg_shishi[成交經(jīng)紀(jì)人工號(hào)])

7.結(jié)果展示


image.png

image.png

鏈接預(yù)覽靖秩。個(gè)人把數(shù)據(jù)源搬到了本地?cái)?shù)據(jù)庫(kù)须眷,暫時(shí)不會(huì)實(shí)時(shí)刷新。
https://app.powerbi.com/view?r=eyJrIjoiOGU3MTY2NzMtNDZkNi00ZmIwLWI5NzMtNGRhZWUyM2JiZWYzIiwidCI6IjRmZWQ1OTVkLTRlOGUtNGM5Zi04NTMwLWY3OGZmYzg0NmMwYyJ9

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載沟突,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者花颗。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惠拭,隨后出現(xiàn)的幾起案子扩劝,更是在濱河造成了極大的恐慌,老刑警劉巖职辅,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棒呛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡域携,警方通過(guò)查閱死者的電腦和手機(jī)簇秒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門妇押,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)搪缨,“玉大人兵琳,你說(shuō)我怎么就攤上這事烁落∷胰澹” “怎么了薯嗤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵栏尚,是天一觀的道長(zhǎng)归苍。 經(jīng)常有香客問(wèn)我宠默,道長(zhǎng)麸恍,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任搀矫,我火速辦了婚禮抹沪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瓤球。我一直安慰自己融欧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布卦羡。 她就那樣靜靜地躺著噪馏,像睡著了一般麦到。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上欠肾,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天瓶颠,我揣著相機(jī)與錄音,去河邊找鬼刺桃。 笑死粹淋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瑟慈。 我是一名探鬼主播桃移,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼葛碧!你這毒婦竟也來(lái)了借杰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吹埠,失蹤者是張志新(化名)和其女友劉穎第步,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體缘琅,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粘都,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刷袍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翩隧。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖呻纹,靈堂內(nèi)的尸體忽然破棺而出堆生,到底是詐尸還是另有隱情,我是刑警寧澤雷酪,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布淑仆,位于F島的核電站,受9級(jí)特大地震影響哥力,放射性物質(zhì)發(fā)生泄漏蔗怠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一吩跋、第九天 我趴在偏房一處隱蔽的房頂上張望寞射。 院中可真熱鬧,春花似錦锌钮、人聲如沸桥温。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)侵浸。三九已至旺韭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掏觉,已是汗流浹背茂翔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留履腋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓惭嚣,卻偏偏與公主長(zhǎng)得像遵湖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晚吞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容