基于Jupyter交互式数据分析

一、python主流IDE(集成开发环境)对比

1、Pycharm

后台批处理、大中型项目的首选

  • 在软件开发中,Jupyter可能显得并没有那么好用,这个模块化的功能反而会破坏掉程序的整体性;
  • Pycharm它能对类、对象、关键字的补全和自动缩进,能格式化代码,定制代码片段和格式;
  • Pycharm支持错误的突出显示,同时也包含PEP-8,能帮助写出整洁的代码,易于支撑其他语言。

2、Jupyter

交互式的首选,数据处理、分析、建模、观察结果、机器学习

  • 拥有交互式组件,可以编程输出视频、图像、LaTaX。不仅如此,交互式组件能够用来实时可视化和操作数据;
  • markdown 标记语言能够代码标注,用户能够将逻辑和思考写在笔记本中,这和python内部注释部分不同(同时还会让整个处理和建模的过程变得异常清晰);
  • 模块化功能,能把大段的Python代码碎片化处理,分开每一段来运行。

二、Jupyter 介绍

Free software, open standards, and web services for interactive computing across all programming languages. 官网链接

1、版本

  • Jupyter Notebook

The Jupyter Notebook is the original web application for creating and sharing computational documents. It offers a simple, streamlined, document-centric experience.

  • JupyterLab(推荐)

JupyterLab is the latest web-based interactive development environment for notebooks, code, and data. Its flexible interface allows users to configure and arrange workflows in data science, scientific computing, computational journalism, and machine learning. A modular design invites extensions to expand and enrich functionality.

从官方对于Jupyter Notebook、JupyterLab的介绍以及自己在实际使用过程中两个版本的优弊,更推荐使用JupyterLab。当然由于JupyterLab在利用ipywidget交互式会有报错的可能,因此,如果用到ipywidget时,可切换到jupyter notebook中使用。

2、模式

Jupyter支持两种模式:

  • 编辑模式(Enter):命令模式下回车Enter或鼠标双击cell进入编辑模式;可以操作cell内文本或代码,剪切/复制/粘贴移动等操作。
  • 命令模式(Esc):按Esc退出编辑,进入命令模式;可以操作cell单元本身进行剪切/复制/粘贴/移动等操作。

3、支持视频、网页、图片、音频、数学公式等的显示

3.1 网页

from IPython.display import HTML, Video, Image, IFrame
IFrame('https://blog.csdn.net/', width=1000, height=600)

3.2 图片

from IPython.display import HTML, Video, Image, IFrame
Image('https://lmg.jj20.com/up/allimg/1114/020R1102553/21020Q02553-2-1200.jpg')

3.3 数学公式

J α ( x ) = ∑ m = 0 ∞ ( − 1 ) m m ! Γ ( m + α + 1 ) ( x 2 ) 2 m + α ,行内公式示例 J_\alpha(x) = \sum_{m=0}^\infty \frac{(-1)^m}{m! \Gamma (m + \alpha + 1)} {\left({ \frac{x}{2} }\right)}^{2m + \alpha} \text {,行内公式示例} Jα(x)=m=0m!Γ(m+α+1)(1)m(2x)2m+α,行内公式示例

3.4 Markdown


丰富的、轻量的标记语言

无序列表

  • 无序列表1
    • 无序列表1-1
      • 无序列表1-1-1
  • 无序列表2
  • 无序列表3

有序列表

  1. 1111
    1. 1111-1
      1. 1111-1-1
  2. 2222
  3. 3333

链接

百度 知乎


待办事项

  • task1
  • task2
  • task3

表格

ABc
2324111
2325112
2629113

注释

这里是注释

注释……


代码

– python

import pyecharts
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.globals import CurrentConfig
CurrentConfig.ONLINE_HOST = "https://cdn.jsdelivr.net/npm/echarts@latest/dist/"
# 离线环境使用,需要配置echarts.js静态资源服务
# CurrentConfig.ONLINE_HOST = "http://localhost:8080/echarts/"
from ipywidgets import interact, IntSlider, interactive, widgets, interact_manual
from IPython.display import display, HTML, IFrame

– sql

select * from a limit 10;

三、数据可视化

重点介绍基于自定义控件,利用常用的matplotlib、pyecharts等绘图包的交互式数据可视化简单示例。
交互式绘图在jupyter lab中会出现无法创建控件的情况,如遇到此类情况,可在jupyter notebook中运行。

1、matplotlib

官网:https://matplotlib.org/
优点:绘图方便,与pandas、numpy数据结构兼容性好。

缺点:无法和图本身进行交互。不像echarts有丰富的交互事件,像鼠标操作点击下钻、鼠标悬浮显示数据标签、点击图例切换图表展示等交互功能。

1.1 导入依赖库

主要用的依赖库有三个。
pandas:读取数据
matplotlib:绘图
ipywidgets:自定义控件

import pandas as pd
import matplotlib.pyplot as plt
from ipywidgets import interact, interactive, interact_manual, widgets, fixed, HBox
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # 中文显示
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['image.interpolation'] = 'nearest'

1.2 读取本地excel文件

具体读取文件的方式,需要根据自己文件类型来确定。具体参照pandas官网。
后期有时间会专门写一篇关于pandas处理文件的文档,供大家参考。

path = '/Users/xxxx/xxxxx.xlsx' # 替换为本地excel路径
df = pd.read_excel(path, sheet_name='Sheet1') # 指定sheet_name,及表哥存放的sheet
# 查看前5条数据
df.head(5)

1.3 交互式表格

col1_values = df['col1'].unique().tolist()
col2_values = df['col2'].unique().tolist()


@interact(col1=col1_values, col2=col2_values)
def fun(col1='A', col2='B'):
    temp_df = df.loc[(df['col1'] == col1) & (df['col2'] == col2), :].copy()
    pop_range = widgets.IntRangeSlider(
        value=[temp_df['value'].min(), temp_df['value'].max()],
        min=temp_df['value'].min(),
        max=temp_df['value'].max(),
        step=1,
        description='value/pop:',
        disabled=False,
        continuous_update=False,
        orientation='horizontal',
        readout=True,
        readout_format='d',
    )
    @interact(range_=pop_range)
    def ss(range_=10):
        new_df = temp_df.loc[(temp_df['value'] >= range_[0])
                             & (temp_df['value'] <= range_[1]), :].copy()
        desc = new_df['value'].describe()
        print(f"值介于{range_[0]}{range_[1]}之间的共有{int(desc['count'])}条记录。")
        return new_df

1.4 交互式绘图

@interact(col1=col1_values, col2=col2_values)
def plt_fun(col1='A', col2='B'):
    temp_df = df.loc[(df['col1'] == col1) & (df['col2'] == col2), :].copy()
    fig = plt.figure(figsize=(8,5))
    ax = fig.add_subplot(111)
    ax.plot(temp_df['col3'], temp_df['value'], marker='o')
    ax.set_title(f"{col1}{col2}值")
    ax.axvline(x=temp_df['value'].argmax(), 
               ymax=temp_df['value'].max()/ax.get_ylim()[1],
               ls='--', 
               linewidth=2,
               c='green')
    ax.set_xlim((-0.8,ax.get_xlim()[1]))
    ax.axhline(y=temp_df['value'].max(), 
               xmax=(temp_df['value'].argmax()+0.8)/(ax.get_xlim()[1]-ax.get_xlim()[0]),
               ls='--',
               linewidth=2,
               c='green')
    ax.annotate(f"Max Value \n {temp_df['value'].max()}人", 
                xy=(temp_df['value'].argmax(),temp_df['value'].max()), 
                xytext=(temp_df['value'].argmax()*1.4,temp_df['value'].max()*0.85), 
                arrowprops=dict(facecolor='black', shrink=0.05)) 

2、pyecharts

官网:https://pyecharts.org/#/zh-cn/
A Python Echarts Plotting Library
绘图时需要加载服务器echarts.js文件
离线环境使用,需要配置echarts.js静态资源服务

2.1 导入依赖

import pyecharts
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.globals import CurrentConfig
CurrentConfig.ONLINE_HOST = "https://cdn.jsdelivr.net/npm/echarts@latest/dist/"
# 离线环境使用,需要配置echarts.js静态资源服务
# CurrentConfig.ONLINE_HOST = "http://localhost:8080/echarts/"
from ipywidgets import interact, IntSlider, interactive, widgets, interact_manual
from IPython.display import display, HTML, IFrame

2.2 交互式绘图

@interact(col1=col1_values, col2=col2_values)
def fu(col1='A', col2='B'):
    temp_df = df.loc[(df['col1'] == zone) & (df['col2'] == date), :].copy()
    bar = Bar(init_opts=opts.InitOpts(height='350px', width='600px'))
    bar.set_global_opts(toolbox_opts=opts.ToolboxOpts(),
                        legend_opts=opts.LegendOpts(is_show=True))
    bar.add_xaxis(temp_df['col3'].values.tolist())
    bar.add_yaxis(zone, temp_df['value'].values.tolist(), 
                  markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_='average')]))
    bar.render()
    # 需要通过ipython将渲染好的html加载到jupyter中显示。无法直接显示
    display(IFrame('./render.html', width=700, height=400))

3、ipyleaflet

主要用来加载地图,并在地图上绘制矢量

3.1 导入依赖

from ipyleaflet import *
import geopandas as gpd

3.2 加载底图

center = [37.128, 114.588]
mapTypes=['Gaode Normal', 'Gaode Satellite', 'OpenTopoMap', 'Esri WorldStreetMap', 'Esri WorldImagery']
@interact(mapType=mapTypes, zoom = (1, 15,1))
def fun(mapType='Gaode Normal', zoom=4):
    if mapType == 'Gaode Normal':
        basemap = basemaps.Gaode.Normal
    elif mapType == 'Gaode Satellite':
        basemap = basemaps.Gaode.Satellite
    elif mapType == 'OpenTopoMap':
        basemap = basemaps.OpenTopoMap
    elif mapType == 'Esri WorldStreetMap':
        basemap = basemaps.Esri.WorldStreetMap
    elif mapType == 'Esri WorldImagery':
        basemap = basemaps.Esri.WorldImagery
    m = Map(basemap=basemap, center=center, zoom=zoom)
    display(m)

3.3 地图卷帘功能

需求:实现地图卷帘功能,左侧高德影响、右侧高的标准地图

m = Map(center=center, zoom=6, dragging=False)
left = basemap_to_tiles(basemaps.Gaode.Satellite)
right = basemap_to_tiles(basemaps.Gaode.Normal)
control = SplitMapControl(left_layer=left, right_layer=right)
m.add_control(control)
m

3.4 叠加GeoDataFrame

需求:在leaflet底图上加在GeoDataFrame数据

countries = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
m = Map(center=(52.3,8.0), zoom = 3, basemap= basemaps.Esri.WorldTopoMap)

geo_data = GeoData(geo_dataframe = countries,
                   style={'color': 'black', 'fillColor': '#3366cc', 'opacity':0.05, 'weight':1.9, 'dashArray':'2', 'fillOpacity':0.6},
                   hover_style={'fillColor': 'red' , 'fillOpacity': 0.2},
                   name = 'Countries')
marker1 = Marker(name='marker1', location=(48, -2))
marker2 = Marker(name='marker2', location=(50, 0))
marker3 = Marker(name='marker3', location=(52, 2))
m.add_layer(marker1)
m.add_layer(marker2)
m.add_layer(marker3)
m.add_layer(geo_data)
m.add_control(LayersControl(position='topright'))
m

4、其他绘图库

  1. boken:一个用于Python编程语言的交互式可视化库,用于创建各种类型的图表和可视化效果。它的目标是帮助用户通过简单的代码生成具有交互性的高质量图形。
  2. hvplot:一个基于 Bokeh 的高级可视化库,用于创建交互式、声明式的图表和可视化效果。它提供了一个简单而直观的 API,使得使用 Python 进行数据可视化变得更加容易和灵活。
  3. Seaborn:Seaborn是基于Matplotlib的高级绘图库,专注于统计数据可视化。它提供了更简单的API和更美观的默认样式,使得绘制统计图形更加容易。
  4. Plotly:Plotly是一个交互式绘图库,可以生成漂亮且交互式的图形。它支持多种类型的图形,包括线图、散点图、柱状图、3D图等,并提供在线编辑器和分享功能。

四、总结

  1. 以上的内容仅仅是python、jupyter的冰山一角,整体内容不系统、不全面,还有很多内容需要优化、细化、延伸,如果想要深入了解jupyter以及各个绘图库的内容,建议去官方文档学习。
  2. 个人在工作中也仅仅涉及到部分的内容,有些观点难免会有偏驳,大家取其精华、去其糟粕即可。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值