我希望能够计算菲律宾各城市Covid-19病例的增长率。我使用的是卫生部的公共病例数据集,其中包含病例ID、病例被确认的日期、病例所在的城市等信息。
我试着使用groupby方法将数据分成城市和日期,计算每天的病例,计算这些计数的累积总和,每天的百分比变化,最后计算过去14天的百分比变化的平均值。
我能够做到这些,但我想不通的是,如何再将它们组合成一个包含城市及其过去14天平均增长率的数据集。
这是我目前的情况。
import pandas as pd
cases_df = pd.read_csv('https://storage.googleapis.com/doh_datadrops/DOH%20Data%20Drop%2020200518.csv',
parse_dates=[5,6,7,9,17])
#cast data to appropriate types for easy handling
for col in ['AgeGroup', 'Sex','RemovalType', 'Admitted', 'RegionRes','ProvRes','CityMunRes',
'CityMuniPSGC','HealthStatus','Quarantined','Pregnanttab']:
cases_df[col] = cases_df[col].astype('category')
for col in ['DateRepConf', 'DateDied', 'DateRecover', 'DateRepRem','DateOnset']:
cases_df[col] = cases_df[col].astype('datetime64')
cases_df.Age = cases_df.Age.astype('Int64')
list_cases_by_city_by_date = cases_df.groupby(['CityMunRes','DateRepConf'])['CaseCode'].count().cumsum().pct_change()
最后一个groupby产生了一个多索引列表。
CityMunRes DateRepConf
ABUCAY 2020-01-30 NaN
2020-02-03 NaN
2020-02-05 NaN
2020-03-06 NaN
2020-03-07 NaN
...
ZARRAGA 2020-05-14 0.0
2020-05-15 0.0
2020-05-16 0.0
2020-05-17 0.0
2020-05-18 0.0
Name: CaseCode, Length: 28336, dtype: float64
现在我可以用下面的代码来计算过去14天的增长率 如果我指定了城市。
list_cases_by_city_by_date.loc['ABUCAY'].tail(14).mean()
0.03571428571428571
但我想要的是一个简单的数据框架,以 "CityMunRes "和 "Ave_Growth "为列,看起来像这样。
| | City | Ave_Growth |
|---|--------|------------|
| 0 | ABUCAY | 0.03 |
| 1 | Bxxxx | 0.02 |
| 2 | Cxxxx | 0.50 |
| | ... | |
| n | Zxxx | 0.2 |
但我遇到了一个初学者的问题。我相信解决方案很简单:)
请帮助我。
谢谢你的帮助。
编辑。 更好的解决方案。
list_cases_by_city_by_date.groupby(level=0).apply(lambda x: x.tail(14).mean())
这样如何? 你用你的那段代码给每个人做一个字典,然后把它们都扔到一个数据框架里。
d = {city: list_cases_by_city_by_date.loc[city].tail(14).mean()
for city in list_cases_by_city_by_date.index.get_level_values('CityMunRes')}
pd.DataFrame(data=d.values(), index=d.keys(), columns=['mean'])
编辑: 顺便说一下,当我尝试运行你提供的代码时,我得到的是 0.75
,不 0.03571428571428571
当我运行
list_cases_by_city_by_date.loc['ABUCAY'].tail(14).mean()