今天介绍的Koalas,是Databrick开源的一个项目,它增强了PySpark的DataFrame API以使其与pandas兼容。
在过去的几年中,Python数据科学迅猛发展,而pandas已成为生态系统的关键。当数据科学家接触到数据集时,他们会使用pandas进行探索。它是数据整理和分析的终极工具。实际上,pandas的read_csv通常是学生在数据科学之旅中执行的第一个命令。
但pandas无法很好地适应大数据。它是为单台计算机可以处理的小型数据集而设计的。另一方面,Apache Spark已成为大数据工作负载的事实上的标准。如今,许多数据科学家将pandas用于课程作业,小项目和小数据任务,但是当他们处理非常大的数据集时,他们要么必须迁移到PySpark以利用Spark,要么对数据进行降采样以便可以使用pandas。
现在,借助Koalas,数据科学家可以从单台机器过渡到分布式环境,而无需学习新的框架。如下所示,您可以在Koalas上扩展Spark上的pandas代码,只需将一个包替换为另一个即可。
pandas:
import pandas as pddf = pd.DataFrame({'x': [1, 2], 'y': [3, 4], 'z': [5, 6]})# Rename columnsdf.columns = [‘x’, ‘y’, ‘z1’]# Do some operations in placedf[‘x2’] = df.x * df.x
Koalas:
import databricks.koalas as ksdf = ks.DataFrame({'x': [1, 2], 'y': [3, 4], 'z': [5, 6]})# Rename columnsdf.columns = [‘x’, ‘y’, ‘z1’]# Do some operations in placedf[‘x2’] = df.x * df.x
pandas是Python数据科学的标准词汇
随着Python成为数据科学的主要语言,社区已经根据最重要的库(包括pandas,matplotlib和numpy)开发了词汇表。当数据科学家能够使用这些库时,他们可以充分表达自己的想法,并遵循一个想法得出结论。他们可以概念化某些东西并立即执行它。
但是,当他们不得不使用词汇表之外的库时,就会迷迷糊糊,每隔几分钟检查一次StackOverflow,并且必须中断工作流程才能使代码正常工作。尽管PySpark易于使用并且在很多方面与pandas相似,但它们仍然是他们必须学习的词汇。
在Databricks,我们认为在Spark上启用pandas将大大提高数据科学家和数据驱动组织的生产力,原因有以下几个方面:
- Koalas不再需要为给定的数据集决定使用pandas还是PySpark
- 对于最初是用pandas为一台机器编写的工作,Koalas允许数据科学家通过简单地将pandas换成Koalas来扩展Spark上的代码。
- Koalas为组织中的更多数据科学家解锁大数据,因为他们不再需要学习PySpark来利用Spark
下面,我们展示了两个简单而强大的pandas方法示例,这些方法可直接在带有Koalas的Spark上运行。
具有分类变量的特征工程
数据科学家在构建ML模型时经常会遇到分类变量。一种流行的技术是将分类变量编码为伪变量。在下面的示例中,有几个类别变量,包括呼叫类型,邻域和单位类型。pandas的get_dummies方法是一种方便的方法,可以做到这一点。下面我们展示如何用pandas来做到这一点:
import pandas as pddata = pd.read_csv("fire_department_calls_sf_clean.csv",\ header=0)print(pd.get_dummies(data))
原DataFrame
新DataFrame
谢谢 Koalas, 我们只需做一些调整就可以在Spark上完成此操作:
import databricks.koalas as ksdata = ks.read_csv("fire_department_calls_sf_clean.csv", header=0)display(ks.get_dummies(data))
就这样。
带有时间戳的算术
数据科学家一直都在使用时间戳,但是正确处理它们会变得非常混乱。pandas提供了一个优雅的解决方案。假设您有一个日期DataFrame:
import pandas as pdimport numpy as npdate1 = pd.Series(pd.date_range('2012-1-1 12:00:00', periods=7, freq='M'))date2 = pd.Series(pd.date_range('2013-3-11 21:45:00', periods=7, freq='W'))df = pd.DataFrame(dict(Start_date = date1, End_date = date2))print(df) End_date Start_date0 2013-03-17 21:45:00 2012-01-31 12:00:001 2013-03-24 21:45:00 2012-02-29 12:00:002 2013-03-31 21:45:00 2012-03-31 12:00:003 2013-04-07 21:45:00 2012-04-30 12:00:004 2013-04-14 21:45:00 2012-05-31 12:00:005 2013-04-21 21:45:00 2012-06-30 12:00:006 2013-04-28 21:45:00 2012-07-31 12:00:00
要从pandas的结束日期中减去开始日期,只需运行:
df['diff_seconds'] = df['End_date'] - df['Start_date']df['diff_seconds'] = df['diff_seconds']/np.timedelta64(1,'s')print(df) End_date Start_date diff_seconds0 2013-03-17 21:45:00 2012-01-31 12:00:00 35545500.01 2013-03-24 21:45:00 2012-02-29 12:00:00 33644700.02 2013-03-31 21:45:00 2012-03-31 12:00:00 31571100.03 2013-04-07 21:45:00 2012-04-30 12:00:00 29583900.04 2013-04-14 21:45:00 2012-05-31 12:00:00 27510300.05 2013-04-21 21:45:00 2012-06-30 12:00:00 25523100.06 2013-04-28 21:45:00 2012-07-31 12:00:00 23449500.0
现在要在Spark上执行相同的操作,您需要做的就是将pandas替换为Koalas:
import databricks.koalas as ksdf = ks.from_pandas(pandas_df)df['diff_seconds'] = df['End_date'] - df['Start_date']df['diff_seconds'] = df['diff_seconds'] / np.timedelta64(1,'s')print(df)
再次,如此简单。