一丝蹭、mysql:
1.1深入淺出:
數(shù)據(jù)分析的典型四步驟:確定問(wèn)題(心智模型 )→分解問(wèn)題→評(píng)估數(shù)據(jù)→做出決策
(CRISP-DM(cross-industry standard process for data mining) 模型:商業(yè)理解→數(shù)據(jù)理解→數(shù)據(jù)準(zhǔn)備→建立模型→模型評(píng)估→發(fā)布模型)貝葉斯統(tǒng)計(jì)宵荒,在自己被診斷為陽(yáng)性的情況下分俯,患陽(yáng)的概率县钥。
實(shí)際就是recall和precision的問(wèn)題,我想知道precision违诗,預(yù)測(cè)的精度是90%(100個(gè)有90個(gè)是準(zhǔn)的)牧牢,那我就有90%的概率是陽(yáng)性咯。但實(shí)際只知道recall誓沸,即陽(yáng)性患者梅桩,能被診斷出來(lái)的概率為95%(100個(gè)陽(yáng)性,模型能診斷出來(lái)95個(gè))拜隧,所以需要貝葉斯轉(zhuǎn)換啊宿百。主觀(guān)概率,講的有點(diǎn)是皮爾遜相似度的問(wèn)題虹蓄,就是說(shuō)兩個(gè)人意見(jiàn)相差很大(比如對(duì)電影的評(píng)價(jià))犀呼,但實(shí)際上很有可能是因?yàn)閮扇说臉?biāo)準(zhǔn)偏差很大,A對(duì)電影整體就是比較寬容薇组,B對(duì)電影整體就是比較嚴(yán)苛外臂。用主觀(guān)概率律胀,就能比較直觀(guān)地比較宋光。
1.2 必知必會(huì):
- 順序是賓 where 狀groupby 然后是orderby 最后才是主(最后主語(yǔ)選出來(lái)的哪怕沒(méi)有orderby的關(guān)鍵字貌矿,也是會(huì)先經(jīng)過(guò)排序再顯示)。
ps:有join聯(lián)結(jié)的時(shí)候罪佳,where統(tǒng)一放在on的后面逛漫,不然會(huì)報(bào)錯(cuò)
主:檢索列/行的基本用法;處理:concat赘艳、as酌毡、算數(shù)計(jì)算和函數(shù)計(jì)算、日期計(jì)算(常用select day(...)/year(...)/date(...))蕾管、文本處理(常用 select Ltrim(...) /upper(...))
賓:where的基本用法:and or組合邏輯枷踏、in/not in篩選邏輯、控制檢查null掰曾、剩下過(guò)濾的問(wèn)題:
a. 通配符like旭蠕,完全匹配“where prod_name like 'jet'、限定匹配“where prod_name like 'jet_'旷坦、任意匹配“where prod_name like 'jet%'.
..............................
b.正則表達(dá)式regexp掏熬,首先說(shuō)明一點(diǎn),like的話(huà)是必須完全匹配才會(huì)返回秒梅,regexp是列名中含有表達(dá)式則返回旗芬,如果要完全匹配的話(huà),要配合定位符使用(加一個(gè)首定位符和尾定位符就可以了)番电。完全匹配“where prod_name regexp 'jet'岗屏、限定匹配“where prod_name like 'jet.'(正則里面變成了.)、任意匹配可以用.* 的方法漱办,實(shí)際上正則比通配符優(yōu)勢(shì)的地方就在于他對(duì)任意匹配的控制到了隨意的地步:
匹配范圍:or匹配:“where prod_name regexp 'jet[0-9]'或者“where prod_name regexp 'jet[1|2|3|4|5|6|7|8|9]'或者“where prod_name regexp 'jet[:digit:]'这刷;特殊字符匹配“where prod_name regexp 'jet\.'(匹配jet.)以及其他的符號(hào)匹配(比如什么換行符 制表符)
匹配限定:個(gè)數(shù):*任意個(gè)數(shù)、+至少1個(gè)娩井、暇屋? 0或者1個(gè)、{n} 制定n個(gè)數(shù)目匹配洞辣,{n咐刨,}至少n個(gè),{n,m}n~m個(gè)扬霜; 位置限定^ 開(kāi)始(放在[]里面表示否定定鸟,比如[^1-9]表示不匹配1-9),$結(jié)尾
..............................
c.全文本搜索match against:首先是要建表的時(shí)候采用myisam引擎開(kāi)啟fulltext才可以建立索引并搜索(或者用布爾搜索進(jìn)行強(qiáng)行搜索)
create table .....(....., fulltext(note_text))engine=myisam著瓶。
采用match against進(jìn)行匹配 where match(note_text) against('jet')等同于where note_text like '%jet%'联予。如果只是match against的話(huà),相比正則表達(dá)式,會(huì)更智能沸久,因?yàn)闀?huì)按一定順序返回季眷,排名方式是按照匹配到的目標(biāo)的多少。真正厲害的方法是采用布爾搜索模式where match(note_text) against('jet' in boolean mode)卷胯,可以支持查詢(xún)擴(kuò)展(根據(jù)關(guān)鍵詞引申查詢(xún)其他相關(guān)項(xiàng))以及除了匹配子刮,還可以直接限定非匹配,等等功能窑睁。狀:group by :group by +having的組合
最后:orderby:desc asc
其他細(xì)則:
聯(lián)結(jié)概念挺峡,除了where聯(lián)結(jié)、join聯(lián)結(jié)卵慰,還可以用union聯(lián)結(jié)沙郭,在很復(fù)雜的表達(dá)力佛呻,union聯(lián)結(jié)可能會(huì)更簡(jiǎn)單裳朋,因?yàn)椴挥每紤]邏輯。
..............................
便捷功能:
視圖(就是打包的select語(yǔ)句):create view xxx as xxx吓著。鲤嫡。。
存儲(chǔ)(就是def 函數(shù)绑莺,允許輸入輸出參數(shù)):create procedure xxx() begin... end暖眼; 要執(zhí)行的時(shí)候用call: call xxx();
游標(biāo)(指向一個(gè)select語(yǔ)句纺裁,一般是配合存儲(chǔ)過(guò)程使用的诫肠,而且會(huì)用repeate來(lái)反復(fù)select):declare XXXX cursor for select.....。執(zhí)行游標(biāo)就用open...fetch...close 欺缘。配合repeate有固定套路栋豫。
觸發(fā)器:就是delete insert update語(yǔ)句,在指定時(shí)候觸發(fā):create trigger XXX after XXXX for XXXXX谚殊。
事務(wù)管理transaction:回退rollback丧鸯、提交commit、保留點(diǎn)savepoint嫩絮。
1.3 經(jīng)典50題
-
sum+case的用法:
-
排序問(wèn)題:
a. 允許rank()over函數(shù):
a.1 有相同排名丛肢,則名次要空缺,不連續(xù)編號(hào):
select sc.sid,rank()over(order by sc.score desc)rank01 from sc where sc.cid='01')
..............................
a.2 有相同排名剿干,也連續(xù)編號(hào)(dense_rank):
select sc.sid,dense_rank()over(order by sc.score desc)rank01 from sc where sc.cid='01')
..............................
a.3 組內(nèi)排名:
select sc.sid,rank()over(partition by sc.cid order by sc.score desc)rank01 from sc where sc.cid='01')
..............................
..............................
b. 不允許rank()over函數(shù):
b.0 無(wú)相同排名:
select sid,score,(@a:=@a+1) rank01 from (select * from sc where cid=01 order by score desc)scc,(select @a:=0) a;
上面這種寫(xiě)法蜂怎,實(shí)際上只適用于無(wú)相同排名
b.1 有相同排名,則名次要空缺置尔,不連續(xù)編號(hào):(一旦有相同排名杠步,就用聯(lián)結(jié)的方式更簡(jiǎn)單)
思路:先按無(wú)相同排名排名,再groupby取排名最小值,再聯(lián)立
select sid,sc.score,rank01 from sc,(select score, min(rank01) rank01 from (select score,(@a:=@a+1) rank01 from (select * from sc where cid=01 order by score desc)scc,(select @a:=0) a)c group by score)d where sc.cid=01 and sc.score=d.score order by rank01 asc;
感覺(jué)寫(xiě)的有點(diǎn)復(fù)雜篮愉,思考了一下腐芍,如果用兩表聯(lián)立的方法,來(lái)找比自己高的數(shù)目(或者低的數(shù)目)來(lái)排名试躏,更簡(jiǎn)單猪勇,但要小心有兩個(gè)第一名的情況,比如說(shuō)如果有兩個(gè)第一名颠蕴,那么大于等于自身分?jǐn)?shù)的會(huì)有兩個(gè)值泣刹,rank自動(dòng)會(huì)是2:
select a.sid,(count(*))rank01 from sc a,sc b where a.cid=01 and b.cid=01 and a.score<=b.score group by a.sid;
這種情況你怎么都不好調(diào)整,因?yàn)槟阒挥械谝幻呐琶清e(cuò)誤的犀被,后面的排名都是對(duì)的椅您。。寡键。
用left join也不能完美解決這個(gè)問(wèn)題(我真的試過(guò)了)
用自聯(lián)結(jié)+sum case是很通用的方法:
select a.sid,(sum(case when a.score <b.score then 1 else 0 end)+1)rank01 from sc a,sc b where a.cid=01 and b.cid=01 group by a.sid;
..............................
b.2 有相同排名掀泳,也連續(xù)編號(hào)(dense_rank):
思路:先distinct分?jǐn)?shù)排名,再聯(lián)結(jié)
..............................
b.3 組內(nèi)排名:
思路1:先分組西轩,再排序员舵,再u(mài)nion一起;
思路2:自聯(lián)結(jié)+left join/sum case+groupby
總結(jié)下排序問(wèn)題:在允許rank()over的情況下就盡情使用藕畔,不允許的話(huà):1马僻、@a:=@a+1方法比較粗暴,但是寫(xiě)起來(lái)有點(diǎn)復(fù)雜注服;2韭邓、如果沒(méi)有兩個(gè)第一名,用聯(lián)結(jié)+count()的方法是最簡(jiǎn)單的方法溶弟;3女淑、如果有兩個(gè)第一名,用聯(lián)結(jié)+sum case是通用的方法可很,也是最不會(huì)錯(cuò)的方法诗力。
1.4 leecode
ifnull函數(shù)
聚集函數(shù)不能用in匹配
delete from person where id not in (select min(id) id from person group by email);
是錯(cuò)誤的,因?yàn)閙in(id)是聚集函數(shù)我抠,外面還得再包一層select * from
善用case+when else end的組合(基本上難題都是靠這個(gè)解決)
排序苇本,能用limit(offset)就用limit,不然就是自連接(比sum case簡(jiǎn)單)菜拓,不行再用sum case
二瓣窄、python
2.1 python菜鳥(niǎo)+應(yīng)用
看多少遍都不為過(guò),要經(jīng)常復(fù)習(xí)
tips:多行注釋用ctrl+/纳鼎,或者打三引號(hào)
2.1.1 7大類(lèi)型(6+1)
number,string,tuple是不可變類(lèi)型
list,set,dictionary是可變類(lèi)俺夕。
number
兩點(diǎn):
a.分為int,float,bool,complex,并且可以互相轉(zhuǎn)換
b.number必然會(huì)涉及運(yùn)算裳凸,傳統(tǒng)的運(yùn)算是在math模塊里面,但是現(xiàn)在直接用 numpy就可以涵蓋全了劝贸。-
字符串
四點(diǎn):
a.轉(zhuǎn)義字符的使用\n(順便說(shuō)一句姨谷,用\n可以實(shí)現(xiàn)字符串換行,但是格式上并不簡(jiǎn)潔映九,可以用三引號(hào)的方式梦湘,在里面直接換行)
b.常用運(yùn)算符:+ 、*件甥、[]切片
c.字符串格式化s%捌议,如果是數(shù)值格式化,常用%d和%f
d.其他常用函數(shù):upper、capitalize引有、lstrip(mysql是ltrim 瓣颅,一個(gè)是trim,一個(gè)是strip)譬正、全局函數(shù)len和del(基本上所有類(lèi)型都可以用的)...
-
list
兩點(diǎn)
a.list和str的區(qū)別在于list是可變的宫补,所以除了str具備的基本特征(+、*預(yù)算符等)导帝,還有一些自建函數(shù)和全局函數(shù)進(jìn)行數(shù)據(jù)更新守谓,常用:list.count(obj)、list.sort( reverse=False)以及增刪查改等等您单。
b.因?yàn)閘ist可變同時(shí)可索引,因此應(yīng)用是最廣泛的荞雏,經(jīng)常當(dāng)堆棧使用(append和pop)虐秦,還有自己具有強(qiáng)大而又漸變的列表推導(dǎo)式功能:
tuple
和列表的區(qū)別在于,不允許更改凤优,所以是沒(méi)有更改數(shù)據(jù)的自建函數(shù)的悦陋,可以用全局函數(shù)進(jìn)行運(yùn)算。-
set集合
兩點(diǎn):
a.set有兩種生成方式筑辨,一種是直接生成俺驶,一種是利用str或者tuple轉(zhuǎn)化,參見(jiàn)以下三種區(qū)別:
b.集合的增刪查改
字典dict
兩點(diǎn):
a.沒(méi)有順序之說(shuō)棍辕,只有key和value的鏈接
b.增刪查改的幾個(gè)函數(shù)都比較重要其他
NoneType:a=None (mysql是null)
bytes:a=b'sdfsdf' (就是采用ASCII編碼的str暮现!)
增刪查改看這個(gè)表
2.1.2 運(yùn)算符
7種運(yùn)算符類(lèi)型:
需要注意的是,兩個(gè)數(shù)值的時(shí)候 &楚昭、|是位運(yùn)算栖袋,如果是邏輯變量,&抚太、|可以當(dāng)邏輯運(yùn)算符塘幅,而且實(shí)際應(yīng)用其實(shí)更廣泛昔案,尤其是在dataframe的時(shí)候,很多時(shí)候都只能用這種邏輯運(yùn)算电媳,不能用and和or踏揣。
2.1.3 控制與循環(huán)
- 循環(huán)語(yǔ)句
主要是三點(diǎn):
a.if else循環(huán);
b.while else循環(huán)匾乓;
c.for else循環(huán)(用得很少呼伸,基本上是用來(lái)判定for循環(huán)的內(nèi)容里面有沒(méi)有想要的內(nèi)容,沒(méi)有的話(huà)就break跳出钝尸,不執(zhí)行else括享,有的話(huà)就順帶執(zhí)行下else語(yǔ)句,表明有想要的內(nèi)容) - 迭代器和生成器
通常都是用range來(lái)進(jìn)行迭代了珍促,iter迭代器和yield生成器暫時(shí)都用不著铃辖,有簡(jiǎn)單的方法干嘛用復(fù)雜的呢。
2.1.4 函數(shù)
2.1.4.1 基礎(chǔ)問(wèn)題
-
可變對(duì)象和不可變對(duì)象的參數(shù)傳遞問(wèn)題
總結(jié)起來(lái)就是猪叙,不可變對(duì)象number娇斩、string、tuple傳入函數(shù)穴翩,只是把值傳進(jìn)去犬第,無(wú)論函數(shù)內(nèi)部怎么操作,元數(shù)據(jù)都不會(huì)受到影響芒帕。
幾種傳入?yún)?shù)
分別是必須參數(shù)/關(guān)鍵字參數(shù)歉嗓、默認(rèn)參數(shù)、不定長(zhǎng)參數(shù)(一個(gè) * 以tuple存儲(chǔ)背蟆,兩個(gè) * 以dict儲(chǔ)存)匿名函數(shù)
summ=lambda a,b:a+b (就是不要搞忘就行了)
2.1.4.2 內(nèi)置常用函數(shù)
(這個(gè)很重要鉴分,其實(shí)介紹完幾個(gè)類(lèi)型之后,就應(yīng)該介紹這個(gè)的带膀,這幾個(gè)基本上都是適用于list的志珍,因?yàn)閘ist迭代和索引起來(lái)都最方便)
取整求余
求余:x%2 →→mysql是mod(x,2)
四舍五入:round(x) →→mysql一樣
向下取整:int(x) 或者math.floor(x) →→mysql是:floor(x)
向上取整:int(x)+1或者math.ceil(x) →→mysql一樣-
enumerate
配合list使用,成為迭代器(相當(dāng)于range垛叨,或者iter)伦糯,但他會(huì)返回兩個(gè)值,一個(gè)是list的索引嗽元,一個(gè)是值:
sorted
跟list.sort類(lèi)似reversed
跟list.reverse類(lèi)似-
zip
配合list使用敛纲,很好用。比起zip()的用法还棱,更好用的是zip(*)的用法载慈,可以方便地處理多維矩陣:
-
map(很方便!)
配合list使用珍手!
-
join和split方法
https://blog.csdn.net/qq_38786209/article/details/78304974
雖然str用的比較多办铡,但是list,tuple,dict都能用
2.1.5 模塊
就三點(diǎn):
- 模塊的導(dǎo)入方式
- 最常見(jiàn)的sys模塊辞做,含有模塊搜索路徑
- dir()查看模塊所有定義(目前基本上用不到),name的用法(用于判定是引用的模塊寡具,還是自身函數(shù)):
2.1.6 輸入輸出
- 格式美化問(wèn)題秤茅,str.format()是新的格式方式,%是舊的格式方式(額童叠。框喳。)
-
讀寫(xiě)文件問(wèn)題
open→read/write→close
常用的幾種模式:
r→只讀
w→只寫(xiě),原有內(nèi)容會(huì)被刪除
r+→讀寫(xiě)
w+→讀寫(xiě)厦坛,原有內(nèi)容會(huì)被刪除
2.1.7 其他
- 錯(cuò)誤和異常:try +except+else+raise語(yǔ)句五垮;清理行為,一種是在最后使用finally語(yǔ)句保證完成清理杜秸,一種是有些模塊有標(biāo)準(zhǔn)清理行為放仗,用with使用(比如open模塊有close的清理行為,避免打開(kāi)文件后忘記關(guān)閉)
- 面向?qū)ο?br>
三點(diǎn):
a.面向?qū)ο蟮木柙谟诳梢岳^承撬碟,子類(lèi)繼承父類(lèi)诞挨,甚至可以更改父類(lèi);
b.類(lèi)化和實(shí)例化的區(qū)別呢蛤,x = MyClass(2)就是實(shí)例化惶傻,(把需要的參數(shù)都輸入進(jìn)去了,不就是實(shí)例么其障,參數(shù)也可以是空)银室,x = MyClass就是類(lèi)化。class定義里面肯定有一個(gè)init静秆,是對(duì)參數(shù)進(jìn)行傳遞:
上面粮揉,def init(self,n,a,w)就是將具體參數(shù)如的參數(shù)n賦值給name,a賦值給age抚笔,w賦值給__weight,具體利用這些參數(shù)怎么用侨拦,則需要進(jìn)一步定義殊橙,比如下面的def speak(self)。(思路總算是清晰一點(diǎn)了狱从,要先用init將所有參數(shù)賦值膨蛮,再針對(duì)各種參數(shù)進(jìn)行函數(shù)定義) - 常用模塊:
math模塊,datetime模塊季研,smtplib模塊敞葛,sys模塊...
2.2 pandas
2.2.1 基本操作
文件讀取
df1=pd.read_csv('/desktop/xxx.csv')兩種數(shù)據(jù)結(jié)構(gòu) dataframe和series
dataframe和series的主要區(qū)別在于一個(gè)是多維,一個(gè)是一維(當(dāng)然dataframe也可以是一維与涡,比如series自帶的to_frame函數(shù)轉(zhuǎn)化成dataframe)惹谐;次要區(qū)別在于series有一些自己的函數(shù)持偏,比如series.map(....),map就只能對(duì)一維使用氨肌,多維的話(huà)就只能用apply吧鸿秆。
a.讀取的文件會(huì)被自動(dòng)轉(zhuǎn)化為dataframe
b.用df=pd.DataFrame()或者df=pd.Series()創(chuàng)建結(jié)構(gòu)的話(huà),要注意index和column的制定(這個(gè)稍微查看下用法就知道了怎囚,避免自己忘了)
c.一般將字典轉(zhuǎn)化為DataFrame比較多卿叽,因?yàn)椴挥弥贫╟olumns;另外一種就是將多維數(shù)組array或者多維列表list轉(zhuǎn)化為DataFrame恳守,但此時(shí)需要額外制定列名考婴;基本屬性查看
df.columns/index/dtypes/shape/size/head/tail/describe
series.value_counts()
ps,dtype顯示的類(lèi)型一般有int/float/bool/時(shí)間類(lèi)型/object類(lèi)型以及其他擴(kuò)展類(lèi)型催烘,所以如果是數(shù)值類(lèi)型他會(huì)明確顯示(int/float/bool沥阱,因?yàn)閜andas是基于numpy開(kāi)發(fā)的誒),其他的一般會(huì)顯示為object
索引(索引就是index颗圣,一般都是指針對(duì)行的哈)
https://www.cnblogs.com/jiaxin359/p/8995133.html
a.常規(guī)索引喳钟,弄清楚df[0]和df[0:5]的區(qū)別,df[0]相當(dāng)于df.0在岂,df[0:5]相當(dāng)于df.iloc[0:5]
b.loc索引,以行的名字進(jìn)行索引奔则,不存在切片操作,允許范圍操作蔽午,比如df.loc[10:15]易茬,會(huì)返回index為10,11及老,12抽莱,13,14的數(shù)據(jù)
c.iloc索引骄恶,以行數(shù)進(jìn)行索引食铐,允許切片操作。
ps僧鲁,經(jīng)常會(huì)用df.set_index進(jìn)行(多重)索引設(shè)置虐呻,不過(guò)建議用pivot_table來(lái)設(shè)置。寞秃。斟叼。常規(guī)數(shù)據(jù)清洗(增刪查改)操作
先說(shuō)大宗旨:axis=1為列操作,最后以行形式展示,axis=0為對(duì)行操作春寿,最后以列形式展示朗涩,在pandas中一般會(huì)默認(rèn)為axis=0操作最后展示位列(符合csv表的數(shù)據(jù)處理習(xí)慣)
a.增:
兩種主要思路
直接新增df['new column']=;多表聯(lián)結(jié)的方式
b.刪:
常規(guī)刪除:del df或者df.drop
刪除重復(fù)行:df.drop_duplicates()或者df.drop([df.duplicated],axis=0)
這里的duplicate都是對(duì)行數(shù)據(jù)而言的。(如果要?jiǎng)h除列绑改,用drop可以完成谢床,但如果是刪除重復(fù)列兄一,考慮先轉(zhuǎn)置,再刪除萤悴,再還原)
刪除缺失值:df.dropna(),或者先用df.isnull檢測(cè)再刪除
c.查
索引方法
d.改
常規(guī)更改:用索引的方法更改列或者行
填充:用df.fillna()填充缺失值(有很多填充方法)函數(shù)計(jì)算
下面講的是針對(duì)groupby后的函數(shù)計(jì)算瘾腰,但實(shí)際上很多計(jì)算是可以單獨(dú)使用的哈。
a.groupby的基本使用和基本計(jì)算:
df.groupby(by='A').sum()
b.groupby后的復(fù)雜函數(shù)使用(各種復(fù)雜函數(shù)也是可以單獨(dú)使用的):
https://blog.csdn.net/zwhooo/article/details/79696558
df.groupby().agg()覆履,agg里面接的是內(nèi)置函數(shù)
df.groupby().tansform(),series的單列計(jì)算蹋盆,允許匿名函數(shù)
df.groupby().apply()龙填,多列計(jì)算盏筐,允許匿名函數(shù)
df.groupby().map()氢烘,series單個(gè)元素計(jì)算(本質(zhì)就跟內(nèi)置map一樣的)猎塞,允許匿名函數(shù)
df.groupby().applymap(),多列所有元素計(jì)算徽鼎,允許匿名函數(shù)表聯(lián)結(jié)
https://www.cnblogs.com/bawu/p/7701810.html
pd.concat()和pd.merge()文本處理
這個(gè)其實(shí)是針對(duì)series的慷垮,用到的很少绵患,series本身的字符串方法和python內(nèi)置方法也差不多凳厢,比如series.str.split和' '.split()是一個(gè)用法账胧。
比較常用的就是join、split先紫、lstrip治泥、rstrip之類(lèi)的
https://blog.csdn.net/qq_28219759/article/details/52919233
2.2.2 實(shí)際應(yīng)用中常用的函數(shù)
-
利用pivot_table進(jìn)行透視
透視其實(shí)就是表的重建,利用pivot_table特別方便可以構(gòu)造復(fù)合index和columns(以后要構(gòu)建復(fù)合index和columnes可以?xún)?yōu)先考慮透視方法)
-
stack和unstack
看似和pivot_table一樣遮精,其實(shí)還是很不一樣居夹,pivot_table無(wú)論怎么透視,都是dataframe本冲,相當(dāng)于改變分組方式准脂;stack是將dataframe完全展開(kāi)為series。
另外還有一個(gè)series.to_frame()的方法檬洞,把series轉(zhuǎn)化為dataframe:
所以如果要進(jìn)行表的透視狸膏,pivot_table是最方便的,但用stack+to_frame的方法也能夠取得類(lèi)似的效果添怔,就是不夠方便环戈;
如果只是想dataframe變?yōu)閟eries的話(huà),stack就方便多了澎灸; isnull函數(shù)查看有多少空值
df.isnull().sum()isin函數(shù)
媽呀,竟然還有這個(gè)函數(shù)遮晚,相當(dāng)于sql的 where xxx in xxx
df.['columns'].isin(xxx)
2.3 numpy(數(shù)據(jù)分析用的很少性昭,可能在數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)才會(huì)多)
-
創(chuàng)建
a.用list轉(zhuǎn)化:arr=np.array(list)
b.自行創(chuàng)建:arr=np.zeros()。县遣。糜颠。x=np.linspace()等等就看你想創(chuàng)建什么形式的汹族。(np.linspace()在畫(huà)圖的時(shí)候用的很多,用于生成x軸數(shù)據(jù))
ps:常用隨機(jī)數(shù)創(chuàng)建
常用屬性和基本方法
a.屬性查看:size/shape/len
b.shape改變方法:鋪平flatten/ravel其兴,reshape顶瞒,T
ps,看到數(shù)組的鋪平想起list的鋪平元旬,list是沒(méi)有內(nèi)置函數(shù)提供直接的鋪平方式的榴徐,不過(guò)可以用循環(huán)語(yǔ)句依次鋪平,或者就把list轉(zhuǎn)化為array再鋪平基本數(shù)值運(yùn)算
umm...就那些吧
sum/mean/std/max/min
以及數(shù)組間運(yùn)算匀归,不過(guò)現(xiàn)在都還沒(méi)遇到索引
跟dataframe一樣的
2.4 可視化
-
最基本屬性
a.導(dǎo)入模塊指令:import matplotlib.pyplot as plt
b.在線(xiàn)現(xiàn)實(shí)圖像指令:%matplotlib inline
c.全局性參數(shù)plt.rcParams里面坑资,通常要進(jìn)行設(shè)置的有:
-
圖表類(lèi)型
畫(huà)布屬性控制
分圖:plt.subplot()配合axes坐標(biāo)軸參數(shù)畫(huà)圖
標(biāo)題:plt.title()
坐標(biāo)軸范圍:plt.xlim() 和plt.ylim()
坐標(biāo)軸刻度:plt.xticks()和plt.yticks()
注釋?zhuān)簆lt.text() 和plt.annotate()(這個(gè)是指向性注釋?zhuān)?/p>圖像內(nèi)置屬性控制(有的有,有的沒(méi)有)
color:c穆端、width寬度袱贮、alpha透明度、s面積pandas api
兩種方法畫(huà)圖
a. df.plot.scatter()/bar()/hist()用屬性的方法畫(huà)圖
b. df.plot(kind='box')用通用的方法畫(huà)圖-
seaborn api
import seaborn as sns導(dǎo)入模塊
a.圖像類(lèi)型:
b.利用seaborn做簡(jiǎn)單回歸分析
三体啰、常用排序算法
- 二分查找
list已經(jīng)完成正序排序攒巍,從中間找起+遞歸函數(shù) - 線(xiàn)性查找
挨個(gè)找,簡(jiǎn)單粗暴 - 插入排序
挨個(gè)把list中的數(shù)據(jù)排好荒勇,新的list數(shù)據(jù)柒莉,從后往前對(duì)比,每對(duì)比一個(gè)枕屉,原來(lái)的數(shù)據(jù)往后挪一個(gè)常柄。 - 快速排序
選定基準(zhǔn)值→小于基準(zhǔn)值的放在左邊的list,大于基準(zhǔn)值的放在右邊的list→反復(fù)遞歸 - 選擇排序
最簡(jiǎn)單粗暴的一種搀擂,把最小的放在第一位西潘,把次小的放在第二位。哨颂。喷市。 - 冒泡排序
冒泡的本質(zhì)是,小的數(shù)不斷往上冒威恼,最大的數(shù)會(huì)沉在最下面品姓。。箫措。(所以其實(shí)我會(huì)理解為下沉排序)
1號(hào)2號(hào)比較腹备,把更大值放到2號(hào),2號(hào)再與3號(hào)比較斤蔓。植酥。。第一輪沉完→反復(fù)遞歸完畢 - 歸并排序
先比較2個(gè),再比較2個(gè)友驮,再組合起來(lái)比較這4個(gè)→再和另外4個(gè)組合起來(lái)比較8個(gè)(另外4個(gè)也要先比較2個(gè)2個(gè))漂羊。。卸留。umm走越。。耻瑟。 - 堆排序(二叉樹(shù)排序)
原理是:先排一個(gè)無(wú)序堆→再?gòu)牡箶?shù)第二層子節(jié)點(diǎn)開(kāi)始調(diào)整(把大的往上調(diào))旨指,如果調(diào)整了一個(gè)子節(jié)點(diǎn),要對(duì)下面的非底層子節(jié)點(diǎn)進(jìn)行遞歸判定和調(diào)整→第一輪排完之后父節(jié)點(diǎn)就是最大值匆赃,將其放到list最后一位淤毛,把底層子節(jié)點(diǎn)的最后一位拿到父節(jié)點(diǎn)來(lái),再進(jìn)行判定
所以理論上有三個(gè)步驟:
a.創(chuàng)建原始堆的函數(shù)算柳,這個(gè)不用管嘛低淡,就是list本身的索引位置;
b.從倒數(shù)第二層開(kāi)始調(diào)整瞬项,確定第一個(gè)父節(jié)點(diǎn)蔗蹋;
c.可以反復(fù)遞歸的從上而下調(diào)整的函數(shù)heapify(父節(jié)點(diǎn)要調(diào)整的話(huà),還要檢查調(diào)整后的子節(jié)點(diǎn)下面是否還需要調(diào)整)囱淋。
b步驟猪杭,實(shí)際也可以用heapify函數(shù),只用依次從底層把小堆用heapify調(diào)整好妥衣,再對(duì)上一層節(jié)點(diǎn)用heapify皂吮,直到到達(dá)頂層為止。
所以關(guān)鍵就在于heapify函數(shù)税手。蜂筹。 - 計(jì)數(shù)排序
犧牲空間換時(shí)間,額外建立兩個(gè)數(shù)組芦倒,一個(gè)數(shù)組生成一組固定數(shù)據(jù)(已經(jīng)排序號(hào))艺挪,一個(gè)數(shù)組用來(lái)記錄原始list在固定數(shù)據(jù)組中出現(xiàn)的次數(shù)(所以肯定會(huì)有些是0),最后再釋放出來(lái) - 希爾排序
插入排序的改進(jìn)版本兵扬,但是不穩(wěn)定麻裳,有可能會(huì)比排序算法花費(fèi)時(shí)間更多。
第一次以lenth/2為間隔器钟,對(duì)所有數(shù)據(jù)進(jìn)行分組調(diào)序(一共lenth/2組)→第二次以lenth/4為間隔津坑,對(duì)所有數(shù)據(jù)分組判斷,當(dāng)需要調(diào)序時(shí)傲霸,需要以lenth/4為間隔往前傳遞直到不再調(diào)序位置(因?yàn)榍胺叫蛄幸呀?jīng)是對(duì)的国瓮,所以到某一處不用再調(diào)序,也就不用往前推了)→第三次以lenth/8為間隔。乃摹。「疲→最后以1位間隔依次分組判斷孵睬,以及往前傳遞。最后排序完成伶跷。 需要注意掰读,每次如果有兩個(gè)數(shù)進(jìn)行了調(diào)序,那么要繼續(xù)往前回推看前面的數(shù)需不需要調(diào)序(就跟堆排序的父節(jié)點(diǎn)發(fā)生改變叭莫,要檢查子節(jié)點(diǎn)一樣) - 拓?fù)渑判?br> 暫時(shí)不管了吧蹈集,圖排序方法
四、兩個(gè)案例分析
-
構(gòu)建NaN值的方法
float('NaN')/float('nan')雇初,所以這好像是唯一構(gòu)建Nan值的方法
五拢肆、python和mysql的時(shí)間函數(shù)及字符串函數(shù)比較
http://www.reibang.com/p/52fb1f812286
http://www.reibang.com/p/91a1ecd57b0d
5.1 時(shí)間函數(shù)
-
返回當(dāng)前日期
mysql:select curdate(),current_date();
python:datetime庫(kù),或者time庫(kù)
-
返回當(dāng)前時(shí)間
mysql:select curtime,current_time()
python:同上
-
時(shí)間增加
mysql:函數(shù)date_add(date,interval int keyword)或者函數(shù)adddate(date,interval int keyword)
pthon:函數(shù)timedelta
- 時(shí)間減少
mysql:函數(shù)date_sub(date,interval int keyword)或者函數(shù)adddate(date,interval int keyword),int為負(fù)就行
python:函數(shù)timedelta -
時(shí)間日期的標(biāo)準(zhǔn)格式化
mysql:select date_formate(date,'%Y-%m-%d %H-%i-%s')
python:datetime和time模塊都有函數(shù)strftime
-
返回日期函數(shù)的年靖诗、月郭怪、日等
mysql:select year(now()), month(now()), day(now()), hour(now()), minute(now()), quarter(now());
python:
5.2 字符串函數(shù)
- 返回字符串長(zhǎng)度
mysql:select lenth()
python:len() -
連接字符串
python:
mysql:select concat('a','b')
-
替換字符
mysql:INSERT(str,x,y,instr):將字符串str從第x位置開(kāi)始,y個(gè)字符長(zhǎng)的子串替換為字符串instr刊橘,返回結(jié)果;REPLACE(str,str1,str2):在字符串str中用str2替換掉str1
python: -
顛倒字符串
python:
mysql:select reverse('SQL');