Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1767670
  • 博文数量: 323
  • 博客积分: 5970
  • 博客等级: 大校
  • 技术积分: 2764
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-03 23:13
文章分类

全部博文(323)

文章存档

2018年(2)

2017年(11)

2016年(10)

2015年(27)

2014年(2)

2013年(30)

2012年(197)

2011年(44)

分类: Oracle

2012-05-12 15:39:30

关于信用控制项目数据处理的过程:
1、业务方提交的是txt文本格式数据。
2、检查源数据内是否有特殊符号,我的做法是使用ue替换所有的逗号,最后使用逗号作为列的分割符
3、将处理过的源数据导入access,都使用varchar类型,避免导入时出现格式问题。
4、将access格式数据,检查没问题后,导出txt文本格式,以逗号作为分割符。
5、将导出的txt文本数据,使用sqlldr导入oracle
    注意:创建控制文件,使用sqlldr命令和对应参数,不要加bad文件参数,容易出权限问题,导入oracle。
6、使用update或decode函数,对表内数据的所有汉字的名称,都替换成编号,如品牌列的神州行,替换成1等。
7、处理异常数据,如?、-等类的数据,我的处理方式是如果该列为数值列,则替换成0,如果是名称列,如品牌列,异常数据替换成一个不可能出现的编号,如99。
8、处理数据类型,使用ctas(create table as select where 1=2)sql命令,创建一个新表,将源表的结构导入,注意:这里只导结构,不导数据,因为修改列的属性时,oracle规定该列必须为空列。
9、修改列的数据类型,使用“alter talbe XX modify (xx number(2));”sql语句,修改列的数据类型,注意:这里只修改number和varchar的,日期列先不用管。
10、将源表数据导入,使用“insert into table select * from table;”sql语句,将所有数据导入处理完数据类型的表内。
11、处理日期类型数据,在该表上创建一个临时列“alter table XX add clumnXX date;”,然后使用将该表内原来的日期列的数据导入该临时列,“update tableXX set column_temp = to_date(column_old,'yyyy-mm-dd')”
12、使用ctas创建新表,将处理完数据类型的表内的所有数据导入,“create table XX as select id,column_temp from tableXX;”,注意:这里导入新表的是处理过日期类型的数据列,即上文的column_temp
13、这张新表内的数据,就是我们所需要的最终完成的表。
14、有时,我们需要对日期数据转换成距离当前日期的月数,(更好的办法是使用ctas查询出来插入一个新表内)
     先在源表创建一个临时列,将源日期列计算成距离当前日期的月数,更新到到临时列
      “update mobile_main_target_1 m
  2  set in_net_date2 =
  3  (select trunc(months_between(sysdate,in_net_date)+0.99)
  4  from mobile_main_target_1
  5  where user_id = m.user_id);”
15、将需要的列,插入到一个新表内,“create table XX as select column1,column_old column_new,column2 from tableXX;”
16、对源数据进行随机抽样,使用sample函数“select * from tableXX sample(10%)”,随机抽取10%的数据
17、还有可能需要将数据从oracle导出指定格式csv文件:
18、对数据取中位数,select case when call_num > median(call_mum) then 1 else 0 end "dist_call_num",call_billing_duration from tableXX group by case when call_num > median(call_num) then 1 else 0 end ,cust_status;
19、计算所有数值列(离散数据列)的数据排名,并插入一个新表中,查看其分布情况
create table XXX 
as
select user_id,city_id,round(cume_dist() over (partition by 1 order by XXXX)*100) dist_XXXX 
from mobile_XX 
where XXXX>0;
20、如果最终数据的分布不理想的话,例如通话次数列,为0的值太多,有可能需要将0对应的排名值修改为0,不作为计算用户属性加权值来考虑。
21、21、分别计算风险group和收益group内指定列的排名,并分别统计出相应列的最大排名和最小排名,参见附件内的”风险group”sheet和“收益group”sheet


21-1. 第一条语句跑出来的min值,是第二条语句要减的值:CUME_DIST - 58

21-2. 表名换成你自己的

21-3. 替换:第一条语句:替换customized_service_num

--第二条语句:替换customized_service_num 和四个要减的值

/*

select min(cume_dist),max(cume_dist)

from

(select round(cume_dist() over(partition by 1 order by customized_service_num)*100) cume_dist from mobile_target

);


22、根据步骤7得出的指定列的最大排名和最小排名,计算该用户的数据分档;

--假设第一条sql计算得出customized_service_num列的min=58max=100

*/

-- 分组范围

/*

select round((CUME_DIST - 58) / (100 - 58) * 10),

min(customized_service_num),

max(customized_service_num),

count(*)

from (select t.*,

round(CUME_DIST() OVER(PARTITION BY 1 ORDER BY customized_service_num) * 100) CUME_DIST

from mobile_target t)

where 1 = 1

group by round((CUME_DIST - 58) / (100 - 58) * 10)

order by 1;

*/


23、根据排名值来画boston图,划分为高收益、高风险,高收益、低风险,低收益、高风险,低收益、低风险等区间,在经过对数据分布的聚集区进行放大,逐步得到数值列的评分和分档,如入网时长在3个月以内评多少分,6个月以内评多少分等,然后根据这个计算出每个用户每项属性的得分情况(一般,这里的得分都换算成0-10之间的分值)。
24、然后根据boston图计算每项用户属性的收益加权值和风险加权值,如针对品牌,最高给予10%的加权值,例如,如果是全球通用户加权10%,动感地带用户加权4%,神州行用户加权0等。
25、根据每项用户属性的加权值,计算该用户的风险总得分和收益总得分,计算方式为:如果是正接近风险得分或收益得分的,则收益总得分或风险总得分=每项用户属性收益或风险得分*对应的加权值;如果是反接近的,则计算方式为风险总得分=(10-该项用户属性得分)*加权值;
26、根据之前的boston图,我们可以统计出多少分-多少分属于风险或收益的区间,例如风险总得分在4分以下低风险,5-7分属于高风险,5分以下属于低收益区间等等。
27、根据每个用户的风险总得分和收益总得分,将用户群体划分成多个区间,例如,统计高收益的用户数有多少,中收益用户数有多少,及高风险区间的用户数有多少等,我们根据每个用户的风险总得分和收益总得分,可以知道每个用户所属的收益和风险区间。
28、根据每个用户的收益和风险总得分,我们可以统计出针对某个用户属性的分类,例如,风险得分<=6且状态为正常的用户数占风险得分<=6的总用户数的百分比,风险得分>=4的且状态为预停机的用户数占风险得分>=4的总用户数的百分比
29、我们可以根据这些得分情况,来判断某个客户群体的收益和风险情况,进而决定哪些用户群体能是最重要的,是需要给予优惠的。
阅读(685) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~