首页 > 解决方案 > Python:移动时间序列,使它们都匹配给定的 y 值

问题描述

我正在编写自己的代码来分析/可视化来自欧洲 CDC 的 COVID-19 数据。 https://opendata.ecdc.europa.eu/covid19/casedistribution/csv '

我有一个简单的代码来提取数据并绘制累积死亡随时间变化的图,并且正在尝试添加功能。

我的目标类似于附图,所有国家/地区的时间都转移到匹配(在这种情况下是第 5 次死亡)我想制作一个通用的代码来转移国家/地区以匹配第 n 次死亡。 https://ourworldindata.org/grapher/covid-confirmed-deaths-since-5th-death

我正在尝试这样做的当前方法是使用“如果组是'国家'转移......”术语的迷宫。

其中 ... 是查找特定“国家”的日期,当有“n”个死亡时,并在适当的情况下插入小数日期。

即目前死亡被指定为 00:00 天/月,但数据可以每天移动 2/3,如下所示。

日期时间累计死亡
00:00 15/02 80 00:00 16/02 110

我的 '...' 应该给 16:00 15/02

我现在正在研究这个,但感觉效率不高,我敢肯定一定有一种我没有看到的更简单的方法。

本质上,尽管进行了大量的谷歌搜索,但我似乎无法找到一种简单的方法来自动移动一堆时间序列以匹配特定的 y 值,这感觉它应该具有一些内置功能,即带有插值的查找。

####Live url (I've downloaded my own csv and been calling that for code development)
url = 'https://opendata.ecdc.europa.eu/covid19/casedistribution/csv'

dataraw = pd.read_csv(url)

#extract relevanty colums
data = dataraw.loc[:,["dateRep","countriesAndTerritories","deaths"]]

####convert date format
data['dateRep'] = pd.to_datetime(data['dateRep'],dayfirst=True)

####sort by date
data = data.sort_values(["dateRep"],ascending=True)

data['cumdeaths'] = data.groupby(['countriesAndTerritories']).cumsum()




##### limit to countries with cumulative deaths > 500

data = data.groupby('countriesAndTerritories').filter(lambda x:x['cumdeaths'].max() >500)

###### remove China from data for now as it doesn't match so well with dates
data = data.groupby('countriesAndTerritories').filter(lambda x:(x['countriesAndTerritories'] != "China").any())

##### only recent dates
data = data[data['dateRep'] > '2020-03-01']

print(data)

标签: pythonpandas

解决方案


您可以使用pd.transformgroupby('country')函数来添加一列,该列将设置每一行的日期为该国第 n 次死亡的日期。

然后您可以对日期列和新列进行矢量化减法以获得天数。


推荐阅读