En Python 3, j'essaie de générer une séquence dans ce format à partir de 4 listes

<yyyymmdd>-<1-200>-<1-20>-<1-13000>

20161201-1-1-1
20161201-1-1-2
20161201-1-1-3
..
..
20161201-1-2-1
20161201-1-2-2
..
..
20161201-2-1-1
20161201-2-1-2
..
20161202-1-1-1
20161202-1-1-2
..
..
20190701-200-20-13000

La première liste est dans une plage de dates de <yyyymmdd to yyyymmdd>, les 3 listes restantes sont dans des plages <1-200> <1-20> and <1-13000>.

Toutes les valeurs de liste sont au format str.

Maintenant j'essaye de faire ceci:

import itertools
import pandas as pd

all_dates = [d.strftime('%Y%m%d') for d in pd.date_range('20160119','20191226')]
all_users = list(range(0,200))
all_products = list(range(0,15))
all_customers = list(range(0,13000))

date_user_product_map = []
date_user_product_customer_map = []

for pair in itertools.product(all_dates,all_users, all_products):
    date_user_product_map.append('-'.join(pair))

for pair in itertools.product(date_user_product_map,all_customers):
    date_user_product_customer_map.append('-'.join(pair))

La première concaténation de 3 listes est rapide et faible en mémoire. La deuxième concaténation prend juste une énorme mémoire et se fait tuer.

J'ai également essayé de l'exécuter sur un système de RAM de 48 Go, mais il semble qu'aucune quantité de mémoire ne soit suffisante pour que cela fonctionne.

J'aimerais avoir de l'aide pour résoudre ce problème et comprendre pourquoi cela a besoin de tant de mémoire. Qu'est-ce que je fais mal ici?

MISE À JOUR: (mon exigence)

Donc, j'ai quelques dataframes qui ont peu de colonnes dont les valeurs au format de - <1-200> - <1-20> - <1-13000> qui prennent beaucoup de place Et donc je veux créer le liste de toutes les valeurs possibles, puis énumérer et créer un dictionnaire comme ci-dessous:

- <1-200> - <1-20> - <1-13000>

20161201-1-1-1: 0 20161201-1-1-2: 1 20161201-1-1-3: 2 .. .. 20190701-200-20-12999: n-1 20190701-200-20-13000: n

Puis remplacez les valeurs des trames de données par 1,2 ... n, n-1.

Y a-t-un autre moyen de faire ça?

1
Avinash Sonee 15 mars 2019 à 21:44

2 réponses

Meilleure réponse

Vous n'avez pas besoin de convertir ces plages en listes.

Vous devriez faire quelque chose comme ça:

import itertools
import pandas as pd

all_dates = (d.strftime('%Y%m%d') for d in pd.date_range('20160119','20191226'))
all_users = range(0,200)
all_products = range(0,15)
all_customers = range(0,13000)

date_user_product_pairs = ( '-'.join(pair) for pair in itertools.product(all_dates,all_users, all_products))

date_user_product_customer_pairs = ( '-'.join(pair) for pair in itertools.product(date_user_product_map,all_customers))

Alors vous pouvez utiliser ces générateurs de paires pour obtenir ce dont vous avez besoin.

2
Ijaz Ahmad Khan 15 mars 2019 à 19:14

Utilisez simplement une seule expression de générateur:

sequences = ('-'.join(str(x) for x in p) for p in itertools.product(all_dates,all_users,all_products, all_customers))

Utilisé comme:

>>> for _ in range(10): print(next(sequences))

20160119-0-0-0
20160119-0-0-1
20160119-0-0-2
20160119-0-0-3
20160119-0-0-4
20160119-0-0-5
20160119-0-0-6
20160119-0-0-7
20160119-0-0-8
20160119-0-0-9
1
John Coleman 15 mars 2019 à 19:04