Bu makale, güçlü Pandaların gücünü kullanarak milyonlarca satırlık izleme verisini geniş formatlı bir zaman serisi tablosuna hızlı bir şekilde dönüştürme konusunda size rehberlik edecektir.
Bu gösteri için Open University'den OULAD veri setini kullanacağım . Tüm veri setinin yanı sıra hoş bir veri açıklaması yukarıdaki bağlantıda mevcuttur. Bu, çevrimiçi sınıflarda sanal bir öğrenme ortamındaki öğrenci etkinliği hakkında bir veri kümesidir. 7 modülün her biri için 2 yıl ve dört kohortu kapsar.
Bu veri kümesi hakkında favorilerimden biri olduğu için daha önce yazmıştım. Bu verileri kullanarak tahmin modelleri oluşturan önceki çalışmalarımdan bazılarını Öğrenme Ortamlarıyla Nasıl Etkileşime Girdiklerine Göre Öğrenci Sonuçlarını Tahmin Etme başlıklı makalemde okuyabilirsiniz .
Bugün, zipli koleksiyondaki student_vle.csv dosyasını inceleyeceğiz. Bu dosya, öğrenme ortamında erişilebilen çevrimiçi etkinliklerle öğrenci etkileşimlerine ilişkin izleme verilerini içerir. Her satır, öğrencinin tamamladığı bir etkinliği temsil eder ve o etkinlikte yaptığı tıklama sayısını içerir.
Bu veri kümesine önceki yaklaşımımda, öğrencilerin dersi geçip geçemeyeceklerine dair tahminlerde bulunmak için bu izleme verilerinin toplamlarını kullandım. Öğrencinin yaptığı toplam tıklama sayısını kullandım.
Ama şimdi tahminlerimi yapmak için her gün öğrenci davranışını kullanıyorum. Bu, öğrencinin katılımının zaman içinde nasıl değiştiğini açıklamak için zaman serisi verilerinin kullanılması anlamına gelir. Bu makale için, öğrencinin her gün yaptığı tıklama sayısını kaydedeceğim, ancak gerçek modelim için daha fazla değişken kullanıyorum ve giriş değişkenleri olarak kursun her günü için birden fazla sütunum var.
Her öğrenci için zaman serisi verilerini istediğimden, bireysel aktivite etkileşim gözlemlerinden geniş formatlı bir zaman serisi tablosu oluşturacağım. Her satır, belirli bir kursun belirli bir kohortundaki tek bir öğrenci olacaktır. Her sütun, bir öğrencinin o gün öğrenme ortamındaki etkinliklere yaptığı tıklamaların sayısını açıklar.
Tarihler, söz konusu grubun başlangıç tarihine göredir. Bazı öğrenciler, kursun başlamasından 25 gün öncesine kadar çalışmaya başladı ve kurslar 270 gün sürüyor. Dolayısıyla final masamız 295 sütun olacak.
Böyle görünmesini istediğimiz şey bu:
Verilerimi izleme günlüğünden geniş formlu zaman serisi tablosuna ilk kez dönüştürmeye çalıştığımda, izleme günlüğündeki her girişi okumak ve yeni tabloda doğru yere yerleştirmek için yuvalanmış bir for döngüsü kullanmaya çalıştım. Bunu yapma. Bir sayaç kullanarak sürecin ilerleyişini biraz izledim ve biraz hızlı matematik yaptım. 10 milyon satırdan biraz daha fazla izleme verisi ile, bunu tamamlamak için 5 günden fazla çalışma süresi gerekiyordu. Bir söz vardır: "Pandalar ile iç içe geçmiş for döngüsü kullanıyorsanız, muhtemelen daha iyi bir yol vardır."
Bunun yerine, Pandas belgelerinin 'görünümler' dediği şeyi oluşturmak için boole maskeleri kullandım veya orijinali karıştırmadan verilere filtrelenmiş görünümler baktım. Bunu, her gün için verileri ayrı ayrı filtreleyerek ve bu görünümün sonuçlarını kronolojik sırayla yeni bir veri çerçevesiyle birleştirerek yaptım.
İzleme verileri, etkinliği, modülü, kohortu, öğrenciyi ve tıklama sayısını açıklayan değişkenlerle yalnızca bir etkinlik etkileşimleri listesi başlatır. Daha kolay indeksleme için modülü, kohortu ve öğrenciyi tek bir 'kayıt' sütununda birleştirdim.
Gördüğünüz gibi, öğrenci başına günlük ve hatta etkinlik başına birden çok giriş vardır, çünkü her giriş bireysel bir etkinlikle bireysel bir etkileşimdir. Öğrenciler genellikle aynı gün içinde aynı etkinlikle birkaç kez etkileşime giriyor gibi görünmektedir. Günlük tıklama verilerini elde etmek için yapmamız gereken ilk şey, verileri gruplamaktır. Pandas Groupby işlevlerinin nasıl kullanılacağı hakkında daha fazla bilgi edinmek için konuyla ilgili makalemi okuyabilirsiniz .
Bu tabloyu öğrenciye ve güne göre aşağıdaki kod ile gruplayabiliriz:
def group_by_day(student_vle): #group by registration and day vle_group = student_vle.groupby(by = [‘registration’, ‘date’]) #sum up the clicks for each day for each student sum_clicks = vle_group.sum().reset_index() sum_clicks = sum_clicks.drop(columns=['id_site']) #sort by student and day sum_clicks = sum_clicks.sort_values(by=[‘registration’,’date’]) return sum_clicks
Ayrıca tamamen gereksiz bir sıralama yapıyorum, çünkü kısa bir fikir edinmek için öğrenciye ve güne göre sıralanmış verileri görmek güzel, ancak sonraki adımlar için buna hiç gerek yok. Daha da büyük bir veri kümesini işliyorsanız veya kodu üretime sokuyorsanız, kesinlikle bu adımı atlayın.
Bu kod aşağıdaki tabloyu döndürür:
Artık öğrenci başına günde sadece bir girişimiz var. Etkinlik başına tıklamalarının toplamı, etkinlik etkileşim örneği başına değil, tüm gün için tıklamalarının toplamını temsil edecek şekilde toplanmıştır.
Sipariş ihtiyacım sayesinde girişler öğrenci ve gün bazında düzenleniyor. Modül günleri boyunca her öğrencinin iş akışını görmek güzel.
Şimdi bu tabloyu her geçen gün parçalara ayırmaya ve bu parçaları aşağıdaki kodla yan yana yapıştırmaya başlayabiliriz:
def create_time_series(sum_clicks): #Create a new dataframe to hold our timeseries data. time_series = pd.DataFrame() #Create one row for each student registration time_series['registration'] = sum_clicks['registration'].unique() start_date = sum_clicks['date'].min() end_date = sum_clicks['date'].max() date_range = range(start_date, end_date) counter = len(date_range) #Iterate through the days of the course: for date in date_range: #create a views of the data, one day at a time. single_date_df = sum_clicks[sum_clicks['date'] == date] single_date_df = single_date_df.drop(columns=['date']) #rename columns to describe date and data. new_cols = ['registration'] + [f'clicks_on_day_{date}'] single_date_df.columns = new_cols #merge into the time series dataframe. time_series = time_series.merge(single_date_df, how='left', on='registration', validate = '1:m') print('Days remaining to be processed: ', counter) clear_output(wait=True) counter -= 1 #Missing data represents no clicks that day, so fill with 0. time_series = time_series.fillna(0) time_series = time_series.set_index('registration', drop=True) return time_series
Yukarıdaki işlev, modülün her günü boyunca yinelenir ve yalnızca o güne ait verileri filtrelemek için bir Boole dizisi, bir Doğrular ve Yanlışlar dizisi kullanır. Her satır için 'tarih' değişkenini kontrol eder ve yalnızca tarihleri o yineleme için geçerli tarihle eşleşen satırları döndürür.
Örneğin:
sum_clicks['date'] == 0sum_clicks ile aynı uzunlukta bir dizi döndürür, ancak veri değişkeni '0' olan her satır için bir True ve geri kalanı için False doldurur.
sum_clicks[sum_clicks['date'] == 0] yalnızca boole dizisinin True içerdiği satırların bir görünümünü döndürür.
Yukarıdaki filtreyi sum_clicks tablosuna uyguladığımızda şunu elde ederiz:
Her öğrenci için yalnızca 0. gün veya kursun ilk günü için toplam tıklama sayısına sahip olduğumuza dikkat edin. Çoğu öğrencinin muhtemelen her gün sanal öğrenme ortamında çalışmadığını da fark edebilirsiniz. Yani her günlük görünüm her öğrenciyi içermeyecektir. Bir sonraki adımdaki sol birleştirme bu sorunu çözmeye yardımcı olacaktır.
Yukarıdaki işlevin bir sonraki bölümü, her bir günlük görünümü önceden hazırladığımız ve her öğrenci kaydı için bir satır içeren ancak veri içermeyen bir veri çerçevesiyle birleştirir.
time_series = time_series.merge(single_date_df, how=’left’, on=’registration’, validate = ‘1:m’)
For döngümdeki her bir günlük görünümü birleştirdiğimde, anahtar olarak 'kayıt' kullanıyorum. Bu, satırlar hem 'time_series' hem de birleştirdiğimiz günlük görünümde aynı sırada olmasa bile doğru verilerin doğru satıra gitmesini sağlar. Verileri bu şekilde dönüştürürken veri bütünlüğümüzü de düşünmemiz gerekir. Değerlerinizin satırlarınız arasında karışmamasını sağlamanın en iyi yolu anahtarlarla birleştirme yapmaktır.
how='left'Pandalara, sol veri çerçevesinin kayıtlarını, bu durumda 'zaman serileri', korumalarını söyler. Düşürmeyin, ekleme, yeniden düzenleme. Sadece doğru veri çerçevesindeki satırları alın, bu durumda 'single_date_df' ve eşleşenleri ekleyin. Yapmayanları bırakın. Her gün kayıt başına tam olarak bir kayıt olduğundan emin olmak istiyoruz.
on='registration'Pandalara, bu sütunu her bir veri çerçevesinin satırlarını eşleştirmek için anahtar olarak kullanmasını söyler. Aksi takdirde single_date_df veri çerçevesindeki hangi satırların birleştiklerinde nereye gittiğini bilemez! Son olarak,
validate='m:1'"Çoktan Bire" anlamına gelir. Bu, Pandalara, her gün için doğru veri çerçevesinde yalnızca bir değer olduğunu kontrol etmelerini söyler. Verilerimizin karışmamasını sağlamanın bir yolu daha. Sağ veri çerçevesinde, soldaki 'time_series' ile eşleşen 'single_day_df' kayıt yoksa Pandalar bu değeri np.nan veya 'veri yok' ile doldurur.
Bu döngü bittiğinde, veri çerçevesi her öğrenci için her gün için tüm tıklama sayılarını kronolojik olarak soldan sağa düzenlenmiş olarak alacaktır. Belirli bir günde bir öğrenci için tıklama bulunmayan herhangi bir yerde np.nan bulunur.
time_series = time_series.fillna(0)Bu np.nans'ı sıfırlarla değiştirmek için kullanacağız . Sonuçta, np.nan'ın gerçekte ne anlama geldiği budur: öğrenci o gün hiçbir şeye tıklamadı.
Ayrıca indeks olarak 'kayıt'ı da ayarladım, çünkü Pandalar bana izin veriyor, bu hızlı ve bu sütun gerçekten de öğrenci kayıtlarının indeksi. Bunu daha önce yapmadım çünkü birleştirme sözdizimini biraz basitleştirerek kendi sütunu olmasını sağladı.
İşte final masamız. Çok seyrek.
Hepinizi sevdiğim için, size bir numara daha göstermek istiyorum. Yukarıda oluşturduğumuz zaman serisi veri çerçevesi çoğunlukla sıfırlarla dolu. Bu, bizde 'seyrek veri çerçevesi' olarak bilinir. Bu sadece biraz seyrek, ancak kullanabileceğimiz diğer veri çerçeveleri ezici bir çoğunlukla sıfırlarla dolu. Bunları bu şekilde kaydedersek, her bir sıfırı ayrı ayrı kaydetmek çok fazla alan israfına neden olur. Bir kez daha, Pandalar kurtarmaya!
Veri çerçevesini, esasen sıfırları kaldırarak ve nereye gitmeleri gerektiğini takip ederek sıkıştırabiliriz:
sparse_time_series = time_series.astype(pd.SparseDtype('int', 0))
Yukarıdaki kod, sıfırları kaldırarak zaman serisi veri çerçevesini boyutun yaklaşık 1 / 3'ü kadar sıkıştırır. Gelen
(pd.SparseDtype('int', 0)kod parçası, biz sonuçlanan seyrek dataframe türü 'int' ya da tamsayı değerlerine sahip olacağını pandalar anlatmak ve sıfırlar olduklarını biz kompres istediğim.
Diğer uygulamalarda, özellikle Doğal Dil İşleme'de, veriler bu yöntem kullanılarak birçok kez daha küçültülebilir.
Kullanıcı etkileşimleri veya Nesnelerin İnterneti pingleri veya periyodik olarak bir değer döndüren herhangi bir şey olabilecek bir izleme veri kaydını, seçilen bir döneme göre toplanan geniş bir form zaman serisi veri çerçevesine, bu durumda gün bazında nasıl dönüştürebileceğinizi öğrendiniz.
df.groupbyVerileri toplamak için kullanmayı , bir veri çerçevesine boole maskesini, örneğin
df[df['date'] == 0]]bir sütunda istediğiniz verilerin bir görünümünü oluşturmayı ve
df.merge()her dönemin verilerini yinelemeli olarak bir öncekine eklemeyi öğrendiniz. biçim zaman serisi veri çerçevesi.
Bonus olarak, seyrek veri çerçevelerini daha verimli bir şekilde öykülemek için bir sıkıştırma yöntemi öğrendiniz. Modelleme için kullanmak istediğiniz çok büyük, çok seyrek veri kümeleriniz olduğunda bu çok önemli hale gelir. Birçok standart makine öğrenimi aracı, seyrek veri çerçevelerini verimli bir şekilde işler.
Yukarıdaki örnekte, bu stratejiler, makinenize bağlı olarak işlem sürelerini 5 günden 1 veya 2 dakikanın altına düşürür.
İşte bu belirli veri setini indirecek, sıkıştırmayı açacak ve dönüştürecek tam kodun bir Github Gist'i. Lütfen kopyalayıp kendi projeleriniz için şablon olarak kullanmaktan çekinmeyin.
Kuzilek J., Hlosta M., Zdrahal Z. Open University Learning Analytics veri kümesi Sci. Veri 4: 170171 doi: 10.1038 / sdata.2017.171 (2017).
99P Labs geliştirici topluluğu büyüyor. Üyelerimiz, geliştirici portalında sağlanan veri kümelerini kullanarak (bazılarını blogumuzda da bulacağınız) bazı çok ilginç mobilite zorlukları üzerinde çalışıyor.
AI projelerine başlamak her zamankinden daha kolay hale geldi. Hugging Face Hub veya Papers with Code gibi girişimler, geliştiricilere en son araştırmalara anında erişim sağlar.
Kuzenim okula geri dönüyor. Bu sefer ruhsal şifa lisansı alıyor.
Daha üretken olmak istiyorsanız, iş gününüzün tek önemli anahtarı olarak kabul edilen karşıt öneri veya tekniklerin iyi bir oranıyla zaten karşılaşıldı. Ancak, kaliteli çıktılarınız söz konusu olduğunda, kendiniz için yapabileceğiniz en iyi şeyin sizin için neyin en iyi ve etkili olduğuna karar vermek olduğunu unutmayın.
Tesla kullanmak benim için uzun süredir devam eden bir hedefti. Yapıldıkları teknoloji, aletler ve elektriği en başından beri beni büyüledi! Sürdüğüm arabanın pillerle çalıştığı gerçeği, quadcopter'ımı uçurmak için kullandığım pillerin neredeyse aynısı, sadece aklımı başımdan alıyor.
Konsolda bir teyp ile 2002 Toyota kullanıyorum. 2012'den beri aynı laptopu kullanıyorum.
NCIS yıldızı Mark Harmon, 2003'ten beri Gibbs'i oynuyor. Raporlar, oyuncunun bu sezon çok fazla bölümde yer almayacağını söylüyor. İşte bildiklerimiz.
'The Hitman's Wife's Bodyguard' yönetmeni Patrick Hughes filmi çekerken o kadar çok gülüyordu ki stüdyodan çıkmak zorunda kaldı.
BTS'in şarkısı 'Butter', Billboard Hot 100'de art arda dört hafta boyunca 1 numaraya ulaştı ve grubun 'Dynamite' ile önceki rekorunu geride bıraktı.
'Sex and the City' hayranlarının küçük bir fraksiyonu, Big ile evli olmasına rağmen Aidan Shaw'ın Carrie Bradshaw'ın gerçek aşkı olduğunu düşünüyor. Seride kanıt var mı?
ABD, COVID-19 sonrası bir miktar normalliğe dönerken, şehirler, otoyolların bir kez daha tıkanmasını önlemek için taşıtları yollardan yeterince uzak tutabilir mi?
Federal İşsizlik Vergisi Yasası olan FUTA, Büyük Buhran'a yanıt olarak 1939'da kanun haline getirildi ve COVID-19 salgını sırasında keşfettiğimiz gibi, bugün hala büyük bir önemi var.
Muhtemelen "Dolandırıcılık Olasılığı" veya "Sahtekarlık Uyarısı" tomurcuklarınızdan gelen aramaları görmüşsünüzdür. Peki, operatörünüze bu arayanların yasal olmadığını gösteren hediye nedir?
Gerçek şu ki, bu mega sellerden birini vurma şansınız her yıl aynıdır: yüzde 1.
Las Vegas Raiders defans oyuncusu Carl Nassib, NFL kadrosundaki ilk açık eşcinsel oyuncu. Las Vegas Raiders'ın savunma tarafı Carl Nassib'in eşcinsel olduğu ortaya çıktı.
Geçen yıl Covid-19 pandemisi ilk kez vurduğunda, tamamen dışarıda özgürce hareket etme fikri üzerine kurulmuş bir oyun olan Pokémon Go, dünyanın dört bir yanındaki insanlar sokağa çıkma kısıtlamaları ve hareket kısıtlamalarıyla karşı karşıya kaldıkça bazı değişikliklerden geçmek zorunda kaldı. Yine de tünelde ışık görmek için geliştiriciler Niantic, Pokémon Go'nun oynanışına Covid ile ilgili ince ayarları geri alacak, başarılı olduğu kanıtlanmış değişiklikleri koruyacak ve genel olarak oyunu bir süreliğine hazırlamaya başlayacak oyundaki revizyonları test etmeye başlayacak. daha fazla insan sadece yapabilirken.
Milyar dolarlık kuruluş, bugün 9-0 Yargıtay kararının kaybeden ucunda buldu ve daha fazla dava yoluyla ilerlemenin önünü açtı. Yıllardır NCAA yasal olarak dokunulmaz görünüyordu.
Ben ve Julianna Zobrist Ben Zobrist, karısı Julianna'nın eski papazlarıyla bir ilişkisi olduğunu iddia etti. Bu, eski MLB oyuncusu adına açılan bir Mayıs davasının bir kopyasına göre.
'RuPaul's Drag Race'in iki zaferle liderliğini yaptığı Eleştirmenlerin Seçimi Real TV kazananlarının tam listesini görün
Şizofreni ile devam eden bir mücadeleyle karşı karşıya olan eski dış saha oyuncusu Andrew Toles, eski takımının Ekim ayında zirveye çıktığından habersiz.
Model Ashley Graham, Pazartesi günü insanları bu yaz vücutlarını kucaklamaya teşvik eden ilham verici bir Instagram gönderisi paylaştı.
Billie Eilish, geçtiğimiz günlerde kamuoyuna açıklanan sanatçının bir video derlemesi nedeniyle sosyal medyaya giderek kendisine yönelik ırkçılık iddialarını ele aldı.