新手學(xué)Python可以按照以下步驟進(jìn)行:
創(chuàng)新互聯(lián)專注于營(yíng)口企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),商城系統(tǒng)網(wǎng)站開發(fā)。營(yíng)口網(wǎng)站建設(shè)公司,為營(yíng)口等地區(qū)提供建站服務(wù)。全流程按需規(guī)劃網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
1. 按部就班敲代碼
在Python的學(xué)習(xí)教程中,在講到相應(yīng)的語(yǔ)法規(guī)則的時(shí)候,必定有相應(yīng)的案例,Python新手應(yīng)按部就班的敲一遍代碼,切記不可直接抄寫,而是默寫,然后進(jìn)行對(duì)比,及時(shí)發(fā)現(xiàn)錯(cuò)誤,并訂正。
2. 階段案例實(shí)操
對(duì)于正規(guī)的Python學(xué)習(xí)教程中,會(huì)安排階段性的作業(yè)考核,也稱為案例,一個(gè)階段的案例就比較具有綜合性,可以客觀的考察Python學(xué)員能否真正的對(duì)Python知識(shí)點(diǎn)消化吸收,并融會(huì)貫通,通過(guò)該案例的實(shí)操,可以進(jìn)行知識(shí)點(diǎn)的查漏補(bǔ)缺!
3. 大型項(xiàng)目模仿
在Python學(xué)習(xí)中,少不了大型項(xiàng)目實(shí)操,如果參加培訓(xùn)學(xué)習(xí),這個(gè)就比較簡(jiǎn)單了,往往課程教學(xué)中會(huì)包含這一項(xiàng),Python學(xué)員可以先自己寫一遍,然后再聽老師的講解,通過(guò)對(duì)比,找到疑惑點(diǎn)和不足之處,然后進(jìn)行思路和項(xiàng)目的優(yōu)化;對(duì)于未參加Python培訓(xùn)的學(xué)員,可以在網(wǎng)上找一些大型項(xiàng)目進(jìn)行練習(xí),多看多練多總結(jié),就能熟練掌握Python,形成更優(yōu)化的Python思路。
對(duì)于Python等編程語(yǔ)言的學(xué)習(xí),首先是要掌握齊全科學(xué)的Python學(xué)習(xí)教程,其次,要有恒心和細(xì)心,多看、勤思考、多練習(xí)是一定能夠?qū)ython學(xué)好的!
一、如何在列表,字典,集合中根據(jù)條件篩選數(shù)據(jù)?
問(wèn)題1:
如何過(guò)濾掉列表[3,9,-1,10,20,-2]中的負(fù)數(shù)?
解決方法:
在Python中可以使用函數(shù)式編程,列表解析,字典解析集合解析等方式進(jìn)行篩選。
1)最通常的方法:迭代
data = [3,9,-1,10,20,-2]res = []for x in data: if(x = 0): res.append(x)print(res)
2)使用filter函數(shù)
from random import randintdata = [randint(-10,10) for x in range(10)] #在-10到10之間隨機(jī)生成10個(gè)隨機(jī)數(shù)newdata = list(filter(lambda x: x = 0, data))print(newdata)
注意Python3中的filter函數(shù)返回的對(duì)象從列表改為了Iterator(迭代器),因此如果想返回一個(gè)列表,就要加上list()
3)列表解析
newdata2 = [x for x in data if x = 0]print(newdata2)
結(jié)果和使用filter函數(shù)相同,但是使用列表解析所需的時(shí)間要比使用filter快很多,所以首選的方式就是列表解析,另外這兩種方式都遠(yuǎn)快于迭代的方式。(推薦閱讀:Python零基礎(chǔ)入門在線網(wǎng)課)
問(wèn)題2:
如何篩選出字典中值高于90的項(xiàng)?
解決方法:
from random import randintdic = {x: randint(60,100) for x in range(1,11)} #隨機(jī)生成學(xué)號(hào)1到10的學(xué)生成績(jī)newdic = {k:v for k,v in dic.items() if v = 90} #同時(shí)迭代鍵和值,Python3中的iteritems變?yōu)閕temsprint(newdic)
問(wèn)題3:
如何篩選出集合{77,89,32,29,33}中能被3整除的元素?
解決方法:
s = {77,89,32,29,33}news = {x for x in s if x % 3 == 0}print(news)
二、如何為元組中的每個(gè)元素命名,提高程序的可讀性?
實(shí)際案例:
如學(xué)生信息管理系統(tǒng)中數(shù)據(jù)為固定格式:
(名字,年齡,性別...)
學(xué)生數(shù)量很大,為了減少存儲(chǔ)開銷,對(duì)每個(gè)學(xué)生信息采用元組表示:
(‘jam’,16,’male’)
(‘tom’,18,’male’)
(‘july’,19,’female’)
...
訪問(wèn)元組時(shí),需要使用索引(index)來(lái)訪問(wèn),
如一個(gè)學(xué)生元組為student = ('jam',19,'male'),那么想要訪問(wèn)其名字時(shí)要使用student[0],訪問(wèn)其性別時(shí)要使用student[2]
由此帶來(lái)的問(wèn)題是大量的索引會(huì)降低程序的可讀性,
那么如何來(lái)解決這個(gè)問(wèn)題呢?
有兩種解決方案:
方案1:定義枚舉類型,也就是定義一系列數(shù)值常量
NAME = 0AGE = 1SEX = 2# NAME,AGE,SEX = range(1,4)student = ('jam',19,'male')print(student[NAME])print(student[AGE])
方案2:使用標(biāo)準(zhǔn)庫(kù)中collections.namedtuple替代內(nèi)置的tuple
from collections import namedtupleStudent = namedtuple('student',['name','age','sex']) #相當(dāng)于創(chuàng)建了一個(gè)命名元組類,第一個(gè)參數(shù)是元組的名字,第二個(gè)參數(shù)是其屬性s1 = Student('jam',18,'male') #可以直接傳參s2 = Student(name='tom',age=20,sex='male') #也可以通過(guò)關(guān)鍵字傳參print(s1.name) #通過(guò)屬性來(lái)訪問(wèn)print(s2.age)
zip() ?功能是從參數(shù)的多個(gè)迭代器中選取元素組合成一個(gè)新的迭代器。顧名思義,它就是一個(gè)將對(duì)象進(jìn)行打包和解包的函數(shù)。
它可以傳入的參數(shù)包括;元組、列表、字典等迭代器
它返回一個(gè)zip對(duì)象,其內(nèi)部元素為元組,一組一組的,可以轉(zhuǎn)化為列表或元組,這里要強(qiáng)調(diào)一下,Python2和Python3中返回的zip對(duì)象有所不同。
Python3中zip()函數(shù)再不再返回list對(duì)象,但是可以通過(guò)list強(qiáng)行轉(zhuǎn)換。(類似的函數(shù)變化還有dictionary關(guān)聯(lián)的keys()、values()、items(),map(),filter())。
打包zip(iterables)
上面的代碼使用的環(huán)境是Python3.6,其中l(wèi)ist (z)操作就是強(qiáng)制轉(zhuǎn)換。注意一個(gè)問(wèn)題,a和b這兩個(gè)列表是不同長(zhǎng)短的,這時(shí)候zip函數(shù)就會(huì)匹配完最短的那個(gè)便結(jié)束。
當(dāng)zip函數(shù)的參數(shù)只有一個(gè)時(shí),它將從iterable中依次取一個(gè)元素,組成一個(gè)元組。
解包zip(*iterables)
解包,zip 相反,可理解為解壓,返回多維矩陣形式,有幾個(gè)組元素就返回幾維的。
比如,下面我是用三個(gè)列表組合起來(lái)的迭代式,那么解壓后就返回三維的矩陣
zip高級(jí)用法
講完了基本的再來(lái)說(shuō)一下該函數(shù)的高級(jí)用法。高級(jí)用法離不開一個(gè)詞:Pythonic,就是將代碼寫的更優(yōu)雅美觀,看起來(lái)有逼格!
1. 列表推導(dǎo)
例如:
a = [1,2,3,4]
b = [5,6,7,8]
我們要同時(shí)遍歷a、b,且要對(duì)它們進(jìn)行操作,那就要放在同一個(gè)for循環(huán)內(nèi),zip函數(shù)正好合適
注意:如果是Python2環(huán)境中,要使用izip才能提高效率。
當(dāng)然,如果你需要對(duì)下標(biāo)進(jìn)行操作,那么還需要加上enumerate函數(shù)
2. 使用zip創(chuàng)建鍵值對(duì),zip方法返回的是一個(gè)元組,用它來(lái)創(chuàng)建鍵值對(duì),簡(jiǎn)單明了。
這是漫長(zhǎng)的一周,本周完成了Python的進(jìn)階模塊,主要是pandas、numpy、matplotlib、seaborn、pyecharts這些模塊的學(xué)習(xí)以及一個(gè)實(shí)際的案例:商品銷售情況分析,之前一直覺(jué)得課程難度不夠,但到這一周難度就大大提高了。尤其是案例練習(xí)中的RFM模型和用戶生命周期建立,看懂不難但是自己寫一直出錯(cuò),在不斷出錯(cuò)不斷嘗試中知識(shí)得到了積累,另外可視化部分沒(méi)有什么練習(xí)題,希望后面可以加上一些這方面的練習(xí),接下來(lái)分模塊來(lái)總結(jié)一下學(xué)習(xí)的內(nèi)容。
重新設(shè)置索引:df.set_index()
Series格式轉(zhuǎn)換為DataFrame:df.to_frame()
文件讀?。簆d.read_csv(filepath, header = 0,skiprows=[1,2])?
使用位置做索引:df.loc[0]????????使用列表做索引:df.loc[[0,1,2]]
使用切片做索引:df.loc[0:4]????????使用bool類型索引:df[df['年齡']30]
loc 是基于索引值的,切片是左閉右閉的
iloc 是基于位置的,切片是左閉右開的
修改列索引:df.rename(columns={'姓名':'name', '年齡':'age'},inplace=True)
替換一個(gè)值:df.replace({'name':{'小明':'xiaoming'}},inplace=True)
對(duì)數(shù)據(jù)進(jìn)行排序:df.sort_values('age')
累加求和:df.cumsum(0)
刪除列:del df['player']?????????刪除行:df.drop(labels=0)?labels 是行列的名字
數(shù)據(jù)拼接:pd.concat([left,right],axis=1)
# 指定列進(jìn)行關(guān)聯(lián),默認(rèn)是 inner join ????result = pd.merge(left,right,on='key')
#多個(gè)關(guān)聯(lián)條件:result = pd.merge(left, right, on=['key1', 'key2'])
#左連接:result = pd.merge(left, right, how='left', on=['key1', 'key2'])
# 列名不一樣的關(guān)聯(lián):pd.merge(left,right,left_on = ['key1','key2'],right_on = ['key3','key4'])
#單個(gè)分組:groups = df.groupby('district')
# 作用多個(gè)聚合函數(shù):groups.agg([np.mean,np.sum,np.std])
# 針對(duì)具體列聚合 groups.age.agg([np.mean,np.sum,np.std])
# 不同列不同聚合函數(shù) groups.agg({"age":np.mean,"novip_buy_times":np.sum})
分組后該列值求和顯示:groups['vip_buy_times'].transform('sum')
通常用于求占比:transform(lambda x: x /sum(x))
# 填充指定值:np.full([3,4],1)
# 起始為10,5為步長(zhǎng),30為結(jié)尾取不到:np.arange(10, 30, 5)
#隨機(jī)矩陣:np.random.random((2,3))
# 平均劃分:np.linspace( 0, 2*pi, 100 )
# 類型及轉(zhuǎn)換:vector.astype('float')
# 多維變一維:matrix.ravel()
# 矩陣的擴(kuò)展:a = np.arange(0, 40, 10)? ? b = np.tile(a, (3, 5))? ? # 行變成3倍,列變成5倍
# 水平拼接:np.hstack((a,b))? 豎直拼接:np.vstack((a,b))
# 豎直分割:np.hsplit(a,3)? ? #水平分割:np.vsplit(a,3)
8. Select the data in rows [3, 4, 8] and in columns ['animal', 'age'].
A:df.loc[df.index[[3,4,8]],['animal','age']]
行采用位置,列采用普通索引,這里利用index函數(shù)將位置變化為具體的普通索引,再利用loc函數(shù)
19. The 'priority' column contains the values 'yes' and 'no'. Replace this column with a column of boolean values: 'yes' should be True and 'no' should be False
A1:df['priority'].replace(['yes','no'],[True,False],inplace=True) 用replace函數(shù)替換
A2:df['priority'] = df['priority'].map({'yes': True, 'no': False}) 用map函數(shù)替換
最大最小值的索引:df.idxmax、df.idxmin
找出最大最小的前N個(gè)數(shù):nlargest()和nsmallest()?
將原表分組 并設(shè)置分段區(qū)間 pd.cut(df['A'], np.arange(0, 101, 10))
resample函數(shù) 日期重采樣:s.resample('M').mean()
TimeGrouper 重組:s.groupby(pd.TimeGrouper('4M')).idxmax()
split 分割函數(shù):temp = df['From_To'].str.split('_', expand=True) True為DataFrame
兩個(gè)DataFrame拼接用join:df = df.join(temp)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用來(lái)正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus']=False #用來(lái)正常顯示負(fù)號(hào)
%matplotlib inline 直接顯示
折線圖:plt.plot(x,y,color = 'r')
柱狀圖:plt.bar(x,y)? plt.barh(x,y) 多個(gè)bar x設(shè)置不同 堆積圖 bottom設(shè)置不同
散點(diǎn)圖:plt.scatter(x, y, c=colors, alpha=0.5, s = area)
直方圖:plt.hist(a,bins= 20) bin代表分隔的最小單位
plt.legend() 顯示圖例
for a,b in zip(X+W[i],data[i]):
plt.text(a,b,"%.0f"% b,ha="center",va= "bottom") 添加數(shù)據(jù)標(biāo)簽
plt.annotate('注釋文本',xy=(1, np.sin(1)),xytext=(2, 0.5), fontsize=16,arrowprops=dict(arrowstyle="-")) 添加注釋文本
plt.xlabel("Group") x軸標(biāo)題
plt.ylabel("Num") y軸標(biāo)題
fig, axes = plt.subplots(nrows=2, ncols=2,facecolor='darkslategray')? 繪制多個(gè)圖形
axes[0,0] axes[0,1] axes[1,0] axes[1,1]
pylab.rcParams['figure.figsize'] = (10, 6) # 調(diào)整圖片大小
動(dòng)態(tài)展示圖表
from pyecharts.charts import Bar
from pyecharts import options as opts
** pyecharts 繪圖的五個(gè)步驟:**
創(chuàng)建圖形對(duì)象:bar = Bar()
添加繪圖數(shù)據(jù):bar.add_xaxis(["襯衫", "毛衣", "領(lǐng)帶", "褲子", "風(fēng)衣", "高跟鞋", "襪子"])
? ? ???????????????? bar.add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
? ? ? ? ? ? ? ? ? ? ?bar.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
配置系列參數(shù):對(duì)標(biāo)簽、線型等的一些設(shè)置
配置全局參數(shù):bar.set_global_opts(title_opts=opts.TitleOpts(title="銷售情況"))
渲染圖片:生成本地 HTML 文件 bar.render("mycharts.html")? bar.render()
notebook 渲染:bar.render_notebook()
bar = (Bar()
.add_xaxis(["襯衫", "毛衣", "領(lǐng)帶", "褲子", "風(fēng)衣", "高跟鞋", "襪子"])
.add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
.set_global_opts(title_opts=opts.TitleOpts(title="某商場(chǎng)銷售情況"))
)
bar.render_notebook()
柱狀圖:Bar()
條形圖:bar.reversal_axis() #翻轉(zhuǎn)XY軸,將柱狀圖轉(zhuǎn)換為條形圖
折線圖:from pyecharts.charts import Line? line=Line()
餅圖:from pyecharts.charts import Page, Pie????Pie()?
轉(zhuǎn)換日期類型:df['order_dt']=pd. to_datetime (df.order_dt,format="%Y%m%d")
將日期轉(zhuǎn)換為月為單位:df['month']=df.order_dt.values. astype('datetime64[M]') 所有日期顯示為當(dāng)月第一天
去除日期單元值:order_diff/ np.timedelta64(1,'D')
過(guò)濾部分極值:grouped_user.sum() .query('order_products100') .order_amount
數(shù)據(jù)透視表:rfm=df.pivot_table( index ='user_id', values =['order_products','order_amount'], aggfunc ={'order_amount':'sum','order_products':'sum'})
map() 方法是pandas.series.map()方法, 對(duì)DF中的元素級(jí)別的操作, 可以對(duì)df的某列或某多列
applymap(func) 也是DF的屬性, 對(duì)整個(gè)DF所有元素應(yīng)用func操作
purchase_r=pivoted_counts.applymap(lambda x: 1 if x1 else np.NaN if x==0 else 0)
apply(func) 是DF的屬性, 對(duì)DF中的行數(shù)據(jù)或列數(shù)據(jù)應(yīng)用func操作,也可用于Series
apply(lambda x:x.cumsum()/x.sum())? ? 累計(jì)占比
apply(lambda x:x/x.sum(),axis=0)? ? ?每一列中每行數(shù)據(jù)占比
下周開始進(jìn)入數(shù)據(jù)分析思維的課程,很期待后面的課程以及項(xiàng)目,加油!