2016年3月31日 星期四

[data analysis] 一些基本想法

統計與分析要有互相比較才有意義

比較越多 分析越正確, 對於觀察研究法尤其是如此

觀察研究法:先選定自己要當哪一群人

常常因果互想 正反推論

要知道觀察法的侷限性

2016年3月30日 星期三

[bash] check system CPU busy top 10, check sys memory status, monitor CPU usage every 2 sec


[check system CPU busy top 10]
list entire table
$ ps aux | sort -rk 3,3 | head -n 10


[Monitor the CPU usage every 2 sec]
watch "ps aux | sort -rk 3,3 | head -n 6"


[check sys memory status]

$  cat /proc/meminfo
MemTotal:        3918656 kB
MemFree:         1422332 kB
Buffers:           36868 kB
Cached:           929076 kB
SwapCached:       107124 kB
Active:          1166772 kB
Inactive:        1077372 kB






or you can check out ...

grep MemTotal /proc/meminfo | awk '{print $2}' 

2016年3月29日 星期二

[python] python 3.x read excel xls file in list.

office doc
https://secure.simplistix.co.uk/svn/xlrd/trunk/xlrd/doc/xlrd.html?p=4966

import xlrd
def open_file(path):
    """
    Open and read an Excel file
    """
    book = xlrd.open_workbook(path)
    # print number of sheets
    print book.nsheets
    # print sheet names
    print book.sheet_names()
    # get the first worksheet
    first_sheet = book.sheet_by_index(0)
    # read a row
    print first_sheet.row_values(0)
 
    # get how many rows in this sheet
    print first_sheet.nrows
 
    # read a cell
    cell = first_sheet.cell(0,0)
    print cell
    print cell.value
    # read a row slice
    print first_sheet.row_slice(rowx=0,
                                start_colx=0,
                                end_colx=2)
   return
 
 
 
 

[python] python 3.4 install xlrd to handle excel .xls file.



$ sudo gedit /etc/apt/sources.list
 
add below 
 
deb http://us.archive.ubuntu.com/ubuntu vivid main universe 

save


then

$ sudo apt-get update
 
$sudo apt-get install python3-xlrd 
 
 
 
 
----------------------------------------------------------------------
check the doc 
https://secure.simplistix.co.uk/svn/xlrd/trunk/xlrd/doc/xlrd.html?p=4966
 

[python] python 3.x install pandas under Ubuntu 14.04



$ sudo apt-get install python3-pandas


detail: http://pandas.pydata.org/pandas-docs/stable/install.html




Installing using your Linux distribution’s package manager.

The commands in this table will install pandas for Python 2 from your distribution. To install pandas for Python 3 you may need to use the package python3-pandas.
Distribution Status Download / Repository Link Install method
Debian stable official Debian repository sudo apt-get install python-pandas
Debian & Ubuntu unstable (latest packages) NeuroDebian sudo apt-get install python-pandas
Ubuntu stable official Ubuntu repository sudo apt-get install python-pandas
Ubuntu unstable (daily builds) PythonXY PPA; activate by: sudo add-apt-repository ppa:pythonxy/pythonxy-devel && sudo apt-get update sudo apt-get install python-pandas
OpenSuse & Fedora stable OpenSuse Repository zypper in  python-pandas

[python] 計算日期 min , Max 和求 日期差距(含假日), check the date is what day of the week (or weekend)

from datetime import *

    # create a date( ) list
    datetime_list=[date(2016,6,30),date(2016,6,31).............]


    print(min(datetime_list),max(datetime_list))

    delta_days=max(datetime_list)-min(datetime_list)
    print(delta_days.days)

    delta_days=date(2016,3,28)-date(2016,3,21)
    print(delta_days.days)


#------------- check the date is what day of the week-----------------------------------------
    dt=date(2016,3,20)       
    if dt.isoweekday()==6 or dt.isoweekday()==7:
                print('do someting')
              



detail:   https://docs.python.org/2/library/datetime.html

[IDE] Sublime text 3 Jump to definition and back with ctrl+ mouse left click. Ubuntu/Mac/Windows


Ubuntu: 
create "Default (Linux).sublime-mousemap"
 in ~/.config/sublime-text-3/Packages/User

Mac:
create "Default (OSX).sublime-mousemap" in ~/Library/Application Support/Sublime Text 3/Packages/User


Windows
create "Default (Windows).sublime-mousemap" in %appdata%\Sublime Text 3\Packages\User



pasted below into the file you just created.


[
 {
  "button": "button1",
  "count": 1,
  "modifiers": ["ctrl"],
  "press_command": "drag_select",
  "command": "goto_definition"
 },
 {
  "button": "button2",
  "count": 1,
  "modifiers": ["ctrl"],
  "press_command": "jump_back",
  "command": "jump_back"
 }
]



 save. restart sublime text3 

Then you can press ctrl then click a function to jump to definition,
and press right click will jump back.










2016年3月27日 星期日

[python] python 用 matplotlib 畫出散點圖 scatter 筆記, 標記上點的text

matplotlib  提供能畫的種類

http://matplotlib.org/gallery.html

source code example included.


============================
import matplotlib.pyplot as plt
import numpy as np

#find max under list of list, sublist[x] means the target column
def max_value_lol(inputlist,target_column):
    return max([sublist[target_column] for sublist in inputlist])

#畫出上下兩個圖根據不同data欄位, data is list of list , head_title is list for title
def data_Visualization(head_title,data):
    #print(max_value((data)))
    max_submit_times=max_value_lol(data,1)
    point_scale=6
    #print(len(data))

    fig=plt.figure(figsize=(6,4))
    ax=fig.add_subplot(211)
    N = len(data)
    for item in data :
        x = float(item[6])
        y = float(item[7])
        colors = np.random.rand(N)
        area = np.pi * (15 * (x+y)/2)**2
        #add wording besides the points
        ax.text(x, y, item[0])
        #area = np.pi * (15 * (item[1]/max_submit_times)*point_scale)**2  # 0 to 15 point radiuses
        plt.scatter(x, y, s=area, c=colors, alpha=0.5)

    plt.xlabel(head_title[6])
    plt.ylabel(head_title[7])
    plt.xlim(-0.2,float (max_value_lol(data,6))+0.2)
    plt.ylim(-0.2,float (max_value_lol(data,7))+0.2)
    #plt.legend()




    #second pic
    ax=fig.add_subplot(212)
    for item in data :
        x = float(item[8])
        y = float(item[9])
        colors = np.random.rand(N)
        area = np.pi * (15 * (float(item[8])+float(item[9]))/15)**2
        #area = np.pi * (15 * (item[1]/max_submit_times)*point_scale)**2  # 0 to 15 point radiuses
        plt.scatter(x, y, s=area, c=colors, alpha=0.5)


    plt.xlabel(head_title[8])
    plt.ylabel(head_title[9])
    plt.xlim(-0.2,float (max_value_lol(data,8))+1)
    plt.ylim(-0.2,float (max_value_lol(data,9))+5)

    plt.show()
    return


=====================



[python][data_Visualization] python 3.x install matplotlib under ubuntu 14.04


check matplotlib still here.

$ apt-cache search python3-matplotlib

If you find it like its available then you can install it from

$ sudo apt-get install python3-matplotlib

good to go

---------------

Check what you like.

http://matplotlib.org/gallery.html

2016年3月25日 星期五

[python] python 3.x 抽象型別介紹(2) list MutableSequence Sequence 方法比較

print(dir(Sized))
['__abstractmethods__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry']
[Finished in 0.0s]


print(dir(Container))

['__abstractmethods__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry']
[Finished in 0.0s]


print(dir(Iterable))
['__abstractmethods__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry']
[Finished in 0.0s]

print(dir(Sequence))
['__abstractmethods__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry', 'count', 'index']
[Finished in 0.0s]

print(dir(MutableSequence))
['__abstractmethods__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__setitem__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry', 'append', 'clear', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse']
[Finished in 0.0s]


li=[1,2]
print(dir(li))

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
[Finished in 0.0s]

應該列成excel 來橫向比較比較好看



[python] python 3.4 抽象型別介紹, 實作範例

Part1: 

int 是一個type (型別), list 也是一個型別(type), 而各自不同的type 有自己能使用的method, 方法就如同前幾篇印出來看的結果.

現在, Sequence 是一個型別(type), 當然自己也有自己能用的方法.

但是, list, int 或 str... 等等這種型別, 可以自己產生物件,
ex: a=[1,2,3] => 產生了一個list 物件
ex: t=(1,2,3) =>產生了tuple 物件

而 Sequence 無法產生一個實體物件 => 因此只能算是一個抽象的型別, 概念性的, 不能真的拿來用的型別.

那你會問說, 不能用的Sequence 是要作甚呢?他就像一張賽車的設計藍圖
在Sequence的藍圖中, 畫出了賽車車輪的位置和大小, 畫出了座位的樣子等等等
但是並沒有實際的寫上細節, 沒有真正要用哪些廠牌的資訊, 因為這些細節和實際
製作的工法, 就留給那到藍圖的下游廠商去作就好, 所以換言之, 下游廠商如果接了這個
案子, 就要照著Sequence 的設計藍圖製造, 但是細節由自己決定, 可是不能有少, 否則就
沒有照這個設計圖走了.




所以, 那最源頭的抽象型別是誰呢?我們可以在 Collections Abstract Base Classes,

(https://docs.python.org/3/library/collections.abc.html)


抽象型別的集合中, 看到所有python 定義的抽象型別列表, 如下 (放在collections.abc)

ABC Inherits from Abstract Methods Mixin Methods
Container __contains__
Hashable __hash__
Iterable __iter__
Iterator Iterable __next__ __iter__
Generator Iterator send, throw close, __iter__, __next__
Sized __len__
Callable __call__
Sequence Sized, Iterable, Container __getitem__, __len__ __contains__, __iter__, __reversed__, index, and count
MutableSequence Sequence __getitem__, __setitem__, __delitem__, __len__, insert Inherited Sequence methods and append, reverse, extend, pop, remove, and __iadd__
Set Sized, Iterable, Container __contains__, __iter__, __len__ __le__, __lt__, __eq__, __ne__, __gt__, __ge__, __and__, __or__, __sub__, __xor__, and isdisjoint
MutableSet Set __contains__, __iter__, __len__, add, discard Inherited Set methods and clear, pop, remove, __ior__, __iand__, __ixor__, and __isub__
Mapping Sized, Iterable, Container __getitem__, __iter__, __len__ __contains__, keys, items, values, get, __eq__, and __ne__
MutableMapping Mapping __getitem__, __setitem__, __delitem__, __iter__, __len__ Inherited Mapping methods and pop, popitem, clear, update, and setdefault
MappingView Sized __len__
ItemsView MappingView, Set __contains__, __iter__
KeysView MappingView, Set __contains__, __iter__
ValuesView MappingView __contains__, __iter__
Awaitable __await__
Coroutine Awaitable send, throw close
AsyncIterable __aiter__
AsyncIterator AsyncIterable __anext__ __aiter__

 舉例來看, 在ABC這欄, 有個Sized, 也就是說, python 想營造出一個抽象的東西,
希望能夠處裡有關大小的事情, 所以我的藍圖裡想要有這個概念,
而他右邊那攔 inherits from 是沒有填, 代表Sized 這個概念是原創, 他是第一個頭,
在右邊那攔有個abstracts methods, 他填的是 __len__, 就是說, 希望後人在處裡
有關Sized 的概念時, 請將實作的function 做在__len__裡面, 所以之後, 只要想要找有關
大小的訊息時, 就去你的__len__找, 才不會大家function 名稱不一樣, 搞的亂七八糟的.

另外一個 ABC攔中的 Container 也是類似的, 就是他有個概念是, 我想要找出甚東西
包含在其中, 希望後人們能提供這個方法, 因為還蠻常用的,而你們後人要實作的話
請作在__contains__ 裡面.

那現在看Sequencs , 他繼承了 Sized, Container, Iterable, 這三個人, 所以一定會有
這三個人當初要求要作的方法,但他自己又加入了__getitem__ __len__,這兩個抽象方法

意思是說, 我序列這種類別, 將會提供sized, container, iterable, 和 getitem, len 的方法
如果你要繼承我, 之後你得做出這些東西, 而你看到 __len__不是Sized 裡面就有嗎?
怎又出現在Sequences 的 抽象方法中呢?那是因為 他仍然沒有實作, 繼續擺著, 希望後面的人能作, 而最右邊 Mixin Method, 告訴你, 我還加進了這些方法(已經做好你可以用).

而MutableSequence , 又繼承了Sequence 但列出了一些抽象型別, 等著給別人實作
__getitem__, __setitem__, __delitem__, ...等, 而可用的方法除了繼承了 Sequence
已經有的, 又加入了 append, reversed ,....等等等

這個MutableSequence 抽象型別, 也就是常聽到的[可變序列], 而list , str 都在他的下面,
所以 也就是說, list 得實作這一連串的方法, 加上list 自己想提供的方法, 而 tuple ,
因為是設計來用為不可改變的物件, 當然就不會去繼承 MutableSequence了, 但他仍然
是個序列相關的物件, 所以可見得, tuple 一定是在sequence 之下, 但實際上,
中間還有一層tuple 物件, 而 真正我們在用的實體tuple 是tuple 物件的實作.


you can use it to print the abstract class tree.

def classtree(cls):
       print(cls.__bases__)
       c = list(cls.__bases__)
       for base in c:
            c.extend(classtree(base))
       return c

classtree(MutableSequence)

output:

(<class 'collections.abc.Sequence'>,)
(<class 'collections.abc.Sized'>, <class 'collections.abc.Iterable'>, <class 'collections.abc.Container'>)
(<class 'object'>,) #最上層了
..... #not import so I do not pasted it.


ps. 可以利用 isinstance 看是不是誰的實作, 還有issubclass 看是不是誰的子類別

li=[1,2]
t=(3,4)
print ("---check instance---")
print(isinstance(li,list), isinstance(t,tuple))
print(isinstance(li,Sequence), isinstance(t,Sequence))
print(isinstance(li,MutableSequence), isinstance(t,MutableSequence))

print ("---check list and class level---")
print(type(li),type(t))
print(issubclass(list,MutableSequence),issubclass(MutableSequence,list))
print(issubclass(MutableSequence,Sequence),issubclass(Sequence,MutableSequence))
print(issubclass(Sequence,Sized))



print ("---check tuple and class level---")
print(type(li),type(t))
print(issubclass(tuple,MutableSequence),issubclass(MutableSequence,tuple))
print(issubclass(tuple,Sequence),issubclass(Sequence,tuple))
print(issubclass(Sequence,Sized))

output:
---check instance---
True True
True True
True False
---check list and class level---
<class 'list'> <class 'tuple'>
True False
True False
True
---check tuple and class level---
<class 'list'> <class 'tuple'>
False False
True False
True
[Finished in 0.0s]



Part2 :

     假設你要實作一個Set 的實體instance, 就只要實作 __contains__, __iter__,__len__

(如表格所示), 而其他Mixin Method 都是python 已經幫我們作好的, 直接可以用了.

所以下面的code, 要實作這三個 (init 本來自己就要), 而也看到, and 直接可以用了.

from collections.abc import *

li=[9,1,2]

class ListBasedSet(Set):
     ''' Alternate set implementation favoring space over speed
         and not requiring the set elements to be hashable. '''
     def __init__(self, iterable):
         self.elements = lst = []
         for value in iterable:
             if value not in lst:
                 lst.append(value)
     def __iter__(self):
         return iter(self.elements)
     def __contains__(self, value):
         return value in self.elements
     def __len__(self):
         return len(self.elements) #你在後面+ 100 , s1 印出來值也會變, 可見得真的是跑你作的這邊

s1 = len(ListBasedSet(li)) #拿你實作的來用用看
print(s1)

for x in ListBasedSet(li):  
    print(x)
 
 #你發現 & 不用實作, 直接可以用,因為 __and__在Mixin Method 裡面已經註明他做好了
for x in (ListBasedSet('abcdef') & ListBasedSet('defwxyz')): 
    print(x)
 
 
output:
 
3
9
1
2
d
e
f
[Finished in 0.1s] 















2016年3月23日 星期三

[python] python 3.x 新手的一些小觀念 (tuple, 三元運算子,型別物件 type object )



(0) #是一個整數 0 的 int 物件
(0,)#是一個有一個元素是0的tuple物件


--------------------------------



三元運算子(x if y > 0 else z)=>如果 y 對, 走x, y錯 走z

x,y,z=3,-1,6
print(x if y>0 else z)

x,y,z=3,6,6
print(x if y>0 else z)

6
3
[Finished in 0.1s]


--------------------------------------------------

type is an object also
型別也是一個物件(所以可以assign給別人), 叫做物件型別

ex:
a=3 #a is assigned to int object, value=3
print (type(a)) #the type is int


=><class 'int'>


# type(a) return a type, and type also is an object , so it can assign to atype.
# so we still can check the type of atype.
#which means we will see the return type of type(a)


atype=type(a) 
print(type(atype))


=><class 'type'>

# and it shows <class 'type'>, which means we got a object named type.







[python] python 3.4 print out all method inside object

list

ex:
a=[1,2]
print (dir(a))

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
[Finished in 0.1s]

------------------------

int

a=3
print (dir(a))

['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
[Finished in 0.1s]

---------------------

dict

a={3,}
print (dir(a))

['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
[Finished in 0.1s]



print(dir(str))

['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
[Finished in 0.1s]




****
you can find all type of object has __str__ method, that why print() can
print out all kind of object. (print() can only print string type.)

a=3
print(a)  # in fact is => print(a.__str__())


all __class__ which be used equal to type()

=> type(a) = a.__class__











[python] python 3.4 method 方法解釋 (print out all methods inside an object)

之前說過在python 中


a=5 這行

其中

a 是名稱
5 是一個整數type 的物件

而 這裡要講的方法 (method) 就是

=>這個物件裡可以使用的function.

引用的方式是   「物件.方法名稱(帶入參數 if needed)」

ex: a.len() 就是引用int 物件中的 len() 方法

a=[1,2]

a.append(3) 表示用a.append() 這個fun, 帶入3, 就是把3加入原本a list 物件的尾巴


所以
1.不同型別的物件, 有已經存在的方法(利用dir(物件) 可以印出來看有哪些可用)
ex:
a=[1,2] #list
print (dir(a))

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
[Finished in 0.1s]

2.build in function 也是一種方法
 ex:
a=[1,2,3]
原本用內建fun求長度
len(a)

直譯器看到會轉成
a.__len()__
來作, 所以其實build in function, 是去找當下的物件的method來實作


3.運算子 也是一種方法 ex: + - * /
ex: x+y  => x.__add__(y)







[python] python 3.x 名稱,與動態型別解釋, 多型(Polymorphism)機制

[結論]: python 中任何東西都是物件(object)

[觀念一] 
型別(type)是放在物件(object)身上, 而不是加諸在變數名稱(name)身上 =>造成動態型別

在python 中

當你 a=5 時
他會先建立一個a
1.此時 , a 只是個名稱(name), 沒有任何型別的意義在裡面
接著
2.建立一個5的int 物件(object) , 再把a 指向 5這個type是int的物件 (這一步就叫做:綁定 binding)

由上面例子可以知道, 所以 變數名稱 a 跟 物件的型別(type) 完全沒有關係

a 先建立起來, 當時是沒有任何型別資訊的, 也就是說,

當你有一個 名稱(無論是a or b or xxx )在手上時, 他右邊是誰無所謂, 因為他之後隨時
可以被一直assign 給不同的右邊物件, 可能一下是int , 一下是list (稱為動態型別)

a=3
a=[1,2,3]

所以, 在python 中, 型別是放在 物件身上, 而不是加諸在名稱身上, 跟我們傳統的C 不同.
傳統的c 是 宣告變數名稱時, 就要指定型別.

ex:
int C ;

所以,在python
 一個名稱中,可以有不同的型別物件

a=['abc',5,4.33,[6,6],'string']


[觀念二]  由於動態型別的現象, 造成多型(Polymorphism)機制

當 a=a+b 時, 因為只有在"執行"時, 才知道真正a, b 是怎樣的型別,
他要去對應作不同的 + , 而有不同的機制, 我們稱為多型.

ex: 如果 a ,b 是 int, 那 + 就只是單純數學相加, 但如果 a b 是字串,
那加就會變成 字串相接.


[結論] 所以不管你命名了怎樣的名稱, 其實都是想要運作右邊的物件,因此得到
在python 中, 其實所有東西都是物件在互動, 名稱只算是個代言人而已.









[python] python 3.4 in place change and is (原地修改 和 判斷是否為同一個物件)

#example code

a=b=c=[0,1,2] # a,b,c assign the same address of list
b=b+[3,4,5] # b will create new list to store the new list
c+=[97,98,99] # c is in place change

print(a,b,c)
print (a is b, a is c ) # use 'is' to check is the same object or not


output
[0, 1, 2, 97, 98, 99] [0, 1, 2, 3, 4, 5] [0, 1, 2, 97, 98, 99]
False True
[Finished in 0.0s]

[python] python 3.4 ubuntu 程式碼本身的編碼問題 SyntaxError: encoding problem

python 2.x default 編碼是 ASCII
python 3.x default 是 UTF-8

在撰寫程式碼本身時,如果根據你的python版本,打了不符合的編碼進去,會error.


ex:

# ¶Ù¡A§A¦n¶Ü¡H
print('there will be an error because above line.')

SyntaxError: Non-UTF-8 code starting with '\xb6' in file test.py on line 2, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details



 這是後在一開頭加入
# -*- coding:utf-8 -*-

重新build, 就ok了.

****
但不要誤會了, 加了這一行, 只是提醒編輯器在存檔的時候, 用這種編碼存檔, 但如果
你自己存檔時, 又在編輯器裡面選擇其他編碼, 當然還是會被蓋過去, 存成你在編輯器設定
裡的編碼.

[python] python 3.4 import 其他檔案的function, 和辨別是模組還是main. (模組名稱 __name__)



import 其他 python 檔案內的function 來用
在同一個資料夾下 建立下列兩個檔案

main.py, module.py

其中
main.py  內容是
-------------------------------------------------------------------------
import module as m 
#module 就是檔案名稱 import近來後重新命名當m, 之後用m.xxx提取方法

print('Hello Python')
print('pi is ' + str(m.pi))
print('gcd of 24 and 16 is ' + str(m.add(24, 16)))

if __name__ == '__main__':
    print('main as main program')
else:
    print('main as module')

--------------------------------------------------------------------------
module.py 內容是
 ------------------------------------------------------------------------
pi = 3.14

def add(a, b):
    a=a+b
    return a


if __name__ == '__main__':
    print('module as main program')
else:
    print('module as module')
--------------------------------------------------------------------------------

去main 中 執行:

module as module
Hello Python
pi is 3.14
gcd of 24 and 16 is 40
main as main program
[Finished in 0.1s]









[python] python 3.4 install beautifulsoup4

install beautifulsoup4

$ sudo apt-get install python3-bs4

[python] build python3.4 under sublime text3; Ubuntu and windows

Go to sublime-text3
=>Tools =>build system =>New build system

past below content! and accroding your python ver

to change the command /usr/bin/env python3.x
#Mac
{
"cmd": ["/Library/Frameworks/Python.framework/Versions/3.4/bin/python3", "-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python"
}

#Ubuntu
{
    "shell_cmd": "/usr/bin/env python3.4 ${file}",
    "selector": "source.python",
    "file_regex": "^(...*?):([0-9]*):?([0-9]*)",
    "working_dir": "${file_path}",
}

or

#Windows

{
    "cmd": ["C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python35-32\\python.exe", "-u", "$file"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.python"
}



=========================
reopen sublime
go to build system, select ptyhon3.4 which the name you saved above
ctrl+B (Build)

=====================================

you can test it by

import sys
print("python ver.:" ,sys.version)
print sys.path #2.x is OK, because print is command at that time.
print (sys.path) #3.x is ok, print change to function.

[python] python3.4.0 常用工具筆記


檢查python 你用的到底是在哪裡,還有版本
import sys
print (sys.path) #印出python 使用的路徑 來確定版本
print("python ver.:" ,sys.version) #印出使用版本



印出所有build in function, 看看哪些可用
print (dir(__builtins__))



利用type() 查詢物件型別
ex: type(3)  
<class 'int'>



印出object 內含的method
a=[1,2,3]
print (dir(a))

2016年3月20日 星期日

[MySQL] MySQL UPDATE

將現有欄位中的資料內容,拆兩個字元,填入新的欄位

基本
UPDATE table_name SET column_name = newvalue;

ex:
UPDATE table_name SET new_column_name=RIGHT(original_column_name,2);

從目前的 original_column_name欄中的值,從右邊挑兩個位元出來,放數
new_column_name 中


[MySQL] MySQL 常用 String function for CHAR ,VARCHAR

從某欄的值當中右邊數來2個字元所得到的資料

SELECT RIGHT(欄位名稱 , 2) FROM my_table;
SELECT LEFT(欄位名稱 , 2) FROM my_table;

選取第逗號前的所有內容
SELECT SUBSTRIJG_INDEX(欄位名稱, ',' , 1) From my_table;

選取一段字串,起始位置5,往後找3
SELECT SUBSTRING (your_string, 5 ,3) FROM table;

整組字串大小寫轉換
SELECT UPPER('string')
SELECT LOWER('string')

從左邊移除空白
SELECT LTRIM('   dog');
SELECT RTRIM('xxxx    ');

回報字串長度
SELECT LENGTH('xxxxxx');


******
String Function 修改的是字串的copy, 原始資料不變。

2016年3月19日 星期六

[MySQL] 1NF 資料正規化守則。


Rule1:
具單元性ATOMIC, 同一個欄位中,不會儲存好幾個類型相同的資料。

Ex: 有個欄位叫做興趣: 裡面有 游泳,看電影,打球。
除非這就是你想使用資料的最小單位,否則
全部放在一個欄位裡面,將無法準確搜尋。


Rule2:
需要具有單元性,且不會用好幾個欄位,儲存相同類型的資料。

ex: 你不該設計兩個不同名子的欄位而放類似的內容,像是
一個欄位叫做學生1,另一個叫做學生2,即便兩個學生的姓名是不同的,
但這違反了Rule2.


[MySQL] MySQL 常用方法(2) ALTER + MODIFY / CHANGE

新增primary key

ALTER TABLE my_table
ADD COLUMN contact_id INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (contact_id);


將舊有的某欄位 改成primary key 來用,且將原本欄位名稱 name 改成 contact_id
ALTER TABLE my_table
CHANGE COLUMN name contact_id INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (contact_id);


改table name

ALTER TABLE oldname RENAME TO new_table_name;

改變某一欄位的名稱 和資料型別
ALTER TABLE my_table
CHANGE COLUMU oldname new_name VARCHAR(100);

如果要連續改很多欄位 只要用, 接著就可以。

ALTER TABLE my_table
CHANGE COLUMU oldname new_name VARCHAR(100),
CHANGE COLUMU oldnameb new_nameb VARCHAR(30),
CHANGE COLUMU oldnamec new_namec VARCHAR(100);

NOTE: 如果資料型別改小,原本資料會被截斷。 varchar 100 -> 10 , 則裡面的string 可能會被截斷。造成資料遺失。


只想改動資料型別。不想換名稱時。
ALTER TABLE my_table
MODIFY COLUMN old)name VARCHAR(100);


想刪除某欄位
ALTER TABLE my_table
DROP COLUMN xxxx;



移除主鍵 primary key
ALTER TABLE your_table DROP PRIMARY KEY;

設定某欄為AUTO_INCREMENT
ALTER TABLE your_table CHANGE your_id your_id INT(11) NOT NULL AUTO_INCREMENT;

反之,刪除某欄的AUTO_INCREMENT
ALTER TABLE your_table CHANGE your_od your_id INT(11) NOT NULL;

*一個table 只能有一欄可以加上AUTO_INCREMENT,且為整數型別,不含NULL.


#######ALTER 小結

ALTER TABLE
以保持現有資料表內容為前提,修改資料表名稱或整體結構

ALTER ADD
把資料欄安插到表中指定的順序

ALTER DROP
從資料表中刪除資料欄

ALTER CHANGE
同時修改現有資料欄位名稱與型別

ALTER MODIFY
只修改型別



















[MySQL] 如何登入Ubuntu MySQL client.


MySQL server will be started automatically after the installation. You CANNOT start another instance! To check the mysqld process:

$ ps aux | grep mysqld
mysql     1113  0.0  0.3 484432 50024 ?        Ssl  18:33   0:08 /usr/sbin/mysqld

To start a MySQL client:

$ mysql -u root -p
   // Enter the password for the root user you have set when you install the server.

Once you loging your client, you can start CREATE DATABASE xxxx , and use others SQL commadn.

[MySQL] Ubuntu 14.04 刪除所有舊的MySQL, 並重新安裝。

[Delete old mysql, and reinstall the new one.]


delete old mysql

sudo apt-get autoremove --purge mysql-server-5.0
sudo apt-get remove mysql-server
sudo apt-get autoremove mysql-server
sudo apt-get remove mysql-common

clear the package.

 dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P


Reinstall new server.

sudo apt-get install mysql-server
sudo apt-get install mysql-client

在剛才重新安裝的途中,他就會叫你設定root 密碼了。之後登入時會用到。


[MySQL] MySQL 常用方法(1) CREATE, SHOW, INSERT INTO, WHERE, NOT, AND OR,SELECT,UPDATE

MySQL 常用方法。 Some quick tips.
CREATE, SHOW, INSERT INTO, WHERE, NOT, AND OR,SELECT,UPDATE


[Database 建立刪除相關]====

建立database
mysql>CREATE DATABASE database_name;

看看目前有哪些database了
mysql>show databases;

進去準備使用這個database
mysql>USE database_name;




[Table 建立刪除相關]====

建立table,
mysql>CREATE TABLE `table_info` (
 `name` varchar(50) default NULL,
 `last_seen` varchar(50) default NULL,
 `appearance` varchar(50) default NULL,
 `activities` varchar(50) DEFAULT 1.00 NOTNULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

ps.可以指定接受不接受NULL, 還有設定default值

show出目前所有database_name 下有的table 有哪些?
mysql>show tables;

show 出目前table_info的樣子
mysql>SELECT * FROM table_info;

刪除整個table
mysql> DROP TABLE table_info;

看看某個table 當初怎麼建立的
SHOW CREATE TABLE xxx_table;





[Table 操作]====

新增值(照著原本順序,直接用VALUES即可,不用再打欄位名稱。)
mysql>INSERT INTO table_info VALUES ('Pickles', 'Jack Green\'s party', 'M, orange hair, blue suit, huge feet','mime');

如果只要新增部分資料欄,那就要打出要新增的是哪一欄位。
INSERT INTO table_info
( name,last_seen)
VALUES
 ('Pickles', 'Jack Green\'s party');


選出你要的特定資料
挑出table內名子叫Paul的人,列出他在table中所以的欄位資訊。

SELECT * FROM my_table
WHERE name='Paul';

挑出table內名子叫Paul的人且體重要大於80,列出他在table中address, years 的欄位資訊。
SELECT address, years  FROM my_table
WHERE name='Paul' AND weight>80;

LIKE 配合 % 和 _

找first_name 中,前面不管有多少字,結尾是ul 的。
SELECT first_name FROM my_table
WHERE first_name LIKE '%ul';

找first_name 中,前面只能有一個字,結尾是ul 的。
SELECT first_name FROM my_table
WHERE first_name LIKE '_ul';

挑出有含a , b, c ,d 的

挑出在my_table中,jobs 欄位是a, b, c, d 的人,並列出他的first_name.
SELECT first_name FROM my_table
WHERE jobs IN (a,b,c,d);

挑出在my_table中,jobs 欄位不是a, b, c, d 的人,並列出他的first_name.
SELECT first_name FROM my_table
WHERE jobs NOT IN (a,b,c,d);


IS NULL 可以用來檢查是否為NULL

SELECT * FROM my_tables
WHERE NOT main IS NULL.
或者,兩個用法都可。
SELECT * FROM my_tables
WHERE main NOT IS NULL.

AND / OR  + NOT
WHERE +NOT
區間用 WHERE xxxx BETWEEN 小 AND 大


 UPDATE + SET
把my_table 中,type欄位裡面的舊值改成新值

UPDATE my_table SET type='newvalue' WHERE type='oldvalue';

把my_table 中 name 叫做a, 或 b的商品 cost 都累加一。
UPDATE my_table SET cost=cost+1 WHERE name='a' OR drink_name='b';





















2016年3月15日 星期二

[python] python 3.5 install lxml with binary under windows 8


1.
go to http://www.lfd.uci.edu/~gohlke/pythonlibs/

download

to desketop




2. go to the version of python file directory. (The IDE you're using....)

cmd

cd C:\Users\xxxxx\AppData\Local\Programs\Python\Python35-32\Scripts>

3. pip install wheel

or any kind of way you install the wheel, it should be appear in this folder with pip.exe.



3. pip install c:\Users\xxxxx\Desktop\lxml-3.5.0-cp35-none-win32.whl

it sholud be ok.