Python分析建模簿煌,日常問題整理(六)
2018.08.27~2018.09.2
- 1 將原始數(shù)據(jù)直接進行woe轉(zhuǎn)化报咳。
def lst_ix(ls,a):
for i in range(0,len(ls)):
if a==-99999:
r = -99999
break
if a==-999999:
r = -999999
break
if a==9999:
r = 9999
break
if a<=ls[i]:
r = i
break
else:
r = np.nan
return r
def woe_trans(dat,numeric,category,woe_dict):
dat_copy = copy.deepcopy(dat)
for i in numeric+category:
if i in numeric and i in woe_dict.keys():
tem = dat[i].astype(float)
dic = woe_dict[i]
cut_ = [i[0] for i in dic['cover']]
dat_copy[i] = [dic['cover'][k][1] if k!=-99999 and k!=-999999 and k!=9999 and pd.isnull(k)==0
else dic['-99999'] if k==-99999 and '-99999' in dic.keys()
else dic['-999999'] if k==-999999 and '-999999' in dic.keys()
else dic['9999'] if k==9999 and '9999' in dic.keys() else 0
for k in [lst_ix(cut_,x) for x in tem]]
if i in category and i in woe_dict.keys():
dat_copy[i] =[woe_dict[i]['cover'][x] if x in woe_dict[i]['cover'].keys()
else 0 for x in dat[i] ]
return dat_copy
- 2 主成分線性預(yù)測
scikit-learn中fit_transform()與transform()區(qū)別。
- 二者的功能都是對數(shù)據(jù)進行某種統(tǒng)一處理(比如標(biāo)準(zhǔn)化~N(0,1),將數(shù)據(jù)縮放(映射)到某個固定區(qū)間变屁,歸一化,正則化等)
- fit_transform(partData)對部分數(shù)據(jù)先擬合fit意狠,找到該part的整體指標(biāo)粟关,如均值、方差环戈、最大值最小值等等(根據(jù)具體轉(zhuǎn)換的目的)闷板,然后對該partData進行轉(zhuǎn)換transform澎灸,從而實現(xiàn)數(shù)據(jù)的標(biāo)準(zhǔn)化、歸一化等等遮晚。性昭。
- 根據(jù)對之前部分fit的整體指標(biāo),對剩余的數(shù)據(jù)(restData)使用同樣的均值县遣、方差巩梢、最大最小值等指標(biāo)進行轉(zhuǎn)換transform(restData),從而保證part艺玲、rest處理方式相同括蝠。
- 必須先用fit_transform(partData),之后再transform(restData)
如果直接transform(partData)饭聚,程序會報錯- 如果fit_transfrom(partData)后忌警,使用fit_transform(restData)而不用transform(restData),雖然也能歸一化秒梳,但是兩個結(jié)果不是在同一個“標(biāo)準(zhǔn)”下的法绵,具有明顯差異。
參考于 ↓
scikit-learn數(shù)據(jù)預(yù)處理fit_transform()與transform()的區(qū)別
因此酪碘,對于PCA降維朋譬,要將擬合的pca相關(guān)參數(shù)保存下來,用于訓(xùn)練樣本之外的數(shù)據(jù)時直接運算轉(zhuǎn)化兴垦。
pca = PCA(n_components=n, whiten=False)
pca.fit_transform(train)
joblib.dump(pca, "pca.m")
# 每次擬合都保存為模型文件
print(pca.explained_variance_ratio_)
# 輸出方差貢獻度
pca = joblib.load("pca.m")
# 導(dǎo)入pca模型文件
pd_pca = pd.DataFrame(pca.transform(test))
# 預(yù)測樣本外
- 3 agg函數(shù)可以對一列進行各種函數(shù)的運算并同時命名
問題
a = pd.Series([2,3,3])
from scipy.stats import mode
def MODE_1(x):
return mode(a,axis=0)[0][0]
def MODE_2(x):
return x.mode()[0]
a.agg({'cc':np.average}) ## 返回的是Series
a.agg({'cc':average}) ## 返回的是Series
a.agg({'dd':np.mean}) ## 返回的是數(shù)值
a.agg({'ee':MODE_1}) ## 返回的是Series
a.agg({'ff':MODE_2}) ## 返回的是數(shù)值
為什么np.average單獨使用時返回數(shù)值徙赢,用在agg時返回列表呢?
未解決探越,有多種實現(xiàn)方式狡赐,選擇可以實現(xiàn)的那種就可以了。
- 4 re使用
1)條件提取中間的字符串
string = 'abe(ac)ad)'
p1 = re.compile(r'[(](.*?)[)]', re.S) #最小匹配
p2 = re.compile(r'[(](.*)[)]', re.S) #貪婪匹配钦幔,最大匹配
p3 = re.compile(r'abe\((.*?)\)ad', re.S) #取abe和ad)中間的所有字符串
print(re.findall(p1, string))
print(re.findall(p2, string))
print(re.findall(p3, string))
# 或者
print(re.findall(r'[(](.*?)[)]', string))
print(re.findall(r'[(](.*)[)]', string))
print(re.findall(r'abe\((.*?)\)ad',string))
2)字符串中是否包含某個字符串
"2" in "2.*34234;"
字符串中是否包含"2"
not re.search(r'[^-\d]','11-23-23-44')
字符串中除了- 和 數(shù)字 為空時枕屉,not result 輸出true 。意思是只提取包含了-和數(shù)字的字符串鲤氢。
re.search(r'你|世界|小','你好大世界')
字符串中是否包含搀擂,你或者好或者世界,輸出true 或者false卷玉。提取包含你 或者 世界
3)將相應(yīng)的字符串替換為某個值
import re
r='[’!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~]+'
line=re.sub(r,'',"python’s")
## 刪除標(biāo)點符號
line=re.sub('\D','',"2.*34234;")
# 刪除所有數(shù)字的字符串
line=re.sub('\d+','',"2.*34234;")
# 刪除所有數(shù)字的字符串
line=re.sub('\.','',"2.*34234;")
# 刪除 . 字符串
line=re.sub('\.|\*|\;','',"2.*34234;")
# 刪除 . 或者 * 或者 哨颂; 字符串
# \為轉(zhuǎn)義符號,將標(biāo)點符號轉(zhuǎn)化為文本
4)返回某個字符首次出現(xiàn)的位置
[a.start() for a in re.finditer('1','fjk1233')]
5 dataframe提取某些列為新數(shù)據(jù)的時候揍庄,一定要用df.loc[raw_index,col_index]咆蒿,否則會發(fā)生warning。
df.loc才有copy作用,對新數(shù)據(jù)進行處理不會改變原始變量沃测。
df[columns]起到指針作用(大概是這個意思)缭黔,對新數(shù)據(jù)進行處理時會改變原始變量。6 典型相關(guān)分析 CCA
多元統(tǒng)計分析的一種方法7 cross_validation 結(jié)果的score是什么:精確度蒂破。
8 新的交互式可視化框架:Dash
Dash和pyecharts的區(qū)別:dash是一個編程框架馏谨,可能因為dash是在線調(diào)用的外網(wǎng)api,所以用起來體驗不是很好附迷,比較慢惧互。ECharts來自百度EFE數(shù)據(jù)可視化團隊,調(diào)用起來很方便喇伯,使用起來順暢喊儡,頁面也很好看。