2016-10-24 6 views
1

Я чищу документы pandas, чтобы попытаться понять, как используется преобразование, и может на этом примере из документов: http://pandas.pydata.org/pandas-docs/stable/groupby.html (в разделе «Преобразование")Я не понимаю использование «Lambda» и «Transform» и из этого кода (pandas docs)

import pandas as pd 
import numpy as np 
import seaborn as sns 
import matplotlib.pyplot as plt 



index = pd.date_range('10/1/1999', periods=1100) 
ts = pd.Series(np.random.normal(0.5, 2, 1100), index) 

ts = ts.rolling(window=100,min_periods=100).mean().dropna() 
key = lambda x: x.year 

zscore = lambda x: (x - x.mean())/x.std() 


transformed = ts.groupby(key).transform(zscore) 

пару вещей я запутались;.? первое использование лямбда

key = lambda x: x.year 

Что тип данных х должен представлять в этом случае I» m unsure, из которых типы данных позволяют вызвать атрибут «.year»

Что касается этого случая:

zscore = lambda x: (x - x.mean())/x.std() 

х будет представлять каждую строку ц и x.mean является средним, что именно (из ts.roll?)?

И, наконец, что именно делает трансформация в последней строке? Является ли это просто заменой значений ts на zscore? Я запустил переменную «преобразован», но индекс (даты) выглядит так же, как индекс ts. Итак, что именно делал groupby (key) в этом случае?

Спасибо!

+1

Для ключа, х является индексом и лямбда-функция возвращает годы штампов времени в индексе. Для zscore x - срез серии, отрезанной по году. – piRSquared

+0

Привет, piRSquared. «x - срез серии, отрезанной по году». Поэтому я предполагаю, что x.mean является средним значением всего фрагмента (группы), а x будет представлять собой только один элемент этого среза. Например, группа «2000» (2000 год) имеет много значений. Итак, x будет представлять каждый элемент этой группы через итерацию? – Moondra

+0

nope. x - вся группа. Вот как х.mean() возвращает среднее значение группы. – piRSquared

ответ

3

с использованием key = lambda x: x.year означает, что ваш индекс имеет dtype='datetime64[ns]'

этого назвали бы год каждого индекса и группы ФР в год.

теперь, когда у вас есть объект GroupBy вы можете преобразовать каждую группу:

zscore = lambda x: (x - x.mean())/x.std() 

будет принимать каждую группу (что бы каждый год) вычислить среднее (x.mean()), стандартное отклонение (x.std()) и применить формулу (x - x.mean())/x.std() для каждой точки данных.

так как это сделать:

ts.groupby(key).mean() 
Out[274]: 
2000 0.4851 
2001 0.2568 
2002 0.4544 

возвращение среднее на каждый год, и делает это:

ts.groupby(key).std() 
Out[275]: 
2000 0.1969 
2001 0.1539 
2002 0.1881 

возвращение стандартное отклонение для каждого года

преобразования будет применить это к каждому , поэтому давайте использовать позицию 1 для теста

ts.head() 
Out[277]: 
2000-01-08 0.7562 
2000-01-09 0.7639 
2000-01-10 0.7020 
2000-01-11 0.6970 
2000-01-12 0.6906 

, так как первый показатель 2000 года, мы должны использовать среднее значение и зЬй этой группы такой есть: 0.7562- 0,4851/0,1969 = 1,3767

ts.groupby(key).transform(zscore).head(2) 
Out[282]: 
2000-01-08 1.3767 
2000-01-09 1.4159 
+0

Привет, Стивен. Поэтому, если x.mean является средним значением целой группы (которая сгруппирована по году), x представляет только каждый элемент (каждое значение) группы. По существу, x выполняет итерацию через каждое значение каждой группы и вычитает ее по средней группе? Благодарю. – Moondra

+1

отредактировал ответ с числовым примером –

+0

А! Получил! Я был смущен тем, как применяется преобразование, и объяснение (по строкам) объясняет эту путаницу. Огромное спасибо. – Moondra