##从数据库获取数据并进行数据汇总统计描述##
import MySQLdb #调用连接sql数据的模块
from pandas import DataFrame
##连接数据库,需要知道主机地址、账号、密码、库名、端口、编码模式
conn =
MySQLdb.connect(host='XXXX',user='XXXX',passwd='XXXX',db='XXXX',port=XXXX,charset='utf8')
#使用cursor()方法获取操作游标
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内进行了清算或者转让则以时间差作为持有时间,否则以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天内
and b.HUIYUAN_TYPE in ('个人会员','羊毛党')
and USER_STATE='正常'#限制为正常状态用户,非冻结
GROUP BY a.USER_ID;'''
#使用execute方法执行SQL语句,相当于给sql写一个分号
con.execute(select_sql)
##用fetchall接受所有结果数据,注意fetchall获取的数据均为tuple型,需要进一步处理才行
temp_data = con.fetchall()
#提交到数据库,执行所有sql语句
conn.commit()
#关闭数据库链接
conn.close()
data =
DataFrame(list(temp_data),columns=['user_id','contributions'])
#将DF的decimal类型转化为float型,以便统计分析数据
data['contributions'] = data['contributions'].astype('float')
###利用pandas的DF汇总统计描述数据特征
print(data['contributions'].describe())