在Python 3中,我试图从4个列表中生成这种格式的序列
<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
第一个列表的日期范围为<yyyymmdd to yyyymmdd>
,其余3个列表的范围为<1-200> <1-20> and <1-13000>
。
所有列表值均为str格式。
现在我正在尝试以下操作:
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))
3个列表的第一个串联是快速且内存不足。 第二个串联只是占用大量内存并被杀死。
我也尝试在48 gig RAM系统上运行它,但是似乎没有足够的内存来运行它。
在解决此问题以及理解为什么需要这么多内存的过程中,我需要一些帮助。我在这里做什么错了?
更新: (我的要求)
因此,我有几个数据帧,这些数据帧的列很少,其值的格式为-<1-200>-<1-20>-<1-13000>,这会占用大量空间,因此我想要创建所有可能值的列表,然后枚举并创建如下字典:
-<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
,然后将数据帧的值替换为1,2 ... n,n-1。
还有其他方法吗?
答案 0 :(得分:2)
您不需要将这些范围转换为列表。
您应该执行以下操作:
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))
然后,您可以使用这些对生成器来获取所需的内容。
答案 1 :(得分:1)
只需使用一个生成器表达式:
return await User.query()
.joinRelation('recognitions')
.where('organization_id', organizationID)
.select(
'user_id',
'profile_photo_name',
'first_name',
'last_name',
raw('COUNT(*) as count')
)
.groupBy('user_id')
.orderBy('count', 'desc')
.first()
使用方式:
sequences = ('-'.join(str(x) for x in p) for p in itertools.product(all_dates,all_users,all_products, all_customers))