当前位置: 首页 > news >正文

pandas教程:Apply:General split-apply-combine 通常的分割-应用-合并

文章目录

  • 10.3 Apply:General split-apply-combine(应用:通用的分割-应用-合并)
  • 1 Suppressing the Group Keys(抑制组键)
  • 2 Quantile and Bucket Analysis(分位数与桶分析)
  • 3 Example: Filling Missing Values with Group-Specific Values(例子:用组特异性值来填充缺失值)
  • 4 Example: Random Sampling and Permutation(例子:随机抽样和排列)
  • 5 Example: Group Weighted Average and Correlation(例子:组加权平均和相关性)
  • 6 Example: Group-Wise Linear Regression(例子:组对组的线性回归)

10.3 Apply:General split-apply-combine(应用:通用的分割-应用-合并)

general-purpose: 可以理解为通用,泛用。

例子:在计算机软件中,通用编程语言(General-purpose programming language )指被设计为各种应用领域服务的编程语言。通常通用编程语言不含有为特定应用领域设计的结构。

相对而言,特定域编程语言就是为某一个特定的领域或应用软件设计的编程语言。比如说,LaTeX就是专门为排版文献而设计的语言。

最通用的GroupBy(分组)方法是apply,这也是本节的主题。如下图所示,apply会把对象分为多个部分,然后将函数应用到每一个部分上,然后把所有的部分都合并起来:

返回之前提到的tipping数据集,假设我们想要根据不同组(group),选择前5个tip_pct值最大的。首先,写一个函数,函数的功能为在特定的列,选出有最大值的行:

import numpy as np
import pandas as pd
tips = pd.read_csv('../examples/tips.csv')
# Add tip percentage of total bill
tips['tip_pct'] = tips['tip'] / tips['total_bill']
tips.head()
total_billtipsmokerdaytimesizetip_pct
016.991.01NoSunDinner20.059447
110.341.66NoSunDinner30.160542
221.013.50NoSunDinner30.166587
323.683.31NoSunDinner20.139780
424.593.61NoSunDinner40.146808
def top(df, n=5, column='tip_pct'):return df.sort_values(by=column)[-n:]
top(tips, n=6)
total_billtipsmokerdaytimesizetip_pct
10914.314.00YesSatDinner20.279525
18323.176.50YesSunDinner40.280535
23211.613.39NoSatDinner20.291990
673.071.00YesSatDinner10.325733
1789.604.00YesSunDinner20.416667
1727.255.15YesSunDinner20.710345

现在,如果我们按smoker分组,然后用apply来使用这个函数,我们能得到下面的结果:

tips.groupby('smoker').apply(top)
total_billtipsmokerdaytimesizetip_pct
smoker
No8824.715.85NoThurLunch20.236746
18520.695.00NoSunDinner50.241663
5110.292.60NoSunDinner20.252672
1497.512.00NoThurLunch20.266312
23211.613.39NoSatDinner20.291990
Yes10914.314.00YesSatDinner20.279525
18323.176.50YesSunDinner40.280535
673.071.00YesSatDinner10.325733
1789.604.00YesSunDinner20.416667
1727.255.15YesSunDinner20.710345

我们来解释下上面这一行代码发生了什么。这里的top函数,在每一个DataFrame中的行组(row group)都被调用了一次,然后各自的结果通过pandas.concat合并了,最后用组名(group names)来标记每一部分。(译者:可以理解为,我们先按smoker这一列对整个DataFrame进行了分组,一共有NoYes两组,然后对每一组上调用了top函数,所以每一组会返还5行作为结果,最后把两组的结果整合起来,一共是10行)。

最后的结果是有多层级索引(hierarchical index)的,而且这个多层级索引的内部层级(inner level)含有来自于原来DataFrame中的索引值(index values

如果传递一个函数给apply,可以在函数之后,设定其他一些参数:

tips.groupby(['smoker', 'day']).apply(top, n=1, column='total_bill')
total_billtipsmokerdaytimesizetip_pct
smokerday
NoFri9422.753.25NoFriDinner20.142857
Sat21248.339.00NoSatDinner40.186220
Sun15648.175.00NoSunDinner60.103799
Thur14241.195.00NoThurLunch50.121389
YesFri9540.174.73YesFriDinner40.117750
Sat17050.8110.00YesSatDinner30.196812
Sun18245.353.50YesSunDinner30.077178
Thur19743.115.00YesThurLunch40.115982

除了上面这些基本用法,要想用好apply可能需要一点创新能力。毕竟传给这个函数的内容取决于我们自己,而最终的结果只需要返回一个pandas对象或一个标量。这一章的剩余部分主要介绍如何解决在使用groupby时遇到的一些问题。

可以试一试在GroupBy对象上调用describe

result = tips.groupby('smoker')['tip_pct'].describe()
result
smoker       
No      count    151.000000mean       0.159328std        0.039910min        0.05679725%        0.13690650%        0.15562575%        0.185014max        0.291990
Yes     count     93.000000mean       0.163196std        0.085119min        0.03563825%        0.10677150%        0.15384675%        0.195059max        0.710345
Name: tip_pct, dtype: float64
result.unstack('smoker')
smokerNoYes
count151.00000093.000000
mean0.1593280.163196
std0.0399100.085119
min0.0567970.035638
25%0.1369060.106771
50%0.1556250.153846
75%0.1850140.195059
max0.2919900.710345

GroupBy内部,当我们想要调用一个像describe这样的函数的时候,其实相当于下面的写法:

f = lambda x: x.describe()
grouped.apply(f)

1 Suppressing the Group Keys(抑制组键)

在接下来的例子,我们会看到作为结果的对象有一个多层级索引(hierarchical index),这个多层级索引是由原来的对象中,组键(group key)在每一部分的索引上得到的。我们可以在groupby函数中设置group_keys=False来关闭这个功能:

tips.groupby('smoker', group_keys=False).apply(top)
total_billtipsmokerdaytimesizetip_pct
8824.715.85NoThurLunch20.236746
18520.695.00NoSunDinner50.241663
5110.292.60NoSunDinner20.252672
1497.512.00NoThurLunch20.266312
23211.613.39NoSatDinner20.291990
10914.314.00YesSatDinner20.279525
18323.176.50YesSunDinner40.280535
673.071.00YesSatDinner10.325733
1789.604.00YesSunDinner20.416667
1727.255.15YesSunDinner20.710345

2 Quantile and Bucket Analysis(分位数与桶分析)

在第八章中,我们介绍了pandas的一些工具,比如cutqcut,通过设置中位数,切割数据为buckets with bins(有很多箱子的桶)。

把函数通过groupby整合起来,可以在做桶分析或分位数分析的时候更方便。假设一个简单的随机数据集和一个等长的桶类型(bucket categorization),使用cut

frame = pd.DataFrame({'data1': np.random.randn(1000),'data2': np.random.randn(1000)})
frame.head()
data1data2
00.7239730.120216
12.0536170.468000
2-0.543073-1.874073
3-0.9151360.159179
40.7759650.105447
quartiles = pd.cut(frame.data1, 4)
quartiles[:10]
0     (0.194, 1.795]
1     (1.795, 3.395]
2    (-1.407, 0.194]
3    (-1.407, 0.194]
4     (0.194, 1.795]
5     (0.194, 1.795]
6     (0.194, 1.795]
7    (-1.407, 0.194]
8    (-1.407, 0.194]
9    (-1.407, 0.194]
Name: data1, dtype: category
Categories (4, object): [(-3.0139, -1.407] < (-1.407, 0.194] < (0.194, 1.795] < (1.795, 3.395]]

cut返回的Categorical object(类别对象)能直接传入groupby。所以我们可以在data2列上计算很多统计值:

def get_stats(group):return {'min': group.min(), 'max': group.max(),'count': group.count(), 'mean': group.mean()}
grouped = frame.data2.groupby(quartiles)
grouped.apply(get_stats).unstack()
countmaxmeanmin
data1
(-3.0139, -1.407]70.02.0351660.113238-2.363707
(-1.407, 0.194]481.03.284688-0.044535-2.647341
(0.194, 1.795]407.02.402272-0.043887-2.898145
(1.795, 3.395]42.02.0518430.095178-2.234979

也有相同长度的桶(equal-length buckets);想要按照样本的分位数得到相同长度的桶,用qcut。这里设定labels=False来得到分位数的数量:

# Return quantile numbers
grouping = pd.qcut(frame.data1, 10, labels=False)

译者:上面的代码是把framedata1列分为10个bin,每个bin都有相同的数量。因为一共有1000个样本,所以每个bin里有100个样本。grouping保存的是每个样本的index以及其对应的bin的编号。

grouped = frame.data2.groupby(grouping)
grouped.apply(get_stats).unstack()
countmaxmeanmin
data1
0100.02.1786530.078390-2.363707
1100.03.284688-0.018699-2.647341
2100.02.214011-0.066341-2.262063
3100.02.880188-0.014041-2.475753
4100.02.741344-0.007952-2.576095
5100.02.346857-0.109602-2.898145
6100.02.4022720.004522-1.911955
7100.02.351513-0.161472-2.640625
8100.02.135995-0.016079-1.986676
9100.02.0518430.037685-2.513164

对于pandasCategorical类型,会在第十二章做详细介绍。

3 Example: Filling Missing Values with Group-Specific Values(例子:用组特异性值来填充缺失值)

在处理缺失值的时候,一些情况下我们会直接用dropna来把缺失值删除,但另一些情况下,我们希望用一些固定的值来代替缺失值,而fillna就是用来做这个的,例如,这里我们用平均值mean来代替缺失值NA

s = pd.Series(np.random.randn(6))
s[::2] = np.nan
s
0         NaN
1    0.878562
2         NaN
3   -0.264051
4         NaN
5    0.760488
dtype: float64
s.fillna(s.mean())
0    0.458333
1    0.878562
2    0.458333
3   -0.264051
4    0.458333
5    0.760488
dtype: float64

假设我们想要给每一组填充不同的值。一个方法就是对数据分组后,用apply来调用fillna,在每一个组上执行一次。这里有一些样本是把美国各州分为西部和东部:

states = ['Ohio', 'New York', 'Vermont', 'Florida','Oregon', 'Nevada', 'California', 'Idaho']
group_key = ['East'] * 4 + ['West'] * 4
group_key
['East', 'East', 'East', 'East', 'West', 'West', 'West', 'West']
data = pd.Series(np.random.randn(8), index=states)
data
Ohio          0.683283
New York     -1.059896
Vermont       0.105837
Florida      -0.328586
Oregon        1.973413
Nevada        0.656673
California    0.001700
Idaho        -0.713295
dtype: float64

我们令data中某些值为缺失值:

data[['Vermont', 'Nevada', 'Idaho']] = np.nan
data
Ohio          0.683283
New York     -1.059896
Vermont            NaN
Florida      -0.328586
Oregon        1.973413
Nevada             NaN
California    0.001700
Idaho              NaN
dtype: float64
data.groupby(group_key).mean()
East   -0.235066
West    0.987556
dtype: float64

然后我们可以用每个组的平均值来填充NA

fill_mean = lambda g: g.fillna(g.mean())
data.groupby(group_key).apply(fill_mean)
Ohio          0.683283
New York     -1.059896
Vermont      -0.235066
Florida      -0.328586
Oregon        1.973413
Nevada        0.987556
California    0.001700
Idaho         0.987556
dtype: float64

在另外一些情况下,我们可能希望提前设定好用于不同组的填充值。因为group有一个name属性,我们可以利用这个:

fill_values = {'East': 0.5, 'West': -1}
fill_func = lambda g: g.fillna(fill_values[g.name])
data.groupby(group_key).apply(fill_func)
Ohio          0.683283
New York     -1.059896
Vermont       0.500000
Florida      -0.328586
Oregon        1.973413
Nevada       -1.000000
California    0.001700
Idaho        -1.000000
dtype: float64

4 Example: Random Sampling and Permutation(例子:随机抽样和排列)

假设我们想要从一个很大的数据集里随机抽出一些样本,这里我们可以在Series上用sample方法。为了演示,这里县创建一副模拟的扑克牌:

# Hearts红桃,Spades黑桃,Clubs梅花,Diamonds方片
suits = ['H', 'S', 'C', 'D']
card_val = (list(range(1, 11)) + [10] * 3) * 4
base_names = ['A'] + list(range(2, 11)) + ['J', 'K', 'Q']
cards = []
for suit in ['H', 'S', 'C', 'D']:cards.extend(str(num) + suit for num in base_names)deck = pd.Series(card_val, index=cards)

这样我们就得到了一个长度为52的Series,索引(index)部分是牌的名字,对应的值为牌的点数,这里的点数是按Blackjack(二十一点)的游戏规则来设定的。

Blackjack(二十一点): 2点至10点的牌以牌面的点数计算,J、Q、K 每张为10点,A可记为1点或为11点。这里为了方便,我们只把A记为1点。

deck[:13]
AH      1
2H      2
3H      3
4H      4
5H      5
6H      6
7H      7
8H      8
9H      9
10H    10
JH     10
KH     10
QH     10
dtype: int64

现在,就像我们上面说的,随机从牌组中抽出5张牌:

def draw(deck, n=5):return deck.sample(n)
draw(deck)
7H     7
6D     6
AC     1
JH    10
JS    10
dtype: int64

假设我们想要从每副花色中随机抽取两张,花色是每张牌名字的最后一个字符(即H, S, C, D),我们可以根据花色分组,然后使用apply

get_suit = lambda card: card[-1] # last letter is suit
deck.groupby(get_suit).apply(draw, n=2)
C  QC    109C     9
D  3D     3JD    10
H  KH    106H     6
S  3S     37S     7
dtype: int64

另外一种写法:

deck.groupby(get_suit, group_keys=False).apply(draw, n=2)
7C     7
KC    10
AD     1
4D     4
AH     1
8H     8
7S     7
9S     9
dtype: int64

5 Example: Group Weighted Average and Correlation(例子:组加权平均和相关性)

groupbysplit-apply-combine机制下,DataFrame的两列或两个Series,计算组加权平均(Group Weighted Average)是可能的。这里举个例子,下面的数据集包含组键,值,以及权重:

df = pd.DataFrame({'category': ['a', 'a', 'a', 'a','b', 'b', 'b', 'b'],'data': np.random.randn(8),'weights': np.random.rand(8)})
df
categorydataweights
0a0.0980200.008455
1a1.3894960.826219
2a0.2028690.258955
3a-0.2424030.470473
4b-0.8205070.628758
5b0.8663260.653632
6b-1.2973750.639703
7b0.5250190.012664

category分组来计算组加权平均:

grouped = df.groupby('category')
get_wavg = lambda g: np.average(g['data'], weights=g['weights'])
grouped.apply(get_wavg)
category
a    0.695189
b   -0.399497
dtype: float64

另一个例子,考虑一个从Yahoo!财经上得到的经济数据集,包含一些股票交易日结束时的股价,以及S&P 500指数(即SPX符号):

标准普尔500指数英文简写为S&P 500 Index,是记录美国500家上市公司的一个股票指数。这个股票指数由标准普尔公司创建并维护。

标准普尔500指数覆盖的所有公司,都是在美国主要交易所,如纽约证券交易所、Nasdaq交易的上市公司。与道琼斯指数相比,标准普尔500指数包含的公司更多,因此风险更为分散,能够反映更广泛的市场变化。

close_px = pd.read_csv('../examples/stock_px_2.csv', parse_dates=True,index_col=0)
close_px.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 2214 entries, 2003-01-02 to 2011-10-14
Data columns (total 4 columns):
AAPL    2214 non-null float64
MSFT    2214 non-null float64
XOM     2214 non-null float64
SPX     2214 non-null float64
dtypes: float64(4)
memory usage: 86.5 KB
close_px[-4:]
AAPLMSFTXOMSPX
2011-10-11400.2927.0076.271195.54
2011-10-12402.1926.9677.161207.25
2011-10-13408.4327.1876.371203.66
2011-10-14422.0027.2778.111224.58

一个比较有意思的尝试是计算一个DataFrame,包括与SPX这一列逐年日收益的相关性(计算百分比变化)。一个可能的方法是,我们先创建一个能计算不同列相关性的函数,然后拿每一列与SPX这一列求相关性:

spx_corr = lambda x: x.corrwith(x['SPX'])

然后我们通过pct_changeclose_px上计算百分比的变化:

rets = close_px.pct_change().dropna()

最后,我们按年来给这些百分比变化分组,年份可以从每行的标签中通过一个一行函数提取,然后返回的结果中,用datetime标签来表示年份:

get_year = lambda x: x.year
by_year = rets.groupby(get_year)
by_year.apply(spx_corr)
AAPLMSFTXOMSPX
20030.5411240.7451740.6612651.0
20040.3742830.5885310.5577421.0
20050.4675400.5623740.6310101.0
20060.4282670.4061260.5185141.0
20070.5081180.6587700.7862641.0
20080.6814340.8046260.8283031.0
20090.7071030.6549020.7979211.0
20100.7101050.7301180.8390571.0
20110.6919310.8009960.8599751.0

我们也可以计算列内的相关性。这里我们计算苹果和微软每年的相关性:

by_year.apply(lambda g: g['AAPL'].corr(g['MSFT']))
2003    0.480868
2004    0.259024
2005    0.300093
2006    0.161735
2007    0.417738
2008    0.611901
2009    0.432738
2010    0.571946
2011    0.581987
dtype: float64

6 Example: Group-Wise Linear Regression(例子:组对组的线性回归)

就像上面介绍的例子,使用groupby可以用于更复杂的组对组统计分析,只要函数能返回一个pandas对象或标量。例如,我们可以定义regress函数(利用statsmodels库),在每一个数据块(each chunk of data)上进行普通最小平方回归(ordinary least squares (OLS) regression)计算:

import statsmodels.api as sm
def regress(data, yvar, xvars):Y = data[yvar]X = data[xvars]X['intercept'] = 1result = sm.OLS(Y, X).fit()return result.params

现在,按年用苹果AAPL在标普SPX上做线性回归:

by_year.apply(regress, 'AAPL', ['SPX'])
SPXintercept
20031.1954060.000710
20041.3634630.004201
20051.7664150.003246
20061.6454960.000080
20071.1987610.003438
20080.968016-0.001110
20090.8791030.002954
20101.0526080.001261
20110.8066050.001514

相关文章:

pandas教程:Apply:General split-apply-combine 通常的分割-应用-合并

文章目录 10.3 Apply&#xff1a;General split-apply-combine&#xff08;应用&#xff1a;通用的分割-应用-合并&#xff09;1 Suppressing the Group Keys&#xff08;抑制组键&#xff09;2 Quantile and Bucket Analysis&#xff08;分位数与桶分析&#xff09;3 Example:…...

第一讲之递归与递推下篇

第一讲之递归与递推下篇 带分数费解的开关飞行员兄弟翻硬币 带分数 用暴力将所有全排列的情况都算出来 > 有三个数&#xff0c;a,b,c 每种排列情况&#xff0c;可以用两层for循环&#xff0c;暴力分为三个部分&#xff0c;每个部分一个数 当然注意这里&#xff0c;第一层fo…...

第十六篇-Awesome ChatGPT Prompts-备份

Awesome ChatGPT Prompts——一个致力于提供挖掘ChatGPT能力的Prompt收集网站 https://prompts.chat/ 2023-11-16内容如下 ✂️Act as a Linux Terminal Contributed by: f Reference: https://www.engraved.blog/building-a-virtual-machine-inside/ I want you to act as a…...

Python Web框架Django

Python Web框架Django Django简介第一个Django应用Django核心概念Django django-adminDjango项目结构Django配置文件settingsDjango创建和配置应用Django数据库配置Django后台管理Django模型Django模型字段Django模型关联关系Django模型Meta 选项Django模型属性ManagerDjango模…...

1.Spring的简单使用

简介 本文是介绍spring源码的开始&#xff0c;先了解最基础的使用&#xff0c;最深入源码。 spring源码下载地址 https://github.com/spring-projects/spring-framework.git 依赖 依赖 spring-context dependencies {implementation(project(":spring-context")…...

02.智慧商城——vant组件库使用和vw适配

01. vant组件库及Vue周边的其他组件库 组件库&#xff1a;第三方封装好了很多很多的组件&#xff0c;整合到一起就是一个组件库。 https://vant-contrib.gitee.io/vant/v2/#/zh-CN/ 比如日历组件、键盘组件、打分组件、下拉筛选组件等 组件库并不是唯一的&#xff0c;常用的组…...

Android笔记(十三):结合JetPack Compose和CameraX实现视频的录制和存储

在“Android笔记&#xff08;八&#xff09;&#xff1a;基于CameraX库结合Compose和传统视图组件PreviewView实现照相机画面预览和照相功能”&#xff0c;文中介绍了拍照功能的实现&#xff0c;在本文中将介绍结合JetPack Compose和CameraX实现视频的录制。 新建一个项目 在项…...

【开题报告】基于SpringBoot的音乐鉴赏平台的设计与实现

1.研究背景与意义 音乐是人类文化的重要组成部分&#xff0c;具有广泛的影响力和吸引力。然而&#xff0c;随着数字化时代的到来&#xff0c;传统的音乐鉴赏方式面临一些挑战。因此&#xff0c;设计和开发一个基于Spring Boot的音乐鉴赏平台&#xff0c;能够满足用户对音乐欣赏…...

云原生 黑马Kubernetes教程(K8S教程)笔记——第一章 kubernetes介绍——Master集群控制节点、Node工作负载节点、Pod控制单元

参考文章&#xff1a;kubernetes介绍 文章目录 第一章 kubernetes介绍1.1 应用部署方式演变传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上虚拟化部署&#xff1a;可以在一台物理机上运行多个虚拟机&#xff0c;每个虚拟机都是独立的一个环境&…...

ElasticSearch 安装(单机版本)

文章目录 ElasticSearch 安装&#xff08;单机版本&#xff09;环境配置下载安装包调整系统参数安装启动并验证 ElasticSearch 安装&#xff08;单机版本&#xff09; 此文档演示 ElasticSearch 的单机版本在 CentOS 7 环境下的安装方式以及相关的配置。 环境配置 Linux 主机一…...

读书笔记:《BackTrader 量化交易案例图解》

BackTrader 量化软件&#xff1a;https://github.com/mementum/backtrader -> bt 量化框架&#xff08;前身&#xff09;&#xff1a;https://github.com/pmorissette/bt-> ffn 量化框架&#xff08;前前身&#xff09;&#xff1a;https://github.com/pmorissette/ffn T…...

CentOS 7 免密密钥登陆sftp服务 —— 筑梦之路

为什么用sftp而不是ftp&#xff1f; sftp是使用ssh协议安全加密的文件传输协议&#xff0c;ftp在很多时候都是使用的明文传输&#xff0c;相对来说容易被抓包&#xff0c;存在安全隐患。 需求说明 1. 使用sftp代替ftp来做文件存储&#xff0c;锁定目录&#xff0c;不允许用户切…...

记一次 .NET 某券商论坛系统 卡死分析

一&#xff1a;背景 1. 讲故事 前几个月有位朋友找到我&#xff0c;说他们的的web程序没有响应了&#xff0c;而且监控发现线程数特别高&#xff0c;内存也特别大&#xff0c;让我帮忙看一下怎么回事&#xff0c;现在回过头来几经波折&#xff0c;回味价值太浓了。 二&#…...

DevExpress WinForms HeatMap组件,一个高度可自定义热图控件!

通过DevExpress WinForms可以为Windows Forms桌面平台提供的高度可定制的热图UI组件&#xff0c;体验DevExpress的不同之处。 DevExpress WinForms有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。同时能完美构建流畅、美观且易于使用的应用程…...

振弦传感器表面应变计与振弦采集仪形成岩土工程监测的解决方案

振弦传感器表面应变计与振弦采集仪形成岩土工程监测的解决方案 振弦传感器表面应变计与振弦采集仪可以结合使用&#xff0c;形成岩土工程监测的解决方案。具体的方案包括以下几个步骤&#xff1a; 1. 安装振弦传感器表面应变计&#xff1a;首先需要在需要监测的岩土结构表面安…...

笔记本电脑没有声音?几招恢复声音流畅!

笔记本电脑已经成为我们日常生活和工作的重要工具&#xff0c;而其中的声音是其功能之一。然而&#xff0c;有时您可能会遇到笔记本电脑没有声音的问题&#xff0c;这可能是由多种原因引起的。在本文中&#xff0c;我们将深入探讨笔记本电脑没有声音的常见原因&#xff0c;并提…...

JavaScript学习_01——JavaScript简介

JavaScript简介 JavaScript介绍 JavaScript是一种轻量级的脚本语言。所谓“脚本语言”&#xff0c;指的是它不具备开发操作系统的能力&#xff0c;而是只用来编写控制其他大型应用程序的“脚本”。 JavaScript 是一种嵌入式&#xff08;embedded&#xff09;语言。它本身提供…...

11.10~11.15置信区间,均值、方差假设检验,正态,t,卡方,F分布,第一第二类错误

置信度&#xff0c;置信区间 给定一个置信度&#xff0c;就可以算出一个置信区间。 如果给的置信度越大&#xff0c;那么阿尔法就越小 给的置信度越小&#xff0c;那么α就越大&#xff0c;那么 考虑精确性&#xff0c;希望区间长度尽可能小&#xff0c;所以是取正态的中间…...

【洛谷 P2440】木材加工 题解(二分查找+循环)

木材加工 题目背景 要保护环境 题目描述 木材厂有 n n n 根原木&#xff0c;现在想把这些木头切割成 k k k 段长度均为 l l l 的小段木头&#xff08;木头有可能有剩余&#xff09;。 当然&#xff0c;我们希望得到的小段木头越长越好&#xff0c;请求出 l l l 的最大…...

反向传播详解BP

误差反向传播&#xff08;Back-propagation, BP&#xff09;算法的出现是神经网络发展的重大突破&#xff0c;也是现在众多深度学习训练方法的基础。该方法会计算神经网络中损失函数对各参数的梯度&#xff0c;配合优化方法更新参数&#xff0c;降低损失函数。 BP本来只指损失…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...