1. 程式人生 > >matplotlib + pandas繪圖

matplotlib + pandas繪圖

利用pandas處理日期資料,並根據日期繪製增長率曲線。

處理的json文字內容如下:

# pd.json

[
{
"name": "A", "date": "註冊於 2011-6-9"}, {"name": "B", "date": "註冊於 2011-6-23"}, {"name": "C", "date": "註冊於 2011-7-2"}, {"name": "D", "date": "註冊於 2011-10-3"}, {"name": "E", "date": "註冊於 2011-8-23"}, {"name": "F", "date": "註冊於 2011-9-2"}, {"name": "
G", "date": "註冊於 2011-10-3"}, {"name": "H", "date": "註冊於 2011-11-23"}, {"name": "I", "date": "註冊於 2011-12-2"}, {"name": "J", "date": "註冊於 2011-12-3"}, {"name": "K", "date": "註冊於 2011-12-23"}, {"name": "L", "date": "註冊於 2011-10-2"}, {"name": "M", "date": "註冊於 2011-8-3"}, {"name": "Y", "date": "註冊於 2011-12-23"}, {
"name": "U", "date": "註冊於 2011-10-9"}, {"name": "W", "date": "註冊於 2011-8-6"}, {"name": "K", "date": "註冊於 2011-12-21"}, {"name": "L", "date": "註冊於 2011-12-5"}, {"name": "M", "date": "註冊於 2011-8-3"}, {"name": "Y", "date": "註冊於 2011-12-23"}, {"name": "U", "date": "註冊於 2011-10-9"}, {"name": "W", "date": "註冊於 2011-12-6
"} ]

1. 讀取json檔案的資料(對於自己構建的json檔案,裡面的鍵值對字串必須是雙引號

dt = pd.read_json('pd.json', orient='records', encoding='utf-8')

順便說一下 orient 引數:不一樣的檔案內容格式,這個引數的值是不一樣的,不然會讀取失敗。

'split' : 索引,列欄位,和資料
如: '{"index": [1, 2, 3], "columns": ["a", "b"], "data": [[1, 4], [2, 5], [3, 6]]}'
'records' : 元素為字典的列表
如: '[{"a": 1}, {"b": 2}, {"c": 3}]'
'index' : 索引為鍵, 值為鍵值對
如: '{"0": {"a": 3, "b": 5}, "1": {"a": 7, "b": 9}}'
'columns' : 索引為鍵,值為鍵值對(注意:輸出的資料行列與'index'的不一樣
如: '{"a": {"2": 3, "4": 5}, "b": {"6": 7, "8": 9}}',結果與index的例子相同
'values' : 兩層的巢狀列表
如: '[["a": 1], ["b": 2]]'

2. 處理日期

# 正則表示式處理
patt = r'(\d{4}-\d{1,2})' # 匹配到月份,也可以匹配到日,再加上 '-\d{1,2}'即可
dt['date'] = dt['date'].str.extract(patt, expand=True)
# 把字串格式轉換為日期格式 dt[
'date'] = pd.to_datetime(dt['date']) # 由於只匹配到月份,to_datetime函式預設日為 01,

此時輸出 dt 為:

0  2011-06-01    A
1  2011-06-01    B
2  2011-07-01    C
.....

3. 新增一列 cnt 來統計相同月份的個數,並按日期排序

dl = dt.groupby(['date'], as_index=False)['date'].agg({'cnt': 'count'}).sort_values(by='date')

4. 插入一列 rise 來計算相鄰月份總數的差

dl.insert(2, 'rise', (dl['cnt']-dl['cnt'].shift(1))/dl['cnt'].shift(1))

shift()函式對資料進行移動操作,dl['cnt'].shift(1) 表示 dl['cnt'] 列的資料向下移動一個單位

計算差值也可以直接使用 diff() 函式:對資料進行某種移動之後與原資料進行比較得出的差異資料, dl['cnt'].diff()

5. matplotlib繪圖

import matplotlib.pyplot as plt

dl.plot(x=dl['date'], y='rise', kind='line', linestyle='-', markerfacecolor='red', marker='o', color='green', figsize=(8, 4), grid=True) plt.show() plt.close()