2020年1月14日 星期二

PWA 偽裝術:manifest.json

https://jonny-huang.github.io/angular/training/19_pwa/


jonny-huang.github.io

PWA 偽裝術:manifest.json

Jonny Huang

什麼是 漸進式網頁應用程式(PWA) 其在網路上已經有很多篇文章了,筆者看完得到的結論就是-讓以前只有 APP 做得到的事情,現在在 Web 上也可以做到,而現在之所以能實現是因為新版的瀏覽器增加了相關功能,言下之意就是瀏覽器的版本很重要,後續測試會以 Google Chrome 為主。
我們可以看一下 W3C 最新的 Web App Manifest 草案,可以看到編輯者主要來自 Mozilla、Intel、Google、Microsotf,這意味著主流瀏覽器都將支援。

雖然 Apple 並沒有在名單內,不過 查看 WebKit Feature Status 可以看到 Web App Manifest 已經列入考慮選項內,這也表示如果沒有意外 Safari 未來也將支援。

參考文件:你的首個 Progressive Web App

manifest.json

manifest.jsonService Work 可以說是 PWA 最核心的功能,比起較複雜的 Service Work,本篇先練習如何透過 manifest.json 就可以讓 Web APP 看起來跟一般的 APP 一樣。
這邊我們拿之前練習到 Angular 服務 的程式來當範例。
first-app_2017-09-14.zip
若要下載請記得先透過指令 npm install 來重新安裝 package。
我們在專案目錄下的 src 資料夾內建立一個 manifest.json,並添加相關設定值,以及應用程式圖示,下面是比較常用的設定值:
若是 Angular 專案,別忘了將 manifest.json 加到 .angular-cli.jsonassets,這樣建置時才會將 manifest.json 一併複製。
欄位 說明
name 應用程式名稱
short_name 應用程式簡稱
display 顯示模式:fullscreenstandaloneminimal-uibrowser
start_url 設定起始頁面
description 應用程式描述
scope 相關設定影響範圍
background_color 啟動畫面(Splashscreen)背景顏色
theme_color 主題顏色
dir 排版方式:ltr(由左到右)、rtl(由右到左)、auto
lang 應用程式語系
orientation 螢幕方向:anynaturallandscapeportraitportrait-primaryportrait-secondarylandscape-primarylandscape-secondary
icons 應用程式圖示
其他設定可參考
W3C - Web App Manifest
MDN - WebExtensions:manifest.json
我們先添加應用程式名稱與圖示:

  1. {
  2. "name": "WebApp - First App",
  3. "short_name": "FirstApp",
  4. "description": "My First APP",
  5. "icons": [
  6. {
  7. "src": "./assets/images/android_048.png",
  8. "sizes": "48x48",
  9. "type": "image/png"
  10. },
  11. {
  12. "src": "./assets/images/android_096.png",
  13. "sizes": "96x96",
  14. "type": "image/png"
  15. },
  16. {
  17. "src": "./assets/images/android_144.png",
  18. "sizes": "144x144",
  19. "type": "image/png"
  20. },
  21. {
  22. "src": "./assets/images/android_192.png",
  23. "sizes": "192x192",
  24. "type": "image/png"
  25. },
  26. {
  27. "src": "./assets/images/android_512.png",
  28. "sizes": "512x512",
  29. "type": "image/png"
  30. }
  31. ]
  32. }

找不到圖示的,可以像筆者一樣去下載 Metro Studio,註冊帳號後就會收到一組免費序號,目前版本累積圖示有 7000 多個,可以自己調整圖示大小、顏色、旋轉、外框,也提供多種匯出格式,不過最重要的是可以用於商業用途
接著就是將 manifest.json 關連到網頁上,開啟 src\index.html,將下列語法加入 head tag 內。
<link rel="manifest" href="manifest.json">
  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>FirstApp</title>
  6. <base href="./">
  7. <meta name="viewport" content="width=device-width, initial-scale=1">
  8. <link rel="icon" type="image/x-icon" href="favicon.ico">
  9. <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
  10. <link rel="manifest" href="manifest.json">
  11. </head>
  12. <body oncontextmenu="return false">
  13. <app-root></app-root>
  14. </body>
  15. </html>

Safari

目前針對 Safari 瀏覽器我們需要在網頁內的 head tag 加入額外設定,尤其需要針對不同 iOS 裝置提供對應尺寸的圖示,當 Safari 正是支援 W3C 標準後應該就可以省略,修改設定如下:
<meta name="apple-mobile-web-app-capable" content="yes">
  1. ...
  2. <head>
  3. ...
  4. <link rel="manifest" href="manifest.json">
  5. <!-- Apple Safari -->
  6. <meta name="apple-mobile-web-app-capable" content="yes">
  7. <meta name="apple-mobile-web-app-status-bar-style" content="black">
  8. <meta name="apple-mobile-web-app-title" content="WebApp - First App">
  9. <link rel="apple-touch-icon" href="./assets/images/android_057.png" sizes="57x57">
  10. <link rel="apple-touch-icon" href="./assets/images/android_060.png" sizes="60x60">
  11. <link rel="apple-touch-icon" href="./assets/images/android_072.png" sizes="72x72">
  12. <link rel="apple-touch-icon" href="./assets/images/android_076.png" sizes="76x76">
  13. <link rel="apple-touch-icon" href="./assets/images/android_114.png" sizes="114x114">
  14. <link rel="apple-touch-icon" href="./assets/images/android_120.png" sizes="120x120">
  15. <link rel="apple-touch-icon" href="./assets/images/android_144.png" sizes="144x144">
  16. <link rel="apple-touch-icon" href="./assets/images/android_152.png" sizes="152x152">
  17. <link rel="apple-touch-icon" href="./assets/images/android_167.png" sizes="167x167">
  18. <link rel="apple-touch-icon" href="./assets/images/android_180.png" sizes="180x180">
  19. </head>
  20. ...
參考文件:Configuring Web Applications

Windows:加到桌面

執行指令 ng serve 來啟動 Angular 專案,點選 Chrome 瀏覽器 加到桌面 功能,從出現的對話視窗可以看到,圖示跟應用程式名稱都是來自 manifest.json,確認後可以發現桌面多一個類似應用程式的捷徑


點選捷徑啟動應用程式,可以發現透過 Chrome 預設開啟時就我們隱藏網址列與工具列,若不是透過滑鼠右鍵的功能選單,還真的很難發現這是 Web App,跟我們在 Electron:跨平台的視窗應用程式 所做的步驟比起來是否更加簡單。

如果確定網站不會使用到滑鼠右鍵,那可以更進一步把右鍵隱藏,讓一般使用者幾乎無法察覺。

start_url

接下來我們安裝 Chrome 擴充功能-Web Server for Chrome,透過它可以快速建立一個網頁伺服器,我們只要將資料夾設定為 Angular 輸出資料夾 dist,接著啟動 Web Server 就可以開始使用,在這邊筆者特別將連接埠改為 8081,透過瀏覽器檢視 http://10.0.1.107:8081。


再將 Web 程式加到桌面,我們可以注意到因為 Angular 路由規則的關係預設會被導到待辦事項,所以網址會變成 http://10.0.1.107:8081/home/to-do-list。

接著透過桌面捷徑啟動,可以發現找不到 /home/to-do-list 的錯誤訊息,這是因為 Angular 是一個 SPA 網頁應用程式,所以除了首頁(index.html)之外就沒有任何實體網頁,網址列上的網址都是 Angular 路由模組產生的路由路徑,實際上並不存在。


我們可以透過設定 manifest.jsonstart_url 來解決這個問題,將 start_url 設定為首頁-index.html,透過添加此屬性,可以強制改由 start_url 所指定的網址來開啟。
  1. {
  2. "name": "WebApp - First App",
  3. "short_name": "FirstApp",
  4. "start_url": "./index.html",
  5. "description": "My First APP",
  6. "icons": [...]
  7. }
重新建立潔淨後再執行應該就能正常顯示了。

Android:加到主畫面

接著我們改用 Android 手機的 Chrome 瀏覽器連結網站 http://10.0.1.107:8081。

透過 Chrome 加到主畫面 功能,我們一樣可以將網站釘選到手機桌面,只是預設名稱會改用 應用程式簡稱(short_name),點選新增後就會在手機桌面建立捷徑。



點選捷徑來啟動 Web App 可以發現在網頁載入的等待過程會有 啟動畫面(Splashscreen),開啟後可以發現一樣是沒有網址列的滿版網頁。


最後我們在 manifest.json 內在透過 background_color 來設定啟動畫面的背景顏色,透過 theme_color 來設定手機的主題顏色,修改如下:
  1. {
  2. "name": "WebApp - First App",
  3. "short_name": "FirstApp",
  4. "start_url": "./index.html",
  5. "background_color": "#5490CC",
  6. "theme_color": "#F4981F",
  7. "description": "My First APP",
  8. "icons": [...]
  9. }
重新建立捷徑後再啟動,可以看到啟動畫面的背景顏色與手機上方的狀態列顏色都改變了。


first-app_2017-09-25.zip

2019年10月29日 星期二

tesseract ocr 圖像辨識安裝

安裝

  1. 連到 https://github.com/UB-Mannheim/tesseract/wiki
  2. 下載 tesseract-ocr-w32-setup-v4.0.0-beta.1.20180608.exe
  3. 安裝完後需要把安裝路徑加入到 path 裡面,例如 C:\Program Files (x86)\Tesseract-OCR
  4. 添加 TESSDATA_PREFIX 環境變數,內容為 C:\Program Files (x86)\Tesseract-OCR\tessdata
  5. 開啟 console, 輸入 tesseract --version 驗證是否有成功安裝

簡單使用教學

tesseract.exe test.png out.txt
Reference:
https://github.com/tesseract-ocr/tesseract/wiki

2019年9月19日 星期四

pandas查看數據值列的彙總統計



import numpy as np
import requests
import pandas as pd
import datetime

import csv, json, sys
import matplotlib.pyplot as plt

def transform_date(date):
        y, m, d = date.split('/')
        return str(int(y)+1911) + '/' + m  + '/' + d  #民國轉西元
   
def transform_data(data):
    data[0] = datetime.datetime.strptime(transform_date(data[0]), '%Y/%m/%d')
    data[1] = int(data[1].replace(',', ''))  #把千進位的逗點去除
    data[2] = int(data[2].replace(',', ''))
    data[3] = float(data[3].replace(',', ''))
    data[4] = float(data[4].replace(',', ''))
    data[5] = float(data[5].replace(',', ''))
    data[6] = float(data[6].replace(',', ''))
    data[7] = float(0.0 if data[7].replace(',', '') == 'X0.00' else data[7].replace(',', ''))  # +/-/X表示漲/跌/不比價
    data[8] = int(data[8].replace(',', ''))
    #print(data)
    return data

def transform(data):
    return [transform_data(d) for d in data]



       


def save_data_file(path, stock_date,stock_id):
    #http://www.twse.com.tw/exchangeReport/STOCK_DAY?date=20190901&stockNo=1314
    url = 'http://www.twse.com.tw/exchangeReport/STOCK_DAY?date=%s&stockNo=%s' % ( stock_date, stock_id)
    r = requests.get(url)
    jdata = r.json()

    filename = '%s%s_%s.json' % (path, stock_id, stock_date)
    with open(filename, 'w') as json_file:
      json.dump(jdata, json_file)
    return jdata
   
def get_data_file(path, stock_date,stock_id):
    filename = '%s%s_%s.json' % (path, stock_id, stock_date)
    with open(filename) as f:
      jdata = json.load(f)
    #print(transform(jdata['data']))
    #print(jdata['data'])
    return (transform(jdata['data']))

def get_data_result(data,stock_no):
    s = pd.DataFrame(data)
    s.columns = ['date', 'shares', 'amount', 'open', 'high', 'low', 'close', 'change', 'turnover']
                                                                                                        #"日期","成交股數","成交金額","開盤價","最高價","最低價","收盤價","漲跌價差","成交筆數"
    stock = []
    for i in range(len(s)):
        stock.append(stock_no)
    s['stockno'] = pd.Series(stock ,index=s.index)                                                          #新增股票代碼欄,之後所有股票進入資料表才能知道是哪一張股票
    datelist = []
    for i in range(len(s)):
        datelist.append(s['date'][i])
    s.index = datelist  #索引值改成日期
    s2 = s.drop(['date'],axis = 1)  #刪除日期欄位
    mlist = []
    for item in s2.index:
        mlist.append(item.month)
    s2['month'] = mlist  #新增月份欄位
   
   
    return s2

def process_stock():
    path = 'json/'
    date = ['20190901']
    listID = ['2330']

    for i in range(len(listID)):
        for month in range(len(date)):
            #result = save_data_file(path, date[month], listID[i])
            result = get_data_file(path, date[month], listID[i])
            result = get_data_result(result, listID[i])
            print(result)
            #print(result.groupby('month').close.count())  #每個月幾個營業日
            #print(result.groupby('month').shares.sum())  #每個月累計成交股數
           
            dfTotal = result['amount']

            #print('mean = %s' % (dfTotal.mean()) )
            #print('std = %s' % (dfTotal.std()) )
            #print('max = %s' % (dfTotal.max()) )
            #print('min = %s' % (dfTotal.min()) )
            #print('median = %s' % (dfTotal.median()) )
            print('%s' % (dfTotal.describe()) )
           
            dfTotal = result['close']
            #print('mean = %s' % (dfTotal.mean()) )
            #print('std = %s' % (dfTotal.std()) )
            #print('max = %s' % (dfTotal.max()) )
            #print('min = %s' % (dfTotal.min()) )
            #print('median = %s' % (dfTotal.median()) )
            print('%s' % (dfTotal.describe()) )

process_stock()

def process_stock():
    df = pd.read_csv(r'./AQI.csv')
    dfTotal = df['AQI']
    print('mean = %s' % (dfTotal.mean()) )
    print('std = %s' % (dfTotal.std()) )
    print('max = %s' % (dfTotal.max()) )
    print('min = %s' % (dfTotal.min()) )
    print('median = %s' % (dfTotal.median()) )

Pandas速查

本文翻譯自文章:Pandas Cheat Sheet - Python for Data Science,同時添加了部分註解。
對於數據科學家,無論是數據分析還是數據挖掘來說,Pandas是一個非常重要的Python包。它不僅提供了很多方法,使得數據處理非常簡單,同時在數據處理速度上也做了很多優化,使得和Python內置方法相比時有了很大的優勢。
如果你想學習Pandas,建議先看兩個網站。
(1)官網:Python Data Analysis Library
(2)十分鐘入門Pandas:10 Minutes to pandas
在第一次學習Pandas的過程中,你會發現你需要記憶很多的函數和方法。所以在這裡我們彙總一下Pandas官方文檔中比較常用的函數和方法,以方便大家記憶。同時,我們提供一個PDF版本,方便大家打印。pandas-cheat-sheet.pdf

關鍵縮寫和包導入

在這個速查手冊中,我們使用如下縮寫:
df:任意的Pandas DataFrame對象
s:任意的Pandas Series對象
同時我們需要做如下的引入:

import pandas as pd
import numpy as np

導入數據

  • pd.read_csv(filename):從CSV文件導入數據
  • pd.read_table(filename):從限定分隔符的文本文件導入數據
  • pd.read_excel(filename):從Excel文件導入數據
  • pd.read_sql(query, connection_object):從SQL表/庫導入數據
  • pd.read_json(json_string):從JSON格式的字符串導入數據
  • pd.read_html(url):解析URL、字符串或者HTML文件,抽取其中的tables表格
  • pd.read_clipboard():從你的粘貼板獲取內容,並傳給read_table()
  • pd.DataFrame(dict):從字典對象導入數據,Key是列名,Value是數據


導出數據

  • df.to_csv(filename):導出數據到CSV文件
  • df.to_excel(filename):導出數據到Excel文件
  • df.to_sql(table_name, connection_object):導出數據到SQL表
  • df.to_json(filename):以Json格式導出數據到文本文件


創建測試對象

  • pd.DataFrame(np.random.rand(20,5)):創建20行5列的隨機數組成的DataFrame對象
  • pd.Series(my_list):從可迭代對象my_list創建一個Series對象
  • df.index = pd.date_range('1900/1/30', periods=df.shape[0]):增加一個日期索引


查看、檢查數據

  • df.head(n):查看DataFrame對象的前n行
  • df.tail(n):查看DataFrame對象的最後n行
  • df.shape():查看行數和列數
  • df.info():查看索引、數據類型和內存信息
  • df.describe():查看數值型列的彙總統計
  • s.value_counts(dropna=False):查看Series對象的唯一值和計數
  • df.apply(pd.Series.value_counts):查看DataFrame對象中每一列的唯一值和計數


數據選取

  • df[col]:根據列名,並以Series的形式返回列
  • df[[col1, col2]]:以DataFrame形式返回多列
  • s.iloc[0]:按位置選取數據
  • s.loc['index_one']:按索引選取數據
  • df.iloc[0,:]:返回第一行
  • df.iloc[0,0]:返回第一列的第一個元素


數據清理

  • df.columns = ['a','b','c']:重命名列名
  • pd.isnull():檢查DataFrame對象中的空值,並返回一個Boolean數組
  • pd.notnull():檢查DataFrame對象中的非空值,並返回一個Boolean數組
  • df.dropna():刪除所有包含空值的行
  • df.dropna(axis=1):刪除所有包含空值的列
  • df.dropna(axis=1,thresh=n):刪除所有小於n個非空值的行
  • df.fillna(x):用x替換DataFrame對象中所有的空值
  • s.astype(float):將Series中的數據類型更改為float類型
  • s.replace(1,'one'):用『one'代替所有等於1的值
  • s.replace([1,3],['one','three']):用'one'代替1,用'three'代替3
  • df.rename(columns=lambda x: x + 1):批量更改列名
  • df.rename(columns={'old_name': 'new_ name'}):選擇性更改列名
  • df.set_index('column_one'):更改索引列
  • df.rename(index=lambda x: x + 1):批量重命名索引


數據處理:Filter、Sort和GroupBy

  • df[df[col] > 0.5]:選擇col列的值大於0.5的行
  • df.sort_values(col1):按照列col1排序數據,默認升序排列
  • df.sort_values(col2, ascending=False):按照列col1降序排列數據
  • df.sort_values([col1,col2], ascending=[True,False]):先按列col1升序排列,後按col2降序排列數據
  • df.groupby(col):返回一個按列col進行分組的Groupby對象
  • df.groupby([col1,col2]):返回一個按多列進行分組的Groupby對象
  • df.groupby(col1)[col2]:返回按列col1進行分組後,列col2的均值
  • df.pivot_table(index=col1, values=[col2,col3], aggfunc=max):創建一個按列col1進行分組,並計算col2和col3的最大值的數據透視表
  • df.groupby(col1).agg(np.mean):返回按列col1分組的所有列的均值
  • data.apply(np.mean):對DataFrame中的每一列應用函數np.mean
  • data.apply(np.max,axis=1):對DataFrame中的每一行應用函數np.max


數據合併

  • df1.append(df2):將df2中的行添加到df1的尾部
  • df.concat([df1, df2],axis=1):將df2中的列添加到df1的尾部
  • df1.join(df2,on=col1,how='inner'):對df1的列和df2的列執行SQL形式的join


數據統計

  • df.describe():查看數據值列的彙總統計
  • df.mean():返回所有列的均值
  • df.corr():返回列與列之間的相關係數
  • df.count():返回每一列中的非空值的個數
  • df.max():返回每一列的最大值
  • df.min():返回每一列的最小值
  • df.median():返回每一列的中位數
  • df.std():返回每一列的標準差

2019年9月18日 星期三

公開資料取股價存成json



import numpy as np
import requests
import pandas as pd
import datetime

import csv, json, sys
import matplotlib.pyplot as plt

def transform_date(date):
        y, m, d = date.split('/')
        return str(int(y)+1911) + '/' + m  + '/' + d  #民國轉西元
   
def transform_data(data):
    data[0] = datetime.datetime.strptime(transform_date(data[0]), '%Y/%m/%d')
    data[1] = int(data[1].replace(',', ''))  #把千進位的逗點去除
    data[2] = int(data[2].replace(',', ''))
    data[3] = float(data[3].replace(',', ''))
    data[4] = float(data[4].replace(',', ''))
    data[5] = float(data[5].replace(',', ''))
    data[6] = float(data[6].replace(',', ''))
    data[7] = float(0.0 if data[7].replace(',', '') == 'X0.00' else data[7].replace(',', ''))  # +/-/X表示漲/跌/不比價
    data[8] = int(data[8].replace(',', ''))
    #print(data)
    return data

def transform(data):
    return [transform_data(d) for d in data]



       


def save_data_file(path, stock_date,stock_id):
    #http://www.twse.com.tw/exchangeReport/STOCK_DAY?date=20190901&stockNo=1314
    url = 'http://www.twse.com.tw/exchangeReport/STOCK_DAY?date=%s&stockNo=%s' % ( stock_date, stock_id)
    r = requests.get(url)
    jdata = r.json()

    filename = '%s%s_%s.json' % (path, stock_id, stock_date)
    with open(filename, 'w') as json_file:
      json.dump(jdata, json_file)
    return jdata
   
def get_data_file(path, stock_date,stock_id):
    filename = '%s%s_%s.json' % (path, stock_id, stock_date)
    with open(filename) as f:
      jdata = json.load(f)
    #print(transform(jdata['data']))
    #print(jdata['data'])
    return (transform(jdata['data']))

def get_data_result(data,stock_no):
    s = pd.DataFrame(data)
    s.columns = ['date', 'shares', 'amount', 'open', 'high', 'low', 'close', 'change', 'turnover']
                                                                                                        #"日期","成交股數","成交金額","開盤價","最高價","最低價","收盤價","漲跌價差","成交筆數"
    stock = []
    for i in range(len(s)):
        stock.append(stock_no)
    s['stockno'] = pd.Series(stock ,index=s.index)                                                          #新增股票代碼欄,之後所有股票進入資料表才能知道是哪一張股票
    datelist = []
    for i in range(len(s)):
        datelist.append(s['date'][i])
    s.index = datelist  #索引值改成日期
    s2 = s.drop(['date'],axis = 1)  #刪除日期欄位
    mlist = []
    for item in s2.index:
        mlist.append(item.month)
    s2['month'] = mlist  #新增月份欄位
   
   
    return s2


path = 'json/'
date = ['20190901']
listID = ['2330']

for i in range(len(listID)):
    for month in range(len(date)):
        #result = save_data_file(path, date[month], listID[i])
        result = get_data_file(path, date[month], listID[i])
        result = get_data_result(result, listID[i])
        print(result)
        print(result.groupby('month').close.count())  #每個月幾個營業日
        print(result.groupby('month').shares.sum())  #每個月累計成交股數

使用Python抓取台股證交所每日股價資料進行分析

使用網址「http://www.twse.com.tw/exchangeReport/STOCK_DAY?date=20180817&stockNo=2330」,由證交所所提供的網址,可以經由stockNo指定股票編號,date指定股票日期,以json格式回傳一個月的股價與交易量,以下為回傳結果。
{"stat":"OK","date":"20180817","title":"107年08月 2330 台積電           各日成交資訊","fields":["日期","成交股數","成交金額","開盤價","最高價","最低價","收盤價","漲跌價差","成交筆數"],"data":[["107/08/01","29,777,161","7,375,488,342","247.00","248.00","246.50","248.00","+2.00","11,667"],["107/08/02","22,775,110","5,611,725,541","249.00","249.50","243.50","244.50","-3.50","10,343"],["107/08/03","25,165,097","6,205,758,662","246.00","248.00","245.00","247.00","+2.50","9,585"],["107/08/06","22,364,568","5,487,396,854","245.00","247.00","244.00","245.50","-1.50","9,732"],"notes":["符號說明:+/-/X表示漲/跌/不比價","當日統計資訊含一般、零股、盤後定價、鉅額交易,不含拍賣、標購。","ETF證券代號第六碼為K、M、S、C者,表示該ETF以外幣交易。"]}

使用request.get擷取指定日期與股票編號的網頁資料,使用request的函式json進行json格式的解碼成Python的資料結構,取出data所對應的值就是當月該股票的交易資料,使用函式transform進行格式轉換

import numpy as np
import requests
import pandas as pd
import datetime

#   http://www.twse.com.tw/exchangeReport/STOCK_DAY?date=20180817&stockNo=2330  取一個月的股價與成交量
def get_stock_history(date, stock_no):
    quotes = []
    url = 'http://www.twse.com.tw/exchangeReport/STOCK_DAY?date=%s&stockNo=%s' % ( date, stock_no)
    r = requests.get(url)
    data = r.json()
    return transform(data['data'])  #進行資料格式轉換

def transform_date(date):
        y, m, d = date.split('/')
        return str(int(y)+1911) + '/' + m  + '/' + d  #民國轉西元
    
def transform_data(data):
    data[0] = datetime.datetime.strptime(transform_date(data[0]), '%Y/%m/%d')
    data[1] = int(data[1].replace(',', ''))  #把千進位的逗點去除
    data[2] = int(data[2].replace(',', ''))
    data[3] = float(data[3].replace(',', ''))
    data[4] = float(data[4].replace(',', ''))
    data[5] = float(data[5].replace(',', ''))
    data[6] = float(data[6].replace(',', ''))
    data[7] = float(0.0 if data[7].replace(',', '') == 'X0.00' else data[7].replace(',', ''))  # +/-/X表示漲/跌/不比價
    data[8] = int(data[8].replace(',', ''))
    return data

def transform(data):
    return [transform_data(d) for d in data]

def create_df(date,stock_no):
    s = pd.DataFrame(get_stock_history(date, stock_no))
    s.columns = ['date', 'shares', 'amount', 'open', 'high', 'low', 'close', 'change', 'turnover']
                #"日期","成交股數","成交金額","開盤價","最高價","最低價","收盤價","漲跌價差","成交筆數" 
    stock = []
    for i in range(len(s)):
        stock.append(stock_no)
    s['stockno'] = pd.Series(stock ,index=s.index)  #新增股票代碼欄,之後所有股票進入資料表才能知道是哪一張股票
    datelist = []
    for i in range(len(s)):
        datelist.append(s['date'][i])
    s.index = datelist  #索引值改成日期
    s2 = s.drop(['date'],axis = 1)  #刪除日期欄位
    mlist = []
    for item in s2.index:
        mlist.append(item.month)
    s2['month'] = mlist  #新增月份欄位
    return s2
        
listDji = ['2330']
for i in range(len(listDji)):
    result = create_df('20180701', listDji[i])
    print(result)
    
print(result.groupby('month').close.count())  #每個月幾個營業日
print(result.groupby('month').shares.sum())  #每個月累計成交股數

2007年7月1日 星期日

七大技巧助你成功邁向新的工作崗位

如果你正面臨一個新的職位,那麼,祝賀你!你在找工作的過程中所付出的努力即將獲得可觀的回報。稍事休息,你就要投入到新的工作中去了。你下一步的目標是把自己融合到新的組織之中,下面就是使之順利進行的7點技巧:
  1. 維護往昔的人脈 :
    上班伊始,就要聯繫所有曾經幫助過你謀得新職位的人,向他們表示感謝。人們常常不會作出這種努力,因為,他們感覺將在新的工作崗位長期服務。但是,當今每一個美國人平均每4年就換一次工作,很可能說你正在計劃不久就換工作。為此,你需要不斷維護你的人脈。
  2. 頭三個月迴避「大項目」:
    在上班的第二天,你就思考:「這來了一個重要項目!我要立即承擔下來,讓他們對我刮目相看。」這是許多人在被僱用之後頭三個月常犯的錯誤。你從整個系統和周圍的人學習知識是至關重要的。你不可能理解至今你做的某些決定的牽涉面。你的公司不會指望你在最初幾周時間內就瞭解一切。為此,你應該花時間學習整個工作的流程。
  3. 與利益息息相關的人搞好人際關係
    這些人對你的成功起著舉足輕重的作用,他們不一定都掛上了華麗的頭銜。要找到這些人,尋求他們的支援並向他們提供你的支援,從而開始融合過程。
  4. 孰輕孰重,謹慎識別:
    世界上最不愉快的事情都是源於出乎意料。要制定一個計劃,說明你將如何解決你面臨的最嚴峻的挑戰以及你希望完成任務的時間表,然後,跟你的上司交流。
  5. 保持積極向上的心態:
    不要把你對工作的關心或疑慮與其它同事分享。即使你的上司出爾反爾,也要小心。所以,當你的上司(或其它人)在頭三個月問你,「工作進展如何?」的時候,唯一的答案就是「工作進展非常順利」,因為你仍然在學習。
  6. 聽取建議,準確把握工作:
    當打聽消息的時候,為了給你的新僱主增加更多的價值,要仔細傾聽同事對你的建議。要問這樣的問題「這件工作過去是怎麼做的?」這種問題將讓你有可能洞察如何盡早地取得一些成功。
  7. 持續不斷地進行自我職業管理:
    必須清醒地認識到,除了你之外,沒有人會關注你的職業發展。在職業管理的過程中,制定有洞察力和長遠的目標是至關重要的。當項目來臨時,這肯定會發揮作用。如果一個項目適合你的長遠職業計劃,那麼,就承擔下來;如果不是,就要婉言謝絕(你「太忙」)。你對所分配工作越主動,就越有助於你實現你的職業目標,你就越快地達到你的職業目標。

好了,最後祝你工作愉快!