首先通过前向填充的方式处理了 '年', '月', '日' 列中的空值(NaN),然后将这些列的数据类型转换为整数型(Int64)。
# 将 '年', '月', '日' 列中的空值(NaN)用前面的非空值进行填充
v_source[['年','月','日']] = v_source[['年','月','日']].___(___='___')
# 将 '年', '月', '日' 列中的数据类型转换为整数型(Int64),适用于处理缺失值后的数据列
v_source['年'] = v_source['年'].___('Int64')
v_source['月'] = v_source['月'].___('Int64')
v_source['日'] = v_source['日'].___('Int64')
v_source
重置 运行
(6)从数据框v_source中筛选出【总账科目】列包含"库存商品"的行,并选择【明细科目】、【入库数量】和【借方金额】这三列数据,并将结果存储在数据框buy_data中。
# 筛选出总账科目包含 '库存商品' 的数据行
buy_data = v_source[___['___'].___.___('___')]
#选择 '明细科目', '入库数量', '借方金额' 列
buy_data = buy_data[['明细科目','___','借方金额']]
buy_data
重置 运行
(7)将数据框buy_data按照"明细科目"列进行分组,并对每个分组内的【入库数量】和【借方金额】进行求和操作,得到每个明细科目的总入库数量和总借方金额。
buy_data = ___.___(['___']).___()
buy_data
重置 运行
(8)将两个数据框qcye_df和buy_data按照它们的索引进行外连接,并将结果保存到kc_data,然后计算了期初与本期入库数量、期初与本期进价,并计算了月末一次加权平均单价。最后,选择了期初数量和月末一次加权平均单价列,并重置了数据框的索引。
# 将 qcye_df 和 buy_data 数据框按照索引进行外连接
kc_data = ___.___(qcye_df,buy_data ,right_index=___,left_index=___,___='___')#两表拼接
#期初与本期入库数量=期初数量+入库数量
kc_data['期初与本期入库数量'] =kc_data['___']+kc_data['___']
#期初与本期进价=借方余额+借方金额
kc_data['期初与本期进价'] =kc_data['借方余额']+kc_data['___']
#月末一次加权平均单价=期初与本期进价/期初与本期入库数量
kc_data['月末一次加权平均单价'] = (kc_data['___']/kc_data['期初与本期入库数量'])
# 选择并重置列,保留 '期初数量' 和 '月末一次加权平均单价' 列
kc_data = kc_data[['___','月末一次加权平均单价']]
# 重置索引
kc_data = kc_data.___()
kc_data
重置 运行
(9)从数据框 v_source 中选择包含 '主营业务收入' 或 '库存商品' 总账科目的数据行。
sales_data = v_source[(___['___'].___.___('主营业务收入'))|(___['___'].___.___('库存商品'))]
sales_data
重置 运行
(10)首先根据 '-' 分割 '明细科目' 列,创建新的 '二级科目' 和 '产品内容' 列。然后根据 '总账科目' 的值进行条件处理:如果总账科目是 '主营业务收入',则保留相应的 '二级科目' 和 '产品内容' 值;否则,将 '二级科目' 列置空,而 '产品内容' 则保留 '明细科目' 列的值。
# 创建新的列 '二级科目' 和 '产品内容',根据 '明细科目' 列使用 '-' 分割
sales_data[['二级科目', '产品内容']] = sales_data['___'].___.___('-', 1, ___=___)
# 根据总账科目进行条件处理
# 如果 '总账科目' 是 '主营业务收入',则保留 '二级科目' 列的值,否则置空
sales_data['二级科目'] = ___.___(sales_data['___'] == '___', sales_data['___'], '')
# 如果 '总账科目' 是 '主营业务收入',则保留 '产品内容' 列的值,否则使用 '明细科目' 列的值
sales_data['产品内容'] = ___.___(sales_data['___'] == '___', sales_data['___'], sales_data['___'])
sales_data
重置 运行
(11)首先根据条件修改了 sales_data 数据框中的 '借方金额' 和 '贷方金额' 列的值,然后使用重命名方法将列名 '出库数量' 改为 '销量','贷方金额' 改为 '销售额','借方金额' 改为 '采购额'。
# 根据总账科目进行条件赋值
# 如果 '总账科目' 是 '主营业务收入',则将 '借方金额' 列的值设为 0,否则保留原值
sales_data['借方金额'] = ___.___(sales_data['___'] == '___', 0, sales_data['___'])
# 如果 '总账科目' 是 '库存商品',则将 '贷方金额' 列的值设为 0,否则保留原值
sales_data['贷方金额'] = ___.___(sales_data['___'] == '___', 0, sales_data['___'])
# 对列名进行重命名
sales_data = sales_data.___(___={'___':'销量','贷方金额':'___','___':'采购额'})
sales_data
重置 运行
(12)从 sales_data 数据框中重新选择特定列,并按照指定顺序重新排列列的顺序。选择的列包括 '年', '月', '日', '产品内容', '入库数量', '采购额', '销售额', '销量'。
# 重新选择并排序 sales_data 数据框中的列
sales_data = ___[['年', '月', '日','___','入库数量','采购额','___','销量']]
sales_data
重置 运行
(13)对 sales_data 数据框按照指定的列进行分组,并对其他列进行求和计算,然后根据条件过滤和重置索引。
# 按照 '日' 和 '产品内容' 列进行分组,对 '入库数量', '采购额', '销量', '销售额' 列进行求和计算
sales_data = sales_data.___([ '日','___'])[['入库数量','___','销量','销售额']].___()
# 过滤掉所有列求和为零的行
sales_data = sales_data[sales_data.___(___=___)!=0]
# 重置索引
sales_data = sales_data.___()
sales_data
重置 运行
(14)使用循环和条件筛选来处理每日的销售和库存数据,并根据实际业务逻辑计算库存量和库存金额。
# 初始化库存数量和每单位价格字典
initial_inventory = {row['明细账科目']: row['期初数量'] for _, row in kc_data.iterrows()}
unit_prices = {row['明细账科目']: row['月末一次加权平均单价'] for _, row in kc_data.iterrows()}
# 创建一个字典来存储每种产品的每日库存
daily_inventory = {product: [] for product in initial_inventory.keys()}
# 计算每日库存数量和库存金额
___ day ___ range(1, 32): # 假设每个月有31天,可以根据实际情况调整范围
___ product ___ initial_inventory.keys():
# 获取当天的销售数据
daily_sales = sales_data[(sales_data['日'] == day) & (sales_data['产品内容'] == product)]
# 更新库存数量
for _, sale in daily_sales.iterrows():
initial_inventory[product] += sale['入库数量'] - sale['销量']
# 计算库存金额
inventory_value = initial_inventory[product] * unit_prices[product]
# 将每日库存情况添加到字典中
daily_inventory[product].___({
'日': day,
'库存数量': initial_inventory[product],
'库存金额': inventory_value
})
# 将字典转换为DataFrame
result = []
___ product, records ___ daily_inventory.items():
___ record ___ records:
result.append({
'日': record['日'],
'产品内容': product,
'库存数量': record['库存数量'],
'库存金额': record['库存金额']
})
inventory_df = pd.DataFrame(result)
inventory_df
重置 运行
(15)对 inventory_df 数据框中的 '产品内容' 列进行操作,通过 '-' 分割该列的值,并将分割后的第一部分(产品大类)和第二部分(产品明细)分别分配给新的列 '产品大类' 和 '产品明细'。
inventory_df[['产品大类','产品明细']] = inventory_df['___'].___.___('-',1,___=___)
inventory_df
重置 运行
(16)根据 inventory_df 数据框中的数据生成一个透视表,将每日的产品大类与库存金额进行汇总统计。
daily_data = ___.___(inventory_df,___='日',___='产品大类',___='库存金额',___='sum')
daily_data
重置 运行
(17)绘制堆积条形图,展示每日不同产品大类的库存金额结构。
import matplotlib.pyplot as plt
# 设置中文字体
plt.rcParams['font.family'] = 'kaiTi' # 用楷体显示中文
# 绘制堆积图
ax = ___.plot(___='___', stacked=True, figsize=(10, 5), colormap='viridis')
# 设置图表标题和标签
ax.___('每日库存金额结构堆积图', fontsize=16)
ax.set_xlabel('日', fontsize=14)
ax.set_ylabel('库存金额', fontsize=14)
plt.xticks(rotation=0)# 设置 x 轴刻度标签不旋转
# 显示图例
___.___(title='产品大类', title_fontsize='13', fontsize='11')
# 显示图表
___.___()
重置 运行
(18)筛选出日期为31日的库存数据,并针对每种产品明细统计总库存金额和库存数量,然后绘制两个水平条形图子图展示前十名产品明细。
# 筛选出日期为31日的数据
inventory_31 = inventory_df[___['日'] == 31]
# 统计每种产品的总库存金额和库存数量
total_inventory = inventory_31.groupby('产品明细').agg({
'库存数量': '___',
'库存金额': '___'
}).reset_index()
# 排序并获取前十名,按降序排列
top_10_amount = total_inventory.nlargest(10, '库存金额').___(by='库存金额', ascending=True)
top_10_quantity = total_inventory.nlargest(10, '库存数量').___(by='库存数量', ascending=True)
# 提取产品明细和数值
top_10_amount_names = top_10_amount['产品明细']
top_10_amount_values = top_10_amount['库存金额']
top_10_quantity_names = top_10_quantity['产品明细']
top_10_quantity_values = top_10_quantity['库存数量']
# 绘制两个水平条形图子图
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(14, 5))
# 绘制库存金额前十名水平条形图
axes[0].___(___, ___, color='skyblue')
axes[0].set_xlabel('库存金额', fontsize=12)
axes[0].set_title('库存金额前十名产品明细 (日期为31日)', fontsize=14)
# 绘制库存数量前十名水平条形图
axes[1].___(___, ___, color='lightgreen')
axes[1].set_xlabel('库存数量', fontsize=12)
axes[1].set_title('库存数量前十名产品明细 (日期为31日)', fontsize=14)
# 显示图表
___.___()
重置 运行
上一题
下一题
最新发布