作者 | 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模块促进了这一点。该模块使您可以实现队列数据结构。这些数据结构使您可以根据特定规则添加和检索条目。“先进先出”(或FIFO)队列使您可以按添加顺序检索对象。“后进先出”(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
又到一年年终时,各位打工人也迎来了展示成果的关键时刻 —— 年终述职。一份出色的年终述职报告,不仅能全面呈现你的工作价值, ...
2025-01-23“用户旅程分析”概念 用户旅程图又叫做用户体验地图,它是用于描述用户在与产品或服务互动的过程中所经历的各个阶段、触点和情 ...
2025-01-22在竞争激烈的商业世界中,竞品分析对于企业的发展至关重要。今天,我们就来详细聊聊数据分析师写竞品分析的那些事儿。 一、明确 ...
2025-01-22在数据分析领域,Excel作为一种普及率极高且功能强大的工具,无疑为无数专业人士提供了便捷的解决方案。尽管Excel自带了丰富的功 ...
2025-01-17在这个瞬息万变的时代,许多人都在寻找能让他们脱颖而出的职业。而数据分析师,作为大数据和人工智能时代的热门职业,自然吸引了 ...
2025-01-14Python作为一门功能强大的编程语言,已经成为数据分析和可视化领域的重要工具。无论你是数据分析的新手,还是经验丰富的专业人士 ...
2025-01-10完全靠数据决策,真的靠谱吗? 最近几年,“数据驱动”成了商界最火的关键词之一,但靠数据就能走天下?其实不然!那些真正成功 ...
2025-01-09SparkSQL 结构化数据处理流程及原理是什么?Spark SQL 可以使用现有的Hive元存储、SerDes 和 UDF。它可以使用 JDBC/ODB ...
2025-01-09在如今这个信息爆炸的时代,数据已然成为企业的生命线。无论是科技公司还是传统行业,数据分析正在深刻地影响着商业决策以及未来 ...
2025-01-08“数据为王”相信大家都听说过。当前,数据信息不再仅仅是传递的媒介,它成为了驱动经济发展的新燃料。对于企业而言,数据指标体 ...
2025-01-07在职场中,当你遇到问题的时候,如果感到无从下手,或者抓不到重点,可能是因为你掌握的思维模型不够多。 一个好用的思维模型, ...
2025-01-06在现代企业中,数据分析师扮演着至关重要的角色。每天都有大量数据涌入,从社交媒体到交易平台,数据以空前的速度和规模生成。面 ...
2025-01-06在职场中,许多言辞并非表面意思那么简单,有时需要听懂背后的“潜台词”。尤其在数据分析的领域里,掌握常用术语就像掌握一门新 ...
2025-01-04在当今信息化社会,数据分析已成为各行各业的核心驱动力。它不仅仅是对数字进行整理与计算,而是在数据的海洋中探寻规律,从而指 ...
2025-01-03又到一年年终时,各位打工人也迎来了展示成果的关键时刻 —— 年终述职。一份出色的年终述职报告,不仅能全面呈现你的工作价值, ...
2025-01-03在竞争激烈的商业世界中,竞品分析对于企业的发展至关重要。今天,我们就来详细聊聊数据分析师写竞品分析的那些事儿。 一、明确 ...
2025-01-03在数据分析的江湖里,有两个阵营总是争论不休。一派信奉“大即是美”,认为数据越多越好;另一派坚守“小而精”,力挺质量胜于规 ...
2025-01-02数据分析是一个复杂且多维度的过程,从数据收集到分析结果应用,每一步都是对信息的提炼与升华。可视化分析结果,以图表的形式展 ...
2025-01-02在当今的数字化时代,数据分析师扮演着一个至关重要的角色。他们如同现代企业的“解密专家”,通过解析数据为企业提供决策支持。 ...
2025-01-02数据分析报告至关重要 一份高质量的数据分析报告不仅能够揭示数据背后的真相,还能为企业决策者提供有价值的洞察和建议。 年薪 ...
2024-12-31