使用pandas处理时间序列数据

使用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

喜欢的小伙伴们点个关注
喜欢的小伙伴们点个赞呀
接下来多多写关于数据分析的内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值