Lei Feng.com: Daha önce, NBA tarihindeki en güçlü takımı analiz eden bir makale yayınlamıştık. Ayrıntılar için bkz. "Son dört yılın oyun verilerini Python ile analiz etmek. En güçlü NBA takımı ortaya çıktı". Bu sefer biz Bakalım en zayıfı hangisi? Orijinal yazar Kaiser, Jinglue Jizhi'nin genel müdürü Jizhi Ağ Sütunu Leifeng.com yetkilendirildi.
Makaledeki kodun bir kısmında, okuyucuların çevrimiçi olarak tamamlamaları ve değerlendirmeleri için bırakılan "kod tamamlama" kelimelerinin bulunduğu bir yorum olacaktır. Bu, küçük bir ev ödevine eşdeğerdir. Lütfen burada kendiniz yapın. (Editörün notu: tamamlanması gereken her bölüm için hızlı bilgi verilir)
Elo değeri, mevcut rekabetçi çevrimiçi oyunlarda merdiven sistemi gibidir.Ekip, her maçtan sonra performansa göre ayarlanır.Kazançlar artar ve kayıplar azalır, küçük kazançlar biraz artar ve büyük kazançlar büyük ölçüde artar. Elo değeri, bir takımın normal sezondaki beklentisini yansıtıyor. 1800'e karşılık gelen beklenti, hanedan düzeyinde bir takım olan 67'den fazla maç kazanmak. Belirli merdiven bölümleri şu şekilde dağıtılır:
ELO değeri eşleştirme kaydı karşılık gelen takım açıklaması
180067-15 epik seviye
170060-22 şampiyonluk yarışmacısı
160051-31 playoff seviyesi
150041-41 ortalama
140031-51 Loto seviyeleri
130022-60 suskun
120015-67 berbat
Tarihin en yüksek rekoru, bir zamanlar 1850 puanı aşan 1996 finallerindeki Bulls'tur.
Ünlü veri analizi web sitesi 538 (fivethirtyeight.com), 60.000'den fazla veri parçasıyla geçmiş NBA takviminin (2015 sezonuna) elo değeri kaydını sağlar. Veri miktarının büyük olduğu düşünülemez, ancak onu yerel olarak doğrudan Excel ile açarsanız, deneyimin hala oldukça acı verici olduğu tahmin edilmektedir. İşte nasıl kullanılacağı. Python + SQL Bununla başa çıkmak, Excel'de çalışan arkadaşların çoğuna yardımcı olabilir.
Tuple, Python'da yaygın olarak kullanılan başka bir veri türüdür.Bir listeye çok benzer.Her ikisi de birkaç öğe içerebilir ve öğelerin çağrılması köşeli parantezler + dizin biçimindedir.
sample_list =
sample_tuple = (0,1,2,3)
# Listenin ilk öğesi
sample_list
# Demetin ikinci öğesi
sample_tuple
Ana farklar şunlardır:
Başlıklar köşeli parantezlerle tanımlanır ve listeler köşeli parantezlerle tanımlanır
Tuple'lar değiştirilemez
Tek bir öğe olsa bile, bir virgül gereklidir, örneğin (madde 1,) . Bu virgül eksikse, bir demet değil, yine de öğenin kendisini elde edersiniz.
Tuplelar sadece tanımlandıklarında atanabilir, zorla değiştirilirlerse, yorumlayıcı tarafından bir hata istenecektir.
TypeError:
"tuple" nesnesi, öğe atamasını desteklemiyor
Bazı işlevlerin dönüş değeri sayısal bir değer veya karakter değildir, ancak birden çok çıktıya sahiptir ve ardından tuple biçiminde bulunur. Örneğin, aşağıdaki örnek iki giriş parametresinin toplamını ve ürününü döndürür, Çalıştırmak Kontrol edin, iki çıkış içeride.
def sum_times (x, y):
return (x + y), (x * y) sum_times (2,3)
Önceki eğitimlerde, hem programda oluşturulan hem de metin dosyalarında depolanan bazı veri kümelerine maruz kaldık. Daha büyük veri kümeleri genellikle dosyalarda saklanır ve program çalışırken belleğe okunur.
Bununla birlikte, dosya depolama verileri (.txt veya .csv) hala büyük sorunlarla karşı karşıyadır. Birincisi, veri miktarı bilgisayar belleğinden daha büyük olduğunda, ağır bir hesaplama yükü getirecek ve hatta çalıştırılamayacaktır; ikincisi, veriler yüksek frekanslı olabilir Değişiklikler, örneğin, e-ticaret şirketleri, Double 11'in en yoğun olduğu dönemde saniyede on binlerce işlem gerçekleştirir ve sıradan dosya formatları açıkça bunları kaldıramaz.
Böylece veritabanı (veritabanı) ortaya çıktı. Veritabanı ilk Yapılandırılmış Verileri daha esnek bir şekilde işlemek için veri saklama yöntemi, program artık tüm verileri tek seferde belleğe değil, belirli ihtiyaçlara göre okur Sorgu İlgili veri setini elde etmek için. Bu görevler için programlama diline SQL (Yapılandırılmış Sorgu Dili) , Bilgisayarda biraz sağduyu sahibi arkadaşlar bu kısaltmaya aşina olmalıdır.
Tanınmış ilişkisel veritabanı yönetim sistemleri arasında MySQL, Oracle vb. Yer alır.
SQL, veritabanlarını sorgulamak ve çalıştırmak için özel olarak tasarlanmış bir dildir, bu nedenle işlevler açısından zengin değildir ve Python ve JavaScript gibi diller kadar çeşitli değildir.
Bir veritabanı birkaç taneden oluşur Tablo Kompozisyon, tıpkı her Excel dosyasında birden çok E-Tablo olduğu gibi. Her tablo şunları içerir Kürek çekmek karşı Sütun , Bunu anlamak daha kolay. Bir satır bir örneği temsil eder ve birden çok sütun her boyuttaki öznitelikleri tanımlar.
SQLite Çok düşük kaynak kullanımı ve hızlı işlem hızına sahip hafif bir veritabanı yönetim sistemidir.Sürüm 3'e güncellendi. Python, SQLite ifadelerini işlemeye ayrılmış bir kitaplığa sahiptir sqlite3 .
ithal sqlite3
Aşağıda, SQL'in temel kurallarını ve uygulama yöntemlerini anlamak için bir örnek olarak geçmiş NBA zamanlama verilerinden bir parça alacağız. (Veri kaynağı: FiveThirtyEight)
Veritabanıyla en temel iletişim biçimi, koşulları karşılayan bir veri alt kümesini döndüren sorgudur.Temel anahtar sözcük SELECT ve ardından seçilen sütunun başlığıdır. Daha önce belirtildiği gibi, bir veritabanında birden çok tablo olabilir, bu nedenle sorgu ifadesi kaynak tabloyu belirtmelidir ve anahtar sözcük FROM'dur.
SEÇİN sütun1, sütun2, ... tablodan;
SQL'in cümlenin sonunda Python'un alışkanlıklarından çok farklı olan ve C ++ tarafından yönetilme korkusunu uyandıran bir noktalı virgül (;) gerektirdiğini unutmayın.
NBA veritabanı, adında yalnızca bir tablo içerir çarşaf Sayfayı sorgulamak istediğimizi varsayalım team_id Sütun, ardından karşılık gelen SQL:
Nba_history'den team_id'i SEÇİN;
Veritabanı çok büyükse, yalnızca belirli sütunları sorgulasanız bile, bu küçük bir hesaplama miktarı değildir. Burada yeni anahtar sözcükler tanıtabilirsiniz. SINIR , Sorgulamak istediğiniz satır sayısı ile devam edin. Sadece cepheyi istemek gibi 5 tamam team_id Sütun, ardından SQL:
Nba_history LİMİT 5'DEN team_id'i SEÇİN;
Aşağıdaki örnek, iki sütun elo_n ve win_equiv'in ilk 5 satırını sorgulamak için Python aracılığıyla SQLite'ı çağıracaktır:
ithal sqlite3
conn = sqlite3.connect ('/ mnt / vol0 / Py_Intro / 05_tuple_database / nbaallelo.db')
cur = bağlaç
# Kod tamamlama
sorgu =
# Kod tamamlama
cur.execute (sorgu)
elos = cur.fetchall
connect.close
baskı (elos)
Tamamlama ipuçları: Örneği hatırlayın, anahtar sözcükler arasındaki adları değiştirin ve karakter türünü değişken sorguya atayın
Sorgu ifadesinin eleman olarak tuplelar içeren bir liste döndürdüğü görülebilir. Yukarıdaki örneğin çıktısı 5 (elo_n, win_equiv) listesidir ve şöyle olmalıdır:
Bölüm 04'ün son örneğinde SQL deyimlerine ek olarak birçok Python komutu vardır.Bunlar Python'un SQLite olarak adlandırdığı ifadelerdir.
Bağlantı nesnesi
Birincisi veritabanı ile bağlantı kurmak, sqlite3.connect Dönecek Bağ Örnek nesnesi ve farklı kaydet bağlantı Şu anda değişken bağlantı Karşılık gelen tüm veritabanıdır.
ithal sqlite3
conn = sqlite3.connect ("/ mnt / vol0 / Py_Intro / 05_tuple_database / nbaallelo.db")
İmleç nesnesi
Bağ Nesnesi .cursor Bir imleç nesnesi (imleç nesnesi) oluşturabilirsiniz. İmleç nesnesi, veri tabanında SQL deyimlerini yürütebilir ve daha esnek veri işlemleri gerçekleştirebilir.
Wang Mang'ın imleci
sorgu Saf bir SQL ifadesidir, geçti cur.execute Gerçek yürütmede, veritabanı sorgusunun sonucu hala cur nesnesindedir. Son çağrı cur.fetchall Tüm sorgu sonuçlarını döndürün ve bunları değişkenlere kaydedin elos , Tupleların son listesidir.
Yalnızca bir sorgu sonucu döndürmek istiyorsanız, kullanabilirsiniz cur.fetchone .
Python ve SQLite3'ün ortak uygulaması ileride derinlemesine anlatılacaktır.Bu makale yine de SQL ifadelerine odaklanacaktır.
Veritabanındaki belirli bir tablodan yalnızca belirli bir sütunun ilk birkaç satırını sorgulamak çok kısıtlayıcıdır ve uygulama gereksinimlerini karşılamak zordur. Aslında, ilgilendiğimiz veri alt kümesi her zaman sırayla düzenlenmez, ancak belirli kısıtlamaları karşılar.
Kesin sorgunun kapsamını daha da azaltmak için, WHERE anahtar sözcüğünü kullanabilirsiniz. Örneğin, NBA tarihinde elo_n değeri 1850'den yüksek olan güçlü takımların kimliğini sorgulamak istersek, SQL ifadesi şu şekildedir:
ELO_n NEREDE sayfasından takım_kimliği, elo_n seçin > 1850
Sorgu sonuçları, tarihteki elo değeri 1850'yi geçen tek takımın 1996 Finalleri sırasında Chicago Bulls olduğunu gösteriyor.
Lütfen aşağıdan bilgi alın elo_n Altında 1100 Zayıf takımın kimliği ve ilgili maç tarihi. Sqlite3 kütüphanesi, bağlantı nesneleri ve imleç nesneleri önceden tanımlanmıştır.SQL sorgu deyimi sorgusunu tanımlayarak başlayabilirsiniz.
# Kod tamamlama
sorgu =
# Kod tamamlama
cur.execute (sorgu)
elo_1100 = cur.fetchall
connect.close
baskı (elo_1100)
Tamamlama ipuçları: Lütfen "fran_id", "date_game", "elo_n" sırasıyla sorgulayın.
Sorgu ve taramanın sonuçları, tarihte 1100'ün altına düşen tek zayıfların 1968'de sadece "Squires" adlı bir takım olduğunu gösteriyor.
O kadar zayıflar ki, kötü isimden ayrılamaz diye düşünüyorum. "Efendi", İngilizce'de "hizmetçi" anlamına gelir. Hearthstone'da 11 Squire gibi "Squire" adında birçok hizmetçi vardır:
Leifeng.com (genel hesap: Leifeng.com) ile ilgili okuma:
Geçtiğimiz dört yılın oyun verilerini analiz etmek için Python'u kullanan en güçlü NBA takımının bu olduğu ortaya çıktı.
Zen ve göğüs maskesi tanıma sanatı (bölüm 1)