hirhirの日記

Pythonとデータ分析と人口知能

Python3 入門:and と or の反対の挙動??

本日は

python3の and と or の面白い挙動を調査してみる

理由はロジックを書いていてちょっと ??な出来事があったからですが

こちらには記載されていた

では、早速 jupyterにて

In [1]:
 
1 and 2
 
 
Out[1]:
2

最初はこんな感じで1が返る想定が2が帰ってきたからちょっと調べてみました。

In [2]:
 
2 and 1
 
 
Out[2]:
1
In [3]:
 
0 and 1
 
 
Out[3]:
0

これで。。。何だと?とね

In [4]:
 
True and False
 
 
Out[4]:
False
In [5]:
 
False and True
 
 
Out[5]:
False

これでわかったことは

左辺が真なら右辺が返るってことですね

で次は or

In [7]:
 
1 or 2
 
 
Out[7]:
1

まさかの挙動、左辺が帰ってきた

In [8]:
 
0 or 1
 
 
Out[8]:
1

ああ、そうですかよもやの反対ですか

左辺が真なら左辺が返る

In [9]:
 
True or False
 
 
Out[9]:
True
In [10]:
 
False or True
 
 
Out[10]:
True
In [16]:
 
"A" or 'A'
 
 
Out[16]:
'A'

??お、おう??

In [17]:
 
'A' or "A"
 
 
Out[17]:
'A'

そうですか。。。。。これは正直まだ良くわからん

これの動きはand も同じだったので文字列間の比較に鍵があるんでしょう

今は目をつぶる。。。

 

In [13]:
 
0.0 or 1
 
 
Out[13]:
1

 

以上終了

 

 

 

Python3 入門:線形代数 numpy 行列の計算

最近は線形代数pythonと共に合わせて勉強しなおしているので
ついでにPythonしてみようと思った

まずは行列

In [2]:
 
import numpy as np
a= np.array([[0.,-1.,4.],[5.,2.,-2.]])
b=np.array([[-2.,0.,-1.],[1.,-3.,2.]])
In [3]:
 
a
 
 
Out[3]:
array([[ 0., -1.,  4.],
       [ 5.,  2., -2.]])
In [4]:
 
b
 
 
Out[4]:
array([[-2.,  0., -1.],
       [ 1., -3.,  2.]])

まぁこんな感じで行列が表現できるようで。。。。

次は簡単な演算

In [7]:
 
2*b
 
 
Out[7]:
array([[-4.,  0., -2.],
       [ 2., -6.,  4.]])
In [8]:
 
a+b
 
 
Out[8]:
array([[-2., -1.,  3.],
       [ 6., -1.,  0.]])
In [9]:
 
a-b
 
 
Out[9]:
array([[ 2., -1.,  5.],
       [ 4.,  5., -4.]])

 

はいすこぶる簡単です。

Numpyすげぇ!!さて積は??

In [11]:
 
a= np.array([[3.,-4.],[-5.,1.],[2.,-2.]])
b=np.array([[-3.,1],[5.,-2.]])
 

 

In [12]:
 
a*b
 
 
 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-12-8201c27d19b7> in <module>()
----> 1 a*b

ValueError: operands could not be broadcast together with shapes (3,2) (2,2) 

 できない。。。。

 ちょっと調べたら関数があったので試してみる。

In [13]:
 
a.dot(b)
 
 
Out[13]:
array([[-29.,  11.],
       [ 20.,  -7.],
       [-16.,   6.]])

 よかったできました。

どうやら*はnumpyでは対応する要素があってれば要素ごとの積を返すようだ

なのでshapeが違うと怒られる

最後に

逆行列

これは下記のようにimportを追加することで実現した

In [19]:
 
from numpy.linalg import inv
inv(b)
 
 
Out[19]:
array([[-2., -1.],
       [-5., -3.]])

bに対しての逆行列が取得できた

これなら線形代数の他の計算も楽になりそうな予感がする

今後面倒くさい時にはNumpyを使って楽にしてしまおう( ̄ー ̄)ニヤリ

ちなみに今回の参考図書はこちら

両方ともに良書と思っています。

やさしく解説してくれるので、私のような初学者にはおすすめです。

 

 

 

 

 

 

 

Python3 入門:matplotlib でローソク足の表示 pandas numpy

海外のソースをみてほぼ写経

import pandas as pd
import numpy 
from pylab import *
import matplotlib.pyplot as plt
from datetime import datetime
import time
from matplotlib.dates import  DateFormatter, WeekdayLocator, HourLocator, \
     DayLocator, MONDAY
from matplotlib.finance import candlestick,\
     plot_day_summary, candlestick2
%matplotlib inline 

mondays = WeekdayLocator(MONDAY)
alldays    = DayLocator()              
weekFormatter = DateFormatter('%b %d')  
dayFormatter = DateFormatter('%d')      

filename = "./4689.csv"
df = pd.read_csv(filename, index_col=0) # データを読んで
print(df)
i=0
prices = []
for i in range(99):
    val = (date2num(datetime.strptime(df.ix[i].name.replace('-','/'), "%Y/%m/%d")) , df.ix[i].open , df.ix[i].close ,df.ix[i].high ,df.ix[i].low)
    prices.append(val)

fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2)
ax.xaxis.set_major_locator(mondays)
ax.xaxis.set_minor_locator(alldays)
ax.xaxis.set_major_formatter(weekFormatter)
candlestick(ax, prices, width=0.6)

ax.xaxis_date()
ax.autoscale_view()
plt.setp( plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')

plt.show()

ローソク足

しかしこんな文字が!!
This function has been deprecated in 1.4 in favor of `candlestick_ochl`, which maintains the original argument order, or `candlestick_ohlc`, which uses the open-high-low-close order. This function will be removed in 1.5
mplDeprecation

どうやら1.5でなくなるらしい
せっかく覚えたのに。。。。orz

Python3 入門:jupyter matplotlib でグラフを描画 日本語が表示されなかった

本日はipython notebookでグラフを描画します。

少しハマったのでメモメモ

まずはコード

In [1]:
 
import pandas as pd
from matplotlib import pyplot as plt
import numpy 
%matplotlib inline 
x = numpy.arange(0, 10, 0.1)
y = numpy.cos(x)
plt.plot(x,y)
plt.show()

f:id:hirhir:20150601004324p:plain

まずはこれだけ

jupyterになって忘れてたけども

%matplotlib inline 
を忘れてて全然グラフが表示されなかった。。。orz
日本語の表示もされないままだ。。。。

だれか教えて下さい。。。。

 

 

 

Python3 入門:while文 他の言語とほぼ変わらず。。。

今回はwhile文です。

8. 複合文 (compound statement) — Python 3.4.3 ドキュメント

これに関しては比較的に素直に感じる

基本的にはwhile直後の条件がTrueの時にステートメントが実行され

条件が変更(False)になったときに終了する。

それ以外はおそらくfor文と同様であろうと考えておく。。。

In [9]:
 
a = 1
while a <=10:
    print(a)
    a += 1
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10

これを元に検証していく

In [10]:
 
a = 1
while a <=10:
    print(a)
    a += 1
else :
    print('LAST ELSE')
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
LAST ELSE

elseはfor文と同じ挙動のようだ

In [11]:
 
a = 11
while a <=10:
    print(a)
    a += 1
else :
    print('LAST ELSE')
 
 
 
 
 
LAST ELSE

やはり条件に入らなくともelseは評価される。

次にbreakとcontinueを試してみる。

In [12]:
 
a = 1
while a <=10:
    print(a)
    a += 1
    break
else :
    print('LAST ELSE')
 
 
 
 
1
In [16]:
 
a = 1
while a <=10:
    print(a)
    a += 1
    continue
    print('Hi')
else :
    print('LAST ELSE')
 
 
 
 
1
2
3
4
5
6
7
8
9
10
LAST ELSE

breakもcontinueもやはりfor文と同様の動きのようだ。

 

 

Python3 入門:for文 list ,dict ,zip ,enumerate ,

今回はfor文です。

8. 複合文 (compound statement) — Python 3.4.3 ドキュメント

他の言語と少し違うので戸惑いますが

これはこれでOKな気がします。

In [1]:
 
for i in [1,2,3]:
    print(i)
 
 
 
1
2
3

まぁこれを基本としていきます。

In [2]:
 
for i in range(5):
    print(i)
 
 
 
 
 
 
0
1
2
3
4

range関数を使用すれば規定回数まで回せる

In [8]:
 
for k , v in enumerate([1,2,3,4,5]):
    print(k,v)
 
 
 
 
 
 
 
0 1
1 2
2 3
3 4
4 5

index と 値が同時に取得したい場合はこちら↑

 

In [9]:
 
for k , v in enumerate([1,2,3,4,5]):
    print(k,v)
else:
    print('last else')
 
 
 
 
 
 
0 1
1 2
2 3
3 4
4 5
last else

elseは最後に実行される。elifは存在しない

In [11]:
 
for k , v in enumerate([]):
    print(k,v)
else:
    print('last else')
 
 
 
 
 
 
last else

 forが実行されなくてもelseは実行される。なんでだよぅ。。。

 

In [13]:
 
for k , v in enumerate([1,2,3,4,5]):
    print(k,v)
    break
else:
    print('last else')
 
 
 
 
 
 
0 1

breakすればelseは実行されない

In [15]:
 
for k , v in enumerate([1,2,3,4,5]):
    if (k == 3):
        print(k,v)
        continue
    else:
        print(k)
else:
    print('last else')
 
 
 
 
 
 
0
1
2
3 4
4
last else

 continue も存在する。この場合elseも実行される。

In [18]:
 
a = [1,2,3,4,5]
b = [6,7,8,9,0]
for i,x in zip(a,b):
    print (i ,x )
 
 
 
1 6
2 7
3 8
4 9
5 0

複数のlistをまとめて回せる

In [21]:
 
a = [1,2,3,4,5]
b = [6,7,8,9,0]
for i in zip(a,b):
    print (i )
print (type(i),i)
 
 
 
(1, 6)
(2, 7)
(3, 8)
(4, 9)
(5, 0)
<class 'tuple'> (5, 0)

まとめるとtupleになりのですが。。。。

まぁそういうもんだと言うことで。。

 

In [23]:
 
a = [1,2,3,4,5]
for i in reversed(a):
    print (i )
print (type(i),i)
 
 
 
5
4
3
2
1
<class 'int'> 1

reversedで逆回転が簡単になります。

辞書型で回す場合はこちら

In [27]:
 
a = {'banana': 'yellow', 'papaya': 'green', 'mango': 'orange'}
for k in a:
    print (k)
 
 
 
 
banana
papaya
mango

 

In [28]:
 
a = {'banana': 'yellow', 'papaya': 'green', 'mango': 'orange'}
for k in reversed(a):
    print (k)
 
 
 
 
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-28-8d70dc091edf> in <module>()
      1 a = {'banana': 'yellow', 'papaya': 'green', 'mango': 'orange'}
----> 2 for k in reversed(a):
      3     print (k)
      4 
      5 

TypeError: argument to reversed() must be a sequence

 シーケンスでないとreversedは使えないらしい

 

In [29]:
 
a = {'banana': 'yellow', 'papaya': 'green', 'mango': 'orange'}
for k ,v in a.items():
    print (k,v)
 
 
 
 
banana yellow
papaya green
mango orange

dict 辞書型の keyと値を取得するにはitemsを使用する。

今回はこれを参考にした

 

 

Python3 入門:if文 制御構文を掘り下げる

Python3 入門 if文

さてさておきまりのif文ですが 入門ということで

8. 複合文 (compound statement) — Python 3.4.3 ドキュメント

はい実にお決まりです。

ただこれ以外にも色々と書き方があるので

ちょっとそこまで掘り下げて見てみる

チュートリアルが不親切な気がするのは、自分だけでしょうか。そうですか。。

ではipython notebookで開始します。

In [1]:
 
a = 9
if (a <= 10) :
    print ('10以下')
elif (a > 10) :
    print('11以上')
else:
    print('その他')
 
 
 
10以下

はい

いたって普通です。これを変数変えてそれぞれ通します。

 

In [13-]:
 
a = 15
if (a < 10) :
    print ('10以下')
elif (a > 10) :
    print('11以上')
else:
    print('その他')
 
 
 
11以上
In [14]:
 
a = 10
if (a < 10) :
    print ('10以下')
elif (a > 10) :
    print('11以上')
else:
    print('その他')
 
 
 
その他

まぁ要は評価がTrueになればステートメントに入るということですね。 

じゃあステートメントに何も書かなかった場合は当然Errorになるのですが

見てみます。

In [15]:
 
a = 10
if (a < 10) : 
elif (a > 10) :
    print('11以上')
else:
    print('その他')


 
 
 
  File "<ipython-input-15-53b3d78700d4>", line 3
    elif (a > 10) :
       ^
IndentationError: expected an indented block
In [16]:
 
a = 10
if (a < 10) :
    print ('10以下')
elif (a > 10) :
else:
    print('その他')
 
 
 

File "<ipython-input-16-f5b0e333b53f>", line 5 else: ^ IndentationError: expected an indented block
In [17]:
 
a = 10
if (a < 10) :
    print ('10以下')
elif (a > 10) :
    print('11以上')
else:
 
 
 
  File "<ipython-input-17-d1c1ffa1211e>", line 6
    else:
         ^
SyntaxError: unexpected EOF while parsing

 

 若干読みやすくするためにコード詰めてますが

elseは返却するエラーが違います。

if elifの箇所を見ればわかりますがそれぞれ1段下の評価式の部分でエラーが出ていますので、このような形になったんでしょう。

このような場合にはpassを使用しますがあまり使わないでしょう

 

In [10]:
 
a = 10
if (a < 10) :
    pass
elif (a > 10) :
    print('11以上')
else:
    print('その他')
 
 
 
その他
In [22]:
 
a = 10
if (a < 10) :
    print ('10以下')
elif (a > 10) :
   pass
else:
    print('その他')
 
 
 
その他
In [25]:
 
a = 10
if (a < 10) :
    print ('10以下')
elif (a > 10) :
    print('11以上')
else:
    pass
a
 
 
Out[25]:
10

 

はい華麗にパスしてますね

次に三項演算子でのif

In [26]:
 
a = 100
print (a % 10 if a > 10 else a * 10)
 
 
 
0

あれ?これは三項なのか?

 

In [32]:
 a = 9
print(a % 10 if a > 10 else a *10 if a==8 else a*100)
 
 
 
900

 三項じゃねぇ!!ガ━━(;゚Д゚)━━ン!!

XLSか!!

for文でも使えるけど

それは次回。。。

いやこれはあんまり深いネストは使いたくないな。。。