问题描述
我在NYT covid dataset那里乱搞,每天都有每个县的合案情况。
我想找出每天之间案件的差异,因此从理论上讲,我可以获得每天新案件的数量而不是总案件数。取滚动平均值,或使用平均值/总和/等每两天进行一次重新采样就可以了。只是减去就让我头疼。
尝试过的方法:
-
@DirtiesContext
-
“ DatetimeIndexResampler”对象没有属性“ diff”
-
-
df.resample('2d').diff()
-
ufunc()缺少2个必需的位置参数中的1个
-
-
df.resample('1d').agg(np.subtract)
-
“滚动”对象没有属性“ diff”
-
-
df.rolling(2).diff()
-
ufunc()缺少2个必需的位置参数中的1个
-
样本数据:
df.rolling('2').agg(np.subtract)
所需的示例输出:
pd.DataFrame(data={'state':['Alabama','Alabama','Alabama'],'date':[dt.date(2020,3,13),dt.date(2020,14),15),16),17)],'covid_cases':[1.2,2.0,2.9,3.6,3.9]
})
从原始NYT数据集重新创建示例数据:
pd.DataFrame(data={'state':['Alabama','new_covid_cases':[np.nan,0.8,0.9,0.7,0.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')
输出:
详细信息:
- 使用以下命令从NYTimes github下载历史案例记录 原始网址
- 将“日期”列的dtype转换为datetime dtype
- Groupby的“日期”和“状态”列对“案例”求和,并堆叠状态 索引级别,以获取行的日期和列的状态。
- 按列进行差异,仅选择阿拉巴马州列
- 绘制最近30天
diff功能正确,但是如果您查看错误消息:
'DatetimeIndexResampler' object has no attribute 'diff'
在您的第一个尝试方法中,这是因为diff是适用于DataFrames的功能,而不适用于Resamplers,因此请通过指定要如何对其重采样将其转换回DataFrame。
如果您每天都有COVID案件的总数,并且希望将其重新采样到2天,则您可能只希望保留两天内的最新更新,在这种情况下,应该使用df.resample('2d').last().diff()
之类的东西工作。