Coursera – Introduction to Data Science in Python #17 (3週目その4)

Coursera『Introduction to Data Science in Python – by University of Michigan』の学習メモ

Pivot Tables

エクセルでもお馴染みのPivot Tablesのデータフレームでの使い方。


#http://open.canada.ca/data/en/dataset/98f1a129-f628-4ce4-b24d-6f16bf24dd64
df = pd.read_csv('cars.csv')
df.head()

pivot_table(values, index, columns, aggfunc)


df.pivot_table(values='(kW)', index='YEAR', columns='Make', aggfunc=np.mean)

aggfuncを複数指定したい時はlistで渡す。
margins=Trueを渡すと合計列を表示できる。


df.pivot_table(values='(kW)', index='YEAR', columns='Make', aggfunc=[np.mean,np.min], margins=True)

Date Functionality

Pandasでは時間に関する主なクラスが4つある。

  • Timestamp
  • Period
  • DatetimeIndex
  • PeriodIndex

Timestamp

PandasのTimpestampの生成。ほとんど場合、Pythonのdatetimeと互換性がある。


pd.Timestamp('9/1/2016 10:05AM')
# Timestamp('2016-09-01 10:05:00')

Period

特定の時間でなく、ある一定の期間を扱いたい時はPeriodを用いる。


pd.Period('1/2016')
# Period('2016-01', 'M')

pd.Period('3/5/2016')
# Period('2016-03-05', 'D')

DatetimeIndex

Timestampをシリーズの値として使うと、そのインデックスはDatetimeIndexとなる。


t1 = pd.Series(list('abc'), [pd.Timestamp('2016-09-01'), pd.Timestamp('2016-09-02'), pd.Timestamp('2016-09-03')])
t1
# 2016-09-01    a
# 2016-09-02    b
# 2016-09-03    c
# dtype: object

type(t1.index)
# pandas.tseries.index.DatetimeIndex

PeriodIndex

同様に、Periodをシリーズの値として使うと、そのインデックスはPeriodIndexとなる。


t2 = pd.Series(list('def'), [pd.Period('2016-09'), pd.Period('2016-10'), pd.Period('2016-11')])
t2
# 2016-09    d
# 2016-10    e
# 2016-11    f
# Freq: M, dtype: object

type(t2.index)
# pandas.tseries.period.PeriodIndex

Converting to Datetime

to_datetimeメソッドは、様々な日付関連のデータ型をTimestamp型に変換することができる。


d1 = ['2 June 2013', 'Aug 29, 2014', '2015-06-26', '7/12/16']
ts3 = pd.DataFrame(np.random.randint(10, 100, (4,2)), index=d1, columns=list('ab'))
ts3

ts3.index = pd.to_datetime(ts3.index)
ts3

pd.to_datetime('4.7.12', dayfirst=True)
# Timestamp('2012-07-04 00:00:00')

Timedeltas

2つのTimestampの差の計算はTimedeltaで行う。


pd.Timestamp('9/3/2016')-pd.Timestamp('9/1/2016')
# Timedelta('2 days 00:00:00')

pd.Timestamp('9/2/2016 8:10AM') + pd.Timedelta('12D 3H')
# Timestamp('2016-09-14 11:10:00')

Working with Dates in a Dataframe

データフレームで日付を扱う時のちょっとしたテクニック。

まずは date_range(‘開始日’, periods=回数, freq=’頻度’ )を使って、基本データを用意する。


dates = pd.date_range('10-01-2016', periods=9, freq='2W-SUN')
dates
# DatetimeIndex(['2016-10-02', '2016-10-16', '2016-10-30', '2016-11-13',
#                '2016-11-27', '2016-12-11', '2016-#12-25', '2017-01-08',
#                '2017-01-22'],
#               dtype='datetime64[ns]', freq='2W-SUN')

df = pd.DataFrame({'Count 1': 100 + np.random.randint(-5, 10, 9).cumsum(),
                  'Count 2': 120 + np.random.randint(-5, 10, 9)}, index=dates)
df

DatetimeIndexにweekday_nameを使うと、該当する曜日を配列で返してくれる。


df.index.weekday_name
# array(['Sunday', 'Sunday', 'Sunday', 'Sunday', 'Sunday', 'Sunday',
#        'Sunday', 'Sunday', 'Sunday'], dtype=object)

df.diff()は日付間の差を表示する。


df.diff()

df.resample(‘M’)を使えば、月単位で集計できる。


df.resample('M').mean()

df[‘特定の日付’]でクエリもできる。


df['2017']
# 2017年の列を抽出

df['2016-12']
# 2016年12月の列を抽出

df['2016-12':]
# # 2016年12月以降の列を抽出

df.asfreq(‘頻度’) で頻度を変更できる。


df.asfreq('W', method='ffill')

Source

兵庫県西宮市生まれのフリーランスRailsエンジニア。海外を拠点にデジタルノマド生活中。/ 前職・資格:公認会計士 / プログラミング言語:Ruby, JavaScript, HTML, CSS / 日本語・英語
コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です