[英]Pandas: dynamically append dataframe column into a running total dataframe within a loop
我正在編寫一個模擬,我正在嘗試將每個迭代的結果 append 變成一個跟蹤所有迭代的 dataframe。
雖然收集結果一切正常,但我每次都找不到將結果 append 放入新列的方法。 一段時間以來,我一直在努力解決這個問題,但無法解決這個問題。
我已經構建了我正在做的事情的簡化版本,以最好地解釋我的問題:
import simpy
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
import pandas as pd
###dataframe for the simulation
df = pd.DataFrame({'Id' : ['1183', '1187']})
df['average_demand'] = [7426,989]
df['lead_time'] = [1.5, 1.5]
df['sale_price'] = [1.98, 2.01]
df['buy_price'] = [0.11, 0.23]
df['beg_inventory'] = [1544,674]
df['margin'] = df['sale_price'] - df['buy_price']
df['holding_cost'] = 0.2/12
df['aggregate_order_placement_cost'] = 1000
df['review_time'] = 0
df['periods'] = 30
#df['cap_ts'] = 1.5
df['min_ts'] = 1
df['low_demand'] = [300, 30]#,3000,350,220,40,42,40,10,25,240]
df['high_demand'] = [1000, 130]#,12000,700,500,100,90,210,135,200,800]
df['low_sd'] = [160,30]#,3400,100,90,10,5,50,26,45,170]
df['high_sd'] = [400,90]#,5500,200,160,60,50,100,78,113,300]
cap_ts = 0
big_df = pd.DataFrame(df)
for i in df.index:
for cap_ts in range(1,12, 1):
def warehouse_run(env, df):
df['inventory'] = df['beg_inventory']
df['balance'] = 0.0
df['quantity_on_order'] = 0
df['count_order_placed'] = 0
df['commands_on_order'] = 0
df['demand'] = 0
df['safety_stock'] = 0
df['stockout_occurence'] = 0
df['inventory_position'] = 0
while True:
interarrival = generate_interarrival()
yield env.timeout(interarrival)
df['balance'] -= df['inventory'] * df['holding_cost'] * interarrival
df['demand'] = generate_demand()
if df['demand'].loc[i] < df['inventory'].loc[i]:
df['balance'] += df['sale_price'] * df['demand']
df['inventory'] -= df['demand']
print('{:.2f} sold {}'.format(env.now, df['demand'].loc[i]))
else:
df['balance'] += df['sale_price'] * df['inventory']
df['inventory'] = 0
df['stockout_occurence'] += 1
print('{:.2f} demand {} but inventory{}'.format(env.now, df['demand'].loc[i], df['inventory'].loc[i]))
print('{:.2f} sold {} ( nb stockout)'.format(env.now, df['stockout_occurence'].loc[i]))
if df['demand'].loc[i] > df['inventory'].loc[i]:
env.process(handle_order(env,
df))
df['count_order_placed'] += 1
print("inventory", df['inventory'].loc[i])
print("number of orders placed", df['count_order_placed'].loc[i])
def handle_order(env, df):
df['quantity_ordered'] = cap_ts *df['average_demand']
df['quantity_on_order'] += df['quantity_ordered']
df['commands_on_order'] += 1
print("{:.2f} placed order for {}".format(env.now, df['quantity_ordered'].loc[i]))
df['balance'] -= df['buy_price'] * df['quantity_ordered'] + df['aggregate_order_placement_cost']
yield env.timeout(df['lead_time'].loc[i], 0)
df['inventory'] += df['quantity_ordered']
df['quantity_on_order'] -= df['quantity_ordered']
df['commands_on_order'] -= 1
print('{:.2f} receive order,{} in inventory'.format(env.now, df['inventory'].loc[i]))
# number of orders per month
def generate_interarrival():
return np.random.exponential(1. / 1)
# quantity of demand per months
def generate_demand():
return np.random.randint(df['low_demand'].loc[i], df['high_demand'].loc[i])
def generate_standard_deviation():
return np.random.randint(df['low_sd'].loc[i], df['high_sd'].loc[i])
obs_time = []
inventory_level = []
demand_level = []
safety_stock_level = []
inventory_position_level = []
def observe(env, df):
while True:
obs_time.append(env.now)
inventory_level.append(df['inventory'].loc[i])
demand_level.append(df['demand'].loc[i])
safety_stock_level.append(df['safety_stock'].loc[i])
inventory_position_level.append(df['inventory_position'].loc[i])
yield env.timeout(0.1)
np.random.seed(0)
env = simpy.Environment()
env.process(warehouse_run(env, df))
env.process(observe(env, df))
# #RUN FOR 12 MONTHS
env.run(until=36.0)
recap = pd.DataFrame(df.loc[i])
recap = recap.transpose()
#big_df.append(recap)
big_df['Iteration {}'.format(i)] = recap
print(recap)
因此,在此代碼中,問題在於將包含在recap
中的結果附加到big_df
。 理想情況下,在模擬結束時, big_df
應該包含 24 列,這將是模擬每次迭代的一列結果。 對此的任何幫助將不勝感激,謝謝
更新:感謝 wnsfan40,我已經能夠獲得一個連接每次迭代結果的 df,但是big_df
在每次迭代時重置,並且不會不斷地 append 每個新的 df。
預計 output 看起來像這樣:
Id result_columns
0 11198 x
1 11198 x
2 11198 x
3 11198 x
4 11198 x
5 11198 x
6 11198 x
7 11198 x
8 11198 x
9 11198 x
10 11198 x
11 11198 x
12 11187 y
13 11187 y
14 11187 y
15 11187 y
16 11187 y
17 11187 y
18 11187 y
19 11187 y
20 11187 y
21 11187 y
22 11187 y
23 11187 y
result columns
是包含每行結果的所有列的快捷方式。
使用初始化時,將 df 的列指定為 big_df 的索引
big_df = pd.DataFrame(index = df.index)
嘗試從 append 更改為分配列值,例如
big_df['Iteration {}'.format(i)] = recap
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.