今天要正式來實踐資料清理,資料源是台中市政府資料開放平台的公有零售市場每日蔬果價格填報
連結在這
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
data = pd.read_csv("./GOLD_109.csv")
print(data)
非常混亂,一看就知道不清理會很難做事
訪價日期 市場名稱 絲瓜 花胡瓜 結球白菜 蘿蔔 胡蘿蔔 青蔥 胡瓜 青江白菜 空心菜 甘藍 香蕉 番石榴_珍珠 鳳梨_開英 荔枝_黑葉 火龍果_紅肉 芒果_愛文 木瓜 文旦 新世紀梨 檸檬 ... 花椰菜 洋蔥 大蒜 吳郭魚 虱目魚 金目鱸 龍虎班 午仔魚 白蝦 文蛤 里肌肉 後腿肉 五花肉 牛腱_冷凍牛肉 腿肉_冷凍牛肉 腩肉_冷凍牛肉 雞蛋 鴨蛋 肉雞 土雞 仿雞 鴨_土番鴨
0 21/03/2020 沙鹿市場 25.0 20 25 20 18 50.0 30 25 25 30 0 0 0 0 0 0 0 0 0 0 ... 30 30.0 120 50 100 200 260 200 350 120 160 130 160 220 220 240 30 32 130 140 130 130
1 22/03/2020 第五市場 50.0 0 40 50 30 50.0 40 75 0 0 30 60 0 0 0 0 80 0 0 70 ... 0 0.0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 22/03/2020 大甲第二市場 35.0 38 25 28 28 30.0 30 20 0 20 0 0 0 0 0 0 55 0 0 50 ... 0 0.0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 22/03/2020 南屯市場 45.0 35 15 18 22 45.0 30 15 38 15 40 50 40 0 0 60 100 0 0 60 ... 0 0.0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 22/03/2020 東光市場 40.0 55 28 25 25 50.0 35 35 30 20 35 39 0 0 75 120 39 0 0 50 ... 0 0.0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
... ... ... ... ... ... .. ... ... .. ... ... .. .. ... ... ... ... ... ... .. ... .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. .. ... ... ... ...
2007 04/10/2020 沙鹿市場 25.0 35 22 25 18 110.0 25 18 20 40 0 0 0 0 0 0 0 0 0 0 ... 40 25.0 190 65 130 190 0 165 310 100 135 125 145 0 0 0 33 42 0 130 120 135
2008 05/10/2020 建國市場 30.0 30 25 25 20 40.0 20 20 20 30 15 30 25 0 45 80 30 40 100 25 ... 60 25.0 80 64 96 80 144 190 220 120 120 80 120 180 150 180 33 50 80 72 75 72
2009 05/10/2020 清水第一市場 2.0 50 35 25 25 40.0 30 25 20 25 20 50 0 0 70 0 50 35 0 0 ... 50 25.0 220 55 80 100 0 170 200 90 135 110 125 200 220 250 39 45 90 110 110 90
2010 05/10/2020 沙鹿市場 25.0 35 22 25 18 100.0 25 20 20 40 0 0 0 0 0 0 0 0 0 0 ... 35 25.0 190 65 130 190 0 165 310 100 130 120 140 0 0 0 33 43 0 130 120 135
2011 05/10/2020 中義市場 28.0 55 30 25 30 80.0 35 40 30 45 15 34 0 0 40 65 34 39 0 20 ... 60 35.0 100 4 8 6 10 10 10 9 110 100 125 190 200 200 38 60 120 140 120 110
[2012 rows x 63 columns]
今天分析豐原第一市場的資料就好,這就需要使用到篩選資料的功能了
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
if __name__ == "__main__":
data = pd.read_csv("./GOLD_109.csv")
mask = data["市場名稱"] == "豐原第一市場"
data = data[mask].copy()
訪價日期 市場名稱 絲瓜 花胡瓜 結球白菜 蘿蔔 ... 雞蛋 鴨蛋 肉雞 土雞 仿雞 鴨_土番鴨
27 24/03/2020 豐原第一市場 45.0 60 25 25 ... 38 56 80 100 100 340
40 25/03/2020 豐原第一市場 45.0 60 25 25 ... 38 56 80 100 100 340
52 26/03/2020 豐原第一市場 45.0 60 25 25 ... 38 56 80 100 100 340
63 27/03/2020 豐原第一市場 45.0 60 25 25 ... 38 56 80 100 100 340
77 28/03/2020 豐原第一市場 45.0 60 25 25 ... 38 56 80 100 100 340
... ... ... ... ... ... .. ... .. .. .. ... ... ...
1937 26/09/2020 豐原第一市場 35.0 60 45 40 ... 33 56 80 100 100 80
1949 27/09/2020 豐原第一市場 35.0 60 45 40 ... 33 56 80 100 100 80
1956 28/09/2020 豐原第一市場 35.0 60 45 40 ... 33 56 80 100 100 80
1968 29/09/2020 豐原第一市場 35.0 60 45 40 ... 33 56 80 100 100 80
1979 30/09/2020 豐原第一市場 35.0 60 45 40 ... 33 56 80 100 100 80
[188 rows x 63 columns]
資料量從原本的2012筆縮減為188筆,可以明顯看出索引的部份仍然是原本2012筆時的索引,因此這時候必須重設索引,請記住
時間序列的索引,就是時間
因此這裡要使用一個技巧,先把訪價日期欄位的資料型態轉為時間,再把這欄位設為索引
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
if __name__ == "__main__":
data = pd.read_csv("./GOLD_109.csv")
mask = data["市場名稱"] == "豐原第一市場"
data = data[mask].copy()
#將訪價日期欄位資料型態轉為時間
data["訪價日期"] = pd.to_datetime(data["訪價日期"])
data = data.set_index("訪價日期")
print(data.index.dtype) #datetime64[ns]
接著可以縮小一些資料,我們來挑選市價比較高的品項就好市價太低的直接不納入分析目標,我們就以100為界,平均價格比200高的品項保留,其餘刪除
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
if __name__ == "__main__":
data = pd.read_csv("./GOLD_109.csv")
mask = data["市場名稱"] == "豐原第一市場"
data = data[mask].copy()
data["訪價日期"] = pd.to_datetime(data["訪價日期"])
data = data.set_index("訪價日期")
for i in data.columns[1:]:
if data[i].mean() < 200:
data = data.drop([i], axis = 1)
print(data)
市場名稱 午仔魚 白蝦 腩肉_冷凍牛肉 鴨_土番鴨
訪價日期
2020-03-24 豐原第一市場 380 200 240 340
2020-03-25 豐原第一市場 380 200 240 340
2020-03-26 豐原第一市場 380 200 240 340
2020-03-27 豐原第一市場 380 200 240 340
2020-03-28 豐原第一市場 380 200 240 340
... ... ... ... ... ...
2020-09-26 豐原第一市場 208 192 240 80
2020-09-27 豐原第一市場 208 192 240 80
2020-09-28 豐原第一市場 208 192 240 80
2020-09-29 豐原第一市場 208 192 240 80
2020-09-30 豐原第一市場 208 192 240 80
[188 rows x 5 columns]
異常檢測,一張表要是有異常值的話,分析出來的數值可能也會是異常的,所以一定要去除異常值
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
if __name__ == "__main__":
data = pd.read_csv("./OK.csv")
mask = data["市場名稱"] == "豐原第一市場"
data = data[mask].copy()
data["訪價日期"] = pd.to_datetime(data["訪價日期"])
data = data.set_index("訪價日期")
for i in data.columns[1:]:
if data[i].mean() < 200:
data = data.drop([i], axis = 1)
data.to_csv("./OK.csv")
讀取進來
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
if __name__ == "__main__":
data = pd.read_csv("./OK.csv")
data["訪價日期"] = pd.to_datetime(data["訪價日期"])
data = data.set_index("訪價日期")
print(data)
我們直接看圖
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
if __name__ == "__main__":
data = pd.read_csv("./OK.csv")
data["訪價日期"] = pd.to_datetime(data["訪價日期"])
data = data.set_index("訪價日期")
for i in range(1, data.columns.shape[0]):
plt.subplot(2,2,i)
plt.title(data.columns[i])
plt.plot(data[data.columns[i]])
plt.show()
我們可以好直觀的看出,這張圖有三個主要毛病
首先先解決時間問題
我們發現有些月份日期居然相反了(標紅字),我們觀察這張表,時間大概是3月到9月,我這裡一一去檢查每筆資料,只要在月份的字元不是在03~09,就交換
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
if __name__ == "__main__":
data = pd.read_csv("./OK.csv")
month = ["03", "04", "05", "06", "07", "08", "09"]
for i in range(data.shape[0]):
if data["訪價日期"][i].split("-")[1] not in month:
year = data["訪價日期"][i].split("-")[0]
month = data["訪價日期"][i].split("-")[2]
day = data["訪價日期"][i].split("-")[1]
data["訪價日期"][i] = year + "-" + month + "-" + day
data.to_csv("./OK1.csv", index = 0)
好多了,至少解決了同時間出現多值的情況了