Pythonの基本操作

忘備録的に書いておきます。

ちょっと雑多すぎるので、今度整理します。

環境:Anaconda + Spyder (Python3.4)

import pandas as pd

from pandas import Series, DataFrame

import numpy as np

【数列をつくる】

In [52]: np.arange(3)

Out[52]: array([0, 1, 2])

In [53]: np.arange(10,100,9)

Out[55]: array([10, 19, 28, 37, 46, 55, 64, 73, 82, 91])

In [65]: [x for x in range(10,100,9)]

Out[95]: [10, 19, 28, 37, 46, 55, 64, 73, 82, 91]

In [100]: np.ones(4)

Out[100]: array([ 1., 1., 1., 1.])

In [101]: np.ones([3,4])

Out[101]:

array([[ 1., 1., 1., 1.],

[ 1., 1., 1., 1.],

[ 1., 1., 1., 1.]])

【乱数行列の生成】

In [63]: np.random.rand(3,3)*3

Out[63]:

array([[ 2.1996651 , 0.29671819, 2.15422178],

[ 0.28882665, 0.61283333, 0.38610587],

[ 2.64869479, 1.76624717, 2.03628832]])

【配列の長さ】

len()で求められる。size()に相当するものは無い様なので、

len(a[0])とかするしか無い。

In [74]: b = np.random.rand(3,5)

In [75]: len(b[0])

Out[75]: 5

In [76]: len(b)

Out[76]: 3

【平均・標準偏差相関係数

np.average(data)

np.std(data)

data.corr()

【重回帰分析】

予測したいデータをyに、説明変数をxに入れる。

interceptをTrueにすると切片ありで予測する。

model = pd.ols(x=xdata, y=ydata, intercept=True)

print(model) #結果表示

print(model.y_fitted) #説明変数から予測したデータ

【エクセルファイルの読み込み】

book = 'sample.xlsx'

sheet = 'sheet1'

xlsx = pd.ExcelFile(book)

data = xlsx.parse(sheet)

csvファイルの読み込み】

filename = 'sample.csv'

data = pd.read_csv(filename, skiprows=0, encoding='SHIFT-JIS')

csvファイルへの書き込み】

data.to_csv(filename)

●pandas.DataFrame関係

【列名を一部変更】

data.columns.values[2]='名前'

【NaNの行を削除】

nonandata = data.dropna()

【Pandas DataFrameの行インデックスと列名の取得】

index = data.index

columns = data.columns

【インデックスの振り直し】

data.reset_index(drop=True)

【インデックスの重複を排除】

In [116]: data

Out[116]:

0 1 2 3

0 1 1 1 1

1 1 1 1 1

2 1 1 1 1

0 0 0 0 0

In [119]: data[~data.index.duplicated()]

Out[119]:

0 1 2 3

0 1 1 1 1

1 1 1 1 1

2 1 1 1 1

【インデックスでソート】

In [127]: data

Out[127]:

0 1 2 3

0 1 1 1 1

2 1 1 1 1

3 1 1 1 1

1 0 0 0 0

In [128]: data.sort_index()

Out[128]:

0 1 2 3

0 1 1 1 1

1 0 0 0 0

2 1 1 1 1

3 1 1 1 1

【行列の転置】

data2 = data.T

【行・列を指定した参照】

In [105]: sample['data1'] #列名を指定

Out[105]: 50

In [106]: sample'data1','data2' #列名を複数指定する場合はlistを代入

Out[106]: 50

In [107]: sample.ix[1,2]

Out[107]: 50

【条件指定した参照】

data.query('data1==42')

data['column1'!=10]

data[data['data1']==42]]

【行列の連結】

pd.concat()で行います。

axis=1をつけると左右方向、付けないと上下方向です。

In [106]: base = pd.DataFrame(np.ones([3,4]) )

In [107]: right = pd.DataFrame(np.zeros([3,2]))

In [108]: bottom = pd.DataFrame(np.zeros([1,4]))

In [109]: pd.concat([base, bottom])

Out[109]:

0 1 2 3

0 1 1 1 1

1 1 1 1 1

2 1 1 1 1

0 0 0 0 0

In [110]: pd.concat([base, right], axis=1)

Out[110]:

0 1 2 3 0 1

0 1 1 1 1 0 0

1 1 1 1 1 0 0

2 1 1 1 1 0 0

【データが含まれているか調べる】

#文字列が含まれているか

data.str. contains('test')

#数字が含まれているか

1 in data.values

●時系列関係

【文字列と時刻(datetime)の相互変換】

In [132]: import datetime

In [134]: today = datetime.datetime.strptime('2015/11/02 10:11:12','%Y/%m/%d %H:%M:%S')

In [134]: today = pd.to_datetime('2015/11/02 10:11:12', format='%Y/%m/%d %H:%M:%S')

In [135]: today.strftime('%Y-%m-%d %H%M%S')

Out[135]: '2015-11-02 101112'

【時刻列の作成】

date_range()関数を用います。freqは日:D, 時間:H, 分:T, 秒:S, などが使えます。

In [182]: pd.date_range('2014-12-02 14:00:00',periods=17,freq='10S')

In [183]: Out[182]:

DatetimeIndex(['2014-12-02 14:00:00', '2014-12-02 14:00:10',

'2014-12-02 14:00:20', '2014-12-02 14:00:30',

'2014-12-02 14:00:40', '2014-12-02 14:00:50',

'2014-12-02 14:01:00', '2014-12-02 14:01:10',

'2014-12-02 14:01:20', '2014-12-02 14:01:30',

'2014-12-02 14:01:40', '2014-12-02 14:01:50',

'2014-12-02 14:02:00', '2014-12-02 14:02:10',

'2014-12-02 14:02:20', '2014-12-02 14:02:30',

'2014-12-02 14:02:40'],

dtype='datetime64[ns]', freq='10S', tz=None)

【時刻の加減算】

In [142]: today

Out[142]: datetime.datetime(2015, 11, 2, 10, 11, 12)

In [140]: delta = datetime.timedelta(days=365, seconds=22, minutes=4, hours=1, weeks=0)

In [141]: today-delta

Out[141]: datetime.datetime(2014, 11, 2, 9, 6, 50)

In [151]: today

Out[151]: datetime.datetime(2015, 11, 2, 10, 11, 12)

In [152]: today+pd.DateOffset(year=2015, month=9, day=8)

Out[152]: Timestamp('2015-09-08 10:11:12')

【リサンプル】

#データ抽出

data.resample('5s', how='mean')

data.resample('10T', how='sum')

#データ補完

data2=data.resample('1s' ,fill_method='ffill')

#時系列でない場合の補完

data.apply(pd.Series.interpolate)

移動平均

rolling_mean()関数で行います。windowパラメータが移動の窓サイズです。

data = pd.rolling_mean(data, window=31)

【時刻を指定したデータの抽出】

In [166]: data

Out[166]:

data1 data2

2014-12-02 14:00:00 56 5

2014-12-02 14:00:10 50 11

2014-12-02 14:00:13 47 14

2014-12-02 14:00:14 46 15

2014-12-02 14:00:18 42 19

2014-12-02 14:00:23 37 24

2014-12-02 14:00:27 33 28

2014-12-02 14:00:30 30 31

2014-12-02 14:00:36 24 37

2014-12-02 14:00:37 23 38

2014-12-02 14:00:41 19 42

2014-12-02 14:00:46 14 47

2014-12-02 14:00:49 11 50

2014-12-02 14:00:53 7 54

2014-12-02 14:00:58 2 59

2014-12-02 23:59:59 1 60

2014-12-03 14:52:29 0 100

In [167]: temp = data[data.index>=pd.to_datetime('2014-12-02 14:00:14')] #14時0分14秒以降を抽出

In [168]: newdata = temp[temp.index<=pd.to_datetime('2014-12-02 14:00:46')] #14時0分46秒以前を抽出

In [169]: newdata

Out[169]:

data1 data2

2014-12-02 14:00:14 46 15

2014-12-02 14:00:18 42 19

2014-12-02 14:00:23 37 24

2014-12-02 14:00:27 33 28

2014-12-02 14:00:30 30 31

2014-12-02 14:00:36 24 37

2014-12-02 14:00:37 23 38

2014-12-02 14:00:41 19 42

2014-12-02 14:00:46 14 47

●グラフ描画

import matplotlib.pyplot as plt

【データ描画】

plt.plot()でデータ描画する。デフォルトは折れ線グラフで、'o'などで線やマーカーの仕様を指定する。

figsizeはグラフサイズで、デフォルトは(6,4)くらい。

fig=plt.figure(figsize=(10,4))

fig.subplots_adjust(bottom=0.3) #グラフの下部を上に上げる

ax=fig.add_subplot(111) #1×1の範囲のうち1つ目にグラフ描画するの意

plt.plot(data, 'o' )

plt.grid(True)

plt.ylabel('length[m]') #縦軸の名前

plt.ylim([15,45]) #縦軸の上下限指定

plt.xtics(np.arrange(10), horizonallabel, rotation=90) #横軸の補助線位置とラベル指定。rotationでラベルを回転する

plt.yticks(np.arrange(-10,10,1)) #縦軸の補助線の位置とラベル指定

plt.show()

エラーバーグラフはplt.errorbar()

plt.errorbar(horizonalaxis, average, yerr=standard, fmt='o')

凡例はlegend()でつける。locを指定することで位置を変更できる。

plt.legend(loc='upper right')

もしどうしても凡例が邪魔な場合、以下のようにして凡例を図の外に追いやることも出来る。

plt.legend(bbox_to_anchor=(1.3,1))

#凡例の消し方がわからん。

 誰かおしえてください。

デフォルトのフォントだとグラフの文字に日本語が使えないので

IPAexフォントを落としてきてインストールし以下を実行する。

import matplotlib as mpl

mpl.rcParams['font.family']='IPAexGothic'

【グラフ保存】

savefig()関数で保存する。拡張子によって保存形式を判定。

texとかで埋め込む時に使用するepsでも保存可能。

ベクターデータであるemfも保存できるが、

Microsoft Officeで読み込むと文字が消えたりする。

pngでdpiを上げて保存し後で解像度落とすのが使い勝手が良い。

plt.savefig('sample.png', dpi=300)

●フォルダやファイル操作

import shutil

import os

【フォルダの中身の一覧表示】

folder = '\\test\\'

files = os.listdir(folder)

【ファイル・フォルダの削除】

os.remove(folder+files[0])

【ファイルコピー】

folder2 = '\\test2\\'

shutil.copyfile(folder+files[1], folder2+files[1])

【拡張子】

splitextで拡張子とそれ以外を分ける。

In [201]: os.path.splitext(filename)[1]

Out[201]: '.csv'