|
Autor |
Python: Aufzählungsbedingung aufstellen |
|
Eris23
Neu  Dabei seit: 02.07.2022 Mitteilungen: 4
 | Themenstart: 2022-07-03
|
Hallo zusammen,
ich analysiere derzeit eine Datei und werde einen Clustering mit KMeans durchführen.
Ziel dabei ist es eine neue CSV zu generieren, sodass die Kunden nach Alter und Ausgaben zu Clustern. Dabei möchte ich in Python herausfinden, wie viel der einzelne Kunde für einen Einkauf ausgibt.
Bedienung sind
1. was der Kunde an den einen Tag ausgegeben hat (wenn Kunden ID gleich und der Transaktionsdatum übereinstimmt dann summiere Kosten -> Einkaufsliste)
2. wie viel der Kunde insgesamt ausgegeben hat (wenn Kunden ID gleich summiere Kosten -> Komplett ausgegeben).
Dabei bräuchte ich euere Hilfe eine Funktion aufzustellen. Leider bin ich in den Themenfeld unerfahren.
In der eine CSV-Datei werden die Transaktionen eines Online-Shops erfasst.
Zur Verfügung gestellt wurden datum (t_dat), Kunden ID (customer_id), Artikel ID (article_id), Preis vom Produkt (price) und Verkaufskanal (sales_channel_id)
Die Datei zeigt, dass Kunde xy ein Produkt gekauft hat. Es werden nur einzelne Artikel angezeigt und nicht, wie in der Einkaufsliste, wie viel er insgesamt ausgegeben hat. Dabei möchte ich eine neue spalte "Customer nr." in der Datei hinzufügen. Hierbei soll die Funktion bei einer
Mein Gedanke wäre dabei, dass man einen if else Funktion macht.
ist es möglich? und kann man das als zusätzliche Spalte, wie 'Kunden Nr. xxx'.
Schon mal vielen lieben dank :)
Beispiel ausschnitt:
t_dat, customer_id, article_id, price, sales_channel_id
2018-09-20,
000058a12d5b43e67d225668fa1f8d618c13dc232df0cad8ffe7ad4a1091e318, 0663713001, 0.050830508474576264, 2
2018-09-20,
000058a12d5b43e67d225668fa1f8d618c13dc232df0cad8ffe7ad4a1091e318, 0541518023, 0.03049152542372881, 2
2018-09-20, 00007d2de826758b65a93dd24ce629ed66842531df6699338c5570910a014cc2, 0505221004, 0.01523728813559322, 2
2018-09-20, 00007d2de826758b65a93dd24ce629ed66842531df6699338c5570910a014cc2, 0685687003, 0.016932203389830508, 2
2018-09-20, 00007d2de826758b65a93dd24ce629ed66842531df6699338c5570910a014cc2, 0685687004, 0.016932203389830508, 2
2018-09-20, 00007d2de826758b65a93dd24ce629ed66842531df6699338c5570910a014cc2, 0685687001, 0.016932203389830508, 2
2018-09-20, 00007d2de826758b65a93dd24ce629ed66842531df6699338c5570910a014cc2, 0505221001, 0.020322033898305086, 2
2018-09-20,
00083cda041544b2fbb0e0d2905ad17da7cf1007526fb4c73235dccbbc132280, 0688873012, 0.03049152542372881, 1
2018-09-20,
00083cda041544b2fbb0e0d2905ad17da7cf1007526fb4c73235dccbbc132280, 0501323011, 0.053372881355932204, 1
2018-09-20,
00083cda041544b2fbb0e0d2905ad17da7cf1007526fb4c73235dccbbc132280, 0598859003, 0.0457457627118644, 2
|
Profil
|
schnitzel
Senior  Dabei seit: 26.02.2009 Mitteilungen: 224
 | Beitrag No.1, eingetragen 2022-07-04
|
Hi,
hört sich für mich danach, dass du ein groupby durchführen möchtest. Also z.B.:
\sourceon python
s = """\
t_dat,customer_id,article_id,price,sales_channel_id
2018-09-20, 000058a12d5b43e67d225668fa1f8d618c13dc232df0cad8ffe7ad4a1091e318, 0663713001, 0.050830508474576264, 2
2018-09-20,000058a12d5b43e67d225668fa1f8d618c13dc232df0cad8ffe7ad4a1091e318, 0541518023, 0.03049152542372881, 2
2018-09-20, 00007d2de826758b65a93dd24ce629ed66842531df6699338c5570910a014cc2, 0505221004, 0.01523728813559322, 2
2018-09-20, 00007d2de826758b65a93dd24ce629ed66842531df6699338c5570910a014cc2, 0685687003, 0.016932203389830508, 2
2018-09-20, 00007d2de826758b65a93dd24ce629ed66842531df6699338c5570910a014cc2, 0685687004, 0.016932203389830508, 2
2018-09-20, 00007d2de826758b65a93dd24ce629ed66842531df6699338c5570910a014cc2, 0685687001, 0.016932203389830508, 2
2018-09-20, 00007d2de826758b65a93dd24ce629ed66842531df6699338c5570910a014cc2, 0505221001, 0.020322033898305086, 2
2018-09-20, 00083cda041544b2fbb0e0d2905ad17da7cf1007526fb4c73235dccbbc132280, 0688873012, 0.03049152542372881, 1
2018-09-20, 00083cda041544b2fbb0e0d2905ad17da7cf1007526fb4c73235dccbbc132280, 0501323011, 0.053372881355932204, 1
2018-09-20, 00083cda041544b2fbb0e0d2905ad17da7cf1007526fb4c73235dccbbc132280, 0598859003, 0.0457457627118644, 2
"""
import pandas as pd
from io import StringIO
df = pd.read_csv(StringIO(s), parse_dates=[0], )
sale_per_day = df.groupby(by=['t_dat', 'customer_id'], as_index=False).sum()
df.merge(sale_per_day, on=['t_dat', 'customer_id'])
\sourceoff
Gruß
|
Profil
|
DerEinfaeltige
Senior  Dabei seit: 11.02.2015 Mitteilungen: 3279
 | Beitrag No.2, eingetragen 2022-07-04
|
Ich verstehe leider nicht, was du genau möchtest.
Totale und durchschnittliche Ausgaben der Kunden könnte man wie folgt auslesen und zur Weiterverarbeitung bereitstellen.
\sourceon Python
\numberson
from csv import DictReader
def load_file(file_name):
customers = {}
with open(file_name) as f:
reader = DictReader(f,skipinitialspace=True)
for item in reader:
c_id = item['customer_id']
date = item['t_dat']
price = float(item['price'])
if c_id not in customers:
customers[c_id] = {}
if date not in customers[c_id]:
customers[c_id][date] = []
customers[c_id][date].append(price)
return customers
def get_average(customers):
return {c_id : sum(
sum(customers[c_id][date]) for date in customers[c_id]) / len(customers[c_id])
for c_id in customers}
def get_totals(customers):
return {c_id : sum(
sum(customers[c_id][date]) for date in customers[c_id])
for c_id in customers}
if __name__ == "__main__":
file_name = 'transactions.csv'
customers = load_file(file_name)
print(get_average(customers))
print(get_totals(customers))
\sourceoff
[Die Antwort wurde vor Beitrag No.1 begonnen.]
|
Profil
|
Eris23 hat die Antworten auf ihre/seine Frage gesehen. Eris23 hat selbst das Ok-Häkchen gesetzt. | Eris23 wird per Mail über neue Antworten informiert. |
|
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen. Lesen Sie die
Nutzungsbedingungen,
die Distanzierung,
die Datenschutzerklärung und das Impressum.
[Seitenanfang]
|