萝卜大杂烩 | Polars ,最强Pandas平替(内含实操代码,建议收藏!)

本文来源公众号“萝卜大杂烩”,仅用于学术分享,侵权删,干货满满。

原文链接:Polars (最强Pandas平替)

本文章转自:数据studio

1 介绍

Polars是一个用于操作结构化数据的高性能DataFrame库,可以说是平替pandas最有潜质的包。当然pandas目前作为Python数据分析的核心工具来说还是最强的,完全值得我们深入学习。Polars其核心部分是用Rust编写的,但该库也提供了Python接口。它的主要特点包括:

  • 快速: Polars是从零开始编写的,紧密与机器结合,没有外部依赖。

  • I/O: 对所有常见数据存储层提供一流支持:本地、云存储和数据库。

  • 易于使用: 以原始意图编写查询。Polars 在内部会使用其查询优化器确定执行最有效的方式。

  • 离线处理: Polars支持通过其流式API进行离线数据转换。这使您能够处理结果,而无需同时将所有数据存储在内存中。

  • 并行处理: Polars通过在可用的CPU核心之间分配工作负载,充分利用计算机性能,而无需额外配置。

  • 矢量化查询引擎: Polars使用 Apache Arrow,一种列式数据格式,以矢量化方式处理查询。它使用 SIMD 来优化CPU使用。

User guide: https://pola-rs.github.io/polars/user-guide/
API reference: https://pola-rs.github.io/polars/py-polars/html/reference/io.html

Polars 的目标是提供一个闪电般快速的 DataFrame 库,具有以下特点:

  • 利用计算机上所有可用的核心。

  • 通过优化查询来减少不必要的工作/内存分配。

  • 处理比可用 RAM 更大得多的数据集。

  • 具有一致且可预测的 API。

  • 具有严格的模式(在运行查询之前应该知道数据类型)。

Polars 是用 Rust 编写的,这使得它具有 C/C++ 性能,并允许它完全控制查询引擎中的性能关键部分。因此,Polars 为此付出了很大的努力:

  • 减少冗余的复制。

  • 高效地遍历内存缓存。

  • 在并行性中最小化争用。

  • 以块处理数据。

  • 重用内存分配。

2 基础

2.1 Series & DataFrames

Series 是一个一维数据结构。在一个 Series 中,所有元素都具有相同的数据类型(例如,整数、字符串)。下面的片段展示了如何创建一个简单的带有名称的 Series 对象。

import polars as pl
import numpy as nps = pl.Series("a", [1, 2, 3, 4, 5])
print(s)
s = pl.Series("a", [1, 2, 3, 4, 5])
print(s.min())
print(s.max())
s = pl.Series("a", ["polar", "bear", "arctic", "polar fox", "polar bear"])
s2 = s.str.replace("polar", "pola")
print(s2)
from datetime import datestart = date(2001, 1, 1)
stop = date(2001, 1, 9)
s = pl.date_range(start, stop, interval="2d", eager=True)
print(s.dt.day())

DataFrame 是一个二维数据结构,由一个或多个 Series 支持,可以看作是对一系列(例如列表)Series的抽象。在 DataFrame 上可以执行的操作与在 SQL 查询中执行的操作非常相似。您可以进行 GROUP BY、JOIN、PIVOT,还可以定义自定义函数。

from datetime import datetimedf = pl.DataFrame({"integer": [1, 2, 3, 4, 5],"date": [datetime(2022, 1, 1),datetime(2022, 1, 2),datetime(2022, 1, 3),datetime(2022, 1, 4),datetime(2022, 1, 5),],"float": [4.0, 5.0, 6.0, 7.0, 8.0],}
)print(df)
print(df.head(3))
print(df.describe())

2.2 Reading & writing

import polars as pl
from datetime import datetimedf = pl.DataFrame({"integer": [1, 2, 3],"date": [datetime(2022, 1, 1),datetime(2022, 1, 2),datetime(2022, 1, 3),],"float": [4.0, 5.0, 6.0],}
)print(df)
df.write_csv("output.csv")
df_csv = pl.read_csv("output.csv")
print(df_csv)
df_csv = pl.read_csv("output.csv", try_parse_dates=True)
print(df_csv)

2.3 Expressions

import polars as pl# 创建一个简单的 DataFrame
data = {'column1': [1, 2, 3],'column2': ['a', 'b', 'c']}
df = pl.DataFrame(data)# 使用表达式进行选择
selected_df = df.select(['column1'])# 使用表达式进行过滤
filtered_df = df.filter(df['column1'] > 1)
selected_df
filtered_df

3 拼接

df = pl.DataFrame({"a": np.arange(0, 8),"b": np.random.rand(8),"d": [1, 2.0, np.NaN, np.NaN, 0, -5, -42, None],}
)df2 = pl.DataFrame({"x": np.arange(0, 8),"y": ["A", "A", "A", "B", "B", "C", "X", "X"],}
)
joined = df.join(df2, left_on="a", right_on="x")
print(joined)
stacked = df.hstack(df2)
print(stacked)

4 概念

4.1 Data types


Polars 完全基于 Arrow 数据类型,并由 Arrow 内存数组支持。这使得数据处理在缓存效率和跨进程通信方面得到良好支持。大多数数据类型都与 Arrow 的实现完全一致,但有一些例外,如Utf8(实际上是 LargeUtf8)、Categorical 和 Object(支持有限)等。以下是一些数据类型:

4.2 Contexts

Polars 已经开发了自己的领域特定语言(DSL)用于数据转换。该语言非常易于使用,允许进行复杂的查询,同时保持人类可读性。该语言的两个核心组件是上下文(Contexts)和表达式(Expressions),我们将在下一部分介绍表达式。

正如名称所示,上下文指的是需要评估表达式的上下文。有三个主要的上下文 [^1^]:

  1. 选择(Selection): df.select([..])df.with_columns([..])

  2. 过滤(Filtering): df.filter()

  3. 分组/聚合(Group by / Aggregation): df.group_by(..).agg([..])

df = pl.DataFrame({"nrs": [1, 2, 3, None, 5],"names": ["foo", "ham", "spam", "egg", None],"random": np.random.rand(5),"groups": ["A", "A", "B", "C", "B"],}
)
print(df)
# 基于df 进行计算,得到新的表格
out = df.select(pl.sum("nrs"), # nrs的和pl.col("names").sort(), # names排序后的结果pl.col("names").first().alias("first name"), # names第一个值(pl.mean("nrs") * 10).alias("10xnrs"), # nrs的均值 * 10
)
print(out)
# 原始df 新增列
df = df.with_columns(pl.sum("nrs").alias("nrs_sum"),pl.col("random").count().alias("count"),
)
print(df)
out = df.filter(pl.col("nrs") > 2)
print(out)
out = df.group_by("groups").agg(pl.sum("nrs"),  # sum nrs by groupspl.col("random").count().alias("count"),  # count group members# sum random where name != nullpl.col("random").filter(pl.col("names").is_not_null()).sum().name.suffix("_sum"),pl.col("names").reverse().alias("reversed names"),
)
print(out)

4.3 Lazy / eager API

Polars支持两种操作模式:lazy(延迟)和eager(即时)。在eager API中,查询会立即执行,而在lazy API中,查询只有在“需要”时才会被评估。

!wget https://mirror.coggle.club/dataset/heart.csv
!head heart.csv
df = pl.read_csv("heart.csv")
df_small = df.filter(pl.col("age") > 5)
df_agg = df_small.group_by("sex").agg(pl.col("chol").mean())
print(df_agg)
q = (pl.scan_csv("heart.csv").filter(pl.col("age") > 5).group_by("sex").agg(pl.col("chol").mean())
)
# 生成了计算逻辑df = q.collect() # 真正计算
print(df)

4.4 Streaming API

https://pola-rs.github.io/polars/user-guide/concepts/streaming/

Lazy API的另一个额外好处是它允许以流式方式执行查询。与一次性处理所有数据不同,Polars可以按批执行查询,使您能够处理大于内存的数据集。

q = (pl.scan_csv("heart.csv").filter(pl.col("age") > 5).group_by("sex").agg(pl.col("chol").mean())
)df = q.collect(streaming=True)
print(df)

5 表达式

5.1 Basic operators

df = pl.DataFrame({"nrs": [1, 2, 3, None, 5],"names": ["foo", "ham", "spam", "egg", None],"random": np.random.rand(5),"groups": ["A", "A", "B", "C", "B"],}
)
print(df)
df_numerical = df.select((pl.col("nrs") + 5).alias("nrs + 5"),(pl.col("nrs") - 5).alias("nrs - 5"),(pl.col("nrs") * pl.col("random")).alias("nrs * random"),(pl.col("nrs") / pl.col("random")).alias("nrs / random"),
)
print(df_numerical)
df_logical = df.select((pl.col("nrs") > 1).alias("nrs > 1"),(pl.col("random") <= 0.5).alias("random <= .5"),(pl.col("nrs") != 1).alias("nrs != 1"),(pl.col("nrs") == 1).alias("nrs == 1"),((pl.col("random") <= 0.5) & (pl.col("nrs") > 1)).alias("and_expr"),  # and((pl.col("random") <= 0.5) | (pl.col("nrs") > 1)).alias("or_expr"),  # or
)
print(df_logical)

5.2 Column selections

from datetime import date, datetimedf = pl.DataFrame({"id": [9, 4, 2],"place": ["Mars", "Earth", "Saturn"],"date": pl.date_range(date(2022, 1, 1), date(2022, 1, 3), "1d", eager=True),"sales": [33.4, 2142134.1, 44.7],"has_people": [False, True, False],"logged_at": pl.datetime_range(datetime(2022, 12, 1), datetime(2022, 12, 1, 0, 0, 2), "1s", eager=True),}
).with_row_count("rn")
print(df)
out = df.select(pl.col("*"))# Is equivalent to
out = df.select(pl.all())
print(out)
out = df.select(pl.col("*").exclude("logged_at", "rn"))
print(out)
out = df.select(pl.col("date", "logged_at").dt.to_string("%Y-%h-%d"))
print(out)
out = df.select(pl.col("^.*(as|sa).*$"))
print(out)
out = df.select(pl.col(pl.Int64, pl.UInt32, pl.Boolean).n_unique())
print(out)
import polars.selectors as cs
out = df.select(cs.numeric() - cs.first())
print(out)
out = df.select(cs.contains("rn"), cs.matches(".*_.*"))
print(out)

5.3 Functions

df = pl.DataFrame({"nrs": [1, 2, 3, None, 5],"names": ["foo", "ham", "spam", "egg", "spam"],"random": np.random.rand(5),"groups": ["A", "A", "B", "C", "B"],}
)
print(df)
df_samename = df.select(pl.col("nrs") + 5)
print(df_samename)
df_alias = df.select((pl.col("nrs") + 5).alias("nrs + 5"),(pl.col("nrs") - 5).alias("nrs - 5"),
)
print(df_alias)
df_alias = df.select(pl.col("names").n_unique().alias("unique"),pl.approx_n_unique("names").alias("unique_approx"),
)
print(df_alias)
df_conditional = df.select(pl.col("nrs"),pl.when(pl.col("nrs") > 2).then(pl.lit(True)).otherwise(pl.lit(False)).alias("conditional"),
)
print(df_conditional)

6 转换

类型转换(Casting)将列的底层 DataType 转换为新的数据类型。Polars 使用 Arrow 在内存中管理数据,并依赖于 Rust 实现中的计算核心 来执行转换。类型转换通过 cast() 方法实现。

cast 方法包括一个 strict 参数,该参数确定当 Polars 遇到无法从源 DataType 转换为目标 DataType 的值时的行为。默认情况下,strict=True,这意味着 Polars 将引发错误,通知用户转换失败,并提供无法转换的值的详细信息。另一方面,如果 strict=False,无法转换为目标 DataType 的任何值都将悄悄地转换为 null

df = pl.DataFrame({"integers": [1, 2, 3, 4, 5],"big_integers": [1, 10000002, 3, 10000004, 10000005],"floats": [4.0, 5.0, 6.0, 7.0, 8.0],"floats_with_decimal": [4.532, 5.5, 6.5, 7.5, 8.5],}
)print(df)
out = df.select(pl.col("integers").cast(pl.Float32).alias("integers_as_floats"),pl.col("floats").cast(pl.Int32).alias("floats_as_integers"),pl.col("floats_with_decimal").cast(pl.Int32).alias("floats_with_decimal_as_integers"),
)
print(out)
out = df.select(pl.col("integers").cast(pl.Int16).alias("integers_smallfootprint"),pl.col("floats").cast(pl.Float32).alias("floats_smallfootprint"),
)
print(out)
df = pl.DataFrame({"integers": [1, 2, 3, 4, 5],"float": [4.0, 5.03, 6.0, 7.0, 8.0],"floats_as_string": ["4.0", "5.0", "6.0", "7.0", "8.0"],}
)out = df.select(pl.col("integers").cast(pl.Utf8),pl.col("float").cast(pl.Utf8),pl.col("floats_as_string").cast(pl.Float64),
)
print(out)
df = pl.DataFrame({"integers": [-1, 0, 2, 3, 4],"floats": [0.0, 1.0, 2.0, 3.0, 4.0],"bools": [True, False, True, False, True],}
)out = df.select(pl.col("integers").cast(pl.Boolean), pl.col("floats").cast(pl.Boolean))
print(out)
from datetime import date, datetimedf = pl.DataFrame({"date": pl.date_range(date(2022, 1, 1), date(2022, 1, 5), eager=True),"datetime": pl.datetime_range(datetime(2022, 1, 1), datetime(2022, 1, 5), eager=True),}
)out = df.select(pl.col("date").cast(pl.Int64), pl.col("datetime").cast(pl.Int64))
print(out)

6.1 Strings

df = pl.DataFrame({"animal": ["Crab", "cat and dog", "rab$bit", None]})out = df.select(pl.col("animal").str.len_bytes().alias("byte_count"),pl.col("animal").str.len_chars().alias("letter_count"),
)
print(out)
out = df.select(pl.col("animal"),pl.col("animal").str.contains("cat|bit").alias("regex"),pl.col("animal").str.contains("rab$", literal=True).alias("literal"),pl.col("animal").str.starts_with("rab").alias("starts_with"),pl.col("animal").str.ends_with("dog").alias("ends_with"),
)
print(out)

6.2 Aggregation

https://pola-rs.github.io/polars/user-guide/expressions/aggregation/

df = pl.read_csv("heart.csv")
print(df)
q = (df.lazy().group_by("sex").agg(pl.count(),pl.col("cp"),pl.first("caa"),).sort("count", descending=True).limit(5)
)df = q.collect()
print(df)
q = (df.lazy().group_by("sex").agg((pl.col("cp") == 1).sum().alias("anti"),(pl.col("cp") == 2).sum().alias("pro"),).sort("pro", descending=True).limit(5)
)df = q.collect()
print(df)

7 缺失值

让我们看一下缺失值如何处理。

df = pl.DataFrame({"value": [1, None],},
)
print(df)
null_count_df = df.null_count()
print(null_count_df)
df = pl.DataFrame({"col1": [1, 2, 3],"col2": [1, None, 3],},
)
print(df)
fill_literal_df = df.with_columns(pl.col("col2").fill_null(pl.lit(2)),
)
print(fill_literal_df)
fill_forward_df = df.with_columns(pl.col("col2").fill_null(strategy="forward"),
)
print(fill_forward_df)
fill_median_df = df.with_columns(pl.col("col2").fill_null(pl.median("col2")),
)
print(fill_median_df)
fill_interpolation_df = df.with_columns(pl.col("col2").interpolate(),
)
print(fill_interpolation_df)

7.1 Window functions

https://pola-rs.github.io/polars/user-guide/expressions/window/

!wget https://cdn.coggle.club/Pokemon.csv
!head Pokemon.csv
# then let's load some csv data with information about pokemon
df = pl.read_csv("Pokemon.csv")
print(df.head())
out = df.select("Type 1","Type 2",pl.col("Attack").mean().over("Type 1").alias("avg_attack_by_type"),pl.col("Defense").mean().over(["Type 1", "Type 2"]).alias("avg_defense_by_type_combination"),pl.col("Attack").mean().alias("avg_attack"),
)
print(out)
filtered = df.filter(pl.col("Type 2") == "Psychic").select("Name","Type 1","Speed",
)
print(filtered)
out = filtered.with_columns(pl.col(["Name", "Speed"]).sort_by("Speed", descending=True).over("Type 1"),
)
print(out)

7.2 Lists and Arrays

weather = pl.DataFrame({"station": ["Station " + str(x) for x in range(1, 6)],"temperatures": ["20 5 5 E1 7 13 19 9 6 20","18 8 16 11 23 E2 8 E2 E2 E2 90 70 40","19 24 E9 16 6 12 10 22","E2 E0 15 7 8 10 E1 24 17 13 6","14 8 E0 16 22 24 E1",],}
)
print(weather)
out = weather.with_columns(pl.col("temperatures").str.split(" "))
print(out)
out = weather.with_columns(pl.col("temperatures").str.split(" ")).explode("temperatures"
)
print(out)
out = weather.with_columns(pl.col("temperatures").str.split(" ")).with_columns(pl.col("temperatures").list.head(3).alias("top3"),pl.col("temperatures").list.slice(-3, 3).alias("bottom_3"),pl.col("temperatures").list.len().alias("obs"),
)
print(out)

8 变形

8.1 Joins

df_customers = pl.DataFrame({"customer_id": [1, 2, 3],"name": ["Alice", "Bob", "Charlie"],}
)
print(df_customers)
df_orders = pl.DataFrame({"order_id": ["a", "b", "c"],"customer_id": [1, 2, 2],"amount": [100, 200, 300],}
)
print(df_orders)
df = df_customers.join(df_orders, on="customer_id", how="inner")
print(df)df = df_customers.join(df_orders, on="customer_id", how="left")
print(df)df = df_customers.join(df_orders, on="customer_id", how="outer")
print(df)df = df_customers.join(df_orders, on="customer_id", how="cross")
print(df)
df_cars = pl.DataFrame({"id": ["a", "b", "c"],"make": ["ford", "toyota", "bmw"],}
)
print(df_cars)
df_repairs = pl.DataFrame({"id": ["c", "c"],"cost": [100, 200],}
)
print(df_repairs)
df = df_cars.join(df_repairs, on="id", how="inner")
print(df)df = df_cars.join(df_repairs, on="id", how="semi")
print(df)df = df_cars.join(df_repairs, on="id", how="anti")
print(df)
df_trades = pl.DataFrame({"time": [datetime(2020, 1, 1, 9, 1, 0),datetime(2020, 1, 1, 9, 1, 0),datetime(2020, 1, 1, 9, 3, 0),datetime(2020, 1, 1, 9, 6, 0),],"stock": ["A", "B", "B", "C"],"trade": [101, 299, 301, 500],}
)
print(df_trades)df_quotes = pl.DataFrame({"time": [datetime(2020, 1, 1, 9, 0, 0),datetime(2020, 1, 1, 9, 2, 0),datetime(2020, 1, 1, 9, 4, 0),datetime(2020, 1, 1, 9, 6, 0),],"stock": ["A", "B", "C", "A"],"quote": [100, 300, 501, 102],}
)print(df_quotes)
df_asof_join = df_trades.join_asof(df_quotes, on="time", by="stock")
print(df_asof_join)
df_asof_tolerance_join = df_trades.join_asof(df_quotes, on="time", by="stock", tolerance="1m"
)
print(df_asof_tolerance_join)

8.2 Concatenation

df_v1 = pl.DataFrame({"a": [1],"b": [3],}
)
df_v2 = pl.DataFrame({"a": [2],"b": [4],}
)
df_vertical_concat = pl.concat([df_v1,df_v2,],how="vertical",
)
print(df_vertical_concat)
df_h1 = pl.DataFrame({"l1": [1, 2],"l2": [3, 4],}
)
df_h2 = pl.DataFrame({"r1": [5, 6],"r2": [7, 8],"r3": [9, 10],}
)
df_horizontal_concat = pl.concat([df_h1,df_h2,],how="horizontal",
)
print(df_horizontal_concat)

8.3 Pivots

df = pl.DataFrame({"foo": ["A", "A", "B", "B", "C"],"N": [1, 2, 2, 4, 2],"bar": ["k", "l", "m", "n", "o"],}
)
print(df)
out = df.pivot(index="foo", columns="bar", values="N", aggregate_function="first")
print(out)
q = (df.lazy().collect().pivot(index="foo", columns="bar", values="N", aggregate_function="first").lazy()
)
out = q.collect()
print(out)

8.4 Melts

import polars as pldf = pl.DataFrame({"A": ["a", "b", "a"],"B": [1, 3, 5],"C": [10, 11, 12],"D": [2, 4, 6],}
)
print(df)
out = df.melt(id_vars=["A", "B"], value_vars=["C", "D"])
print(out)

THE END!

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/737380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 热题 100_旋转图像

题解一&#xff1a; 翻转数组&#xff1a;先将数组沿右上-左下对角线翻转&#xff0c;再将数组上下翻转。 class Solution {public void rotate(int[][] matrix) {int n matrix.length;for (int i 0; i < n; i) {//沿右上-左下对角线翻转for (int j 0; j < n - i - 1…

简单句,并列句【语法笔记】

1. 简单句&#xff0c;并列句本质分别是什么 2. 如何区分简单句和并列句 3. 连接词 4. 简单句的五大基本句型 5. 有连接词&#xff0c;未必都是并列句&#xff0c;这是为什么

为何系统对接采用定制开发周期通常比集成平台更长

在信息化建设的浪潮中&#xff0c;系统对接是实现企业内外部系统间数据共享和业务协同的关键环节。在对接开发过程中&#xff0c;定制开发与平台开发是两种主要的实现方式&#xff0c;而普遍观点认为&#xff0c;定制开发对接的周期通常要比平台开发更长。本文将深入探讨这一现…

物奇平台超距断连无蓝牙广播问题解决方法

是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送语音信号处理降噪算法,蓝牙耳机音频,DSP音频项目核心开发资料, 物奇平台超距断连无蓝牙广播问题解决方法 一 问题反馈 二解决方法: 1 运行流程分析 对应代…

智能合约开发基础知识:最小信任机制、智能合约、EVM

苏泽 大家好 这里是苏泽 一个钟爱区块链技术的后端开发者 本篇专栏 ←持续记录本人自学两年走过无数弯路的智能合约学习笔记和经验总结 如果喜欢拜托三连支持~ 专栏的前面几篇详细了介绍了区块链的核心基础知识 有兴趣学习的小伙伴可以看看http://t.csdnimg.cn/fCD5E关于区块…

线上又出问题了!又是特殊场景,哎呀,当时怎么没有想到!

目录标题 导读01.为什么经常会发生测试场景覆盖不全的问题?02.如何提升测试覆盖度?03.综述 导读 在我们的测试工作中&#xff0c;是不是经常遇到这样的情形&#xff0c;发生了线上问题&#xff0c;产品、研发或者测试同学一拍脑袋&#xff1a;当时怎么没有想到&#xff0c;怎…

Vue.js+SpringBoot开发海南旅游景点推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…

【论文阅读】VMamba:视觉状态空间模型

文章目录 VMamba:视觉状态空间模型摘要相关工作状态空间模型 方法准备状态空间模型离散化选择扫描机制 2D 选择扫描VMamba 模型整体结构VSS块 实验分析实验有效感受野输入尺度 总结 VMamba:视觉状态空间模型 摘要 受最近提出的状态空间模型启发&#xff0c;我们提出了视觉状态…

一款适合程序员开发复杂系统的通用平台——JNPF 开发平台

在过去&#xff0c;很多开发工具更侧重代码编辑&#xff0c;针对数据库增删改查&#xff08;CRUD&#xff09;类的 Web 系统开发&#xff0c;在界面设计、前后端数据交互等环节主要还是靠写代码&#xff0c;效率比较低。目前很多所谓的低代码开发平台&#xff0c;大多数也都是基…

Linux第75步_pinctrl子系统驱动和gpio子系统的常用函数

1、STM32MP1的pinctrl子系统驱动 pinctrl子系统源码目录为drivers/pinctrl&#xff0c;一个PIN最好只能被一个外设使用。 “stm32mp151.dtsi”中有一个“pin-controller节点标签”叫pinctrl pinctrl: pin-controller50002000 { #address-cells <1>; /*定义子节点的…

【24春招/Java】Java的市场情况介绍及Spring Boot基础

Java的市场情况 需求减少 人员增加 面试难度增加 1、Java高级开发&#xff0c;100份简历&#xff0c;筛选了20份&#xff0c;邀约20个人面试 面试机会&#xff1a;录取人数20:1 充分准备通过面试的前提 不要裸面&#xff01;&#xff01;&#xff01; 背葵花宝典&#xff08;…

23.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-实现配置工具数据结构

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;22.加载配置文件…

站库分离技术--反向代理技术-雷池云WAF-给自己搭建一个安全点的网站

文章目录 概要整体架构流程技术名词解释技术细节ssh-ubuntu服务器docker-映射-链接-通信nginx反代mysql设置数据库新密码 小结我的mysql映射目录我的wordpress映射目录 成果展示 概要 新买了一个云服务器&#xff0c;想搭建一个站库分离的wordpress为主的网站&#xff0c;采用d…

PID控制器组(完整SCL代码)

PID控制器组不是什么新概念,是在PID控制器的基础上,利用面向对象的思想对对象进行封装 批量实例化。 1、增量式PID https://rxxw-control.blog.csdn.net/article/details/124363197https://rxxw-control.blog.csdn.net/article/details/1243631972、完全增量式PID https:/…

Vue 3:引领前端开发的未来

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

自制STLink-V2.1

STLink-V2.1需要使用的芯片是STM32F103CBT6 原理图如下&#xff1a; PCB如下&#xff1a; 将板子焊接好后下载&#xff1a;STM32 DebugMass storageVCP V2.J40.M27的固件后&#xff0c;再使用ST官方ST-LinkUpgrade工具对我们自制的STLink-V2.1进行升级。升级完成后&#xff0c…

数据结构---复杂度(2)

1.斐波那契数列的时间复杂度问题 每一行分别是2^0---2^1---2^2-----2^3-------------------------------------------2^(n-2) 利用错位相减法&#xff0c;可以得到结果是&#xff0c;2^(n-1)-1,其实还是要减去右下角的灰色部分&#xff0c;我们可以拿简单的数字进行举例子&…

Redis 的基本全局命令

前言 Redis 常用的有 5 种数据结构&#xff0c;字符串&#xff0c;列表&#xff0c;哈希表&#xff0c;集合&#xff0c;有序集合&#xff0c;每一种数据结构都有自己独特的命令&#xff0c;但也有些通用的全局命令&#xff0c;本文所提到的是最基本的命令&#xff0c;Redis 的…

前端存储方案

如今主流的存储方案&#xff1a; cookieweb storageindexDB 这三个浏览器兼容性最高的三种前端储存方案 1、cookie 它的出现是为了解决 HTTP 协议无状态特性的问题&#xff0c;简单来说就是想要得到上次http请求的数据是办不到的&#xff0c;只有再次从新请求。我们见得最多…

2024年零基础自学网络安全/Web安全,看这一篇就够了

作为一个安全从业人员&#xff0c;我自知web安全的概念太过于宽泛&#xff0c;我本人了解的也并不够精深&#xff0c;还需要继续学习。 但又不想新入行的人走弯路&#xff0c;所以今天随手写写关于web安全的内容&#xff0c;希望对初次遇到web安全问题的同学提供帮助&#xff…