Python数据分析NumPy和pandas(三十二、数据拆分-应用-合并)

最常用的 GroupBy 方法是 apply,apply 将正在操作的对象拆分为多个片段,在每个片段上调用传递给它函数,然后尝试连接这些片段。

还是用前面的小费数据集tips.csv,它的内容如下图:

假设我们想按smoker进行分组并选择前五个tip_pct值:

import numpy as np
import pandas as pdtips = pd.read_csv("examples/tips.csv")
tips["tip_pct"] = tips["tip"] / tips["total_bill"]# 自定义函数top,根据选择列tip_pct值最大的前n行
def top(df, n=5, column="tip_pct"):return df.sort_values(column, ascending=False)[:n]# 然后按 smoker 进行分组,并使用top函数调用 apply:
result = tips.groupby("smoker").apply(top)
print(result)

输出结果:

total_billtipsmokerdaytimesizetip_pct
smoker
No23211.613.39NoSatDinner20.291990
1497.512.00NoThurLunch20.266312
5110.292.60NoSunDinner20.252672
18520.695.00NoSunDinner50.241663
8824.715.85NoThurLunch20.236746
Yes1727.255.15YesSunDinner20.710345
1789.604.00YesSunDinner20.416667
673.071.00YesSatDinner10.325733
18323.176.50YesSunDinner40.280535
10914.314.00YesSatDinner20.279525

这里发生了什么?首先,根据 smoker 的值将 tips DataFrame 分成几组。然后,在每个组上调用 top 函数,并使用 pandas.concat 将每个调用的结果粘合在一起,也同时使用组名称标记各个部分。因此,结果具有一个分层索引,其内部级别包含来自原始 DataFrame 的索引值。

除了向apply方法传递函数名外,还可以在后面传递其他参数:

import numpy as np
import pandas as pdtips = pd.read_csv("examples/tips.csv")
tips["tip_pct"] = tips["tip"] / tips["total_bill"]# 自定义函数top,根据选择列tip_pct值最大的前n行
def top(df, n=5, column="tip_pct"):return df.sort_values(column, ascending=False)[:n]# 然后按 smoker 进行分组,并使用top函数调用 apply:
#result = tips.groupby("smoker").apply(top)
result = tips.groupby(["smoker", "day"]).apply(top, n=1, column="total_bill")
print(result)

执行上述代码会产生一个警告:DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  result = tips.groupby(["smoker", "day"]).apply(top, n=1, column="total_bill")

那我们按照提示修改下代码:

import numpy as np
import pandas as pdtips = pd.read_csv("examples/tips.csv")
tips["tip_pct"] = tips["tip"] / tips["total_bill"]# 自定义函数top,根据选择列tip_pct值最大的前n行
def top(df, n=5, column="tip_pct"):return df.sort_values(column, ascending=False)[:n]# 然后按 smoker 进行分组,并使用top函数调用 apply:
#result = tips.groupby("smoker").apply(top)
result = tips.groupby(["smoker", "day"]).apply(top, n=1, column="total_bill", include_groups=False)
print(result)

输出结果如下:

total_billtiptimesizetip_pct
smokerday
NoFri9422.753.25Dinner20.142857
Sat21248.339.00Dinner40.186220
Sun15648.175.00Dinner60.103799
Thur14241.195.00Lunch50.121389
YesFri9540.174.73Dinner40.117750
Sat17050.8110.00Dinner30.196812
Sun18245.353.50Dinner30.077178
Thur19743.115.00Lunch40.115982

除了这些基本的使用功能之外,要充分利用 apply 需要一些创造力。传递给apply的函数内部实现什么功能由我们自己决定,但它必须返回 pandas 对象或标量值。下面主要是通过代码示例展示如何使用 groupby 解决各种问题。 

例如:对 GroupBy 对象调用了描述性统计函数 describe():

import numpy as np
import pandas as pdtips = pd.read_csv("examples/tips.csv")
tips["tip_pct"] = tips["tip"] / tips["total_bill"]result = tips.groupby("smoker")["tip_pct"].describe()print(result)
print(result.unstack("smoker"))

以上代码对tips按smoker进行分组,然后用describe()方法对tip_pct列进行统计分析,输出该列的均值、最大值、最小值等描述统计标量,输出结果如下:

countmeanstdmin25%50%75%max
smoker
No151.00.1593280.0399100.0567970.1369060.1556250.1850140.291990
Yes93.00.1631960.0851190.0356380.1067710.1538460.1950590.710345

 然后调用result.unstack("smoker")输出:

隐藏分组用的键

在前面的示例中,生成的对象具有由组键以及原始对象的每个部分的索引组成的分层索引。要隐藏分组的键,可以设置group_keys=False,例如:

import numpy as np
import pandas as pddef top(df, n=5, column="tip_pct"):return df.sort_values(column, ascending=False)[:n]tips = pd.read_csv("examples/tips.csv")
tips["tip_pct"] = tips["tip"] / tips["total_bill"]result = tips.groupby("smoker", group_keys=False).apply(top, include_groups=False)print(result)

输出结果:

total_billtipdaytimesizetip_pct
23211.613.39SatDinner20.291990
1497.512.00ThurLunch20.266312
5110.292.60SunDinner20.252672
18520.695.00SunDinner50.241663
8824.715.85ThurLunch20.236746
1727.255.15SunDinner20.710345
1789.604.00SunDinner20.416667
673.071.00SatDinner10.325733
18323.176.50SunDinner40.280535
10914.314.00SatDinner20.279525

分位数和存储桶分析(Quantile and Bucket Analysis)

之前的学习中,我们学习过 pandas.cut 和 pandas.qcut,使用选择的 bin 或样本分位数将数据切成桶。将这些函数与 groupby 结合使用,可以方便地对数据集执行存储桶或分位数分析。例如:

import numpy as np
import pandas as pdnp.random.seed(12345)
frame = pd.DataFrame({"data1": np.random.standard_normal(1000), "data2": np.random.standard_normal(1000)})
print(frame.head())quartiles = pd.cut(frame["data1"], 4)
print(quartiles.head(10))def get_stats(group):return pd.DataFrame({"min": group.min(), "max": group.max(), "count": group.count(), "mean": group.mean()})grouped = frame.groupby(quartiles, observed=False)
print(grouped.apply(get_stats))

frame.head()输出前5行:

data1data2
0-0.5788280.517431
11.847446-0.756552
20.4537391.171381
3-0.302450-1.212491
41.402558-0.399609

quartiles.head(10)输出按4个bin划分后的前10行:

从上面的输出可以看出4个bin分组分别是:[(-2.956, -1.23] < (-1.23, 0.489] < (0.489, 2.208] <
                                           (2.208, 3.928]]

cut 返回的 Categorical 对象可以直接传递给 groupby。因此,我们可以计算四分位数的一组组统计数据,如下所示,grouped.apply(get_stats)输出:

minmaxcountmean
data1
(-2.956, -1.23]data1-2.2617612.505056950.100124
data2-2.1863012.615416950.173283
(-1.23, 0.489]data1-3.4282542.6536565950.023041
data2-2.9093732.4922245950.004728
(0.489, 2.208]data1-3.1843772.423712299-0.043678
data2-3.5488243.366626299-0.061474
(2.208, 3.928]data1-1.4712482.03698111-0.172572
data2-1.0931121.776327110.082027

其实,要输出相同结果还可以使用grouped.agg(["min", "max", "count", "mean"]),这种方法更简便:

import numpy as np
import pandas as pdnp.random.seed(12345)
frame = pd.DataFrame({"data1": np.random.standard_normal(1000), "data2": np.random.standard_normal(1000)})
print(frame.head())quartiles = pd.cut(frame["data1"], 4)
print(quartiles.head(10))#def get_stats(group):
#    return pd.DataFrame({"min": group.min(), "max": group.max(), 
#                         "count": group.count(), "mean": group.mean()})grouped = frame.groupby(quartiles, observed=False)
result = grouped.agg(["min", "max", "count", "mean"])
print(result)

输出:

data1data2
minmaxcountmeanminmaxcountmean
data1
(-2.956, -1.23]-2.2617612.505056950.100124-2.1863012.615416950.173283
(-1.23, 0.489]-3.4282542.6536565950.023041-2.9093732.4922245950.004728
(0.489, 2.208]-3.1843772.423712299-0.043678-3.5488243.366626299-0.061474
(2.208, 3.928]-1.4712482.03698111-0.172572-1.0931121.776327110.082027

注意:这些是等长的桶(bin)。要根据样本分位数计算等长的存储桶,可以使用 pandas.qcut。我们可以传递 4 作为存储桶计算样本四分位数,并传递 labels=False 仅获取四分位数索引而不是区间: 

import numpy as np
import pandas as pdnp.random.seed(12345)
frame = pd.DataFrame({"data1": np.random.standard_normal(1000), "data2": np.random.standard_normal(1000)})
print(frame.head())#quartiles = pd.cut(frame["data1"], 4)
quartiles_samp = pd.qcut(frame["data1"], 4, labels=False)
print(quartiles_samp.head())def get_stats(group):return pd.DataFrame({"min": group.min(), "max": group.max(), "count": group.count(), "mean": group.mean()})
grouped = frame.groupby(quartiles_samp)
print(grouped.apply(get_stats))

quartiles_samp.head() 输出:

grouped.apply(get_stats)输出:

minmaxcountmean
data1
0data1-3.428254-0.710197250-1.272969
data2-2.9093732.531127250-0.076649
1data1-0.7059600.014029250-0.338060
data2-3.5488242.419003250-0.007728
2data10.0165200.7151032500.360921
data2-2.6111243.3666262500.046946
3data10.7185572.6536562501.283159
data2-2.7486852.6154162500.044617

下面我们使用四个代码示例学习之前学过的内容。

Example 1:使用特定于组的值 填充 缺失值

在清理缺失数据时,可以使用 dropna 删除,但在其他情况下,我们希望使用固定值或从数据派生的某些值来填充空值 (NA)。那可以使用 Fillna 方法。这里我们用平均值填充 null 值:

import numpy as np
import pandas as pdnp.random.seed(12345)
s = pd.Series(np.random.standard_normal(6))
s[::2] = np.nan
print(s)
result = s.fillna(s.mean())
print(result)

填充前s输出:

用均值填充后输出:

假设我们需要 fill 的值因组而异。一种方法是对数据进行分组,并将 apply 与在每个数据块上调用 fillna 的函数一起使用:

import numpy as np
import pandas as pdnp.random.seed(12345)
states = ["Ohio", "New York", "Vermont", "Florida","Oregon", "Nevada", "California", "Idaho"]
group_key = ["East", "East", "East", "East","West", "West", "West", "West"]
data = pd.Series(np.random.standard_normal(8), index=states)
print(data)# 给data设置一些缺失值
data[["Vermont", "Nevada", "Idaho"]] = np.nan
print(data)# 按分组键列表中的键进行分组,返回每组的大小
data.groupby(group_key).size()# 按分组键列表中的键进行分组,返回每组的值的计数
data.groupby(group_key).count()# 按分组键列表中的键进行分组,返回每组的平均值
data.groupby(group_key).mean()# 使用组均值填充 NA 值,如下,先自定义一个填充函数:
def fill_mean(group):return group.fillna(group.mean())# 传递自定义函数fill_mean给apply,用每组的均值填充各组的缺失值
result = data.groupby(group_key).apply(fill_mean)
print(result)# 另一种情况:在代码中预定义每组的填充值,并用这些值填充每组的缺失值。
# 由于groups 内部有一个 name 属性,我们可以使用name属性,来指定为每组填充
fill_values = {"East": 0.5, "West": -1}
def fill_func(group):return group.fillna(fill_values[group.name])
result = data.groupby(group_key).apply(fill_func)
print(result)

data设置缺失值后输出:

用每组的平均值填充后输出:

用指定的每组填充值填充后输出:


Example 2 :随机采样和排列

假设我们想从大型数据集中随机抽取样本,那有多种方法可以执行;这里我们使用 Series 的 sample 方法。下面我们用代码来演示,代码中会构建一副扑克牌。

import numpy as np
import pandas as pd# 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 suits:cards.extend(str(num) + suit for num in base_names)deck = pd.Series(card_val, index=cards)# 现在我们有一个长度为 52 的 Series,
# 其索引包含牌名,
# 值是二十一点和其他游戏中使用的值
print(deck.head(13))# 从牌堆中抽一手五张牌可以写成:
def draw(deck, n=5):return deck.sample(n)
print(draw(deck))# 假设要随机抽取每种花色的两张牌,
# 因为花色是每张牌名的最后一个字符,所以我们可以基于此进行分组并使用 apply:
# 自定义一个函数get_suit返回牌的花色
def get_suit(card):# 最后一个字母是花色return card[-1]# 随机抽每种花色的2张牌
result = deck.groupby(get_suit).apply(draw, n=2)
print(result)

代码中首先构建了一副扑克牌,deck.head(13)输出13张:

draw(deck)随机抽5张,输出:

最后按花色分组,每种花色抽两张输出:


Example 3 :组加权平均值和相关性

在 groupby 的 split-apply-combine 范式下,可以在 DataFrame 或两个 Series 中的列之间进行操作,例如求组加权平均。示例:

import numpy as np
import pandas as pdnp.random.seed(12345)df = pd.DataFrame({"category": ["a", "a", "a", "a", "b", "b", "b", "b"], "data": np.random.standard_normal(8), "weights": np.random.uniform(size=8)})
print(df)# 然后按类别(category)划分,求加权平均值
grouped = df.groupby("category")
# 自定义函数get_wavg求加权平均
def get_wavg(group):return np.average(group["data"], weights=group["weights"])
result = grouped.apply(get_wavg)
print(result)

df输出:

categorydataweights
0a0.0061510.149751
1a-0.5000040.240539
2a-1.3107660.630025
3a-0.8329100.763095
4b-0.0551740.918371
5b-1.4449440.054725
6b0.9440280.028265
7b0.0647200.572253

按类别分组求加权平均输出:

再举一个例子,用一个金融数据集来展示,其中包含一些股票的收盘价和标准普尔 500 指数(SPX 代码),部分内容如下截图:

import numpy as np
import pandas as pdclose_px = pd.read_csv("examples/stock_px.csv", parse_dates=True, index_col=0)# 输出数据集DataFrame对象close_px的相关概览信息
print(close_px.info())
# 输出数据集前4行看看
print(close_px.tail(4))# 下面我们设置一个任务:生成一个 DataFrame,该 DataFrame 由每日回报的年度相关性(根据百分比变化计算)与 SPX 组成。
# 为此,1.首先创建一个函数,用于计算每列与 “SPX” 列的成对相关性:
def spx_corr(group):return group.corrwith(group["SPX"])# 接下来,2.使用 pct_change() 计算close_px的百分比变化:
rets = close_px.pct_change().dropna()# 最后,按年份对这些百分比变化进行分组,
# 使用返回每个日期时间标签的 year 属性的单行函数从每个行标签中提取这些变化
def get_year(x):return x.year
by_year = rets.groupby(get_year)
result =  by_year.apply(spx_corr)# 输出结果
print(result)# 另一个任务:计算列间相关性。比如:计算 Apple 和 Microsoft 之间的年度相关性:
def corr_aapl_msft(group):return group["AAPL"].corr(group["MSFT"])
result2 = by_year.apply(corr_aapl_msft)
# 输出结果
print(result2)

数据集的概览信息输出:

数据集的后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

第一个任务输出:

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

第二个任务输出:

 


Example4:分组线性回归(Group-Wise Linear Regression)

对于Example3中的数据集,还可以使用 groupby 执行更复杂的分组统计分析,只要该函数返回 pandas 对象或标量值即可。例如,我们使用 statsmodels 计量经济学库自定义一个回归函数,该函数对每个数据块执行普通最小二乘法 (OLS) 回归。先pip install statsmodels。

import numpy as np
import pandas as pd
import statsmodels.api as smclose_px = pd.read_csv("examples/stock_px.csv", parse_dates=True, index_col=0)# 下面我们设置一个任务:生成一个 DataFrame,该 DataFrame 由每日回报的年度相关性(根据百分比变化计算)与 SPX 组成。
# 为此,1.首先创建一个函数,用于计算每列与 “SPX” 列的成对相关性:
def spx_corr(group):return group.corrwith(group["SPX"])# 接下来,2.使用 pct_change() 计算close_px的百分比变化:
rets = close_px.pct_change().dropna()# 最后,按年份对这些百分比变化进行分组,
# 使用返回每个日期时间标签的 year 属性的单行函数从每个行标签中提取这些变化
def get_year(x):return x.year
by_year = rets.groupby(get_year)# 自定义 普通最小二乘法 (OLS) 回归
def regress(data, yvar=None, xvars=None):Y = data[yvar]X = data[xvars]X["intercept"] = 1.result = sm.OLS(Y, X).fit()return result.params# 计算APPL SPX回报的年度线性回归
result = by_year.apply(regress, yvar="AAPL", xvars=["SPX"])
print(result)

输出结果:

 

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

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

相关文章

【C++】字符串相乘

1.题目 2.代码 介绍一种比较简单的方法&#xff0c;就是先将字符串逆序&#xff0c;然后取出其中每一位的数相乘、相加。最后再考虑进位问题。 class Solution { public:string multiply(string num1, string num2) {//先排除边界情况&#xff0c;防止输出"00000...&quo…

认证鉴权框架SpringSecurity-1--概念和原理篇

1、基本概念 Spring Security 是一个强大且高度可定制的框架&#xff0c;用于构建安全的 Java 应用程序。它是 Spring 生态系统的一部分&#xff0c;提供了全面的安全解决方案&#xff0c;包括认证、授权、CSRF防护、会话管理等功能。 2、认证、授权和鉴权 &#xff08;1&am…

Android 项目依赖库无法找到的解决方案

目录 错误信息解析 解决方案 1. 检查依赖版本 2. 检查 Maven 仓库配置 3. 强制刷新 Gradle 缓存 4. 检查网络连接 5. 手动下载依赖 总结 相关推荐 最近&#xff0c;我在编译一个 Android 老项目时遇到了一个问题&#xff0c;错误信息显示无法找到 com.gyf.immersionba…

Vue全栈开发旅游网项目(11)-用户管理前端接口联调

联调基本步骤 1.阅读接口文档 2.配置接口地址 3.使用axios获取数据 4.将数据设置到模型层 1.发送验证码联调 1.1 配置接口地址 文件地址&#xff1a;src\utils\apis.js //系统相关的接口 const SystemApis {sliderListUrl:apiHost"/system/slider/list/",//发送…

320页PDF | 集团IT蓝图总体规划报告-德勤(限免下载)

一、前言 这份报告是集团IT蓝图总体规划报告-德勤。在报告中详细阐述了德勤为某集团制定的全面IT蓝图总体规划&#xff0c;包括了集团信息化目标蓝图、IT应用规划、数据规划、IT集成架构、IT基础设施规划以及IT治理体系规划等关键领域&#xff0c;旨在为集团未来的信息化发展提…

蓝桥杯c++算法学习【2】之搜索与查找(九宫格、穿越雷区、迷宫与陷阱、扫地机器人:::非常典型的必刷例题!!!)

别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01; 关注博主&#xff0c;更多蓝桥杯nice题目静待更新:) 搜索与查找 一、九宫格 【问题描述】 小明最近在教邻居家的小朋友小学奥数&#xff0c;而最近正好讲述到了三阶幻方这个部分&#xff0c;三 …

Springboot校园失物招领平台

Springboot校园失物招领平台 Springboot校园失物招领平台

C++(Qt)软件调试---符号转换工具cv2pdb (24)

C(Qt)软件调试—符号转换工具cv2pdb &#xff08;24&#xff09; 文章目录 C(Qt)软件调试---符号转换工具cv2pdb &#xff08;24&#xff09;[toc]1、概述&#x1f41c;2、下载cv2pdb&#x1fab2;3、qt程序使用cv2pdb&#x1f9a7;1.1 方法1&#xff1a;命令行1.2 方法2&#…

基于Java Springboot宠物流浪救助系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xff1a;MySQL…

My_SQL day3

知识点&#xff1a;约束 1.dafault 默认约束 2.not null 非空约束 3.unique key 唯一约束 4.primary key 主键约束 5.anto_increment 自增长约束 6.foreign key 外键约束 知识点&#xff1a;表关系 1.一对一 2.一对多 3.多对多 知识点&#xff1a;约束 1.default 默认约束 …

C++基础:Pimpl设计模式的实现

2024/11/14: 在实现C17的Any类时偶然接触到了嵌套类的实现方法以及Pimpl设计模式&#xff0c;遂记录。 PIMPL &#xff08; Private Implementation 或 Pointer to Implementation &#xff09;是通过一个私有的成员指针&#xff0c;将指针所指向的类的内部实现数据进行隐藏。 …

Unity自动LOD工具AutoLOD Mesh Decimator的使用

最近在研究大批量物体生成&#xff0c;由于我们没有专业美术&#xff0c;在模型减面工作上没有人手&#xff0c;所以准备用插件来实现LOD功能&#xff0c;所以找到了AutoLOD Mesh Decimator这个插件。 1&#xff0c;导入插件后&#xff0c;我们拿个实验的僵尸狗来做实验。 空…

爬虫补环境案例---问财网(rpc,jsdom,代理,selenium)

目录 一.环境检测 1. 什么是环境检测 2.案例讲解 二 .吐环境脚本 1. 简介 2. 基础使用方法 3.数据返回 4. 完整代理使用 5. 代理封装 6. 封装所有使用方法 jsdom补环境 1. 环境安装 2. 基本使用 3. 添加参数形式 Selenium补环境 1. 简介 2.实战案例 1. 逆向目…

免费,WPS Office教育考试专用版

WPS Office教育考试专用版&#xff0c;不仅满足了考试需求&#xff0c;更为教育信息化注入新动力。 https://pan.quark.cn/s/609ef85ae6d4

Vue前端开发,组件及组件的使用

什么是组件 组件(Component)是Vue中最强大的功能之一&#xff0c;每个Vue 文件就是一个个独立的组件&#xff0c;组件也可以被其他组件调用&#xff0c;形成嵌套关系&#xff0c;大部分的应用都是由各类不同功能的小组件进行构建&#xff0c;形成一个功能强大的大组件树系统&a…

政务数据治理专栏开搞!

写在前面 忙忙碌碌干了一年政务数据治理的工作&#xff0c;从法人数据到自然人&#xff0c;从交通到地理信息等等&#xff0c;突发想法开一个专栏讲一讲政务数据遇到的问题&#xff0c;以及治理的成效&#xff0c;或许有朋友爱看。 政务数据&#xff0c;又称之为政务数据资源&a…

前端在PC端实现支付思路流程

一.去支付 1.前端点击“去支付”按钮&#xff0c;请求订单详情接口&#xff0c;传递订单的id、订单号给后端和请求支付方式接口 2.后端返回支付信息和支付方式数据 二.弹出支付窗口 接收支付信息和支付方式数据后&#xff0c;前端弹出支付弹窗 三.确认支付 前端无论选择任何…

VUE3实现好看的世界建筑中国建筑网站源码

文章目录 1.设计来源1.1 网站主界面1.2 登录界面1.3 注册界面1.4 特色建筑展览界面1.5 世界建筑介绍界面1.6 世界建筑介绍 - 详情界面1.7 中国建筑介绍界面1.8 中国建筑介绍 - 详情界面1.9 关于我们界面 2.效果和源码2.1 动态效果2.2 源代码2.3 目录结构 源码下载万套模板&…

「人眼视觉不再是视频消费的唯一形式」丨智能编解码和 AI 视频生成专场回顾@RTE2024

你是否想过&#xff0c;未来你看到的电影预告片、广告&#xff0c;甚至新闻报道&#xff0c;都可能完全由 AI 生成&#xff1f; 在人工智能迅猛发展的今天&#xff0c;视频技术正经历着一场前所未有的变革。从智能编解码到虚拟数字人&#xff0c;再到 AI 驱动的视频生成&#…

「QT」文件类 之 QTemporaryFile 临时文件类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制…