大家好,这里是七七,今天来介绍的是数据整理代码
但由于是数据整理代码,因此会有些浅显,看不懂需要解释的地方会很少,重点是处理数据的方法。
代码1
sale_sum=sale_sum.sort_values("销量(千克)",ascending=False)
这行代码将会对上一个命令生成的"sale_sum"变量按照"销量(千克)"这一列进行降序排列。其中,"sort_values"方法用于对数据表按照指定的列进行排序,"ascending=False"表示使用降序排列。
代码2
result_df=pd.concat( [result_df, pd.DataFrame({'单品编码':[group_name], '最大销量':[max_sale], '最小销量':[min_sale], '平均销量':[mean_sale],})], ignore_index=True)
- `pd.concat()` 是 Pandas 中的一个函数,用于将多个数据对象(如 DataFrame 或 Series)进行连接。
- `[result_df, pd.DataFrame({...})]` 是要连接的数据对象,其中 `result_df` 是已有的 DataFrame,`pd.DataFrame({...})` 则是将要添加到 `result_df` 中的新数据。这里用一个列表 `[result_df, pd.DataFrame({...})]` 将两个数据对象传递给了 `pd.concat()`。
- `pd.DataFrame({...})` 中的大括号 {...} 是一个包含新数据的字典。这个字典中键是要添加到 `result_df` 中的新列名,例如 '单品编码'、'最大销量'、'最小销量' 和 '平均销量',值则是相应的数据。
- `ignore_index=True` 表示连接后的 DataFrame 中的行索引将被重置为从零开始,忽略原来的索引。
代码的操作是将一个字典中的四个统计指标 ('单品编码'、'最大销量'、'最小销量'、'平均销量') 构造 DataFrame,并将其与原 DataFrame `result_df` 进行连接,然后将结果重新赋值给 `result_df` 变量。
这个操作可以用来汇总某些数据中的统计结果(如对于某一组数据,其最大、最小和平均值),将其添加到已有的 DataFrame 中,并将多组统计结果合并成一个大的 DataFrame。
pd.concat()
是 Pandas 库中的一个函数,用于将多个数据对象按照指定的轴进行连接。具体用法如下:
pd.concat(objs, axis=0, join='outer', ignore_index=False)
参数说明:
objs:一个包含需要连接的数据对象(DataFrame、Series)的列表或字典。
axis:指定连接的轴,0 表示按行连接,1 表示按列连接。
join:指定连接方式,‘outer’ 表示并集连接,‘inner’ 表示交集连接。
ignore_index:如果为 True,则重置连接后的索引。
pd.concat() 函数返回连接后的结果,可以将其赋值给一个变量进行后续处理。
使用 pd.concat() 函数可以将多个数据对象连接起来,可以是行连接(按照纵向方向堆叠)或列连接(按照横向方向拼接)。连接操作可用于合并多个数据集,扩展数据集的行数或列数,并灵活地控制连接方式等参数。
总代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.preprocessing import StandardScaler plt.rcParams['font.sans-serif'] = [u'simHei'] plt.rcParams['axes.unicode_minus'] = False sale_data=pd.read_excel("./data/附件2.xlsx") sale_data["销售日期"]=pd.to_datetime(sale_data["销售日期"]) sale_data=sale_data[["销售日期","单品编码","销量(千克)","销售单价(元/千克)"]] sale_data=sale_data[sale_data["销售日期"]>="2023-6-24"] sale_sum=sale_data[["单品编码","销量(千克)"]].groupby("单品编码").sum() sale_sum=sale_sum.sort_values("销量(千克)",ascending=False) buy_data=pd.read_excel("./data/附件3.xlsx") buy_data["日期"]=pd.to_datetime(buy_data["日期"]) buy_data=buy_data[buy_data["日期"]>="2023-6-24"] buy_data=buy_data[["单品编码","批发价格(元/千克)"]].groupby("单品编码").count() buy_data["单品编码"]=buy_data.index buy_data=buy_data[["单品编码"]] buy_data.index=range(1,len(buy_data)+1) data=buy_data.merge(sale_sum,on='单品编码',how="left") data.dropna(inplace=True) data=data.sort_values("销量(千克)",ascending=False) data.index=range(1,len(data)+1) data=data[data["销量(千克)"]>=2.5] base_info=pd.read_excel("./data/附件1.xlsx")[["单品编码","分类名称","单品名称"]] data=data.merge(base_info,on="单品编码",how="left") sale_data["总售价"]=sale_data["销量(千克)"]*sale_data["销售单价(元/千克)"] sale_money=sale_data[["单品编码","总售价"]].groupby("单品编码").sum() sale_num=sale_data.groupby("单品编码").count().iloc[:,1] sale_num.name="单数" data=data.merge(sale_money,on="单品编码",how="left") data["平均单价"]=data["总售价"]/data["销量(千克)"] data=data.merge(sale_num,on="单品编码",how="left") ################################## #VIKOR法 #对'Feature2'列进行标准化 data['Feature1']=StandardScaler().fit_transform(data[['销量(千克)']]) data['Feature2']=StandardScaler().fit_transform(data[['单数']]) data['F1']=(max(data['Feature1'])-data['Feature1'])/(max(data['Feature1'])-min(data['Feature1'])) data['F2']=(max(data['Feature2'])-data['Feature2'])/(max(data['Feature2'])-min(data['Feature2'])) data['S']=data['F1']+data['F2'] data['R']=np.maximum(data['F1'],data['F2']) v=0.5 data['Q']=(v*data['S']-max(data['S'])/(min(data['S'])-max(data['S'])))+((1-v)*(data['R']-max(data['R'])/(min(data['R'])-max(data['R'])))) data=data.drop(['Feature1','Feature2','F1','F2','S','R'],axis=1) data=data.sort_values("Q",ascending=True) data['Q']=(max(data['Q'])-data['Q'])/(max(data['Q'])-min(data['Q'])) buy_data=pd.read_excel("./data/附件3.xlsx") buy_data["日期"]=pd.to_datetime(buy_data["日期"]) buy_data=buy_data[buy_data["日期"]>="2023-6-24"] buy_data=buy_data[['批发价格(元/千克)','单品编码']].groupby("单品编码").mean() data=data.merge(buy_data,on="单品编码",how="left") print(sale_data) grouped=sale_data.groupby("单品编码") result_df=pd.DataFrame(columns=['单品编码','最大销量','最小销量','平均销量']) for group_name,group_data in grouped: max_sale=group_data.groupby("销售日期").sum()["销量(千克)"].max() min_sale = group_data.groupby("销售日期").sum()["销量(千克)"].min() mean_sale = group_data.groupby("销售日期").sum()["销量(千克)"].mean() result_df=pd.concat( [result_df, pd.DataFrame({'单品编码':[group_name], '最大销量':[max_sale], '最小销量':[min_sale], '平均销量':[mean_sale],})], ignore_index=True) data=data.merge(result_df,on="单品编码",how="left") loss_data=pd.read_excel("./data/附件4.xlsx") data=data.merge(loss_data,on="单品编码",how="left") data["损耗率(%)"]=data["损耗率(%)"]/100 ####################################### #平均销量修正 data["平均销量"]=data["平均销量"]/(1-data["损耗率(%)"]) print(data) data.to_csv("./q3.csv")