我有一个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对我的意图来说是错误的算法?
答案 0 :(得分:0)
您是否尝试过将每篇文章在数据集中排成一行?
我不确定您在阅读问题后是否这样做。
完成此操作后,您可以汇总日期,例如作为每周数量。如果您有一年以上的数据,请使其为每周平均数量。因此,您得到一张具有52个功能的表格{第1周:售出500;第2周:每件商品售出520 ...}。
我不认为k均值是您要寻找的东西,因为您非常了解自己想要的东西,这使您成为算法的一个很好的“老师”,所以,我:请使用监督算法。 因此,您需要手工标记至少一些(最好是全部)汇总的产品数据,但是由于效果更好,因此值得进行这项工作。
此外,您还可以研究时间序列共振分析/时间序列分解。
无论如何,如果您熟悉sci-kit,我会给我监督算法(决策树,随机森林,SVM,MLPClassifier ...)的机会,可能更容易实现。
答案 1 :(得分:0)
我发现statsmodels程序包提供了一个用于季节分解的API,该API提供了可用于进一步步骤的趋势分析。