如何通过 PySpark DF 使用 statsmodels 中的seasonal_decompose / 如何将 DataFrame 转换为时间序列数组

问题描述 投票:0回答:1

我有一个包含两列的 Spark Dataframe(time_key,日期和数量之间间隔 7 天),就像这样:

时间键 数量
2023-10-26 10
2023-10-19 12
2023-10-12 14

我正在尝试将“statsmodels”库中的函数“seasonal_decompose”与 PySpark 一起使用。我知道如何在 Pandas 中使用,我可以转换索引中的 time_key 列,并且函数“seasonal_decompose”工作得很好。但我正在尝试在 PySpark 中使用它。我想我有一个选择(我这样说是因为函数的文档:https://shorturl.at/ovC35):将 DF 转换为类似 array_like 的时间序列?

我尝试了以下方法:

  1. 我将 time_key 列转换为日期类型(使用函数“to_date”,最初该列是字符串类型)。然后我尝试创建一个像这样的数组:
time_series_array = [(row.time_key, row.qty_total) for row in df_iter.collect()]

我得到了这个:

[(datetime.date(2020, 11, 1), 0.0), (datetime.date(2020, 8, 30), 0.0), ... ]

然后我应用了该功能:

seasonal_decompose(time_series_array)

但是后来我得到了这个错误:

TypeError: float() argument must be a string or a number, not 'datetime.date'

我想“好吧,所以问题可能是转换为数据类型,那么让我将其保留为字符串”。

  1. 将其保留为字符串,我得到的数组是这样的:

    [('2020-11-01', 0.0), ('2020-08-30', 0.0), ...]

但是在将数组应用到函数后我得到了这个错误:

ValueError: could not convert string to float: '2020-11-01'

我该如何解决这个问题?如何转换原始 DF 以使用函数“seasonal_decompose”?或者如何将原始 DF 转换为时间序列数组? PySpark 中是否有一个函数可以做同样的事情?

machine-learning pyspark time-series databricks statsmodels
1个回答
0
投票

以下是如何使用 statsmodels 的工作示例。

import numpy as np
import pandas as pd
from statsmodels.tsa.seasonal import seasonal_decompose
import matplotlib.pyplot as plt


def print_pandas(dataframe_given):
    with pd.option_context('display.max_rows', None,'display.max_columns', None, 'expand_frame_repr', False):
        print("Given pandas dataframe name")
        print(dataframe_given)

# Generating a sample time series data with a clear seasonal pattern
np.random.seed(42)
time = np.arange(122)
trend = time * 0.1
seasonal = 5 * np.sin(time * 2 * np.pi / 12)
residual = np.random.randn(time.shape[0]) * 2
data = trend + seasonal + residual

# Convert the array to a pandas Series (with a date index, for better visualization)
date_rng = pd.date_range(start='2020-01-01', end='2020-05-01', freq='D')
ts = pd.Series(data, date_rng)

print_pandas(ts)

result = seasonal_decompose(ts, model='additive')

result.plot()
plt.show()

将绘图输出为图像:

© www.soinside.com 2019 - 2024. All rights reserved.