您現在的位置是:首頁 > 藝術

一日一技:Python + Excel——飛速處理資料分析與處理

由 櫻桃玩遊戲衫r 發表于 藝術2022-10-01
簡介如果你的用例和陣列大小合適的話,那麼使用 NumPy 陣列進行運算會比 Python 列表快上幾百倍

報表關鍵字錄入有何用處

Python 可以為 Excel 做些什麼?如果你經歷過工作簿意外崩潰、計算出錯,並且需要執行枯燥的手動操作,那麼肯定想知道這個問題的答案。這本書是為工作表軟體使用者準備的一本全面又簡明扼要的 Python 入門指南。不要因為害怕學習程式設計就避而遠之,費利克斯為學習 Python 提供了一個極佳的切入點,即便是經驗豐富的程式設計師也能從中獲益。同時,他將這本書的內容進行了合理的編排,使得像你一樣的 Excel 使用者更易於理解和應用。可以指導人們如何在 Python 的幫助下最大化地發揮 Excel 的能力。如果你想知道 Excel 結合 Python 有何潛能,那麼費利克斯是回答這個問題的不二人選。希望你能像我一樣喜歡這堂大師課程。

從 Excel 到 Python 是一種自然的過渡,並且 Python 會讓人想要直接丟掉 Excel。雖然這種想法很吸引人,但是要直接丟掉 Excel 還是不那麼現實。Excel 不會消失,它會作為一種用途廣泛的桌面工具持續存在於企業和家庭中。這本書架起了連線這兩個世界的橋樑。書中解釋了你應該如何將 Python 整合到 Excel 中,以及如何從躲都躲不掉的巨型工作簿、上千個公式、奇形怪狀的 VBA 程式碼中解脫。這本書可能是我讀過的關於 Excel 的書之中最有用的一本,並且是每一位高階 Excel 使用者的必讀書目。強烈推薦!

Excel 一直是金融界的基礎性工具,但是有大量的 Excel 應用程式用處不大。這本書很好地教會了讀者如何在 xlwings 的幫助下構建更優秀、更健壯的 Excel 應用程式。

每當工作表工具碰到瓶頸,Excel 使用者就會開始質疑這些工具。當 Excel 工作簿儲存了太多的資料和公式時,它們就會變得越來越慢甚至崩潰,這樣的事屢見不鮮。不過在事態變得嚴重之前,或許應該先思考一下你的工作方式。比如你處理的是十分重要的工作簿——一旦發生錯誤便會造成經濟損失或名譽損失;又或者你每天都要花上幾小時來手動更新Excel 工作簿。如果碰到上述情形,那麼你就應該學習一下如何用一門程式語言來自動化這些操作。自動化能夠避免人為錯誤的發生,並且能夠讓你把更多的時間花在更具生產力的任務上——而不是花大量時間把資料複製並貼上Excel 工作表中。

既然你已經知道為何 Python 可以成為 Excel 的“好夥伴”,那麼是時候配置好環境,開始

寫你的第一行 Python 程式碼了!

一日一技:Python + Excel——飛速處理資料分析與處理

看到最後有驚喜哦,文末可領取此書本資料~

開發環境

2。1。1 安裝

前往 Anaconda 主頁下載最新版的 Anaconda 安裝器(個人版,Individual Edition)。要確保下載的是 Python 3。x 版本的 64 點陣圖形化安裝器。下載完成之後,雙擊安裝器開始安裝,確保所有選項保持預設值。更詳細的安裝過程請參照 Anaconda 官方文件。

安裝好 Anaconda 之後,就可以啟動 Anaconda Prompt 開始學習了。下面來看看這是個什麼東西,又是如何工作的。

2。1。2 Anaconda Prompt

Anaconda Prompt 實際上就是 Windows 中的一個命令提示符或者 macOS 中的終端,只不過它配置好了 Python 直譯器和第三方包。Anaconda Prompt 是執行 Python 程式碼的最基本的工具,本書會大量使用它來執行 Python 指令碼和各種包提供的命令列工具。

2。1。3 Python REPL:互動式Python會話

在 Anaconda Prompt 中,可以透過執行 python 命令啟動一個互動式 Python 會話:

(base) C:\Users\felix>python

Python 3。8。5 (default, Sep 3 2020, 21:29:08) [。。。] :: Anaconda, Inc。 on win32

Type “help”, “copyright”, “credits” or “license” for more information。

>>>

macOS 終端中顯示的文字可能有些不一樣,但是道理都是一樣的。本書是按照 Python 3。8版本撰寫的,如果你想用更新的版本,一定要看一下本書主頁上的說明。

2。1。4 包管理器:Conda和pip

我在前面提到過 Python 的包管理器 pip,它負責下載、安裝、更新和解除安裝 Python 包及其依賴項和子依賴項。雖然 Anaconda 也可以配合 pip 工作,但是它還有一個名為 Conda 的內建包管理器。Conda 的一大優勢是不僅可以安裝 Python 包,還可以安裝多種版本的 Python直譯器。一言以蔽之:軟體包可以為 Python 新增標準庫中所沒有的功能。第 5 章將介紹的pandas 就是這樣的包。由於 Anaconda Python 發行版已經預裝好了這些包管理器,因此就不需要我們手動安裝了。

2。1。5 Conda環境

你可能很好奇 Anaconda Prompt 每行開頭的 (base) 到底是什麼。它是當前啟用的 Conda環境的名稱。Conda 環境是一個被隔離的“Python 世界”,有著特定版本的 Python 和一系列安裝好的包。為什麼非要這麼做呢?當你同時開發多個專案的時候,各個專案會有不同的需求:一個專案可能需要 Python 3。8 和 pandas 0。25。0,而另一個專案可能需要 Python3。9 和 pandas 1。0。0。由於為 pandas 0。25。0 編寫的程式碼往往需要進行修改才能用到 pandas1。0。0 上,因此不能只更新 Python 和 pandas 而保持程式碼原封不動。為每個專案都配置一個Conda 環境可以保證它們使用正確的依賴項執行。Conda 環境雖然是 Anaconda 發行版的專有概念,但虛擬環境是所有 Python 發行版的通用概念。相比之下 Conda 環境更加強大,因為它不僅可以管理多個版本的軟體包,還可以輕鬆管理不同版本的 Python 直譯器。

學習 點選拿走

騰訊文件-線上文件

https://docs。qq。com/doc/DT3VGWkhwRml0WlFC

Python入門

3。1 資料型別

和其他程式語言一樣,Python 會區別對待數字、文字、布林值等資料。Python 的做法是為它們賦予不同的資料型別(data type)。最常用的資料型別有整型、浮點型、布林值和字串。本節會透過一些例子對它們進行逐一介紹。要理解什麼是資料型別,需要先解釋一下什麼是物件。

3。2 索引和切片

索引和切片讓你可以訪問一個序列的指定元素。字串是字元的序列,我們可以透過字串來學習這種機制。下一節還會介紹其他支援索引和切片的序列,比如列表和元組。

3。3 資料結構

Python 提供了強大的資料結構以便於處理物件集合。本節會介紹列表、字典、元組和集合。雖然每種資料結構有各自的特點,但它們有一個共同特點,即都能儲存多個物件。在VBA 中,你可能用過集合或者陣列來儲存多個值。VBA 也提供了一種名為字典的資料結構,這和 Python 中的字典是一樣的,不過還是隻能用在 Windows 中。現在先來學習最常用的資料結構——列表。

3。4 控制流

本節會介紹 if 語句、 for 迴圈和 while 迴圈。 if 只會在滿足特定條件時執行特定的程式碼,for 迴圈和 while 迴圈會反覆執行程式碼塊中的程式碼。在本節末尾,我還會介紹列表推導式,它可以代替 for 迴圈完成列表的構造。本節首先會介紹程式碼塊的定義,同時還會介紹Python 最值得注意的特點:有特殊含義的空白。

3。5 組織程式碼

在本節中我們會了解到如何讓程式碼形成可維護的結構:首先會介紹函式的核心知識,然後會教你如何將程式碼分成不同的 Python 模組。在本節末尾,我們會運用所學知識研究標準庫中的 datetime 模組。

3。6 PEP 8:Python風格指南

你可能很好奇為什麼我有時候在變數名中加下劃線,有時候又會把變數名全部大寫。在本節中,我會一邊介紹 Python 官方的風格指南,一邊解釋我在格式化方面的選擇。Python使用所謂的Python 改進提案(Python Enhancement Proposals,PEP)來討論新語言特性的引入。Python 程式碼的風格指南就是其中之一。這些提案一般用數字來表示,程式碼風格指南就被稱作 PEP 8。PEP 8 是一系列提供給 Python 社群的風格建議。如果使用相同程式碼的所有人都遵循相同的程式碼風格,那麼寫出的程式碼可讀性就會更高。在開源的世界中,會有很多互不相識的程式設計師開發同一個專案,此時遵循相同的程式碼風格會顯得尤為重要。

例 3-2中這個簡短的 Python 檔案展示了最重要的程式設計慣例。

例 3-2 pep8_sample。py

“”“這個指令碼展示了一些PEP 8的規則

”“”

import datetime as dt

TEMPERATURE_SCALES = (“fahrenheit”, “kelvin”,

“celsius”)

class TemperatureConverter:

pass # 暫時不做任何事

def convert_to_celsius(degrees, source=“fahrenheit”):

“”“這個函式將華氏度或開氏度轉化為攝氏度

”“”

if source。lower() == “fahrenheit”:

return (degrees-32) * (5/9)

elif source。lower() == “kelvin”:

return degrees - 273。15

else:

return f“Don‘t know how to convert from {source}”

celsius = convert_to_celsius(44, source=“fahrenheit”)

non_celsius_scales = TEMPERATURE_SCALES[:-1]

print(“Current time: ” + dt。datetime。now()。isoformat())

print(f“The temperature in Celsius is: {celsius}”)

在檔案頂部用文件字串(docstring)解釋這個指令碼或者模組做了些什麼。文件字串是一種特殊的字串,它用 3 個引號引用。除了作為程式碼的文件,它還可以用來編寫跨越多行的字串。如果你的字串中有很多雙引號或單引號,那麼也可以用文件字串來避免轉義。我們會在第 11 章中看到,編寫跨越多行的 SQL 查詢時,文件字串也很好用。

所有的匯入語句都應該放在檔案頂部,一行一個匯入。從標準庫匯入的內容放在前面,然後是第三方包,最後是自己編寫的模組。不過這個例子中只用到了標準庫。

用大寫字母和下劃線表示常量。每行的長度不超過 79 個字元。儘可能地利用圓括號、方括號或花括號隱式跨行。

類、函式和其他程式碼之間用兩個空行隔開。

儘管很多類像 datetime 一樣使用小寫字母命名,但是你自己編寫的類也應該使用首字母大寫的名稱( CapitalizedWords )。有關類的更多內容請參見附錄 C。

行內註釋應該和程式碼間隔至少兩個空格。程式碼塊應該用 4 個空格縮排。

在能夠提高可讀性的情況下,函式和引數應該使用小寫字母和下劃線命名。不要在引數名和預設值之間使用空格。

函式的文件字串應當列出函式引數並解釋其意義。為了讓例子更簡短我並沒有這麼做,但我們會在第 8 章配套程式碼庫中看到,excel。py 具有完整的文件字串。

冒號前後不要使用空格。

可以在算術運算子前後使用空格。如果同時使用了優先順序不同的運算子,則應當考慮在優先順序最低的運算子前後新增空格。在本例中,由於乘號的優先順序最低,因此它的前後被添加了空格。

變數名稱使用小寫字母。在可以提升可讀性的前提下使用下劃線。為變數賦值時,在等號前後新增空格。不過在呼叫函式時,不要在關鍵字引數前後使用空格。在進行索引和切片時,不要在方括號前後使用空格。這只是對 PEP 8 的一個簡單介紹,在你開始認真使用 Python 之後,應該看一下 PEP 8 的原文。PEP 8 明確指出,這些規則只是建議,應當優先考慮你自己的程式設計風格。畢竟統一性才是最重要的。如果你對其他公開的程式設計風格指南感興趣,也可以看一下谷歌的 Python 風

格指南,它和 PEP 8 比較接近。實際上大部分 Python 程式設計師並未嚴格遵循 PEP 8,最常見的錯誤是每行超過了 79 個字元。在編寫程式碼時,要保持格式規整可能很難,不過你可以利用工具讓它自動檢查程式碼是否遵循了某種程式設計風格。下一節會教你如何使用 VS Code 進行自動格式化。

pandas入門

4。1 NumPy陣列

正如第 3 章所描述的那樣,如果要對巢狀列表進行陣列運算,可以使用迴圈來完成。例如,要為巢狀列表中的每一個元素都加上 1,可以使用下面的巢狀列表推導式:

In [1]: matrix = [[1, 2, 3],

[4, 5, 6],

[7, 8, 9]]

In [2]: [[i + 1 for i in row] for row in matrix]

Out[2]: [[2, 3, 4], [5, 6, 7], [8, 9, 10]]

但是這樣的程式碼可讀性很低。更關鍵的是,在面對更大的陣列時,遍歷整個陣列會非常慢。如果你的用例和陣列大小合適的話,那麼使用 NumPy 陣列進行運算會比 Python 列表快上幾百倍。為了達到如此高的效能,NumPy 利用了用 C 和 Fortran(它們都是編譯型語言,比 Python 要快得多)編寫的程式碼。NumPy 陣列是儲存同構資料(homogenous data)的 N 維陣列。“同構”意味著陣列中的所有資料都必須是相同型別。最常見的情況就是處理

索引

一維陣列

軸0

軸0

軸1

二維陣列

圖 4-1:一維和二維的 NumPy 陣列

下面來建立一個一維陣列和一個二維陣列,本章會一直使用這兩個陣列。

In [3]: # 首先匯入NumPy

import numpy as np

In [4]: # 使用列表構造一個一維陣列

array1 = np。array([10, 100, 1000。])

In [5]: # 使用巢狀列表構造一個二維陣列

array2 = np。array([[1。, 2。, 3。],

[4。, 5。, 6。]])

陣列維度

要注意一維陣列和二維陣列之間的區別。一維陣列只有一個軸,因此不區分行陣列和列陣列。這和 VBA 中的陣列是類似的,但是如果你是從 MATLAB等語言(MATLAB 中的一維陣列會區分行陣列和列陣列)轉過來的,那麼可能需要花點兒時間習慣 NumPy 的做法。

即使 array1 除了最後一個元素(浮點數)之外全是整數,但由於 NumPy 對同構的要求,這個陣列的資料型別依然是 float64 ,這個型別足以容納所有的元素。要想了解一個數組的資料型別,可以訪問它的 dtype 屬性:

In [6]: array1。dtype

Out[6]: dtype(’float64‘)

dtype 返回的是 float64 而不是第 3 章中介紹過的 float 。你可能已經猜到了,NumPy 使用的是它自己的數值資料型別,它們比 Python 的資料型別粒度要細。通常這都不是問題,因為大部分時候 Python 和 NumPy 中的不同資料型別可以自動轉換。如果你需要顯式地將NumPy 資料型別轉換成 Python 的基本資料型別,只需使用對應的構造器即可(稍後我會更詳細地介紹如何存取陣列的元素):

In [7]: float(array1[0])

Out[7]: 10。0

在 NumPy 的文件中可以看到 NumPy 資料型別的完整列表。我們馬上就會看到,有了NumPy 陣列,就可以以簡潔的方式執行陣列運算了。

5。2 資料操作

真實世界的資料並非天上掉下來的,在使用資料之前,需要對其進行清理,使其更易於理解。在本節開頭,先來看看如何從 DataFrame 中選取資料,如何修改資料,以及如何處理缺失和重複的資料。然後再對 DataFrame 進行一些運算,看看如何處理文字資料。在本節末尾,你會明白 pandas 什麼時候會返回檢視,什麼時候又會返回資料的副本。本節中的很多概念和我們在第 4 章的 NumPy 陣列中看到的是相關聯的。

5。3 組合DataFrame

在 Excel 中組合不同的資料集是一件麻煩事,通常需要用到很多 VLOOKUP 公式。幸運的是,DataFrame 的組合是 pandas 的“撒手鐧”,資料對齊機制也會讓實現相關功能獲得極大的便利,進而能夠減少錯誤發生的可能性。組合和合並 DataFrame 的方法有很多,本節會涉及最常用的 concat 、 join 和 merge 。雖然這些函式的功能有重疊的部分,但是每一個函式都可以讓一類特定的工作更加輕鬆。我會先介紹 concat 函式,然後解釋 join 函式的不同選項,最後介紹通用性最高的 merge 函式。

5。4 描述性統計量和資料聚合

讓大型資料集更有條理的方法之一是計算整個資料集或者子集上的描述性統計量,比如總和或平均值。本節首先會介紹如何在 pandas 中計算這些統計量,然後會介紹將資料聚合到子集中的兩種方式: groupby 方法和 pivot_table 函式。

5。5 繪圖

繪圖可以將資料分析的結果視覺化,這可能是整個資料分析過程中最重要的一步。我們需要用到兩個庫來進行繪圖,首先來看 pandas 預設的繪相簿 Matplotlib,之後再著眼於另一個現代化的繪相簿,即 Plotly,我們可以用它在 Jupyter 筆記本中獲得更好的互動式體驗。

5。6 匯入和匯出DataFrame

到目前為止,我們用各種方式構造了 DataFrame:巢狀列表,字典和 NumPy 陣列。知道這些技巧很有必要,但是很多時候我們的資料已經準備好了,你只需要將它錄入 DataFrame。要做到這一點,pandas 為你提供了各種讀取函式。但即便要訪問一個專用的系統且 pandas沒有提供內建的讀取器,你通常也有一個 Python 包來連線這個系統,一旦獲得了資料,要把資料錄入 DataFrame 也就很容易了。在 Excel 中,資料匯入通常是 Power Query 的工作。在分析和修改資料集之後,你可能想把結果推送回資料庫或者匯出到一個 CSV 檔案中,又或者如本書書名所述,把它放到 Excel 工作簿中給你的上級看。要匯出 pandas DataFrame,可以使用 DataFrame 提供的匯出方法。表 5-7 展示了最常用的匯入和匯出方法。

————————————————

版權宣告:本文為CSDN博主「程式碼輸入中。。。」的原創文章,遵循CC 4。0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。

原文連結:https://blog。csdn。net/m0_59485658/article/details/125934615

推薦文章