1

我在NYT covid 数据集中乱搞,该数据集每天都有每个县的 covid 病例总数。

我想找出每天的病例差异,所以理论上我可以得到每天的新病例数,而不是总病例数。采用滚动平均值,或使用平均值/总和/等每 2 天重新采样一次都可以正常工作。只是减去这让我很头疼。

试过的方法:

  • df.resample('2d').diff()
    • 'DatetimeIndexResampler' 对象没有属性 'diff'

  • df.resample('1d').agg(np.subtract)
    • ufunc() 缺少 2 个必需的位置参数中的 1 个

  • df.rolling(2).diff()
    • “滚动”对象没有属性“差异”

  • df.rolling('2').agg(np.subtract)
    • ufunc() 缺少 2 个必需的位置参数中的 1 个

样本数据:

pd.DataFrame(data={'state':['Alabama','Alabama','Alabama','Alabama','Alabama'],
               'date':[dt.date(2020,3,13),dt.date(2020,3,14),dt.date(2020,3,15),dt.date(2020,3,16),dt.date(2020,3,17)],
               'covid_cases':[1.2,2.0,2.9,3.6,3.9]
              })

在此处输入图像描述

所需的样本输出:

pd.DataFrame(data={'state':['Alabama','Alabama','Alabama','Alabama','Alabama'],
               'date':[dt.date(2020,3,13),dt.date(2020,3,14),dt.date(2020,3,15),dt.date(2020,3,16),dt.date(2020,3,17)],
               'new_covid_cases':[np.nan,0.8,0.9,0.7,0.3]
              })

在此处输入图像描述

从原始 NYT 数据集重新创建样本数据:

df = pd.read_csv('https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-counties.csv',parse_dates=['date'])
df.groupby(['state','date'])[['cases']].mean().reset_index()

任何帮助将不胜感激!想学习如何手动/通过函数执行此操作,而不是查找“新案例”数据集,因为我将在不久的将来大量使用时间序列。

4

2 回答 2

3

让我们试试这段完整的代码:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-counties.csv')

df['date'] = pd.to_datetime(df['date'])

df_daily_state = df.groupby(['date','state'])['cases'].sum().unstack()

daily_new_cases_AL = df_daily_state.diff()['Alabama']

ax = daily_new_cases_AL.iloc[-30:].plot.bar(title='Last 30 days Alabama New Cases')

输出:

在此处输入图像描述

细节:

  • 使用原始 URL 从 NYTimes github 下载历史案例记录
  • 将“日期”列的数据类型转换为日期时间数据类型
  • Groupby 'date' 和 'state' 列求和 'cases' 并取消堆叠索引的状态级别以获取行的日期和列的状态。
  • 按列取差,仅选择 Alabama 列
  • 绘制过去 30 天
于 2020-08-19T14:22:18.753 回答
2

diff 函数是正确的,但是如果您查看错误消息:

'DatetimeIndexResampler' object has no attribute 'diff'

在您第一次尝试的方法中,这是因为 diff 是一个可用于 DataFrames 的函数,而不是 Resamplers,所以通过指定您希望如何重新采样它来将其转换回 DataFrame。

如果您有每天的 COVID 病例总数并希望将其重新采样为 2 天,您可能只想在两天内保留最新的更新,在这种情况下df.resample('2d').last().diff()应该可以使用类似的方法。

于 2020-08-19T13:54:20.070 回答