目錄
- 前言
- 1. Series 簡介
- 2. Series的特點
- 3. Series的創建
- 3.1 使用列表創建Series
- 3.2 使用字典創建Series
- 3.3 使用列表和自定義索引創建Series
- 3.4 指定數據類型和名稱
- 4. Series的索引/切片
- 4.1 下標索引:基于整數位置的索引
- 4.2 基于標簽的索引
- 4.3 切片
- 4.4 使用.loc[]和.iloc[]進行索引
- 5. 基本運算
- 5.1 算術運算
- 5.1.1 加法(+)
- 5.2 比較運算
- 5.3 邏輯運算
- 6. 基本屬性和方法
- 6.1 基本屬性示例
- 6.2 基本方法示例
- 6.3 檢測缺失數據的方法
- 7. 金融方面的幾個series示例
- 7.1 示例一:股票價格數據
- 7.2 示例二:收益率數據
- 7.3 示例三:交易量數據
- 8. 總結
前言
大家好!我是架構筑夢的Cherry,本期跟大家分享的知識是 pandas 數據結構——DataFrame。
作者的【 Python智能工坊】專欄及【少兒編程Python:趣味編程,探索未來】正在火熱更新中🔥🔥🔥,如果本文對您有幫助,歡迎大家點贊 + 評論 + 收藏 !
1. Series 簡介
pandas數據結構中的Series是一個一維數組對象,能夠保存任何數據類型(整數、字符串、浮點數、Python對象等),并有一個與之關聯的標簽序列,這些標簽被稱為“索引”(index)。索引與數據是一一對應的,通過索引可以快速獲取、更新或刪除數據。Series在pandas數據處理中起著至關重要的作用,是構建更復雜數據結構(如DataFrame)的基礎。
以下是關于pandas Series的詳細解釋:
- 定義:Series類似于一維數組或列表,但它有一個顯式的索引,用于標記數據。
- 組成:Series由兩部分組成——值(values)和索引(index)。
在金融數據分析中,pandas的Series數據結構扮演著重要角色。它可以用來存儲股價、交易量、市盈率等連續或離散的數據,并通過索引輕松訪問和操作這些數據。Series支持多種數據類型,允許用戶根據實際需求靈活使用。
2. Series的特點
- 一維數組:Series是一維的,意味著它只有一個軸(或維度),類似于Python中的列表。
- 索引:每個Series都有一個索引,用于對數據進行標記。索引可以是整數、字符串、日期等類型。如果不指定索引,pandas將默認創建一個從0開始的整數索引。
- 數據類型:Series可以容納不同數據類型的元素,包括整數、浮點數、字符串、Python對象等。
- 大小不變性:Series的大小在創建后是不變的,但可以通過某些操作(如append或delete)來改變。
- 操作:Series支持各種操作,如數學運算、統計分析、字符串處理等。
- 缺失數據:Series可以包含缺失數據,pandas使用NaN(Not a Number)來表示缺失或無值。
3. Series的創建
Series可以通過多種方式進行創建,包括但不限于:
- 使用列表或數組:可以傳遞一個列表或數組作為數據源來創建Series。
- 指定索引:可以為每個元素指定索引標簽。
- 使用字典:字典的鍵成為索引,值成為數據。
- 使用numpy的ndarray:可以直接使用numpy數組來創建Series。
pd.Series()是創建Series的常用方法,格式如下:
pd.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)
參數說明:
- data:這是必須的參數,可以是列表、數組、字典等,用于存儲Series中的數據。
- index:可選參數,用于指定索引標簽。如果不提供,則默認使用從0開始的整數索引。
- dtype:可選參數,用于指定數據類型。如果未指定,pandas會根據數據內容自動推斷數據類型。
- name:可選參數,用于給Series命名。命名后的Series在打印時會顯示名稱,方便識別。
- copy:可選參數,默認為False。如果為True,則會將數據復制到新的Series中,原始數據不受影響。
- fastpath:是否啟用快速路徑。默認為 False。啟用快速路徑可能會在某些情況下提高性能。
下面是幾個創建 Series 的實例:
3.1 使用列表創建Series
import pandas as pd
s1 = pd.Series([1, 2, 3, 4, 5])
print(s1)
輸出:
0 1
1 2
2 3
3 4
4 5
dtype: int64
輸出結果說明:
第一列:0-4 為 索引值,默認從 0 開始;
第二列:1-5 為 數據;
dtype: int64 為該 Series 變量的數據類型;
3.2 使用字典創建Series
import pandas as pd
data = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
s2 = pd.Series(data)
print(s2)
輸出:
a 1
b 2
c 3
d 4
e 5
dtype: int64
3.3 使用列表和自定義索引創建Series
import pandas as pd
labels = ['one', 'two', 'three', 'four', 'five']
s3 = pd.Series([1, 2, 3, 4, 5], index=labels)
print(s3)
輸出:
one 1
two 2
three 3
four 4
five 5
dtype: int64
3.4 指定數據類型和名稱
import pandas as pd
s4 = pd.Series([1.1, 2.2, 3.3, 4.4, 5.5], dtype=float, name='numbers')
print(s4)
輸出:
0 1.1
1 2.2
2 3.3
3 4.4
4 5.5
Name: numbers, dtype: float64
注意:
當使用字典創建Series時,如果字典的鍵不是有序的(如Python 3.7之前的字典),則Series的索引順序可能與字典的鍵插入順序不同。但在Python 3.7及以后的版本中,字典保持插入順序。
索引在Series中非常重要,它不僅用于標記數據,還用于數據的對齊和選擇。因此,在創建Series時,應仔細考慮索引的設置。
如果在創建Series時提供了與數據長度不一致的索引,pandas會自動對缺失的數據使用NaN(Not a Number)進行填充。
默認情況下,如果不指定索引,pandas會為Series創建一個從0開始的整數索引。這種索引被稱為“基于位置的索引”或“隱式索引”。在大多數情況下,這種索引對于數據分析和處理已經足夠。然而,在需要明確標記或選擇數據的情況下,可以手動指定索引標簽。
4. Series的索引/切片
4.1 下標索引:基于整數位置的索引
import pandas as pd# 創建一個默認的Series
s = pd.Series([10, 20, 30, 40, 50])# 使用基于位置的索引訪問數據
print(s[0])
print(s[2:4])
輸出:
10
2 30
3 40
dtype: int64
4.2 基于標簽的索引
在pandas的Series
中,基于標簽的索引是一種強大的功能,它允許你通過Series
的索引標簽來直接訪問或操作數據。這種索引方式特別適用于具有明確標簽(如股票名稱、日期等)的數據集。
當你創建一個Series
并為其指定了索引時,你就可以使用這些索引標簽來訪問、修改或選擇數據。
下面是基于標簽索引的示例:
假設我們有一個Series
,它包含了幾個股票在特定日期的收盤價,并使用了股票代碼作為索引標簽。
import pandas as pd# 創建一個帶有股票代碼作為索引的Series
stocks = pd.Series([100.5, 201.2, 150.8], index=['AAPL', 'MSFT', 'GOOGL'])# 使用基于標簽的索引訪問數據
print(stocks['AAPL']) # 輸出: 100.5# 使用多個標簽選擇數據(返回一個Series)
subset = stocks[['AAPL', 'GOOGL']]
print(subset)
# 輸出:
# AAPL 100.5
# GOOGL 150.8
# dtype: float64# 修改基于標簽的索引的數據
stocks['AAPL'] = 101.0
print(stocks)
# 輸出:
# AAPL 101.0
# MSFT 201.2
# GOOGL 150.8
# dtype: float64
在上面的示例中,我們首先創建了一個Series
對象stocks
,其中包含了三個股票代碼(‘AAPL’, ‘MSFT’, ‘GOOGL’)和它們對應的收盤價。然后,我們使用這些股票代碼作為標簽來訪問和修改數據。
4.3 切片
與Python中的列表或NumPy數組類似,可以使用切片來訪問Series的子集。
無論是基于位置的索引還是基于標簽的索引,你都可以使用切片來訪問數據的子集。不過,當使用基于標簽的索引進行切片時,你需要確保切片的標簽在Series的索引中是存在的,并且它們是連續的。
# 使用自定義索引的Series
s = pd.Series([10, 20, 30, 40, 50], index=['A', 'B', 'C', 'D', 'E'])# 使用基于標簽的切片(只有當標簽連續時才有效)
print(s['A':'C']) # 輸出: A 10# B 20# C 30# dtype: int64# 使用基于位置的切片(始終有效)
print(s[1:4]) # 輸出: B 20# C 30# D 40# dtype: int64
注意:如果基于標簽的切片中的標簽不連續或不存在于索引中,那么你會得到一個KeyError。如果你想要選擇不連續標簽的數據,你需要使用索引的loc屬性,并傳入一個標簽列表。
4.4 使用.loc[]和.iloc[]進行索引
對于更復雜的數據選擇或操作,你可以使用.loc[]
方法。雖然對于單個標簽的訪問,直接使用標簽和.loc[]
是等效的,但.loc[]
在處理多個標簽或條件選擇時更加靈活。
- .loc[]:基于標簽的索引。
- .iloc[]:基于位置的索引(總是整數位置)。
# 使用.loc[]基于標簽索引
print(s.loc['A':'C'])# 使用.iloc[]基于位置索引
print(s.iloc[1:4])
輸出:
A 10
B 20
C 30
dtype: int64
B 20
C 30
D 40
dtype: int64
.loc[]和.iloc[]提供了更明確和靈活的索引方式,特別是在處理復雜的數據集時。
5. 基本運算
在pandas庫中,Series
對象支持多種基本運算,這些運算包括算術運算、比較運算和邏輯運算。
以下是關于Series
基本運算的詳細解釋:
5.1 算術運算
算術運算包括加、減、乘、除等基本操作。
在pandas中,Series
對象之間可以直接進行這些運算,且pandas會自動處理索引對齊。
5.1.1 加法(+)
兩個Series
相加時,相同索引位置的元素會相加。如果兩個Series
長度相同且索引一致,則直接對應相加;如果長度不同或索引不完全對應,結果的索引將是兩個Series
索引的并集,不存在的索引將填充為NaN(表示非數字)。
示例:
import pandas as pd
s1 = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
s2 = pd.Series([4, 5, 6], index=['a', 'b', 'c'])
result_add = s1 + s2
print(result_add) # 輸出:a 5, b 7, c 9, dtype: int64
- 減法(-)、乘法(*)、除法(/):這些運算與加法類似,都是基于索引進行對應元素的運算。
5.2 比較運算
比較運算用于比較兩個Series
的元素值,包括等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)和小于等于(<=)等。這些運算會返回一個布爾類型的Series
,表示每個元素比較的結果。
示例:
s1 = pd.Series([1, 2, 3])
s2 = pd.Series([2, 2, 2])
result_eq = s1 == s2 # 比較是否相等
print(result_eq) # 輸出:0 False, 1 True, 2 False, dtype: bool
5.3 邏輯運算
邏輯運算在pandas中主要用于合并布爾Series
。但請注意,直接對兩個Series
對象進行邏輯運算(如and、or)在pandas中并不直接支持,因為這會引發錯誤。相反,你應該使用按元素比較產生的布爾Series
,并使用&
(邏輯與)和|
(邏輯或)等操作符進行邏輯運算。
示例:
s1_gt_1 = s1 > 1 # s1中大于1的元素
s2_lt_2 = s2 < 2 # s2中小于2的元素
result_logical = s1_gt_1 & s2_lt_2 # 邏輯與運算
print(result_logical) # 輸出:0 False, 1 False, 2 False, dtype: bool
在這個例子中,由于s1
和s2
中沒有同時滿足s1 > 1
和s2 < 2
的元素,所以結果全為False。
pandas的Series
對象支持豐富的運算操作,包括算術運算、比較運算和邏輯運算。這些運算都是基于索引進行的,能夠方便地處理和分析數據。在實際應用中,可以根據需要選擇合適的運算操作來處理和分析數據。
6. 基本屬性和方法
- 屬性:包括
values
(數據值)、index
(索引)、dtype
(數據類型)、name
(名稱)等。 - 方法:提供了許多用于數據操作和分析的方法,如
mean()
(計算平均值)、std()
(計算標準差)、unique()
(返回唯一值)等。
下面是基本屬性和方法的示例:
6.1 基本屬性示例
首先,創建一個Series對象
import pandas as pds = pd.Series([100, 150, 110, 130, 150, 150], index=['語文', '數學', '英語', 'Python', 'Pandas', 'NumPy'],name="考試成績")
下面,是訪問的基本屬性:
- shape:返回Series的形狀(通常是一個元組,對于Series來說,通常只有一個元素表示長度)
print(s.shape) # 輸出: (6,)
- size:返回Series的長度
print(s.size) # 輸出: 6
- index:返回Series的索引
print(s.index) # 輸出: Index(['語文', '數學', '英語', 'Python', 'Pandas', 'NumPy'], dtype='object')
- values:返回Series的值
print(s.values) # 輸出: array([100, 150, 110, 130, 150, 150], dtype=int64)
- name:返回Series的名稱
print(s.name) # 輸出: 考試成績
6.2 基本方法示例
- head():查看前幾條數據,默認5條
print(s.head()) # 輸出前5條數據
- tail():查看后幾條數據,默認5條
print(s.tail()) # 輸出后5條數據
- describe:返回描述統計信息
print(s.describe())
輸出:
count 6.000000
mean 131.666667
std 22.286020
min 100.000000
25% 115.000000
50% 140.000000
75% 150.000000
max 150.000000
Name: 考試成績, dtype: float64
- idxmax:獲取最大值和最小值的索引
print(s.idxmax()) # 輸出:數學
print(s.idxmin()) # 輸出:語文
- dtype:數據類型
print(s.dtype) # 輸出:int64
- sum:求和
print(s.sum()) # 輸出:790
- mean:平均值
print(s.mean()) # 輸出:131.66666666666666
- max:最大值
print(s.max()) # 輸出:150
- min:最小值
print(s.min()) # 輸出:100
- std:標準差
print(s.std()) # 輸出:22.28601953392904
- astype:將 Series 轉換為另一種數據類型
s = s.astype('float64') # 將 Series 中的所有元素轉換為 float64 類型
6.3 檢測缺失數據的方法
雖然在這個示例中沒有缺失數據,但我們可以演示如何使用isnull()
和notnull()
方法。
s_with_missing = pd.Series([100, 150, None, 130, 150, 150], index=['語文', '數學', '英語', 'Python', 'Pandas', 'NumPy'],name="考試成績")print(s_with_missing.isnull()) # 輸出布爾序列,表示哪些位置是缺失值
以上展示了pandas.Series
的一些基本屬性和方法。這些屬性和方法提供了靈活且強大的工具來操作和分析一維數據。通過結合索引、值和屬性,我們可以有效地處理數據并執行各種操作。
7. 金融方面的幾個series示例
在金融領域,Series
可以用于存儲和處理各種金融數據,如股票價格、收益率、交易量等。以下是幾個與金融相關的 Series
示例:
7.1 示例一:股票價格數據
import pandas as pd# 假設有以下股票數據
data = {'日期': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05'],'收盤價': [100.0, 101.5, 102.1, 100.8, 103.0]}# 將數據轉換為pandas的DataFrame,然后選取'收盤價'列轉換為Series
df = pd.DataFrame(data)
stock_prices = df.set_index('日期')['收盤價']# 顯示Series
print(stock_prices)
輸出:
日期
2023-01-01 100.0
2023-01-02 101.5
2023-01-03 102.1
2023-01-04 100.8
2023-01-05 103.0
Name: 收盤價, dtype: float64
7.2 示例二:收益率數據
# 假設有以下收益率數據
dates = pd.date_range(start='2023-01-01', periods=5)
returns = pd.Series([0.01, 0.015, -0.005, 0.003, 0.02], index=dates)# 顯示Series
print(returns)
輸出:
2023-01-01 0.01
2023-01-02 0.02
2023-01-03 -0.01
2023-01-04 0.00
2023-01-05 0.02
dtype: float64
7.3 示例三:交易量數據
# 假設有以下交易量數據
trade_dates = pd.date_range(start='2023-01-01', periods=4, freq='B') # 只包括工作日
volumes = pd.Series([10000, 12000, 9800, 11500], index=trade_dates)# 顯示Series
print(volumes)
輸出:
2023-01-02 10000
2023-01-03 12000
2023-01-04 9800
2023-01-05 11500
dtype: int64
這些示例展示了如何使用 pandas
中的 Series
來存儲和處理金融數據。在實際應用中,這些數據可能來自多種來源,如數據庫、API、文件等。處理這些數據時,可能會涉及到數據清洗、轉換、分析和可視化等多個步驟。通過使用 Series
的各種屬性和方法,可以方便地進行這些操作,為金融分析和決策提供支持。
8. 總結
pandas的Series數據結構提供了一種靈活且功能強大的方式來存儲和處理一維數據。通過顯式索引的引入,Series提供了更多的數據處理和分析選項,使其成為數據分析師和數據科學家的重要工具。