• Pandas数据分析28——案例-销售额同期比分析、爬取各国新冠死亡人数等


    参考书目:《深入浅出Pandas:利用Python进行数据处理与分析》


    pandas里面各个模块基本都展示得差不多了,后面就是使用pandas进行数据分析的案例。由于pandas的处理都是向量化操作,会比自己用列表字典写循环来得快。在熟悉了前面的基础操作后,我们后面的案例都是采用高级一点的链式法则的编程思想,即一行代码就可以进行一个项目分析,这样可以保证代码的简介性。链式法则的mode如下:

    1. (
    2. pd.concat(pd.read_csv('data1.csv'), pd.read_csv('data2.csv'))
    3. .fillna(...)
    4. .append(...)
    5. .set_index('...')
    6. .query('some_condition')
    7. .assign(new_column = pd.cut(...))
    8. .eval('...')
    9. .pivot_table(...)
    10. .pipe(fun) # 应用管道方法
    11. .rename(...) # 修改轴名
    12. .loc[lambda x: ...] # 筛选
    13. .mask(df.A>=2,1) # 修改数据
    14. .plot # 绘图
    15. .line(...)
    16. )

    这样相当于一行代码解决了问题,而且没有改变原来的数据,简介方便。


    案例

    下面来介绍一些数据分析小案例

    做销售额同期比分析

    有一组时间序列的销售数据,要比较一下同期的销售额变化,即比较去年11月10日的销售额和今年的11月10日销售额变化,具体代码如下:

    首先构造数据:

    1. df=pd.DataFrame({'日期':pd.date_range('2020-11-5','2020-11-10'),'销售额':np.random.randint(10,100,size=(6,))})
    2. df2=pd.DataFrame({'日期':pd.date_range('2019-11-6','2019-11-10'),'销售额':np.random.randint(10,100,size=(5,))})
    3. df=df.append(df2)
    4. df.set_index('日期',inplace=True)
    5. df=df.sort_index(ascending=False)
    6. df

     使用链式法则,比较同月同日的差值,然后画图

    1. ( df
    2. .groupby([lambda x:x.month,lambda x:x.day])
    3. .apply(lambda x: x.diff(-1))
    4. .loc[lambda x:x.index.year==2020]
    5. .plot()
    6. )

     


    圣诞节(情人节)的星期分布

    计算最近100年的圣诞节分别都是星期几,星期分布。

    #代码实现如下:

    1. (
    2. # 生成100年时间序列
    3. pd.Series(pd.date_range('1920', '2021'))
    4. # 筛选 12月25日 的所有日期
    5. .loc[lambda s: (s.dt.month==12) & (s.dt.day==25)]
    6. .dt.dayofweek # 转为星期数
    7. .add(1) # 由于0代表周一,对序列加1,符合日常认知
    8. .value_counts() # 重复值计数
    9. .sort_values() # 排序,星期从1-7
    10. .plot
    11. .bar() # 绘制柱状图
    12. )

     分布还是很均匀的,星期一到七都有,数量都差不多。上面代码是一行就能搞定。


    试验三天中恰有两天下雨的概率

    这是一个二项分布,可以用排列组合概率论来计算。某一天下雨的概率为0.4,那么三天里有两天下雨的概率是3(C32)*0.4*0.4*0.6=0.28886。使用代码模拟计算这个概率:

    1. rng = np.random.default_rng()
    2. days = 100000
    3. arr = rng.integers(0, 1000, days)
    4. (
    5. pd.DataFrame()
    6. .assign(x=arr)
    7. .astype(str)
    8. .assign(x=lambda d: d.x.str.zfill(3))
    9. .assign(a=lambda d: d.x.str.count(r'1|2|3|4'))
    10. .query('a==2')
    11. )

     a为下雨次数,筛选出a为2的个数,再除以总体个数就是概率

    len(_)/days

     和理论值差不多。


    爬取各国新冠死亡人数

    这个是腾讯的新冠疫情每日数更新的小程序。找这个网站的api,然后获取数据解析提取每个国家的死亡人数。

    1. import requests # 安装 pip install requests
    2. s = requests.Session()
    3. # 访问数据
    4. covid19 = s.get('https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist')
    5. # 数据文本
    6. j_data = covid19.text
    7. # 读取解析JSON
    8. pd.read_json(j_data).data

     

    1. data = [(i['name'],i['dead']) for i in pd.read_json(j_data).data]
    2. df = pd.DataFrame(data, columns=['国家', '死亡人数'])
    3. df

     这算是一个比较简单的爬虫案例了。当然这个api只是2021年各国的死亡人数,想要动态观看每天的感染人数和死亡人数,需要找更好的api接口进行爬取。

  • 相关阅读:
    面试官:去重和幂等的理解掌握多少?
    Rust 构建跨平台 GUI 的新选择
    ubuntu18.04平台上基于xenomai3.2对Linux内核的实时化改造
    图解KMP字符串匹配算法+代码实现
    ES7 Nested Sort Search
    conda虚拟环境总结与解读
    Debian安装Redis、RabbitMQ、Nacos
    三次握手四次挥手过程剖析
    RISC-V公司中电丽声完成融资计划
    腾讯云轻量2核4G5M可容纳多少人访问?
  • 原文地址:https://blog.csdn.net/weixin_46277779/article/details/126383734