iT邦幫忙

2021 iThome 鐵人賽

DAY 13
1

今天要正式來實踐資料清理,資料源是台中市政府資料開放平台公有零售市場每日蔬果價格填報
連結在這

載入資料

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)


好多了,至少解決了同時間出現多值的情況了


上一篇
#12 matplotlab教學
下一篇
#14 補值教學
系列文
終極大數據地獄24
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言