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

Pandas:数据处理与分析的核心操作

Pandas:数据处理与分析的核心操作

Pandas 是 Python 数据分析的核心库,它提供了高性能、易用的数据结构和数据分析工具。本文将详细介绍 Pandas 的核心操作,帮助你高效进行数据处理和分析。

1. Pandas 基础数据结构

Pandas 有两个主要的数据结构:Series(一维)和 DataFrame(二维)。

import pandas as pd
import numpy as np# 创建 Series
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print("Series 示例:")
print(s)# 创建 DataFrame
# 从字典创建
data = {'name': ['Alice', 'Bob', 'Charlie', 'David'],'age': [25, 30, 35, 40],'city': ['New York', 'Paris', 'London', 'Tokyo']}
df1 = pd.DataFrame(data)
print("\nDataFrame 从字典创建:")
print(df1)# 从 NumPy 数组创建
dates = pd.date_range('20230101', periods=6)
df2 = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print("\nDataFrame 从NumPy数组创建:")
print(df2)# 查看 DataFrame 的基本信息
print("\nDataFrame基本信息:")
print(f"维度: {df2.shape}")
print(f"数据类型:\n{df2.dtypes}")
print(f"索引: {df2.index}")
print(f"列名: {df2.columns}")
print(f"前5行:\n{df2.head()}")
print(f"后5行:\n{df2.tail()}")
print(f"摘要统计:\n{df2.describe()}")

2. 数据选择与索引

Pandas 提供了多种灵活的方式来选择和访问数据。

# 创建示例DataFrame
data = {'A': [1, 2, 3, 4, 5],'B': [10, 20, 30, 40, 50],'C': [100, 200, 300, 400, 500]}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd', 'e'])
print("原始DataFrame:")
print(df)# 选择单列,返回Series
print("\n选择A列:")
print(df['A'])
print(type(df['A']))# 选择多列,返回DataFrame
print("\n选择A和C列:")
print(df[['A', 'C']])# 通过标签选择行 (.loc)
print("\n通过标签选择一行:")
print(df.loc['c'])# 通过标签选择多行
print("\n通过标签选择多行:")
print(df.loc[['a', 'c', 'e']])# 通过标签选择行和列
print("\n通过标签选择行和列:")
print(df.loc['b':'d', 'A':'C'])# 通过位置索引选择 (.iloc)
print("\n通过位置选择第二行:")
print(df.iloc[1])# 通过位置索引选择多行多列
print("\n通过位置选择多行多列:")
print(df.iloc[1:4, [0, 2]])# 条件选择
print("\n条件选择 A > 2:")
print(df[df.A > 2])# 多条件选择
print("\n多条件选择 A > 2 且 B < 40:")
print(df[(df.A > 2) & (df.B < 40)])# 使用 query 方法进行条件选择 (更简洁)
print("\n使用query选择 A > 2 且 B < 40:")
print(df.query("A > 2 and B < 40"))

3. 数据清洗与处理

数据清洗是数据分析中的关键步骤,Pandas 提供了多种工具来处理缺失值、重复数据等问题。

# 创建包含缺失值的DataFrame
df = pd.DataFrame({'A': [1, 2, np.nan, 4, 5],'B': [10, np.nan, 30, 40, 50],'C': [100, 200, 300, np.nan, 500],'D': ['a', 'b', 'c', 'd', np.nan]
})
print("包含缺失值的DataFrame:")
print(df)# 检查缺失值
print("\n每列缺失值数量:")
print(df.isnull().sum())# 删除包含缺失值的行
print("\n删除包含任何缺失值的行:")
print(df.dropna())# 只删除全为缺失值的行
print("\n只删除全为缺失值的行:")
print(df.dropna(how='all'))# 填充缺失值
print("\n用0填充缺失值:")
print(df.fillna(0))# 用前一个有效值填充
print("\n用前一个有效值填充:")
print(df.fillna(method='ffill'))# 用后一个有效值填充
print("\n用后一个有效值填充:")
print(df.fillna(method='bfill'))# 不同列使用不同的填充值
print("\n不同列使用不同的填充值:")
print(df.fillna({'A': 0, 'B': -1, 'C': 999, 'D': 'missing'}))# 删除重复行
df_dup = pd.DataFrame({'A': [1, 1, 2, 3, 4],'B': [10, 10, 20, 30, 40]
})
print("\n包含重复行的DataFrame:")
print(df_dup)
print("\n删除重复行:")
print(df_dup.drop_duplicates())# 替换值
df_replace = pd.DataFrame({'A': [1, 2, 3, 4, 5],'B': ['a', 'b', 'c', 'd', 'e']
})
print("\n替换前的DataFrame:")
print(df_replace)
print("\n替换后的DataFrame:")
print(df_replace.replace({1: 100, 'a': 'apple'}))

4. 数据转换与重塑

Pandas 提供了强大的功能来重塑和转换数据。

# 转置
df = pd.DataFrame({'A': [1, 2, 3],'B': [4, 5, 6],'C': [7, 8, 9]
})
print("原始DataFrame:")
print(df)
print("\n转置后:")
print(df.T)# 重置索引
df_idx = pd.DataFrame({'A': [1, 2, 3, 4, 5],'B': [10, 20, 30, 40, 50]
}, index=['a', 'b', 'c', 'd', 'e'])
print("\n带有自定义索引的DataFrame:")
print(df_idx)
print("\n重置索引后:")
print(df_idx.reset_index())  # 保留原索引为列
print("\n重置索引并丢弃原索引:")
print(df_idx.reset_index(drop=True))# 设置索引
df_set = pd.DataFrame({'name': ['Alice', 'Bob', 'Charlie'],'age': [25, 30, 35],'city': ['New York', 'Paris', 'London']
})
print("\n原始DataFrame:")
print(df_set)
print("\n将name设置为索引:")
print(df_set.set_index('name'))# 多层索引
df_multi = pd.DataFrame({'date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02'],'city': ['New York', 'Paris', 'New York', 'Paris'],'temp': [0, 2, -1, 3],'humidity': [45, 50, 55, 60]
})
print("\n原始DataFrame:")
print(df_multi)
print("\n设置多层索引:")
df_multi_idx = df_multi.set_index(['date', 'city'])
print(df_multi_idx)# 重塑DataFrame - stack和unstack
print("\n从多层索引转为长格式 (stack):")
stacked = df_multi_idx.stack()
print(stacked)
print("\n从长格式转回宽格式 (unstack):")
print(stacked.unstack())# 数据透视表
df_pivot = pd.DataFrame({'date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02'],'city': ['New York', 'Paris', 'New York', 'Paris'],'metric': ['temp', 'temp', 'temp', 'temp'],'value': [0, 2, -1, 3]
})
print("\n原始长格式数据:")
print(df_pivot)
print("\n转换为透视表:")
pivot_table = df_pivot.pivot(index='date', columns='city', values='value')
print(pivot_table)# melt - 从宽格式转为长格式
df_wide = pd.DataFrame({'date': ['2023-01-01', '2023-01-02'],'New York': [0, -1],'Paris': [2, 3]
})
print("\n宽格式数据:")
print(df_wide)
print("\n转换为长格式 (melt):")
df_long = pd.melt(df_wide, id_vars=['date'], var_name='city', value_name='temperature')
print(df_long)

5. 分组和聚合操作

分组和聚合是数据分析中的常见操作,用于汇总和分析数据。

# 创建示例数据
df = pd.DataFrame({'category': ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'],'store': ['S1', 'S1', 'S2', 'S2', 'S3', 'S3', 'S4', 'S4'],'sales': [10, 15, 20, 25, 30, 35, 40, 45],'profit': [1, 2, 3, 4, 5, 6, 7, 8]
})
print("原始数据:")
print(df)# 按单个列分组
print("\n按category分组并计算sales和profit的均值:")
print(df.groupby('category').mean())# 按多个列分组
print("\n按category和store分组并计算总和:")
print(df.groupby(['category', 'store']).sum())# 分组后应用多种聚合函数
print("\n按category分组并应用多种聚合函数:")
print(df.groupby('category').agg({'sales': ['sum', 'mean', 'std'],'profit': ['min', 'max']}))# 使用命名聚合
print("\n使用命名聚合:")
print(df.groupby('category').agg(total_sales=('sales', 'sum'),avg_sales=('sales', 'mean'),min_profit=('profit', 'min'),max_profit=('profit', 'max')
))# 过滤分组
print("\n过滤分组 - 只显示总销售额>50的类别:")
print(df.groupby('category').filter(lambda x: x['sales'].sum() > 50))# 分组转换 - 应用函数到各组
print("\n分组转换 - 标准化每组内的sales:")
print(df.groupby('category')['sales'].transform(lambda x: (x - x.mean()) / x.std()))# 应用自定义函数到分组
def top_n_sales(group, n=1):return group.nlargest(n, 'sales')print("\n找出每个类别中销售额最高的记录:")
print(df.groupby('category').apply(top_n_sales))

6. 合并与连接数据

Pandas 提供了多种方法来合并和连接数据集。

# 创建示例数据
df1 = pd.DataFrame({'employee_id': [1, 2, 3, 4],'name': ['Alice', 'Bob', 'Charlie', 'David'],'department': ['HR', 'IT', 'Finance', 'IT']
})df2 = pd.DataFrame({'employee_id': [1, 2, 5, 6],'salary': [50000, 60000, 70000, 80000],'bonus': [5000, 6000, 7000, 8000]
})df3 = pd.DataFrame({'department': ['HR', 'IT', 'Finance', 'Marketing'],'location': ['New York', 'London', 'Paris', 'Tokyo']
})print("表1 - 员工信息:")
print(df1)
print("\n表2 - 薪资信息:")
print(df2)
print("\n表3 - 部门信息:")
print(df3)# 合并 (如SQL join)
print("\n内连接 (inner join):")
print(pd.merge(df1, df2, on='employee_id', how='inner'))print("\n左连接 (left join):")
print(pd.merge(df1, df2, on='employee_id', how='left'))print("\n右连接 (right join):")
print(pd.merge(df1, df2, on='employee_id', how='right'))print("\n外连接 (outer join):")
print(pd.merge(df1, df2, on='employee_id', how='outer'))# 在不同的列上连接
print("\n使用不同列名连接:")
df2_renamed = df2.rename(columns={'employee_id': 'emp_id'})
print(pd.merge(df1, df2_renamed, left_on='employee_id', right_on='emp_id'))# 按索引连接
df1_idx = df1.set_index('employee_id')
df2_idx = df2.set_index('employee_id')
print("\n按索引连接:")
print(pd.merge(df1_idx, df2_idx, left_index=True, right_index=True))# 使用连接键
print("\n使用多个连接键:")
print(pd.merge(df1, df3, on='department'))# 连接后处理重复列名
print("\n处理重复列名:")
df1_dup = pd.DataFrame({'id': [1, 2, 3], 'name': ['A', 'B', 'C'], 'value': [10, 20, 30]})
df2_dup = pd.DataFrame({'id': [1, 2, 4], 'name': ['X', 'Y', 'Z'], 'value': [100, 200, 300]})
print(pd.merge(df1_dup, df2_dup, on='id', suffixes=('_left', '_right')))# 垂直连接 (如SQL UNION)
df4 = pd.DataFrame({'name': ['Eve', 'Frank'],'department': ['Sales', 'Marketing'],'employee_id': [7, 8]
})
print("\n垂直连接 (concat):")
print(pd.concat([df1, df4]))# 忽略索引并重置
print("\n垂直连接并重置索引:")
print(pd.concat([df1, df4], ignore_index=True))# 追加行
new_row = pd.DataFrame({'employee_id': [9], 'name': ['Grace'], 'department': ['R&D']})
print("\n追加行:")
print(pd.concat([df1, new_row], ignore_index=True))

7. 时间序列分析

Pandas 提供了强大的时间序列处理功能,特别适合金融和时间序列数据分析。

# 创建时间序列
dates = pd.date_range(start='2023-01-01', end='2023-01-10')
print("日期范围:")
print(dates)# 创建月度时间序列
months = pd.date_range('2023-01-01', periods=12, freq='M')
print("\n月份范围:")
print(months)# 创建工作日时间序列
business_days = pd.date_range('2023-01-01', periods=10, freq='B')
print("\n工作日范围:")
print(business_days)# 创建带有时间序列索引的DataFrame
ts_data = pd.DataFrame({'value': np.random.randn(len(business_days))
}, index=business_days)
print("\n时间序列数据:")
print(ts_data)# 时间序列重采样 (如从日数据变为月数据)
print("\n按周重采样 (求均值):")
print(ts_data.resample('W').mean())print("\n按月重采样 (求和):")
print(ts_data.resample('M').sum())# 时间偏移
print("\n时间偏移 - 后移一天:")
print(ts_data.shift(1))print("\n时间偏移 - 前移一天:")
print(ts_data.shift(-1))# 滚动窗口计算
print("\n3天滚动窗口均值:")
print(ts_data.rolling(window=3).mean())print("\n5天滚动窗口标准差:")
print(ts_data.rolling(window=5).std())# 扩展窗口计算 (累计)
print("\n扩展窗口计算 (累计均值):")
print(ts_data.expanding().mean())# 时间序列移动 (按日历日而非索引)
longer_ts = pd.DataFrame({'value': np.random.randn(30)
}, index=pd.date_range('2023-01-01', periods=30))
print("\n按5个日历日移动:")
print(longer_ts.tshift(periods=5, freq='D').head())

8. 数据分析与可视化

Pandas 与 Matplotlib 集成,提供了便捷的数据可视化功能。

# 需要安装matplotlib: pip install matplotlib
import matplotlib.pyplot as plt# 创建示例数据
np.random.seed(42)
dates = pd.date_range('2023-01-01', periods=30)
df = pd.DataFrame({'A': np.random.randn(30).cumsum(),'B': np.random.randn(30).cumsum(),'C': np.random.randn(30).cumsum(),'D': np.random.randn(30).cumsum()
}, index=dates)print("数据集:")
print(df.head())# 线图
df.plot(figsize=(10, 6), title='时间序列曲线')
plt.savefig('line_plot.png')
plt.close()# 柱状图
df.iloc[0:10].plot.bar(figsize=(10, 6), title='柱状图')
plt.savefig('bar_plot.png')
plt.close()# 堆叠柱状图
df.iloc[0:10].plot.bar(stacked=True, figsize=(10, 6), title='堆叠柱状图')
plt.savefig('stacked_bar_plot.png')
plt.close()# 直方图
df.plot.hist(bins=20, alpha=0.7, figsize=(10, 6), title='直方图')
plt.savefig('histogram_plot.png')
plt.close()# 箱形图
df.plot.box(figsize=(10, 6), title='箱形图')
plt.savefig('box_plot.png')
plt.close()# 散点图
df.plot.scatter(x='A', y='B', figsize=(10, 6), title='散点图')
plt.savefig('scatter_plot.png')
plt.close()# 饼图
abs(df.iloc[0]).plot.pie(autopct='%1.1f%%', figsize=(10, 6), title='饼图')
plt.savefig('pie_chart.png')
plt.close()# 热力图 (需要安装seaborn: pip install seaborn)
import seaborn as sns
plt.figure(figsize=(10, 8))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm')
plt.title('相关性热力图')
plt.savefig('heatmap.png')
plt.close()

9. 数据导入与导出

Pandas 支持多种数据格式的读取和写入。

# CSV文件
# 导出为CSV
df = pd.DataFrame({'name': ['Alice', 'Bob', 'Charlie'],'age': [25, 30, 35],'city': ['New York', 'Paris', 'London']
})
df.to_csv('data.csv', index=False)
print("已导出到CSV文件")# 从CSV导入
df_from_csv = pd.read_csv('data.csv')
print("\n从CSV导入的数据:")
print(df_from_csv)# Excel文件 (需要安装openpyxl: pip install openpyxl)
# 导出到Excel
df.to_excel('data.xlsx', index=False, sheet_name='员工数据')
print("\n已导出到Excel文件")# 从Excel导入
df_from_excel = pd.read_excel('data.xlsx')
print("\n从Excel导入的数据:")
print(df_from_excel)# JSON
# 导出到JSON
df.to_json('data.json', orient='records')
print("\n已导出到JSON文件")# 从JSON导入
df_from_json = pd.read_json('data.json')
print("\n从JSON导入的数据:")
print(df_from_json)# 数据库 (需要安装sqlalchemy和相应数据库驱动)
# 这里使用SQLite作为示例
from sqlalchemy import create_engine
engine = create_engine('sqlite:///example.db')# 写入数据库
df.to_sql('employees', engine, if_exists='replace', index=False)
print("\n已写入到SQLite数据库")# 从数据库读取
df_from_db = pd.read_sql('SELECT * FROM employees', engine)
print("\n从数据库读取的数据:")
print(df_from_db)# 从URL读取数据
try:# 尝试从网络读取数据df_url = pd.read_csv('https://raw.githubusercontent.com/pandas-dev/pandas/master/pandas/tests/data/csv/iris.csv')print("\n从URL导入的数据 (前5行):")print(df_url.head())
except:print("\n无法从URL读取数据,请检查网络连接")# HTML表格
html_data = """
<table><tr><th>Name</th><th>Age</th></tr><tr><td>Alice</td><td>25</td></tr><tr><td>Bob</td><td>30</td></tr>
</table>
"""with open('sample.html', 'w') as f:f.write(html_data)# 从HTML读取
df_html = pd.read_html('sample.html')
print("\n从HTML读取的数据:")
print(df_html[0])  # read_html返回列表,因为一个HTML文件可能包含多个表格

10. 高级功能与性能优化

Pandas 提供了一些高级功能和性能优化技巧,适用于处理大型数据集。

# 分类数据类型
df = pd.DataFrame({'id': range(1000),'category': np.random.choice(['A', 'B', 'C', 'D'], 1000),'value': np.random.randn(1000)
})# 转换为分类类型以节省内存
print(f"原始内存使用: {df['category'].memory_usage()} bytes")
df['category'] = df['category'].astype('category')
print(f"使用分类类型后内存使用: {df['category'].memory_usage()} bytes")# apply函数用于应用自定义操作
def complex_operation(row):if row['category'] in ['A', 'B']:return row['value'] * 2else:return row['value'] / 2# 使用apply应用到每行 (较慢)
start_time = pd.Timestamp.now()
df['result1'] = df.apply(complex_operation, axis=1)
end_time = pd.Timestamp.now()
print(f"\napply方法耗时: {(end_time - start_time).total_seconds()*1000:.2f} ms")# 使用向量化操作 (更快)
start_time = pd.Timestamp.now()
mask = df['category'].isin(['A', 'B'])
df['result2'] = df['value'] * 2
df.loc[~mask, 'result2'] = df.loc[~mask, 'value'] / 2
end_time = pd.Timestamp.now()
print(f"向量化操作耗时: {(end_time - start_time).total_seconds()*1000:.2f} ms")# 确认结果相同
print(f"结果是否相同: {(df['result1'] == df['result2']).all()}")# 分块处理大型文件
def process_in_chunks(filename, chunksize=1000):total_rows = 0for chunk in pd.read_csv(filename, chunksize=chunksize):# 这里可以处理每个分块total_rows += len(chunk)return total_rows# 创建一个大文件作为示例
large_df = pd.DataFrame({'id': range(10000),'value': np.random.randn(10000)
})
large_df.to_csv('large_file.csv', index=False)print(f"\n分块处理大文件,总行数: {process_in_chunks('large_file.csv')}")# 使用query进行高效筛选
start_time = pd.Timestamp.now()
filtered1 = df[(df['value'] > 0) & (df['category'].isin(['A', 'C']))]
end_time = pd.Timestamp.now()
print(f"\n使用布尔索引筛选耗时: {(end_time - start_time).total_seconds()*1000:.2f} ms")start_time = pd.Timestamp.now()
filtered2 = df.query("value > 0 and category in ['A', 'C']")
end_time = pd.Timestamp.now()
print(f"使用query筛选耗时: {(end_time - start_time).total_seconds()*1000:.2f} ms")print(f"结果行数是否相同: {len(filtered1) == len(filtered2)}")

结论

Pandas 是 Python 数据分析的核心工具,提供了丰富的功能来处理和分析各种类型的数据。从数据清洗到高级分析,从数据导入到可视化,Pandas 提供了全面的解决方案。通过掌握本文介绍的核心操作,你将能够更高效地进行数据处理和分析工作。

随着数据集规模的增长,了解如何优化 Pandas 代码以提高性能变得尤为重要。此外,将 Pandas 与其他库(如 NumPy、Matplotlib、scikit-learn 等)结合使用,可以构建强大的数据科学工作流。

相关文章:

Pandas:数据处理与分析的核心操作

Pandas&#xff1a;数据处理与分析的核心操作 Pandas 是 Python 数据分析的核心库&#xff0c;它提供了高性能、易用的数据结构和数据分析工具。本文将详细介绍 Pandas 的核心操作&#xff0c;帮助你高效进行数据处理和分析。 1. Pandas 基础数据结构 Pandas 有两个主要的数…...

Kotlin实现Android应用保活方案

Kotlin实现Android应用保活优化方案 以下的Android应用保活实现方案&#xff0c;更加符合现代Android开发规范&#xff0c;同时平衡系统限制和用户体验。 1. 前台服务方案 class OptimizedForegroundService : Service() {private val notificationId 1private val channel…...

硬件电路(25)-过温保护器件ksd9700温控开关

一、概述 KSD9700系列温控开关是一种双金属作为感温元件的温控器&#xff0c;具有动作迅速、控温精确、控制电流大、使用寿命长的特点&#xff0c;被广泛应用于各类微型电机、电磁炉、空调电机、小家电等做温度保护控制。 二、应用 KSD9700系列产品是一种双金属作为感温元件的…...

vuex实现同一页面radio-group点击不同按钮显示不同表单

本文实现的是点击单一规格和多规格两个按钮会在页面显示不同的表单 方法一 <!-- 单规格和多规格的切换 --> <el-form label-width"80px" class"text-align-left"><el-form-item label"商品规格"><!-- 监听skus_type的改…...

代码随想录训练营第36天 ||1049. 最后一块石头的重量 II 494. 目标和 474. 一和零

1049. 最后一块石头的重量 II 讲解&#xff1a;代码随想录 思路&#xff1a; 01背包问题&#xff1a;题意说要求粉碎石头后留下的最小石头重量&#xff0c;石头粉碎的规则是两个石头如果重量相等&#xff0c;同时粉碎&#xff0c;如果重量不相等&#xff0c;粉碎后的重量是大…...

[Spring]SSM整合

第一步 整合任何框架&#xff0c;首先都是导入相关的jar包&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.18</version></dependency><!--mybatis依…...

【HDFS】HDFS数据迁移与备份全攻略:从日常备份到灾难恢复

目录 1 HDFS数据迁移与备份概述 2 集群间数据迁移&#xff1a;DistCp工具详解 2.1 DistCp工作原理架构 2.2 DistCp标准工作流程 2.3 DistCp性能优化方案 3 离线备份实施策略 3.1 HDFS到本地备份架构 4 灾难恢复方案设计 4.1 基于快照的恢复流程 4.2 数据一致性校验方…...

动态规划入门:背包问题求具体方案(以0-1背包问题为例)

本质&#xff1a;有向图最短&#xff08;长&#xff09;路问题 字典序最小方案&#xff1f;--贪心思路&#xff1f;&#xff08;本题未使用&#xff09; 分析第一个物品&#xff1a; 写代码时tip&#xff1a;要考虑“边读边做”还是“先读后做” #include<iostream> #i…...

git学习日志

你看到的是 Vim 文本编辑器的界面&#xff0c;并非 git 的窗口。这是你通过 vim hello.txt 命令打开的新文件。以下是分步操作指南&#xff1a; 1. 进入编辑模式 按下键盘上的 i 键&#xff08;进入 “INSERT” 模式&#xff09;&#xff0c;此时左下角会显示 -- INSERT --。现…...

数字孪生废气处理工艺流程

图扑数字孪生废气处理工艺流程系统。通过精准 3D 建模&#xff0c;对废气收集、预处理、净化、排放等全流程进行 1:1 数字化复刻&#xff0c;实时呈现设备运行参数、污染物浓度变化等关键数据。 借助图扑可视化界面&#xff0c;管理者可直观掌握废气处理各环节状态&#xff0c…...

iPhone 13P 换超容电池,一年实记的“电池循环次数-容量“柱状图

继上一篇 iPhone 13P 更换"移植电芯"和"超容电池"&#x1f50b;体验&#xff0c;详细记录了如何更换这两种电池&#xff0c;以及各自的优略势对比。 一晃一年过去&#xff0c;时间真快&#xff0c;这次分享下记录了使用超容电池的 “循环次数 - 容量(mAh)…...

豆瓣图书数据采集与可视化分析(二)- 豆瓣图书数据清洗与处理

文章目录 前言一、查看数据基本信息二、拆分pub列三、日期列处理四、价格列处理五、出版社列处理六、评价人数列处理七、缺失值处理八、重复数据处理九、异常值处理十、完整代码十一、清洗与处理后的数据集展示 前言 豆瓣作为国内知名的文化社区&#xff0c;拥有庞大且丰富的图…...

【Sa-Token】学习笔记05 - 踢人下线源码解析

目录 前言 强制注销 踢人下线 源码解析 前言 所谓踢人下线&#xff0c;核心操作就是找到指定 loginId 对应的 Token&#xff0c;并设置其失效。 上图为踢人下线后&#xff0c;前端应该用图像给出来让用户重新登录&#xff0c;而不是让前端收到一个描述着被下线 的JSON 强…...

Linux | I.MX6ULL 文件系统

01 本节所有的测试程序需要开发板有 Qt 环境来运行。我们提供的文件系统是由 yocto 裁剪整理得来的。之后我们会整理一份单独移植的 qt 系统。方便用户移植第三方软件。如果用户的文件系统非我们的出厂版本,请参考之前烧写章节重新烧写出厂文件系统。开发板启动需要输入登录…...

Python3基础语法

一&#xff1a;注释 Python中用#表示单行注释&#xff0c;#之后的同行的内容都会被注释掉。 使用三个连续的双引号表示多行注释&#xff0c;两个多行注释标识之间内容会被视作是注释。 二&#xff1a;基础变量类型与操作符 1. 除法 * 除法 / python3中就算是两个整数相除&a…...

QEMU源码全解析 —— 块设备虚拟化(20)

接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(19) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 特此致谢! 上一回大致解析了drive_new函数,本回重点对于drive_new函数中调用的blockdev_init函…...

JavaScript 笔记 --- part 4 --- Web API (part 2)

(webAPI part2) DOM 基本操作 事件流 定义: 指的是事件完整执行过程中的流动路径 捕获阶段: 事件从最外层的窗口对象开始&#xff0c;逐层向内传播到目标元素&#xff0c;并触发相应的事件处理程序。 冒泡阶段: 事件从目标元素开始&#xff0c;逐层向外传播到最外层的窗口对象…...

从入门到精通汇编语言 第六章(中断及外部设备操作)

参考教程&#xff1a;通俗易懂的汇编语言&#xff08;王爽老师的书&#xff09;_哔哩哔哩_bilibili 一、移位指令 1、8个移位指令 &#xff08;1&#xff09;逻辑左移指令SHL&#xff1a;SHL OPR, CNT。 ①OPR为操作数&#xff0c;CNT为左移位数&#xff0c;该指令将OPR视作…...

PySide6 GUI 学习笔记——常用类及控件使用方法(常用类尺寸QSizeF)

QSizeF 类&#xff08;浮点尺寸类&#xff09; 文章目录 QSizeF 类&#xff08;浮点尺寸类&#xff09;概述主要方法列表详细说明及应用举例注意事项 概述 QSizeF 类使用浮点精度定义二维对象的尺寸。官方文档在这里。 主要方法列表 __init__(self) …...

操作系统中的虚拟化技术深度对话

操作系统中的虚拟化技术深度对话 参与者&#xff1a;系统工程师&#xff08;Engineer&#xff09;、开发者&#xff08;Developer&#xff09;、学生&#xff08;Student&#xff09; 1. 虚拟化的基本概念 Student&#xff1a;虚拟化到底是什么&#xff1f;为什么操作系统需要…...

第35讲:构建属于自己的遥感大模型平台,并接入地理数据工作流

目录 🌍 写在前面 一、为什么要构建属于自己的遥感大模型平台? 二、核心技术选型推荐 ✅ 前端部分 ✅ 后端部分 ✅ 部署平台 三、平台架构设计思路 四、案例实战:构建一个在线遥感分割平台 📌 第一步:模型服务封装(FastAPI) 📌 第二步:前端上传与展示(L…...

langchain-nextjs-template 模板安装与配置

前提条件&#xff1a; node安装yarn 安装&#xff1a;npm install -g yarn 目录 1. 克隆项目2. 安装依赖3. 配置环境变量4. 修改模型配置5. 启动开发服务器6. 项目结构说明7. 功能说明8. 自定义提示模板部分过程文件截图 1. 克隆项目 首先&#xff0c;从 GitHub 克隆 LangCha…...

安卓单机斗地主,具备休闲挑战等多模式

软件介绍 斗地主单机版是一款超适合在安卓设备上玩的游戏。当你周末玩网游玩累了的时候&#xff0c;它就是个很不错的选择哦。 多种模式可选 这个斗地主单机版有不同的模式呢&#xff0c;有休闲模式、挑战模式、炸弹场和大师赛。你可以根据自己的喜好随意挑选模式&#xff0c…...

电解电容失效分析过程、失效分析报告

参考&#xff1a; 深度剖析关键电子元器件电解电容内部故障隐患 电解电容的参数指标 电路板中电解电容是存在寿命的&#xff0c;电解电容中的电解液随着时间会慢慢减少导致电容容值降低&#xff0c;最终导致电源出现问题。相信大家都见过电解电容鼓包的情况。 所以做设计的时…...

Ubuntu修改Swap交换空间大小

前言&#xff1a; 安装Ubuntu系统时&#xff0c;选择了默认空间分配方案&#xff0c;Swap空间仅1G&#xff0c;而实际的物理内存有32G&#xff0c;分给Swap空间至少为内存的1倍&#xff0c;最好是内存值的2倍&#xff0c;系统相当卡顿&#xff0c;重做系统后&#xff0c;费力部…...

SpringBoot 知识图谱

预警:本文非常长,建议先 mark 后看,也许是最后一次写这么长的文章说明:前面有 4 个小节关于 Spring 的基础知识,分别是:IOC 容器、JavaConfig、事件监听、SpringFactoriesLoader 详解,它们占据了本文的大部分内容,虽然它们之间可能没有太多的联系,但这些知识对于理解 …...

智谱开源新一代GLM模型,全面布局AI智能体生态

2024年4月15日&#xff0c;智谱在中关村论坛上正式发布了全球首个集深度研究与实际操作能力于一体的AI智能体——AutoGLM沉思。这一革命性技术的发布标志着智谱在AGI&#xff08;通用人工智能&#xff09;领域的又一次重要突破。智谱的最新模型不仅推动了AI智能体技术的升级&am…...

一文读懂Python之numpy模块(34)

一、模块简介 numpy是Python语言中做科学计算的基础库&#xff0c;重在于数值计算&#xff0c;有一个强大的N维数组对象Array&#xff0c;同时NumPy 提供了大量的库函数和操作&#xff0c;可以帮助程序员轻松地进行Array数值计算。 numpy在数据分析和机器学习领域被广泛使用。…...

Lora 微调自定义device_map

Lora 微调自定义device_map 首先查看模型权重参数配置model.safetensors.index.json 查看多少解码器 这里的layer可以理解为解码器层,后面有qkv,bais,layernomal等 # 显卡数量 num_gpus = 5 # 总层数 num_layers = 28layers_per_gpu = num_layers // num...

二叉树的顺序结构及实现

一.二叉树的顺序结构 二.堆的概念及结构 三.堆的实现 一.二叉树的顺序结构 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆 ( 一种二叉树 ) 使用顺序结构的数组来存储。 二.堆的概念…...

python生成项目依赖文件requirements.txt

文章目录 通过pip freeze去生成通过pipreqs去生成 通过pip freeze去生成 pip freeze > requirements.txt会将整个python的Interceptor的环境下lib包下所有的依赖都生成到这个文件当中&#xff0c;取决于我们使用的python的版本下所有的安装包。不建议使用这种方式&#xff…...

Cribl 对Windows-xml log 进行 -flatten-03

The Flatten Function Description​ The Flatten Function is used to flatten fields out of a nested structure. Lets flatten the _raw JSON object, to further reduce the events size before we send it to the intended destination(s). Steps – Adding a Flatten…...

Java优雅实现判空方法

在 Java 开发中&#xff0c;频繁的 if (obj ! null) 判空代码会导致代码冗余、可读性差&#xff0c;且容易遗漏判空导致 NullPointerException。以下从 语言特性、设计模式、工具类 和 编码规范 四个维度&#xff0c;结合实际案例&#xff0c;详解如何优雅处理空值问题。 一、…...

leetcode 1035. Uncrossed Lines

题目描述 本题本质上就是求nums1和nums2的最长公共子序列的长度。因此本题本质上与第1143题一模一样。 代码&#xff1a; class Solution { public:int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {//本题等价于求nums1和nums2的最长公…...

windows上部署本地知识库(RAG)ollama + docker + ragflow方案

一、部署ollama 如何部署本地部署ollama参照我另一篇博客:Windows安装ollama部署本地大模型_ollama 在哪里运行的大模型-CSDN博客 二、部署docker 1、下载docker: 下载地址: Docker: Accelerated Container Application Development 2、winds(winds11)安装或者更新ws…...

多Agent框架及协作机制详解

文章目录 一、多智能体系统介绍1.1 多智能体系统定义1.2 多智能体协作1.3 协作类型1.4 协作策略1.5 通信结构1.6 协调与编排 1.3 多智能体与单智能体对比1.4 应用场景 二、多Agent开发框架AutoGenMetaGPTLangGraphSwarmCrewAI 三、多智能体协作方式3.1 MetaGPT&#xff1a;SOP驱…...

Cribl 对Windows-xml log 进行 -Removing filed-06

Removing Fields Description​ The Eval Function can be used to add or remove fields. In this example we will remove the extracted fields while preserving _raw, _time,index,source, sourcetype. Steps - Adding an Eval Function...

Linux 常用指令用户手册

Linux 常用指令用户手册 适合新手入门 & 日常速查 目录 基础操作文件与目录管理权限与所有权文本处理压缩与解压系统监控网络操作进程管理实用小技巧 1. 基础操作 1.1 查看系统信息 # 查看内核版本 uname -a# 查看系统发行版信息&#xff08;适用于 Debian/Ubuntu&…...

Java EE(20)——线程安全——ThreadLocal

1.前言 在面的线程安全相关的博文中&#xff0c;解决线程安全问题的方法主要使用synchronized和volatile两个关键字。引发线程安全问题的根本原因是多个线程同时对共享变量进行写操作&#xff0c;而上述两个关键字并没有改变"多个线程写同一个变量"这个情况。以sync…...

树莓派超全系列教程文档--(36)树莓派条件过滤器设置

树莓派条件过滤器设置 条件过滤器[all] 过滤器型号过滤器[none] 过滤器[tryboot] 过滤器[EDID*] 过滤器序列号过滤器GPIO过滤器组合条件过滤器 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 条件过滤器 当将单个 SD 卡&#xff08;或卡图像&am…...

Vue3核心源码解析

/packages/complier-core 定位​​&#xff1a;​​编译时核心​​&#xff0c;处理 Vue 模板的编译逻辑。​​核心功能​​&#xff1a; ​​模板解析​​&#xff1a;将 .vue 文件的模板语法&#xff08;HTML-like&#xff09;解析为 ​​抽象语法树 (AST)​​。​​转换优化…...

JavaScript解密实战指南:从基础到进阶技巧

JavaScript加密技术广泛应用于数据保护、反爬虫和代码混淆&#xff0c;但掌握解密方法能帮助开发者突破技术壁垒。本文结合爬虫实战与安全分析场景&#xff0c;系统梳理JS解密的核心方法与工具。 一、基础解密方法 1. Base64解码 适用于简单编码场景&#xff0c;如Cookie加密…...

指针(2)

1.数组名的理解 使用指针访问数组的内容时&#xff0c;有这样的代码&#xff1a; int arr[10]{1,2,3,4,5,6,7,8,9,10}int * p&arr[0]; &arr[0] 的方式拿到了数组的第一个元素的地址&#xff0c;但是其实数组名本来就是地址&#xff0c;而且还是首元素的地址&#xf…...

Android开发中广播(Broadcast)技术详解

在 Android 开发中&#xff0c;广播&#xff08;Broadcast&#xff09; 是一种广泛使用的组件通信机制&#xff0c;它允许应用程序在不直接交互的情况下传递消息。本文将详细讲解 Android 广播的基本概念、类型、发送与接收流程、使用场景及注意事项&#xff0c;并结合具体的代…...

Python网络爬虫设计(三)

目录 一、需要登录的爬虫 二、pyppeteer与requests库结合 1、cookie和session 三、其他 1、绝对网址和相对网址 2、sleep函数 一、需要登录的爬虫 在众多种类的页面中&#xff0c;不同的页面有不同的功能&#xff0c;有的是进行展示的&#xff0c;而有的则是登录类的。在…...

【深度学习—李宏毅教程笔记】各式各样的 Attention

目录 一、普通 Self-Attention 的痛点 二、对 Self-Attention 的优化方式 1、Local Attention / Truncated Attention 2、Stride Attention 3、Global Attention 4、知名的 Self-Attention 的变形的应用 &#xff08;1&#xff09;Longformer &#xff08;2&#xff09…...

leetcode 1143. Longest Common Subsequence

目录 题目描述 第一步&#xff0c;明确并理解dp数组及下标的含义 第二步&#xff0c;分析明确并理解递推公式 第三步&#xff0c;理解dp数组如何初始化 第四步&#xff0c;理解遍历顺序 代码 题目描述 这道题和第718题的区别就是&#xff0c;本题求的是最长公共子序列的长…...

Unity C\# 实战:从零开始为游戏添加背景音乐与音效 (AudioSource/AudioClip/AudioMixer 详解)

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

【代码解读】开源模型 minimind之pretrain

minimind原模型地址: https://github.com/jingyaogong/minimind 本文解读下开源模型minimind的预训练代码 train_pretrain.py&#xff0c;解释以代码注释的形式添加 1. 参数配置代码 parser argparse.ArgumentParser(description"MiniMind Pretraining") parser.ad…...

wordpress独立站的产品详情页添加WhatsApp链接按钮

在WordPress外贸独立站的产品展示页添加WhatsApp链接按钮&#xff0c;可以帮助客户更方便地与你联系。以下是实现这一功能的步骤&#xff1a; 方法一&#xff1a;使用HTML代码添加按钮 编辑产品展示页 进入WordPress后台&#xff0c;找到需要添加WhatsApp按钮的产品展示页。…...