是否有函数可以获取 pandas 数据帧时间序列上两个值之间的差异?
Is there a function to get the difference between two values on a pandas dataframe timeseries?
我在 NYT covid dataset 上闲逛,每个县每天都有新冠病例总数。
我想找出每天病例数的差异,所以理论上我可以获得每天的新病例数而不是总病例数。采用滚动平均值,或使用 mean/sum/etc 每 2 天重新采样一次都可以。光是减法就让我很头疼。
尝试过的方法:
df.resample('2d').diff()
-
'DatetimeIndexResampler' object has no attribute 'diff'
df.resample('1d').agg(np.subtract)
-
ufunc() missing 1 of 2required positional argument(s)
df.rolling(2).diff()
-
'Rolling' object has no attribute 'diff'
df.rolling('2').agg(np.subtract)
-
ufunc() missing 1 of 2required positional argument(s)
示例数据:
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()
如有任何帮助,我们将不胜感激!想学习如何执行此 manually/via 功能,而不是寻找“新案例”数据集,因为我将在不久的将来大量使用时间序列。
diff 函数是正确的,但是如果您查看您的错误信息:
'DatetimeIndexResampler' object has no attribute 'diff'
在您第一次尝试的方法中,这是因为 diff 是一个可用于 DataFrames 而不是 Resamplers 的函数,因此请通过指定您希望如何对其进行重采样将其变回 DataFrame。
如果您有每天的 COVID 病例总数并想将其重新采样到 2 天,您可能只想保留这两天的最新更新,在这种情况下,例如 df.resample('2d').last().diff()
应该可以。
让我们试试这段完整的代码:
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 下载历史案例记录
原始 URL
- 将 'date' 列的数据类型转换为日期时间数据类型
- Groupby 'date' 和 'state' 列求和 'cases' 并拆开状态
索引的级别以获取行的日期和列的状态。
- 按列取差 select 仅阿拉巴马州列
- 绘制过去 30 天
我在 NYT covid dataset 上闲逛,每个县每天都有新冠病例总数。
我想找出每天病例数的差异,所以理论上我可以获得每天的新病例数而不是总病例数。采用滚动平均值,或使用 mean/sum/etc 每 2 天重新采样一次都可以。光是减法就让我很头疼。
尝试过的方法:
df.resample('2d').diff()
-
'DatetimeIndexResampler' object has no attribute 'diff'
-
df.resample('1d').agg(np.subtract)
-
ufunc() missing 1 of 2required positional argument(s)
-
df.rolling(2).diff()
-
'Rolling' object has no attribute 'diff'
-
df.rolling('2').agg(np.subtract)
-
ufunc() missing 1 of 2required positional argument(s)
-
示例数据:
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()
如有任何帮助,我们将不胜感激!想学习如何执行此 manually/via 功能,而不是寻找“新案例”数据集,因为我将在不久的将来大量使用时间序列。
diff 函数是正确的,但是如果您查看您的错误信息:
'DatetimeIndexResampler' object has no attribute 'diff'
在您第一次尝试的方法中,这是因为 diff 是一个可用于 DataFrames 而不是 Resamplers 的函数,因此请通过指定您希望如何对其进行重采样将其变回 DataFrame。
如果您有每天的 COVID 病例总数并想将其重新采样到 2 天,您可能只想保留这两天的最新更新,在这种情况下,例如 df.resample('2d').last().diff()
应该可以。
让我们试试这段完整的代码:
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 下载历史案例记录 原始 URL
- 将 'date' 列的数据类型转换为日期时间数据类型
- Groupby 'date' 和 'state' 列求和 'cases' 并拆开状态 索引的级别以获取行的日期和列的状态。
- 按列取差 select 仅阿拉巴马州列
- 绘制过去 30 天