一、面向對象、解釋型計算機程序設計語言,目前最流行的10種編程語言之一html
二、荷蘭 Guido Van Rossum 1989發明。第一個公開發行版:1991 年python
三、語言特色:正則表達式
—編程範式:支持命令式編程、函數式編程、面向切面編程、泛型編程、面向對象程序設計算法
—與Ruby、Perl、TCL等動態語言同樣,具有垃圾回收功能,自動管理內存使用shell
—Python虛擬機自己和Python程序能夠在幾乎全部操做系統(Windows、Linux、Unix、MacOS)上運行。數據庫
—可使用py2exe、PyPy、PyInstaller工具,將Python源碼轉換成能夠脫離Python解釋器執行的程序編程
—做爲腳本語言,處理系統管理任務和Web編程。api
一、python安裝:數組
—方法一:官方Python(https://www.python.org/)+第三方庫安全
—方法二:第三方集成版—Anaconda(https://www.continuum.io/downloads)
二、環境 = python解釋器(負責Python程序的解釋執行)+一個命令行交互環境(python shell)+經過網頁進行交互式編程的環境(jupyter notebook)+集成開發環境
一、變量:程序執行過程當中能夠改變的量。任意數據類型,無需事先定義數據類型,賦值時肯定數據類型。變量名:英文/下劃線開頭,後續字符爲英文/數字/下劃線
二、常量:程序執行過程當中不能改變的量。包括整數(ex:33)、小數、字符串
三、註釋:#開頭到一行末尾。Python解釋器忽略註釋,不執行。
四、數據類型
4.1 布爾值bool:True/False。能夠用True/False表示布爾值,也能夠經過關係運算/邏輯運算計算出來
4.2 整數int:表示精度不限的整數
4.3 浮點數float:標準寫法(3.23)/科學計數法(3.23e3)
4.4 複數complex:包括實部和虛部,虛部帶一個字符j(ex: c1 = 3+2.7j)
4.5 字符串str:單引號/雙引號括起來,三個雙引號首尾括起來的字符串能夠換行。字符串包括換行和空格。下標從0開始
ex: s3 = """This is apple.」」" str=‘Hello’ print(str[2:])#打印2號下標字符,以及後續字符 print(str[2:5])#打印二、3、4號下標字符 print(str*2)#打印str兩遍 print(str+」Test」)#HelloTest
4.6 列表list:[]括起元素,中間逗號隔開,元素能夠同類型也能夠不一樣類型。
ex: list = [‘abcd’,789]
print(list*2)#[‘abcd’,789,’abcd’,789]
—追加元素x:append(x)
—x插入指定位置i:insert(i,x)
—刪除末尾元素:pop()
—刪除指定位置i元素:pop(i)
—替換元素:直接賦值給索引值。
使用列表對矩陣進行轉置
#way1 a=[[3,4,5,6],[13,14,15,16],[23,24,25,26]] b=[] i=0 for row in range(len(a[0])): b.append([]) for col in range(len(a)): b[row].append(a[col][row]) print(a) print(b) #way2 import pandas as pd df=pd.DataFrame(b) print(df.transpose())
4.7 元組tuple:()括起元素。一旦初始化不能修改(read-only)。代碼更加安全。
4.8 字典dict:Hash Table。鍵值對key-value pairs。key和value能夠是整數、小數、字符串、布爾值。
—查找元素:dict[key] / dict.get(key)
—刪除key:pop(key)
—判斷key是否在dict中:key in dict
4.9 集合與凍結集合set/frozenset:概念同數學,元素無序且惟一。可作交&並|集操做。用{}括起,元素用逗號隔開。
—添加元素:add(key)
—刪除元素:remove(key)
—判斷元素是否在set中:key in set
frozenset:一旦建立不可更改
五、運算符、優先級、表達式:
5.1 運算符:包括算數運算符、關係運算符、邏輯運算符、集合運算符、對象運算符
5.2 優先級:書
5.3 表達式:利用運算符,把兼容的常量、變量拼接起來的式子。
ex: 關係運算表達式(a>b)、邏輯表達式(a>b and c>d)
六、順序、分支、循環:
6.1 順序程序結構:順序執行
6.2 分支程序結構:條件判斷(關係表達式、邏輯表達式)。if/ else/ elif。能夠嵌套
6.3 循環程序結構:while/ do-while/ for
6.4 程序=數據結構+算法。
算法特色:肯定性(每步肯定);有窮性(操做步驟有限);0/多個輸入;1/多個輸出;有效性(肯定結果)
#冒泡排序python代碼 list_name = ['A','B','C','D'] list_socre = [1,2,3,4] count = len(list_name) for i in range(0,count): for j in range(i+1,count): if(list_score[i]>list_score[j]): list_score[i],list_score[j] = list_score[j],list_score[i] list_name[i],list_name[j] = list_name[j],list_name[i] for i in range(0,count): print(list_name[i]+」:」+list_score[i])
七、函數:具備必定功能的一段代碼,有利於程序模塊化設計風格實現。能夠遞歸調用。
二分搜索:
def bin_search(a,target): low=0 high=len(a)-1 while(low<=high): mid=(low+high)/2 mid_value=a[mid] if(mid_value<target): high=mid-1 elif(mid_value>target): low=mid+1 else: return mid return -1 a = [1,2,3,4,5,6,7,8] target = 6 ret_result = bin_search(a,target) if(ret_result==-1): print("Not Found") else: print(ret_result)
Hanoi 問題:
def hanoi(n,x,y,z): if(n==1): print(n,':',x,'-->',z) else: hanoi(n-1,x,z,y) print(n,':',x,'-->',z) hanoi(n-1,y,x,z) n=int(input(u'please input the number of disks:') print(n) hanoi(n,'x','y','z')
Python內置函數(https://docs.python.org/2/library/functions.html)
八、類和對象、對象的構造、對象摧毀、封裝和繼承、重寫:
class Employee(object): def __init__(self,_name): self.name = _name def setName(self,_name): self.name = _name def setSex(self,_sex): self.sex = _sex def show(self) print 'name:',self.name,',sex:',self.sex emp1 = Employee('John') emp1.setName('John') emp1.setSex('Male') emp1.show() print Employee.__name__#顯示類名
8.1 構造函數:負責對象的構造、初始化,名稱是__init__,帶一個self參數(指向要構造的對象,即對象的引用)和其餘參數。
8.2 對象摧毀和垃圾回收:週期性執行,自動刪除對象,釋放內存
8.3 重寫(Override):對父類的方法從新定義的機制
九、異常處理:發生除零等異常,捕捉異常,打印提示信息,採起補救措施。
通常把可能引起異常的代碼放在try: 語句塊裏,以後except: 語句塊對錯誤狀況做出處理
try: a = 10 b = 0 print(a/b) except ZeroDibisionError: print('Error')
class Networkerror(RuntionError): def __init__(self,_args): self.args = _args try: host_not_found = True if(host_not_found): raise Networkerror("host not found") #若是沒有異常,繼續執行後續代碼 except Networkerror, e: print(e.args)
十、正則表達式:特殊的字符序列。用於匹配/查找其餘字符串裏面的子串。
import re #正則表達式匹配電話號碼 pattern_phone = re.compile('^(\d{3})-(\d{3})-(\d{4})$') phone = '800-555-1212' #phone = '800-555-1212-1216' phonematch = pattern_phone.match(phone) if(phonematch): print(phonematch.group()) else: print('error')
一、介紹:開源(BSD-licensed)python庫。基於NumPy庫開發,和其餘第三方庫無縫集成,支持時間序列分析。
能夠處理:
—表格數據 :表格各列可有不一樣類型
—時間序列數據:有序/無序,時間序列數據無需固定頻率數據
—矩陣:支持異構數據類型矩陣,能夠設定行列標籤
提供基本模塊(Fundamental Building Block),即基本數據結構:
—Series:一維數組,相似Numpy中array和list。區別是list中元素能夠是不一樣數據類型,array和series中只容許存儲相同數據類型的元素。
—Time Series:以時間爲索引的series
—DataFrame:二維表格型數據結構。series的容器
—Panel:三維數組。DataFrame的容器
二、Pandas的功能:
三、建立Series:
import pandas as pd import numpy as np import matplotlib.pyplot as plt s = pd.Series([1,3,5,np.nan,6,8]) print(s)
四、建立DataFrame:DataFrame的每一列的數據都相同,不一樣的列數據類型不一樣。每一行是一個記錄,每一列是一個字段。
import pandas as pd import numpy as np import matplotlib.pyplot as plt dates = pd.date_range('20130101',periods=6) df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=['A','B','C','D']) df2 = pd.DataFrame({'A':1.,'B':pd.Timestamp('20130102'),'C':pd.Series(1,index=range(4),dtype='float32'),'D':np.array([3]*4,dtype='int32'),'E':pd.Categorical(['test','train','test','train']),'F':'foo'}) print(df) print(df2) print(df.head())#前5行,head和tail能夠顯示前N條和後N條記錄,N默認爲5 print(df.tail())#後5行 df.describe()#描述信息,包括計數、平均數、標準差、最大值、最小值、4分位差 print(df.index)#行標籤 print(df.columns)#列標籤 print(df.dtypes)#各列的數據類型 print(df.values)#DataFrame的值 print(df.T)#數據轉置 df = df.sort_index(axis=1,ascending=False) #按照第1個座標軸進行排序,即沿着列方向對col name排序。按照第0個座標軸排序,即對行標籤排序 print(df) df = df.sort_values(by='B')#對B列進行排序 print(df) print(df['A'])#只打印列A print(df[0:3])#提取下標爲0、一、2的行,行下標有頭無尾 print(df['20130102':'20130104'])#提取‘20130102’‘20130103’‘20130104’三行,行標籤有頭有尾 print(df.loc['20130102':'20130104',['A','B']]) print(df.iloc[3:5,0:2])#row=3&4,clo=0&1 print(df.iloc[[1,2,4],[0,2]])#row=1&2&4,col=0&2 print(df.iloc[1,1])#提取一個單元cell的值 print(df.iat[1,1])#提取一個單元cell的值,第一行第一列爲0,0 print(df[df.A>0])#提取A>0的行 print(df2[df2['E'].isin(['train'])])#提取df2的E列值爲‘train’的行 df.at[dates[0],'A'] = -99#經過行標籤和列標籤,設定單元格的值 print(df.head()) df.iat[0,1] = 3#經過行下標和列下標,設定單元格的值 print(df.head()) df.loc[:,'D'] = np.array([5]*len(df))#對整列進行設置 print(df) df.iat[0,2] = np.nan df = df.dropna(how = 'any')#把包含缺失值的行刪除 print(df) print(pd.isnull(df)) df.fillna(value=5)#用5替代缺失值 print(df.mean())#計算DataFrame每一個數據列的均值 df.apply(lambda x:x.max() - x.min())#計算極差=最大值-最小值 s = pd.Series(np.random.randint(0,7,size=10))#計算每一個值的頻率 print(s.value_counts()) s.plot.hist(grid=True,rwidth=0.9,color='#607c8e') plt.title('test histogram') plt.xlabel('counts') plt.ylabel('value') plt.grid(axis='y',alpha=0.75) s = pd.Series(['A','B','C','Aaba','Baca',np.nan,'CABA','dog','cat'])#向量化的處理方式(一次處理若干元素),如:將全部字符串都變成小寫形式 s = s.str.lower() print(s) df = pd.DataFrame(np.random.randn(10,4)) print(df) pieces = [df[:3], df[3:7], df[7:]] print(pd.concat(pieces))#DataFrame的合併,將若干模式相同的DataFrame合併構成一個大的DataFrame。 left = pd.DataFrame({'key':['foo','bar'],'lval':[1,2]}) right = pd.DataFrame({'key':['foo','bar'],'rval':[4,5]}) print(left) print(right) pd.merge(left,right,on='key')#DataFrame的鏈接:將兩個DataFrame各行合起來構成目標DataFrame的一行 df = pd.DataFrame(np.random.randn(8,4),columns=['A','B','C','D']) print(df) s = df.iloc[3] print(s) df = df.append(s,ignore_index=True)#添加新的數據行 print(df) df = pd.DataFrame({'A':['foo','bar','foo','bar','foo','bar','foo','foo'],'B':['one','one','two','three','two','two','one','three'],'C':np.random.randn(8),'D':np.random.randn(8)}) #分組:根據每一個列的值把全部的行分紅一組一組的。彙集:進行求和、最小值、最大值、平均值計算 print(df) print(df.groupby('A').sum()) print(df.groupby(['A','B']).sum()) df = pd.DataFrame({'A':['one','one','two','three'] * 3,'B':['A','B','C'] * 4,'C':['foo','foo','foo','bar','bar','bar'] * 2,'D':np.random.randn(12),'E':np.random.randn(12)}) print(df) pd.pivot_table(df,values='D',index=['A','B'],columns=['C'])#建立以A,B列爲行變量,C列爲列變量,D列爲單元格值的數據透視表
import pandas as pd import numpy as np rng = pd.date_range('1/1/2012',periods=10,freq='S')#頻率爲秒 ts = pd.Series(np.random.randint(0,500,len(rng)),index=rng) print(ts) ts = ts.resample('5Min').sum()#pandas提供resample函數,對時間序列進行頻率轉化和從新採樣。本例將秒級採樣的數據,進行每5分鐘從新採樣,求和彙總 print(ts) rng = pd.date_range('3/6/2012 00:00',periods=5,freq='D')#頻率爲天 ts = pd.Series(np.random.randn(len(rng)),index=rng) print(ts) #時間序列數據的時間戳,能夠改變時區設定 ts_utc = ts.tz_localize('UTC')#世界標準時間 print(ts_utc) ts_new = ts_utc.tz_convert('US/Eastern')#轉換成美國東部時間 print(ts_new) #Converting between time span representations #時間序列數據分爲時期序列(period)和時點序列(point) rng = pd.date_range('1/1/2012',periods=5,freq='M')#頻率爲月 ts = pd.Series(np.random.randn(len(rng)),index=rng) print(ts) ps = ts.to_period()#將時點序列轉成時期序列 print(ps) print(ps.to_timestamp())#再轉成時點序列 #將頻率爲季度的時間序列數據,轉換成季度最末尾一個月第一天上午9點的時點序列數據 prng = pd.period_range('1990Q1','2000Q4',freq='Q-NOV') ts = pd.Series(np.random.randn(len(prng)),index=prng) print(ts.head()) ts.index = (prng.asfreq('M','e')+1).asfreq('H','s')+9
#畫圖 #可視化Series:序列從2000年1月1日開始1000天的隨機數序列 import pandas as pd import numpy as np import matplotlib.pyplot as plt ts = pd.Series(np.random.randn(1000),index=pd.date_range('1/1/2000',periods=1000)) plt.figure(); ts = ts.cumsum()#cumulative sum ts.plot() plt.legend(loc='best') plt.show() #可視化DataFrame:行標籤和Series行標籤同樣 df = pd.DataFrame(np.random.randn(1000,4),index=ts.index,columns=['A','B','C','D']) df = df.cumsum()#cumulative sum plt.figure(); df.plot(); plt.legend(loc='best') plt.show() #讀寫文件:將數據保存到文件/寫到文件,支持csv,HDF5,excel #Writing to & read from a csv file df.to_csv('foo.csv') df = pd.read_csv('foo.csv') print(df.head()) #Writing to & read from HDF5 Store df.to_hdf('foo.h5','df') df = pd.read_hdf('foo.h5','df') print(df.head) #Writing to & read from an excel file df.to_excel('foo.xlsx',sheet_name='Sheet1') df = pd.read_excel('foo.xlsx','Sheet1',index_col=None,na_values=['NA']) print(df.head())