Как найти минимальную разницу в населении от года к году? Я нашел максимальную разницу, но не могу сделать минимум - PullRequest
0 голосов
/ 08 марта 2020

У меня есть список кортежей, содержащих год и соответствующее население в середине года, как показано ниже:

MIDYEAR_POPULATION = [(1971, 21962032), (1972, 22218463), (1973, 22491777), (1974, 22807969), (1975, 23143275), 
                      (1976, 23449808), (1977, 23725843), (1978, 23963203), (1979, 24201544), (1980, 24515667),
                      (1981, 24819915), (1982, 25116942), (1983, 25366451), (1984, 25607053), (1985, 25842116),
                      (1986, 26100278), (1987, 26446601), (1988, 26791747), (1989, 27276781), (1990, 27691138),
                      (1991, 28037420), (1992, 28371264), (1993, 28684764), (1994, 29000663), (1995, 29302311),
                      (1996, 29610218), (1997, 29905948), (1998, 30155173), (1999, 30401286), (2000, 30685730),
                      (2001, 31020596), (2002, 31358418), (2003, 31641630), (2004, 31938004), (2005, 32242364),
                      (2006, 32570505), (2007, 32887928), (2008, 33245773), (2009, 33628571), (2010, 34005274), 
                      (2011, 34342780), (2012, 34750545), (2013, 35152370), (2014, 35535348), (2015, 35832513), 
                      (2016, 36264604), (2017, 36708083), (2018, 37057765), (2019, 37589262)]

Ниже моего кода для нахождения минимума:

pop_stats = MIDYEAR_POPULATION
def smallest_increase(pop_stats):
    min_diff = 0
    min_elem = -1
    for (year, population) in zip(MIDYEAR_POPULATION, MIDYEAR_POPULATION[1:]) :
        diff = abs(population[1]-year[1])
        if diff > min_diff :
            min_diff = diff
            min_elem = population
print(min_elem)

Однако это возвращает максимальную разницу, и я хочу найти минимальную разницу из года в год, а затем вернуть ее как (the year, the actual value of the min difference).

Ответы [ 2 ]

0 голосов
/ 08 марта 2020

Если вы не хотите использовать тяжелую библиотеку, такую ​​как pandas, вы можете сделать следующее:

def smallest_increase(pop_stats):
    diffs = [(y1, abs(p2 - p1)) for ((y1, p1), (y2, p2)) in zip(pop_stats, pop_stats[1:])]
    return min(diffs, key = lambda year_pop : year_pop[1])

print (smallest_increase(MIDYEAR_POPULATION))

Объяснение: diffs - это список кортежей, содержащий год и разница в населении между этим годом и следующим. Встроенный метод min выбирает минимальный кортеж на основе ключа разности населения.

0 голосов
/ 08 марта 2020

Если вы можете pandas пакет, приведенное ниже решение может помочь вам с несколькими метриками (минимальные, максимальные, средние и даже пользовательские, если хотите)

import pandas as pd

MIDYEAR_POPULATION = [(1971, 21962032), (1972, 22218463), (1973, 22491777), (1974, 22807969), (1975, 23143275),
                      (1976, 23449808), (1977, 23725843), (1978, 23963203), (1979, 24201544),
                      (1980, 24515667), (1981, 24819915), (1982, 25116942), (1983, 25366451), (1984, 25607053),
                      (1985, 25842116), (1986, 26100278), (1987, 26446601), (1988, 26791747), (1989, 27276781),
                      (1990, 27691138), (1991, 28037420), (1992, 28371264), (1993, 28684764), (1994, 29000663), 
                      (1995, 29302311), (1996, 29610218), (1997, 29905948), (1998, 30155173), (1999, 30401286), 
                      (2000, 30685730), (2001, 31020596), (2002, 31358418), (2003, 31641630), (2004, 31938004),
                      (2005, 32242364), (2006, 32570505), (2007, 32887928), (2008, 33245773), 
                      (2009, 33628571), (2010, 34005274), (2011, 34342780), (2012, 34750545), 
                      (2013, 35152370), (2014, 35535348), (2015, 35832513), (2016, 36264604),
                      (2017, 36708083), (2018, 37057765), (2019, 37589262)]
df = pd.DataFrame(MIDYEAR_POPULATION, columns=["year", "midyear_population"])
df["midyear_population_shift"] = df["midyear_population"].shift(-1)
df["pop_difference"] = df["midyear_population_shift"] - df["midyear_population"]
# Example on how to compute multiple aggregations
pop_stats = df["pop_difference"].agg(["min", "max", "median", "mean"])
# This is to get what requested by the OP
pop_stats_min = pop_stats[0]
pop_stats_min
# This gets the result as a dataframe
result_as_df = df[df["pop_difference"] == pop_stats_min]
result_as_df["year"] = result_as_df["year"]  + 1
# This to get it a tuple
result_as_tuple = result_as_df[["year", "pop_difference"]].to_dict(orient="records")[0]
result_as_tuple = (result_as_tuple["year"], result_as_tuple["pop_difference"])
result_as_tuple
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...