Вычисление среднего значения нескольких строк в одном файле с использованием Python - PullRequest
0 голосов
/ 11 мая 2018

У меня есть файл CSV, который я хочу свернуть.

Файл выглядит так:

Ticker  |    Date     |   Marketcap 
  A     |  2002-03-14 |    600000
  A     |  2002-03-14 |    520000
  A     |  2004-03-16 |    400000
  A     |  2004-03-16 |    680000
  A     |  2008-07-14 |    500000
  A     |  2010-03-14 |    300000
  AB    |  2010-02-14 |    1200000
  AB    |  2010-02-14 |    930000
  AB    |  2010-02-14 |    1600000
  AB    |  2012-05-02 |    1600000
  AB    |  2012-05-02 |    1300000

Как вы можете видеть, len (A) / = len (AB) и рыночные колпачки для повторных дат не одинаковы для каждой записи одного и того же тикера.

Что мне нужно сделать, так это вычислить средние каждого тикера с той же датой , а затем проанализировать эти средние в новом CSV, который выглядит следующим образом тип выход :

Ticker  |    Date     |   Avg Marketcap 
  A     |  2002-03-14 |    560000
  A     |  2004-03-16 |    540000
  A     |  2008-07-14 |    500000
  A     |  2010-03-14 |    300000
  AB    |  2010-02-14 |    124333
  AB    |  2012-05-02 |    1450000

Я попытался начать поиск примеров кодов, но все, что я могу найти, - это объединить два файла вместе или несколько фреймов данных; ничего в том же наборе.

Мой код просто анализирует мой файл и в настоящее время выглядит так:

#Parse values from 2003 and above
df = pd.read_csv(data_market)
df = df[(df['Date'] > '2003-01-01')]
df = df[['Ticker','Date','Marketcap']]

#Dropping duplicate values
df.drop_duplicates(subset=None, inplace=True)

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Вы можете сделать небольшой трюк здесь

df.groupby([df.Ticker,df.Date.str[:4]]).Marketcap.mean()
Out[31]: 
Ticker  Date
A       2002    5.600000e+05
        2004    5.400000e+05
        2008    5.000000e+05
        2010    3.000000e+05
AB      2010    1.243333e+06
        2012    1.450000e+06
Name: Marketcap, dtype: float64

Чтобы соответствовать ожидаемому, используйте agg

df.groupby([df.Ticker,df.Date.str[:4]]).agg({'Marketcap':'mean','Date':'first'}).reset_index(level=1,drop=True)
Out[46]: 
           Marketcap        Date
Ticker                          
A       5.600000e+05  2002-03-14
A       5.400000e+05  2004-03-16
A       5.000000e+05  2008-03-14
A       3.000000e+05  2010-03-14
AB      1.243333e+06  2010-02-14
AB      1.450000e+06  2012-05-02
0 голосов
/ 11 мая 2018

точное решение в одну строку

df.groupby(['Ticker', 'Date'], as_index=False).mean()

#Output
  Ticker        Date     Marketcap
0      A  2002-03-14  5.600000e+05
1      A  2004-03-16  5.400000e+05
2      A  2008-03-14  5.000000e+05
3      A  2010-03-14  3.000000e+05
4     AB  2010-02-14  1.243333e+06
5     AB  2012-05-02  1.450000e+06
0 голосов
/ 11 мая 2018

Сначала убедитесь, что ваш столбец Date равен datetime

df.Date = pd.to_datetime(df.Date)

Затем просто сгруппируйте по тикеру и году и возьмите mean()

df.groupby(["Ticker", df.Date.dt.year]).mean().round().reset_index()


Ticker  Date    Marketcap
0   A   2002    560000.0
1   A   2004    540000.0
2   A   2008    500000.0
3   A   2010    300000.0
4   AB  2010    1243333.0
5   AB  2012    1450000.0
...