作者 | 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小技巧,希望能对您下一个项目有所帮助。
数据分析咨询请扫描二维码
在当今以数据为导向的商业环境中,数据分析师的角色变得越来越重要。无论是揭示消费者行为的趋势,还是优化企业运营的效率,数据 ...
2024-11-17金融数学是一门充满挑战和机遇的专业,它将数学、统计学和金融学的知识有机结合,旨在培养能够运用数学和统计方法解决复杂金融市 ...
2024-11-16在信息时代的浪潮中,大数据已成为推动创新的重要力量。无论是在商业、医疗、金融,还是在日常生活中,大数据扮演的角色都愈发举 ...
2024-11-16随着大数据技术的迅猛发展,数据已经成为现代商业、科技乃至生活各个方面的重要资产。大数据专业的毕业生在这一变革背景下,拥有 ...
2024-11-15随着大数据技术的迅猛发展,数据已经成为现代商业、科技乃至生活各个方面的重要资产。大数据专业的毕业生在这一变革背景下,拥有 ...
2024-11-15在快速演变的数字时代,数据分析已成为多个行业的核心驱动力。无论你是刚刚踏入数据分析领域,还是寻求进一步发展的专业人士,理 ...
2024-11-15Python作为一种通用编程语言,以其简单易学、功能强大等特点,成为众多领域的核心技术驱动者。无论是初学者还是有经验的编程人员 ...
2024-11-15在当今数据驱动的世界中,数据分析已成为许多行业的基础。无论是商业决策,产品开发,还是市场策略优化,数据分析都扮演着至关重 ...
2024-11-15数据分析作为现代商业和研究领域不可或缺的一部分,吸引了越来越多的初学者。然而,自学数据分析的过程中,初学者常常会遇到许多 ...
2024-11-15在当今的数据驱动世界中,机器学习方法在数据挖掘与分析中扮演着核心角色。这些方法通过从数据中学习模式和规律来构建模型,实现 ...
2024-11-15随着数据在各个行业的重要性日益增加,数据分析师在商业和技术领域的角色变得至关重要。其核心职责之一便是通过数据可视化,将复 ...
2024-11-15数据分析师的职责不仅仅局限于解析数据和得出结论,更在于将这些复杂的信息转换为清晰、易懂且具有影响力的沟通。良好的沟通能力 ...
2024-11-15数字化转型是企业提升竞争力和实现可持续发展的关键路径。面对快速变化的市场环境,以及技术的飞速发展,企业在数字化转型过程中 ...
2024-11-15CDA数据分析师认证:CDA认证分为三个等级:Level Ⅰ、Level Ⅱ和Level Ⅲ,每个等级的报考条件如下: Le ...
2024-11-14自学数据分析可能是一条充满挑战却又令人兴奋的道路。随着数据在现代社会中的重要性日益增长,掌握数据分析技能不仅能提升你的就 ...
2024-11-14数据分析相关职业选择 数据分析领域正在蓬勃发展,为各种专业背景的人才提供了丰富的职业机会。从初学者到有经验的专家,每个人 ...
2024-11-14数据挖掘与分析在金融行业的使用 在当今快速发展的金融行业中,数据挖掘与分析的应用愈发重要,成为驱动行业变革和提升竞争力的 ...
2024-11-14学习数据挖掘需要掌握哪些技能 数据挖掘是一个不断发展的领域,它结合了统计学、计算机科学和领域专业知识,旨在从数据中提取有 ...
2024-11-14统计学作为一门基于数据的学科,其广泛的应用领域和多样的职业选择,使得毕业生拥有丰厚的就业前景。无论是在政府还是企业,统计 ...
2024-11-14在当今高速发展的技术环境下,企业正在面临前所未有的机遇和挑战。数字化转型已成为企业保持竞争力和应对市场变化的必由之路。要 ...
2024-11-13