Python ile bir dizüstü bilgisayarda 100 GB veri nasıl analiz edilir?

Birçok kuruluş, işlerini geliştirmek, geliri artırmak ve etkiyi artırmak için olabildiğince fazla veri toplamak ve kullanmak ister. Bu nedenle, veri bilimcilerin 50GB ve hatta 500GB veri setleriyle karşılaşması giderek daha yaygın hale geliyor.

Şu anda, bu veri setlerinin işlenmesi biraz zahmetlidir. Boyut olarak, dizüstü bilgisayarınızın sabit sürücüsüne sığabilirler, ancak belleğe sığmazlar. Bu nedenle, daha fazla araştırma ve analiz bir yana, onları sadece açıp görüntülemek zordur.

Böyle bir veri seti ile uğraşırken, genellikle üç strateji vardır.

Birincisi, veriyi alt-örneklemektir, ancak bunun bariz bir kusuru vardır: verinin bir kısmını görmezden geldiği için önemli bilgileri gözden kaçırabilir veya hatta verilerin anlamını yanlış anlayabilir.

İkincisi, dağıtılmış bilgi işlem kullanmaktır. Bu, bazı durumlarda etkili bir yöntem olsa da, kümelenmeyi yönetmek ve sürdürmek büyük bir ek yük getirecektir. Hafıza boyutunu aşan ve yaklaşık 30-50GB olan bir veri kümesi için bir küme oluşturduğunuzu düşünün, bu bana biraz "aşırı" görünüyor.

Üçüncüsü, veri kümesinin boyutuna eşit bir bellek boyutuna sahip güçlü bir bulut hizmeti örneği kiralamaktır.Örneğin, AWS, terabaytlarca belleğe sahip bir bulut hizmeti örneği sağlar. Ancak bu durumda, bulut veri depolama alanını da yönetmeniz ve örneğin her başladığında depolama alanından örneğe veri aktarılmasını beklemeniz gerekir. Ek olarak, buluta veri geçişinin uyumluluk sorunları ile ilgilenmek ve uzak makinelerde çalışmanın getirdiği zorluklara katlanmak gerekir. Maliyetten bahsetmiyorum bile, ilk başta görece düşük olsa da zamanla hızla artacaktır.

Bu makale, bu veri kümesi dizüstü bilgisayarınıza, masaüstünüze veya sunucunuza yüklenebildiği sürece, hemen hemen her boyuttaki veri kümeleri üzerinde veri bilimi araştırmaları için daha hızlı, daha güvenli ve daha kullanışlı ve kapsamlı olabilecek yeni bir yöntemi gösterir. Sabit sürücüde.

Vaex

Vaex, açık kaynaklı bir DataFrame kitaplığıdır. Sabit disk alanınızla aynı boyutta bir tablo veri kümesi için makine öğrenimini etkili bir şekilde görselleştirebilir, keşfedebilir, analiz edebilir ve hatta pratik yapabilir.

Vaex, bu işlevleri gerçekleştirmek için bellek haritalama, verimli çekirdek dışı algoritmalar ve gecikmeli hesaplamalar gibi kavramları benimser. Bunların tümü Pandalar benzeri API'ler olarak kapsüllenmiştir, böylece herkes hızlı bir şekilde başlayabilir.

1 milyar taksinin veri analizi

Bu kavramları açıklamak için, tipik bir dizüstü bilgisayarın bellek boyutunu çok aşan bir veri kümesini kısaca araştırdık ve analiz ettik.

Burada, ikonik sarı taksi taksi yolculuğu bilgilerini 2009 ve 2015 arasında bir milyardan fazla kez içeren New York City (NYC) Taksi veri setini kullanıyoruz.

Veriler web sitesinden indirilir ve CSV formatında sağlanır. Tam analiz bu Jupyter not defterinde ayrı olarak görüntülenebilir.

100G veri setini 0,052 saniyede açın

İlk adım, verileri Apache Arrow, Apache Parquet veya HDF5 gibi bellek eşlemeli bir dosya biçimine dönüştürmektir. CSV verilerinin HDF5'e nasıl dönüştürüleceğine ilişkin bir örnek için lütfen buraya bakın. Veriler bellek eşlemeli biçimde kaydedildikten sonra, disk boyutu 100 GB'ı aşsa bile Vaex verileri anında açabilir (0,052 saniye):

Vaex, bellek eşlemeli dosyayı anında açar (0,052 saniye)

Neden bu kadar hızlı Vaex ile bellek eşlemeli dosyayı açarken, veriler gerçekte okunmaz. Vaex yalnızca diskteki verilerin konumu, veri yapısı (satır sayısı, sütun sayısı, sütun adları ve türleri), dosya açıklamaları vb. Gibi dosya meta verilerini okur. Ya verileri görüntülemek veya değiştirmek istiyorsanız?

Veri sonuçları, önizleme için standart bir DataFrame'de görüntülenir ve hız da çok hızlıdır.

New York City Yellow Taxi verilerini önizleyin

Kod birimi yürütme süresi hala çok kısadır. Bunun nedeni, Vaex DataFrame'i veya bir sütunu görüntülemek için, sabit diskten yalnızca ilk 5 satır ve son 5 satır verinin okunması gerektiğidir. İşte başka bir nokta geliyor: Vaex, yalnızca gerekli olduğunda tüm veri kümesini geçecek ve mümkün olduğunca az veriyi geçecektir.

Her halükarda bu veri setini aykırı değerlerden ve yanlış girdi değerlerinden temizleyelim. Örneklerin sayısını, eksik değerlerin sayısını ve her bir sütunun veri türünü görüntüleyebilen verilere üst düzey bir genel bakış elde etmek için açıklama yöntemini kullanmak iyi bir yöntemdir.

Bir sütunun veri türü sayısal ise, ortalama, standart sapma, minimum ve maksimum değerleri de gösterecektir. Ve tüm bu veriler bir veri geçişi yoluyla hesaplanır.

DataFrame'e üst düzey bir genel bakış elde etmek için açıklama yöntemini kullanın. Bu DataFrame'in 18 veri sütunu içerdiğini, ancak ekran görüntüsünün yalnızca ilk 7 sütunu gösterdiğini unutmayın.

Açıklanan yöntem, Vaex'in yeteneği ve verimliliğinin iyi bir örneğidir: tüm bu veriler MacBook Pro'mda (15 inç, 2018 model, 2,6 GHz Intel Core i7 ve 32G bellek) 3 dakikada hesaplanır. Diğer kitaplıklar veya yöntemler, aynı hesaplamayı tamamlamak için dağıtılmış bilgi işlem veya 100 GB'tan fazla bulut hizmeti örneği gerektirir. Vaex ile tek ihtiyacınız olan veri ve birkaç GB belleğe sahip bir dizüstü bilgisayardır.

Tanımlamanın çıktısına bakıldığında, bu verilerin bazı bariz aykırı değerler içerdiğini bulmak kolaydır.

Her şeyden önce, toplama noktasını kontrol etmekten başlayarak, aykırı değerleri kaldırmanın en kolay yolu, teslim alma ve bırakma noktalarını çizmek ve New York'un hangi alanlarının analiz için ilgi çekici olduğunu görsel olarak belirlemektir. İşlenecek veri seti çok büyük olduğu için histogram en etkili görselleştirme yöntemidir. Vaex ile histogramlar ve ısı haritaları oluşturmak ve görüntülemek oldukça hızlıdır ve grafikler hala etkileşimlidir!

df.plot_widget (df.pickup_longitude, df.pickup_latitude, şekil = 512, limitler = 'minmax', f = 'log1p', colormap = 'plazma')

New York'un hangi alanlarının odaklanacağımız alanlar olduğunu etkileşimli olarak belirledikten sonra, filtrelenmiş bir DataFrame oluşturabiliriz:

Yukarıdaki kodla ilgili harika olan şey, çok az hafıza ile çalıştırılabilmesidir! Vaex DataFrame filtrelenirken hiçbir veri kopyalanmaz. Bunun yerine, sadece orijinal nesneye bir referans oluşturur ve üzerine bir ikili maske uygular. Hangi satırların görüntüleneceğini ve gelecekteki hesaplamalarda kullanılacağını seçmek için maskeyi kullanın. Bu bize 100 GB bellek tasarrufu sağlıyor ve bugünkü gibi birçok standart veri bilimi aracı verileri kopyalamak zorunda.

Şimdi, yolcu_sayısı sütununa bakın. Tek bir taksi yolculuğunda maksimum yolcu sayısı 255, bu biraz abartılı görünüyor. Her yolculuktaki yolcu sayısını sayalım, işte value_counts yöntemiyle elde etmek kolaydır:

1 milyar satırlık veride value_counts yöntemini kullanmak yalnızca 20 saniye sürer!

Yukarıdaki şekilden de görülebileceği gibi, 6'yı aşan yolcu sayısı nadir bir aykırı değer veya yanlış veri girişi olabilir. Ayrıca 0 yolcu ile çok sayıda yolculuk vardır. Bu programların makul olup olmadığını bilmediğim için önce onları filtreliyorum.

Seyahat mesafesi için benzer bir egzersiz yapın. Sürekli bir değişken olduğu için seyahat mesafesinin dağılımını çizebiliriz. Seyahat mesafesinin minimum değeri negatiftir ve maksimum değer Mars'tan daha uzaktır, bu nedenle histogramı makul bir aralık içinde çizmek yine de sınırlıdır.

New York Taksi Veri Yolculuğu Mesafe Histogramı

Yukarıdaki şekilden de görülebileceği gibi, vuruş sayısı mesafe arttıkça azalmaktadır. Yaklaşık 100 millik bir mesafede, dağılımda önemli bir azalma var. Şimdi, bunu seyahat mesafesindeki aykırı değerleri ortadan kaldırmak için bir kesme noktası olarak kullanıyoruz.

Seyahat mesafesi sütununda aykırı değerler vardır, bu nedenle seyahat süresini ve ortalama hızı kontrol etmek için bir teşvik vardır. Bu iki karakteristik veri, veri setinde sağlanmaz, ancak hesaplanması kolaydır:

Yukarıdaki kod bloğu bellek gerektirmez ve yürütme süresini tüketir! Bunun nedeni, kodun yalnızca matematiksel ifadeler içeren ve yalnızca gerektiğinde hesaplanan sanal sütunlar oluşturmasıdır. Aksi takdirde, sanal sütunlar diğer normal sütunlarla aynıdır. Diğer standart kitaplıkların aynı işlemi gerçekleştirmek için onlarca GB bellek gerektirebileceğini unutmayın.

Tamam, seyahat süresinin dağılımını çizelim:

New York'ta 1 milyardan fazla taksi yolculuğunu harcayan zamanın histogramı

Yukarıdaki şekilden de görülebileceği gibi, taksi yolculuklarının% 95'inin varış noktalarına ulaşması 30 dakikadan az sürer, ancak bazı yolculuklar 4-5 saatten fazla sürebilir. New York'ta 3 saatten fazla bir takside sıkışıp kaldığınızı hayal edebiliyor musunuz? Her halükarda, açık fikirliyiz ve yalnızca 3 saatten kısa bir yolculuğu düşünürüz:

Ortalama taksi hızı için ayrıca makul bir aralık seçin:

Ortalama taksi hızı dağılımı

Dağıtımın düzleştiği konuma göre, taksinin makul ortalama hızının saatte 1 ila 60 mil arasında olduğu çıkarılabilir, böylece filtrelenmiş DataFrame güncellenebilir:

Odağı taksi yolculuğunun maliyetine çevirin. Açıklama yönteminin çıktısından, fare_amount, total_amount ve tip_amount sütunlarının bazı abartılı aykırı değerlere sahip olduğunu görebilirsiniz. İlk olarak, bu sütunların hiçbiri negatif değere sahip olmamalıdır.

Öte yandan, bazı rakamlar, bazı şanslı sürücülerin sadece taksiyle milyoner olacağına işaret ediyor. Makul bir aralıktaki bu miktarların dağılımına bakalım:

New York'ta 1 milyardan fazla taksi yolculuğu için ücretlerin, toplamların ve bahşişlerin dağılımı. Bu çizelgeleri bir deftere çizmek yalnızca 31 saniye sürdü!

Yukarıdaki üç dağılımın hepsinin oldukça uzun kuyrukları vardır. Kuyrukta bazı doğru değerler olabilirken diğerleri yanlış girişler olabilir. Her durumda, muhafazakarız ve yalnızca fare_amount, total_amount ve tip_amount 200 $ 'dan az olan seyahatleri dikkate alıyoruz. Ek olarak, fare_amount ve total_amount değerleri sıfırdan büyük olmalıdır.

Son olarak, ilk temizliğin ardından, analiz için ne kadar taksi yolculuğu verisi kaldığını görün:

1,1 milyar yolculuk kaldı! Bu veriler, taksi yolculuklarından bazı değerli bilgiler edinmemiz için yeterli.

Sürücü koltuğuna oturun

Bir taksi şoförü veya bir taksi şirketinin yöneticisi olduğumuzu ve bu verileri, karları nasıl en üst düzeye çıkaracağımızı, maliyetleri nasıl en aza indireceğimizi veya sadece işimizi ve yaşamımızı nasıl iyileştireceğimizi anlamak için kullanmakla ilgilendiğimizi varsayalım.

İlk olarak, en yüksek ortalama geliri getirebilecek teslim alma yerini buluyoruz. Basitçe söylemek gerekirse, teslim alma yerinin bir ısı haritasını çizin, ortalama fiyatı renklerle işaretleyin ve ardından sıcak noktaları kontrol edin. Ancak taksi şoförlerinin yakıt masrafları gibi kendi masraflarını karşılaması gerektiği için.

Bu nedenle yolcuları daha uzak yerlere taşımak daha yüksek ücretler getirse de daha fazla yakıt tüketimi ve zaman kaybı anlamına da gelir.

Ayrıca şehir merkezindeki bir yere geri dönmek için uzak bir bölgede yolcuyu bulmak o kadar kolay değildir ve yolcusuz dönüş yolculuğu savurgan olacaktır. Çözümlerden biri, ısı haritasını, ücretin seyahat mesafesine oranının ortalamasıyla renklendirmektir. Bu iki yöntemi deneyelim:

New York ısı haritası, renk kodlaması: ortalama ücret (solda), ortalama ücretin gidilen mesafeye oranı

Basit bir ifadeyle, sağlanan hizmet için yalnızca en yüksek ücreti önemsediğinizde, New York Havaalanı ve Van Wyck Expressway ve Long Island Expressway gibi ana yollar en iyi yolcu alanlarıdır.

Yolculuk mesafesi düşünüldüğünde farklı bir görüntü elde edilir. Van Wyck Expressway, Long Island Expressway ve havaalanı yolcuları almak için hala iyi yerlerdir, ancak haritadaki önemi çok daha azdır. Hudson nehrinin batı tarafında, oldukça karlı görünen bazı yeni sıcak noktalar ortaya çıktı.

Bir taksi şoförü olarak pratikte esnek olabilirsiniz. Bu esnekliği daha iyi kullanmak için, yolcuları nereden alacağınızı bilmenin yanı sıra, otomobili ne zaman en karlı şekilde terk edeceğinizi bilmek de yararlıdır. Bu soruyu cevaplamak için, ortalama ücretin gün ve saat başına gidilen mesafeye oranını gösteren bir grafik çiziyoruz.

Haftanın her günü ve günün her saati için ücretin geziye ortalama oranı

Yukarıdaki resim sağduyuya uygundur: En karlı olanı yoğun saatlerde, özellikle iş günlerinde öğle saatlerinde. Bir taksi şoförü olarak gelirin bir kısmı taksi firmasına verildiğinden, müşterilerin günün hangi saatinde en çok bahşiş verdiğiyle ilgilenebiliriz. Ortalama bahşiş yüzdesini göstermek için benzer bir grafik çizin:

Haftanın her günü ve günün saati için ortalama bahşiş oranı

Yukarıdaki resim çok ilginç Haftanın ilk birkaç günü, 7-10 AM ile 7-10 PM arasında en çok yolcuların şoföre bahşiş verdiklerini anlatıyor. Yolcuları sabah 3-4'te alırsanız, büyük bahşişler beklemeyin.

Son iki fotoğrafın deneyimini birleştiren, sabah 8'den 10'a kadar en iyi çalışma zamanıdır ve sürücüler daha fazla ücret (mil başına) ve bahşiş alabilir.

Motoru çalıştır

Bu makalenin ilk yarısında kısaca trip_distance sütununa odaklandık ve aykırı değerler için temizlediğimizde yalnızca 100 milin altındaki yolculuklar tutuldu. Ancak bu sınır değeri, özellikle Sarı Taksi'nin çoğunlukla Manhattan'da faaliyet gösterdiği düşünüldüğünde hala çok büyük.

trip_distance, taksinin toplama noktasından bırakma noktasına kadar olan sürüş mesafesini açıklar, ancak tam iki toplama noktası ile bırakma noktası arasında, genellikle trafik sıkışıklığından kaçınmak ve Yol yapımının durumu.

Bu nedenle, trip_distance sütununa göre, bir toplama konumu arasındaki olası en kısa mesafeyi hesaplıyoruz ve bunu arc_distance olarak adlandırıyoruz:

Numpy ile yazılmış karmaşık ifadeler için vaex, anında derleme yoluyla hesaplama hızını büyük ölçüde artırmak için Numba, Pythran veya hatta CUDA'yı (NVIDIA GPU gerektirir) kullanabilir.

Arc_distance'ın hesaplama formülü çok karmaşıktır. Çok sayıda trigonometrik fonksiyon ve matematiksel işlem içerir.Büyük veri setleriyle uğraşırken hesaplama maliyeti çok yüksektir. İfade veya işlev yalnızca Python operatörlerini ve Numpy kitaplık yöntemlerini kullanıyorsa, Vaex paralel hesaplamalar gerçekleştirmek için bilgisayarın tüm çekirdeklerini kullanır.

Ayrıca Vaex, daha iyi performans sağlamak için Numba (LLVM kullanarak) ve Pythran (C ++ hızlandırma yoluyla) aracılığıyla tam zamanında derlemeyi destekler. Bir NVIDIA grafik kartınız varsa, daha hızlı performans elde etmek için CUDA'yı jit_cuda yöntemi ile kullanabilirsiniz.

Trip_distance ve arc_distance dağılımını çizelim:

Sol: trip_distance ve arc_distance karşılaştırması; Sağ: arc_distance < Trip_distance'ın 100 metrede dağılımı.

İlginç bir şekilde, arc_distance 21 mili aşmadı, ancak bir taksinin kat ettiği gerçek mesafe bunun 5 katı olabilir. Aslında, bırakma noktasının toplama noktasından sadece 100 metre (0,06 mil) uzakta olduğu milyonlarca yolculuk var!

Son birkaç yılda Sarı Taksiler

Veri setini bugün 7 yıldır kullanıyoruz. Zamanla, insanların ilgi alanlarının nasıl geliştiği ilginç olabilir. Hızlı çekirdek dışı gruplama ve toplama işlemleri gerçekleştirmek için Vaex'i kullanın.

Son 7 yılda ücretlerin ve seyahat mesafelerinin nasıl değiştiğine bir göz atalım:

Dört çekirdekli işlemciye sahip bir dizüstü bilgisayarda, 1 milyardan fazla örnek içeren bir Vaex DataFrame üzerinde 8 toplu gruplama işlemi gerçekleştirmek 2 dakikadan kısa sürer.

Yukarıdaki kod bloğunda, gruplama işlemini gerçekleştiriyoruz ve ardından 2'si sanal sütun üzerinde olmak üzere 8 toplama gerçekleştiriyoruz. Yukarıdaki kod bloğunun dizüstü bilgisayarımda yürütülmesi 2 dakikadan az sürdü. Kullandığımız verilerin 1 milyardan fazla örnek içerdiği düşünüldüğünde, bu oldukça şaşırtıcı.

Kısaca, sonuçlara bir göz atalım. Yıllara göre taksi yolculuklarının maliyetinde meydana gelen değişiklikler şunlardır:

Ortalama yıllık ücret ve toplam tutar ve yolcular tarafından ödenen bahşiş yüzdesi

Zamanla taksi ücretlerinin ve bahşişlerin arttığı görülebilir. Her yıl taksinin ortalama trip_disrance ve arc_distance özelliklerine bir göz atalım:

Taksinin yıllık yolculuğu ve yay mesafesi

Yukarıdaki grafik, hem trip_distance hem de arc_distance'ın küçük bir artışa sahip olduğunu göstermektedir, bu da, ortalama olarak, insanların her yıl biraz daha ileri gitme eğiliminde oldukları anlamına gelir.

Para ver

Yolculuğun bitiminden önce, yolcuların yolculuk ücretini nasıl ödediğini araştırmak için bir durak daha duruyoruz. Ödeme_türü, veri kümesine dahildir, bakalım hangi değeri içerecek:

Veri seti dokümanından sadece 6 geçerli giriş olduğu görülebilir:

  • 1 = Kredi kartı ödemesi
  • 2 = nakit ödeme
  • 3 = ücretsiz
  • 4 = anlaşmazlık
  • 5 = bilinmiyor
  • 6 = Geçersiz vuruş

Bundan, payment_typeı bir tamsayı ile eşleştirebilirsiniz:

Şimdi New Yorkluların taksi ücretlerini ödeme alışkanlıklarının nasıl değiştiğini görmek için yıllık verilere göre gruplayabiliriz:

Yıllık ödeme yöntemi

Zamanla, kredi kartı ödemelerinin giderek nakit ödemelere göre daha sık hale geldiği görülebilir. Gerçekten dijital çağda yaşıyoruz! Yukarıdaki kod bloğunda, veri toplama tamamlandıktan sonra, küçük Vaex DataFrame kolayca Pandas DataFrame'e dönüştürülebilir ve ardından Seaborn'a aktarılabilir. Burada tekerleği yeniden icat etmeye gerek yok.

Son olarak, nakit ödeme ile kredi kartı ödemesi arasındaki oranı çizerek, ödeme yönteminin günün saatine mi yoksa haftanın gününe mi bağlı olduğunu görmek için. Bunu yapmak için, önce nakit veya kredi kartlarıyla seyahatleri filtrelemek için bir filtre oluşturun.

Sonraki adım, en sevdiğim Vaex özelliklerinden biridir: Seçimle toplama . Diğer kitaplıklar, her bir ödeme yöntemi için ayrı bir DataFrame'in filtrelenmesini, bir araya getirilmesini ve ardından tek bir hesapta birleştirilmesini gerektirir.

Vaex ile, bir adıma ulaşmak için toplama işlevinde birden çok seçenek sağlanabilir. Bu çok kullanışlıdır, daha iyi performans sağlayabilen yalnızca tek bir veri aktarımı gereklidir. Ardından DataFrame'i standart bir şekilde çizebilirsiniz:

Haftanın belirli bir günü ve saatinde nakit ve kredi kartı ödemelerinin oranı

Yukarıdaki şekilden, formasyonun önceki haftanın her günü ve günün saati için bahşiş oranına çok benzer olduğu görülebilir. Bu iki rakamdan, kredi kartı ile ödeme yapan yolcuların, nakit ödeme yapan yolculardan daha fazla bahşiş verme eğiliminde oldukları tahmin edilmektedir.

Bunun doğru olup olmadığını öğrenmek istiyorsanız, umarım anlamaya çalışırsınız çünkü artık bilgiye, araçlara ve verilere sahipsiniz! Bu Jupyter defterinden ek ipuçları alabilirsiniz.

Hedefe varış

Umarım bu makale Vaex'e yararlı bir giriş niteliğindedir, en azından tablo veri kümeleri söz konusu olduğunda karşılaşabileceğiniz bazı "sorunlu veri" sorunlarını hafifletmenize yardımcı olacaktır. Bu makalede kullanılan veri kümesini keşfetmekle ilgileniyorsanız, Vaex ile doğrudan S3'te kullanabilirsiniz. Nasıl yapılacağını öğrenmek için lütfen eksiksiz Jupyter not defterine bakın.

Vaex ile, sadece birkaç saniye içinde 1 milyardan fazla veri satırını gezebilir, çeşitli istatistikleri hesaplayabilir, bir araya getirebilir ve infografikler üretebilirsiniz; bunların tümü dizüstü bilgisayarınızda yapılabilir. Ücretsiz ve açık kaynaktır, deneyebilirsiniz!

Mutlu veri bilimi!

İnternet şirketi "April Fool's Day" hangi yeni ürünlerini piyasaya sürdü?
önceki
2 milyon indirme elde etmek ve reklamlardan 100.000 kazanmak için bir uygulamayı nasıl edinebilirim?
Sonraki
Bugün, Rahibe Du Fuguo Wuhan'a gitti.
Haidian Sağlık Komisyonu şu anda büyük bir söylenti yaptı
Han Hong Vakfı rapor edildi ve soruşturma sonuçları resmen açıklandı
Bu sefer ABD medyası aceleyle başlığı değiştirdi
San Jose Çin Yeni Yılı Kutlaması, Oakland Atletizm Beyzbol Takımı Yıllık Taraftarlar Günü, Millbrae Ay Yeni Yılı Altın Sıçan Kutlaması
"Ölen kişinin yaş ortalaması 73 idi." Çin tarihinde üç şehir mühürlendi! Virüsün yayılmasını durdurun
Seattle şehir merkezinde `` 7 kişi vuruldu ve 1 kişi öldü '' şiddetli silahlı çatışma çıktı
1 ölü 7 yaralı! Seattle şehir merkezinde şiddetli silahlı çatışma patlak veriyor
Tibet'teki Jilong Limanı'nda ithal salgınların önlenmesi ve ele alınması için ortak tatbikat
Nisan akşamı
Yu Zhongyuan'ın Qinghai ilkokul öğrencisi Xiaolian'ı feda ettiğini öğrendim ve ağladı: "Kardeş Yu" bana geçim masraflarını gönderdi.
Sorun nedir? Heihuquan kırmızı bir dil tükürdü
To Top