Python数据科学

Python数据科学 查看完整档案

北京编辑  |  填写毕业院校互联网金融  |  数据挖掘工程师 编辑 www.datadeepin.com 编辑
编辑

微信公众号:Python数据科学

知乎专栏:Python数据分析

个人网站:http://www.datadeepin.com

个人动态

Python数据科学 发布了文章 · 11月23日

太香了,墙裂推荐3个Python数据分析EDA神器!

作者:东哥起飞

EDA是数据分析必须的过程,用来查看变量统计特征,可以此为基础尝试做特征工程。东哥这次分享3个EDA神器,其实之前每一个都分享过,这次把这三个工具包汇总到一起来介绍。

1. Pandas_Profiling

这个属于三个中最轻便、简单的了。它可以快速生成报告,一览变量概况。首先,我们需要安装该软件包。

# 安装Jupyter扩展widget 
jupyter nbextension enable --py widgetsnbextension
# 或者通过conda安装
conda env create -n pandas-profiling
conda activate pandas-profiling
conda install -c conda-forge pandas-profiling
# 或者直接从源地址安装
pip install https://github.com/pandas-profiling/pandas-profiling/archive/master.zip

安装成功后即可导入数据直接生成报告了。

import pandas as pd
import seaborn as sns
mpg = sns.load_dataset('mpg')
mpg.head()

from pandas_profiling import ProfileReport
profile = ProfileReport(mpg, title='MPG Pandas Profiling Report', explorative = True)
profile

image

使用Pandas Profiling生成了一个快速的报告,具有很好的可视化效果。报告结果直接显示在notebook中,而不是在单独的文件中打开。

image

总共提供了六个部分:概述、变量、交互、相关性,缺失值和样本。

Pandas profiling的变量部分是完整的,它为每个变量都生成了详细的报告。

image

从上图可以看出,仅一个变量就有太多信息,比如可以获得描述性信息和分位数信息。

交互

image

交互部分我们可以获取两个数值变量之间的散点图。

相关性

可以获得两个变量之间的关系信息。

image

缺失值

可以获取每个变量的缺失值计数信息。

image

样本

可以显示了数据集中的样本行,用于了解数据。

image

2. Sweetviz

Sweetviz是另一个Python的开源代码包,仅用一行代码即可生成漂亮的EDA报告。与Pandas Profiling的区别在于它输出的是一个完全独立的HTML应用程序。

使用pip安装该软件包

pip install sweetviz

安装完成后,我们可以使用Sweetviz生成报告,下面尝试一下。

import sweetviz as sv
# 可以选择目标特征
my_report = sv.analyze(mpg, target_feat ='mpg')
my_report.show_html()

image

从上图可以看到,Sweetviz报告生成的内容与之前的Pandas Profiling类似,但具有不同的UI。

image

Sweetviz不仅可以查看单变量的分布、统计特性,它还可以设置目标标量,将变量和目标变量进行关联分析。如上面报告最右侧,它获得了所有现有变量的数值关联和类别关联的相关性信息。

Sweetviz的优势不在于单个数据集上的EDA报告,而在于数据集的比较。

可以通过两种方式比较数据集:将其拆分(例如训练和测试数据集),或者使用一些过滤器对总体进行细分。

比如下面这个例子,有USA和NOT-USA两个数据集。

# 设置需要分析的变量
my_report = sv.compare_intra(mpg,mpg [“ origin”] ==“ usa”,[“ USA”,“ NOT-USA”],target_feat ='mpg')
my_report.show_html()

image

不需要敲太多的代码就可以让我们快速分析这些变量,这在EDA环节会减少很多工作量,而把时间留给变量的分析和筛选上。

Sweetviz的一些优势在于:

  • 分析有关目标值的数据集的能力
  • 两个数据集之间的比较能力

但也有一些缺点:

  • 变量之间没有可视化,例如散点图
  • 报告在另一个标签中打开

个人是比较喜欢Sweetviz的。

3. pandasGUI

PandasGUI与前面的两个不同,PandasGUI不会生成报告,而是生成一个GUI(图形用户界面)的数据框,我们可以使用它来更详细地分析我们的Dataframe

首先,安装PandasGUI。

# pip安装
pip install pandasgui
# 或者通过源下载
pip install git+https://github.com/adamerose/pandasgui.git

然后,运行几行代码试一下。

from pandasgui import show
# 部署GUI的数据集
gui = show(mpg)

image

在此GUI中,可以做很多事情,比如过滤、统计信息、在变量之间创建图表、以及重塑数据。这些操作可以根据需求拖动选项卡来完成。

image

比如像下面这个统计信息。

image

最牛X的就是绘图器功能了。用它进行拖拽操作简直和excel没有啥区别了,操作难度和门槛几乎为零。

image

还可以通过创建新的数据透视表或者融合数据集来进行重塑。

然后,处理好的数据集可以直接导出成csv。

image

pandasGUI的一些优势在于:

  • 可以拖拽
  • 快速过滤数据
  • 快速绘图

缺点在于:

  • 没有完整的统计信息
  • 不能生成报告

4. 结论

Pandas ProfilingSweetvizPandasGUI都很不错,旨在简化我们的EDA处理。在不同的工作流程中,每个都有自己的优势和适用性,三个工具具体优势如下:

  • Pandas Profiling 适用于快速生成单个变量的分析。
  • Sweetviz 适用于数据集之间和目标变量之间的分析。
  • PandasGUI适用于具有手动拖放功能的深度分析。
参考:
https://github.com/adamerose/...
https://github.com/pandas-pro...
https://github.com/fbdesignpr...
https://towardsdatascience.com/

原创不易,觉得不错点个赞。

欢迎关注我的个人公众号:Python数据科学

数据科学学习网站:datadeepin

查看原文

赞 1 收藏 0 评论 0

Python数据科学 发布了文章 · 11月9日

骚操作!嵌套 JSON 秒变 Dataframe!

image

首发于公众号:Python数据科学

作者:东哥起飞

调用API和文档数据库会返回嵌套的JSON对象,当我们使用Python尝试将嵌套结构中的键转换为列时,数据加载到pandas中往往会得到如下结果:

df = pd.DataFrame.from_records(results [“ issues”],columns = [“ key”,“ fields”])
说明:这里results是一个大的字典,issues是results其中的一个键,issues的值为一个嵌套JSON对象字典的列表,后面会看到JSON嵌套结构。

问题在于API返回了嵌套的JSON结构,而我们关心的键在对象中确处于不同级别。

嵌套的JSON结构张成这样的。

而我们想要的是下面这样的。

下面以一个API返回的数据为例,API通常包含有关字段的元数据。假设下面这些是我们想要的字段。

  • key:JSON密钥,在第一级的位置。
  • summary:第二级的“字段”对象。
  • status name:第三级位置。
  • statusCategory name:位于第4个嵌套级别。

如上,我们选择要提取的字段在issues列表内的JSON结构中分别处于4个不同的嵌套级别,一环扣一环。

{
  "expand": "schema,names",
  "issues": [
    {
      "fields": {
        "issuetype": {
          "avatarId": 10300,
          "description": "",
          "id": "10005",
          "name": "New Feature",
          "subtask": False
        },
        "status": {
          "description": "A resolution has been taken, and it is awaiting verification by reporter. From here issues are either reopened, or are closed.",
          "id": "5",
          "name": "Resolved",
          "statusCategory": {
            "colorName": "green",
            "id": 3,
            "key": "done",
            "name": "Done",
          }
        },
        "summary": "Recovered data collection Defraglar $MFT problem"
      },
      "id": "11861",
      "key": "CAE-160",
    },
    {
      "fields": { 
... more issues],
  "maxResults": 5,
  "startAt": 0,
  "total": 160
}

一个不太好的解决方案

一种选择是直接撸码,写一个查找特定字段的函数,但问题是必须对每个嵌套字段调用此函数,然后再调用.applyDataFrame中的新列。

为获取我们想要的几个字段,首先我们提取fields键内的对象至列:

df = (
    df["fields"]
    .apply(pd.Series)
    .merge(df, left_index=True, right_index = True)
)

从上表看出,只有summary是可用的,issuetype、status等仍然埋在嵌套对象中。

下面是提取issuetype中的name的一种方法。

# 提取issue type的name到一个新列叫"issue_type"
df_issue_type = (
    df["issuetype"]
    .apply(pd.Series)
    .rename(columns={"name": "issue_type_name"})["issue_type_name"]
)
df = df.assign(issue_type_name = df_issue_type)

像上面这样,如果嵌套层级特别多,就需要自己手撸一个递归来实现了,因为每层嵌套都需要调用一个像上面解析并添加到新列的方法。

对于编程基础薄弱的朋友,手撸一个其实还挺麻烦的,尤其是对于数据分析师,着急想用数据的时候,希望可以快速拿到结构化的数据进行分析。

下面东哥分享一个pandas的内置解决方案。

内置的解决方案

pandas中有一个牛逼的内置功能叫 .json_normalize

pandas的文档中提到:将半结构化JSON数据规范化为平面表。

前面方案的所有代码,用这个内置功能仅需要3行就可搞定。步骤很简单,懂了下面几个用法即可。

确定我们要想的字段,使用 . 符号连接嵌套对象。

将想要处理的嵌套列表(这里是results["issues"])作为参数放进 .json_normalize 中。

过滤我们定义的FIELDS列表。

FIELDS = ["key", "fields.summary", "fields.issuetype.name", "fields.status.name", "fields.status.statusCategory.name"]
df = pd.json_normalize(results["issues"])
df[FIELDS]

没错,就这么简单。

其它操作

记录路径

除了像上面那样传递results["issues"]列表之外,我们还使用record_path参数在JSON对象中指定列表的路径。

# 使用路径而不是直接用results["issues"]
pd.json_normalize(results, record_path="issues")[FIELDS]

自定义分隔符

还可以使用sep参数自定义嵌套结构连接的分隔符,比如下面将默认的“.”替换“-”。

### 用 "-" 替换默认的 "."
FIELDS = ["key", "fields-summary", "fields-issuetype-name", "fields-status-name", "fields-status-statusCategory-name"]
pd.json_normalize(results["issues"], sep = "-")[FIELDS]

控制递归

如果不想递归到每个子对象,可以使用max_level参数控制深度。在这种情况下,由于statusCategory.name字段位于JSON对象的第4级,因此不会包含在结果DataFrame中。

# 只深入到嵌套第二级
pd.json_normalize(results, record_path="issues", max_level = 2)

下面是.json_normalizepandas官方文档说明,如有不明白可自行学习,本次东哥就介绍到这里。

pandas官方文档:https://pandas.pydata.org/pan...

原创不易,觉得不错点个赞。

欢迎关注我的个人公众号:Python数据科学

数据科学学习网站:datadeepin

查看原文

赞 1 收藏 0 评论 1

Python数据科学 发布了文章 · 11月2日

安利一个Python大数据分析神器!

image

作者:东哥起飞
首发于公众号:Python数据科学

对于Pandas运行速度的提升方法,之前已经介绍过很多回了,里面经常提及Dask,很多朋友没接触过可能不太了解,今天就推荐一下这个神器。

1、什么是Dask?

PandasNumpy大家都不陌生了,代码运行后数据都加载到RAM中,如果数据集特别大,我们就会看到内存飙升。但有时要处理的数据并不适合RAM,这时候Dask来了。

Dask是开源免费的。它是与其他社区项目(如Numpy,Pandas和Scikit-Learn)协调开发的。

官方:https://dask.org/

Dask支持PandasDataFrameNumpyArray的数据结构,并且既可在本地计算机上运行,也可以扩展到在集群上运行。

基本上,只要编写一次代码,使用普通的Pythonic语法,就可在本地运行或部署到多节点集群上。这本身就是一个很牛逼的功能了,但这还不是最牛逼的。

我觉得Dask的最牛逼的功能是:它兼容大部分我们已经在用的工具,并且只需改动少量的代码,就可以利用自己笔记本电脑上已有的处理能力并行运行代码。而并行处理数据就意味着更少的执行时间,更少的等待时间和更多的分析时间。

下面这个就是Dask进行数据处理的大致流程。
image

2、Dask支持哪些现有工具?

这一点也是我比较看中的,因为Dask可以与Python数据处理和建模的库包兼容,沿用库包的API,这对于Python使用者来说学习成本是极低的。而像HadoopSpark这种大数据处理是有很高的学习门槛和时间成本的。

目前,Dask可支持pandasNumpySklearnXGBoostXArrayRAPIDS等等,光是这几项我觉得就足够用了,至少对于常用的数据处理、建模分析是完全覆盖得掉的。
image

3、Dask安装

可以使用 conda 或者 pip,或从源代码安装dask

conda install dask

因为dask有很多依赖,所以为了快速安装也可用下面代码,将安装运行Dask所需的最少依赖关系集。

conda install dask-core

再有就是通过源来安装。

git clone https://github.com/dask/dask.git
cd dask
python -m pip install .

4、Dask如何使用?

Numpy、pandas

Dask引入了3个并行集合,它们可以存储大于RAM的数据,这些集合有DataFrameBagsArrays。这些集合类型中的每一个都能够使用在RAM和硬盘之间分区的数据,以及分布在群集中多个节点上的数据。

Dask的使用是非常清晰的,如果你使用NumPy数组,就从Dask数组开始,如果你使用Pandas DataFrame,就从Dask DataFrame开始,依此类推。

import dask.array as da
x = da.random.uniform(low=0, high=10, size=(10000, 10000),  # normal numpy code
                      chunks=(1000, 1000))  # break into chunks of size 1000x1000

y = x + x.T - x.mean(axis=0)  # Use normal syntax for high level algorithms

# DataFrames
import dask.dataframe as dd
df = dd.read_csv('2018-*-*.csv', parse_dates='timestamp',  # normal Pandas code
                 blocksize=64000000)  # break text into 64MB chunks

s = df.groupby('name').balance.mean()  # Use normal syntax for high level algorithms

# Bags / lists
import dask.bag as db
b = db.read_text('*.json').map(json.loads)
total = (b.filter(lambda d: d['name'] == 'Alice')
          .map(lambda d: d['balance'])
          .sum())

这些高级接口在略微变化的情况下复制了标准接口。对于原始项目中的大部分API,这些接口会自动为我们并行处理较大的数据集,实现上不是很复杂,对照Dask的doc文档即可一步步完成。

Delayed

下面说一下DaskDelay 功能,非常强大。

Dask.delayed是一种并行化现有代码的简单而强大的方法。之所以被叫做delayed是因为,它没有立即计算出结果,而是将要作为任务计算的结果记录在一个图形中,稍后将在并行硬件上运行。

有时问题用已有的dask.arraydask.dataframe可能都不适合,在这些情况下,我们可以使用更简单的dask.delayed界面并行化自定义算法。例如下面这个例子。

def inc(x):
    return x + 1

def double(x):
    return x * 2

def add(x, y):
    return x + y

data = [1, 2, 3, 4, 5]

output = []
for x in data:
    a = inc(x)
    b = double(x)
    c = add(a, b)
    output.append(c)

total = sum(output)
45

上面代码在单个线程中按顺序运行。但是,我们看到其中很多可以并行执行。Dask delayed函数可修饰incdouble这些函数,以便它们可延迟运行,而不是立即执行函数,它将函数及其参数放入计算任务图中。

我们简单修改代码,用delayed函数包装一下。

import dask

output = []
for x in data:
    a = dask.delayed(inc)(x)
    b = dask.delayed(double)(x)
    c = dask.delayed(add)(a, b)
    output.append(c)

total = dask.delayed(sum)(output)

代码运行后incdoubleaddsum都还没有发生,而是生成一个计算的任务图交给了total。然后我们用visualizatize看下任务图。

total.visualize()  

image
上图明显看到了并行的可能性,所以毫不犹豫,使用compute进行并行计算,这时才完成了计算。

>>> total.compute()
45

由于数据集较小无法比较时间,这里只介绍下使用方法,具体可自己动手实践下。

Sklearn机器学习

关于机器学习的并行化执行,由于内容较多,东哥会在另一篇文章展开。这里简单说下一下dask-learn

dask-learn项目是与Sklearn开发人员协作完成的。现在可实现并行化有Scikit-learnPipelineGridsearchCVRandomSearchCV以及这些的变体,它们可以更好地处理嵌套的并行操作。

因此,如果你将sklearn替换为dklearn,那么速度将会提升很多。

# from sklearn.grid_search import GridSearchCV
  from dklearn.grid_search import GridSearchCV
# from sklearn.pipeline import Pipeline
  from dklearn.pipeline import Pipeline
下面是一个使用Pipeline的示例,其中应用了PCA和逻辑回归。
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=10000,
                           n_features=500,
                           n_classes=2,
                           n_redundant=250,
                           random_state=42)

from sklearn import linear_model, decomposition
from sklearn.pipeline import Pipeline
from dklearn.pipeline import Pipeline

logistic = linear_model.LogisticRegression()
pca = decomposition.PCA()
pipe = Pipeline(steps=[('pca', pca),
                       ('logistic', logistic)])


grid = dict(pca__n_components=[50, 100, 150, 250],
            logistic__C=[1e-4, 1.0, 10, 1e4],
            logistic__penalty=['l1', 'l2'])

# from sklearn.grid_search import GridSearchCV
from dklearn.grid_search import GridSearchCV

estimator = GridSearchCV(pipe, grid)

estimator.fit(X, y)

结果是:sklearn会在40秒钟左右执行此计算,而dask-learn替代品大约需要10秒钟。
另外,如果添加以下代码可以连接到集群,通过Client可以展示整个计算过程的dashboard,由Bokeh实现。

from dask.distributed import Client
c = Client('scheduler-address:8786')

image

5、总结

以上就是Dask的简单介绍,Dask的功能是非常强大的,且说明文档也非常全,既有示例又有解释。感兴趣的朋友可以自行去官网或者GitHub学习,东哥下次分享使用Dask进行机器学习的一些实例。

原创不易,觉得不错点个赞。

欢迎关注我的个人公众号:Python数据科学

数据科学学习网站:datadeepin

查看原文

赞 9 收藏 8 评论 0

Python数据科学 发布了文章 · 10月29日

Bong!5 款超牛逼的 Jupyter Notebook 插件!

作者:东哥起飞

微信公众号:Python数据科学

本次东哥分享三个高效的Jupyter Notebook插件,每个都很实用。

1、Scratchpad

这个插件非常有用,我们做数据分析EDA或者特征工程时经常要各种尝试,而不是要真正的运行cell代码。

这个时候在同一个notebook里来回运行就非常容易乱,找不到自己想要的那个对的代码了。当然,可以注释,不过也比较不好管理。

使用这个插件可以在当前内核上运行代码,而不必在实际代码之间不断添加新单元以进行实验或计算。使用 Shift + Enter 打开便签本,然后通过 Ctrl + B 将其关闭。

image

2、Code folding

code folding 插件提供了三种代码折叠选项,在敲代码过程中是非常有必要的。

1、缩进折叠

该算法可以检测缩进,允许将缩进一一折叠。这样我们就可以折叠更多的代码了,看下下面的代码。

image

如上所示,有两个缩进。因此,此代码单元先折叠为:

image

进一步的折叠:

image

2、第一行注释折叠

这种折叠用在第一行中有注释的单元格。

结果是仅显示第一行中的注释,而不显示整个单元格。这样,当我们删除代码时,可以保留第一行的注释,对单元格进行简短而准确的描述。

所以,以下单元格…

image

…可以折叠成这样:

image

3、魔术折叠

上面的概念也适用于第一行是魔术命令的情况。

这个特殊的折叠对于 import导入包的单元格可能特别有用。

另一个应用场景是删除所有非Python代码,以避免可能的干扰。

image

折叠会将上面的单元格变成:

image

此外,保存Jupyter notebook后,所有折痕都将保存。

3、zenmode

最后一个插件可能是三个中最常用的了。

zenmode插件可以将菜单删除,使你可以专注于代码。

这样可使 Jupyter notebook 的界面在视觉和使用上更舒服。

image

4、Table of contents

这个插件将为notebook增加一个目录。

通过点击下方图片中红框内的按钮,即可激活或停用它。

imageimage

当使用含有较多内容的notebook时,该功能的实用性便体现出来了。
点击目录中的任何标题,即可直接定位到notebook的相应位置。

5、Variable Inspector

可以通过菜单上标红的按钮来执行该扩展。

点击按钮后,将显示当下命名空间中的所有变量信息,包括变量的名称、类型、大小、形式和值。

image

6、总结

以上就是东哥本次安利的5个插件。

下面是历史往期分享的Jupyter相关的好文,可以自行学习。

新一代Notebook神器出现,Jupyter危险了!

如何在启动 Jupyter Notebook 时自动执行一段代码?

安利 9 个高效的 Jupyter Notebook 扩展工具

Jupyter 平台最强插件,没有之一!

太可怕了!这个 Jupyter 插件可能会让我失业!

用了这个jupyter插件,我已经半个月没打开过excel了

Jupyter Notebook最常用的五大配置技巧

参考:https://towardsdatascience.com/

原创不易,来波点赞支持。

本篇首发于我的原创公众号:Python数据科学,欢迎关注。
数据科学网站:datadeepin

查看原文

赞 6 收藏 6 评论 0

Python数据科学 收藏了文章 · 10月16日

再见,可视化!你好,Pandas!

image

来源:Python数据科学
作者:东哥起飞

Python做数据分析离不开pandaspnadas更多的承载着处理和变换数据的角色,pands中也内置了可视化的操作,但效果很糙。

因此,大家在用Python做数据分析时,正常的做法是用先pandas先进行数据处理,然后再用MatplotlibSeabornPlotlyBokeh等对dataframe或者series进行可视化操作。

但是说实话,每个可视化包都有自己独特的方法和函数,经常忘,这是让我一直很头疼的地方。

好消息来了!从最新的pandas版本0.25.3开始,不再需要上面的操作了,数据处理和可视化完全可以用pandas一个就全部搞定。

pandas现在可以使用PlotlyBokeh作为可视化的backend,直接实现交互性操作,无需再单独使用可视化包了。

下面我们一起看看如何使用。

1. 激活backend

importpandas之后,直接使用下面这段代码激活backend,比如下面要激活plotly

pd.options.plotting.backend = 'plotly'

目前,pandas的backend支持以下几个可视化包。

  • Plotly
  • Holoviews
  • Matplotlib
  • Pandas_bokeh
  • Hyplot

2. Plotly backend

Plotly的好处是,它基于Javascript版本的库写出来的,因此生成的Web可视化图表,可以显示为HTML文件或嵌入基于Python的Web应用程序中。

下面看下如何用plotly作为pandas的backend进行可视化。

如果还没安装Plotly,则需要安装它pip intsall plotly。如果是在Jupyterlab中使用Plotly,那还需要执行几个额外的安装步骤来显示可视化效果。

首先,安装IPywidgets

pip install jupyterlab "ipywidgets>=7.5"

然后运行此命令以安装Plotly扩展。

jupyter labextension install jupyterlab-plotly@4.8.1

示例选自openml.org的的数据集,链接如下:

数据链接:https://www.openml.org/d/187

这个数据也是Scikit-learn中的样本数据,所以也可以使用以下代码将其直接导入。

import pandas as pd
import numpy as np

from sklearn.datasets import fetch_openml

pd.options.plotting.backend = 'plotly'

X,y = fetch_openml("wine", version=1, as_frame=True, return_X_y=True)
data = pd.concat([X,y], axis=1)
data.head()

该数据集是葡萄酒相关的,包含葡萄酒类型的许多功能和相应的标签。数据集的前几行如下所示。

image

下面使用Plotly backend探索一下数据集。

绘图方式与正常使用Pandas内置的绘图操作几乎相同,只是现在以丰富的Plotly显示可视化效果。

下面的代码绘制了数据集中两个要素之间的关系。

fig = data[['Alcohol', 'Proline']].plot.scatter(y='Alcohol', x='Proline')
fig.show()

image

如果将鼠标悬停在图表上,可以选择将图表下载为高质量的图像文件。
image

我们可以结合Pandasgroupby函数创建一个条形图,总结各类之间Hue的均值差异。

data[['Hue','class']].groupby(['class']).mean().plot.bar()

image

class添加到我们刚才创建的散点图中。通过Plotly可以轻松地为每个类应用不同的颜色,以便直观地看到分类。

fig = data[['Hue', 'Proline', 'class']].plot.scatter(x='Hue', y='Proline', color='class', title='Proline and Hue by wine class')
fig.show()

image

3. Bokeh backend

Bokeh是另一个Python可视化包,也可提供丰富的交互式可视化效果。Bokeh还具有streaming API,可以为比如金融市场等流数据创建实时可视化。

pandas-Bokeh的GitHub链接如下:

https://github.com/PatrikHlob...

老样子,用pip安装即可,pip install pandas-bokeh

为了在Jupyterlab中显示Bokeh可视化效果,还需要安装两个新的扩展。

jupyter labextension install @jupyter-widgets/jupyterlab-manager
jupyter labextension install @bokeh/jupyter_bokeh

下面我们使用Bokeh backend重新创建刚刚plotly实现的的散点图。

pd.options.plotting.backend = 'pandas_bokeh'

import pandas_bokeh
from bokeh.io import output_notebook
from bokeh.plotting import figure, show

output_notebook()
p1 = data.plot_bokeh.scatter(x='Hue', 
                              y='Proline', 
                              category='class', 
                              title='Proline and Hue by wine class',
                              show_figure=False)
show(p1)

关键语句就一行代码,非常快捷,交互式效果如下。

image

Bokeh还具有plot_grid函数,可以为多个图表创建类似于仪表板的布局,下面在网格布局中创建了四个图表。

output_notebook()

p1 = data.plot_bokeh.scatter(x='Hue', 
                              y='Proline', 
                              category='class', 
                              title='Proline and Hue by wine class',
                              show_figure=False)

p2 = data[['Hue','class']].groupby(['class']).mean().plot.bar(title='Mean Hue per Class')

df_hue = pd.DataFrame({
    'class_1': data[data['class'] == '1']['Hue'],
    'class_2': data[data['class'] == '2']['Hue'],
    'class_3': data[data['class'] == '3']['Hue']},
    columns=['class_1', 'class_2', 'class_3'])

p3 = df_hue.plot_bokeh.hist(title='Distribution per Class: Hue')

df_proline = pd.DataFrame({
    'class_1': data[data['class'] == '1']['Proline'],
    'class_2': data[data['class'] == '2']['Proline'],
    'class_3': data[data['class'] == '3']['Proline']},
    columns=['class_1', 'class_2', 'class_3'])

p4 = df_proline.plot_bokeh.hist(title='Distribution per Class: Proline')

pandas_bokeh.plot_grid([[p1, p2], 
                        [p3, p4]], plot_width=450)

可以看到,可视化的部分都是在pandasdataframe基础上一行代码搞定,最后plot_grid完成布局。
image

4. 总结

在内置的Pandas绘图功能增加多个第三方可视化backend,大大增强了pandas用于数据可视化的功能,今后可能真的不需再去学习众多可视化操作了,使用pandas也可以一击入魂!


原创不易,来波点赞支持。

本篇首发于我的原创公众号:Python数据科学,欢迎关注。
个人网站:http://www.datadeepin.com/

查看原文

Python数据科学 发布了文章 · 10月16日

再见,可视化!你好,Pandas!

image

来源:Python数据科学
作者:东哥起飞

Python做数据分析离不开pandaspnadas更多的承载着处理和变换数据的角色,pands中也内置了可视化的操作,但效果很糙。

因此,大家在用Python做数据分析时,正常的做法是用先pandas先进行数据处理,然后再用MatplotlibSeabornPlotlyBokeh等对dataframe或者series进行可视化操作。

但是说实话,每个可视化包都有自己独特的方法和函数,经常忘,这是让我一直很头疼的地方。

好消息来了!从最新的pandas版本0.25.3开始,不再需要上面的操作了,数据处理和可视化完全可以用pandas一个就全部搞定。

pandas现在可以使用PlotlyBokeh作为可视化的backend,直接实现交互性操作,无需再单独使用可视化包了。

下面我们一起看看如何使用。

1. 激活backend

importpandas之后,直接使用下面这段代码激活backend,比如下面要激活plotly

pd.options.plotting.backend = 'plotly'

目前,pandas的backend支持以下几个可视化包。

  • Plotly
  • Holoviews
  • Matplotlib
  • Pandas_bokeh
  • Hyplot

2. Plotly backend

Plotly的好处是,它基于Javascript版本的库写出来的,因此生成的Web可视化图表,可以显示为HTML文件或嵌入基于Python的Web应用程序中。

下面看下如何用plotly作为pandas的backend进行可视化。

如果还没安装Plotly,则需要安装它pip intsall plotly。如果是在Jupyterlab中使用Plotly,那还需要执行几个额外的安装步骤来显示可视化效果。

首先,安装IPywidgets

pip install jupyterlab "ipywidgets>=7.5"

然后运行此命令以安装Plotly扩展。

jupyter labextension install jupyterlab-plotly@4.8.1

示例选自openml.org的的数据集,链接如下:

数据链接:https://www.openml.org/d/187

这个数据也是Scikit-learn中的样本数据,所以也可以使用以下代码将其直接导入。

import pandas as pd
import numpy as np

from sklearn.datasets import fetch_openml

pd.options.plotting.backend = 'plotly'

X,y = fetch_openml("wine", version=1, as_frame=True, return_X_y=True)
data = pd.concat([X,y], axis=1)
data.head()

该数据集是葡萄酒相关的,包含葡萄酒类型的许多功能和相应的标签。数据集的前几行如下所示。

image

下面使用Plotly backend探索一下数据集。

绘图方式与正常使用Pandas内置的绘图操作几乎相同,只是现在以丰富的Plotly显示可视化效果。

下面的代码绘制了数据集中两个要素之间的关系。

fig = data[['Alcohol', 'Proline']].plot.scatter(y='Alcohol', x='Proline')
fig.show()

image

如果将鼠标悬停在图表上,可以选择将图表下载为高质量的图像文件。
image

我们可以结合Pandasgroupby函数创建一个条形图,总结各类之间Hue的均值差异。

data[['Hue','class']].groupby(['class']).mean().plot.bar()

image

class添加到我们刚才创建的散点图中。通过Plotly可以轻松地为每个类应用不同的颜色,以便直观地看到分类。

fig = data[['Hue', 'Proline', 'class']].plot.scatter(x='Hue', y='Proline', color='class', title='Proline and Hue by wine class')
fig.show()

image

3. Bokeh backend

Bokeh是另一个Python可视化包,也可提供丰富的交互式可视化效果。Bokeh还具有streaming API,可以为比如金融市场等流数据创建实时可视化。

pandas-Bokeh的GitHub链接如下:

https://github.com/PatrikHlob...

老样子,用pip安装即可,pip install pandas-bokeh

为了在Jupyterlab中显示Bokeh可视化效果,还需要安装两个新的扩展。

jupyter labextension install @jupyter-widgets/jupyterlab-manager
jupyter labextension install @bokeh/jupyter_bokeh

下面我们使用Bokeh backend重新创建刚刚plotly实现的的散点图。

pd.options.plotting.backend = 'pandas_bokeh'

import pandas_bokeh
from bokeh.io import output_notebook
from bokeh.plotting import figure, show

output_notebook()
p1 = data.plot_bokeh.scatter(x='Hue', 
                              y='Proline', 
                              category='class', 
                              title='Proline and Hue by wine class',
                              show_figure=False)
show(p1)

关键语句就一行代码,非常快捷,交互式效果如下。

image

Bokeh还具有plot_grid函数,可以为多个图表创建类似于仪表板的布局,下面在网格布局中创建了四个图表。

output_notebook()

p1 = data.plot_bokeh.scatter(x='Hue', 
                              y='Proline', 
                              category='class', 
                              title='Proline and Hue by wine class',
                              show_figure=False)

p2 = data[['Hue','class']].groupby(['class']).mean().plot.bar(title='Mean Hue per Class')

df_hue = pd.DataFrame({
    'class_1': data[data['class'] == '1']['Hue'],
    'class_2': data[data['class'] == '2']['Hue'],
    'class_3': data[data['class'] == '3']['Hue']},
    columns=['class_1', 'class_2', 'class_3'])

p3 = df_hue.plot_bokeh.hist(title='Distribution per Class: Hue')

df_proline = pd.DataFrame({
    'class_1': data[data['class'] == '1']['Proline'],
    'class_2': data[data['class'] == '2']['Proline'],
    'class_3': data[data['class'] == '3']['Proline']},
    columns=['class_1', 'class_2', 'class_3'])

p4 = df_proline.plot_bokeh.hist(title='Distribution per Class: Proline')

pandas_bokeh.plot_grid([[p1, p2], 
                        [p3, p4]], plot_width=450)

可以看到,可视化的部分都是在pandasdataframe基础上一行代码搞定,最后plot_grid完成布局。
image

4. 总结

在内置的Pandas绘图功能增加多个第三方可视化backend,大大增强了pandas用于数据可视化的功能,今后可能真的不需再去学习众多可视化操作了,使用pandas也可以一击入魂!


原创不易,来波点赞支持。

本篇首发于我的原创公众号:Python数据科学,欢迎关注。
个人网站:http://www.datadeepin.com/

查看原文

赞 18 收藏 12 评论 1

Python数据科学 收藏了文章 · 9月29日

安利 5 个拍案叫绝的 Matplotlib 骚操作!

公众号:Python数据科学
作者:东哥起飞

大家都知道,Matplotlib是Python的可视化库,功能很强,可以绘制各种图。一些常规用法前不久分享过Matplotlib官方出品的cheatsheet:Matplotlib官方小抄手册公开,配套可视化代码已打包!

但是!今天我们不走寻常路,专挑几个贼骚的操作分享下.

1. Span Selector

Span SelectorMatplotlib中的鼠标小部件,widgets是用于包含一些交互功能的python对象。Span Selector可以通过鼠标框选,方便地查看选定区域的最大值和最小值。

下面是代码,首先创建一个基本折线图作为例子。然后,我们调用SpanSelector方法并使用它来选择一个区域,然后在该区域中显示最大值和最小值。

import matplotlib.pyplot as plt
from matplotlib.widgets import SpanSelector
def onselect(xmin, xmax):
    print(xmin, xmax)
    return xmin, xmax
fig, ax = plt.subplots()
ax.plot([1,2,3,4,5,6,7], [10, 50, 100, 23,15,28,45])
span = SpanSelector(ax, onselect, 'horizontal', useblit=True, rectprops=dict(alpha=0.5, facecolor='red'))       
plt.show()

下面是具体操作。
image

2. Broken Barh

Broken的水平条形图是不连续具有间隙的图,它可用于数据值相差很大的情况下,例如,包含极端温度范围的数据集。在这种情况下,Broken的水平条形图非常合适,因为它们可以同时绘制最大和最小范围。

python模块matplotlib.broken_barh()用于绘制Broken的水平条形图。

import matplotlib.pyplot as plt 
#Defining the x and y ranges 
xranges = [(5,5), (20,5),(20,7)] 
yrange = (2,1) 
#Plotting the broken bar chart 
plt.broken_barh(xranges, yrange, facecolors='green') 
xranges = [(6,2), (17,5),(50,2)] 
yrange = (15,1) 
plt.broken_barh(xranges, yrange, facecolors='orange') 
xranges = [(5,2), (28,5),(40,2)] 
yrange = (30,1) 
plt.broken_barh(xranges, yrange, facecolors='red') 
plt.xlabel('Sales') 
plt.ylabel('Days of the Month') 
plt.show()

image

3. Table Demo

Matplotlib的表格功能也是可以在图中显示表格的。当我们希望以条形图的形式快速查看表格中的值时,这特别方便。表格可以放置在图表的顶部,底部或侧面。

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
x = np.random.rand(5, 8)*.7 
plt.plot(x.mean(axis=0), '-o', label='average per column') 
plt.xticks([]) 
plt.table(cellText=[['%1.2f' % xxx for xxx in xx] for xx in x],cellColours=plt.cm.GnBu(x),loc='bottom') 
plt.show()

image
image

4. Watermark Images

有时候我们觉得可视化的背景太单调了,想增加点趣味性,比如将与数据相关的图像作为水印覆盖到可视化图形上。下面就以NBA的詹皇为例试试水,最后呈现出詹皇的数据,同时背景是詹皇本人。

首先,导入要用的数据集,图片和必要的库pandas

import numpy as np 
import matplotlib.image as image 
import matplotlib.pyplot as plt 
import pandas as pd 
df = pd.read_csv('income.csv') 
im = image.imread('Lebron_James.jpeg') # Image

pandas过滤掉仅由勒布朗组成的数据。

lebron_james = df[df['Name']=='LeBron James']

然后像下面这样操作,使用figimage添加水印就ok了。

fig, ax = plt.subplots() 
ax.grid() 
ax.plot('Year','earnings ($ million)',data=lebron_james) 
ax.set_title("LeBron James earnings in US$(millions)") 
fig.figimage(im, 60, 40,cmap='ocean', alpha=.2) 
plt.show()

image

5. XKCD Plots

下面这个操作更有趣味性(更骚)。

如果你想让Matplotlib图上添加一些扭曲,可以简单地xkcd()pyplot对象上调用方法,如下所示。

import pandas as pd 
import matplotlib.pyplot as plt 
df = pd.read_csv('https://raw.githubusercontent.com/parulnith/Website-articles-datasets/master/India%20GDP%20Growth%20Rate%20.csv', parse_dates=['Year']) 
df['Year'] = df['Year'].apply(lambda x: pd.Timestamp(x).strftime('%Y')) 
#calling xkcd() method 
plt.xkcd(scale=5, length=400) 
df.plot(x='Year',y='GDP Growth (%)',kind='bar') 
plt.ylabel('GDP Growth (%)') 
plt.xticks(rotation=-20) 
plt.figure(figsize=(10,8)) 
plt.show()

image

文章参考:
https://towardsdatascience.co...

先分享这些,如果觉得有帮助,还请多分享点个赞

欢迎大家关注我的原创微信公众号 Python数据科学,专注于写基于Python的数据算法、机器学习、深度学习硬核干货。

查看原文

Python数据科学 发布了文章 · 9月29日

安利 5 个拍案叫绝的 Matplotlib 骚操作!

公众号:Python数据科学
作者:东哥起飞

大家都知道,Matplotlib是Python的可视化库,功能很强,可以绘制各种图。一些常规用法前不久分享过Matplotlib官方出品的cheatsheet:Matplotlib官方小抄手册公开,配套可视化代码已打包!

但是!今天我们不走寻常路,专挑几个贼骚的操作分享下.

1. Span Selector

Span SelectorMatplotlib中的鼠标小部件,widgets是用于包含一些交互功能的python对象。Span Selector可以通过鼠标框选,方便地查看选定区域的最大值和最小值。

下面是代码,首先创建一个基本折线图作为例子。然后,我们调用SpanSelector方法并使用它来选择一个区域,然后在该区域中显示最大值和最小值。

import matplotlib.pyplot as plt
from matplotlib.widgets import SpanSelector
def onselect(xmin, xmax):
    print(xmin, xmax)
    return xmin, xmax
fig, ax = plt.subplots()
ax.plot([1,2,3,4,5,6,7], [10, 50, 100, 23,15,28,45])
span = SpanSelector(ax, onselect, 'horizontal', useblit=True, rectprops=dict(alpha=0.5, facecolor='red'))       
plt.show()

下面是具体操作。
image

2. Broken Barh

Broken的水平条形图是不连续具有间隙的图,它可用于数据值相差很大的情况下,例如,包含极端温度范围的数据集。在这种情况下,Broken的水平条形图非常合适,因为它们可以同时绘制最大和最小范围。

python模块matplotlib.broken_barh()用于绘制Broken的水平条形图。

import matplotlib.pyplot as plt 
#Defining the x and y ranges 
xranges = [(5,5), (20,5),(20,7)] 
yrange = (2,1) 
#Plotting the broken bar chart 
plt.broken_barh(xranges, yrange, facecolors='green') 
xranges = [(6,2), (17,5),(50,2)] 
yrange = (15,1) 
plt.broken_barh(xranges, yrange, facecolors='orange') 
xranges = [(5,2), (28,5),(40,2)] 
yrange = (30,1) 
plt.broken_barh(xranges, yrange, facecolors='red') 
plt.xlabel('Sales') 
plt.ylabel('Days of the Month') 
plt.show()

image

3. Table Demo

Matplotlib的表格功能也是可以在图中显示表格的。当我们希望以条形图的形式快速查看表格中的值时,这特别方便。表格可以放置在图表的顶部,底部或侧面。

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
x = np.random.rand(5, 8)*.7 
plt.plot(x.mean(axis=0), '-o', label='average per column') 
plt.xticks([]) 
plt.table(cellText=[['%1.2f' % xxx for xxx in xx] for xx in x],cellColours=plt.cm.GnBu(x),loc='bottom') 
plt.show()

image
image

4. Watermark Images

有时候我们觉得可视化的背景太单调了,想增加点趣味性,比如将与数据相关的图像作为水印覆盖到可视化图形上。下面就以NBA的詹皇为例试试水,最后呈现出詹皇的数据,同时背景是詹皇本人。

首先,导入要用的数据集,图片和必要的库pandas

import numpy as np 
import matplotlib.image as image 
import matplotlib.pyplot as plt 
import pandas as pd 
df = pd.read_csv('income.csv') 
im = image.imread('Lebron_James.jpeg') # Image

pandas过滤掉仅由勒布朗组成的数据。

lebron_james = df[df['Name']=='LeBron James']

然后像下面这样操作,使用figimage添加水印就ok了。

fig, ax = plt.subplots() 
ax.grid() 
ax.plot('Year','earnings ($ million)',data=lebron_james) 
ax.set_title("LeBron James earnings in US$(millions)") 
fig.figimage(im, 60, 40,cmap='ocean', alpha=.2) 
plt.show()

image

5. XKCD Plots

下面这个操作更有趣味性(更骚)。

如果你想让Matplotlib图上添加一些扭曲,可以简单地xkcd()pyplot对象上调用方法,如下所示。

import pandas as pd 
import matplotlib.pyplot as plt 
df = pd.read_csv('https://raw.githubusercontent.com/parulnith/Website-articles-datasets/master/India%20GDP%20Growth%20Rate%20.csv', parse_dates=['Year']) 
df['Year'] = df['Year'].apply(lambda x: pd.Timestamp(x).strftime('%Y')) 
#calling xkcd() method 
plt.xkcd(scale=5, length=400) 
df.plot(x='Year',y='GDP Growth (%)',kind='bar') 
plt.ylabel('GDP Growth (%)') 
plt.xticks(rotation=-20) 
plt.figure(figsize=(10,8)) 
plt.show()

image

文章参考:
https://towardsdatascience.co...

先分享这些,如果觉得有帮助,还请多分享点个赞

欢迎大家关注我的原创微信公众号 Python数据科学,专注于写基于Python的数据算法、机器学习、深度学习硬核干货。

查看原文

赞 5 收藏 3 评论 0

Python数据科学 发布了文章 · 6月19日

从机械转行数据科学,吐血整理了这些白嫖的学习网站

作者:东哥起飞
Python数据科学

大家好,我是东哥。

前方高能,准备开启收藏夹吃灰模式。

本篇东哥分享几个数据科学入门的学习网站,全部免费资源,且内容优质,是小白入门的不二选择。东哥当年从机械转行也从这些学习网站收获很多。

下面开始进入正题。

一、Kaggle

什么是Kaggle?

在这里插入图片描述
kaggle是全球最先也是目前规模最大的数据科学竞赛组织了。之所以这么受欢迎,是因为很多大的公司奉献出自家真实的数据给kaggle,提出真实业务场景面临的痛点,需要数据科学上的解决方案。

我个人觉得是非常有意思的,因为很多人苦学理论,正愁着没有真实数据去实践,有了这个机会,不论方案是否可以排上名次,都是宝贵的实践经验啊。

当然,作为方案最优的前三名可以得到一笔丰厚的报酬,几千美元到几万美元不等,这更加刺激广大数据爱好者了。竞赛已经有上百场了,各种场景和需求,并且随着需求增多,竞赛也在不断增加。

Kaggle上有什么?

原来的kaggle只有单一的竞赛,现在的kaggle已经不只是竞赛这么简单了。它还有丰富的社区免费的学习课程在线实操的环境

下面是一在线操作提交模型的环境,非常奈斯。

在这里插入图片描述
各路神仙在社区共享自己的kernels和源代码,是个非常好的交流学习机会,有兴趣可以自己去看。这里主要说下免费的学习课程,下面是地址。

https://www.kaggle.com/learn/...

在这里插入图片描述

学习列表中有python、机器学习、深度学习、可视化、pandas数据处理、SqL入门和进阶等等。打开每个学习项目,内容非常丰富,虽是英文我相信对于有心的人都不是问题了。

二、Coursera

在这里插入图片描述
Coursera很多朋友应该熟悉,吴恩达的机器学习课程最早就是从这里开始分享的。里面有各个名校大学的公开课,很多都是免费公开的课程,听课是免费的,但学完后认证证书需要付费。

这里分享几个东哥收藏的宝藏课程,每一个都很经典,好评无数。

1.机器学习 (Andrew Ng / 斯坦福大学)

在这里插入图片描述

https://www.coursera.org/lear...

2.专业数据科学(10门课/JHU)

在这里插入图片描述

https://www.coursera.org/spec...

3.数据科学实战(5门课/JHU)

在这里插入图片描述

https://www.coursera.org/spec...

4.专业数据挖掘(6门课/伊利诺伊大学)

在这里插入图片描述

https://www.coursera.org/spec...

5.数据科学硕士(8门课/伊利诺伊大学圣巴巴拉分校)

在这里插入图片描述

https://www.coursera.org/degr...

6.数据科学应用硕士(密歇根大学)

在这里插入图片描述

https://www.coursera.org/degr...

三、Udacity

Udacity(优达学成)是个美国的付费类培训机构,内容涉及所有编程和计算机类的课程,是歪果仁拍的视频课程,质量很高,但收费很贵。

仔细观察,其实也有很多免费的课程供学习的,东哥把收藏的存货也拿出来分享下。

1.数据科学导论

总共10个章节,以titanicNewYork Subway data项目为例介绍数据分析、可视化、数据处理、Mapreduce大数据。
在这里插入图片描述

https://www.udacity.com/cours...

2.数据分析导论

在这里插入图片描述

https://www.udacity.com/cours...

3.数据可视化分析

这个课程是基于R语言的,介绍了R语言基础、逻辑回归、线性回归、正则化等内容。
在这里插入图片描述

https://www.udacity.com/cours...

4.使用SQL做数据分析

在这里插入图片描述

https://www.udacity.com/cours...

5. 统计推理入门

主要介绍推断性统计的知识,比如各种检验,假设检验、t检验、卡方检验、ANOVA方差分析、回归等等。

在这里插入图片描述

https://www.udacity.com/cours...

当然,除了这些还有很多付费的,感兴趣可自行查找,本篇只谈免费。

四、其它社区和博客

下面是几个很好的国外数据科学社区和个人博客,内容不如前面三个学习网站有组织和条条理,但是有很多优秀的文章分享也可以作为参考学习。

1. 面向数据科学

https://towardsdatascience.com/

这里着重说下这个社区,专门的数据科学学习平台,里面都是一些国外爱好者的分享,涵盖了data sciencemachine learningdeep learningvisualizationprogramming等,缺点是需要特殊工具才能上去,用谷歌访问助手也可以。

2. 方差解释

http://varianceexplained.org/

3. 成为一名数据科学家

https://www.becomingadatascie...

4. Mark Meloon

https://www.markmeloon.com/

5. Julia Silge

https://juliasilge.com/blog/

以上就是东哥分享的一些免费课程资源,资源多少不是关键,关键的是迈开第一步,深入进去开始学习。

先分享这些,如果觉得有帮助,还请多分享点个赞

欢迎大家关注我的原创微信公众号 Python数据科学,专注于写基于Python的数据算法、机器学习、深度学习硬核干货。

查看原文

赞 6 收藏 3 评论 0

Python数据科学 关注了专栏 · 6月18日

AWS_AI开发社区

AWS_AI 开发者社区是专注于人工智能领域 IT 人士交流与互动的平台。在这里,你可以分享和获取一切有关人工智能的相关技术和前沿知识,也可以与同行或爱好者们交流探讨,共同成长。

关注 884

认证与成就

  • 获得 1364 次点赞
  • 获得 7 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 7 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2018-01-03
个人主页被 20.8k 人浏览