python基础应用_【复习】mysql+python基础应用(20190815)
一、mysql:
1.1深入淺出:
數據分析的典型四步驟:確定問題(心智模型 )→分解問題→評估數據→做出決策
(CRISP-DM(cross-industry standard process for data mining) 模型:商業理解→數據理解→數據準備→建立模型→模型評估→發布模型)
貝葉斯統計,在自己被診斷為陽性的情況下,患陽的概率。
實際就是recall和precision的問題,我想知道precision,預測的精度是90%(100個有90個是準的),那我就有90%的概率是陽性咯。但實際只知道recall,即陽性患者,能被診斷出來的概率為95%(100個陽性,模型能診斷出來95個),所以需要貝葉斯轉換啊。
主觀概率,講的有點是皮爾遜相似度的問題,就是說兩個人意見相差很大(比如對電影的評價),但實際上很有可能是因為兩人的標準偏差很大,A對電影整體就是比較寬容,B對電影整體就是比較嚴苛。用主觀概率,就能比較直觀地比較。
1.2 必知必會:
順序是賓 where 狀groupby 然后是orderby 最后才是主(最后主語選出來的哪怕沒有orderby的關鍵字,也是會先經過排序再顯示)。
ps:有join聯結的時候,where統一放在on的后面,不然會報錯
主:檢索列/行的基本用法;處理:concat、as、算數計算和函數計算、日期計算(常用select day(...)/year(...)/date(...))、文本處理(常用 select Ltrim(...) /upper(...))
賓:where的基本用法:and or組合邏輯、in/not in篩選邏輯、控制檢查null、剩下過濾的問題:
a. 通配符like,完全匹配“where prod_name like 'jet'、限定匹配“where prod_name like 'jet_'、任意匹配“where prod_name like 'jet%'.
..............................
b.正則表達式regexp,首先說明一點,like的話是必須完全匹配才會返回,regexp是列名中含有表達式則返回,如果要完全匹配的話,要配合定位符使用(加一個首定位符和尾定位符就可以了)。完全匹配“where prod_name regexp 'jet'、限定匹配“where prod_name like 'jet.'(正則里面變成了.)、任意匹配可以用.* 的方法,實際上正則比通配符優勢的地方就在于他對任意匹配的控制到了隨意的地步:
匹配范圍: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.)以及其他的符號匹配(比如什么換行符 制表符)
匹配限定:個數:*任意個數、+至少1個、? 0或者1個、{n} 制定n個數目匹配,{n,}至少n個,{n,m}n~m個; 位置限定^ 開始(放在[]里面表示否定,比如[^1-9]表示不匹配1-9),$結尾
..............................
c.全文本搜索match against:首先是要建表的時候采用myisam引擎開啟fulltext才可以建立索引并搜索(或者用布爾搜索進行強行搜索)
create table .....(....., fulltext(note_text))engine=myisam。
采用match against進行匹配 where match(note_text) against('jet')等同于where note_text like '%jet%'。如果只是match against的話,相比正則表達式,會更智能,因為會按一定順序返回,排名方式是按照匹配到的目標的多少。真正厲害的方法是采用布爾搜索模式where match(note_text) against('jet' in boolean mode),可以支持查詢擴展(根據關鍵詞引申查詢其他相關項)以及除了匹配,還可以直接限定非匹配,等等功能。
狀:group by :group by +having的組合
最后:orderby:desc asc
其他細則:
聯結概念,除了where聯結、join聯結,還可以用union聯結,在很復雜的表達力,union聯結可能會更簡單,因為不用考慮邏輯。
..............................
便捷功能:
視圖(就是打包的select語句):create view xxx as xxx。。。
存儲(就是def 函數,允許輸入輸出參數):create procedure xxx() begin... end; 要執行的時候用call: call xxx();
游標(指向一個select語句,一般是配合存儲過程使用的,而且會用repeate來反復select):declare XXXX cursor for select.....。執行游標就用open...fetch...close 。配合repeate有固定套路。
觸發器:就是delete insert update語句,在指定時候觸發:create trigger XXX after XXXX for XXXXX。
事務管理transaction:回退rollback、提交commit、保留點savepoint。
1.3 經典50題
sum+case的用法:
image.png
排序問題:
a. 允許rank()over函數:
a.1 有相同排名,則名次要空缺,不連續編號:
select sc.sid,rank()over(order by sc.score desc)rank01 from sc where sc.cid='01')
..............................
a.2 有相同排名,也連續編號(dense_rank):
select sc.sid,dense_rank()over(order by sc.score desc)rank01 from sc where sc.cid='01')
..............................
a.3 組內排名:
select sc.sid,rank()over(partition by sc.cid order by sc.score desc)rank01 from sc where sc.cid='01')
..............................
..............................
b. 不允許rank()over函數:
b.0 無相同排名:
select sid,score,(@a:=@a+1) rank01 from (select * from sc where cid=01 order by score desc)scc,(select @a:=0) a;
上面這種寫法,實際上只適用于無相同排名
b.1 有相同排名,則名次要空缺,不連續編號:(一旦有相同排名,就用聯結的方式更簡單)
思路:先按無相同排名排名,再groupby取排名最小值,再聯立
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;
image.png
感覺寫的有點復雜,思考了一下,如果用兩表聯立的方法,來找比自己高的數目(或者低的數目)來排名,更簡單,但要小心有兩個第一名的情況,比如說如果有兩個第一名,那么大于等于自身分數的會有兩個值,rank自動會是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;
這種情況你怎么都不好調整,因為你只有第一名的排名是錯誤的,后面的排名都是對的。。。
image.png
用left join也不能完美解決這個問題(我真的試過了)
用自聯結+sum case是很通用的方法:
select a.sid,(sum(case when a.score
image.png
..............................
b.2 有相同排名,也連續編號(dense_rank):
思路:先distinct分數排名,再聯結
..............................
b.3 組內排名:
思路1:先分組,再排序,再union一起;
思路2:自聯結+left join/sum case+groupby
總結下排序問題:在允許rank()over的情況下就盡情使用,不允許的話:1、@a:=@a+1方法比較粗暴,但是寫起來有點復雜;2、如果沒有兩個第一名,用聯結+count()的方法是最簡單的方法;3、如果有兩個第一名,用聯結+sum case是通用的方法,也是最不會錯的方法。
1.4 leecode
ifnull函數
聚集函數不能用in匹配
delete from person where id not in (select min(id) id from person group by email);
是錯誤的,因為min(id)是聚集函數,外面還得再包一層select * from
善用case+when else end的組合(基本上難題都是靠這個解決)
排序,能用limit(offset)就用limit,不然就是自連接(比sum case簡單),不行再用sum case
二、python
2.1 python菜鳥+應用
看多少遍都不為過,要經常復習
tips:多行注釋用ctrl+/,或者打三引號
2.1.1 7大類型(6+1)
number,string,tuple是不可變類型
list,set,dictionary是可變類。
number
兩點:
a.分為int,float,bool,complex,并且可以互相轉換
b.number必然會涉及運算,傳統的運算是在math模塊里面,但是現在直接用 numpy就可以涵蓋全了。
字符串
四點:
a.轉義字符的使用\n(順便說一句,用\n可以實現字符串換行,但是格式上并不簡潔,可以用三引號的方式,在里面直接換行)
b.常用運算符:+ 、*、[]切片
c.字符串格式化s%,如果是數值格式化,常用%d和%f
image.png
d.其他常用函數:upper、capitalize、lstrip(mysql是ltrim ,一個是trim,一個是strip)、全局函數len和del(基本上所有類型都可以用的)...
list
兩點
a.list和str的區別在于list是可變的,所以除了str具備的基本特征(+、*預算符等),還有一些自建函數和全局函數進行數據更新,常用:list.count(obj)、list.sort( reverse=False)以及增刪查改等等。
b.因為list可變同時可索引,因此應用是最廣泛的,經常當堆棧使用(append和pop),還有自己具有強大而又漸變的列表推導式功能:
image.png
tuple
和列表的區別在于,不允許更改,所以是沒有更改數據的自建函數的,可以用全局函數進行運算。
set集合
兩點:
a.set有兩種生成方式,一種是直接生成,一種是利用str或者tuple轉化,參見以下三種區別:
image.png
b.集合的增刪查改
字典dict
兩點:
a.沒有順序之說,只有key和value的鏈接
b.增刪查改的幾個函數都比較重要
其他
NoneType:a=None (mysql是null)
bytes:a=b'sdfsdf' (就是采用ASCII編碼的str!)
增刪查改看這個表
image.png
2.1.2 運算符
7種運算符類型:
image.png
需要注意的是,兩個數值的時候 &、|是位運算,如果是邏輯變量,&、|可以當邏輯運算符,而且實際應用其實更廣泛,尤其是在dataframe的時候,很多時候都只能用這種邏輯運算,不能用and和or。
2.1.3 控制與循環
循環語句
主要是三點:
a.if else循環;
b.while else循環;
c.for else循環(用得很少,基本上是用來判定for循環的內容里面有沒有想要的內容,沒有的話就break跳出,不執行else,有的話就順帶執行下else語句,表明有想要的內容)
迭代器和生成器
通常都是用range來進行迭代了,iter迭代器和yield生成器暫時都用不著,有簡單的方法干嘛用復雜的呢。
2.1.4 函數
2.1.4.1 基礎問題
可變對象和不可變對象的參數傳遞問題
image.png
總結起來就是,不可變對象number、string、tuple傳入函數,只是把值傳進去,無論函數內部怎么操作,元數據都不會受到影響。
幾種傳入參數
分別是必須參數/關鍵字參數、默認參數、不定長參數(一個 * 以tuple存儲,兩個 * 以dict儲存)
匿名函數
summ=lambda a,b:a+b (就是不要搞忘就行了)
2.1.4.2 內置常用函數
(這個很重要,其實介紹完幾個類型之后,就應該介紹這個的,這幾個基本上都是適用于list的,因為list迭代和索引起來都最方便)
取整求余
求余: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使用,成為迭代器(相當于range,或者iter),但他會返回兩個值,一個是list的索引,一個是值:
image.png
sorted
跟list.sort類似
reversed
跟list.reverse類似
zip
配合list使用,很好用。比起zip()的用法,更好用的是zip(*)的用法,可以方便地處理多維矩陣:
image.png
map(很方便!)
配合list使用!
image.png
2.1.5 模塊
就三點:
模塊的導入方式
最常見的sys模塊,含有模塊搜索路徑
dir()查看模塊所有定義(目前基本上用不到),name的用法(用于判定是引用的模塊,還是自身函數):
image.png
2.1.6 輸入輸出
格式美化問題,str.format()是新的格式方式,%是舊的格式方式(額。。)
讀寫文件問題
open→read/write→close
image.png
常用的幾種模式:
r→只讀
w→只寫,原有內容會被刪除
r+→讀寫
w+→讀寫,原有內容會被刪除
2.1.7 其他
錯誤和異常:try +except+else+raise語句;清理行為,一種是在最后使用finally語句保證完成清理,一種是有些模塊有標準清理行為,用with使用(比如open模塊有close的清理行為,避免打開文件后忘記關閉)
面向對象
三點:
a.面向對象的精髓在于可以繼承,子類繼承父類,甚至可以更改父類;
b.類化和實例化的區別,x = MyClass(2)就是實例化,(把需要的參數都輸入進去了,不就是實例么,參數也可以是空),x = MyClass就是類化。class定義里面肯定有一個init,是對參數進行傳遞:
image.png
上面,def init(self,n,a,w)就是將具體參數如的參數n賦值給name,a賦值給age,w賦值給__weight,具體利用這些參數怎么用,則需要進一步定義,比如下面的def speak(self)。(思路總算是清晰一點了,要先用init將所有參數賦值,再針對各種參數進行函數定義)
常用模塊:
math模塊,datetime模塊,smtplib模塊,sys模塊...
2.2 pandas
2.2.1 基本操作
文件讀取
df1=pd.read_csv('/desktop/xxx.csv')
兩種數據結構 dataframe和series
dataframe和series的主要區別在于一個是多維,一個是一維(當然dataframe也可以是一維,比如series自帶的to_frame函數轉化成dataframe);次要區別在于series有一些自己的函數,比如series.map(....),map就只能對一維使用,多維的話就只能用apply吧。
a.讀取的文件會被自動轉化為dataframe
b.用df=pd.DataFrame()或者df=pd.Series()創建結構的話,要注意index和column的制定(這個稍微查看下用法就知道了,避免自己忘了)
c.一般將字典轉化為DataFrame比較多,因為不用制定columns;另外一種就是將多維數組array或者多維列表list轉化為DataFrame,但此時需要額外制定列名;
基本屬性查看
df.columns/index/dtypes/shape/size/head/tail/describe
series.value_counts()
ps,dtype顯示的類型一般有int/float/bool/時間類型/object類型以及其他擴展類型,所以如果是數值類型他會明確顯示(int/float/bool,因為pandas是基于numpy開發的誒),其他的一般會顯示為object
索引(索引就是index,一般都是指針對行的哈)
https://www.cnblogs.com/jiaxin359/p/8995133.html
a.常規索引,弄清楚df[0]和df[0:5]的區別,df[0]相當于df.0,df[0:5]相當于df.iloc[0:5]
b.loc索引,以行的名字進行索引,不存在切片操作,允許范圍操作,比如df.loc[10:15],會返回index為10,11,12,13,14的數據
c.iloc索引,以行數進行索引,允許切片操作。
ps,經常會用df.set_index進行(多重)索引設置,不過建議用pivot_table來設置。。。
常規數據清洗(增刪查改)操作
先說大宗旨:axis=1為列操作,最后以行形式展示,axis=0為對行操作,最后以列形式展示,在pandas中一般會默認為axis=0操作最后展示位列(符合csv表的數據處理習慣)
a.增:
兩種主要思路
直接新增df['new column']=;多表聯結的方式
b.刪:
常規刪除:del df或者df.drop
刪除重復行:df.drop_duplicates()或者df.drop([df.duplicated],axis=0)
這里的duplicate都是對行數據而言的。(如果要刪除列,用drop可以完成,但如果是刪除重復列,考慮先轉置,再刪除,再還原)
刪除缺失值:df.dropna(),或者先用df.isnull檢測再刪除
c.查
索引方法
d.改
常規更改:用索引的方法更改列或者行
填充:用df.fillna()填充缺失值(有很多填充方法)
函數計算
下面講的是針對groupby后的函數計算,但實際上很多計算是可以單獨使用的哈。
a.groupby的基本使用和基本計算:
df.groupby(by='A').sum()
b.groupby后的復雜函數使用(各種復雜函數也是可以單獨使用的):
https://blog.csdn.net/zwhooo/article/details/79696558
df.groupby().agg(),agg里面接的是內置函數
df.groupby().tansform(),series的單列計算,允許匿名函數
df.groupby().apply(),多列計算,允許匿名函數
df.groupby().map(),series單個元素計算(本質就跟內置map一樣的),允許匿名函數
df.groupby().applymap(),多列所有元素計算,允許匿名函數
文本處理
這個其實是針對series的,用到的很少,series本身的字符串方法和python內置方法也差不多,比如series.str.split和' '.split()是一個用法。
比較常用的就是join、split、lstrip、rstrip之類的
https://blog.csdn.net/qq_28219759/article/details/52919233
2.2.2 實際應用中常用的函數
利用pivot_table進行透視
透視其實就是表的重建,利用pivot_table特別方便可以構造復合index和columns(以后要構建復合index和columnes可以優先考慮透視方法)
image.png
stack和unstack
看似和pivot_table一樣,其實還是很不一樣,pivot_table無論怎么透視,都是dataframe,相當于改變分組方式;stack是將dataframe完全展開為series。
另外還有一個series.to_frame()的方法,把series轉化為dataframe:
image.png
所以如果要進行表的透視,pivot_table是最方便的,但用stack+to_frame的方法也能夠取得類似的效果,就是不夠方便;
如果只是想dataframe變為series的話,stack就方便多了;
isnull函數查看有多少空值
df.isnull().sum()
isin函數
媽呀,竟然還有這個函數,相當于sql的 where xxx in xxx
df.['columns'].isin(xxx)
2.3 numpy(數據分析用的很少,可能在數據挖掘和機器學習才會多)
創建
a.用list轉化:arr=np.array(list)
b.自行創建:arr=np.zeros()。。。x=np.linspace()等等就看你想創建什么形式的。(np.linspace()在畫圖的時候用的很多,用于生成x軸數據)
ps:常用隨機數創建
image.png
常用屬性和基本方法
a.屬性查看:size/shape/len
b.shape改變方法:鋪平flatten/ravel,reshape,T
ps,看到數組的鋪平想起list的鋪平,list是沒有內置函數提供直接的鋪平方式的,不過可以用循環語句依次鋪平,或者就把list轉化為array再鋪平
基本數值運算
umm...就那些吧
sum/mean/std/max/min
以及數組間運算,不過現在都還沒遇到
索引
跟dataframe一樣的
2.4 可視化
最基本屬性
a.導入模塊指令:import matplotlib.pyplot as plt
b.在線現實圖像指令:%matplotlib inline
c.全局性參數plt.rcParams里面,通常要進行設置的有:
image.png
圖表類型
image.png
畫布屬性控制
分圖:plt.subplot()配合axes坐標軸參數畫圖
標題:plt.title()
坐標軸范圍:plt.xlim() 和plt.ylim()
坐標軸刻度:plt.xticks()和plt.yticks()
注釋:plt.text() 和plt.annotate()(這個是指向性注釋)
圖像內置屬性控制(有的有,有的沒有)
color:c、width寬度、alpha透明度、s面積
pandas api
兩種方法畫圖
a. df.plot.scatter()/bar()/hist()用屬性的方法畫圖
b. df.plot(kind='box')用通用的方法畫圖
seaborn api
import seaborn as sns導入模塊
a.圖像類型:
image.png
b.利用seaborn做簡單回歸分析
image.png
image.png
三、常用排序算法
二分查找
list已經完成正序排序,從中間找起+遞歸函數
線性查找
挨個找,簡單粗暴
插入排序
挨個把list中的數據排好,新的list數據,從后往前對比,每對比一個,原來的數據往后挪一個。
快速排序
選定基準值→小于基準值的放在左邊的list,大于基準值的放在右邊的list→反復遞歸
選擇排序
最簡單粗暴的一種,把最小的放在第一位,把次小的放在第二位。。。
冒泡排序
冒泡的本質是,小的數不斷往上冒,最大的數會沉在最下面。。。(所以其實我會理解為下沉排序)
1號2號比較,把更大值放到2號,2號再與3號比較。。。第一輪沉完→反復遞歸完畢
歸并排序
先比較2個,再比較2個,再組合起來比較這4個→再和另外4個組合起來比較8個(另外4個也要先比較2個2個)。。。umm。。。
堆排序(二叉樹排序)
原理是:先排一個無序堆→再從倒數第二層子節點開始調整(把大的往上調),如果調整了一個子節點,要對下面的非底層子節點進行遞歸判定和調整→第一輪排完之后父節點就是最大值,將其放到list最后一位,把底層子節點的最后一位拿到父節點來,再進行判定
所以理論上有三個步驟:
a.創建原始堆的函數,這個不用管嘛,就是list本身的索引位置;
b.從倒數第二層開始調整,確定第一個父節點;
c.可以反復遞歸的從上而下調整的函數heapify(父節點要調整的話,還要檢查調整后的子節點下面是否還需要調整)。
b步驟,實際也可以用heapify函數,只用依次從底層把小堆用heapify調整好,再對上一層節點用heapify,直到到達頂層為止。
所以關鍵就在于heapify函數。。
計數排序
犧牲空間換時間,額外建立兩個數組,一個數組生成一組固定數據(已經排序號),一個數組用來記錄原始list在固定數據組中出現的次數(所以肯定會有些是0),最后再釋放出來
希爾排序
插入排序的改進版本,但是不穩定,有可能會比排序算法花費時間更多。
第一次以lenth/2為間隔,對所有數據進行分組調序(一共lenth/2組)→第二次以lenth/4為間隔,對所有數據分組判斷,當需要調序時,需要以lenth/4為間隔往前傳遞直到不再調序位置(因為前方序列已經是對的,所以到某一處不用再調序,也就不用往前推了)→第三次以lenth/8為間隔。。。→最后以1位間隔依次分組判斷,以及往前傳遞。最后排序完成。 需要注意,每次如果有兩個數進行了調序,那么要繼續往前回推看前面的數需不需要調序(就跟堆排序的父節點發生改變,要檢查子節點一樣)
拓撲排序
暫時不管了吧,圖排序方法
四、兩個案例分析
構建NaN值的方法
float('NaN')/float('nan'),所以這好像是唯一構建Nan值的方法
image.png
五、python和mysql的時間函數及字符串函數比較
5.1 時間函數
返回當前日期
mysql:select curdate(),current_date();
image.png
python:datetime庫,或者time庫
image.png
返回當前時間
mysql:select curtime,current_time()
image.png
python:同上
時間增加
mysql:函數date_add(date,interval int keyword)或者函數adddate(date,interval int keyword)
image.png
image.png
pthon:函數timedelta
image.png
時間減少
mysql:函數date_sub(date,interval int keyword)或者函數adddate(date,interval int keyword),int為負就行
python:函數timedelta
時間日期的標準格式化
mysql:select date_formate(date,'%Y-%m-%d %H-%i-%s')
image.png
python:datetime和time模塊都有函數strftime
image.png
返回日期函數的年、月、日等
mysql:select year(now()), month(now()), day(now()), hour(now()), minute(now()), quarter(now());
image.png
python:
image.png
5.2 字符串函數
返回字符串長度
mysql:select lenth()
python:len()
連接字符串
mysql:select concat('a','b')
python:
image.png
替換字符
mysql:INSERT(str,x,y,instr):將字符串str從第x位置開始,y個字符長的子串替換為字符串instr,返回結果;REPLACE(str,str1,str2):在字符串str中用str2替換掉str1
image.png
image.png
python:
image.png
顛倒字符串
mysql:select reverse('SQL');
python:
image.png
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python基础应用_【复习】mysql+python基础应用(20190815)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3000 美元的苹果混合现实头显能否打开
- 下一篇: shell如何控制文件读写不同时_如何定