Мне нужно определить компании, у которых есть избыток запасов, и компании, у которых дефицит по каждому продукту. Я хочу показать, сколько акций каждая компания может передать другой компании, а затем показать обновленные акции.
импортировать панд как pd импортировать numpy как np данные = pd.read_excel("DummyData.xlsx") df = pd.DataFrame(данные) numeric_columns = ['Запасы', 'Заказы', 'Производство'] df[numeric_columns] = df[numeric_columns].apply(pd.to_numeric, error='coerce') df['Stock'] = df['Stock'].fillna(0) df['Заказы'] = df['Заказы'].fillna(0) df['Производство'] = df['Производство'].fillna(0) df['Stock-Orders'] = df['Stock'] - df['Orders'] df['Избыток/Недостаток запасов'] = df['Заказы на акции'] + df['Производство'] df['Необходим запас'] = df['Больше/меньше запаса'].apply(лямбда x: -x, если x < 0, иначе 0) df = df.sort_values(by=['Продукт', 'Избыток/недостаток'], по возрастанию=[True, False]) df['Совокупный излишек'] = df.groupby('Продукт')['Большой/недостаточный запас'].apply(lambda x: x.where(x > 0).cumsum().ffill()) df = df.sort_values(by=['Продукт', 'Больше/недостаток'], по возрастанию=[True, True]) df['Совокупный дефицит'] = df.groupby('Продукт')['Более/недостаточный запас'].apply(lambda x: x.where(x < 0).cumsum().ffill()) df = df.sort_values(by=['Продукт', 'Избыток/недостаток'], по возрастанию=[True, False]) df['Совокупный запас'] = df.groupby('Продукт')['Больше/меньше запасов'].apply(lambda x: x.cumsum()) df['Совокупный излишек'] = df['Совокупный излишек'].fillna(0) df['Совокупный дефицит'] = df['Совокупный дефицит'].fillna(0) df['Оставшийся совокупный запас'] = df['Совокупный запас'].fillna(0) # Добавление столбца «Ранг» на основе отсортированного порядка внутри каждой группы продуктов. df['Rank'] = df.groupby('Product').cumcount() + 1 df['Status'] = df.apply( лямбда-строка: 'Достаточно' if row['Необходим запас'] 0 и Give_company[0] != row['Company Name'] и Available_stock[0] > 0: # Проверьте, может ли эта благотворительная компания покрыть все оставшиеся необходимые запасы если доступный_запас[0] >= оставшийся_запас_необходимо: давать_компании.append((дающая_компания[0], оставшийся_запас_необходим)) rest_stock_needed = 0 перерыв еще: давать_компании.append((дающая_компания[0], доступный_запас[0])) оставшийся_запас_необходимый -= доступный_запас[0] # Дополняем список пустыми строками и нулями, если необходимо давать_компании.extend([('', 0)] * (len(уникальные_компании) - len(дающие_компании))) вернуть давать_компании[:len(уникальные_компании)] # Списки для хранения благотворительных компаний и выделенных им ценностей. Give_company_list = [] # Применяем функцию к каждой строке для i, строка в df.iterrows(): Give_Companies = find_giving_companies (строка) Give_company_list.append(давая_компании) # Обновите DataFrame, указав компании и назначенные им значения. для меня comp_list в enumerate(giving_company_list): для j, (comp, значение) в enumerate(comp_list): выделенный_stock_col = f'Выделенный запас {j + 1}' location_comp_col = f'Распределение Comp {j + 1}' если значение < 0 и comp в df['Company Name'].values: # Установите отрицательное значение для компании в строке Give_company_row = df[(df['Продукт'] == df.at[i, 'Продукт']) & (df['Название компании'] == comp)].index если не давать_company_row.empty: df.at[giving_company_row[0], selected_stock_col] = значение # Установите положительное значение для принимающей компании df.at[i, выделенный_stock_col] = значение df.at[i,location_comp_col] = комп df.at[i, f'Allocated Stock {j + 1}'] = value # Установить отрицательное значение для отдающей компании df['Запасы, необходимые после распределения'] = df.apply(lambda row: row['Необходимы запасы'] - row[allocated_columns].sum() if row['Status'] == 'Недостаточно' else 0, ось =1) df['Запасы, необходимые после распределения'] = df.apply(lambda row: -row['Запасы, необходимые после распределения'] if row['Запасы, необходимые после распределения'] > 0, иначе 0, ось=1) дф введите здесь описание изображения Это созданный мной код Python и выходная таблица.
Я знаю, что хочу включить обновленный столбец «Новый избыток/недостаток запасов». Итак, представьте, что компания B сначала отдает акции компании A, а затем я хочу обновить новый столбец «Избыток/недостаток запасов», чтобы у компании B было меньше запасов, чем раньше. Теперь я хочу использовать этот обновленный столбец для следующей компании, которой потребуются акции. Я хочу расставить приоритеты для каждого столбца, используя ранг. Таким образом, чем выше рейтинг, тем больше акций они получают от других компаний.
[*]проверьте рейтинг, чтобы найти благотворительную компанию. [*]проверьте, достаточно ли запасов у компании-поставщика [*]Проверьте, может ли эта благотворительная компания покрыть все оставшиеся запасы 4. рассчитать новое значение превышения/занижения [*]используйте это новое значение больше/меньше, чтобы проверить, достаточно ли у компании запасов. [*]Проверьте, достаточно ли новых или меньших запасов, чтобы покрыть недостающие запасы у следующей компании.
Пока запасы каждого товара не будут распределены как можно лучше.
Я пробовал много разных способов, но ничего не помогло. Я решил, что это не работает, потому что мне нужно выделенное значение в строке компании-поставщика, но мне это не удается..
Надеюсь, мои намерения ясны — если нет, не стесняйтесь спрашивать
