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

机器学习 Day05 pandas库

1.pandas介绍和优点

Pandas 是 2008 年由 Wes McKinney 开发的开源 Python 库 。它专门用于数据挖掘和数据分析,具有以下特点:

  • 数据结构独特:核心数据结构为 Series(一维)和 DataFrame(二维) 。Series 可看作带标签的一维数组,能存储多种数据类型;DataFrame 类似电子表格或 SQL 表,是带行列标签的二维数据结构,便于处理结构化数据。
  • 基于 Numpy:以 Numpy 为基础构建,借助 Numpy 在数值计算方面高性能、高效能的优势,处理大规模数据时运算速度快。
  • 数据处理功能强大:能轻松处理数据的读取、清洗、转换、合并、重塑等操作。比如处理缺失值(填充、删除) ,处理重复值,对数据进行分组聚合计算等。
  • 文件读取便捷:支持读取多种格式文件,如 CSV、Excel、JSON、SQL 等 ,方便从不同数据源获取数据。
  • 可视化支持:基于 Matplotlib 库,能简便地绘制各类图表,如折线图、柱状图、散点图等,利于数据可视化分析。

优点:

增强图表可读性

  • Numpy 原始数据展示
  • 效果:单纯的 Numpy 数组只是数值罗列,没有行列标识,难以直观知道每一行代表哪个学生,每一列代表哪门课程,可读性差。
  • Pandas 优化后展示
import pandas as pd
import numpy as np
scores_numpy = np.array([[92, 55, 78, 50, 50],[71, 76, 50, 48, 96],[45, 84, 78, 51, 68],[81, 91, 56, 54, 76],[86, 66, 77, 67, 95],[46, 86, 56, 61, 99],[46, 95, 44, 46, 56],[80, 50, 45, 65, 57],[41, 93, 90, 41, 97],[65, 83, 57, 57, 40]])
scores_df = pd.DataFrame(scores_numpy, columns=['语文', '数学', '英语', '政治', '体育'],index=[f'同学{i}' for i in range(len(scores_numpy))])
print(scores_df)
  • 效果:使用 Pandas 的DataFrame将 Numpy 数组转换为表格形式,明确指定了列名(课程名称)和行索引(学生标识) ,数据展示清晰明了,一眼就能定位每个学生对应课程的成绩,极大增强了可读性。

便捷的数据处理能力(以处理缺失值为例)

  • 原始数据(含缺失值)
  • 效果:生成的 DataFrame 中存在NaN表示的缺失值,这些缺失值会影响后续数据分析,如计算均值、统计等操作的准确性。
  • 处理缺失值 - 删除法
import pandas as pd
import numpy as np
data = {'col1': [1, 2, np.nan, 4],'col2': [5, np.nan, 7, 8]
}
df = pd.DataFrame(data)
df_dropped = df.dropna()  # 默认丢弃包含任何缺失值的行
print(df_dropped)
  • 效果:使用dropna()函数,直接剔除了含有缺失值的行,使数据集中不再有缺失值干扰,但可能会丢失部分数据信息。
  • 处理缺失值 - 填充法
  • 效果:通过fillna()函数,用指定的值(这里是 0)填充了缺失值,保证了数据集的完整性,在不丢失数据行的情况下,让数据可以继续用于后续分析。

2.pandas的数据结构

2.1Series知识点

2.1.1. Series 的定义与结构

Series 是 Pandas 中类似于一维数组的数据结构,能保存整数、字符串、浮点数等任何类型数据,由数据和相关索引两部分构成。就像一个有序的键值对集合,索引相当于键,数据相当于值。

2.1.2 Series 的创建

  • 通过已有数据创建 - 指定内容,默认索引
import pandas as pd
import numpy as np
# 使用np.arange(10)生成0到9的一维数组,传入pd.Series创建Series对象
s1 = pd.Series(np.arange(10)) 
print(s1)

这里pd.Series()函数,当只传入数据(data参数),未指定索引(index参数)时 ,会自动创建从 0 开始的整数索引。运行后会得到一个包含 0 到 9,索引从 0 到 9 的 Series 对象,数据类型(dtype)为int64

  • 指定索引
import pandas as pd
# 传入数据列表[6.7, 5.6, 3, 10, 2],并指定索引为[1, 2, 3, 4, 5]
s2 = pd.Series([6.7, 5.6, 3, 10, 2], index=[1, 2, 3, 4, 5]) 
print(s2)

此代码中,通过index参数明确指定了索引值。创建出的 Series 对象,索引是 [1, 2, 3, 4, 5] ,对应的数据是 [6.7, 5.6, 3, 10, 2] ,数据类型为float64 。

  • 通过字典数据创建
import pandas as pd
# 传入字典{'red':100, 'blue':200, 'green':500, 'yellow':1000}创建Series
color_count = pd.Series({'red':100, 'blue':200, 'green':500, 'yellow':1000}) 
print(color_count)

用字典创建 Series 时,字典的键会自动成为索引,值成为对应的数据。运行后得到的 Series 对象,索引是 ['blue', 'green','red', 'yellow'] ,数据是 [200, 500, 100, 1000] ,数据类型为int64 。

2.1.2 Series 的属性

  • index 属性
import pandas as pd
color_count = pd.Series({'red':100, 'blue':200, 'green':500, 'yellow':1000})
# 获取Series对象的索引
print(color_count.index) 

index属性用于获取 Series 对象的索引。运行代码后,会得到一个 Index 对象,包含了 ['blue', 'green','red', 'yellow'] ,数据类型为object 。

  • values 属性
import pandas as pd
color_count = pd.Series({'red':100, 'blue':200, 'green':500, 'yellow':1000})
# 获取Series对象的数据
print(color_count.values) 

values属性用于获取 Series 对象中的数据。运行代码后,会得到一个 Numpy 数组,包含 [200, 500, 100, 1000] ,这就是 Series 中存储的数据内容。

这两个属性都是(n*1)类型的,即列向量。可以用对象.shape()查看。

  • 使用索引获取数据
import pandas as pd
color_count = pd.Series({'red':100, 'blue':200, 'green':500, 'yellow':1000})
# 使用索引获取数据,这里索引2对应的值是100
print(color_count[2]) 

可以像访问数组一样,使用索引来获取 Series 中的数据。这里的索引可以是整数索引(按顺序),也可以是自定义的标签索引(如字典创建时的键 )。运行后会输出索引为 2 对应的数据值 100 。

2.2DataFrame知识点

2.2.1 DataFrame 的定义与结构

DataFrame 是 Pandas 中类似二维数组或表格(如 Excel)的对象,兼具行索引(横向,axis=0 )和列索引(纵向,axis=1 ) ,方便对二维数据进行操作和管理。

2.2.2 DataFrame 的创建

  • 通过已有数据创建 - 示例一
import pandas as pd
import numpy as np
# 创建一个2行3列,元素为随机数的DataFrame
df1 = pd.DataFrame(np.random.randn(2, 3)) 
print(df1)

运行结果类似:

          0         1         2
0 -0.834694 -0.147477  0.364357
1 -0.703061 -0.171343 -0.346670

这里使用np.random.randn(2, 3)生成一个 2 行 3 列的随机数数组,传入pd.DataFrame()创建 DataFrame。由于未指定索引,行索引和列索引默认从 0 开始编号。

  • 示例二:创建学生成绩表
import pandas as pd
import numpy as np
# 生成10名同学,5门功课的随机成绩数据(40到100分之间)
score = np.random.randint(40, 100, (10, 5)) 
# 直接将数组转换为DataFrame
score_df = pd.DataFrame(score)
print(score_df)

运行结果类似:

    0   1   2   3   4
0  92  55  78  50  50
1  71  76  50  48  96
2  45  84  78  51  68
3  81  91  56  54  76
4  86  66  77  67  95
5  46  86  56  61  99
6  46  95  44  46  56
7  80  50  45  65  57
8  41  93  90  41  97
9  65  83  57  57  40

此时虽然将数据转换为了 DataFrame,但列索引是 0 - 4,行索引是 0 - 9,可读性不佳。

  • 增加行列索引,提升可读性
import pandas as pd
import numpy as np
score = np.random.randint(40, 100, (10, 5)) 
# 构造行索引序列
subjects = ["语文", "数学", "英语", "政治", "体育"]
# 构造列索引序列
stu = ['同学' + str(i) for i in range(score.shape[0])]
# 添加行索引和列索引创建DataFrame
data = pd.DataFrame(score, columns=subjects, index=stu)
print(data)

运行结果类似:

      语文  数学  英语  政治  体育
同学0  92  55  78  50  50
同学1  71  76  50  48  96
同学2  45  84  78  51  68
同学3  81  91  56  54  76
同学4  86  66  77  67  95
同学5  46  86  56  61  99
同学6  46  95  44  46  56
同学7  80  50  45  65  57
同学8  41  93  90  41  97
同学9  65  83  57  57  40

2.2.3DataFrame 的属性(对象.属性)不加括号

  • shape 属性
import pandas as pd
import numpy as np
score = np.random.randint(40, 100, (10, 5)) 
subjects = ["语文", "数学", "英语", "政治", "体育"]
stu = ['同学' + str(i) for i in range(score.shape[0])]
data = pd.DataFrame(score, columns=subjects, index=stu)
print(data.shape)

运行结果为:(10, 5) ,表示 DataFrame 有 10 行 5 列。

  • index 属性
import pandas as pd
import numpy as np
score = np.random.randint(40, 100, (10, 5)) 
subjects = ["语文", "数学", "英语", "政治", "体育"]
stu = ['同学' + str(i) for i in range(score.shape[0])]
data = pd.DataFrame(score, columns=subjects, index=stu)
print(data.index)

运行结果类似:Index(['同学0', '同学1', '同学2', '同学3', '同学4', '同学5', '同学6', '同学7', '同学8', '同学9'], dtype='object') ,展示了 DataFrame 的行索引内容。

  • columns 属性
import pandas as pd
import numpy as np
score = np.random.randint(40, 100, (10, 5)) 
subjects = ["语文", "数学", "英语", "政治", "体育"]
stu = ['同学' + str(i) for i in range(score.shape[0])]
data = pd.DataFrame(score, columns=subjects, index=stu)
print(data.columns)

运行结果类似:Index(['语文', '数学', '英语', '政治', '体育'], dtype='object') ,展示了 DataFrame 的列索引内容。

  • values 属性
import pandas as pd
import numpy as np
score = np.random.randint(40, 100, (10, 5)) 
subjects = ["语文", "数学", "英语", "政治", "体育"]
stu = ['同学' + str(i) for i in range(score.shape[0])]
data = pd.DataFrame(score, columns=subjects, index=stu)
print(data.values)

运行果类似:

array([[92, 55, 78, 50, 50],[71, 76, 50, 48, 96],[45, 84, 78, 51, 68],[81, 91, 56, 54, 76],[86, 66, 77, 67, 95],[46, 86, 56, 61, 99],[46, 95, 44, 46, 56],[80, 50, 45, 65, 57],[41, 93, 90, 41, 97],[65, 83, 57, 57, 40]])

该属性返回 DataFrame 中的数据,以 Numpy 数组形式呈现。

  • T 属性(转置)
import pandas as pd
import numpy as np
score = np.random.randint(40, 100, (10, 5)) 
subjects = ["语文", "数学", "英语", "政治", "体育"]
stu = ['同学' + str(i) for i in range(score.shape[0])]
data = pd.DataFrame(score, columns=subjects, index=stu)
print(data.T)

运行结果类似:

      同学0  同学1  同学2  同学3  同学4  同学5  同学6  同学7  同学8  同学9
语文    92   71   45   81   86   46   46   80   41   65
数学    55   76   84   91   66   86   95   50   93   83
英语    78   50   78   56   77   56   44   45   90   57
政治    50   48   51   54   67   61   46   65   41   57
体育    50   96   68   76   95   99   56   57   97   40

T属性将 DataFrame 的行和列进行转置,即原来的行变为列,原来的列变为行。

  • head () 方法
import pandas as pd
import numpy as np
score = np.random.randint(40, 100, (10, 5)) 
subjects = ["语文", "数学", "英语", "政治", "体育"]
stu = ['同学' + str(i) for i in range(score.shape[0])]
data = pd.DataFrame(score, columns=subjects, index=stu)
print(data.head(5))

运行结果类似:

      语文  数学  英语  政治  体育
同学0  92  55  78  50  50
同学1  71  76  50  48  96
同学2  45  84  78  51  68
同学3  81  91  56  54  76
同学4  86  66  77  67  95

head()方法默认显示 DataFrame 的前 5 行数据,传入参数N可显示前N行 。

  • tail () 方法
import pandas as pd
import numpy as np
score = np.random.randint(40, 100, (10, 5)) 
subjects = ["语文", "数学", "英语", "政治", "体育"]
stu = ['同学' + str(i) for i in range(score.shape[0])]
data = pd.DataFrame(score, columns=subjects, index=stu)
print(data.tail(5))

运行结果类似:

      语文  数学  英语  政治  体育
同学5  46  86  56  61  99
同学6  46  95  44  46  56
同学7  80  50  45  65  57
同学8  41  93  90  41  97
同学9  65  83  57  57  40

tail()方法默认显示 DataFrame 的后 5 行数据,传入参数N可显示后N行 。

2.2.4修改行列索引值

假设有一个已有的 DataFrame data (基于之前学生成绩表示例 ),要修改行索引值。使用对象.index=新索引(列表)

import pandas as pd
import numpy as np
# 生成10名同学,5门功课的随机成绩数据(40到100分之间)
score = np.random.randint(40, 100, (10, 5)) 
subjects = ["语文", "数学", "英语", "政治", "体育"]
stu = ['同学' + str(i) for i in range(score.shape[0])]
data = pd.DataFrame(score, columns=subjects, index=stu)
# 构造新的行索引列表
new_stu = ["学生_" + str(i) for i in range(data.shape[0])]
# 整体修改行索引
data.index = new_stu
print(data)

这里不能像data.index[3] = '学生_3' 这样单独修改某个索引值,因为index属性是整体赋值的,需要一次性替换整个索引序列。本质是index是一个不可变对象,你修改不可变对象就是重新开辟了一个空间把index指向这个空间,所以这个index-new要重新全部更改。

2.3.2 重设索引

对象.reset_index(drop=)

  • drop=False(默认情况)
import pandas as pd
import numpy as np
score = np.random.randint(40, 100, (10, 5)) 
subjects = ["语文", "数学", "英语", "政治", "体育"]
stu = ['同学' + str(i) for i in range(score.shape[0])]
data = pd.DataFrame(score, columns=subjects, index=stu)
# 重设索引,不删除原来索引
new_data = data.reset_index()
print(new_data)

运行后,会新增一列从 0 开始的整数索引,原来的行索引(如同学0等 )变成了名为index的普通列。

  • drop=True
import pandas as pd
import numpy as np
score = np.random.randint(40, 100, (10, 5)) 
subjects = ["语文", "数学", "英语", "政治", "体育"]
stu = ['同学' + str(i) for i in range(score.shape[0])]
data = pd.DataFrame(score, columns=subjects, index=stu)
# 重设索引,删除原来索引
new_data = data.reset_index(drop=True)
print(new_data)

此时,原来的行索引被直接删除,仅保留从 0 开始的新整数索引。

2.3.3 以某列值设置为新的索引

对象.set_index(列(可以多个之后讲))

  • 设置单索引
import pandas as pd
# 创建示例DataFrame
df = pd.DataFrame({'month': [1, 4, 7, 10],'year': [2012, 2014, 2013, 2014],'sale': [55, 40, 84, 31]})
# 以month列设置为新的索引,默认drop=True,删除原来的month列
new_df = df.set_index('month')
print(new_df)

运行后,month列的值成为了新的索引,原month列被删除(因为drop=True )。

  • 设置多索引
import pandas as pd
df = pd.DataFrame({'month': [1, 4, 7, 10],'year': [2012, 2014, 2013, 2014],'sale': [55, 40, 84, 31]})
# 以year和month列设置为新的索引
new_df = df.set_index(['year','month'])
print(new_df)

运行后,DataFrame 变为具有多层索引(MultiIndex)的结构yearmonth共同构成索引,方便从不同层级对数据进行筛选和分析。

3.基本数据操作(注意这里讲解二维结构,但一维也适用,只不过是特殊的二维)

3.1索引查找操作

数据准备

import pandas as pd
# 读取文件
data = pd.read_csv("./data/stock_day.csv")
# 删除一些列,让数据更简单些,再去做后面的操作
data = data.drop(["ma5","ma10","ma20","v_ma5","v_ma10","v_ma20"], axis=1)

这里pd.read_csv()用于读取 CSV 格式文件,参数为文件路径,将文件数据读取为 DataFrame。data.drop()用于删除指定列,keys参数是要删除的列名列表(这里是 ["ma5","ma10","ma20","v_ma5","v_ma10","v_ma20"] ),axis=1表示按列删除(axis=0表示按行 )。

3.1.1 直接使用行列索引 (先列后行)

  • 代码及结果
# 直接使用行列索引名字的方式 (先列后行)
result = data['open']['2018-02-27']
print(result)
# 输出:23.53
  • 总结:这种方式先通过列名获取对应列(返回 Series ),再通过行索引获取对应行数据。但不支持先指定行再指定列(如data['2018-02-27']['open'] ),也不支持类似 Numpy 的切片语法(如data[:1, :2] ) 。

3.1.2 结合 loc 或者 iloc 使用索引,两者都是先行后列,但使用的方法不同

  • 使用 loc,loc只能用index和columns名字检索
# 使用loc:只能指定行列索引的名字
result_loc = data.loc['2018-02-27':'2018-02-22', 'open']
print(result_loc)

运行结果(示例 ):

2018-02-27    23.53
2018-02-26    22.80
2018-02-23    22.88
Name: open, dtype: float64
  • 总结data.loc[]中只能使用索引名称进行操作,不能使用位置下标 。
  • 使用 iloc
    • 代码及结果
# 使用iloc可以通过索引的下标去获取
# 获取前3天数据,前5列的结果
result_iloc = data.iloc[:3, :5]
print(result_iloc)

运行结果(示例 ):

            open    high   close     low
2018-02-27  23.53  25.88  24.16  23.53
2018-02-26  22.80  23.78  23.53  22.80
2018-02-23  22.88  23.37  22.82  22.71
  • 总结data.iloc[]中只能使用位置下标进行操作,不能使用索引名称 。

3.1.3 使用 ix 组合索引(有些版本已弃用,但是很好用,它可以混合使用)

  • 代码及结果
# 使用ix进行下标和名称组合做索引
# 因已弃用,实际运行会有警告提示,这里仅展示代码形式
result_ix = data.ix[:4, ['open', 'close', 'high', 'low']] 
print(result_ix)

运行结果(示例 )

  • 推荐替代方案及总结
    • 使用 loc,都转化为索引名
result_loc_alternative = data.loc[data.index[:4], ['open', 'close', 'high', 'low']]
print(result_loc_alternative)
  •  使用 iloc,都转化为下标,可以使用get_indexer函数来得到对应的下标
col_indices = data.columns.get_indexer(['open', 'close', 'high', 'low'])
result_iloc_alternative = data.iloc[:4, col_indices]
print(result_iloc_alternative)

ix在 Pandas 0.20.0 后已弃用,推荐使用loc(基于索引名称 )和iloc(基于索引位置 )替代。loc中第一个参数通过data.index[:4]获取前 4 个行索引名称,第二个参数是列名列表;iloc中第一个参数是行索引位置范围,第二个参数通过data.columns.get_indexer()获取指定列名的位置索引 。

这里为大家展示一下一种基本用法,就是无论怎么样索引,那个位置可以是一个列表,作用就是拆开这个列表,分别去检索比如对象.ix(1,[2,3])就可以检索到第二行第三列和第4列的数据。

3.2赋值操作

很简单,通过索引之后直接赋值即可。

3.3排序操作

3.3.1 DataFrame 排序(一维二维数据都是对象.sort_index/values())

  • sort_values函数
    • 按单个键排序
import pandas as pd
# 读取股票数据
data = pd.read_csv("./data/stock_day.csv")
# 按照开盘价大小进行升序排序并查看前几行
sorted_data_single = data.sort_values(by="open", ascending=True).head()
print(sorted_data_single)

这里by="open"指定以open(开盘价)这一列作为排序参考的键 ,ascending=True表示升序排列。运行后会得到按开盘价升序排列的前几行股票数据。

  • 按多个键排序
import pandas as pd
data = pd.read_csv("./data/stock_day.csv")
# 按照open和high列进行排序
sorted_data_multiple = data.sort_values(by=['open', 'high'])
print(sorted_data_multiple)

by=['open', 'high']指定以open列和high列作为排序参考的键,默认升序排列。先按open列排序,若open列值相同,再按high列排序。

  • sort_index函数
import pandas as pd
data = pd.read_csv("./data/stock_day.csv")
# 对索引进行排序(假设索引是日期,从小到大排序)
sorted_index_data = data.sort_index()
print(sorted_index_data)

sort_index函数用于对 DataFrame 的索引进行排序,默认升序。这里假设索引是日期,运行后会将索引(日期)从小到大重新排列数据。

3.3.2 Series 排序

  • sort_values函数
import pandas as pd
data = pd.read_csv("./data/stock_day.csv")
# 对p_change列数据(Series)进行升序排序并查看前几行
sorted_series_values = data['p_change'].sort_values(ascending=True).head()
print(sorted_series_values)

ascending=True指定升序,对p_change列(Series)的数据进行升序排列,然后通过head()查看前几行。

  • sort_index函数
import pandas as pd
data = pd.read_csv("./data/stock_day.csv")
# 对p_change列(Series)的索引进行排序并查看前几行
sorted_series_index = data['p_change'].sort_index().head()
print(sorted_series_index)

sort_index函数对p_change列(Series)的索引进行排序,默认升序,然后通过head()查看前几行排序后的结果。

4.DataFrame运算

4.1. 算术运算

  • add(other)函数
import pandas as pd
data = pd.read_csv("./data/stock_day.csv")
# 对open列的数据都加上1
result_add = data['open'].add(1)
print(result_add.head())

add(other)函数用于对 Series 或 DataFrame 进行加法运算,这里other为 1 ,将data['open']中的每个元素都加上 1 。类似的还有sub()(减法)、mul()(乘法)、div()(除法)等函数。

4.2. 逻辑运算

  • 逻辑运算符号
    • 单条件筛选
import pandas as pd
data = pd.read_csv("./data/stock_day.csv")
# 筛选open列大于23的数据
result_single_condition = data[data["open"] > 23].head()
print(result_single_condition)

data["open"] > 23返回一个布尔型 Series,True 表示对应行的open值大于 23 ,然后将其作为索引条件筛选出满足条件的行。

  • 多条件筛选
import pandas as pd
data = pd.read_csv("./data/stock_day.csv")
# 筛选open列大于23且小于24的数据
result_multiple_condition = data[(data["open"] > 23) & (data["open"] < 24)].head()
print(result_multiple_condition)

多个条件组合时,每个条件需用括号括起来,&表示逻辑与,筛选出同时满足两个条件的行。

  • 逻辑运算函数
    • query(expr)函数
import pandas as pd
data = pd.read_csv("./data/stock_day.csv")
# 使用query筛选open列大于23且小于24的数据
result_query = data.query("open<24 & open>23").head()
print(result_query)

query(expr)expr是查询字符串,以更简洁的语法实现条件筛选,效果与上述多条件筛选类似。

  • isin(values)函数
import pandas as pd
data = pd.read_csv("./data/stock_day.csv")
# 筛选open列值为23.53或23.85的数据
result_isin = data[data["open"].isin([23.53, 23.85])]
print(result_isin)

isin(values)用于判断列中的值是否在指定的values列表中(注意不是区间),返回布尔型 Series,进而筛选出符合条件的行。

4.3. 统计运算

  • describe()函数
import pandas as pd
data = pd.read_csv("./data/stock_day.csv")
# 对数据进行综合统计分析
result_describe = data.describe()
print(result_describe)

describe()函数自动计算数值列的计数(count)、均值(mean)、标准差(std)、最小值(min)、25% 分位数(25% )、50% 分位数(中位数,50% )、75% 分位数(75% )、最大值(max)等统计量。

  • 统计函数
    • 按列计算统计量
import pandas as pd
data = pd.read_csv("./data/stock_day.csv")
# 按列计算最大值
result_max = data.max()
print(result_max)

默认axis=0,按列计算,返回每列的最大值。

  • 按行计算统计量
import pandas as pd
data = pd.read_csv("./data/stock_day.csv")
# 按行计算最大值
result_max_row = data.max(axis=1)
print(result_max_row.head())

指定axis=1,按行计算,返回每行的最大值。其他统计函数如min()mean()median()等用法类似。

  • 累计统计函数(有很多用的时候自己查)
    • cumsum()函数示例
import pandas as pd
data = pd.read_csv("./data/stock_day.csv")
# 计算p_change列的累计和
result_cumsum = data['p_change'].cumsum()
print(result_cumsum.head())

cumsum()计算前 1/2/3/.../n 个数的和,其他累计统计函数cummax()(计算前 n 个数的最大值 )、cummin()(计算前 n 个数的最小值 )、cumprod()(计算前 n 个数的积 )用法类似。

绘图展示(cumsum结果可视化)

import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv("./data/stock_day.csv")
# 计算p_change列的累计和
stock_rise = data['p_change']
cumulative_sum = stock_rise.cumsum()
# 绘制累计和图形
cumulative_sum.plot()
# 显示图形
plt.show()

通过matplotlib库的plot()函数绘制累计和的折线图,plt.show()展示图形,直观呈现数据累计变化趋势

4.4自定义运算apply函数

apply(func, axis=0) 函数用于对 DataFrame 的行或列应用自定义函数进行运算。

  • 参数
    • func:是一个自定义函数,可以是普通函数定义,也可以是 lambda 匿名函数,用于指定具体的运算逻辑。
    • axis:指定运算的方向,axis=0(默认值)表示按列运算,即对每一列应用函数;axis=1表示按行运算,即对每一行应用函数。
  • 代码示例
import pandas as pd
# 假设已读取股票数据
data = pd.read_csv("./data/stock_day.csv")
# 定义一个lambda匿名函数,计算每列的最大值减去最小值
result = data[['open', 'close']].apply(lambda x: x.max() - x.min(), axis=0)
print(result)

这里使用 lambda 表达式定义了一个函数,功能是计算传入数据(列数据 )的最大值与最小值之差。axis=0指定按列进行运算,所以最终得到open列和close列各自的最大值与最小值的差值。

如果要按行运算,示例如下:

import pandas as pd
data = pd.read_csv("./data/stock_day.csv")
# 定义按行计算open和close列差值的函数
def row_diff(row):return row['open'] - row['close']
result_row = data[['open', 'close']].apply(row_diff, axis=1)
print(result_row.head())

这里定义了普通函数row_diff ,接收一行数据,计算该行中open列与close列的差值。axis=1指定按行运算,最终得到每行中openclose的差值。

5.pandas画图(很简单,因为很简单所以绘制一些复杂图还得使用matplotlib)

数据.plot(kind="")即可,kind里面放类型就行

6.文件的读取和存储(其实函数都一样都是pd.read_格式()和pd.to_格式)

6.1. CSV 文件操作

6.1.1 read_csv函数
  • 函数语法及参数
    pandas.read_csv(filepath_or_buffer, sep=',', usecols=None, header='infer', ...)
    • filepath_or_buffer:必填参数,用于指定要读取的 CSV 文件路径,既可以是本地文件路径,也可以是类似 URL 的远程文件路径。例如"./data/stock_day.csv" ,表示当前目录下data文件夹中的stock_day.csv文件。
    • sep:可选参数,指定文件中数据的分隔符,默认为逗号',' 。在实际应用中,如果 CSV 文件是用制表符'\t'分隔数据,就需要设置sep='\t' 。
    • usecols:可选参数,用于指定读取文件时需要选取的列。可以是列名组成的列表,如['open', 'close'] ,表示只读取文件中的open列和close列数据。
    • header:可选参数,用于指定文件中哪一行作为列名。默认值为'infer' ,即自动推断文件第一行是否为列名。如果文件没有列名,可以设置header=None ,并在读取后手动指定列名;如果列名在第二行,可设置header=1 。
  • 代码示例
import pandas as pd
# 读取文件,并且指定只获取'open', 'close'指标
data = pd.read_csv("./data/stock_day.csv", usecols=['open', 'close'])
print(data.head())

此代码从"./data/stock_day.csv"文件中读取数据,仅选取open列和close列,然后展示前几行数据。

6.1.2 to_csv函数
  • 函数语法及参数
    DataFrame.to_csv(path_or_buf=None, sep=',', columns=None, header=True, index=True, mode='w', encoding=None, ...)
    • path_or_buf:必填参数,指定保存 CSV 文件的路径或文件对象。如"./data/test.csv" ,表示将 DataFrame 数据保存到当前目录下data文件夹中的test.csv文件。
    • sep:可选参数,指定保存文件时数据的分隔符,默认为逗号',' ,用法与read_csv中的sep类似。
    • columns:可选参数,用于指定要保存到文件中的列。如['open'] ,表示只将 DataFrame 中的open列保存到 CSV 文件。
    • header:可选参数,布尔值或字符串列表,默认为True ,表示将 DataFrame 的列名写入文件作为表头。若设置为False ,则不写入列名;若传入字符串列表,如['col1', 'col2'] ,则使用传入的字符串作为列名写入文件。
    • index:可选参数,布尔值,默认为True ,表示将 DataFrame 的索引写入文件。若设置为False ,则不写入索引。
    • mode:可选参数,指定文件写入模式,'w'表示重写(覆盖原文件),'a'表示追加(在原文件末尾添加数据)。
  • 代码示例
import pandas as pd
# 假设data是已有的DataFrame
data = pd.DataFrame({'open': [23.53, 22.80, 22.88], 'close': [24.16, 23.53, 22.82]})
# 选取10行数据保存,便于观察数据
data[:10].to_csv("./data/test.csv", columns=['open'], index=False)
# 读取,查看结果
read_data = pd.read_csv("./data/test.csv")
print(read_data)

此代码先从data中选取前 10 行数据,将其中的open列保存到"./data/test.csv"文件中,并且不保存索引。然后再读取该文件并展示内容。

6.2. HDF5 文件操作

6.2.1 read_hdfto_hdf函数
  • pandas.read_hdf函数
    • 函数语法及参数
      pandas.read_hdf(path_or_buf, key=None, **kwargs)
      • path_or_buf:必填参数,用于指定 HDF5 文件的路径,可以是本地文件路径,如"./data/day_close.h5" ,表示当前目录下data文件夹中的day_close.h5文件。
      • key:必填参数,指定要从 HDF5 文件中读取的数据的主键。HDF5 文件可存储多个数据集,通过键来区分和读取特定数据集。如果数据只有一列,无需指定
      • **kwargs:可选参数,用于传递其他关键字参数,可用于进一步配置读取行为,如数据格式转换等。
    • 代码示例
import pandas as pd
# 从HDF5文件中读取数据
day_eps_ttm = pd.read_hdf("./data/day_close.h5", key="day_eps_ttm")
print(day_eps_ttm.head())

此代码从"./data/day_close.h5"文件中,读取键为day_eps_ttm的数据,并展示前几行内容。

  • DataFrame.to_hdf函数
    • 函数语法及参数
      DataFrame.to_hdf(path_or_buf, key, **kwargs)
      • path_or_buf:必填参数,指定要保存 HDF5 文件的路径,如"./data/test.h5" ,表示将数据保存到当前目录下data文件夹中的test.h5文件。
      • key:必填参数,为要保存到 HDF5 文件中的 DataFrame 数据指定一个键,后续读取时通过该键获取数据。
      • **kwargs:可选参数,可用于设置保存时的一些参数,如压缩方式等。HDF5 默认支持blosc压缩方式,能提高磁盘利用率,节省空间。
    • 代码示例
import pandas as pd
# 假设day_eps_ttm是已有的DataFrame
day_eps_ttm = pd.DataFrame({'col1': [1, 2, 3], 'col2': [4, 5, 6]})
# 将DataFrame保存到HDF5文件中
day_eps_ttm.to_hdf("./data/test.h5", key="day_eps_ttm")
# 再次读取文件中的数据
new_eps = pd.read_hdf("./data/test.h5", key="day_eps_ttm")
print(new_eps)

此代码先将day_eps_ttm这个 DataFrame 保存到"./data/test.h5"文件中,键为day_eps_ttm ,然后再从该文件中读取对应键的数据并展示。

6.2.2 案例及优点
  • 案例:在读取 HDF5 文件时,若出现ModuleNotFoundError: No module named 'tables'错误,是因为缺少tables模块,需使用pip install tables命令安装该模块,才能正常读取 HDF5 文件。
  • 优点:HDF5 文件存储具有优势,支持blosc压缩,
  •            可提高磁盘利用率、节省空间,
  •            跨平台的,便于迁移到 Hadoop 等平台,所以优先选择使用 HDF5 文件存储。

6.3. JSON 文件操作

6.3.1 read_json函数
  • 函数语法及参数
    pandas.read_json(path_or_buf=None, orient=None, typ='frame', lines=False)
    • path_or_buf:可选参数,用于指定 JSON 文件路径或者包含 JSON 数据的缓冲区。如果是读取本地文件,可传入文件路径,如"./data/Sarcasm_Headlines_Dataset.json" 。
    • orient:可选参数,用于指定 JSON 字符串的预期格式,常见取值及含义如下:
      • 'split':字典形式,如{index -> [index], columns -> [columns], data -> [values]} ,将索引、列名和数据分开存储。
      • 'records':列表形式,如[{column -> value}, ... ,{column -> value}] ,以columns: values的形式输出。
      • 'index':字典形式,如{index -> {column -> value}} ,以index: {columns: values}...的形式输出。
      • 'columns':字典形式,如{column -> {index -> value}} ,这是默认格式,以columns:{index:values}的形式输出。
      • 'values':直接输出值数组。
      • 怎么样存的怎么样读就行
    • typ:可选参数,默认值为'frame' ,指定转换后的对象类型,可选择'series''dataframe' 。
    • lines:可选参数,布尔值,默认False 。当设置为True时,按照每行读取 JSON 对象。
  • 代码示例
import pandas as pd
# 读取JSON文件,指定格式为'records',按行读取
json_read = pd.read_json("./data/Sarcasm_Headlines_Dataset.json", orient="records", lines=True)
print(json_read.head())

此代码从"./data/Sarcasm_Headlines_Dataset.json"文件中读取 JSON 数据,将其转换为 DataFrame 格式,指定orient="records"lines=True ,然后展示前几行数据。

6.3.2 to_json函数
  • 函数语法及参数
    DataFrame.to_json(path_or_buf=None, orient=None, lines=False)
    • path_or_buf:可选参数,指定保存 JSON 文件的路径或者文件缓冲区。若要保存到本地文件,可传入文件路径,如"./data/test.json" 。
    • orient:可选参数,取值与read_json中的orient类似,用于指定存储的 JSON 形式。
    • lines:可选参数,布尔值,默认False 。当设置为True时,每个对象存储为一行。
  • 代码示例
import pandas as pd
# 假设json_read是已读取的DataFrame
json_read = pd.DataFrame({'article_link': ['https://example1.com'], 'headline': ['Headline 1'], 'is_sarcastic': [0]})
# 保存为JSON文件,指定格式为'records'
json_read.to_json("./data/test.json", orient='records')
# 修改lines参数为True后保存
json_read.to_json("./data/test.json", orient='records', lines=True)

此代码先将json_read这个 DataFrame 以'records'格式保存为 JSON 文件,然后再以'records'格式且lines=True的方式重新保存,改变了文件存储的格式结构。

6.4 Excel 文件操作

6.4.1 to_excel函数
  • 函数语法及参数
    to_excel(excel_writer, sheet_name='Sheet1', na_rep='', index=True)
    • excel_writer:必填参数,用于指定保存 Excel 文件的路径。例如'./data/itcast.xlsx' ,表示将 DataFrame 数据保存到当前目录下data文件夹中的itcast.xlsx文件。
    • sheet_name:可选参数,用于指定工作表的名称,默认为'Sheet1' 。可以传入字符串,如'python基础班' ,将数据写入指定名称的工作表。
    • na_rep:可选参数,用于指定缺失数据的表示方式,默认为空字符串'' 。若数据中存在缺失值,会按此参数设置的方式显示。
    • index:可选参数,布尔值,默认为True ,表示是否将 DataFrame 的索引写入 Excel 文件。若设置为False ,则不写入索引。
  • 代码示例
import pandas as pd
# 创建一个2行2列的DataFrame对象
df1 = pd.DataFrame({'col1': ['传', '智'], 'col2': ['播', '客']})
# 将DataFrame对象写入Excel文件
df1.to_excel('./data/itcast.xlsx', 'python基础班')
print('写入完毕')

此代码先创建了一个简单的 DataFrame,然后使用to_excel函数将其保存到'./data/itcast.xlsx'文件的'python基础班'工作表中。

6.4.2 read_excel函数
  • 函数语法及参数
    read_excel(io, sheet_name=0)
    • io:必填参数,用于指定 Excel 文件的路径,可以是字符串形式的文件路径,如'./data/itcast.xlsx' 。
    • sheet_name:可选参数,用于指定要读取的工作表。可以传入字符串(工作表名称)或整数(工作表索引,从 0 开始 )。默认值为0 ,表示读取第一个工作表
6.5SQL的读取与执行 

read_sql函数
  • 函数语法及参数
    pandas.read_sql(sql, con, index_col=None, params=None, columns=None)
    • sql:必填参数,表示要执行的 SQL 语句。可以是简单的表名(读取整张表 ),如'goods' ,也可以是复杂的查询语句,如'select * from goods where price > 5000' 。
    • con:必填参数,用于接收数据库连接信息。通常通过create_engine函数创建,例如engine = create_engine('mysql+pymysql://root:mysql@127.0.0.1/jing_dong') ,这里mysql是数据库类型,pymysql是数据库驱动名称,root:mysql是用户名和密码,127.0.0.1是机器地址,jing_dong是数据库名。
    • index_col:可选参数,默认为None 。如果传入一个列表,则表示将这些列设置为层次化索引。
    • params:可选参数,用于传递给执行方法的参数列表,格式如params={'mame': 'vale'} 。
    • columns:可选参数,接收列表,表示要读取数据的列名,默认为None ,即读取所有列。
  • 代码示例
import pandas as pd
import pymysql
from sqlalchemy import create_engine
# 创建数据库连接
engine = create_engine('mysql+pymysql://root:mysql@127.0.0.1/jing_dong')
# 读取整张goods表
df1 = pd.read_sql('goods', engine)
# 执行SQL查询语句,读取price大于5000的记录
sql ='select * from goods where price > 5000'
df2 = pd.read_sql(sql, engine)
print(df1.head())
print(df2.head())

此代码先创建了数据库连接,然后分别演示了读取整张表和执行 SQL 查询语句读取部分数据的操作。

to_sql函数
  • 函数语法及参数
    to_sql(name, con, if_exists='fail', index=True)
    • name:必填参数,用于指定要写入数据库的数据表名称。
    • con:必填参数,同read_sql中的con ,用于接收数据库连接信息。
    • if_exists:可选参数,默认值为'fail' 。有'fail'(如果表已存在,操作失败)、'replace'(如果表已存在,先删除表再创建新表写入数据)、'append'(如果表已存在,在表尾追加数据)三种取值。
    • index:可选参数,布尔值,默认为True ,表示是否将 Series 或 DataFrame 的索引写入数据库表。
  • 代码示例
import pandas as pd
import pymysql
from sqlalchemy import create_engine
# 创建数据库连接
engine = create_engine('mysql+pymysql://root:mysql@127.0.0.1/jing_dong')
# 假设df是已有的DataFrame
df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
# 将DataFrame写入数据库表test_table
df.to_sql('test_table', engine, if_exists='replace', index=False)

此代码将df这个 DataFrame 写入名为test_table的数据库表中,若表已存在则替换,并且不写入索引。

相关文章:

机器学习 Day05 pandas库

1.pandas介绍和优点 Pandas 是 2008 年由 Wes McKinney 开发的开源 Python 库 。它专门用于数据挖掘和数据分析&#xff0c;具有以下特点&#xff1a; 数据结构独特&#xff1a;核心数据结构为 Series&#xff08;一维&#xff09;和 DataFrame&#xff08;二维&#xff09; …...

布达佩斯召开 | 2025年第五届能源与环境工程国际会议(CoEEE 2025)

会议简介 Brief Introduction 2025年第五届能源与环境工程国际会议(CoEEE 2025) 会议时间&#xff1a;2025年7月25日-27日 召开地点&#xff1a;匈牙利布达佩斯 大会官网&#xff1a;www.coeee.org CoEEE 2025将围绕“能源与环境工程”的最新研究领域而展开&#xff0c;为研究人…...

[C语言日寄] qsort函数的练习

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…...

单引号与双引号在不同编程语言中的使用与支持

在编程语言中&#xff0c;单引号和双引号是常见的符号&#xff0c;它们通常用来表示字符和字符串。然而&#xff0c;如何使用这两种符号在不同的编程语言中有所不同&#xff0c;甚至有一些语言并不区分单引号和双引号的用途。本文将详细介绍不同编程语言中单引号与双引号的支持…...

Next.js项目实战——MindAI

我的整个毕业论文&#xff0c;是基于Next.js搭建完成的。项目的搭建过程分为多个章节&#xff0c;循序渐进&#xff1a; 1.环境准备与项目初始化 Node.js和npm的安装配置创建Next.js 14项目TypeScript配置项目目录结构说明Git初始化和.gitignore配置 2.基础架构搭建 Tailwi…...

MindGYM:一个用于增强视觉-语言模型推理能力的合成数据集框架,通过生成自挑战问题来提升模型的多跳推理能力。

2025-03-13&#xff0c;由中山大学和阿里巴巴集团的研究团队提出了MindGYM框架&#xff0c;通过合成自挑战问题来增强视觉-语言模型&#xff08;VLMs&#xff09;的推理能力。MindGYM框架通过生成多跳推理问题和结构化课程训练&#xff0c;显著提升了模型在推理深度和广度上的表…...

WPS的Excel文档如何利用VB脚本批量替换超链接的内容

准备知识 关于WPS的Excel点击单元格打开别的文档的两种方法的探究【为单元格添加超链接】 https://blog.csdn.net/wenhao_ir/article/details/146212767 激活WPS的Excel文档中的VB编辑器功能 没有激活前的截图如下: 原因是我们的电脑中缺乏VBA插件,我们点击“开发工具”:…...

phpstudy+phpstorm+xdebug【学习笔记】

配置PHPStudy 配置PHPSTORM phpstorm选择PHP版本 配置DEBUG 设置服务器 编辑配置 学习参考链接&#xff1a;&#xff1a;https://blog.csdn.net/m0_60571842/article/details/133246064...

(包清楚解疑)ES6中__dirname和__filename不见了吗?,到底怎么用

我们知道&#xff0c;在commonJs中&#xff0c;__dirname和__filename分别表示当前js文件所在目录路径和所在路径的绝对路径。可以直接使用&#xff0c;但是在ES6和Node v20.11.0之后&#xff0c;不能直接用了。 首先明确一下这两个变量为什么会用到&#xff1a; 当我们在使用…...

3.4 基于TSX的渲染函数类型安全实践

文章目录 1. TSX与类型安全的核心价值1.1 TSX的独特优势1.2 类型安全的核心收益2. 基础类型安全实践2.1 组件Props类型约束2.2 子元素类型校验2.3 事件类型系统3. 高级类型安全模式3.1 泛型组件设计3.2 高阶组件类型3.3 类型守卫应用4. 类型操作工具集4.1 实用类型工具4.2 类型…...

vue-draggable-plus实现某些子元素不被拖拽

在使用vue-draggable-plus时倘若只是节点里面所有元素都可以拖拽倒还好实现&#xff0c;但遇到某些子元素是作为其他作用不可拖拽或者可拖拽不可替换这些情况&#xff0c;则比较头疼了 解决&#xff1a; 1. 绑定移动事件 2. 处理移动世界并对对应情况返回false //移动事件 co…...

基于SpringBoot的Mybatis和纯MyBatis项目搭建的区别

【由于之前学习MyBatis的时候是跟着视频敲的纯MyBatis项目&#xff0c;以至于在突然看到别人在SpringBoot项目里搭建MyBatis方式的时候很懵比…特此文字形式记录一下区别&#xff08;应该还有好多种其他方式是我不知道的&#xff0c;主要应该就是要知道关键的流程步骤&#xff…...

二进制数(十进制转二进制)

二进制数 #include<stdio.h> int main(){int n;while(scanf("%d",&n)!EOF){int a[10000];int i0;if(n0){printf("0\n");continue;}while(n){a[i]n%2;i;nn/2;}for(int ji-1;j>0;j--){printf("%d",a[j]);}printf("\n");}…...

一周学会Flask3 Python Web开发-SQLAlchemy添加数据操作-班级模块

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili SQLAlchemy提供session.add()方法添加model实体数据&#xff0c;以及提供session.commit()提交事务。 首先list.html加一个添…...

【python】OpenCV—Hough Circle Transform

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数6、参考 更多有趣的代码示例&#xff0c;可参考【Programming】 1、功能描述 2、代码实现 载入必要的库 import sys import cv2 as cv import numpy as np函数入口 if __name__ "__main__&qu…...

1216走迷宫

1216走迷宫 ⭐️难度&#xff1a;简单 &#x1f31f;考点&#xff1a;bfs &#x1f4d6; &#x1f4da; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {public static void main(String[] …...

Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测

SCI一区级 | Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测 目录 SCI一区级 | Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RIME-CNN-LSTM-Multihead-Attention霜冰算法…...

医疗资源联动,广州长泰医院与海南德雅医院共筑地贫防治新篇章

​ 为贯彻落实"健康中国"战略关于出生缺陷综合防治的部署要求&#xff0c;推动地中海贫血防治体系建设。2025年3月15日&#xff0c;广州长泰医院与海南德雅医院联合主办的“地中海贫血生殖遗传干预大型义诊暨合作签约仪式”在广州正式启动&#xff0c;活动以“爱与希…...

栈区、堆区、静态区

一、栈区&#xff08;Stack&#xff09; 1.栈区是什么 •栈区&#xff08;Stack&#xff09;是计算机内存中的一部分&#xff0c;用于存储程序运行时的临时数据。 2.栈区的有关性质 &#xff08;1&#xff09;存储临时数据 • 栈区主要用于存储局部变量&#xff08;比如函…...

SpringBoot整合Swagger (Springfox 3.0.0)

Maven依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version> </dependency> 配置文件设置 # 解决"Unable to infer base url"错误的关键配…...

ShenNiusModularity项目源码学习(16:ShenNius.Admin.Mvc项目分析-1)

ShenNius.Admin.Mvc项目是MVC模式的启动项目&#xff0c;包括了MVC模式下所需的所有的页面、控制器类、资源、js文件等数据&#xff0c;该项目仅依赖ShenNius.Admin.API项目&#xff0c;主要使用后者的ShenniusAdminApiModule模块类及一些依赖项目中定义的辅助类等。本文学习Sh…...

Flutter PopScope对于iOS设置canPop为false无效问题

这个问题应该出现很久了&#xff0c;之前的组件WillPopScope用的好好的&#xff0c;flutter做优化打算“软性”处理禁用返回手势&#xff0c;出了PopScope&#xff0c;这个组件也能处理在安卓设备上的左滑返回事件。但是iOS上面左滑返回手势禁用&#xff0c;一直无效。 当然之…...

第十次CCF-CSP认证(含C++源码)

第十次CCF-CSP认证 分蛋糕满分题解 学生排队满分题解 Markdown语法题目解读满分代码 结语 分蛋糕 题目链接 满分题解 基本思路&#xff1a;我们需要保证除了最后一个小朋友之外的所有人&#xff0c;分得的蛋糕都大于等于给定的K值&#xff0c;为什么是大于等于&#xff0c;是…...

leetcode51.N 皇后 回溯算法求解 + 效率优化

&#x1f3af; 这篇文章探讨了解决经典N皇后问题的方法&#xff0c;采用回溯算法在标准棋盘上放置皇后&#xff0c;确保它们之间不能相互攻击。文中首先介绍了基本的思路和实现方式&#xff0c;通过递归尝试每个可能的位置并回退错误选择。为了提升效率&#xff0c;进一步提出了…...

使用 PerformanceObserver 实现网页性能优化的最佳实践

前言 在当今的网页开发中&#xff0c;性能监控已经成为确保用户体验的一个关键部分。用户对网站的速度和响应性越来越敏感&#xff0c;性能问题可能直接影响用户的满意度和留存率。因此&#xff0c;了解并使用合适的工具来监控和优化网页性能显得尤为重要。 今天&#xff0c;我…...

单口路由器多拨号ADSL实现方法

条件是多拨号场景&#xff0c;公司路由器接口不够用...

HW基本的sql流量分析和wireshark 的基本使用

前言 HW初级的主要任务就是看监控&#xff08;流量&#xff09; 这个时候就需要我们 了解各种漏洞流量数据包的信息 还有就是我们守护的是内网环境 所以很多的攻击都是 sql注入 和 webshell上传 &#xff08;我们不管对面是怎么拿到网站的最高权限的 我们是需要指出它是…...

Vue 过滤器深度解析与应用实践

文章目录 1. 过滤器概述1.1 核心概念1.2 过滤器生命周期 2. 过滤器基础2.1 过滤器定义2.2 过滤器使用 3. 过滤器高级用法3.1 链式调用3.2 参数传递3.3 动态过滤器 4. 过滤器应用场景4.1 文本格式化4.2 数字处理4.3 数据过滤 5. 性能优化与调试5.1 性能优化策略5.2 调试技巧 6. …...

基于 Docker 搭建 FRP 内网穿透开源项目

有些配置项不知道该不该用,不知道该在哪用,不知道怎么用,所以我自己写个文章简单记录一下做个笔记 本文介绍的是基于 Docker 运行 frps 和 frpc,并通过 TCP 协议简单穿透 SSH 和 HTTP,在观看本文之前请确保你的机器已经安装 Docker 服务端搭建 frps# 连接拥有公网 IP 的…...

【Git学习笔记】Git结构原理及其分支管理模型分析

【Git学习笔记】Git结构原理及其分支管理模型分析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Git学习笔记 文章目录 【Git学习笔记】Git结构原理及其分支管理模型分析前言一.认识工作区、暂存区、版本库1.1 版本回退1.2 撤销修改1.3 删…...

找工作、创业的思考和出路

最近有几位朋友在找工作&#xff0c;以及探索职场出路&#xff0c;与他们聊了一些关于找工作和职业发展的话题。而这些话题对大多数职场人来说&#xff0c;都是必须考虑和面对的问题。今天就基于这两个话题展开聊聊。 首先&#xff0c;初入职场时&#xff0c;工作是相对容易找…...

2024山东大学计算机复试上机真题

2024山东大学计算机复试上机真题 2024山东大学计算机复试机试真题 历年山东大学计算机复试上机真题 历年山东大学计算机复试机试真题 在线评测&#xff1a;传动门&#xff1a;pgcode.cn 最长递减子序列 题目描述 输入数字 n&#xff0c;和 n 个整数&#xff0c;输出该数字…...

FLASK和GPU依赖安装

1. 安装所有依赖包 在终端运行以下命令&#xff08;如果使用 GPU&#xff0c;请确保已安装 CUDA 驱动&#xff09;&#xff1a; # 安装 Flask 和其他依赖 pip install flask sentence-transformers torch# 如果是 GPU 环境&#xff0c;推荐安装 CUDA 版本的 PyTorch&#xff…...

【图论】并查集的学习和使用

目录 并查集是什么&#xff1f; 举个例子 组成 父亲数组&#xff1a; find函数&#xff1a; union函数&#xff1a; 代码实现&#xff1a; fa[] 初始化code: find code&#xff1a; 递归实现: 非递归实现: union code : 画图模拟&#xff1a; 路径压缩&#xff1a…...

3.9/Q2,Charls最新文章解读!

文章题目&#xff1a;Association between remnant cholesterol and depression in middle-aged and older Chinese adults: a population-based cohort study DOI&#xff1a;10.3389/fendo.2025.1456370 中文标题&#xff1a;中国中老年人残留胆固醇与抑郁症的关系&#xff1…...

用Python和Pygame实现打砖块游戏

标题&#xff1a;用Python和Pygame实现打砖块游戏 摘要&#xff1a; 本文将介绍如何使用Python和Pygame库实现一个经典的打砖块游戏。通过这个项目&#xff0c;你将学习到Pygame的基本用法、游戏循环、碰撞检测等知识。 1. 打砖块游戏简介(完整代码在末尾) 打砖块是一款经典的…...

自动化测试-网页聊天室

项目介绍&#xff1a; 针对基于WebSocket协议的网页端即时通讯系统&#xff0c;主导设计并实施全流程自动化测试方案。通过构建模块化测试框架&#xff0c;完成对核心业务场景&#xff08;用户登录鉴权、消息同步、实时聊天等&#xff09;的自动化验证&#xff0c;最终达成测试…...

Linux第三次练习

1、创建根目录结构中的所有的普通文件 首先在根目录下面新创建一个test目录&#xff0c;然后将查找到的普通文件新建到test目录下 2、列出所有账号的账号名 3、将/etc/passwd中内容按照冒号隔开的第三个字符从大到小排序后输出所有内容 4、列出/etc/passwd中的第20行-25行内容…...

Redis学习

最开始使用的是MySQL&#xff0c;其使用的是磁盘IO方式较慢&#xff0c;无法满足一分钟成千上万次的访问&#xff0c;而使用内存IO的Redis就可以较好的满足。 Redis是NOSQL(Not Only SQL)中的键值存储数据库&#xff0c;性能好较灵活&#xff0c;是在内存中进行存储。 可以通…...

【CSS3】化神篇

目录 平面转换平移旋转改变旋转原点多重转换缩放倾斜 渐变线性渐变径向渐变 空间转换平移视距旋转立体呈现缩放 动画使现步骤animation 复合属性animation 属性拆分逐帧动画多组动画 平面转换 作用&#xff1a;为元素添加动态效果&#xff0c;一般与过渡配合使用 概念&#x…...

【C/C++算法】从浅到深学习--- 前缀和算法(图文兼备 + 源码详解)

绪论&#xff1a;冲击蓝桥杯一起加油&#xff01;&#xff01; 每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章将使用八道题由浅到深的带你了解并基本掌握前缀和思想&#xff0c;以及前缀和的基…...

VIC模型率定验证

在气候变化问题日益严重的今天&#xff0c;水文模型在防洪规划&#xff0c;未来预测等方面发挥着不可替代的重要作用。目前&#xff0c;无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然&#xff0c;这些软件有各自的优点&#xff1b;但是&am…...

二叉树的性质和实现

二叉树开端 我们要理解二叉树我们可以先看看什么是树&#xff0c;如图 这个树虽然没有什么叶子&#xff0c;不是很好看&#xff0c;但是用在这里刚刚好&#xff0c;我们从局部来看它&#xff0c;随便挑一根树枝&#xff0c; 大概是这样&#xff0c;由一根粗的的主干和一些细的…...

【Azure 架构师学习笔记】- Azure Databricks (21) --费用相关

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (20) --Delta Live Table 建议 前言 Databricks是很强大的工具和集成平台&#xff0c;但是随着越来越多地使用它&#xff0c;就没办法必须去面…...

StarRocks + Paimon 在阿里集团 Lakehouse 的探索与实践

作者&#xff1a; 范振: 阿里云计算平台开源 OLAP 负责人&#xff0c;StarRocks 社区 Champion 翁才智: 阿里云技术专家&#xff0c;Apache Paimon PMC Member 导读&#xff1a;阿里集团在推进湖仓一体化建设过程中&#xff0c;依托 StarRocks 强大的 OLAP 查询能力与 Paimon…...

OTP单片机调试工具之—单线数据编码

OTP单片机调试工具在实现过程中离不开单线数据的传输&#xff0c;那么使用哪一种方式的数据编码会比较好呢&#xff1f; 我所了解的主要有以下三种&#xff1a; 1.UART&#xff08;串口&#xff09;&#xff0c;这种方式在单片机和pc之间进行传输都非常常见&#xff0c;效率比较…...

你的完美主义:从缺陷到超能力

所属专栏&#xff1a;《逻辑辨证系列》 前情回顾&#xff1a; 《完美还是完成》&#xff08;一&#xff09;&#xff1a;完成还是完美—完成大于完美 时间、机会、情绪成本 先完成 … 本期&#xff1a; 《完美还是完成》&#xff08;二&#xff09;&#xff1a;你的完美主…...

zsh: command not found: adb 报错问题解决

哈喽小伙伴们大家好&#xff0c;我是小李&#xff0c;今天&#xff0c;我满怀信心想要在本地跑一下pda,然而&#xff0c; what? 居然报错了&#xff01;&#xff01;别逗我啊&#xff01; 好吧&#xff0c;究其原因&#xff1a;没有配置好sdk 那就配呗。 首先&#xff0c;…...

应急响应靶机练习-Linux2

1.背景 前景需要&#xff1a;看监控的时候发现webshell告警&#xff0c;领导让你上机检查你可以救救安服仔吗&#xff01;&#xff01; 挑战内容&#xff1a; &#xff08;1&#xff09;提交攻击者IP &#xff08;2&#xff09;提交攻击者修改的管理员密码(明文) &#xff08;…...

进程间通信--匿名管道

进程间通信介绍 进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同样的资源。通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了某种事件&…...