Python中的时间序列数据操作总结

news2024/9/27 12:17:22

时间序列数据是一种在一段时间内收集的数据类型,它通常用于金融、经济学和气象学等领域,经常通过分析来了解随着时间的推移的趋势和模式

Pandas是Python中一个强大且流行的数据操作库,特别适合处理时间序列数据。它提供了一系列工具和函数可以轻松加载、操作和分析时间序列数据。

在本文中,我们介绍时间序列数据的索引和切片、重新采样和滚动窗口计算以及其他有用的常见操作,这些都是使用Pandas操作时间序列数据的关键技术。

数据类型

Python

在Python中,没有专门用于表示日期的内置数据类型。一般情况下都会使用datetime模块提供的datetime对象进行日期时间的操作。

importdatetime

t=datetime.datetime.now()
print(f"type: {type(t)} and t: {t}")
#type: <class 'datetime.datetime'> and t: 2022-12-26 14:20:51.278230

一般情况下我们都会使用字符串的形式存储日期和时间。所以在使用时我们需要将这些字符串进行转换成datetime对象。

一般情况下时间的字符串有以下格式:

  • YYYY-MM-DD(e.g. 2022-01-01)
  • YYYY/MM/DD(e.g. 2022/01/01)
  • DD-MM-YYYY(e.g. 01-01-2022)
  • DD/MM/YYYY(e.g. 01/01/2022)
  • MM-DD-YYYY(e.g. 01-01-2022)
  • MM/DD/YYYY(e.g. 01/01/2022)
  • HH:MM:SS(e.g. 11:30:00)
  • HH:MM:SS AM/PM(e.g. 11:30:00 AM)
  • HH:MM AM/PM(e.g. 11:30 AM)

strptime 函数以字符串和格式字符串作为参数,返回一个datetime对象。

string='2022-01-01 11:30:09'
t=datetime.datetime.strptime(string, "%Y-%m-%d %H:%M:%S")
print(f"type: {type(t)} and t: {t}")
#type: <class 'datetime.datetime'> and t: 2022-01-01 11:30:09

格式字符串如下:

还可以使用strftime函数将datetime对象转换回特定格式的字符串表示。

t=datetime.datetime.now()
t_string=t.strftime("%m/%d/%Y, %H:%M:%S")
#12/26/2022, 14:38:47

t_string=t.strftime("%b/%d/%Y, %H:%M:%S")
#Dec/26/2022, 14:39:32

Unix时间(POSIX时间或epoch时间)是一种将时间表示为单个数值的系统。它表示自1970年1月1日星期四00:00:00协调世界时(UTC)以来经过的秒数。

Unix时间和时间戳通常可以互换使用。Unix时间是创建时间戳的标准版本。一般情况下使用整数或浮点数据类型用于存储时间戳和Unix时间。

我们可以使用time模块的mktime方法将datetime对象转换为Unix时间整数。也可以使用datetime模块的fromtimestamp方法。

#convert datetime to unix time
importtime
fromdatetimeimportdatetime

t=datetime.now()
unix_t=int(time.mktime(t.timetuple()))
#1672055277

#convert unix time to datetime
unix_t=1672055277
t=datetime.fromtimestamp(unix_t)
#2022-12-26 14:47:57

使用dateutil模块来解析日期字符串获得datetime对象。

fromdateutilimportparser
date=parser.parse("29th of October, 1923")
#datetime.datetime(1923, 10, 29, 0, 0)

Pandas

Pandas提供了三种日期数据类型:

1、

Timestamp

DatetimeIndex

:它的功能类似于其他索引类型,但也具有用于时间序列操作的专门函数。

t=pd.to_datetime("29/10/1923", dayfirst=True)
#Timestamp('1923-10-29 00:00:00')

t=pd.Timestamp('2019-01-01', tz='Europe/Berlin')
#Timestamp('2019-01-01 00:00:00+0100', tz='Europe/Berlin')

t=pd.to_datetime(["04/23/1920", "10/29/1923"])
#DatetimeIndex(['1920-04-23', '1923-10-29'], dtype='datetime64[ns]', freq=None)

2、

period

PeriodIndex

:一个有开始和结束的时间间隔。它由固定的间隔组成。

t=pd.to_datetime(["04/23/1920", "10/29/1923"])
period=t.to_period("D")
#PeriodIndex(['1920-04-23', '1923-10-29'], dtype='period[D]')

3、

Timedelta

TimedeltaIndex

:两个日期之间的时间间隔。

delta=pd.TimedeltaIndex(data=['1 days 03:00:00', 
                                '2 days 09:05:01.000030'])
"""
TimedeltaIndex(['1 days 02:00:00', '1 days 06:05:01.000030'], 
               dtype='timedelta64[ns]', freq=None)
"""

在Pandas中,可以使用to_datetime方法将对象转换为datetime数据类型或进行任何其他转换。

importpandasaspd
df=pd.read_csv("dataset.txt")
df.head()

"""

  date       value
0 1991-07-01 3.526591
1 1991-08-01 3.180891
2 1991-09-01 3.252221
3 1991-10-01 3.611003
4 1991-11-01 3.565869
"""

df.info()

"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 204 entries, 0 to 203
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   date    204 non-null    object 
 1   value   204 non-null    float64
dtypes: float64(1), object(1)
memory usage: 3.3+ KB
"""

# Convert to datetime
df["date"] =pd.to_datetime(df["date"], format="%Y-%m-%d")

df.info()

"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 204 entries, 0 to 203
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   date    204 non-null    datetime64[ns]
 1   value   204 non-null    float64       
dtypes: datetime64[ns](1), float64(1)
memory usage: 3.3 KB
"""

# Convert to Unix
df['unix_time'] =df['date'].apply(lambdax: x.timestamp())
df.head()
"""
  date       value    unix_time
0 1991-07-01 3.526591 678326400.0
1 1991-08-01 3.180891 681004800.0
2 1991-09-01 3.252221 683683200.0
3 1991-10-01 3.611003 686275200.0
4 1991-11-01 3.565869 688953600.0
"""

df["date_converted_from_unix"] =pd.to_datetime(df["unix_time"], unit="s")
df.head()
"""
  date       value    unix_time    date_converted_from_unix
0 1991-07-01 3.526591 678326400.0 1991-07-01
1 1991-08-01 3.180891 681004800.0 1991-08-01
2 1991-09-01 3.252221 683683200.0 1991-09-01
3 1991-10-01 3.611003 686275200.0 1991-10-01
4 1991-11-01 3.565869 688953600.0 1991-11-01
"""

我们还可以使用parse_dates参数在任何文件加载时直接声明日期列。

df=pd.read_csv("dataset.txt", parse_dates=["date"])
df.info()

"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 204 entries, 0 to 203
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   date    204 non-null    datetime64[ns]
 1   value   204 non-null    float64       
dtypes: datetime64[ns](1), float64(1)
memory usage: 3.3 KB
"""

如果是单个时间序列的数据,最好将日期列作为数据集的索引。

df.set_index("date",inplace=True)

"""
            Value
date 
1991-07-01 3.526591
1991-08-01 3.180891
1991-09-01 3.252221
1991-10-01 3.611003
1991-11-01 3.565869
... ...
2008-02-01 21.654285
2008-03-01 18.264945
2008-04-01 23.107677
2008-05-01 22.912510
2008-06-01 19.431740
"""

Numpy也有自己的datetime类型np.Datetime64。特别是在大型数据集时,向量化是非常有用的,应该优先使用。

importnumpyasnp
arr_date=np.array('2000-01-01', dtype=np.datetime64)
arr_date
#array('2000-01-01', dtype='datetime64[D]')

#broadcasting
arr_date=arr_date+np.arange(30)
"""
array(['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04',
       '2000-01-05', '2000-01-06', '2000-01-07', '2000-01-08',
       '2000-01-09', '2000-01-10', '2000-01-11', '2000-01-12',
       '2000-01-13', '2000-01-14', '2000-01-15', '2000-01-16',
       '2000-01-17', '2000-01-18', '2000-01-19', '2000-01-20',
       '2000-01-21', '2000-01-22', '2000-01-23', '2000-01-24',
       '2000-01-25', '2000-01-26', '2000-01-27', '2000-01-28',
       '2000-01-29', '2000-01-30'], dtype='datetime64[D]')
"""

有用的函数

下面列出的是一些可能对时间序列有用的函数。

df=pd.read_csv("dataset.txt", parse_dates=["date"])
df["date"].dt.day_name()

"""
0        Monday
1      Thursday
2        Sunday
3       Tuesday
4        Friday
         ...   
199      Friday
200    Saturday
201     Tuesday
202    Thursday
203      Sunday
Name: date, Length: 204, dtype: object
"""

DataReader

Pandas_datareader是pandas库的一个辅助库。它提供了许多常见的金融时间序列数据

#pip install pandas-datareader
frompandas_datareaderimportwb
#GDP per Capita From World Bank
df=wb.download(indicator='NY.GDP.PCAP.KD', 
                 country=['US', 'FR', 'GB', 'DK', 'NO'], start=1960, end=2019)

"""
                   NY.GDP.PCAP.KD
country       year                
Denmark       2019    57203.027794
              2018    56563.488473
              2017    55735.764901
              2016    54556.068955
              2015    53254.856370
...                            ...
United States 1964    21599.818705
              1963    20701.269947
              1962    20116.235124
              1961    19253.547329
              1960    19135.268182

[300 rows x 1 columns]
"""

日期范围

我们可以使用pandas的date_range方法定义一个日期范围。

pd.date_range(start="2021-01-01", end="2022-01-01", freq="D")

"""
DatetimeIndex(['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04',
               '2021-01-05', '2021-01-06', '2021-01-07', '2021-01-08',
               '2021-01-09', '2021-01-10',
               ...
               '2021-12-23', '2021-12-24', '2021-12-25', '2021-12-26',
               '2021-12-27', '2021-12-28', '2021-12-29', '2021-12-30',
               '2021-12-31', '2022-01-01'],
              dtype='datetime64[ns]', length=366, freq='D')
"""

pd.date_range(start="2021-01-01", end="2022-01-01", freq="BM")

"""
DatetimeIndex(['2021-01-29', '2021-02-26', '2021-03-31', '2021-04-30',
               '2021-05-31', '2021-06-30', '2021-07-30', '2021-08-31',
               '2021-09-30', '2021-10-29', '2021-11-30', '2021-12-31'],
              dtype='datetime64[ns]', freq='BM')
"""

fridays  =pd.date_range('2022-11-01', '2022-12-31', freq="W-FRI")
"""
DatetimeIndex(['2022-11-04', '2022-11-11', '2022-11-18', '2022-11-25',
               '2022-12-02', '2022-12-09', '2022-12-16', '2022-12-23',
               '2022-12-30'],
              dtype='datetime64[ns]', freq='W-FRI')
"""

我们可以使用timedelta_range方法创建一个时间序列。

t=pd.timedelta_range(0, periods=10, freq="H")

"""
TimedeltaIndex(['0 days 00:00:00', '0 days 01:00:00', '0 days 02:00:00',
                '0 days 03:00:00', '0 days 04:00:00', '0 days 05:00:00',
                '0 days 06:00:00', '0 days 07:00:00', '0 days 08:00:00',
                '0 days 09:00:00'],
               dtype='timedelta64[ns]', freq='H')
"""

格式化

我们dt.strftime方法改变日期列的格式。

df["new_date"] =df["date"].dt.strftime("%b %d, %Y")
df.head()
"""
  date       value    new_date
0 1991-07-01 3.526591 Jul 01, 1991
1 1991-08-01 3.180891 Aug 01, 1991
2 1991-09-01 3.252221 Sep 01, 1991
3 1991-10-01 3.611003 Oct 01, 1991
4 1991-11-01 3.565869 Nov 01, 1991
"""

解析

解析datetime对象并获得日期的子对象。

df["year"] =df["date"].dt.year
df["month"] =df["date"].dt.month
df["day"] =df["date"].dt.day
df["calendar"] =df["date"].dt.date
df["hour"] =df["date"].dt.time
df.head()
"""
  date       value    year month day calendar   hour
0 1991-07-01 3.526591 1991 7     1   1991-07-01 00:00:00
1 1991-08-01 3.180891 1991 8     1   1991-08-01 00:00:00
2 1991-09-01 3.252221 1991 9     1   1991-09-01 00:00:00
3 1991-10-01 3.611003 1991 10    1   1991-10-01 00:00:00
4 1991-11-01 3.565869 1991 11    1   1991-11-01 00:00:00
"""

还可以重新组合它们。

df["date_joined"] =pd.to_datetime(df[["year","month","day"]])
print(df["date_joined"])
"""
0     1991-07-01
1     1991-08-01
2     1991-09-01
3     1991-10-01
4     1991-11-01
         ...    
199   2008-02-01
200   2008-03-01
201   2008-04-01
202   2008-05-01
203   2008-06-01
Name: date_joined, Length: 204, dtype: datetime64[ns]

过滤查询

使用loc方法来过滤DataFrame。

df=df.loc["2021-01-01":"2021-01-10"]

truncate 可以查询两个时间间隔中的数据

df_truncated=df.truncate('2021-01-05', '2022-01-10')

常见数据操作

下面就是对时间序列数据集中的值执行操作。我们使用yfinance库创建一个用于示例的股票数据集。

#get google stock price data
importyfinanceasyf
start_date='2020-01-01'
end_date='2023-01-01'
ticker='GOOGL'
df=yf.download(ticker, start_date, end_date)
df.head()

"""
Date       Open      High      Low       Close     Adj Close Volume     
2020-01-02 67.420502 68.433998 67.324501 68.433998 68.433998 27278000
2020-01-03 67.400002 68.687500 67.365997 68.075996 68.075996 23408000
2020-01-06 67.581497 69.916000 67.550003 69.890503 69.890503 46768000
2020-01-07 70.023003 70.175003 69.578003 69.755501 69.755501 34330000
2020-01-08 69.740997 70.592499 69.631500 70.251999 70.251999 35314000
"""

计算差值

diff函数可以计算一个元素与另一个元素之间的插值。

#subtract that day's value from the previous day
df["Diff_Close"] =df["Close"].diff()
#Subtract that day's value from the day's value 2 days ago
df["Diff_Close_2Days"] =df["Close"].diff(periods=2)

累计总数

df["Volume_Cumulative"] =df["Volume"].cumsum()

滚动窗口计算

滚动窗口计算(移动平均线)。

df["Close_Rolling_14"] =df["Close"].rolling(14).mean()
df.tail()

可以对我们计算的移动平均线进行可视化

常用的参数:

  • center:决定滚动窗口是否应以当前观测值为中心。
  • min_periods:窗口中产生结果所需的最小观测次数。
s=pd.Series([1, 2, 3, 4, 5])

#the rolling window will be centered on each observation
rolling_mean=s.rolling(window=3, center=True).mean()
"""
0    NaN
1    2.0
2    3.0
3    4.0
4    NaN
dtype: float64
Explanation:
first window: [na 1 2] = na
second window: [1 2 3] = 2
"""

# the rolling window will not be centered, 
#and will instead be anchored to the left side of the window
rolling_mean=s.rolling(window=3, center=False).mean()
"""
0    NaN
1    NaN
2    2.0
3    3.0
4    4.0
dtype: float64
Explanation:
first window: [na na 1] = na
second window: [na 1 2] = na
third window: [1 2 3] = 2
"""

平移

Pandas有两个方法,shift()和tshift(),它们可以指定倍数移动数据或时间序列的索引。Shift()移位数据,而tshift()移位索引。

#shift the data
df_shifted=df.shift(5,axis=0)
df_shifted.head(10)

#shift the indexes
df_tshifted=df.tshift(periods=4, freq='D')
df_tshifted.head(10)

df_shifted

df_tshifted

时间间隔转换

在 Pandas 中,操 to_period 函数允许将日期转换为特定的时间间隔。可以获取具有许多不同间隔或周期的日期

df["Period"] =df["Date"].dt.to_period('W')

频率

Asfreq方法用于将时间序列转换为指定的频率。

monthly_data=df.asfreq('M', method='ffill')

常用参数:

freq:数据应该转换到的频率。这可以使用字符串别名(例如,'M’表示月,'H’表示小时)或pandas偏移量对象来指定。

method:如何在转换频率时填充缺失值。这可以是’ffill’(向前填充)或’bfill’(向后填充)之类的字符串。

采样

resample

可以改变时间序列频率并重新采样。我们可以进行上采样(到更高的频率)或下采样(到更低的频率)。因为我们正在改变频率,所以我们需要使用一个聚合函数(比如均值、最大值等)。

resample方法的参数:

rule:数据重新采样的频率。这可以使用字符串别名(例如,'M’表示月,'H’表示小时)或pandas偏移量对象来指定。

#down sample
monthly_data=df.resample('M').mean()

#up sample
minute_data=data.resample('T').ffill()

百分比变化

使用pct_change方法来计算日期之间的变化百分比。

df["PCT"] =df["Close"].pct_change(periods=2)
print(df["PCT"])
"""
Date
2020-01-02         NaN
2020-01-03         NaN
2020-01-06    0.021283
2020-01-07    0.024671
2020-01-08    0.005172
                ...   
2022-12-19   -0.026634
2022-12-20   -0.013738
2022-12-21    0.012890
2022-12-22   -0.014154
2022-12-23   -0.003907
Name: PCT, Length: 752, dtype: float64
"""

总结

在Pandas和NumPy等库的帮助下,可以对时间序列数据执行广泛的操作,包括过滤、聚合和转换。本文介绍的是一些在工作中经常遇到的常见操作,希望对你有所帮助。

https://avoid.overfit.cn/post/4f8aab6d404e46bbbb712ad1497f5463

作者:Okan Yenigün

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

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

相关文章

意想不到的前端三个小妙招

大厂面试题分享 面试题库前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库整理下本人在工作中撸代码遇到的一些刚看时一脸懵逼&#xff0c;实则很简单就能解决的小妙招&#xff0c;希望对大家有所帮助哟~伪元素动态改变…

「诗人艺术家ll著名诗人」胭脂茉莉十四行诗10首

【诗人艺术家ll著名诗人】胭脂茉莉十四行10首胭脂茉莉诗人简介&#xff1a;胭脂茉莉&#xff0c;女&#xff0c;江苏人&#xff0c;年少习诗&#xff0c;作家、诗人。评论及随笔见诸媒体及报刊&#xff0c;诗歌被选编入海内外多种选本及刊物&#xff0c;其主要代表作有现代禅诗…

vue3-init

Vue3快速上手 1.Vue3简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff09;耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址&#xff1a;https://github.com/vuejs/vue-next/release…

maven中的scope

provided: 编译运行时期&#xff0c;目标容器已经提供&#xff0c;打jar包时候不带optional&#xff0c;依赖传递test: 举例子junit&#xff0c;为什么Test在src的java蓝包的测试类的方法上面不能用&#xff1f;src的java绿包里的测试类的方法上可以用。 依赖传递&#xff1a;间…

【数据篇】32 # 如何选择合适的方法对数据进行可视化处理?

说明 【跟月影学可视化】学习笔记。 从原始数据中过滤出有用的信息 下面通过航拍公园人群分布例子&#xff0c;按照某些属性对数据进行过滤&#xff0c;再将符合条件的结果展现出来。 数据来源&#xff1a;https://github.com/akira-cn/graphics/blob/master/data/park-peo…

Java on Azure Tooling 2022年12月更新|Azure SDK 参考书代码样例支持及用户体验提升

作者&#xff1a;Jialuo Gan - Program Manager, Developer Division at Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎回到12月的 Java on Azure Tooling 的更新。首先&#xff0c;提前祝大家新年快乐。在这次更新中&#xff0c;我们将介绍 Azure SDK 参考书的…

Linux系统之部署MxsDoc个人文件管理系统

Linux系统之部署MxsDoc个人文件管理系统一、MxsDoc介绍1.MxsDoc简介2.MxsDoc功能3.MxsDoc应用场景二、检查本地系统环境1.检查系统版本2.检查系统内核三、下载MxsDoc软件包1.创建软件目录2.下载MxsDoc软件3.查看下载软件四、部署MxsDoc1.解压MxsDoc软件包2.一键部署MxsDoc五、登…

【Linux逻辑卷管理】之pvcreate、pvdisplay和pvremove

文章目录一、逻辑卷管理(LVM)概念1. LVM 定义2. 物理卷(PV)3. 卷组(VG)4. 逻辑卷(LV)二、创建逻辑卷1. pvcreate命令将分区标记为物理卷&#xff0c;创建物理卷2. vgcreate命令将一个或多个物理卷结合为一个卷组&#xff0c;创建卷组3. lvcreate命令根据卷组中的可用物理区块,创…

【线上故障记录】MySQLTransactionRollbackException: Lock wait timeout exceeded

数据同学反馈凌晨1-2点会出现连接系统MySQL数据库等待锁超时 com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction InnoDB事务等待一个行级锁的时间最长时间默认值是50秒&#xff08;单位是秒&#x…

尚硅谷_ShardingSphere5

ShardingSphere5第01章 高性能架构模式1、读写分离架构2、数据库分片架构2.1、垂直分片2.2、水平分片3、读写分离和数据分片架构4、实现方式4.1、程序代码封装4.2、中间件封装4.3、常用解决方案第02章 ShardingSphere1、简介2、ShardingSphere-JDBC3、ShardingSphere-Proxy第03…

tcping实用小工具

Tcping----实用小工具tcping命令详解 一、tcping介绍 tcping&#xff1a;tcping命令基于tcp协议监控&#xff0c;可以从较低级别的协议获得简单的&#xff0c;可能不可靠的数据报服务。 原则上&#xff0c;TCP应该能够在从容硬线连接到分组交换或电路交换网络的各种通信系统之…

DNS域名解析

文章目录一 定义二 配置文件三 DNS解析流程四 总结一 定义 用户在浏览器输入URL&#xff0c;浏览器就会向该URL对应的服务器发送请求&#xff0c;获得对应的IP&#xff0c;才能将资源返回给用户。 简单来说&#xff0c;DNS就是将URL转化成IP的过程。 二 配置文件 在Linux系统…

js逆向-Mytoken请求参数逆向

声明 本文仅供学习参考&#xff0c;如有侵权可私信本人删除&#xff0c;请勿用于其他途径&#xff0c;违者后果自负&#xff01; 如果觉得文章对你有所帮助&#xff0c;可以给博主点击关注和收藏哦&#xff01; 前言 目标网站&#xff1a;aHR0cHM6Ly93d3cubXl0b2tlbmNhcC5j…

数益工联 x TiDB丨如何运用 HTAP 挖掘工业数据价值?

制造业是一个古老而悠久的行业&#xff0c;它的起源最早可追溯到石器时代。从新石器时代简单的工具&#xff0c;到今天复杂的智能工厂&#xff0c;制造业历经千年发展&#xff0c;蜕变成了由技术驱动的创新行业&#xff0c;充满各种自动化流程、始终互连的设备和数据丰富的流程…

深度学习笔记(一)——什么是神经网络

生物学中的神经元的定义 神经元有很多种类&#xff0c;下图就是其中的一种&#xff0c;锥体神经元。它由三部分组成&#xff0c;分别是树突&#xff0c;胞体和轴突。树突是接受输入&#xff0c;轴突是用于输出的。神经元的树突在接收到特定的输入刺激后&#xff0c;其胞体就会被…

BGP在数据中心的应用5——BGP生命周期管理

注&#xff1a; 本文根据《BGP in the Datacenter》整理&#xff0c;有兴趣和英文阅读能力的朋友可以直接看原文&#xff1a;https://www.oreilly.com/library/view/bgp-in-the/9781491983416/上一部分笔记请参考&#xff1a;https://blog.csdn.net/tushanpeipei/article/deta…

腾讯前端vue面试题合集

能说下 vue-router 中常用的 hash 和 history 路由模式实现原理吗&#xff1f; &#xff08;1&#xff09;hash 模式的实现原理 早期的前端路由的实现就是基于 location.hash 来实现的。其实现原理很简单&#xff0c;location.hash 的值就是 URL 中 # 后面的内容。比如下面这…

简单易懂的Spring扩展点详细解析,看不懂你来打我

简单易懂的Spring扩展点原理&#xff0c;看不懂你来打我总览BeanFactoryPostprocessor作用回调时机原理BeanDefinitionRegistryPostProcessor作用例子&#xff1a;Spring对Configuration、ComponentScan、Component、Bean、Import等注解的处理回调时机原理ImportSelector作用例…

vue组件之间的数据传递

目录 组件之间的通信 1、组件之间的关系&#xff1a;父子关系、兄弟关系、跨级关系 2、父子组件之间的通信&#xff08;数据传递&#xff09;&#xff1a; 3、兄弟组件之间的通信&#xff08;数据传输&#xff09;&#xff1a; 4、跨级组件之间的通信&#xff1a;provide /…

SparkSQL 入门简介

在安装目录的bin目录打开spark-shell.cmd&#xff0c;输入如下&#xff0c;按tab健&#xff0c;查看可执行数据源 spark.read.在安装目录D:\spark-3.0.0-bin-hadoop3.2\bin\input新建user.json {"username":"chen","age":3} {"username&q…