Генерация чисел, соответствующих критериям в Python - PullRequest
0 голосов
/ 17 июня 2020

Приведенный ниже код занимает 2 секунды до sh. Код выглядит чистым, но очень неэффективным.

Я пытаюсь предварительно сгенерировать способы, которыми вы можете создать, в общей сложности max_units с шагом 2

Я бы тогда отфильтруйте созданную таблицу так, чтобы secondary_categories соответствовали определенным критериям:

  • 'A' составляет> 10% от общего количества, а 'B' <= 50% от общего количества. </li>

Видите ли вы лучший способ получить комбинации с шагом 2, которые удовлетворяют критериям, подобным приведенным выше?

import itertools
import pandas as pd

primary_types= ['I','II']                
secondary_categories= ['A','B'] 

unitcategories= len(primary_types)*len(secondary_categories) #up to 8

min_units= 108; max_units= 110 #between 20 and 400
max_of_one_type= max_units


args =[[i for i in range(2,max_of_one_type, 2)] for x in range(unitcategories)]

lista= list(itertools.product(*args))

filt= [True if max_units>=l>=min_units else False for l in list(map(sum, lista))]

lista= list(itertools.compress(lista, filt))

df=pd.DataFrame(lista, columns= pd.MultiIndex.from_product([primary_types, secondary_categories], names=['', '']))

df['Total']=df.sum(axis=1)

df

Расширение следующего приводит к значительному увеличению времени или нехватке памяти: .

Спасибо

1 Ответ

2 голосов
/ 18 июня 2020

Хорошо, я отправляю это только к сведению, но я не думаю, что это идеальное решение. Я считаю, что существует гораздо более элегантное решение, и держу пари, что оно включает numpy. Однако это должно быть по крайней мере быстрее, чем OP:

import itertools
import pandas as pd


primary_types = ["I", "II"]
secondary_categories = ["A", "B"]

unitcategories = len(primary_types) * len(secondary_categories)  # up to 8

min_units = 54
max_units = 55  # between 10 and 200
max_of_one_type = max_units

args = [range(1, max_of_one_type) for x in range(unitcategories)]

lista = [x for x in itertools.product(*args)if max_units >= sum(x) >= min_units]

df = pd.DataFrame(
    lista,
    columns=pd.MultiIndex.from_product(
        [primary_types, secondary_categories], names=["", ""]
    ),
)

df["Total"] = df.sum(axis=1)

df = df * 2  # multiply by 2 to get the result you want
  1. Я разделил все на 2 в начале и умножил результат в конце на 2.
  2. Я удалил все ненужное использование list
  3. Я удалил itertools.compress и filt и вместо этого просто поместил if в понимание списка (где lista объявлен и назначен)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...