使用pandas处理时间序列数据
常见步骤:
1、创建时间序列数据
可以通过 pandas 的 date_range 生成时间索引,也可以直接从已有数据转换为时间序列格式。
# 例子1
# 从一组数据创建一个带有时间戳的 DataFrame
import pandas as pd
# 创建日期范围,D代表Day
dates = pd.date_range('2023-01-01', periods=6, freq='D')
# 创建带有时间索引的数据
df = pd.DataFrame({
'Date': dates,
'Value': [10, 15, 13, 20, 18, 22]
})
# 把'Data'设置成索引,不然索引是默认的0,1,2,3,4,5
df.set_index('Date', inplace=True)
print(df)
Value
Date
2023-01-01 10
2023-01-02 15
2023-01-03 13
2023-01-04 20
2023-01-05 18
2023-01-06 22
# 例子2
import pandas as pd
import numpy as np
# 创建日期范围
dates = pd.date_range(start='2023-01-01', periods=10, freq='D')
# 创建 DataFrame
df = pd.DataFrame({
'Date': dates,
'Value': np.random.randint(10, 100, size=(10,))
})
# 设置日期为索引,'D':天,'H':小时 'M':月 'Y':年
df.set_index('Date', inplace=True)
print(df)
Value
Date
2023-01-01 45
2023-01-02 68
2023-01-03 97
2023-01-04 12
2023-01-05 97
2023-01-06 93
2023-01-07 13
2023-01-08 68
2023-01-09 97
2023-01-10 45
2、重采样与聚合
时间序列数据通常需要按不同的时间频率(例如天、周、月)进行重采样或聚合。
重采样是将数据按更低或更高的频率进行聚合。
重采样是指将时间序列数据从一个频率转换为另一个频率的过程,通常伴随着某种聚合操作。
降采样(高频率 -> 低频率)
例如,将日数据转换为月数据。
# 假设有一个包含一整年日数据的 DataFrame
dates = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')
df = pd.DataFrame({
'Value': np.random.randint(100, size=len(dates))
}, index=dates)
# 按月求平均值
monthly_mean = df.resample('M').mean()
print(monthly_mean.head())
Value
2023-01-31 51.096774
2023-02-28 54.357143
2023-03-31 47.709677
2023-04-30 50.733333
2023-05-31 50.741935
C:\Users\aining\AppData\Local\Temp\ipykernel_16144\1444217263.py:8: FutureWarning: 'M' is deprecated and will be removed in a future version, please use 'ME' instead.
monthly_mean = df.resample('M').mean()
常用的聚合函数有mean,sum, max, min
升采样(低频率 -> 高频率)
例如,将月数据转换为日数据,需要填充新增加的日期。
# 创建月度数据
dates = pd.date_range(start='2023-01-31', periods=6, freq='M')
df = pd.DataFrame({
'Value': np.random.randint(100, size=len(dates))
}, index=dates)
# 升采样为日数据,使用前向填充方法
daily_data = df.resample('D').ffill()
print(daily_data.head(10))
Value
2023-01-31 78
2023-02-01 78
2023-02-02 78
2023-02-03 78
2023-02-04 78
2023-02-05 78
2023-02-06 78
2023-02-07 78
2023-02-08 78
2023-02-09 78
C:\Users\aining\AppData\Local\Temp\ipykernel_16144\66128099.py:2: FutureWarning: 'M' is deprecated and will be removed in a future version, please use 'ME' instead.
dates = pd.date_range(start='2023-01-31', periods=6, freq='M')
3、时间窗口处理
可以使用滚动窗口计算统计信息。滚动窗口可以用于计算滑动平均、标准差等统计信息。例如,计算3天的滚动平均值:
# 计算3天的滚动平均
df['Rolling_Mean'] = df['Value'].rolling(window=3).mean()
print(df)
Value Rolling_Mean
2023-01-31 78 NaN
2023-02-28 86 NaN
2023-03-31 2 55.333333
2023-04-30 71 53.000000
2023-05-31 8 27.000000
2023-06-30 19 32.666667
4、时间戳转换
pandas 可以轻松处理不同格式的时间数据,并进行转换操作。
有时候数据中的时间格式并不符合时间序列的标准格式,pandas 提供了 to_datetime 方法,可以方便地将字符串转换为时间格式。
data = {
'Date': ['2023-01-01', '2023-01-02', '2023-01-03'],
'Value': [10, 20, 30]
}
df = pd.DataFrame(data)
# pd.to_datetime:将字符串格式的日期转换为日期类型。
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
print(df)
Value
Date
2023-01-01 10
2023-01-02 20
2023-01-03 30
5、时区处理
pandas 允许对时间序列数据添加时区信息,并进行时区的转换
# 设置时区
df = df.tz_localize('UTC')
# 转换为不同的时区
df_tz = df.tz_convert('Asia/Shanghai')
print(df_tz)
Value Rolling_Mean Date
Date
2023-01-01 08:00:00+08:00 10 NaN 2023-01-01
2023-01-02 08:00:00+08:00 15 NaN 2023-01-02
2023-01-03 08:00:00+08:00 13 12.666667 2023-01-03
2023-01-04 08:00:00+08:00 20 16.000000 2023-01-04
2023-01-05 08:00:00+08:00 18 17.000000 2023-01-05
2023-01-06 08:00:00+08:00 22 20.000000 2023-01-06
案例实战:股票数据分析
步骤1:获取股票数据
import yfinance as yf
# 获取苹果公司一年的股票数据
start_date = '2022-01-01'
end_date = '2022-12-31'
# 下载股票数据
apple_stock = yf.download('AAPL', start=start_date, end=end_date)
print(apple_stock.head())
[*********************100%***********************] 1 of 1 completed
Open High Low Close Adj Close \
Date
2022-01-03 177.830002 182.880005 177.710007 182.009995 179.273605
2022-01-04 182.630005 182.940002 179.119995 179.699997 176.998337
2022-01-05 179.610001 180.169998 174.639999 174.919998 172.290207
2022-01-06 172.699997 175.300003 171.639999 172.000000 169.414093
2022-01-07 172.889999 174.139999 171.029999 172.169998 169.581558
Volume
Date
2022-01-03 104487900
2022-01-04 99310400
2022-01-05 94537600
2022-01-06 96904000
2022-01-07 86709100
步骤2:重采样与可视化
import matplotlib.pyplot as plt
# 按月计算收盘价的平均值
monthly_close = apple_stock['Close'].resample('M').mean()
# 绘制月平均收盘价
monthly_close.plot(title='Monthly Average Close Price', figsize=(12, 6))
plt.ylabel('Price')
plt.show()
C:\Users\aining\AppData\Local\Temp\ipykernel_16144\2536110177.py:3: FutureWarning: 'M' is deprecated and will be removed in a future version, please use 'ME' instead.
monthly_close = apple_stock['Close'].resample('M').mean()
步骤3:计算移动平均线
# 计算20天和50天移动平均线
apple_stock['20D_MA'] = apple_stock['Close'].rolling(window=20).mean()
apple_stock['50D_MA'] = apple_stock['Close'].rolling(window=50).mean()
# 绘制收盘价和移动平均线
apple_stock[['Close', '20D_MA', '50D_MA']].plot(figsize=(12, 6))
plt.title('Apple Stock Price with Moving Averages')
plt.ylabel('Price')
plt.show()
# 检查是否有缺失值
print(apple_stock.isnull().sum())
# 如果有缺失值,可以使用插值或填充方法处理
apple_stock.interpolate(inplace=True)
Open 0
High 0
Low 0
Close 0
Adj Close 0
Volume 0
20D_MA 19
50D_MA 49
dtype: int64
喜欢的小伙伴们点个关注
喜欢的小伙伴们点个赞呀
接下来多多写关于数据分析的内容