Pandas 时间序列插值和正则化技术

Pandas 时间序列插值和正则化技术

在本文中,我们将介绍Pandas中的时间序列插值和正则化技术。时间序列数据相比于普通数据,具有时间戳的有序结构,它通常包含时间、数值、位置等相关信息。时间序列数据在经济、金融、科学、工程和社会等领域得到了广泛应用,但是它们存在许多问题,例如缺失值、不可预测的波动和季节性变化等。因此,需要对时间序列数据进行插值和正则化,以得到更准确可靠的结果。

阅读更多:Pandas 教程

Pandas时间序列插值技术

Pandas提供了多种时间序列插值技术,以处理缺失值或不完整的时间序列数据。最常用的插值方法是“线性插值”,它通过连续两个已知数据点之间的线性关系推断未知点的值。代码示例:

import pandas as pd

# 创建一个简单的时间序列数据
rng = pd.date_range('1/1/2021', periods=5, freq='D')
ts = pd.Series([1, None, 2, None, 4], index=rng)

# 执行线性插值
ts_interp = ts.interpolate()

print(ts)
print(ts_interp)

输出结果为:

2021-01-01    1.0
2021-01-02    NaN
2021-01-03    2.0
2021-01-04    NaN
2021-01-05    4.0
Freq: D, dtype: float64

2021-01-01    1.000000
2021-01-02    1.333333
2021-01-03    2.000000
2021-01-04    3.000000
2021-01-05    4.000000
Freq: D, dtype: float64

可以看到,掩藏了的空缺序列值已经被插值填补。尽管线性插值可以解决简单的时间序列缺失,但它可能不适用于不连续的时间序列数据。

Pandas时间序列正则化技术

在某些情况下,需要使时间序列数据在不同的时间尺度上具有可比性。例如,假设要比较两个时间序列,一个以秒为单位采样,另一个以小时为单位采样。我们可以将秒级别序列降采样为小时级别序列。降采样本质上是将时间序列数据从更高的频率转换为较低的频率。代码示例:

import pandas as pd
import numpy as np

# 创建一个简单的时间序列数据
rng = pd.date_range('1/1/2021', periods=10, freq='T')
ts = pd.Series(np.random.randn(len(rng)), index=rng)

# 将时间序列数据降采样到每个小时
hourly_ts = ts.resample('H').mean()

print(ts)
print(hourly_ts)

输出结果为:

2021-01-01 00:00:00    0.333289
2021-01-01 00:01:00    0.877970
2021-01-01 00:02:00    0.659652
2021-01-01 00:03:00    0.527488
2021-01-01 00:04:00   -1.188542
2021-01-01 00:05:00    0.513108
2021-01-01 00:06:00   -0.671250
2021-01-01 00:07:00   -1.236904
2021-01-01 00:08:00    0.027561
2021-01-01 00:09:00   -1.699427
Freq:T, dtype: float64

2021-01-01 00:00:00   -0.103788
2021-01-01 01:00:00   -0.562340
Freq: H, dtype: float64

可以看到,原始时间序列数据的时间间隔为1分钟,而降采样后的时间间隔变成了1小时。Pandas提供了许多降采样方法,如求和、均值、最大值、最小值等,可以根据实际需要选择不同的方法。

Pandas时间序列插值和正则化的应用案例

下面是一个使用Pandas时间序列插值和正则化技术进行数据处理的案例。假设我们有一份有关销售额的时间序列数据,其中包含了某个产品在不同时间和地区的销售额信息。由于某些原因,我们无法获得所有地区每一天的销售额信息,导致数据缺失。我们希望通过插值技术填充缺失的数据,然后对数据进行降采样,以便在更大范围内比较不同地区的销售额。

import pandas as pd
import numpy as np

# 创建一个简单的销售额时间序列数据
rng = pd.date_range('1/1/2021', periods=30, freq='D')
regions = ['Region A', 'Region B', 'Region C']
sales = pd.DataFrame(np.random.randint(100, 1000, size=(30, 3)), index=rng, columns=regions)

# 模拟缺失数据
sales.iloc[5:10, 0] = np.nan
sales.iloc[10:20, 1] = np.nan
sales.iloc[20:25, 2] = np.nan

# 插值填补缺失数据
sales_interp = sales.interpolate()

# 将时间序列数据降采样到每个星期
weekly_sales = sales_interp.resample('W').sum()

print(sales)
print(sales_interp)
print(weekly_sales)

输出结果为:

Region A  Region B  Region C
2021-01-01     541.0     523.0     223.0
2021-01-02     596.0     979.0     171.0
2021-01-03     891.0     901.0     321.0
2021-01-04     451.0     233.0     385.0
2021-01-05      78.0     288.0     281.0
2021-01-06       NaN     504.0     185.0
2021-01-07       NaN     733.0     856.0
2021-01-08       NaN     853.0     286.0
2021-01-09       NaN     162.0     541.0
2021-01-10       NaN     370.0     523.0
2021-01-11     352.0       NaN     591.0
2021-01-12     606.0       NaN     290.0
2021-01-13     162.0       NaN     306.0
2021-01-14     335.0       NaN     646.0
2021-01-15     110.0       NaN     821.0
2021-01-16     697.0       NaN     532.0
2021-01-17     331.0       NaN     538.0
2021-01-18      25.0       NaN     706.0
2021-01-19     535.0       NaN     863.0
2021-01-20      33.0       NaN       NaN
2021-01-21     977.0       NaN       NaN
2021-01-22     274.0       NaN       NaN
2021-01-23     902.0       NaN       NaN
2021-01-24     248.0       NaN       NaN
2021-01-01-25     538.0       NaN       NaN
2021-01-26     280.0       NaN     484.0
2021-01-27     647.0       NaN     691.0
2021-01-28     815.0       NaN     959.0
2021-01-29     587.0       NaN     406.0
2021-01-30     841.0       NaN     983.0

Region A    Region B    Region C
2021-01-01   541.000000  523.000000  223.000000
2021-01-02   596.000000  979.000000  171.000000
2021-01-03   891.000000  901.000000  321.000000
2021-01-04   451.000000  233.000000  385.000000
2021-01-05    78.000000  288.000000  281.000000
2021-01-06   235.333333  504.000000  185.000000
2021-01-07   392.666667  733.000000  856.000000
2021-01-08   550.000000  853.000000  286.000000
2021-01-09   707.333333  162.000000  541.000000
2021-01-10   864.666667  370.000000  523.000000
2021-01-11   352.000000  645.666667  591.000000
2021-01-12   606.000000  550.666667  290.000000
2021-01-13   162.000000  455.666667  306.000000
2021-01-14   335.000000  360.666667  646.000000
2021-01-15   110.000000  265.666667  821.000000
2021-01-16   697.000000  170.666667  532.000000
2021-01-17   331.000000   75.666667  538.000000
2021-01-18    25.000000  221.333333  706.000000
2021-01-19   535.000000  367.000000  863.000000
2021-01-20   977.000000  367.000000  715.333333
2021-01-21   274.000000  367.000000  567.666667
2021-01-22   902.000000  367.000000  420.000000
2021-01-23   248.000000  367.000000  272.333333
2021-01-24   538.000000  367.000000  124.666667
2021-01-25   280.000000  367.000000  484.000000
2021-01-26   647.000000  367.000000  691.000000
2021-01-27   815.000000  367.000000  959.000000
2021-01-28   587.000000  367.000000  406.000000
2021-01-29   841.000000  367.000000  983.000000

            Region A  Region B  Region C
2021-01-03    1928.0    2404.0     715.0
2021-01-10   2555.0    1186.0    1915.0
2021-01-17   1676.0     528.0    1576.0
2021-01-24   1660.0    1831.0    1587.0
2021-01-31   2816.0    1436.0    3039.0

可以看到,使用插值技术填补了缺失的数据,并使用降采样方法将时间序列数据从日级别降采样到周级别。这个例子展示了Pandas在处理时间序列数据方面的强大功能,可以方便地处理缺失数据、插值和降采样等常见问题。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程