☆☆ 新着記事 ☆☆

2019年6月19日水曜日

Tweepyで条件を指定してデータを抽出する



◇Status ID を指定して、データを取り出す。

id_list= [1138782665757380619]
tweets = api.statuses_lookup(id_list)
tweet_txt = []
    for i in tweets:
        tweet_txt.append(i.text)
    print(tweet_txt[0])

◇Cursor

query ="Rugby World Cup"
count =10

tweets = tw.Cursor(api.search, q="Rugby World Cup min_faves:10 min_retweets:5 exclude:retweets",result_type="recent",                       include_entities="True",tweet_mode="extended", lang="en").items(count)

2019年6月12日水曜日

Sqlite3 の’SQL文’を使ってみる。

本当はFlask SQLAlchemyを習得したくて、幾つかのTutorialをみて、簡単なCRUDは作れるようになったのだけど、実際に、では実用に足りるDatabeseを自分で作ってみようと思うと、チュートリアルに書いてあることでは、基本(データベース・テーブルの確認、データベース自身の削除)などさえ出来ないので、少し基本からやりなおす。

まずは、Python3に標準でついてくるsqlite3 を Python3から使う方法を学習する。

== databaseのオンラインチェック用 url ==


SQLiteのコマンドラインを直接操作する場合は、こちらの投稿を。
SQLiteのコマンドラインから操作する。





1. Setting Up A Connection

python app. に以下を記述しながら学習する。

◇  インポート
import sqlite3

◇sqlite3へのコネクションの作成
connection = sqlite3.connect('example.db')
なければ、example.dbが作られる。

この段階でPython IDEでファイルを実行すると、'example.db'が作成できる。
(又は, windowsのcmdからpython を起動して実行しても同じ結果。)


◇cursor object の作成: .cursor()

dbとのやりとりが可能になる。
cursor = connection.cursor()


◇Statementの実行: .execute( )

*テーブルの作成
Pt.1) Table名: namesの作成の場合
cursor.execute('CREATE TABLE names (id INTEGER PRIMARY KEY, name TEXT)')

Pt.2)  Table名: urlの作成の場合
cursor.execute('CREATE TABLE url (id INTEGER PRIMARY KEY, url TEXT, count INTEGER);')

*テーブルが作られた後で、再びこのコードを実行するとエラーになる。


*データの挿入

変数の引数として代入する変数に、一度 ? を置いて、次に代入する値を引数として指定する。 これはSQL Injenction(セキュリティ)対策上のベストプラクティス。.format を使用したり、 単純にstrings と + で記述するよりも安全と言われている。

Pt.1) Table名: namesの作成の場合
cursor.execute('INSERT INTO names VALUES(?, ?)', (1, "Donald"))


Pt.2)  Table名: urlの作成の場合
cursor.execute('INSERT INTO url(url, count) VALUES(?, ?)', (url, 0))

* SQLiteでは、IntegerにPrimary Keyが設定された場合、自動で番号が付与されるため、このケースでidに値を与える必要がない。


*データベースに反映(commit)する
connection.commit()

この段階でデータベースを確認すると、以下の図のよう。




*データベースの追加
cursor.execute('INSERT INTO names (name) VALUES(?)', ("Richard"))
connection.commit()


cursor.execute('INSERT INTO names VALUES(?, ?)', (3, "Tom"))
connection.rollback()

*comitする前であれば、rollbackしてデータベースに登録しないことが可能。


*データベースを閉じる
connection.close()


以下のコードを一度に実行すると、

import sqlite3
connection = sqlite3.connect('example.db')
cursor = connection.cursor()
cursor.execute('CREATE TABLE names (id INTEGER PRIMARY KEY, name TEXT)')
cursor.execute('INSERT INTO names VALUES(?, ?)', (1, "Donald"))
cursor.execute('INSERT INTO names (name) VALUES(?)', ("Richard"))
connection.commit()
cursor.execute('INSERT INTO names VALUES(?, ?)', (3, "Tom"))
connection.rollback()
cursor.execute('INSERT INTO names VALUES(?, ?)', (4, "Tom"))
connection.commit()
connection.close()
(Output)



*データの検索:selection query
cursor.execute('SELECT * FROM names WHERE id=?', (1, ))
row = cursor.fetchone()

id = row[0]
name = row[1]
print("id :" +str(id))
print("name :" +str(name))
(output)
id :1
name :Donald

*データの検索:複数のrowが該当するような検索
cursor.execute('SELECT * FROM names')
row = cursor.fetchone()
while row is not None:
    id = row[0]
    name = row[1]
    print("id :" +str(id) + "     name :" +str(name))
    row = cursor.fetchone()

connection.commit()
(Print)
id :1     name :Donald
id :2     name :Richard
id :4     name :Tom

又は、fetchall()
cursor.execute('SELECT * FROM names')
rows = cursor.fetchall()
for row in rows:
    print("id :" +str(row[0]) + "     name :" +str(row[1]))


(Print)
id :1     name :Donald
id :2     name :Richard
id :4     name :Tom
 


*Databaseに作られているテーブルの全検索

>>> import sqlite3
>>> connection = sqlite3.connect('msg.db')
>>> cursor = connection.cursor()
>>> cursor.execute("select * from sqlite_master where type='table'")
<sqlite3.Cursor object at 0x0000000001F18880>
>>> for x in cursor.fetchall():
...     print(x)
...
('table', 'user', 'user', 2, 'CREATE TABLE user (\n\tid INTEGER NOT NULL, \n\tusername VARCHAR(20) NOT NULL, \n\temail V
ARCHAR(120) NOT NULL, \n\timage_file VARCHAR(20) NOT NULL, \n\tpassword VARCHAR(60) NOT NULL, \n\tPRIMARY KEY (id), \n\t
UNIQUE (username), \n\tUNIQUE (email)\n)')
('table', 'tw_msg', 'tw_msg', 5, 'CREATE TABLE tw_msg (\n\tid INTEGER NOT NULL, \n\ttime VARCHAR(6), \n\tmessage VARCHAR
(140), \n\thashtag VARCHAR(140), \n\turl VARCHAR(140), \n\tlength INTEGER, \n\tPRIMARY KEY (id), \n\tUNIQUE (id)\n)')

>>> cursor.description
(('id', None, None, None, None, None, None), ('time', None, None, None, None, None, None), ('message', None, None, None,
 None, None, None), ('hashtag', None, None, None, None, None, None), ('url', None, None, None, None, None, None), ('leng
th', None, None, None, None, None, None))


>>> cursor.execute('SELECT * FROM tw_msg')
<sqlite3.Cursor object at 0x00000000021E8880>
>>> for row in cursor.fetchall():
...     x = dict(zip([d[0] for d in cursor.description], row))
...     results.append(x)
...
>>> results
[{'id': 1, 'time': '1:10', 'message': '3個に変更', 'hashtag': '', 'url': ''}, {'id': 2, 'time': '12:20', 'message': 'ひよこのあと', 'hashtag': '', 'url': ''}]
>>>



参考)
https://www.youtube.com/watch?v=SQj17D1Q_6s

同じオーサーがちょっとだけ違う事例で説明、
https://nitratine.net/blog/post/python-sqlite3-basics/

テーブル要素の確認
https://teratail.com/questions/74005

(Sample Code)
Foodというテーブルを作成
Foodというテーブルを削除

>>> import sqlite3
>>> connection = sqlite3.connect('admin/msg.db')
>>> cursor = connection.cursor()
>>> cursor.execute('CREATE TABLE food (id INTEGER PRIMARY KEY, name TEXT)')
<sqlite3.Cursor object at 0x0000000001EF86C0>
>>> cursor.execute('INSERT INTO food VALUES(?, ?)', (1, "Ramen"))
<sqlite3.Cursor object at 0x0000000001EF86C0>
>>> cursor.execute("select * from sqlite_master where type='table'")
<sqlite3.Cursor object at 0x0000000001EF86C0>
>>> for x in cursor.fetchall():
...     print(x)
...
(テーブルが3つあるね、)
('table', 'user', 'user', 2, 'CREATE TABLE user (\n\tid INTEGER NOT NULL, \n\tusername VARCHAR(20) NOT NULL, \n\temail V
ARCHAR(120) NOT NULL, \n\timage_file VARCHAR(20) NOT NULL, \n\tpassword VARCHAR(60) NOT NULL, \n\tPRIMARY KEY (id), \n\t
UNIQUE (username), \n\tUNIQUE (email)\n)')
('table', 'tw_msg', 'tw_msg', 5, 'CREATE TABLE tw_msg (\n\tid INTEGER NOT NULL, \n\ttime VARCHAR(6), \n\tmessage VARCHAR
(140), \n\thashtag VARCHAR(140), \n\turl VARCHAR(140), \n\tlength INTEGER, \n\tPRIMARY KEY (id), \n\tUNIQUE (id)\n)')
('table', 'food', 'food', 7, 'CREATE TABLE food (id INTEGER PRIMARY KEY, name TEXT)')


>>> dropTableStatement = "DROP TABLE food"
>>> cursor.execute(dropTableStatement)
<sqlite3.Cursor object at 0x0000000001EF86C0>
>>> cursor.execute("select * from sqlite_master where type='table'")
<sqlite3.Cursor object at 0x0000000001EF86C0>
>>> for x in cursor.fetchall():
...     print(x)
...
(テーブルが2つになったね、)
('table', 'user', 'user', 2, 'CREATE TABLE user (\n\tid INTEGER NOT NULL, \n\tusername VARCHAR(20) NOT NULL, \n\temail V
ARCHAR(120) NOT NULL, \n\timage_file VARCHAR(20) NOT NULL, \n\tpassword VARCHAR(60) NOT NULL, \n\tPRIMARY KEY (id), \n\t
UNIQUE (username), \n\tUNIQUE (email)\n)')
('table', 'tw_msg', 'tw_msg', 5, 'CREATE TABLE tw_msg (\n\tid INTEGER NOT NULL, \n\ttime VARCHAR(6), \n\tmessage VARCHAR
(140), \n\thashtag VARCHAR(140), \n\turl VARCHAR(140), \n\tlength INTEGER, \n\tPRIMARY KEY (id), \n\tUNIQUE (id)\n)')
>>>







2019年6月2日日曜日

Zip関数の使い方とソート(lambda x: x[0])


import random
list1 = [random.randint(0,99) for i in range(10)]
list2 = [random.randint(100,199) for i in range(10)]
list3 = [random.randint(200,299) for i in range(10)]

print(list1)
print(list2)
print(list3)
[21, 87, 82, 63, 97, 79, 39, 17, 53, 67]                                        
[159, 181, 105, 146, 144, 192, 174, 152, 124, 169]                                
[219, 215, 275, 273, 287, 234, 233, 229, 209, 263] 

data =zip(list1,list2,list3)

for two_digits, One_hundreds, Two_hundreds in zip(list1,list2,list3):
    print(two_digits, One_hundreds, Two_hundreds)

                                   
21 159 219                                                                              
87 181 215                                                                              
82 105 275                                                                              
63 146 273                                                                              
97 144 287                                                                              
79 192 234                                                                              
39 174 233                                                                              
17 152 229                                                                              
53 124 209                                                                              
67 169 263                             


data_listed = list(data) #List化する
print(data_listed)
[(21, 159, 219), (87, 181, 215), (82, 105, 275), (63, 146, 273), (97, 144, 287), (79, 1  
92, 234), (39, 174, 233), (17, 152, 229), (53, 124, 209), (67, 169, 263)]  
    

res0 = sorted(data_listed, key = lambda x: x[0]#lambdaでソートする
print(res0)
#
[(17, 152, 229), (21, 159, 219), (39, 174, 233), (53, 124, 209), (63, 146, 273), (67, 1  
69, 263), (79, 192, 234), (82, 105, 275), (87, 181, 215), (97, 144, 287)]                

res1 = sorted(data_listed, key = lambda x: x[1])
print(res1)
[(82, 105, 275), (53, 124, 209), (97, 144, 287), (63, 146, 273), (17, 152, 229), (21, 1  
59, 219), (67, 169, 263), (39, 174, 233), (87, 181, 215), (79, 192, 234)]                

res2 = sorted(data_listed, key = lambda x: x[2])
print(res2)
[(53, 124, 209), (87, 181, 215), (21, 159, 219), (17, 152, 229), (39, 174, 233), (79, 1  
92, 234), (67, 169, 263), (63, 146, 273), (82, 105, 275), (97, 144, 287)]                

*降順にするのは、
(data_listed, key = lambda x: x[1], reverse=True) 

#
# Pyhton code to demonstrate
# sort zipped list by values
# using operator and sorted
 
import operator
# Declaring initial lists
list1 = ['akshat', 'Manjeet', 'nikhil']
list2 = [3, 2, 1]
zipped = zip(list1, list2)
 
# Converting to list
zipped = list(zipped)
 
# Printing zipped list
print("Initial zipped list - ", str(zipped))
 
# Using sorted and operator
res = sorted(zipped, key = operator.itemgetter(1))
     
# printing result
print("final list - ", str(res))

2019年6月1日土曜日

PandasのDataFrameへの要素へのアクセス



◇位置の指定方法

at, loc : 行ラベル(行名)、列ラベル(列名)
iat, iloc : 行番号、列番号

◇行ラベル(index)、列ラベル(columns)の確認方法
print(df.index.values)

print(df.columns.values)

print(df.columns)
# Index(['Date', 'Tweet', 'Like', 'RT', 'ID'], dtype='object')


◇行ラベルのインデックス番号だけを指定すると行全体の値が取得
print(df.values[0])
[Timestamp('2019-05-24 12:30:00')
 'I was right about Vietnam.\n\nI was right about Iraq.\n\nI will do everything in my power to
prevent a war with Iran.… https://t.co/TJu5zzV15P'
 93930 25154 1131900152795549696]

*df.values[0][0]は出来ない。iat, iloc参照。

◇at, iat : 単独の要素の値を選択、取得・変更
atはrowのLabel名とcolumnのLabel名で位置を指定する。
print(df.at['Bob', 'age'])
iat行番号と列番号で位置を指定する。行番号・列番号は0はじまり。<- これが便利。
print(df.iat[1, 0])


◇loc, iloc : 単独および複数の要素の値を選択、取得・変更
locとilocは単独の値だけでなく、範囲を指定して複数のデータを選択することができる。

locは行ラベルと列ラベルで位置を指定

ilocは行番号と列番号で位置を指定する。


A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html