目录
一、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=0∑∞m!Γ(m+α+1)(−1)m(2x)2m+α,行内公式示例
3.4 Markdown
丰富的、轻量的标记语言
无序列表
- 无序列表1
- 无序列表1-1
- 无序列表1-1-1
- 无序列表1-1
- 无序列表2
- 无序列表3
有序列表
- 1111
- 1111-1
- 1111-1-1
- 1111-1
- 2222
- 3333
链接
待办事项
- task1
- task2
- task3
表格
A | B | c |
---|---|---|
23 | 24 | 111 |
23 | 25 | 112 |
26 | 29 | 113 |
注释
这里是注释
注释……
代码
– 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、其他绘图库
- boken:一个用于Python编程语言的交互式可视化库,用于创建各种类型的图表和可视化效果。它的目标是帮助用户通过简单的代码生成具有交互性的高质量图形。
- hvplot:一个基于 Bokeh 的高级可视化库,用于创建交互式、声明式的图表和可视化效果。它提供了一个简单而直观的 API,使得使用 Python 进行数据可视化变得更加容易和灵活。
- Seaborn:Seaborn是基于Matplotlib的高级绘图库,专注于统计数据可视化。它提供了更简单的API和更美观的默认样式,使得绘制统计图形更加容易。
- Plotly:Plotly是一个交互式绘图库,可以生成漂亮且交互式的图形。它支持多种类型的图形,包括线图、散点图、柱状图、3D图等,并提供在线编辑器和分享功能。
四、总结
- 以上的内容仅仅是python、jupyter的冰山一角,整体内容不系统、不全面,还有很多内容需要优化、细化、延伸,如果想要深入了解jupyter以及各个绘图库的内容,建议去官方文档学习。
- 个人在工作中也仅仅涉及到部分的内容,有些观点难免会有偏驳,大家取其精华、去其糟粕即可。