Python知識點整理

Python

1、python概述:

一、面向對象、解釋型計算機程序設計語言,目前最流行的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

 

2、實驗部分:

一、python安裝:數組

—方法一:官方Python(https://www.python.org/)+第三方庫安全

—方法二:第三方集成版—Anaconda(https://www.continuum.io/downloads)

二、環境 = python解釋器(負責Python程序的解釋執行)+一個命令行交互環境(python shell)+經過網頁進行交互式編程的環境(jupyter notebook)+集成開發環境

 

3、python語法:

一、變量:程序執行過程當中能夠改變的量。任意數據類型,無需事先定義數據類型,賦值時肯定數據類型。變量名:英文/下劃線開頭,後續字符爲英文/數字/下劃線

二、常量:程序執行過程當中不能改變的量。包括整數(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')

 

4、Pandas:

一、介紹:開源(BSD-licensed)python庫。基於NumPy庫開發,和其餘第三方庫無縫集成,支持時間序列分析。

能夠處理:

—表格數據 :表格各列可有不一樣類型

—時間序列數據:有序/無序,時間序列數據無需固定頻率數據

—矩陣:支持異構數據類型矩陣,能夠設定行列標籤

提供基本模塊(Fundamental Building Block),即基本數據結構:

—Series:一維數組,相似Numpy中array和list。區別是list中元素能夠是不一樣數據類型,array和series中只容許存儲相同數據類型的元素。

—Time Series:以時間爲索引的series

—DataFrame:二維表格型數據結構。series的容器

—Panel:三維數組。DataFrame的容器

二、Pandas的功能:

    • (1) 處理數據的缺失值(Missing Data),包括浮點數和非浮點數的缺失值。
    • (2) 動態擴展性,用戶能夠插入或者刪除DataFrame數據結構的列。
    • (3)數據對齊(Data Alignment):用戶能夠把數據對象對齊到標籤(Label),或者由Series、DataFrame等數據結構自行對齊。
    • (3) 分組彙集功能(Group by and Aggregation)。
    • (4) 把其它NumPy等第三方庫的數據結構轉換成DataFrame的功能。
    • (5) 數據轉換(Transformation)。
    • (6) 數據集的合併(Merging)和鏈接(Joining)。
    • (7) 從CSV文件、Excel文件、數據庫進行裝載數據,把數據保存到HDF5格式的文件,以及從HDF5格式的文件裝載數據。
    • (8) 座標軸的層次標籤(Hierarchical Labeling)。
    • (9) 數據透視表的旋轉(Pivoting)、改變形狀 (Reshaping)。
    • (10) 對大數據集進行基於標籤的(Label based)數據切片(Slicing)、提取子集(Sub Setting)、創建和使用索引(Fancy Indexing)。
    • (11) Pandas還提供面向時間序列數據處理的一些特殊功能,好比時間頻率轉換、移動窗口上的統計值計算、移動窗口上的線性迴歸、序列的前移和後移(Shifting and Lagging)、生成數據範圍好比生成時間範圍(Date Range Generation)等。

三、建立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())
相關文章
相關標籤/搜索