【Python數據處理專題】-加載IO

其他

!type f:\test\News\DataAnalyst.csv # 查看文件內容、格式
!type f:\test\demo.json
!dir # 查看目錄下,文件名稱
list(open('demo.csv')) # 打開查看文件

pd.read_table()

pd.read_table('文件路徑/demo.txt',
              sep='\s+', # 指明分隔符爲 多個空行
              delimiter=None,
              header='infer',#讀取哪一行爲columns
              names=None,#字段名
              index_col=0,  # 讀取某列爲index
              parse_dates=False,#哪個字段讀取爲時間類型
              date_parser=None,#日期解析器,即format
  

pd.read_csv()

查看文件佈局

list(open('demo.csv'))

讀取

pd.read_csv('f:/test/demo.csv',
            index_col=0, # 讀取某列爲index
            index_col=['col1','col2'], # 讀取多重索引
            encoding='gbk', # 編碼格式
            header=None, # 用作列名的行
            names=列表, # 自定義列名
            dtype={'col1':int,'col2':np.float64}, # 設置列的數據類型
            usecols=[1,2,3], # 只讀取某幾列['col1,'col2']
            skiprows=[0,2], #跳過 1、3行,skiprows=3:跳過前3行
            
            skipfooter=2, # 跳過最後2行,
            engine='python', # 指明skip_footer實現的方式
            
            nrows=5# 只讀5行數據(不包含標題)
            
            na_values=['NULL',999,'np.nan'], # 指定這些值讀取爲缺失值
            na_values={'col1':['NULL','demo'],'col3':['a','c']}, # 字典指定列中特定值爲缺失值 
            
            parse_dates=False, # 嘗試解析爲日期
            #【True】:解析所有列
            #【列表或元組】
            
            delimiter=',', # 用於分隔字段的單字符字符串,默認爲','
            skipinitialspace=False, # 忽略分隔符後面的空白符
            
            
           )

參數

參數 說明
parse_dates 解析爲日期,默認False。
True:嘗試解析所有列
一組列名、列號:解析指定列
列表的元素爲列表或元組:將多格列組合到一起再進行日期解析
converters {‘col1’:f}:對col1列的所有值應用函數f
dayfirst 解析有歧義日期時,看做國際格式,默認False
23/6/2018→June,23,2018
engine='python' 解析方式
分析引擎
C或python
C引擎快
python引擎:更能完備

逐塊讀取

chunker = pd.read_csv('demo.csv',chunksize=1000)

tot = pd.Series([])
for piece in tot:
    tot = tot.add(piece['key'].value_counts(),fill_value=0)

tot = tot.sort_values(ascending=False)

輸出文件

df.to_csv('f:/test/demo.csv',
          index_label='demo', # 設置保存時index的name
          index = False# 不保存索引
          header = False, # 不保存列名
          na_rep = 'NULL', # 指定缺失值,用NULL標記
          columns = ['col5','col3','col1'], # 只保存部分列,保存列的順序與指定列表一致
         )

指定分隔符輸出

df.to_csv('demo',
          sep = '|', # 指定分隔符
         )

手工處理

手工讀取

with open('demo.csv') as f:

手工輸出分隔符文件

with open('demo.csv','w') as f:
    writer = csv.writer(f, dialect = my_dialect)
    writer.writerow(('one','two','three'))
    writer.writerow(('1','2','3'))
    writer.writerow(('4','5','6'))
    writer.writerow(('7','8','9'))

pd.read_excel()

讀取表

pd.read_excel('f:/test/News/demo.xlsx',
              sheetname='表名', # 讀取哪張表
              
             )

寫入表

df.to_excel('f:/test/demo.xlsx',
            sheet_name='demo1', # 設置保存的表名
            index=False, # 不保存index         
           )
writer = pd.ExcelWriter('demo.xlsx') # 創建一個demo.xlsx文件

df1.to_excel(writer,'Sheet1') # df文件寫入demo.xlsx表,命名爲表1

writer.save()

寫入多張表

  • 推薦:
with pd.ExcelWriter('f:/test/demo.xlsx') as writer:
    df1.to_excel(writer,sheet_name='demo1')
    df2.to_excel(writer,sheet_name='demo2')

pd.read_json()

  • JSON(JavaScript Object Notation)

  • json字符串

    obj = """
    {"name": "Wes",
     "places_lived": ["United States", "Spain", "Germany"],
     "pet": null,
     "siblings": [{"name": "Scott", "age": 30, "pets": ["Zeus", "Zuko"]},
                  {"name": "Katie", "age": 38,
                   "pets": ["Sixes", "Stache", "Cisco"]}]
    }
    """
    

JSON字符串轉換成Python形式

import json

result = json.loads(obj) # obj爲json字符串

Python對象(不一定是DataFrame、Series)轉換成JSON格式

asjson = json.dumps(result)

JSON格式轉換成DataFrame

  • 向DataFrame構造器傳入一個字典的列表(就是原先的JSON對象),並選取數據字段的子集
df = pd.DataFrame(result['siblings'], # siblings JSON對象
                  columns=['name','age']) # ['name','age]選取字段的子集

特定格式的JSON數據集

  • 轉換成Series或DataFrame
pd.read_json('demo.json') # JSON數組中的每個對象是表格中的一行

pands輸出json

df.to_json()

sqlite

  • 寫入數據庫
  • sqlitebrowser.org查看數據庫
import sqlite3
connection = sqlite3.connect('f:/test/demo.sqlite')
df.to_sql('demo_DATA', #自己命名數據庫名,會寫入demo.sqlite
          connection,
          if_existe='replace'
          # 如果數據庫存在,則替換(if_exists='append,存在則添加在後)
          )
connection.commit()
connection.close()
  • 讀取數據庫
connection = sqlite3.connect('f:/test/demo.sqlite')
dfs = pd.io.sql.read_sql('select * from demo_DATA',
                         connection, #讀取這個數據庫
                         index_col='index'
                        )
connection.close()
dfs.head()

read_sql

import sqlalchemy as sqla

db = sqla.create_engine('sqlite:///mydata.sqlite') # 用SQLAlchemy連接SQLite數據庫

pd.read_sql('select * from table1',db)

pandas解析hdf5

  • HDF5是一種存儲大規模科學數組數據的非常好的文件格式
    • 可以被作爲C庫,帶有許多語言的接口,如Java、Python和MATLAB等。
    • HDF5中的HDF指的是層次型數據格式(hierarchical data format)。
    • 每個HDF5文件都含有一個文件系統式的節點結構,它使你能夠存儲多個數據集並支持元數據。
    • 與其他簡單格式相比,HDF5支持多種壓縮器的即時壓縮,還能更高效地存儲重複模式數據。
    • 對於那些非常大的無法直接放入內存的數據集,HDF5就是不錯的選擇,因爲它可以高效地分塊讀寫。
  • 保存爲hdf5
df = pd.DataFrame({'a':np.random.randn(10,3)},
 		         index=pd.date_range('20181111',periods=10),
                  columns=['a','c','b'])
hdf =  pd.HDFStore('f:/test/demo.h5')
hdf['obj1'] = df
hdf['obj1_col'] = df['a']
  • 讀取
read_hdf = pd.HDFStore('f:/test/demo.h5')
df = read_hdf['df']
df
pd.HDFStore('f:/test/hdf.h5')['df']

HDFStore存儲模式

  • table存儲模式

    • 通常會更慢
    • 支持使用特殊語法進行查詢操作
    hdf.put('obj2',df,format)
    hdf.select('obj2',where = ['index == 20181111'])
    
  • df.to_hdf('demo.h5','obj3',format = 'table')
    pd.read_hdf('demo.h5','obj3',where = ['index = 20181111'])
    

web

讀取遠程文件

url = 'http://archive.ics.uci.edu/m1/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data'
names = ['preg','plas','pres','skin','test','mass','pedi','age','class']
data = pd.read_csv(url, names = names)
data.head()

pandas讀取HTML

url = 'http://www.worldcup.2014.163.com/index.html'
df = pd.read_html(url)
len(df)
df[0].head()


table = []
for i in range(1,7):
    table.append(pd.read_html('https://nba.hupu.com/stats/players/pts/%d' %i)[0])

players = pd.concat(table)
columns=['排名','球員','球隊','得分','命中-出手','命中率','命中-三分','三分命中率','命中-罰球','罰球命中率','場次','上場時間']
players.columns=columns

pandas_datareader財經數據

  • 搜索pandas_datareader,查看官網
import pandas_datareader.data as web
import datetime
start = datetime.datetime(2018,11,1)
end = datetime.datetime(2018,11,11)
apple = web.DataReader('AAPL','yahoo',start,end)
apple.head()

解析XML

  • XML(Extensible Markup Language)
    • 一種常見的支持分層、嵌套數據以及元數據的結構化數據格式。


Web APIs交互

讀取GitHub的pandas主題api

import requests
url = 'https://api.github.com/repos/pandas-dev/pandas/issues'
resp = requests.get(url) # 會返回一個包含被解析過的JSON字典

data = resp.json() # data中的每個元素都是一個包含所有GitHub主題頁數據(不包含評論)的字典。

返回DataFrame對象

issues = pd.DataFrame(data,columns=['number','title','labels','state'])


股票數據

tushare.org

import tushare  as ts
print(tushare.__version__) # 查看包的版本
ts.get_h_data('002241',start='2018-11-01',end='2018-11-11')
  • 讀取 新股
ts.new_stocks()

Pandas鏈接mysql

  • 先鏈接,讀取
import pandas as pd
from sqlalchemy import create_engine
def reader(query,db = 'learn'):
    sql = query
    engine = create_engine('mysql+pymysql://root:[email protected]:3306/{0}?charset=utf8'.format(db))
    df = pd.read_sql(sql,engine,)
    return df
df_company = reader('select * from company_sql')
reader('show tables')

寫入mysql

​```python
df.to_sql('new_table_name',con=engine,index=True)
​```

- 優點
  - 新表不用創建字段

pymysql鏈接MySQL數據庫

  • 安裝pymysql

打開cmd,pip install pymysql

  1. 鏈接MySQL
import pymysql
# 加載pymysql
  1. 創建鏈接conn
conn = pymysql.connect(
	host = '127.0.0.1',
    user = 'root',
    password = 'admin888',
    db = 'learn',
    port = 3306,
    charset = 'utf8'
)
# 定義變量鏈接conn
# 鏈接數據庫
  1. 創建遊標
cur = conn.cursor()
# 創建遊標
  1. 獲得結果
cur.execute(“select * from company_sql”)
# sql語句,獲得結果,此時結果還放在內存中
  1. 調出賦值
data = cur.fetchall()
# 調取結果賦值給變量data
  1. 循環
for d in data:
	print (d[0],d[1],d[2])
# for循環,切片
conn.commit()
# 提交修改,一般只是讀取的話,用不到該語句
cur.close()# 關閉遊標
conn.close()# 關閉鏈接

  • conda install pandas_datareader

  • import pandas_datareader as pdr

  • 獲取雅虎股票信息

    start=datetime.datetime(2015,9,20)
    alibaba = pdr.get_data_yahoo('BABA',start = start)
    amazon = pdr.get_data_yahoo('AMZN',start = start)
    
    • 股價查詢編號

      'AAPL' # 蘋果
      'GOOG' # 谷歌
      'MSFT' # 微軟
      'AMZN' # 亞馬遜
      'FB' # 臉書
      'BABA' # 阿里巴巴
      'VIPS' # 唯品會
      

API

  • 豆瓣API

    • 返回值爲json格式
    • https://api.douban.com/v2/book/1220562,獲取ID爲1220562的書的信息
    • https://api.douban.com/v2/movie/subject/26387639獲取ID爲26387639(摔跤吧爸爸)電影的信息
  • 爬取

    import urllib.request as urlrequest
    import json
    
    # 抓取api的json文件
    id_list = []
    for id in id_list:
        url_visit = 'https://api.douba.com/v2/movie/subject/{}'.format(id)
        crawl_content = urlrequest.urlopen(url_visit).read()
        # 加載爬取的文件
        json_content = json.loads(crawl_content.decode('utf8'))
        rank = json_content['rating']['average']
        # 將爬取的內容寫入文件
        with open('movie_score.txt','a')as output:
            output.write('{},{}\n'.format(id,rank))
    

By儒冠多誤身 2019/04/21

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章