白旗製作所

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, encodin='SHIFT-JIS')

【csvファイルへの書き込み】
data.to_csv(filename)

●pandas.DataFrame関係

【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

●時系列関係
【文字列と時刻(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')

【移動平均】
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))
#凡例の消し方がわからん。
 誰かおしえてください。

デフォルトのフォントだとグラフの文字に日本語が使えないので
以下を実行する。
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'
スポンサーサイト
  1. 2015/11/03(火) 02:05:34|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
<<Vivaldiのマウスジェスチャーカスタマイズ | ホーム | Python開発環境(Anaconda3+spyder)の操作の小技>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://dededemio.blog.fc2.com/tb.php/32-cafffad5
この記事にトラックバックする(FC2ブログユーザー)

twitter

プロフィール

dededemio

Author:dededemio
某電機メーカーエンジニア。
真空管からプログラミングまでゆるゆると。

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

Java (8)
未分類 (0)
真空管 (2)
キー配列 (2)
電子回路 (1)
マイコン (1)
PC部品 (2)
VPN (1)
Android (2)
opera (3)
C# (0)
プログラミング (1)
FTP (1)
メール (1)
tex (1)
音源 (2)
Ubuntu (1)
Python (5)
ブログパーツ (1)
GitHub (0)
Gist (1)
Vivaldi (1)
WICED Sense (2)
害虫駆除 (1)

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する

QRコード

QR