2016-03-16 4 views
0

У меня есть файл CSV, в котором есть столбец дат и другой столбец для числа последователей Twitter. Я хотел бы рассчитать месячный темп роста подписчиков Twitter, но даты могут не быть даже на 30 дней друг от друга. Так что, если у меня естьИтерации через столбец дат в csv для вычисления скорости роста переменных каждые 30 дней

  • 2016-03-10 с 200 последователей
  • 2016-02-08 195 последователей
  • 2016-01-01 105 последователей

Как я могу итерации через это, чтобы генерировать темпы роста за месяц в месяц? Я пробовал работать с rutle dateutil с пандами, но мне трудно. Я думал об использовании R для этого, но я предпочел бы сделать это в Python, поскольку я выведу данные в новый CSV из Python.

+1

Может ли вы дать нам пример ввод и вывод образца (в формате CSV)? – Bahrom

+1

'm = (y2 - y1)/(x2 - x1)', так что бы вы просто не делали «rate = (followers - prev_fol)/(time-prev_time)»? Это будет означать изменение сторонников в отношении изменения времени для любого временного интервала –

+0

Я думаю, что это действительно зависит от того, что означает, что это будет темп роста «месяц за месяцем». Предположительно, вы хотите мгновенный темп роста, нормированный на какой-то 30-дневный месяц? – Paul

ответ

1

Моя команда и Я использовал функцию ниже для решения этой задачи. Код ниже:

def compute_mom(data_list): 
    list_tuple = zip(data_list[1:],data_list) 
    raw_mom_growth_rate = [((float(nxt) - float(prev))/float(prev))*100 for nxt, prev in list_tuple] 
    return [round(mom, 2) for mom in raw_mom_growth_rate] 

Надеется, что это помогает ..

0

Вот подход с defaultdict

import csv 
from collections import defaultdict 
from datetime import datetime 

path = "C:\\Users\\USER\\Desktop\\YOUR_FILE_HERE.csv" 
with open(path, "r") as f: 
    d = defaultdict(int) 
    rows = csv.reader(f) 
    for dte, followers in rows: 
     dte = datetime.strptime(dte, "%Y-%m-%d") 
     d[dte.year, dte.month] += int(followers) 
print d 

to_date_followers = 0 
for (year, month) in sorted(d): 
    last_month_and_year = (12, year-1) if month == 1 else (month-1, year) 
    old_followers = d.get(last_month_and_year, 0) 
    new_followers = d[year, month] 
    to_date_followers += new_followers 
    print "%d followers gained in %s, %s resulting in a %.2f%% increase from %s (%s followers to date)" % (
     new_followers-old_followers, month, year, new_followers*100.0/to_date_followers, ', '.join(str(x) for x in last_month_and_year), to_date_followers 
    ) 

Для входа ниже:

2015-12-05,10 
2015-12-31,10 
2016-01-01,105 
2016-02-08,195 
2016-03-01,200 
2016-03-10,200 
2017-03-01,200 

Он печатает:

defaultdict(<type 'int'>, {(2015, 12): 20, (2016, 1): 105, (2016, 3): 400, 

(2017, 3): 200, (2016, 2): 195}) 
20 followers gained in 12, 2015 resulting in a 100.00% increase from 11, 2015 (20 followers to date) 
105 followers gained in 1, 2016 resulting in a 84.00% increase from 12, 2015 (125 followers to date) 
195 followers gained in 2, 2016 resulting in a 60.94% increase from 1, 2016 (320 followers to date) 
400 followers gained in 3, 2016 resulting in a 55.56% increase from 2, 2016 (720 followers to date) 
200 followers gained in 3, 2017 resulting in a 21.74% increase from 2, 2017 (920 followers to date) 
+0

Если вы хотите, чтобы сравнение за месяц-месяц проводилось только с разницей между месяцами (вместо новых последователей в коэффициенте использования счета), словарь содержит все необходимые данные - сколько последователей у меня есть за данный год и месяц - вам просто нужно выполнить свои расчеты на основе этих данных – Bahrom

0

спасибо большое за ответ. Я был в состоянии разработать следующий код, который выполняет то, что я ищу (я не ожидал, чтобы быть в состоянии сделать это, но получилось найти нужные функции в нужное время):

import csv, datetime, string, os 
import pandas as pd 

df = pd.read_csv('file_name.csv', sep=',') 
# This converts our date strings to date_time objects 
df['Date'] = pd.to_datetime(df['Date']) 
# But we only want the date, so we strip the time part 
df['Date'] = df['Date'].dt.date 

sep = ' ' 

# This allows us to iterate through the rows in a pandas dataframe 
for index, row in df.iterrows(): 
    if index == 0: 
     start_date = df.iloc[0]['Date'] 
     Present = df.iloc[0]['Count'] 
     continue 
    # This assigns the date of the row to the variable end_date 
    end_date = df.iloc[index]['Date'] 
    delta = start_date - end_date 

    # If the number of days is >= to 30 
    if delta >= 30: 
     print "Start Date: {}, End Date: {}, delta is {}".format(start_date, end_date, delta) 
     Past = df.iloc[index]['Count'] 
     percent_change = ((Present-Past)/Past)*100 

     df.set_value(index, 'MoM', percent_change) 
     # Sets a new start date and new TW FW count 
     start_date = df.iloc[index]['Date'] 
     Present = df.iloc[index]['Count'] 
Смежные вопросы