##從數(shù)據(jù)庫獲取數(shù)據(jù)并進行數(shù)據(jù)匯總統(tǒng)計描述##
import MySQLdb #調(diào)用連接sql數(shù)據(jù)的模塊
from pandas import DataFrame
##連接數(shù)據(jù)庫,需要知道主機地址、賬號、密碼、庫名、端口、編碼模式
conn =
MySQLdb.connect(host='XXXX',user='XXXX',passwd='XXXX',db='XXXX',port=XXXX,charset='utf8')
#使用cursor()方法獲取操作游標(biāo)
con = conn.cursor()
##撰寫查詢語句
select_sql = '''SELECT a.USER_ID,sum(
case when a.CLEAR_DATE is null then
if(TIMESTAMPDIFF(day,date(a.INTEREST_DATE),date(now()))<180,TIMESTAMPDIFF(day,date(a.INTEREST_DATE),date(now())),180)
*a.INVEST_AMOUNT#如果180內(nèi)進行了清算或者轉(zhuǎn)讓則以時間差作為持有時間,否則以180天作為持有時間
when a.CLEAR_DATE is not null then
if(TIMESTAMPDIFF(day,date(a.INTEREST_DATE),date(CLEAR_DATE))<180,TIMESTAMPDIFF(day,date(a.INTEREST_DATE),date(CLEAR_DATE)),180)
*a.INVEST_AMOUNT end)*1.8/36500 as投資貢獻度
from dm_tbl_investsplitinfo?a,dm_tbl_userinfo b
where a.USER_ID=b.USER_ID
and INTEREST_DATE is not null #排除募集中的記錄
and
TIMESTAMPDIFF(day,date(b.FIRST_INVEST_TIME),date(now()))>=180#只要首投時間在半年以前的用戶,防止新增投資用戶造成的影響
and
TIMESTAMPDIFF(day,date(b.FIRST_INVEST_TIME),date(a.INVEST_DATE))<=180#限制投資時間在首投之后的180天內(nèi)
and b.HUIYUAN_TYPE in ('個人會員','羊毛黨')
and USER_STATE='正常'#限制為正常狀態(tài)用戶,非凍結(jié)
GROUP BY a.USER_ID;'''
#使用execute方法執(zhí)行SQL語句,相當(dāng)于給sql寫一個分號
con.execute(select_sql)
##用fetchall接受所有結(jié)果數(shù)據(jù),注意fetchall獲取的數(shù)據(jù)均為tuple型,需要進一步處理才行
temp_data = con.fetchall()
#提交到數(shù)據(jù)庫,執(zhí)行所有sql語句
conn.commit()
#關(guān)閉數(shù)據(jù)庫鏈接
conn.close()
data =
DataFrame(list(temp_data),columns=['user_id','contributions'])
#將DF的decimal類型轉(zhuǎn)化為float型,以便統(tǒng)計分析數(shù)據(jù)
data['contributions'] =?data['contributions'].astype('float')
###利用pandas的DF匯總統(tǒng)計描述數(shù)據(jù)特征
print(data['contributions'].describe())