Python
闪亮的Python:入门指南轻松进行数据可视化

闪亮的Python:入门指南轻松进行数据可视化

MoeNagy Dev

什么是闪亮的Python?

闪亮的Python是一种使用Python编程语言构建交互式Web应用程序的强大框架。它提供了一套工具和组件,允许开发人员以最小的努力创建动态的、数据驱动的Web应用程序。

闪亮的Python经常与其他流行的Python Web框架(如Flask和Django)进行比较,但它通过专注于构建高度交互和响应式用户界面(UI)用于数据可视化、分析和探索而脱颖而出。

使用闪亮的Python进行Web开发的优势

  1. 交互式UI:闪亮的Python使得创建交互式用户界面变得容易,它可以根据用户输入进行实时更新,提供流畅而吸引人的用户体验。

  2. 快速原型:使用闪亮的Python,您可以快速构建和迭代Web应用程序,从而实现更快的开发和创意测试。

  3. 集成Python库:闪亮的Python允许您利用Python的广泛生态系统中用于数据处理、分析和可视化的各种库和模块,使其成为构建数据驱动应用程序的强大工具。

  4. 响应式编程:闪亮的Python的响应式编程模型简化了应用程序状态的管理以及用户界面和服务器逻辑之间的协调。

  5. 部署和托管:闪亮的Python应用程序可以轻松部署到各种托管平台,包括云服务,使其成为Web开发的多功能选择。

使用闪亮的Python入门

安装闪亮的Python及其依赖项

要开始使用闪亮的Python,您需要在系统上安装Python。闪亮的Python是基于Dash框架构建的,因此您还需要安装必要的依赖项。

您可以使用pip,Python的包安装程序,来安装闪亮的Python及其依赖项:

pip install shiny

这将安装闪亮的Python及其所需的依赖项,包括Dash、Flask和Plotly。

设置新的闪亮的Python项目

安装闪亮的Python后,您可以通过设置一个目录来创建一个新项目。在此目录中,您通常会有以下结构:

my_shiny_app/
├── app.py
├── requirements.txt
└── assets/
    ├── styles.css
    └── images/
        └── logo.png

app.py文件是闪亮的Python应用程序的主要入口点,您将在其中定义用户界面和服务器逻辑。requirements.txt文件列出了应用程序所需的Python包,这些包可用于部署。assets目录用于存储应用程序可能需要的任何静态文件,例如CSS样式表和图像。

了解闪亮的Python目录结构

闪亮的Python目录结构遵循其他Python Web框架的类似模式,但还包括一些与闪亮的Python特定的附加组件:

  • app.py:这是闪亮的Python应用程序的主要入口点,您在其中定义用户界面和服务器逻辑。
  • ui.py:此文件包含用户界面的定义,包括布局、输入和输出。
  • server.py:此文件定义服务器端逻辑,例如处理用户输入和更新应用程序状态。
  • callbacks.py:此文件存储将用户界面与服务器逻辑连接起来的回调函数。
  • models.py:如果您的应用程序使用数据模型或数据库交互,可以在此文件中定义它们。
  • utils.py:此文件可以包含应用程序中使用的任何辅助函数或工具。
  • assets/:此目录存储应用程序可能需要的任何静态文件,例如CSS、JavaScript和图像。

ui.pyserver.pycallbacks.py文件之间的责任分离有助于保持闪亮的Python应用程序的组织结构和可维护性,使其在复杂性增加时更易于管理。

构建一个简单的闪亮的Python应用程序

让我们从构建一个简单的闪亮的Python应用程序开始,该应用程序允许用户输入一个数字并显示该数字的平方。

使用闪亮的Python组件创建用户界面(UI)

ui.py文件中,我们将为应用程序定义用户界面:

from shiny import ui
 
app_ui = ui.page_fluid(
    ui.layout_sidebar(
        ui.panel_sidebar(
            ui.input_numeric("number", "输入一个数字", value=0, min_value=0, max_value=100)
        ),
        ui.panel_main(
            ui.output_text_verbatim("output_text")
        )
    )
)

在这个示例中,我们使用ui.page_fluid()函数创建一个自适应宽度的页面布局。在页面中,我们使用ui.layout_sidebar()创建侧边栏和主面板布局。

侧边栏面板包含使用ui.input_numeric()创建的数字输入字段,用户可以在其中输入一个数字。主面板包含使用ui.output_text_verbatim()创建的输出文本区域,我们将在其中显示用户输入的数字的平方。

定义服务器逻辑和处理用户交互

现在,让我们创建server.py文件来定义服务器端逻辑:

from shiny import App, Inputs, Outputs, Session
 
def server(input, output, session):
    @Outputs("output_text")
    def square_number():
        number = input.number()
        return f"{number}的平方是{number ** 2}"
 
app = App(server, ui)

server() 函数中,我们定义了一个响应式表达式 square_number(),它接收用户输入的数字,计算其平方,并以字符串形式返回结果。Outputs() 装饰器用于将此服务器函数与用户界面中的 output_text 输出进行连接。

渲染应用并在本地运行

要运行 Shiny Python 应用程序,我们需要创建一个 app.py 文件,将用户界面和服务器逻辑组合在一起:

from shiny import App, get_app, run_app
from ui import app_ui
from server import server
 
app = App(app_ui, server)
 
if __name__ == "__main__":
    run_app(app)

在这个 app.py 文件中,我们从各自的文件中导入 app_uiserver 的定义,然后通过将它们传递给 App() 构造函数来创建一个新的 App 实例。

最后,我们调用 run_app() 函数来启动 Shiny Python 应用程序,并使其可以进行本地开发。

您可以通过执行 app.py 文件来运行应用程序:

python app.py

这将启动 Shiny Python 应用程序,并在您的默认 Web 浏览器中打开它,在那里您可以与应用程序交互,并查看所输入数字的平方。

Shiny Python UI 组件

Shiny Python 提供了许多用户界面 (UI) 组件,您可以使用这些组件来构建 Web 应用程序。这些组件包括输入、输出、布局等等。

可用 UI 组件的概述

一些常用的 Shiny Python UI 组件包括:

  • 输入ui.input_text()ui.input_numeric()ui.input_slider()ui.input_checkbox()ui.input_date() 等等。
  • 输出ui.output_text()ui.output_table()ui.output_plot()ui.output_download() 等等。
  • 布局ui.layout_sidebar()ui.layout_grid()ui.layout_row()ui.layout_column() 等等。
  • 容器ui.panel_sidebar()ui.panel_main()ui.tab_panel()ui.accordion_panel() 等等。

每个组件都有其自己的属性和选项,您可以使用这些属性和选项来自定义应用程序的外观和行为。

自定义 UI 组件的外观和行为

您可以通过设置各种属性来自定义 Shiny Python UI 组件的外观和行为。例如,对于 ui.input_text() 组件,您可以设置 labelvalueplaceholder 和其他属性来控制输入字段的外观和功能。

下面是一个自定义文本输入字段外观的示例:

ui.input_text(
    "name",
    "输入您的姓名",
    value="张三",
    placeholder="在此输入您的姓名",
    style={"width": "300px", "font-size": "16px"}
)

在这个示例中,我们设置了 ui.input_text() 组件的 labelvalueplaceholderstyle 属性来自定义其外观。

对复杂应用程序进行组织和结构化的 UI

随着 Shiny Python 应用程序的复杂性增加,重要的是以使之易于管理和维护的方式组织和结构化用户界面。

一种常见的方法是使用布局组件,如 ui.layout_sidebar()ui.layout_grid()ui.tab_panel(),来创建一个结构良好和直观的 UI。您还可以使用容器组件,如 ui.panel_sidebar()ui.panel_main(),将相关的 UI 元素分组在一起。

下面是一个更复杂的 UI 结构示例:

app_ui = ui.page_fluid(
    ui.layout_sidebar(
        ui.panel_sidebar(
            ui.input_text("name", "输入您的姓名"),
            ui.input_numeric("age", "输入您的年龄", min_value=0, max_value=120)
        ),
        ui.panel_main(
            ui.tab_panel(
                ui.tab("概览", ui.output_text_verbatim("overview_text")),
                ui.tab("图表",
                    ui.layout_grid(
                        ui.output_plot("plot1"),
                        ui.output_plot("plot2")
                    )
                ),
                ui.tab("下载", ui.output_download("download_button"))
            )
        )
    )
)

在这个示例中,我们使用了包含输入字段的侧边栏面板和包含选项卡布局的主面板。选项卡布局包含三个选项卡:"概览"、"图表" 和 "下载",每个选项卡都有自己的一组输出。

通过以这种方式组织 UI,您可以创建复杂而直观的应用程序,易于导航和维护。

Shiny Python 服务器函数

在 Shiny Python 应用程序中,服务器端逻辑是在 server.py 文件中定义的。这是您处理用户输入、执行数据处理和分析,并更新应用程序状态的地方。

处理用户输入并更新应用程序状态

在服务器端逻辑中,您可以定义响应用户输入并相应更新应用程序状态的函数。这些函数通常使用 Inputs() 装饰器进行修饰,将它们连接到用户界面中相应的输入组件。

下面是一个处理文本输入并更新应用程序状态的服务器函数示例:

from shiny import Inputs, Outputs
 
def server(input, output, session):
    @Inputs("name")
    def greet_user():
        name = input.name()
        return f"你好,{name}!"
 
    @Outputs("greeting")
    def display_greeting():
        return greet_user()

在这个示例中,greet_user() 函数被 Inputs("name") 修饰,这意味着它将在用户更改 "name" 输入的值时被调用。该函数接收用户的姓名,将其与一个问候语连接起来,并返回结果。

display_greeting() 函数被 Outputs("greeting") 修饰,这意味着它的返回值将用于更新用户界面中的 "greeting" 输出。

在服务器上执行数据处理和分析

Shiny Python允许您将应用程序与各种Python库和模块集成,用于数据处理、分析和可视化。这可以在服务器端逻辑中完成。

这是一个执行简单数据分析并生成图表的服务器函数的示例:

import pandas as pd
from shiny import Inputs, Outputs, session
 
def server(input, output, session):
    @Inputs("dataset")
    def analyze_dataset(dataset):
        df = pd.read_csv(dataset)
        summary = df.describe()
        return summary
 
    @Outputs("dataset_summary")
    def display_dataset_summary():
        summary = analyze_dataset(session.userData.get("dataset", None))
        return summary.to_html()
 
    @Outputs("dataset_plot")
    def plot_dataset():
        df = pd.read_csv(session.userData.get("dataset", None))
        return df.plot()

在这个例子中,analyze_dataset函数用于分析数据集,并返回一个数据集的摘要。display_dataset_summary函数和plot_dataset函数分别用于显示数据集的摘要和绘制数据集的图表。

数据结构

列表

列表是Python中最基本的数据结构之一。它们是有序的项目集合,可以是不同的数据类型。下面是一个例子:

fruits = ['apple', 'banana', 'cherry']
print(fruits)  # 输出:['apple', 'banana', 'cherry']

你可以使用索引访问列表中的单个元素,索引从0开始:

print(fruits[0])  # 输出:'apple'
print(fruits[1])  # 输出:'banana'

你也可以修改列表中的元素:

fruits[1] = 'orange'
print(fruits)  # 输出:['apple', 'orange', 'cherry']

列表有许多内置方法,可以执行各种操作,如添加、删除和排序元素。

元组

元组与列表类似,但是它们是不可变的,意味着在创建后不能修改它们的元素。元组使用圆括号而不是方括号来定义:

point = (3, 4)
print(point)  # 输出:(3, 4)

元组可以在你想要存储一组固定的值时很有用,例如一个点的坐标或一个矩形的尺寸。

字典

字典是无序的键值对集合。它们允许你使用一个唯一的键来快速存储和检索数据。下面是一个例子:

person = {
    'name': 'John Doe',
    'age': 30,
    'city': 'New York'
}
print(person['name'])  # 输出:'John Doe'
print(person['age'])  # 输出:30

你可以添加、修改和删除字典中的键值对:

person['email'] = 'john.doe@example.com'
person['age'] = 31
del person['city']
print(person)  # 输出:{'name': 'John Doe', 'age': 31, 'email': 'john.doe@example.com'}

字典非常灵活,可以用来表示各种数据结构,从简单的键值存储到更复杂的嵌套结构。

集合

集合是无序的唯一元素集合。它们在对数据集合执行并集、交集和差集等操作时非常有用。下面是一个例子:

colors = {'red', 'green', 'blue'}
print(colors)  # 输出:{'red', 'green', 'blue'}
 
# 向集合添加一个元素
colors.add('yellow')
print(colors)  # 输出:{'red', 'green', 'blue', 'yellow'}
 
# 从集合中删除一个元素
colors.remove('green')
print(colors)  # 输出:{'red', 'blue', 'yellow'}

集合特别适用于从集合中删除重复值或执行基于集合的操作。

控制流程

条件语句

Python中的条件语句允许您根据特定条件执行不同的代码。最常见的条件语句是if-elif-else语句:

x = 10
if x > 0:
    print("x是正数")
elif x < 0:
    print("x是负数")
else:
    print("x是零")

你还可以使用三元运算符,它提供了一种更简洁的编写简单if-else语句的方法:

age = 18
is_adult = "是" if age >= 18 else "否"
print(is_adult)  # 输出:"是"

循环

Python中的循环允许您重复执行一段代码。最常见的循环类型是for循环和while循环。

for循环用于遍历序列(如列表、元组或字符串):

fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
    print(fruit)

while循环用于在某个条件为真时执行一段代码块:

count = 0
while count < 5:
    print(count)
    count += 1

你还可以使用breakcontinue语句来控制循环的流程:

for i in range(10):
    if i == 5:
        break  # 当i等于5时退出循环
    if i % 2 == 0:
        continue  # 当i为偶数时跳过当前迭代
    print(i)  # 输出:1, 3, 7, 9

函数

Python中的函数是可重复使用的代码块,用于执行特定的任务。它们可以接受参数并返回值。下面是一个简单的例子:

def greet(name):
    print(f"你好,{name}!")
 
greet("Alice")  # 输出:"你好,Alice!"

你还可以定义具有默认参数和可变长度参数的函数:

def calculate_area(length, width, height=1):
    return length * width * height
 
print(calculate_area(2, 3))  # 输出:6
print(calculate_area(2, 3, 4))  # 输出:24

函数还可以是递归的,也就是说它们可以调用自身来解决一个问题:

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)
 
print(factorial(5))  # 输出:120

模块和包

Python的广泛标准库和第三方包提供了各种功能,您可以在程序中使用它们。要使用一个模块或包,您需要导入它。

下面是导入math模块并使用其函数的示例:

import math
 
print(math.pi)  # 输出:3.141592653589793
print(math.sqrt(16))  # 输出:4.0

您还可以从模块中导入特定的函数或属性:

---
title: "Markdown文件"
language: "zh"
---
 
从数学库导入pi和sqrt函数
 
打印pi值,输出为:3.141592653589793
打印对16开平方根的值,输出为:4.0
 
此外,您可以创建自己的模块和包来组织代码并使其更可重用。
 
## 结论
在本教程中,您学习了Python中的各种数据结构、控制流语句、函数和模块。这些是任何Python程序的基本构建块。有了这些知识,您可以开始编写更复杂、更强大的应用程序。记住,成为熟练的Python程序员的关键是练习、实验和持续学习。祝你好运!
 
[![MoeNagy Dev](https://raw.githubusercontent.com/lynn-mikami/Images/main/moenagy-dev.png)](/)