list comprehension

modules: numpy, pandas, datetime

numpy

np.argmax() : 가장 큰 원소의 index

np.arange(20) : [0,1, … , 19]

datetime

import ‘datetime’ module

from datetime import datetime

creating a date using year, month, day as arguments

birthday.year, month, day birthday.weekday()

creating a date using datetime.now()

datetime.now()

parsing a date using strptime

string to date (return datetime class object) Return a datetime corresponding to date_string, parsed according to format

rendering a date as a string using strftime

date to string Return a string representing the date, controlled by an explicit format string

 

df.col = ['norm_' + col for col in var_list]

data store and retrieval: os, pd.read_csv()

if os.path.exists

if os.path.exists('df_final.csv'):
  print('preprocessed data exists')
  original_data_set = pd.read_csv('df_final.csv')
else:
  original_data_set = load_data()

preprocess

simple codes 
# isin
train_set = data_set[~data_set['date'] isin test_days]

# rolling
h_rank = pd.DataFrame(dfhr.groupby(['horse', 'date']).mean()['rank']). \
        rolling(4, min_periods=1).apply(lambda x: x[:-1].mean() if x.shape[0] - 1 else 5, raw=True)
    h_rank.rename(columns={'rank': 'h_rank'}, inplace=True)
    df_dict['race_result'] = df_dict['race_result'].merge(h_rank, on=['horse', 'date'])
 
4. transform, fillna
train_x = train_x[idx_list + un_list + n_list].transform(lambda x: (x – x.mean())/x.std()).fillna(0.0)
 
5. col 재명
df.col = [‘norm_’ + col for col in var_list]
 
6. 더미변수 (재대입 혹은 inplace = True 필요)
df = pd.concat([df, pd.get_dummies(df[‘gender’])], axis = 1)
 
pd.concat([df, pd.get_dummies(df[‘gender’])], axis = 1, inplace = True)
 
7. random_idx shuffle and ndarray
 
ndarray가 뭔가 indexing이 더 쉬운듯
df[rand_idx[:N]]이 df가 df일땐 안되고, ndarry일땐 가능!
 
8. test_d에서 받아올 정보 (각 경기별 정보)를 위해 get_data()에 test_d 항 추가
test_d = test_data[idx_list]
training_x, training_y, _ = DataGenerator.get_data(test_day, var_list, is_training=True)
test_x, test_y, test_d = DataGenerator.get_data(test_day, var_list, is_training=False)
이후 test_d로 groupby 하고,
 
9. rolling 평균
 
10. 여러 모델 저장
feature 선별을 위한 svc 모형 -> 이또한 pkl저장가능
lsvc = LinearSVC(C=0.01, penalty=”l1″, dual=False, class_weight=’balanced’).fit(training_x, training_y)
model_select = SelectFromModel(lsvc, prefit=True)
for i, (kernel, C) in enumerate(param_list):
models.append(svm.SVC(C=C, kernel = kernel, .., probability = True))
models[i].fit(training_x, training_y)
all_models = [lsvc, model_select, models]
 
pickle.dump(all_models, open(filename, ‘wb’))
 
11. sort_values()
test_d.sort_values(‘vote_y’).groupby([‘date’, ‘race_num’], as_index).nth(-1 * vote_num)
dfjr.sort_values([‘jockey’, ‘date’, ‘race_num’])

0511

lambda 내에 if 가능
frame[[‘b’,’c’]].apply(lambda x: x[‘c’] if x[‘c’]>0 else x[‘b’], axis=1)

a = np.where(a<4, a, -1)

np.argmax, np.where

df[‘1yr_first’] = np.where(std_df[‘1yr_first’], (df[‘1yr_first’] – means_df[‘1yr_first’]) / std_df[‘1yr_first’], 0)

df.describe()

df.to_numpy(), df.values

pd.read_csv(‘boston.csv’, usecols=[‘crim’,’zn’])

df.groupby([‘Manufacturer’,’Model’]).size()

0507

libraries=[3,2,2,2,1,5]
completion=[1,3,4]
gradebook = list(zip(libraries, completion))

>> [(3, 1), (2, 3), (2, 4)]

tuple의 list를 반환

list.count(i) # 리스트 내의 개수 반환

list.sort vs sorted(list) # any iterable (iterable은 순서대로 접근가능한 모든 것)

#전자는 원본 sorting, 후자는 new copy 만들어 sorting, 전자가 빠름

#sort(reverse=True)하면 역순정렬

python 기본문법(yield, lambda(anonymous function), zip)이 있고,

pandas가 새로 정의한 (apply, to_numpy(), column stack)같은 문법이 있다

df.index, df.columns 등은 익숙해지자

dataframe성질 가지고, index가 있는 편한 자료구조 (series, df 중 고민이라면 df선택하자)

df.isnull().sum()

method chaining으로 어느 column에 null 포함횟수 합

position을 물으면 df.iloc[], df.loc[[‘a’]], df.iat[1,1] 의 형태로 거의 해결가능

df.iloc : index 순서로 색인 -> 정수 인덱스 (순서대로 탐색)

df.loc : index 이름으로 생인 -> 라벨 인덱스 (index가 숫자가 아닐때도 사용가능)

iloc 인덱서는 loc 인덱서와 반대로 라벨이 아니라 순서를 나타내는 정수(integer) 인덱스만 받는다.

`iloc` accepts row and column numbers. 
`loc` accepts index and column names.

pd.concat([df1, df2], axis=0) -> df1 아래 df2 붙임(append와 동일)

pd.concat([df1, df2], axis =1) -> df1옆에 df2붙임 (different rows -> null)

total[‘Pclass’].value_counts().plot(kind =’bar’)

-> pandas객체 뒤에 plot() 붙이면 쉽게 plotting가능

to call a column

total.embarked.fillna(total.

for dataframe.index.values

pd.read_csv : thousands= ‘,’ 인자는 중간 , 를 없애고 string을 float로 변환해줌

enumerate
It allows us to loop over something and have an automatic counter.

import pandas as pd
A = np.array([1,2,3])
A > 1
# array([False, True, True])

# ? explains the function
np.empty?

concat

pd.concat([df1, df2], axis=0)

-> append와 동일(df1아래에 df2를 붙임)

pd.concat([df1, df2], axis=1)

-> df1옆에 df2를 붙임(different rows->null)

total[‘Pclass’].value_counts().plot(kind=’bar’)

->easy plot w/ plot() right after the series type

to call a column

total.Embarked.fillna(total.Embarked.mode())

total[‘Embarked’].fillna(total[‘Embarked’].mode())

-> same: .columnName is easier

Iterable: member를 하나씩 차례로 반환가능한 object

An object capable of returning its members one at a time. Examples of iterables include all sequence types (such as liststr, and tuple) and some non-sequence types like dict and file and objects of any classes you define with an __iter__() or __getitem__() method. Iterables can be used in a for loop and in many other places where a sequence is needed (zip()map(), …). When an iterable object is passed as an argument to the built-in function iter(), it returns an iterator for the object. This iterator is good for one pass over the set of values. When using iterables, it is usually not necessary to call iter() or deal with iterator objects yourself. The for statement does that automatically for you, creating a temporary unnamed variable to hold the iterator for the duration of the loop. See also iterator, sequence, and generator.

  • 대표적으로 list, str, tuple있음
  • zip(), map()등 함수 활용가능

 

zip([iterable, …])

This function returns a list of tuples, where the i-th tuple contains the i-th element from each of the argument sequences or iterables.

map(function, iterable, …)

Apply function to every item of iterable and return a list of the results.

  • list는 iter안되는데, iter(x)로 형변환시 가능해짐

inplace=True

#inplace=True means to replace the original
total['Cabin'].fillna('No_Cabin', inplace= True)

if you do not use ‘inplace=True’ the nan will not be removed

be aware of the data type: str, series, dataframe…

# total[‘Embarked’v].mode() returns a series
total[‘Embarked’].mode()[0]

if you intend to fillna(~), you need to use the latter


get a index

dataframe.index.values

for dataframe in full_data:
if 339 in dataframe.index.values:
dataframe=dataframe.drop(339)

escape sequence
\t = tab
\r = carriage return
\n = newline
\a = aler

date index로 조절

pd.to_datetime(‘2019-04-10’ )-pd.to_datetime(‘2019-04-08’ )

pd.date_range로 DatetimeIndex 타입으로 선언 후 이를 이용해 set_index(), reset_index()등 할 수 있음

Series

resample 함수

index = pd.date_range(‘1/1/2000′, periods=9, freq=’T’)

pd.Series(range(9), index=index)

.apply는 누구의 함수? list는 안됨 – df? -> apply는 pd함수이므로 df, series(?)에만 적용가능

groupby
df.groupby()를 하면 됨
df.groupby(series(column))
seriesgropuby라는 object가 따로 있음

groupby에서 as_index=True로 주면 string형태, False로 주면 dataframe형태로 나옴

df을 df.values를 하면 array로 반환
df.values.ravel()하면 1차원으로 flatten됨 (연산 시 이 작업 많이 거침)

list comprehension등의 문법은 python에선 많이 이용

isin

df1[~df1.isin(df2).all(1)

all(1)은 axis가 1이라 row의 결과를 종합해 보여준다는 의미

isin은 elementwise로 df1의 각 성분이 df2에 속하는지를 boolean으로 반환


[Pandas]

pep8정독해보기 variable은 소문자 시작, _로 구분

@property역할?
종속되어 안 변하는 값 member변수를 접근
생성되어 있는 객체를 @property 걸어두면 외부에서 꺼내 쓸 수 있다



memcodes

pd.concat([chunk.iloc[0] for chunk in df])

[i for i in j for j in if i+j %2 ==0]

[i + j for i in range(10) for j in range(10) if (i + j) % 2 == 0]

[df.iloc[i].corr(df.iloc[i+1]) for i in range(df.shape[0])[:-1]]

 

df =pd.read_pickle(‘CV_results.pkl’)

df.sort_values(‘error’)


2019-05-02 06.31.39