ich bin neu hier und auch neu in Python (aber Softwareentwickler in Java, es geht also nur um die Syntax ) und habe ein Problem mit einem privaten Projekt.
Ich möchte einen Kmeans-Algorithmus benutzen, um aus einer CSV-Datei mit Verkaufsstatistiken Muster zu erkennen.
Hier mal ein Beispieldatensatz, wie die CSV aufgebaut ist und wie sie aussehen könnte (ich kenne die Daten im späteren Use Case nicht vorher):
Code: Alles auswählen
ArtikelNummer, Menge, Datum
10001, 250, 2018-07-10
10001, 265, 2018-07-09
10002 380, 2018-07-10
Folgendes habe ich bereits gemacht: CSV in ein Pandas-Dataframe eingelesen, L1 bzw. L2-Normalisierung mit dem sklearn-Package durchgeführt, die Center der Labels geplottet und ein paar Artikel aus der CSV predictet. Allerdings ist der Code auf manuell ausgelegt und den würde ich gerne automatisieren und dafür bräuchte ich Hilfe : )
Hier ist was ich bis jetzt gemacht habe:
Code: Alles auswählen
import pandas as pd
from sklearn.cluster import KMeans
import numpy as np
from matplotlib import pyplot as plp
from sklearn import preprocessing
df = pd.read_csv('statistic.csv', parse_dates=["DATE"], nrows=850)
df_tr = df
clmns = ['QUANTITY', 'ARTICLENO', 'DATE']
df_tr['DATE'] = df_tr['DATE'].astype(int)
# modelling article numbers
df_art1 = df_tr[df_tr['ARTICLENO'] == 430070868]
df_art2 = df_tr[df_tr['ARTICLENO'] == 430070875]
df_art3 = df_tr[df_tr['ARTICLENO'] == 430070899]
df_art4 = df_tr[df_tr['ARTICLENO'] == 430070943]
df_art5 = df_tr[df_tr['ARTICLENO'] == 430070950]
df_art6 = df_tr[df_tr['ARTICLENO'] == 430070967]
df_art7 = df_tr[df_tr['ARTICLENO'] == 430071360]
df_art8 = df_tr[df_tr['ARTICLENO'] == 430073371]
df_art9 = df_tr[df_tr['ARTICLENO'] == 430074590]
df_art10 = df_tr[df_tr['ARTICLENO'] == 430075016]
# predicting articles
df_art11 = df_tr[df_tr['ARTICLENO'] == 430079229]
df_art12 = df_tr[df_tr['ARTICLENO'] == 430079854]
df_art13 = df_tr[df_tr['ARTICLENO'] == 430086845]
df_art14 = df_tr[df_tr['ARTICLENO'] == 430086234]
df_art15 = df_tr[df_tr['ARTICLENO'] == 430086326]
def fillNullValues(art1, art2):
if len(art1) == len(art2):
return
if len(art1) > len(art2):
while len(art1) > len(art2):
art2.append(0)
if len(art1) < len(art2):
while len(art1) < len(art2):
art1.append(0)
return
X = pd.DataFrame(
[df_art1['QUANTITY'].values, df_art2['QUANTITY'].values, df_art3['QUANTITY'].values, df_art4['QUANTITY'].values,
df_art5['QUANTITY'].values, df_art6['QUANTITY'].values, df_art7['QUANTITY'].values, df_art8['QUANTITY'].values,
df_art9['QUANTITY'].values, df_art10['QUANTITY'].values]).fillna(0)
X_L1 = preprocessing.normalize(X, norm='l1')
X_L2 = preprocessing.normalize(X, norm='l2')
df_normalized = (X.pct_change(fill_method='ffill'))
df_normalized = df_normalized.replace([np.inf, -np.inf], np.nan)
df_normalized = df_normalized.fillna(0)
kmeans = KMeans(n_clusters=4, random_state=0).fit(X_L1)
print(kmeans.labels_)
for i in range(2):
df_art11 = df_art11.append([0])
df_art12 = df_art12.append([0])
for i in range(3):
df_art13 = df_art13.append([0])
df_art11 = df_art11.fillna(0)
#normalize predicting data too
df_art11 = preprocessing.normalize([df_art11['QUANTITY']], norm='l2')
df_art12 = df_art12.fillna(0)
df_art12 = preprocessing.normalize([df_art12['QUANTITY']], norm='l2')
df_art13 = df_art13.fillna(0)
df_art13 = preprocessing.normalize([df_art13['QUANTITY']], norm='l2')
# print(kmeans.cluster_centers_)
print("Predicting article 430079229")
print(kmeans.predict(([df_art11[0]])))
print("Predicting article 430079854")
print(kmeans.predict(([df_art12[0]])))
print("Predicting article 430074590")
print(kmeans.predict(([df_art9['QUANTITY'].values])))
plp.plot(kmeans.cluster_centers_[0], label='Center 0')
plp.plot(kmeans.cluster_centers_[1], label='Center 1')
plp.plot(kmeans.cluster_centers_[2], label='Center 2')
plp.plot(kmeans.cluster_centers_[3], label='Center 3')
# plp.plot(kmeans.cluster_centers_[4], label='Center 4')
plp.legend(loc='best')
plp.show()
Für den Anfang möchte ich einen Parameter übergeben, wieviele Reihen eingelesen werden sollen. Dann soll das Dataframe, in dem die ganze CSV liegt, in ein Array von Dataframes zerlegt werden, sodass alle Einträge zu einer Artikelnummer im gleichen Datframe sind. Dieses Array soll dann später zum Clustern verwendet werden. Dann müssen die Dataframes alle auf die gleiche Länge gebracht werden, auch die, die vorhergesagt werden sollen.
Kann mir da jemand helfen?
Vielen Dank und viele Grüße