
作者 | CDA數據分析師
Python是世界上最受歡迎的編程語言之一。 這有很多原因:
在CDA數據科學研究院,我幾乎每天都在使用Python來實現數據科學相關工作。 在此過程中,我獲得了一些有用的技巧和提示。在這里,我將以A-Z共26條小技巧來分享了其中的一些內容,在拼湊A-Z字母開頭的過程中,就出現了一些可能大家沒接觸過的知識,總有對你有幫助的。
這些“小技巧”大部分是我在日常工作中曾經使用或偶然發現的東西。其中有一些是在Python標準庫.docs中發現的。還有,分享幾個非常有用的的論壇和網站,首先是awesome-python . com,對,沒錯,創辦者就是那么喜歡python,用awesome-python來命名, 這里有這數百種有趣的Python工具和模塊的精選列表,都是非常實用的。
Python之所以成為如此流行的語言,其眾多的原因之一是因為它具有絕佳的可讀性和表現力。
人們經常開玩笑說Python是可執行的偽代碼。不會用python的人都可以讀出他的意思,但是,當您可以編寫這樣的代碼時,您絕對會樂在其中:
x = [True, True, False] if any(x): # 如果列表x中任意元素為真 print("At least one True") if all(x): # 如果列表x中所有元素為真 print("Not one False") if any(x) and not all(x): # 列表x中任意元素為真且并非全部元素為真 print("At least one True and one False")
看到這個包的名字??赡苣隳懿碌搅?,您想在控制臺中繪制圖形嗎?
$ pip install bashplotlib
使用bashplotlib包,您可以在控制臺中使用圖形,當然,其精美度肯定沒有圖形工具中那么好,但是也是挺好玩的,例如:
$ hist --file data/exp.txt
Python具有一些非常好的默認數據類型,但是有時它們無法完全按照所希望的方式來運行。幸運的是,Python標準庫提供了collections模塊。 這個方便的加載項為您提供了更多的數據類型。
from collections import OrderedDict, Counter # 記住按鍵的添加順序! x = OrderedDict(a=1, b=2, c=3) x # 計算每個字符的頻率 y = Counter("Hello World!") y
結果演示:
OrderedDict([('a', 1), ('c', 3), ('b', 2)]) Counter({' ': 1, '!': 1, 'H': 1, 'W': 1, 'd': 1, 'e': 1, 'l': 3, 'o': 2, 'r': 1})
有沒有想過如何在Python對象內部查找并查看其具有的屬性? 當然有,在命令行中:
dir() dir("Hello World") dir(dir)
在交互式運行Python以及動態瀏覽正在使用的對象和模塊時,對于某些python使用者來說,這應該是一個非常有用的功能。
是的,沒錯,表情包的那個emoji。
$ pip install emoji
不要假裝你不會嘗試,給你的python加多點樂趣把!
from emoji import emojize print(emojize(":thumbs_up:"))
Python受歡迎的一個后果是,總是有新版本正在開發中, 新版本意味著新功能。目前python3.8正式版已發布,python3.9發布周期已經開始,到2020年,python2將徹底退出市場。
但是不要害怕。 future模塊允許您從將來的Python版本導入功能。 從字面上看,就像時間旅行,魔術一樣。
from __future__ import print_function print("Hello World!")
對于程序員來說,地理環境可能是一個充滿挑戰的領域。 但是geopy模塊使它變得異常簡單。
$ pip install geopy
它通過一系列不同地理編碼服務的API來工作。它使您可以獲取地點的完整街道地址,緯度,經度甚至海拔高度。還有一個有用的距離包。 可以以您喜歡的度量單位計算兩個位置之間的距離。
## 1、由名字來查位置和經緯度 from geopy.geocoders import Baidu, Bing, GoogleV3, DataBC, Nominatim #geolocator = Nominatim(user_agent="specify_your_app_name_here") geolocator = Baidu('EiQTTRKzlV3dKN1zcZ3c7iVhIl126xvC') #geolocator = Bing('Ajg52RB8D2BIXygYwUTcJytDGsgqURLj5lfBptOH4jmTGHHFUvt0cMqdhdhdYfr-') #geolocator = GoogleV3('AIzaSyAVwjaaOBKbssuyQsvyqQAQDwfuzO1PKCA') location = geolocator.geocode("廣州市CDA數據分析師") print(location.address) print((location.latitude, location.longitude))
輸出結果:
城市 (23.135336306695006, 113.27143134445974)
## 2、用坐標來查地點 from geopy.geocoders import Nominatim geolocator = Nominatim(user_agent="specify_your_app_name_here") location = geolocator.reverse("52.509669, 13.376294") print(location.address) print((location.latitude, location.longitude)) print(location.raw)
輸出結果:
Backwerk, Potsdamer Platz, Tiergarten, Mitte, Berlin, 10785, Deutschland (52.50958575, 13.3762845319028) {'display_name': 'Backwerk, Potsdamer Platz, Tiergarten, Mitte, Berlin, 10785, Deutschland', 'osm_id': 464904422, 'osm_type': 'way', 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright', 'lat': '52.50958575', 'boundingbox': ['52.5095298', '52.5096533', '13.3762456', '13.3763382'], 'place_id': 176241040, 'address': {'state': 'Berlin', 'postcode': '10785', 'country': 'Deutschland', 'country_code': 'de','bakery': 'Backwerk', 'city_district': 'Mitte', 'footway': 'Potsdamer Platz', 'suburb': 'Tiergarten'}, 'lon': '13.3762845319028'}
## 3、計算距離 >>> from geopy import distance >>> newport_ri = (41.49008, -71.312796) >>> cleveland_oh = (41.499498, -81.695391) >>> print(distance.distance(newport_ri, cleveland_oh).miles) 538.39044536 >>> wellington = (-41.32, 174.81) >>> salamanca = (40.96, -5.50) >>> print(distance.distance(wellington, salamanca, ellipsoid='GRS-80').km) 19959.6792674
出現了編碼問題,但不記得以前看到的解決方案了; 需要檢查StackOverflow,但又不想離開終端;howdoi模塊應該可以幫助到你。
$ pip install howdoi
詢問任何問題,它都會盡力返回答案。
$ howdoi vertical align css $ howdoi for loop in java $ howdoi undo commits in git
有一點需要注意的是,它會從StackOverflow的主要答案中抓取代碼。 可能有時候提供的信息并不是最合適的。
$ howdoi exit vim
Python的inspect模塊非常適合了解函數的一些基本信息。 您甚至可以自行調用其方法!
下面的代碼示例使用inspect.getsource( )來打印自己的源代碼。 它還使用inspect.getmodule( )來打印定義它的模塊。最后一行打印出自己的行號。
import inspect print(inspect.getsource(inspect.getsource)) # 查看非內置函數的函數定義代碼 print(inspect.getmodule(inspect.getmodule)) # 查看函數所屬模塊和安裝路徑 print(inspect.currentframe().f_lineno) # 打印這一行所在的行號,如本段代碼中此函數在第5行,則返回5
當然,除了這些瑣碎的用途外,檢查模塊對于證明您的代碼在做什么很有用。 您也可以使用它來編寫自文檔代碼。
Jedi庫是一個自動完成和代碼分析庫。 它使編寫代碼更快,更高效。除非您自己開發IDE,否則您可能會對使用Jedi作為編輯器插件感興趣。 幸運的是,您可能已經在使用Jedi。目前 IPython項目使用Jedi作為其代碼自動完成功能。
該方法不是一個函數或者一個包,而是一種可以使用在函數上的一種小技巧,如示例中自定義的someFunction函數中,有兩個參數,且參數未在函數體內未被定義上固定的值。除了正常的參數使用方式,還能使用字典的形式來傳遞函數的參數,字典對象前面的雙星號可以使python知道該字典的內容作為參數值傳遞給函數。
字典的鍵是參數名稱,值是傳遞給函數的值。字典的名字不限,不一定要用kwargs,當您要編寫可以處理事先未定義的命名參數的函數時,此功能很有用。
dictionary = {"a": 1, "b": 2} def someFunction(a, b): print(a + b) return # 下面執行的效果是一樣的 someFunction(**dictionary) # 這兩個星號*是必須加上的,以字典的形式傳遞參數 someFunction(a=1, b=2)
List comprehensions(列表解析式),關于Python編程,我最喜歡的事情之一是它的列表解析式。這些表達式使編寫干凈整潔的代碼變得容易,該代碼的讀取方式非常類似于自然語言。
numbers = [1,2,3,4,5,6,7] evens = [x for x in numbers if x % 2 is 0] odds = [y for y in numbers if y not in evens] print(evens) print(odds) Certifies = ['CDA數據分析師', 'CFA特許金融分析師', 'CPA注冊會計師'] def research(Certify): print("祝賀你通過"+Certify) for Certify in Certifies: research(Certify)
輸出結果:
[2, 4, 6] [1, 3, 5, 7] 祝賀你通過CDA數據分析師 祝賀你通過CFA特許金融分析師 祝賀你通過CPA注冊會計師
Python通過許多內置功能支持函數式編程。 最有用的功能之一是map()函數-尤其是與lambda函數結合使用。在下面的示例中,map()將簡單的lambda函數應用于x中的每個元素。 它返回一個映射對象,可以將其轉換為一些可迭代的對象,例如列表或元組。
tlist = [1,2,3,4,5] y = map(lambda x : x ** 2 , tlist) ylist = list(y) print(ylist) # print out:[1, 4, 9, 16, 25] # map(lambda x : x ** 2 , tlist) 等價于 def Square(x): return x**2 result = [] for i in range(len(tlist)): result.append(Square(tlist[i])) # print out:[1, 4, 9, 16, 25]
可以看到,使用了map()函數+lambda函數的方式,一行簡潔的代碼就是實現幾行的代碼的功能。
如果您還沒有看過,請準備讓Python的newspaper模塊震驚。它使您可以從一系列領先的國際出版物中檢索新聞文章和相關的元數據。 您可以檢索圖像,文本和作者名稱。它甚至還具有一些內置的NLP功能。
因此,如果您打算為下一個項目使用BeautifulSoup或其他DIY網站抓取庫,不妨試一下更省力的方式,相信我,你會愛上它的
$ pip install news3k
以下以新浪為例,簡單做個例子:
import newspaper sina_paper = newspaper.build('http://www.sina.com.cn/', language='zh') print(len(sina_paper.category_urls())) # 搜索到的網站數量 for category in sina_paper.category_urls(): # 逐一打印搜索到的網站 print(category) out: 153 http://anli.jiaju.sina.com.cn http://photo.auto.sina.com.cn http://www.sina.com.cn/ ...... article = sina_paper.articles[125] # 選取其中一篇 article.download() article.parse() print(article.title) out:多項新政聚焦穩投資 資金加速涌入基建 print(article.text) out: 原標題:多項新政聚焦穩投資 資金加速涌入基建 來源:經濟參考報 專項債、資本金政策雙管齊下 補短板全面提速 時至年底,穩投資補短板開始全面提速,尤其是在破解資金來源困局方面,近期多項重磅新政落地:2020年新增專項債額度已提前下達1萬億元,固定資產投資項目資本金管理新規也已正式下發。專家分析,專項債疊加項目資本金,雙管齊下助力基礎設施項目融資,無疑對穩投資具有重要的促進作用。受益于專項債和項目資本金等新政策措施的支持,今年年底基建投資有望企穩回升。具體而言,有一定經營性收入或收費機制的交通、環保和市政等基礎設施投資或將迎來較快增長。 ......
Python提供了對運算符重載的支持,一個聽起來像專業的計算機科學家的術語。這實際上是一個簡單的概念。 有沒有想過Python為什么讓您使用+運算符來添加數字并連接字符串? 這就是操作員超負荷運行的原因。您可以定義使用Python的標準運算符以其特定方式使用的對象。 這樣一來,您就可以在與所使用的對象相關的上下文中使用它們。
class Thing: def __init__(self, value): self.__value = value def __gt__(self, other): return self.__value > other.__value def __lt__(self, other): return self.__value < other.__value something = Thing(100) nothing = Thing(0) something > nothing # True something < nothing # False something + nothing # TypeError: unsupported operand type(s) for +: 'Thing' and 'Thing'
Python的默認print功能可以完成其規定的所有打印的工作。 但是,打印出任何較大的多層的嵌套對象,print打印的結果會直接無格式的直接堆出來,可讀性較差。
而pprint模塊不一樣,它能夠打印出標準格式的結果,即使打印多層嵌套的復雜結構時,也會通過縮進打印出來,有很好的可讀性。這是任何使用非數據結構的Python使用人員的必備工具。
import requests import pprint url = 'https://randomuser.me/api/?results=1' users = requests.get(url).json() print(users) # print正常打印 pprint.pprint(users) # pprint標準格式打印
print打印結果的部分內容,不太友好,可讀性非常差:
{'results': [{'picture': {'medium': 'https://randomuser.me/api/portraits/med/men/22.jpg', 'large': 'https://randomuser.me/api/portraits/men/22.jpg', 'thumbnail': 'https://randomuser.me/api/portraits/thumb/men/22.jpg'}, 'email': 'andy.frazier@example.com', 'login': {'salt': 'lfIp3jL3', 'sha1': 'a9d428929b17a07ec04110c2383bcfab2d7e37a9', 'username': 'happypanda484', 'sha256': '4f63a0c687b9f6147dd7110838489dfa4cc692927b9952dda5d7c088b70febf9', 'md5': '2b676af5708fbf390cebebba10dfb2ef', 'uuid': '0415c30e-3184-4e29-a96b-68a30b4f4e2f', 'password': 'mike'}......
pprint標準格式打印的部分內容,可讀性強:
{'info': {'page': 1, 'results': 1, 'seed': '9139afcfa8db8189', 'version': '1.3'}, 'results': [{'cell': '081-287-4240', 'dob': {'age': 47, 'date': '1972-11-24T04:22:50.682Z'}, 'email': 'andy.frazier@example.com', 'gender': 'male', 'id': {'name': 'PPS', 'value': '7870181T'}, 'location': {'city': 'Cavan', 'coordinates': {'latitude': '24.4086', 'longitude': '-41.6859'}, 'country': 'Ireland', 'postcode': 92828, 'state': 'Cavan', 'street': {'name': 'Station Road', 'number': 3614}, 'timezone': {'description': 'Hawaii', 'offset': '-10:00'}} ......
Python支持多線程,標準庫的Queue模塊促進了這一點。該模塊使您可以實現隊列數據結構。這些數據結構使您可以根據特定規則添加和檢索條目?!跋冗M先出”(或FIFO)隊列使您可以按添加順序檢索對象?!昂筮M先出”(LIFO)隊列使您可以首先訪問最近添加的對象。最后,優先級隊列使您可以根據對象的排序順序檢索對象。這里是如何使用隊列的示例用于Python中的多線程編程。
在Python中定義類或對象時,提供一種很有用的方式可以將該對象表示為字符串。 例如:
>>> file = open('file.txt', 'r') >>> print(file)
這使調試代碼容易得多。將其添加到您的類定義中,如下所示:
class someClass: def __repr__(self): return "" someInstance = someClass() print(someInstance) # prints
Python是一種很棒的腳本語言。有時使用標準os和子流程庫可能會讓人有些頭疼。sh模塊提供了一種簡潔的選擇。它使您可以像調用普通程序一樣調用任何程序,這對從Python內部進行自動化工作流和任務很有用。
import sh sh.pwd() sh.mkdir('new_folder') sh.touch('new_file.txt') sh.whoami() sh.echo('This is great!')
Python是一種動態類型的語言。 定義變量,函數,類等時,無需指定數據類型。這樣可以加快開發時間。 但是,簡單的鍵入問題有時導致的運行錯誤。自Python 3.5起,可以選擇在定義函數時提供類型提示。
def addTwo(x : Int) -> Int: return x + 2
您還可以定義類型別名:
from typing import List Vector = List[float] Matrix = List[Vector] def addMatrix(a : Matrix, b : Matrix) -> Matrix: result = [] for i,row in enumerate(a): result_row =[] for j, col in enumerate(row): result_row += [a[i][j] + b[i][j]] result += [result_row] return result x = [[1.0, 0.0], [0.0, 1.0]] y = [[2.0, 1.0], [0.0, -2.0]] z = addMatrix(x, y)
盡管不是強制性的,但類型注釋可以使您的代碼更易于理解。它們還允許您使用類型檢查工具在運行時捕獲那些雜散的TypeError。 如果您正在從事大型,復雜的項目,則值得擁有!
通過Python標準庫的uuid模塊,可以快速簡便地生成通用唯一ID(或“ UUID”)。
import uuid user_id = uuid.uuid4() print(user_id)
這將會創建一個隨機的128位數字,幾乎可以肯定是唯一的。實際上,可以生成超過2的122次方的UUID。 超過5*10的42次方。在給定集合中找到重復項的可能性非常低。即使擁有一萬億個UUID,重復存在的可能性也遠遠小于十億分之一。
您有可能同時從事多個Python項目,可能出現有時兩個項目依賴于不同的python版本。您在系統上安裝哪個?幸運的是,Python的對虛擬環境的支持使您擁有兩全其美的體驗。 在命令行中輸入:
python -m venv my-project source my-project/bin/activate pip install all-the-modules
現在,您可以在同一臺計算機上運行Python的獨立版本和安裝!
維基百科具有出色的API,允許用戶以編程方式訪問完全免費的知識和信息。wikipedia模塊使訪問此API變得非常方便。
import wikipedia result = wikipedia.page('freeCodeCamp') print(result.summary) for link in result.links: print(link)
與實際站點一樣,該模塊提供了對多種語言、頁面歧義消除、隨機頁面檢索的支持,甚至還具有donate()方法。
xkcd是蘭道爾·門羅(Randall Munroe)的網名,又是他所創作的漫畫的名稱。作者Randall Munroe給作品的定義是一部"關于浪漫、諷刺、數學和語言的網絡漫畫",被網友譽為深度宅向網絡漫畫。
Python語言也是幽默的,Python的許多官方文檔都引用了英國喜劇速寫節目“Monty Python's Flying Circus”中最著名的草圖。不過,python的幽默感不僅僅限于文檔。你可以試試調用一下下面這個庫:
import antigravity
YAML代表 YAML不是標記語言。 它是一種數據格式語言,并且是JSON的超集。與JSON不同,它可以存儲更復雜的對象并引用自己的元素。您還可以編寫注釋,使其特別適合編寫配置文件。PyYAML模塊允許您將YAML與Python結合使用。 安裝方式:
$ pip install pyyaml
然后導入到您的項目中:
import yaml
PyYAML允許您存儲任何數據類型的Python對象以及任何用戶定義類的實例。
最后一招,也是非常有用的。你是否曾經需要從兩個列表中組成字典?
keys = ['a', 'b', 'c'] vals = [1, 2, 3] zipped = dict(zip(keys, vals)) zipped out: {'a': 1, 'b': 2, 'c': 3}
內置的zip()函數接受許多可迭代的對象,并返回一個元組列表。 每個元組通過其位置索引將輸入對象的元素分組。您也可以通過在對象上調用*zip()來“解壓縮”對象。
以上的內容部分參考Peter Gleeson的分享,非常感謝,以上的A-Z共26個Python小技巧,希望能對您下一個項目有所幫助。
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
CDA數據分析師證書考試體系(更新于2025年05月22日)
2025-05-26解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25