2017-02-18 15 views
-1

Я изучаю python на dataquest и пытаюсь решить эту проблему.Python-find извлекает те же значения в списке и вычисляет различия между последовательными значениями

Напишите функцию, которая извлекает одни и те же значения в течение лет и вычисляет различия между последовательными значениями, чтобы показать, увеличивается ли число рождений или уменьшается. Например, как количество рождений в субботу менялось каждый год в период с 1994 по 2003 год?

Я пытаюсь решить это в Jupyter. Я новичок в python, и я не уверен, как начать работу над этой проблемой.

вход Данные здесь в формате CSV: US births

# coding: utf-8 

# In[1]: 

text_file = open("US_births_1994-2003_CDC_NCHS.csv", "r").read() 
line_split = text_file.split("\n") 
line_split 


# In[2]: 

def read_csv(filename): 
    text = open(filename, "r").read() 
    string_list = text.split('\n')[1:] 
    final_list = [] 
    for row in string_list: 
     int_fields = [] 
     string_fields = row.split(',') 
     for item in string_fields: 
      int_fields.append(int(item)) 
     final_list.append(int_fields) 
    return(final_list) 

cdc_list = read_csv("US_births_1994-2003_CDC_NCHS.csv") 
cdc_list[0:10] 


# In[3]: 

def months_births(filename): 
    births_per_month = dict() 
    for item in filename: 
     num_month = int(item[1]) 
     num_births = int(item[4]) 
     if num_month in births_per_month: 
      births_per_month[num_month] += num_births 
     else: 
      births_per_month[num_month] = num_births 
    return(births_per_month) 

cdc_month_births = months_births(cdc_list) 
cdc_month_births 


# In[4]: 

def dow_births(filename): 
    sum_births = dict() 
    for item in filename: 
     day_week = int(item[3]) 
     day_birth = int(item[4]) 
     if day_week in sum_births: 
      sum_births[day_week] += day_birth 
     else: 
      sum_births[day_week] = day_birth 
    return(sum_births) 

cdc_day_births = dow_births(cdc_list) 
cdc_day_births 


# In[30]: 

def calc_counts(data, column): 
    sum_dict = dict() 
    for item in data: 
     col_num = item[column] 
     birth_count = int(item[4]) 
     if col_num in sum_dict: 
      sum_dict[col_num] += birth_count 
     else: 
      sum_dict[col_num] = birth_count 
    return(sum_dict) 

cdc_year_births = calc_counts(cdc_list, 0) 
cdc_month_births = calc_counts(cdc_list, 1) 
cdc_dom_births = calc_counts(cdc_list, 2) 
cdc_dow_births = calc_counts(cdc_list, 3) 


# In[31]: 

cdc_year_births 


# In[32]: 

cdc_month_births 


# In[33]: 

cdc_dom_births 


# In[34]: 

cdc_dow_births 


# In[6]: 

def min_max_dict(filename, request): 
    if request == "max": 
     max_value = max(filename, key=filename.get) 
     return(filename[max_value]) 
    else: 
     min_value = min(filename, key=filename.get) 
     return(filename[min_value]) 

max_value = min_max_dict(cdc_year_births, "max") 
print("max: ",max_value) 
min_value = min_max_dict(cdc_year_births, "min") 
print("min: ",min_value) 


# In[36]: 

def diff_in_values(filename): 
    final_dict = dict() 
    seen_set = set() 
    unique_values = list() 
    for item in filename: 
     year_count = int(item[0]) 
     birth_count = int(item[4]) 
     day_of_week = int(item[3]) 

     if birth_count not in seen_set: 
      unique_values.append(birth_count) 
      seen_set.add(birth_count) 

    return(seen_set) 

result = diff_in_values(cdc_list) 
result 
+1

Вы начать с уточняя требования. Каков формат данных лет и числа рождений (как формата самих данных, так и того, как он хранится с другими данными)? Как ваша функция может получить доступ к этим данным? Каков желаемый формат вывода? Существуют ли какие-либо другие требования или предпочтения? Мы не можем помочь вам, пока вы не поймете эти требования и не включите их в свой вопрос. Проверьте [FAQ] (http://stackoverflow.com/tour) и [Как спросить] (http://stackoverflow.com/help/how-to-ask). –

+0

Большое спасибо. Я включил дополнительную информацию в вопрос. Пожалуйста, дайте мне знать, если этого недостаточно. – iprateekk

+0

Больше информации о вводе, и вы ничего не сказали о выходе. Это файл csv на вашем диске в той же папке, что и ваш функциональный модуль? Является ли этот файл гарантией иметь это имя, чтобы иметь ровно одну строку для каждого дня с 1994-01-01 по 2003-12-31, чтобы строки были в хронологическом порядке без повторных или отсутствующих дней, для строки заголовка и строки данных должны быть полными и надлежащим образом отформатированы и т. д.? Вопрос о субботних родах - единственный выход? И так далее. И вы понимаете, что ваш код фактически не имеет доступа к данным? –

ответ

2

Я также работал над одним проектом. Я поделился частью кода, который вам нужен. У меня есть файл .ipynb проекта на GitHub. Вы также можете увидеть мои результаты функции. Ура!

def read_csv(birth_data_file): 
    raw_data = open(birth_data_file, "r").read() 
    raw_data = raw_data.split("\n") 
    string_list = raw_data[1:] 
    final_list = [] 
    for data in string_list: 
     int_fields = [] 
     string_fields = data.split(",") 
     for string_field in string_fields: 
      field = int(string_field) 
      int_fields.append(field) 
     final_list.append(int_fields) 
    return(final_list) 


def calc_counts(data, column): 
    births_counts = {} 
    if not column > 0 and column <= 4: 
     return("'column' must be either 1, 2, 3, or 4") 
    else: 
     for instance in data: 
      field = instance[column-1] 
      births = instance[4] 
      if field in births_counts.keys(): 
       births_counts[field] += births 
      else: 
       births_counts[field] = births 
     return(births_counts) 


# Write a function that extracts the same values across years and calculates the 
# differences between consecutive values to show if number of 
# births is increasing or decreasing. 

def check_birth_growth(birth_data_file): 
    cdc_list = read_csv(birth_data_file) 
    cdc_year_births = calc_counts(cdc_list, 1) 
    previous_year_birth = 0 
    previous_birth_diff = 0 
    for year, total_births in cdc_year_births.items(): 
     current_year_birth = int(total_births) 
     if previous_year_birth == 0: 
      growth_status = "Growth of births in {} not available.".format(year) 
      print(growth_status) 
      previous_year_birth = current_year_birth 
     else: 
      if current_year_birth > previous_year_birth: 
       growth_status = "Births increased in {}.".format(year) 
       print(growth_status) 
       previous_year_birth = current_year_birth 
      elif current_year_birth < previous_year_birth: 
       growth_status = "Births decreased in {}.".format(year) 
       print(growth_status) 
       previous_year_birth = current_year_birth 
      elif current_year_birth == previous_year_birth: 
       growth_status = "Births in {} was same as previous year.".format(year) 
       print(growth_status) 
       previous_year_birth = current_year_birth 
+0

Спасибо большое :) – iprateekk

+0

Эй, @iprateekk! С удовольствием! :) –

+0

Спасибо. вы действительно помогли. – user7479

0

Enock Kwesi Addey, Это кажется, что это будет только сравнивать год к году рождения, но не месяц в месяц или день в день рождения, например, по сравнению марта 1994 года по март 1995

+1

Код от Enock в порядке. Вам нужно изменить значения для 0 для года, 1 для месяца, 2 для дня месяца и 3 для сравнения дня в следующей строке. cdc_year_births = calc_counts (cdc_list, 1) – user7479

+0

Не должно ли функция check_birth_growth иметь дополнительный параметр? Параметром будет номер столбца cdc_list. Таким образом, нам не нужно запускать функцию каждый раз, когда мы меняем номер столбца (от 0 до 1 до 2 и т. Д.) – Tarek

+0

@ Тарек, мне жаль, что у меня нет времени на то, чтобы заглянуть в него снова. Прошло немало времени. :) В любом случае, вы можете изменить код в соответствии с тем, как его реализовать. Благодарю. –