Python中的时间序列趋势识别

时间:2018-07-17 12:43:50

标签: python pandas scikit-learn

我有一个CSV,其中包含不同日期的销售数据。 这是文件的示例:

DATE,       ARTICLENO, QUANTITY
2018-07-17, 101,       50
2018-07-16, 101,       55
2018-07-16, 105,       36
2018-07-15, 105,       23

我将其读入pandas数据框,并对此进行了基本的kmeans算法,但我需要更多帮助。

数据说明: 日期列是数据框的索引,描述了销售价格的日期。有多个元组(Date-Quantity-ArticleNo),因此每个商品编号都有一个时间序列。它们的长度和开始日期可能不同,这使得预测和识别趋势(例如夏季或冬季的良好销售)变得更加困难。 CSV按商品编号和日期排序。

目标:

从csv中收集一组给定的数据,并为夏季或冬季(季节性趋势)的畅销商品创建标签,并将将来的商品与它们匹配。

这是我到目前为止所做的事情(当前我没有日期作为索引xet,但这是目标):

from __future__ import absolute_import, division, print_function
import pandas as pd
import numpy as np
from matplotlib import pyplot as plp
from sklearn import preprocessing
from sklearn.cluster import KMeans
import sys

def extract_articles(data, article_numbers):
    return pd.DataFrame(
    [
        data[data['ARTICLENO'] == article_no]['QUANTITY'].values
        for article_no in article_numbers
    ]
 ).fillna(0)


def read_csv_file(file_name, number_of_lines):
    return pd.read_csv(file_name, parse_dates=['DATE'], 
nrows=number_of_lines)

def get_unique_article_numbers(data):
    return data['ARTICLENO'].unique()


def main():
    data = read_csv_file('statistic.csv', 400000)



    modeling_article_numbers = get_unique_article_numbers(data)
    print("Clustering on", len(modeling_article_numbers), "article numbers")
    modeling_data = extract_articles(data, modeling_article_numbers)
    modeling_data = modeling_data.iloc[:50, :]
    # 'switch' dataframe
    modeling_data = modeling_data.T
    modeling_data = modeling_data.pct_change().fillna(0)
    normalized_modeling_data = preprocessing.normalize(modeling_data, 
    norm='l2', axis=0)
    print(modeling_data)


    predicting_article_numbers = [30079229, 30079854, 30086845]
    predicting_article_data = extract_articles(data, 
    predicting_article_numbers)
    predicting_article_data = predicting_article_data.pct_change().fillna(0)
    normalized_predicting_article_data = preprocessing.normalize( 
    predicting_article_data, norm='l2'
    )


    kmeans = KMeans(n_clusters=5, 
    random_state=0).fit(normalized_modeling_data)
    print(kmeans.labels_)
    # for data, article_no in [
        # (normalized_predicting_article_data, 430079229),
        # (normalized_predicting_article_data, 430079854),
        # (modeling_data, 430074590),
        # ]:
    # print('Predicting article {0}'.format(article_no))
    # print(kmeans.predict([data[0]]))

    for i, cluster_center in enumerate(kmeans.cluster_centers_):
         plp.plot(cluster_center, label='Center {0}'.format(i))
    plp.legend(loc='best')
    plp.title(('Cluster based on ' + str(len(modeling_article_numbers)) + ' 
    article numbers'))
    plp.show()


 main()

我转置了数据框,因为它不包含沿轴1的每个商品编号的序列。 我的问题是:如何获得标签的“说明”?我可以命名吗? 也许kmeans对我的意图来说是错误的算法?

2 个答案:

答案 0 :(得分:0)

您是否尝试过将每篇文章在数据集中排成一行?

我不确定您在阅读问题后是否这样做。

完成此操作后,您可以汇总日期,例如作为每周数量。如果您有一年以上的数据,请使其为每周平均数量。因此,您得到一张具有52个功能的表格{第1周:售出500;第2周:每件商品售出520 ...}。

我不认为k均值是您要寻找的东西,因为您非常了解自己想要的东西,这使您成为算法的一个很好的“老师”,所以,我:请使用监督算法。 因此,您需要手工标记至少一些(最好是全部)汇总的产品数据,但是由于效果更好,因此值得进行这项工作。

此外,您还可以研究时间序列共振分析/时间序列分解。

无论如何,如果您熟悉sci-kit,我会给我监督算法(决策树,随机森林,SVM,MLPClassifier ...)的机会,可能更容易实现。

答案 1 :(得分:0)

我发现statsmodels程序包提供了一个用于季节分解的API,该API提供了可用于进一步步骤的趋势分析。