#13 资料清理教学

今天要正式来实践资料清理,资料源是台中市政府资料开放平台公有零售市场每日蔬果价格填报
连结在这

载入资料

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)


好多了,至少解决了同时间出现多值的情况了


<<:  Day 13 : 优化 Zettelkasten 卡片盒笔记法,试试Evergreen Note (长青笔记)

>>:  Day 16 生命周期

DAY 27 文章列表

嗨,今天来完成底下文章的部分,金嗨,内容越写越多,因为快要完赛了节奏没抓好XD,前面都是分开解析的,...

Day7-JDK查看正在运行的Java进程工具:jps

前言 在介绍JDK有哪些工具时,第二大列应该是『故障排查、分析、监控和管理工具』,但我想先从监控工具...

Material UI in React [Day 6] Theme (Globals) & Inputs (Buttons)

Globals 这里先提一下 key: overrides,当组件间相互传递的 key: props...

【D19】尝试料理#2:取得所有指数清单

前言 发现无法轻易取得股票资讯,但换个念头,这应该是市场上所有的资料吧,剩下就是要进行筛检。不过今天...

Day2 线性回归(Linear Regression)

线性回归是什麽? 讲人话就是利用以往蒐集的资料建立一个预测未来走势的模型,当输入新的值[自变数(in...