抓取熊猫列Python的方法

时间:2020-03-30 19:57:26

标签: python pandas numpy oop

我正在尝试学习OOP,并希望转换一些我拥有的代码。

我的代码:

import pandas as pd
from matplotlib import pyplot as plt
import numpy as np

# assign previous day to variable, then group and sum
prev_day = pd.read_csv('C:/Users/Name/PycharmProjects/Corona Stats/TimeSeries/03-28-2020.csv')
prev_day = prev_day.replace(np.nan, 'Other', regex=True)
prev_day = prev_day.groupby(['Country_Region']).sum()
prev_day = prev_day.reset_index()

# assign current day to variable, removed unwanted columns, then group and sum
stats_reader = pd.read_csv('C:/Users/Name/PycharmProjects/Corona Stats/TimeSeries/03-29-2020.csv')
stats_reader = stats_reader.replace(np.nan, 'Other', regex=True)
stats_clean = stats_reader.drop(['FIPS', 'Last_Update', 'Lat', 'Long_'], axis=1)
stats_clean = stats_clean.rename(columns={
    'Admin2': 'County', 'Province_State': 'State', 'Country_Region': 'Country', 'Combined_Key': 'City'})
stats_clean = stats_clean.groupby(['Country']).sum()
stats_clean = stats_clean.reset_index()

# add in new columns to show difference between days
stats_clean['New Cases'] = stats_clean['Confirmed'] - prev_day['Confirmed']
stats_clean['New Deaths'] = stats_clean['Deaths'] - prev_day['Deaths']
stats_clean['New Recovered'] = stats_clean['Recovered'] - prev_day['Recovered']
stats_clean = stats_clean[[
    'Country', 'Confirmed', 'New Cases',
    'Deaths', 'New Deaths', 'Recovered', 'New Recovered', 'Active']]
stats_clean = stats_clean.replace(np.nan, 0, regex=True)

# calculate for global cases from previous day
prev_sum = prev_day.sum()
prev_sum['Country'] = 'World'
prev_sum = prev_sum[['Country', 'Confirmed', 'Deaths', 'Recovered']]
prev_sum = prev_sum.replace(np.nan, 0, regex=True)

# calculate for global cases for current day
sum_stats = stats_clean.sum()
sum_stats['Country'] = 'World'
sum_stats['New Cases'] = sum_stats['Confirmed'] - prev_sum['Confirmed']
sum_stats = sum_stats.replace(np.nan, 0, regex=True)
sum_stats = sum_stats[[
    'Country', 'Confirmed', 'New Cases', 'Deaths', 'New Deaths', 'Recovered', 'New Recovered', 'Active']]

我的第一次尝试:

class Corona:
    def __init__(self):
        pass

    def country_sum(self, country):
        country = stats_clean['Country'].isin([country])
        print(country)


Corona.country(US)

如果我将此方法设为静态方法,它将运行,但是我没有在country_sum中使用该参数。我想过滤任何通过的国家。 我不知道如何在方法中使用参数来过滤列中的值。

对原始csv文件中的行进行采样:

FIPS,Admin2,Province_State,Country_Region,Last_Update,Lat,Long_,Confirmed,Deaths,Recovered,Active,Combined_Key
45001,Abbeville,South Carolina,US,2020-03-29 23:08:25,34.22333378,-82.46170658,3,0,0,0,"Abbeville, South Carolina, US"
22001,Acadia,Louisiana,US,2020-03-29 23:08:25,30.295064899999996,-92.41419698,9,1,0,0,"Acadia, Louisiana, US"
51001,Accomack,Virginia,US,2020-03-29 23:08:25,37.76707161,-75.63234615,3,0,0,0,"Accomack, Virginia, US"
16001,Ada,Idaho,US,2020-03-29 23:08:25,43.4526575,-116.24155159999998,92,1,0,0,"Ada, Idaho, US"
19001,Adair,Iowa,US,2020-03-29 23:08:25,41.33075609,-94.47105874,1,0,0,0,"Adair, Iowa, US"

1 个答案:

答案 0 :(得分:1)

如果我没记错的话,则不应在类外的其他地方执行所有计算,然后再访问变量,例如stats_clean在全局范围内定义。

您应该这样做:

class Corona:
    root_dir = "<path-to-your-data-dir>"
    def __init__(self, date):
        self.file = os.path.join(self.root_dir, str(date) + ".csv") # use glob or something if you want to process multiple files etc.
        self._calculate_stats()

    def _calculate_stats(self):
        <do all your reading dataset and calculations here> 
        <....>
        self.stats_clean = ...
        self.prev_sum = ...

    def country_sum(self, country = 'US'):
        return self.stats_clean['Country'].isin([country])

然后您可以简单地做到:

corona = Corona('03-29-2020')
print(corona.country_sum(<your-country>))

这只是一种实现方式。