顯示具有 Python 標籤的文章。 顯示所有文章
顯示具有 Python 標籤的文章。 顯示所有文章

2019年1月2日 星期三

Python_讀取股票歷年經營績效_以遠東新1402為例_04_使用pandas畫直線圖


接著試驗pandas的繪圖功能,花了我好久的時間,原來要吃圖形的X與Y軸要吃資料形態要吃數字的Series,畫起圖來才會比較順手。 使用了pandas的plot繪製直線圖,程式碼修改如下:

# -*- coding: utf-8 -*-
"""
Created on Wed Jan  2 13:38:28 2019
@author: ryoliu
"""
import requests
from bs4 import BeautifulSoup
import pandas as pd
url = 'https://goodinfo.tw/StockInfo/StockBzPerformance.asp?STOCK_ID=1402'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \
           Chrome/65.0.3325.181 Safari/537.36'}
r = requests.get(url, headers = headers)
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, 'html.parser')
rows = soup.find('div', {"id": "divFinDetail"}).find('table', {"class": "solid_1_padding_4_0_tbl"})
dfs = pd.read_html(str(rows))
df=pd.DataFrame(dfs[0]).iloc[3:19,0:3]
df.columns= ['years','stockcost','summarize']
df.stockcost=pd.Series(pd.to_numeric(df.stockcost))
df.years=pd.Series(pd.to_numeric(df.years))
df.plot(x='years',y='stockcost', kind='line')


執行結果如下:

Python_讀取股票歷年經營績效_以遠東新1402為例_03_DataFrame寫入MSSQL


好吧,我很承認我很廢,腦子都在想一些有的沒的,因為本人不太愛用CSV,喜歡把資料匯入到資料庫裡面進行運算,不自覺的手癢不小心就把遠東新的經營績效資料寫入資料庫,至於為何要寫入資料庫呢?因為我是DBA呀。XD

# -*- coding: utf-8 -*-
"""
Created on Wed Jan  2 11:47:20 2019

@author: ryoliu
"""

import requests
from bs4 import BeautifulSoup
import pandas as pd
import pyodbc

url = 'https://goodinfo.tw/StockInfo/StockBzPerformance.asp?STOCK_ID=1402'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \
           Chrome/65.0.3325.181 Safari/537.36'}
r = requests.get(url, headers = headers)
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, 'html.parser')
rows = soup.find('div', {"id": "divFinDetail"}).find('table', {"class": "solid_1_padding_4_0_tbl"})
dfs = pd.read_html(str(rows))
df=pd.DataFrame(dfs[0]).iloc[2:19,0:3]
df.columns= ['年度','股本','財報評分']

connStr = pyodbc.connect('DRIVER={ODBC Driver 11 for SQL Server};\
                          SERVER=RYOLIU-PC;\
                          DATABASE=PythonDB;\
                          Trusted_Connection=yes')
cursor = connStr.cursor()

for index,row in df.iterrows():
    cursor.execute("INSERT INTO dbo.tab1402([年度],\
                                            [股本],\
                                            [財報評分])\
    values (?, ?,?)", row['年度'],\
    row['股本'],\
    row['財報評分'])
    connStr.commit()
cursor.close()
connStr.close()





建立資料庫語法
CREATE TABLE tab1402
(
[年度]     VARCHAR(50),
[股本]    VARCHAR(50),
[財報評分] VARCHAR(50)
)


執行結果如下:

Python_讀取股票歷年經營績效_以遠東新1402為例_02_使用DataFrame整理資料

承接上篇,下載後的資料有點亂,研究一下pandas後,可以使用loc來過濾DataFrame並使用columns重新給予欄位名稱,將程式稍為整理,修改如下:




# -*- coding: utf-8 -*-
"""
Created on Sun Dec  9 13:05:58 2018

@author: ryoliu
"""

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = 'https://goodinfo.tw/StockInfo/StockBzPerformance.asp?STOCK_ID=1402'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \
           Chrome/65.0.3325.181 Safari/537.36'}
r = requests.get(url, headers = headers)
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, 'html.parser')
rows = soup.find('div', {"id": "divFinDetail"}).find('table', {"class": "solid_1_padding_4_0_tbl"})
dfs = pd.read_html(str(rows))
dfs2=dfs[0].loc[2:19]
dfs2.columns = ['年度','股本(億)','財報評分','收盤股價','平均股價','股價漲跌','股價漲跌(%)',\
                '營業收入','營業毛利','營業利益','業外損益','稅後淨利','營業毛利(%)','營業利益(%)',\
                '業外損益(%)','稅後淨利(%)','ROE(%)','ROA(%)','稅後EPS','成長(元)','BPS(元)']
print (dfs2)
dfs2.to_html("1402.html",index=False)

執行結果如下:







2018年12月9日 星期日

Python_讀取股票歷年經營績效_以遠東新1402為例_01_使用pandas與BeautifulSoup取得網頁資料

因為最近想要用一些統計方法去評估股票,所以要整理一些資訊到自己的PC分析,在思考要怎麼取得股票的資訊,會的程式語言列了一下: C#要開VS好浪費資源 R處理資料好像不方便 Python好像還不賴,於是興致一來花了一些時間來研究。 結果...哇....短短的幾行Code效果令人驚艷。 趕快紀錄一下,以後用來紀念
import requests
from bs4 import BeautifulSoup
import pandas as pd 

url = 'https://goodinfo.tw/StockInfo/StockBzPerformance.asp?STOCK_ID=1402'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}
r = requests.get(url, headers = headers)
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, 'html.parser')
rows = soup.find('div', {"id": "divFinDetail"}).find('table', {"class": "solid_1_padding_4_0_tbl"})
dfs = pd.read_html(str(rows))
print (dfs[0])
dfs[0].to_html("1402.html",index=False)
執行結果

2016年9月10日 星期六

Python學習筆記_資料處理(如何存取OpenData)

之前同事賴姐問我mongodb,原因是他收到的資料是JSON格式,於是乎我推薦了她C#的JSON.NET,只是事情永遠都是那麼巧合,過沒幾天我發現之前用的UBIKE網址是舊的,而新的網址的內容使用R語言去解析相當的困難,時間又來不及。
資料內容長這樣

有沒有又快又彈性的方式呢?我想了一下,想到Python這個玩意,於是在網路上Google一下,發現這篇,喔耶,於是小弟拿了他的程式改了一下,其中最麻煩的地方是小弟的版本已經是Python3.4了,而且又是在Windows上執行,所以有遇到轉碼的問題,'cp950' codec can't encode character 'OOXX' in position.... 。小弟花費了一些時間處理轉碼問題並將資料轉入資料庫,果然是吉人自有天相呀!^^
小弟的流程如下,先使用urllib.request套件將資料下載本地端,在使用pypyodbc套件將資料傳入資料庫。
#getBike.py 
#!/usr/bin/env python
import urllib.request
import gzip
import json
import sys
import pypyodbc
#from pprint import pprint
url = "http://data.taipei/youbike"
urllib.request.urlretrieve(url, "YouBikeTP.gz")
f = gzip.open('YouBikeTP.gz', 'r')
#先轉碼,處理編碼問題(CP950)
jdata = f.read().decode('utf-8').encode(sys.stdin.encoding, 'replace').decode(sys.stdin.encoding)
f.close()
data = json.loads(jdata)
connection = pypyodbc.connect(r'Driver={SQL Server};Server=.;Database=OpenDataDB;Trusted_Connection=yes;')
cursor = connection.cursor()
for key,value in data["retVal"].items():
    sno = value["sno"]
    sna = value["sna"]
    tot = value["tot"]
    sbi = value["sbi"]
    sarea = value["sarea"]
    mday = value["mday"]
    lat = value["lat"]
    lng = value["lng"]
    ar = value["ar"]
    sareaen = value["sareaen"]
    snaen = value["snaen"]
    aren = value["aren"]
    bemp = value["bemp"]
    act = value["act"]
    cursor.execute("insert into tempTabUbike values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)", (sno,sna,tot,sbi,sarea,mday,lat,lng,ar,sareaen,snaen,aren,bemp,act))
connection.commit()
connection.close()

有圖有真相

搞定收工!^^
PS:寫這篇希望有幫到賴姐!