iT邦幫忙

0

python將相同年的數量與金額加總呈現圖表有錯誤

TABLE有四個欄位 "商品代碼","個數","金額","販售日期"

商品代碼有四種以上,
販售日期有相同天與不同天
※需要呈現的結果:
(1) 銷售日期的時間需要去掉,只保留年,像是"2015"
(2) 商品代碼相同且需要同一年才可以將數量與金額總和
(3) 可以考慮到多個商品代碼

我的測試檔案:
https://drive.google.com/drive/folders/16La3zPzpNH4aLPeOGYza0pxTsGKAEHJl?usp=sharing

提供的內容:
1
輸出的錯誤圖示:
2
目前我想的語法會出現直條圖上出現多筆數值但不是加總數值合併,必需是同商品同1年的數量和金額都加總,
提供我目前我寫的語法:

import pandas as pd
import numpy as np
import warnings
from matplotlib import pyplot as plt
warnings.filterwarnings('ignore')

path = r'C:\Users\feather\Desktop'
df =pd.read_excel(path +'\COM_D.xlsx', encoding='ansi', header=0)
print(df.head())
df.info()

df["year"]=df["販售日期"].dt.year

def toDate(val):
    return val.date()
df["販售日期"]=df["販售日期"].apply(toDate)
df.sort_values(['year'],ascending=True)
result=df.groupby(['year','金額'])
print(result.sum)
df.reset_index(inplace=True)

from matplotlib.font_manager import FontProperties
myfont = FontProperties(fname=r"D:\Anaconda3\Lib\site-packages\matplotlib\mpl-data\fonts\ttf\kaiu.ttf", size=30)

plt.figure(figsize=(8,6))
bar1 = plt.bar(df['year'],df['金額'], width = 0.5, alpha = 0.2, color = 'r') 
plt.title("每年出售總金額", FontProperties=myfont, size=10)     
plt.xticks(df['year'], FontProperties=myfont, size=10)      
plt.xlabel('每年year')       
plt.ylabel('金額dollar')  
plt.legend()    
for rect in bar1:
    height = rect.get_height()  #bar1的高度
    plt.text(rect.get_x() + rect.get_width() / 2, height+3, str(height), ha="center", va="bottom")

真正需要的結果(數值+圖示表示)
3

請問如何改善查詢結果的方式
謝謝

slime iT邦大師 1 級 ‧ 2019-10-08 09:39:14 檢舉
金額是單價還是總額?

如果是 SQL , 比較重要的概念是, 先把 raw data 依特性產生 group , 再對 group 內明細加總, 產生 group 的小計, 再顯示 group 特性與小計.

例如: (非完整寫法)
select 商品代碼,year(販售日期),sum(個數),sum(金額)
group by 商品代碼,year(販售日期)

這樣分組後, 再計算 sum

1 個回答

1
張小馬~
iT邦新手 3 級 ‧ 2019-10-08 09:52:55

接續在你這串後面:

def toDate(val):
    return val.date()
df["販售日期"]=df["販售日期"].apply(toDate)

到上面為止長這樣~
https://ithelp.ithome.com.tw/upload/images/20191008/20111566BYNJsaUUhy.png

加上這些語法:

# 把要agg的內容寫出來
f = {'個數':['sum'], '金額':['sum']}
# 寫groupby
df = df.groupby(['商品代碼','year'],as_index=False).agg(f)
# 排序
df.sort_values(['商品代碼','year'])
# 改欄位名稱
df.columns = ['商品代碼','銷售年份','各年個數','各年金額']
# 叫出來看看
df

就可以長這樣~
https://ithelp.ithome.com.tw/upload/images/20191008/20111566dBOBFeEOQ8.png

我要發表回答

立即登入回答