python pandasデータロード、ストレージ、ファイルフォーマット
41648 ワード
データのロード、保存、ファイル形式pandasには、テーブル型データをDataFrameオブジェクトとして読み込むための関数がいくつか用意されています.ここでread_csvとread_talbeで最も多く使われているpandasの解析関数:関数説明read_csvファイル、URL、ファイル型オブジェクトから区切り記号付きデータをロードします.デフォルトの区切り記号はカンマread_です.tableは、ファイル、URL、ファイル型オブジェクトから区切り文字付きデータをロードします.デフォルトの区切り記号はタブ(t)ですread_fwfは、定幅列フォーマットデータ(すなわち、区切り記号なし)read_を読み出すclipboardはクリップボードのデータを読み出し、read_と見なすことができます.tableのクリップボード版.Webページを表に変換するときに便利です
pandasコードのパフォーマンスの向上:https://python.freelycode.com/contribution/detail/1083これらの関数がテキストデータをDataFrameに変換する際に用いられる技術について説明します.これらの関数のオプションは、(1)インデックス:1つまたは複数のカラムを返すDataFrame処理とし、ファイル、ユーザからカラム名を取得するかどうか(2)タイプ推定およびデータ変換:ユーザ定義値の変換、欠落値タグリストなどを含む.(タイプ推定はこれらの関数の中で最も重要な機能の一つである)(3)日付解析:複数の列に分散した日付時間情報を結果の単一の列に組み合わせるなどの組合せ機能を含む.(4)反復:大きなファイルをブロック単位で反復することをサポートします.
(5)データを整理しない問題:行、フッター、コメント、または他の重要でないもの(例えば、何千ものカンマで区切られた数値データ)をスキップする
1.読み書きテキスト形式のデータ:
read_csv/read_table関数のパラメータ:
ブロック単位でテキストファイルを読み込みます.
大きなファイルを処理する場合、または大きなファイルのパラメータセットを見つけて後続の処理を容易にする場合は、ファイルの一部を読み込むか、ブロックごとにファイルを反復したいだけです.
テキスト形式にデータを書きます.
from_csvとread_csvのパラメータは以下のように整理されています.
手動処理セパレータフォーマット:csv python内蔵関数使用
各csv文のパラメータは、キーワードの形式でcsvに提供することもできる.reader、サブクラスを定義する必要はありません:
csv.writerは、自分で開いて書くことができるファイルオブジェクトとcsvを受け入れるセパレータファイルを手動で出力するために使用する.readerと同じ文とオプション:
まとめ:
json形式の読み取りと書き込み:
jsonを通してloadsはjson文字列をpython形式に変換し、ディスクから読み出すことができます.
XMLとHTML:Web情報収集
pythonにはHTMLやxml形式のデータを読み書きできるライブラリがたくさんあります.lxmlはその1つであり,大きなものを効率的に解析することができる.lxmlには複数のプログラミングインタフェースがあります.まずlxmlを使います.htmlはHTMLを処理し、lxmlを用いる.objectifyはXML処理をします.
HTMLファイル処理:
lxmlを利用する.objectify解析xml:具体的には、xml解析ファイルを紹介する別の記事を参照してください.
aa.xmlの内容は次のとおりです.
2.バイナリデータフォーマット:書き込みと読み取り
データのバイナリフォーマットストレージを実現する最も簡単な方法の1つはpython内蔵pickleシーケンス化を使用することです.使いやすいようにpandasオブジェクトにはpickle形式でディスクにデータを保存するためのto_があります.pickleメソッド.
逆に、read_をディスクから読み込むpickle.
警告:pickleは短期ストレージフォーマットのみを推奨します.その理由は、フォーマットが永遠に安定していることを保証することが難しいからです.
今日のpickleのオブジェクトは、後続のバージョンのライブラリunpickleには出られません.
HDF 5は多種類の圧縮器の即時圧縮をサポートし、重複モードデータをより効率的に記憶することができ、メモリに直接入れられない非常に大きなデータセットに対して、
HDF 5は、ブロック読み書きを効率的に分割できるので、良い選択です.
pythonのHDF 5ライブラリには2つのインタフェース(PyTableとh 5 py)があり、h 5 pyは直接的で高度なHDF 5 APIアクセスインタフェースを提供しています.
一方、PyTableはHDF 5の多くの詳細を抽象化し、柔軟なデータコンテナ、テーブルインデックス、クエリー機能、およびコア外コンピューティング技術のいくつかのサポートを提供しています.
注意:HDF 5はデータベースではありません.「1回の書き込み複数回の読み取り」のデータセットとして最適です.データはいつでもファイルに追加できますが、複数の書き込み操作が同時に発生すると、ファイルが破壊される可能性があります.
3.HTMLとWeb API:requestパッケージのgetを使用してデータを読み込む
4.データベースの使用
NoSQLデータベースにはさまざまな形式があります.単純なディクショナリキー値ペアで格納されるものもあれば、ドキュメントベースのものもあります(基本ユニットはディクショナリ型のオブジェクトです).
pandasコードのパフォーマンスの向上:https://python.freelycode.com/contribution/detail/1083これらの関数がテキストデータをDataFrameに変換する際に用いられる技術について説明します.これらの関数のオプションは、(1)インデックス:1つまたは複数のカラムを返すDataFrame処理とし、ファイル、ユーザからカラム名を取得するかどうか(2)タイプ推定およびデータ変換:ユーザ定義値の変換、欠落値タグリストなどを含む.(タイプ推定はこれらの関数の中で最も重要な機能の一つである)(3)日付解析:複数の列に分散した日付時間情報を結果の単一の列に組み合わせるなどの組合せ機能を含む.(4)反復:大きなファイルをブロック単位で反復することをサポートします.
(5)データを整理しない問題:行、フッター、コメント、または他の重要でないもの(例えば、何千ものカンマで区切られた数値データ)をスキップする
1.読み書きテキスト形式のデータ:
(1) , read_csv DataFrame:
import pandas as pd
import numpy as np
#'ex1.csv' :
# a,b,c,d,message
# 1,2,3,4,hello
# 5,6,7,8,world
# 9,10,11,12,foo
df=pd.read_csv('ex1.csv')
print df
# :
# a b c d message
# 0 1 2 3 4 hello
# 1 5 6 7 8 world
# 2 9 10 11 12 foo
(2) read_table, :
df=pd.read_table('ex1.csv',sep=',')
print df
# :
# a b c d message
# 0 1 2 3 4 hello
# 1 5 6 7 8 world
# 2 9 10 11 12 foo
(3) pandas , :
print pd.read_csv('ex1.csv',header=None)
# :
# 0 1 2 3 4
# 0 a b c d message
# 1 1 2 3 4 hello
# 2 5 6 7 8 world
# 3 9 10 11 12 foo
print pd.read_csv('ex1.csv',names=['a','b','c','d','message'])
# :
# a b c d message
# 0 a b c d message
# 1 1 2 3 4 hello
# 2 5 6 7 8 world
# 3 9 10 11 12 foo
(4) message DataFrame , 4 , index_col "message"
names=['a','b','c','d','message']
print pd.read_csv('ex1.csv',names=names)
# :
# a b c d message
# 0 a b c d message
# 1 1 2 3 4 hello
# 2 5 6 7 8 world
# 3 9 10 11 12 foo
print pd.read_csv('ex1.csv',names=names,index_col='message')
# :
# a b c d
# message
# message a b c d
# hello 1 2 3 4
# world 5 6 7 8
# foo 9 10 11 12
(5) , :
#'csv_mindex.csv' :
# key1,key2,value1,value2
# one,a,1,2
# one,b,3,4
# one,c,5,6
# one,d,7,8
# two,a,9,10
# two,b,11,12
# two,c,13,14
# two,d,15,16
parsed=pd.read_csv('csv_mindex.csv',index_col=['key1','key2']) #index_col
print parsed
# value1 value2
# key1 key2
# one a 1 2
# b 3 4
# c 5 6
# d 7 8
# two a 9 10
# b 11 12
# c 13 14
# d 15 16
(6) ( )。 , read_table
# 。
#'ex3.txt'
# A B C,
# aaa -0.264438 -1.026059 -0.619500
# bbb 0.9283898 0.3928928 -0.032388
# ccc -0.264327 -0.386313 -0.217601
# ddd -0.878218 -0.348238 1.1004919
print list(open('ex3.txt'))
# :
# [' A B C,
',
# 'aaa -0.264438 -1.026059 -0.619500
',
# 'bbb 0.9283898 0.3928928 -0.032388
',
# 'ccc -0.264327 -0.386313 -0.217601
',
# 'ddd -0.878218 -0.348238 1.1004919']
# , \s+ :
# :\s ,\S ,+ 。 \s+
result=pd.read_table('ex3.txt',sep='\s+')
print result
# :
# A B C,
# aaa -0.264438 -1.026059 -0.619500
# bbb 0.928390 0.392893 -0.032388
# ccc -0.264327 -0.386313 -0.217601
# ddd -0.878218 -0.348238 1.100492
# : ( A,B,C , 4 ), read_table DataFrame 。
(7)skiprows ,
#'ex4.csv' :
##hey!
# a,b,c,d,message
# #just wanted to make thins more difficult for u
# # who reads CSV files with computers,anyway?
# 1,2,3,4,hello
# 5,6,7,8,world
# 9,10,11,12,foo
print pd.read_csv('ex4.txt',skiprows=[0,2,3])
# :
# a b c d message
# 0 1 2 3 4 hello
# 1 5 6 7 8 world
# 2 9 10 11 12 foo
(8) 。 ( ), 。
# ,pandas , NA,-1.#IND NULL 。
#'ex5.csv' :
# something,a,b,c,d,message
# one,1,2,3,4,NA
# two,5,6,,8,world
# three,9,10,11,12,foo
result=pd.read_csv('ex5.csv')
print result
# :
# something a b c d message
# 0 one 1 2 3.0 4 NaN
# 1 two 5 6 NaN 8 world
# 2 three 9 10 11.0 12 foo
print pd.isnull(result) #
# :
# something a b c d message
# 0 False False False False False True
# 1 False False False True False False
# 2 False False False False False False
(9) na_values :
result=pd.read_csv('ex5.csv',na_values=['NULL'])
print result
# :
# something a b c d message
# 0 one 1 2 3.0 4 NaN
# 1 two 5 6 NaN 8 world
# 2 three 9 10 11.0 12 foo
(10) NA
sentinels={'message':['foo','NA'],'something':['two']} # message foo NA,something two NA
print pd.read_csv('ex5.csv',na_values=sentinels)
# :
# something a b c d message
# 0 one 1 2 3.0 4 NaN
# 1 NaN 5 6 NaN 8 world
# 2 three 9 10 11.0 12 NaN
read_csv/read_table関数のパラメータ:
path 、url、
sep delimiter
header 。 0( ), header None
index_col 。 / / ( )
names , header=None
skiprows ( ), ( 0 )
na_values NA
comment ( )
parse_dates , False. True, 。 ,
。 , ( , /
)
keep_date_col , 。 False.
converters / 。 ,{‘foo’:f} foo f
dayfirst , ( :7/6/2012->June,7,2012). False
date_parser
nrows ( )
iterator TextParser
chunksize ( )
skip_footer ( )
verbose , “ ”
encoding unicode 。
squeeze , Series
thousands , “,” “。”
ブロック単位でテキストファイルを読み込みます.
大きなファイルを処理する場合、または大きなファイルのパラメータセットを見つけて後続の処理を容易にする場合は、ファイルの一部を読み込むか、ブロックごとにファイルを反復したいだけです.
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
#'ex6.csv' :
#
# Int64Index:10000 entries, 0 to 9999
# Data columns:
# one 10000 non-null values
# two 10000 non-null values
# three 10000 non-null values
# four 10000 non-null values
# key 10000 non-null values
# dtypes: float64(4),object(1)
print pd.read_csv('ex6.csv',nrows=5) #nrows=5 6 , 0
# , chunksize( )
chunker=pd.read_csv('ex6.csv',chunksize=1000)
print chunker
# :
#
#read_csv TextParser chunksize 。 :
# ex6.csv, "key" 。
tot=Series([])
for piece in chunker:
tot=tot.add(piece['key'].value_counts(),fill_value=0) #value_counts ,fill_value 0
tot=tot.order(ascending=False) # Series order, sort_value
# tot=tot.sort_value(ascending=False)
print tot # key
テキスト形式にデータを書きます.
data=pd.read_csv('ex5.csv')
# :
print data
# :
# something a b c d message
# 0 one 1 2 3.0 4 NaN
# 1 two 5 6 NaN 8 world
# 2 three 9 10 11.0 12 foo
DataFrame to_csv :
(1) :to_csv, DataFrame to_csv ,
print data.to_csv('out.csv')
#out.csv :
# ,something,a,b,c,d,message
# 0,one,1,2,3.0,4,
# 1,two,5,6,,8,world
# 2,three,9,10,11.0,12,foo
(2) ( sys.stdout , )
print data.to_csv(sys.stdout,sep='|')
# :
# None
# |something|a|b|c|d|message
# 0|one|1|2|3.0|4|
# 1|two|5|6||8|world
# 2|three|9|10|11.0|12|foo
# None
(3) , na_sep='NULL'
print data.to_csv(sys.stdout,na_rep='NULL')
# :
# ,something,a,b,c,d,message
# 0,one,1,2,3.0,4,NULL
# 1,two,5,6,NULL,8,world
# 2,three,9,10,11.0,12,foo
# None
(4) , 。 , :index=False,header=False
print data.to_csv(sys.stdout,index=False,header=False) # index, header
# :
# one,1,2,3.0,4,
# two,5,6,,8,world
# three,9,10,11.0,12,foo
# None
(5) , :index=False,columns=[]
print data.to_csv(sys.stdout,index=False,columns=['a','b','c'])
# :
# a,b,c
# 1,2,3.0
# 5,6,
# 9,10,11.0
# None
Series to_csv :
(1)Series to_csv , Series .csv
dates=pd.date_range('1/1/2000',periods=7) #date_range ,periods=7 7 , 2000/1/1
print dates
# :
# DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04',
# '2000-01-05', '2000-01-06', '2000-01-07'],
# dtype='datetime64[ns]', freq='D')
ts=Series(np.arange(7),index=dates) #index dates
ts.to_csv('tseries.csv')
#tseries.csv :
# 2000-01-01,0
# 2000-01-02,1
# 2000-01-03,2
# 2000-01-04,3
# 2000-01-05,4
# 2000-01-06,5
# 2000-01-07,6
(2)read_csv csv Series(Series.read_csv, DataFrame pd.read_csv), from_csv
print Series.from_csv('tseries.csv',parse_dates=True)
# :
# 2000-01-01 0
# 2000-01-02 1
# 2000-01-03 2
# 2000-01-04 3
# 2000-01-05 4
# 2000-01-06 5
# 2000-01-07 6
# dtype: int64
from_csvとread_csvのパラメータは以下のように整理されています.
pandas.read_csv
CSV( ) DataFrame
:http://pandas.pydata.org/pandas-docs/stable/io.html
:
filepath_or_buffer : str,pathlib。str, pathlib.Path, py._path.local.LocalPath or any object with a read() method (such as a file handle or StringIO)
URL, URL :http, ftp, s3 。
:://localhost/path/to/table.csv
sep : str, default ‘,’
。 , 。 ‘\s+’, python 。 。 :'\r\t'
delimiter : str, default None
, ( , sep )
delim_whitespace : boolean, default False.
( ’ ‘ ’ ‘) , sep='\s+'。 Ture delimiter 。
0.18.1
header : int or list of ints, default ‘infer’
, 。 , 0, None。 header=0 。header list :[0,1,3], list ( ), ( 2; 1,2,4 , 3 ,dataframe 5 。)。
: skip_blank_lines=True header , header=0 。
names : array-like, default None
, , header=None。 , mangle_dupe_cols=True。
index_col : int or sequence or False, default None
, 。
, , index_col=False pandas 。
usecols : array-like, default None
, ( ) 。 :usecols [0,1,2] [‘foo’, ‘bar’, ‘baz’]。 。
as_recarray : boolean, default False
: 。 pd.read_csv(...).to_records() 。
Numpy recarray DataFrame。 True。 squeeze 。 , 。
squeeze : boolean, default False
, Series
prefix : str, default None
, 。 : ‘X’ X0, X1, ...
mangle_dupe_cols : boolean, default True
, ‘X’...’X’ ‘X.0’...’X.N’。 false 。
dtype : Type name or dict of column -> type, default None
。 {‘a’: np.float64, ‘b’: np.int32}
engine : {‘c’, ‘python’}, optional
Parser engine to use. The C engine is faster while the python engine is currently more feature-complete.
。 C python。C Python 。
converters : dict, default None
。key 。
true_values : list, default None
Values to consider as True
false_values : list, default None
Values to consider as False
skipinitialspace : boolean, default False
( False, ).
skiprows : list-like or integer, default None
( ), ( 0 )。
skipfooter : int, default 0
。 (c )
skip_footer : int, default 0
: skipfooter , 。
nrows : int, default None
( )。
na_values : scalar, str, list-like, or dict, default None
NA/NaN 。 , 。 ‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘nan’`.
keep_default_na : bool, default True
na_values , keep_default_na=False, NaN , 。
na_filter : boolean, default True
( )。 , na_filter=False 。
verbose : boolean, default False
, :“ ” 。
skip_blank_lines : boolean, default True
True, ; NaN。
parse_dates : boolean or list of ints or names or list of lists or dict, default False
boolean. True ->
list of ints or names. e.g. If [1, 2, 3] -> 1,2,3 ;
list of lists. e.g. If [[1, 3]] -> 1,3
dict, e.g. {‘foo’ : [1, 3]} -> 1,3 , "foo"
infer_datetime_format : boolean, default False
True parse_dates , pandas , , 。 5~10 。
keep_date_col : boolean, default False
, 。 False。
date_parser : function, default None
, dateutil.parser.parser 。Pandas , 。
1. arrays( parse_dates ) ;
2. ;
3. date_parser ( parse_dates ) 。
dayfirst : boolean, default False
DD/MM
iterator : boolean, default False
TextFileReader , 。
chunksize : int, default None
, See IO Tools docs for more informationon iterator and chunksize.
compression : {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None}, default ‘infer’
。 infer , gzip, bz2, zip ‘.gz’, ‘.bz2’, ‘.zip’, or ‘xz’ , 。 zip, ZIP 。 None 。
0.18.1 zip xz
thousands : str, default None
, “,” “."
decimal : str, default ‘.’
( : ’,‘).
float_precision : string, default None
Specifies which converter the C engine should use for floating-point values. The options are None for the ordinary converter, high for the high-precision converter, and round_trip for the round-trip converter.
lineterminator : str (length 1), default None
, C 。
quotechar : str (length 1), optional
, , 。
quoting : int or csv.QUOTE_* instance, default 0
csv 。 QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3)
doublequote : boolean, default True
, , quoting QUOTE_NONE , 。
escapechar : str (length 1), default None
quoting QUOTE_NONE , 。
comment : str, default None
。 , 。 , ( skip_blank_lines=True) header skiprows 。 comment='#' ‘#empty
a,b,c
1,2,3’ header=0 ’a,b,c' header。
encoding : str, default None
, 'utf-8'. List of Python standard encodings
dialect : str or csv.Dialect instance, default None
, sep 。 csv.Dialect
tupleize_cols : boolean, default False
Leave a list of tuples on columns as is (default is to convert to a Multi Index on the columns)
error_bad_lines : boolean, default True
, DataFrame , false, ( C )。
warn_bad_lines : boolean, default True
error_bad_lines =False, warn_bad_lines =True “bad lines” ( C )。
low_memory : boolean, default True
, 。 。 False。 dtype 。 chunksize iterator Dataframe, ( C )
buffer_lines : int, default None
, ,
compact_ints : boolean, default False
,
compact_ints=True , , use_unsigned
use_unsigned : boolean, default False
:
(i.e. compact_ints=True), 。
memory_map : boolean, default False
, map 。 IO 。
手動処理セパレータフォーマット:csv python内蔵関数使用
pandas.read_table 。 。
read_table 。
, python csv 。 csv.reader
import csv
f=open('ex7.csv')
reader=csv.reader(f)
print reader
# :<_csv.reader object="" at="">
for line in reader:
print line
# reader
# :
# ['a', 'b', 'c']
# ['1', '2', '3']
# ['1', '2', '3', '4']
,
lines=list(csv.reader(open('ex7.csv')))
print lines
# :
# [['a', 'b', 'c'], ['1', '2', '3'], ['1', '2', '3', '4']]
print lines[0],lines[1]
header,values=lines[0],lines[1:]
print zip(*values) #zip(iterable), 。a=[1,2,3] b=[2,4,5] zip(a,b)=[(1,2),(2,4),(3,5)]
# :
# [('1', '1'), ('2', '2'), ('3', '3')]
data_dict={h:v for h, v in zip(header,zip(*values))}
print data_dict
# : ,
# {'a': ('1', '1'), 'c': ('3', '3'), 'b': ('2', '2')}
CSV 。 csv.Dialect ( 、 、 )
class my_dialect(csv.Dialect):
lineterminator = '
'
delimiter = ';'
quotechar = '"'
quoting = 0
reader=csv.reader(f,dialect=my_dialect)
print reader
# :
# <_csv.reader object="" at="">
with open('mydata.csv','w')as f:
writer=csv.writer(f,dialect=my_dialect)
writer.writerow(('one','two','three'))
writer.writerow(('1','2','3'))
writer.writerow(('1', '2', '3'))
# mydata.csv :
# one;two;three
# 1;2;3
# 1;2;3
各csv文のパラメータは、キーワードの形式でcsvに提供することもできる.reader、サブクラスを定義する必要はありません:
reader=csv.reader(f,delimiter='|')
csv.writerは、自分で開いて書くことができるファイルオブジェクトとcsvを受け入れるセパレータファイルを手動で出力するために使用する.readerと同じ文とオプション:
#csv.writer write , writerow , ,
headers = ['Symbol', 'Price', 'Date', 'Time', 'Change', 'Volume']
rows = [{'Symbol':'AA', 'Price':39.48, 'Date':'6/11/2007',
'Time':'9:36am', 'Change':-0.18, 'Volume':181800},
{'Symbol':'AIG', 'Price': 71.38, 'Date':'6/11/2007',
'Time':'9:36am', 'Change':-0.15, 'Volume': 195500},
{'Symbol':'AXP', 'Price': 62.58, 'Date':'6/11/2007',
'Time':'9:36am', 'Change':-0.46, 'Volume': 935000},
]
with open('stock.csv','w') as f:
writer=csv.DictWriter(f,headers)
writer.writeheader()
writer.writerows(rows)
#stock.csv :
# Symbol,Price,Date,Time,Change,Volume
# AA,39.48,6/11/2007,9:36am,-0.18,181800
# AIG,71.38,6/11/2007,9:36am,-0.15,195500
# AXP,62.58,6/11/2007,9:36am,-0.46,935000
csv , , , :
# csv :
col_types=[str,float,str,str,float,int]
with open('stock.csv') as f:
f_csv=csv.reader(f)
headers=next(f_csv)
print headers
#
# ['Symbol', 'Price', 'Date', 'Time', 'Change', 'Volume']
for row in f_csv:
rows=tuple(convert(value) for convert,value in zip(col_types,row))
print rows
# :
# ('AA', 39.48, '6/11/2007', '9:36am', -0.18, 181800)
# ('AIG', 71.38, '6/11/2007', '9:36am', -0.15, 195500)
# ('AXP', 62.58, '6/11/2007', '9:36am', -0.46, 935000)
# :
field_types = [ ('Price', float),
('Change', float),
('Volume', int) ]
with open('stock.csv') as f:
for row in csv.DictReader(f): #row
print row
row.update((key,coversion(row[key]))
for key,coversion in field_types)
#key:price conversion:float,row.update(key) key row , conversion(row[key]) ,
# row[key] key value
print row
# : print row , print row
# {'Symbol': 'AA', 'Volume': '181800', 'Time': '9:36am', 'Date': '6/11/2007', 'Price': '39.48', 'Change': '-0.18'}
# {'Symbol': 'AA', 'Volume': 181800, 'Time': '9:36am', 'Date': '6/11/2007', 'Price': 39.48, 'Change': -0.18}
csv :
delimiter 。 “,”
lineterminator , “\r
”
quotechar ( ) 。 “"”
quoting 。 csv.quote_all( ),
csv.quote_minimal( ) quote_minimal
skipinitialspace 。 False
doublequote 。 True, 。
escapechar 。
まとめ:
(1) ,csv 。 , split re.split
。
(2) , CSV ,
Pandas 。Pandas pandas.read_csv() ,
CSV DataFrame 。 、
json形式の読み取りと書き込み:
jsonを通してloadsはjson文字列をpython形式に変換し、ディスクから読み出すことができます.
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
import sys
import json
obj="""
{"name":"Wes",
"places_lived":["United States","Spain","Germany"],
"pet":null,
"siblings":[{"name":"Scott","age":25,"pet":"Zuko"},
{"name":"Katie","age":33,"pet":"Cisco"}]
}
"""
result=json.loads(obj)
print result
# :
{u'pet': None, u'siblings':
[{u'pet': u'Zuko', u'age': 25, u'name': u'Scott'},
{u'pet': u'Cisco', u'age': 33, u'name': u'Katie'}],
u'name': u'Wes', u'places_lived': [u'United States', u'Spain', u'Germany']}
json.dumps python JSON 。
asjson=json.dumps(result)
print asjson # result json
( )json DataFrame 。
: DataFrame Json , ( , )
siblings=DataFrame(result['siblings'],columns=['name','age']) # result 'siblings', name,age
print siblings
# :
# name age
# 0 Scott 25
# 1 Katie 33
XMLとHTML:Web情報収集
pythonにはHTMLやxml形式のデータを読み書きできるライブラリがたくさんあります.lxmlはその1つであり,大きなものを効率的に解析することができる.lxmlには複数のプログラミングインタフェースがあります.まずlxmlを使います.htmlはHTMLを処理し、lxmlを用いる.objectifyはXML処理をします.
HTMLファイル処理:
HTML , ( Json、HTML XML)
(1) , URL, urllib2 , lxml 。
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
import sys
import json
from urllib2 import urlopen
from lxml.html import parse
from lxml import objectify
parsed=parse(urlopen('http://finance.yahoo.com/q/op?s=AAPL+Options'))
doc=parsed.getroot() # HTML (tag)
# HTML a , findall
links=doc.findall('.//a') # a ,
print links[15:20]
# : Html
# [,
# ,
# ,
# ,
# ]
(2) URL , get ( URL) text_content ( )
lnk=links[15]
print lnk # 28 a
print lnk.get('href') # get "href" URL
# :/quote/AAPL180601P00145000?p=AAPL180601P00145000
print lnk.text_content()
# :AAPL180601P00145000
# URL
urls=[lnk.get('href') for lnk in doc.findall('.//a')]
print urls
# :
# ['https://finance.yahoo.com/', '#Navigation', '#market-summary', '#Main', '#Aside',
# 'https://mail.yahoo.com/?.intl=us&.lang=en-US&.partner=none&.src=finance', '/quote/AAPL?p=AAPL',
# '/quote/AAPL/key-statistics?p=AAPL', '/quote/AAPL/profile?p=AAPL', '/quote/AAPL/financials?p=AAPL',]
(3) : , id 。 。
。tr ,th ,td
tables=doc.findall('.//table')
print tables
# :
# [, ]
calls=tables[0]
print calls #
# 。tr ,th ,td
#
rows=calls.findall('.//tr')
print rows # :
# :
def _unpack(row,kind='td'):
elts=row.findall('.//%s' % kind)
return [val.text_content() for val in elts]
print _unpack(rows[1]) #
# : rows[1] 2
# ['AAPL180608C00130000', '2018-05-04 11:45PM EDT', '130.00', '36.90', '53.40', '54.70', '0.00', '-', '1', '1', '0.00%']
print _unpack(rows[1],kind='th') # ,
# :['Strike','Symbol','Last','Chg','Bid','Ask']
(4) , DataFrame。 , 。
, pandas TextParser (read_csv )
from pandas.io.parsers import TextParser
def parse_option_data(table):
rows=table.findall('.//tr')
header=_unpack(rows[0],kind='th')
data=[_unpack(r) for r in rows[1:]]
return TextParser(data,names=header).get_chunk()
aa=parse_option_data(table=tables)
print DataFrame(aa)
lxmlを利用する.objectify解析xml:具体的には、xml解析ファイルを紹介する別の記事を参照してください.
aa.xmlの内容は次のとおりです.
1181251680
040000008200E000
1181572063
1800
Bring pizza home
1234360800
1800
Check MS Office website for updates
604f4792-eb89-478b-a14f-dd34d3cc6c21-1234360800
dismissed
def parseXML(xmlFile):
"""
Parse the xml
:param xmlFile:
:return:
"""
f=open(xmlFile) #1.
xml=f.read() #2.
f.close()
tree=etree.parse(StringIO(xml)) #3. etree.parse xml
context=etree.iterparse(StringIO(xml)) #4.etree.iterparse xml
for action,elem in context:
if not elem.text:
text="None"
else:
text=elem.text
print elem.tag+"=>"+text
if __name__=="__main__":
parseXML("aa.xml")
def parseXML(xmlFile):
"""
Parse the xml
:param xmlFile:
:return:
"""
f=open(xmlFile)
xml=f.read()
f.close()
tree=etree.parse(StringIO(xml))
context=etree.iterparse(StringIO(xml))
for action,elem in context:
if not elem.text:
text="None"
else:
text=elem.text
print elem.tag+"=>"+text
if __name__=="__main__":
parseXML("aa.xml")
# :
# begin = > 1181251680
# uid = > 040000008200E000
# alarmTime = > 1181572063
# state = > None
# location = > None
# duration = > 1800
# subject = > Bring
# pizza
# home
# appointment = >
#
# begin = > 1234360800
# duration = > 1800
# subject = > Check
# MS
# Office
# website
# for updates
# location = > None
# uid = > 604
# f4792 - eb89 - 478
# b - a14f - dd34d3cc6c21 - 1234360800
# state = > dismissed
# appointment = >
#
# zAppointments = >
2.バイナリデータフォーマット:書き込みと読み取り
(1) python pickle
データのバイナリフォーマットストレージを実現する最も簡単な方法の1つはpython内蔵pickleシーケンス化を使用することです.使いやすいようにpandasオブジェクトにはpickle形式でディスクにデータを保存するためのto_があります.pickleメソッド.
逆に、read_をディスクから読み込むpickle.
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
#
frame=pd.read_csv('ex1.csv')
print frame
# :
# a b c d message
# 0 1 2 3 4 hello
# 1 5 6 7 8 world
# 2 9 10 11 12 foo
(1) to_pickle
frame.to_pickle('frame_pickle')
(2) pickle pandas.load python,load , read_pickle
# pd.load('frame_pickle') #load , read_pickle
print pd.read_pickle('frame_pickle')
警告:pickleは短期ストレージフォーマットのみを推奨します.その理由は、フォーマットが永遠に安定していることを保証することが難しいからです.
今日のpickleのオブジェクトは、後続のバージョンのライブラリunpickleには出られません.
(2) HDF5 。
HDF 5は多種類の圧縮器の即時圧縮をサポートし、重複モードデータをより効率的に記憶することができ、メモリに直接入れられない非常に大きなデータセットに対して、
HDF 5は、ブロック読み書きを効率的に分割できるので、良い選択です.
pythonのHDF 5ライブラリには2つのインタフェース(PyTableとh 5 py)があり、h 5 pyは直接的で高度なHDF 5 APIアクセスインタフェースを提供しています.
一方、PyTableはHDF 5の多くの詳細を抽象化し、柔軟なデータコンテナ、テーブルインデックス、クエリー機能、およびコア外コンピューティング技術のいくつかのサポートを提供しています.
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
import tables
#
frame=pd.read_csv('ex1.csv')
print frame
# :
# a b c d message
# 0 1 2 3 4 hello
# 1 5 6 7 8 world
# 2 9 10 11 12 foo
#
random_state = np.random.RandomState(1999)
def make_random_cluster_points(n_samples, random_state=random_state):
mu_options = np.array([(-1, -1), (1, 1), (1, -1), (-1, 1)])
sigma = 0.2
mu_choices = random_state.randint(0, len(mu_options), size=n_samples)
means = mu_options[mu_choices]
return means + np.random.randn(n_samples, 2) * sigma, mu_choices
def plot_clusters(data, clusters, name):
plt.figure()
colors = ["#9b59b6", "#3498db", "#e74c3c", "#2ecc71"]
for i in np.unique(clusters):
plt.scatter(data[clusters==i, 0], data[clusters==i, 1], color=colors[i])
plt.axis('off')
plt.title('Plot from %s' % name)
#(1) :open_file( ,'w'),create_array()
data, clusters = make_random_cluster_points(10000)
plot_clusters(data, clusters, "data in memory")
# plt.show() #
#PyTables
sample_data,sample_clusters=make_random_cluster_points(10000) #
hdf5_path="my_data.hdf5" #
hdf5_file=tables.open_file(hdf5_path,mode='w')
data_storage=hdf5_file.create_array(hdf5_file.root,'data',sample_data)
#hdf5_file.root "/",data array "/data",data sample_data .data
clusters_storage=hdf5_file.create_array(hdf5_file.root,'clusters',sample_clusters)
hdf5_file.close()
#(2) :open_file( ,'r'),hdf5_file.root.data[:]
hdf5_path="my_data.hdf5"
read_hdf5_file=tables.open_file(hdf5_path,mode='r')
hdf5_data=read_hdf5_file.root.data[:] # read_hdf5_file data
hdf5_clusters=read_hdf5_file.root.clusters[:] # read_hdf5_file clusters
read_hdf5_file.close()
plot_clusters(hdf5_data,hdf5_clusters,"PyTables Array")
plt.show()
注意:HDF 5はデータベースではありません.「1回の書き込み複数回の読み取り」のデータセットとして最適です.データはいつでもファイルに追加できますが、複数の書き込み操作が同時に発生すると、ファイルが破壊される可能性があります.
(3) Microsoft Excel
pandas ExcelFile Excel 。 ExcelFile (python excel )xlrd
openpyxl , 。
# excel :
xls_file=pd.ExcelFile('data.xls')
# parse DataFrame
table=xls_file.parse('Sheet1')
3.HTMLとWeb API:requestパッケージのgetを使用してデータを読み込む
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
import tables
import requests
import json
# url='https://twitter.com/search?q=python+pandas'
url='https://twitter.com/search?q=python%20pandas&src=typd'
resp=requests.get(url)
print resp.text
data=json.loads(resp.text) # resp json
print data
print data.keys()
# tweet , results DataFrame:
tweet_fields=['created_at','from_user','id','text']
tweets=DataFrame(data['result'],columns=tweet_fields)
print tweets.ix[7]
4.データベースの使用
sqlite3 :
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
import tables
import requests
import json
import sqlite3
(1)
query="""
CREATE TABLE test
(a VARCHAR (20),b VARCHAR (20),
c REAL, d INTEGER );
"""
con=sqlite3.connect(':memory:')
con.execute(query)
con.commit()
(2)
data=[('Atlanta','Georgia',1.25,6),
('Tallahassee','Florida',2.6,3),
('Sacramento','California',1.7,5)]
stmt='INSERT INTO test VALUES(?,?,?,?)'
con.executemany(stmt,data)
con.commit()
# ,
cursor=con.execute('select * from test')
rows=cursor.fetchall()
print rows
# :sqlite3
[(u'Atlanta', u'Georgia', 1.25, 6),
(u'Tallahassee', u'Florida', 2.6, 3),
(u'Sacramento', u'California', 1.7, 5)]
(3) DataFrame , ( description )
print cursor.description
# :
(('a', None, None, None, None, None, None),
('b', None, None, None, None, None, None),
('c', None, None, None, None, None, None),
('d', None, None, None, None, None, None))
(4) DataFrame
result=DataFrame(rows,columns=zip(*cursor.description)[0])
print result
# :
# a b c d
# 0 Atlanta Georgia 1.25 6
# 1 Tallahassee Florida 2.60 3
# 2 Sacramento California 1.70 5
(5) ,pandas read_sql ( pandas.io.sql )。
# select 。
import pandas.io.sql as sql
# print sql.read_sql('select * from test',con)
# pd.read_sql sql
df= pd.read_sql('select * from test',con)
# :
# a b c d
# 0 Atlanta Georgia 1.25 6
# 1 Tallahassee Florida 2.60 3
# 2 Sacramento California 1.70 5
aa=DataFrame(df)
print aa
mysql :
# mysql
import pymysql
import configparser
config =configparser
(1)
db=pymysql.connect("localhost","root",
"root","imooc")
cursor=db.cursor() #
(2) execute() sql
cursor.execute("select * from test1")
data=cursor.fetchall()
print data
# :4 ,mysql
# ((1, 'tang seng', 79, 'xi tian qu jing', '11783213,131313133,78271783918'),
# (2, 'zhu ba jie', 61, 'xi tian qu jing', '787138912,83918933'),
# (3, 'sun wu kong', 91, 'ji tian da sheng', '1378219389,17898932183,1841898344,1989839898'),
# (4, 'sha seng', 71, 'xi tian qu jing', '1649281938,15089328109'))
#
(3) cursor.description ,
print cursor.description #
# :
# ((u'id', 3, None, 11, 11, 0, 0),
# (u'user_name', 253, None, 20, 20, 0, 1),
# (u'score', 3, None, 2, 2, 0, 1),
# (u'over', 253, None, 40, 40, 0, 1),
# (u'mobile', 253, None, 100, 100, 0, 1))
print type(zip(*cursor.description)[0])
(4) data DataFrame ,pandas list DataFrame, Data , list
result=DataFrame(list(data),columns=zip(*cursor.description)[0])
print result
# :
# id user_name score over \
# 0 1 tang seng 79 xi tian qu jing
# 1 2 zhu ba jie 61 xi tian qu jing
# 2 3 sun wu kong 91 ji tian da sheng
# 3 4 sha seng 71 xi tian qu jing
#
# mobile
# 0 11783213,131313133,78271783918
# 1 787138912,83918933
# 2 1378219389,17898932183,1841898344,1989839898
# 3 1649281938,15089328109
(5) read_sql :
import pandas.io.sql as sql
result=sql.read_sql('select * from test1',db)
print result
# :
# id user_name score over \
# 0 1 tang seng 79 xi tian qu jing
# 1 2 zhu ba jie 61 xi tian qu jing
# 2 3 sun wu kong 91 ji tian da sheng
# 3 4 sha seng 71 xi tian qu jing
#
# mobile
# 0 11783213,131313133,78271783918
# 1 787138912,83918933
# 2 1378219389,17898932183,1841898344,1989839898
# 3 1649281938,15089328109
db.close()
:(1)DataFrame list :sqlit3 fetchall , DataFrame ,
mysql , list.
mongoDB :
NoSQLデータベースにはさまざまな形式があります.単純なディクショナリキー値ペアで格納されるものもあれば、ドキュメントベースのものもあります(基本ユニットはディクショナリ型のオブジェクトです).
from pandas import Series,DataFrame
import pymongo
import datetime
# import configparser
# config =configparser
(1)mongodb
con=pymongo.MongoClient('localhost',port=27017)
(2)
# tweets=con.test_database
(3) : mongodb ,
# collection=tweets.test_collection
post = {"author": "Mike",
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()}
(4)
posts=tweets.posts
post_id=posts.insert_one(post).inserted_id
(5)
import pprint
pprint.pprint(posts.find_one({"author":"Mike"}))
(6) DataFrame
p=DataFrame(post,columns=post.keys())
print p