Pandas Pandas的主要功能 具備對其功能的數據結構DataFrame、Series 集成時間序列功能 提供豐富的數學運算和操作 靈活處理缺失數據 Series **Series介紹:**Series是一種類似於一維數組的對象,由一組數據和一組與之相關的數據標簽(索引)組成,比較像列表和字典 ...
Pandas
Pandas的主要功能
Series
Series介紹:Series是一種類似於一維數組的對象,由一組數據和一組與之相關的數據標簽(索引)組成,比較像列表和字典的結合體
Series創建方式:
# 普通創建
pd.Series([1,2,3,4])
# 帶索引創建
pd.Series([1,2,3,4],index=['a','b','c','d']) #但是我們依舊可以通過[0]來訪問到數據,有兩種訪問方法,並沒有被真正覆蓋掉
# 使用字典創建
pd.Series({'a':1,'b':2})
Series使用特性
Series支持array特性 | Series支持字典特性 |
---|---|
從ndarray創建Series:Series(arr) | 從字典創建Series,Series(dic) |
與標量運算sr*2 | in運算:'a' in str |
兩個Series運算:sr1+sr2 | 鍵索引:s['a']、s[['a'、'b']] |
索引:sr[0],s[[1,2,4]] | |
切片:sr[0:2] | |
通用函數:np.abs(sr) | |
布爾值過濾:sr[sr>0] |
01-常用函數
# 獲取索引值
sr.index
# 獲取值
sr.values
# 根據標簽花式索引
sr[['a','b']]
# 根據標簽切片
sr['a','b']
Sr整數索引問題
在對Series進行切片處理時,可能會出現整數訪問的問題
import pandas as pd
import numpy as np
sr = pd.Series(np.arange(20))
sr2 = sr[10:].copy()
sr2[10] # 可以正常訪問
sr2[0] # 無法正常訪問
# 如何解決整數索引的問題
# 通過標簽選擇 [[1,13,14],[10,11,12]]
sr2.loc[10] #結果為1
# 通過下標選擇
src.iloc[10] #選擇失敗,下標越界
src.iloc[0] #結果為1
02-數據對齊
在Series中,是按照索引對齊的,兩個Series對象是按照索引對齊然後計算的。
sr1 = pd.Series([11,12,13],['a','c','d'])
sr2 = pd.Series([14,15,21],['c','a','d'])
sr1 + sr2
# 如果一個索引有,另外一個索引沒有,那麼就會出現NaN的結果
# 缺失值處理
sr1.add(sr2,fill_value=0)
運行結果如下
a 26
c 26
d 34
dtype: int64
DataFrame
DataFrame:DataFrame是一個表格型數據結構,含有一組有序的列.DataFrame可以被看作是Series組成的字典,並且共用一個索引。
創建DataFrame:
先創建一個基礎的DataFrame
test1 = pd.DataFrame({'one':[1,2,3],'two':[4,5,6]},index=['a','b','c'])
test1
# 或者也可以用以下格式,體現Pandas將字典轉化為dataframe
import pandas as pd
data = {"name":["yahoo","google","facebook"],"marks":[200,400,800],"price":[9,3,7]}
dataframe1 = pd.DataFrame(data,index=['one','two','three'])
dataframe1
創建出的DataFrame對象如下
以及如下:
再通過Series創建一個DataFrame
test2 = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['a','b','c','d'])})
創建出的DataFrame對象如下
DataFrame讀取CSV文件
# 讀取csv文件
df = pd.read_csv('test.csv')
# 保存csv文件
df.to_csv("文件名.csv")
01-常用屬性
DataFrame常用屬性
屬性值 | 屬性作用 |
---|---|
index | 獲取索引 |
T | 轉置 |
columns | 獲取列索引 |
values | 獲取值索引 |
describe() | 獲取快速統計 |
02-索引與切片
# 根據索引名索引
df['列']['行'] #註意順序不能反了
# 通過標簽形式訪問
df.loc['行','列']
# 通過標簽方式訪問某幾行
df.loc[['a','c'],:]
03-數據對齊
DataFrame行列在進行數據對齊的時候,其行索引和列索引分別對齊
04-缺失值處理
DataFrame在處理缺失值的時候與Series有相像的地方,但是在使用dropna()時候,會刪除這一行。
所以我們需要一個函數,當這一行全為NaN時候,我們再刪除它
# 當一行全為缺失值時,進行刪除
test2.dropna(how='all')
# 當一行只要有一個缺失值時,刪除
test2.dropna(how='any')
# 當一列只要有一個缺失值是,刪除
test2.dropna(axis=1,how='any') #預設axis=0,按行刪除,修改axis=1,按列刪除
05-常用函數
# 對列(行)求平均值 mean(axis=0,skipna=False)
df.mean() #預設按照列求缺失數據
df.mean(axis=1) #按照行求缺失數據
# 對列(行)求和
df.sum() #預設按照列求缺失數據
df.sum(axis=1) #按照行求缺失數據
# 對列(行)索引排序,有NAN的部分不參與排序,放到最後
df.sort_values(by='列名') #按照某列升序排列
df.sort_values(by='列名',ascending=False) #按照某列降序排列
df.sort_values(by='行名',axis=1) #按照某行升序排列
df.sort_values(by='行名',axis=1,ascending=False) #按照某行降序排列
# 按某一列(行)索引排序
df.sort_index() #按照行索引升序排序
df.sort_index(ascending=False) #按照列索引降序排序
時間序列
01-時間對象
- Python標準庫處理時間對象:datetime
- 靈活處理時間對象:dateutil
- 成組處理時間對象:pandas:pd.to_datetime()
時間對象轉換代碼
# 初步的時間對象轉換
import datetime
datetime.datetime.strptime('2023-02-06','%Y-%m-%d')
# 忽略格式,自動轉換
dateutil.parser.parse('2020-02-01')
dateutil.parser.parse('2020-JAN-01')
dateutil.parser.parse('03/04/2023')
# pands轉換方式
pd.to_datetime(['2001-01-02','2020-Feb-03'])
# 輸出結果如下
pd.to_datetime(['2001-01-02','2020-Feb-03'])
02-生成時間範圍
# 預設生成一段時間的時間序列
pd.date_range('2010-01-01','2010-05-01')
# 選擇起始節點,按天數生成
pd.date_range('2010-01-01',periods=60)
# 選擇起始節點,按小時數生成
pd.date_range('2023-02-01',periods=60,freq='H')
# 選擇起始節點,輸出工作日
pd.date_range('2023-02-01',periods=60,freq='B') #生成的是時間戳
# 時間範圍轉化為字元串
tm[0].to_pydatetime()
03-時間序列
時間序列:以時間對象為索引的Series或DataFrame,datatime對象作為索引時是存儲在DatetimeIndex對象中的
時間序列的特殊功能:
- 傳入年或年月作為切片方式
- 傳入日期範圍作為切片方式
- 豐富的函數支持:resample()、truncate()
# 以B模式生成時間序列
sr = pd.Series(np.arange(100),index=pd.date_range('2023-01-01',periods=100,freq='B'))
sr
# 取時間序列中的值 返回結果為99
sr['2023-04-10']
# 取時間序列之後的值
sr['2023-01-01':]
# 取時間序列一段範圍的值
# 返回結果為99
根據時間戳求每周的和
sr.resample('W').sum()
求和結果如下:
根據時間戳求每月的和
sr.resample('M ').sum()
文件操作
01-CSV文件讀取
Pandas文件讀取主要參數
參數名 | 參數作用 |
---|---|
sep | 指定分隔符, 可用正則表達式比如's+' |
header=None | 指定文件無列名 |
name | 指定列名 |
index_col | 指定某列作為索引 |
skip_row | 指定跳過某些行 |
na_values | 指定某些字元串表示缺失值 |
parse_dates | 指定某些列是否被解析為日期,類型為布爾值或者里欸包 |
# 讀取csv文件,將時間列作為索引(註意此時為字元串)
pd.read_csv('test.csv',index_col='date')
# 將時間字元串轉為時間序列
pd.read_csv('test.csv',index_col='date',parse_dates=True) #將能表示為時間序列的數據表示為時間序列
# 指定某列為時間序列
pd.read_csv('test.csv',index_col='date',parse_dates='date')
# 當沒有列名,全是數據的時候,可以自動生成header,預設0,1,2...
pd.read_csv('test.csv',header=None)
# 當沒有列名,全是數據的時候,可以使用列表賦值header
pd.read_csv('test.csv',header=None,names=['abcdefg']
02-CSV文件保存
Pandas文件保存主要參數
參數名 | 參數作用 |
---|---|
sep | 指定文件分隔符 |
na_rep | 指定缺失值轉換的字元串,預設空字元串 |
header=False | 不輸出列名的一行 |
index=False | 不輸出索引的一行 |
cols | 輸出指定的列 |
實戰操作
01-讀取股票數據
get_price():可以得到股票數據,語法格式如下:
get_price(security,start_date=None,end_date=None,frequency='daily',fields=None,skip_paused=False,fq='pre',count=None)
get_price()函數可以按天或者按分鐘讀取數據,各項參數含義如下:
- security:一隻股票代碼或一隻股票代碼的list
- start_date:開始時間,與參數count二選一,不可同時使用。需要註意的是,如果參數count和start_date都沒有設置,則start_date生效值為:'2015-01-01'
- end_date:結束時間,預設值是'2015-12-31',
- frequency:單位時間長度,幾天或幾分鐘,預設為daily.也可以是minute、Xd、Xm.X表示幾的意思
- fileds:字元串list,選擇要獲取行情的數據,預設為None。參數Fields支持SecurityUnitDate中所有的數據 ,包含
- open close low high volume money factor high_limit low_limit avg pre_close paused
- skip_pasued:是否跳過不交易日期
- fq:復權選項。參數值設為pre,表示前復權,為預設設置。參數權設為None,表示不復權,返回實際價格,參數值設為post,表示後復權