zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    Elasticsearch学习,请先看这一篇!
    加解密/数字签名/证书 原理
    C# 给对象赋null值会释放内存吗?
    打包常见问题
    友盟推送
    谈一谈可能用到数据持久化的地方
    浅谈设置字体大小
    AFN和SDWebImage请求网络图片的一点问题
    linux学习(1)——这是一个新的开始,加油吧少年
    C指针——简单总结
  • 原文地址:https://www.cnblogs.com/delav/p/10078022.html
Copyright © 2011-2022 走看看