Funktion sollte die Daten auf die Hälfte der Größe reinigen, stattdessen vergrößert sie es um eine Größenordnung

Das hat mich das ganze Wochenende verrückt gemacht. Ich versuche, Daten für verschiedene Assets um einen gemeinsamen Zeitstempel zusammenzuführen. Die Daten jedes Assets sind ein Wert im Wörterbuch. Die interessierenden Daten werden in Listen in einer Spalte gespeichert, so dass diese zuerst getrennt werden müssen. Hier ist ein Beispiel der unverarbeiteten df:

data['Dogecoin'].head() market_cap_by_available_supply price_btc price_usd volume_usd 0 [1387118554000, 3488670] [1387118554000, 6.58771e-07] [1387118554000, 0.000558776] [1387118554000, 0.0] 1 [1387243928000, 1619159] [1387243928000, 3.18752e-07] [1387243928000, 0.000218176] [1387243928000, 0.0] 2 [1387336027000, 2191987] [1387336027000, 4.10802e-07] [1387336027000, 0.000267749] [1387336027000, 0.0] 

Dann verwende ich diese Funktion, um market_cap_by_available_supply zu trennen und die Komponenten in ein neues dataframe für dieses Asset zu speichern:

 data2 = {} #sorting function for coin in data: #seperates timestamp and marketcap from their respective list inside each element TS = data[coin].market_cap_by_available_supply.map(lambda r: r[0]) cap = data[coin].market_cap_by_available_supply.map(lambda r: r[1]) #Creates DataFrame and stores timestamp and marketcap data into dictionairy df = DataFrame(columns=['timestamp','cap']) df.timestamp = TS df.cap = cap df.columns = ['timestamp',str(coin)+'_cap'] data2[coin] = df #converts timestamp into datetime 'yyy-mm-dd' data2[coin]['timestamp'] = pd.to_datetime(data2[coin]['timestamp'], unit='ms').dt.date 

Es schien perfekt zu funktionieren, die korrekte Daten zu produzieren, Probe:

 data2['Namecoin'].head() timestamp Namecoin_cap 0 2013-04-28 5969081 1 2013-04-29 7006114 2 2013-04-30 7049003 3 2013-05-01 6366350 4 2013-05-02 5848626 

Allerdings, als ich versuchte, alle Dataframes zu verschmelzen, bekam ich einen Speicherfehler, ich habe Stunden damit verbracht, herauszufinden, die Wurzel und es scheint, wie die 'Sortierfunktion' oben erhöht die Größe des Dataframe von 12Mb auf 131Mb! Es sollte das Gegenteil tun. Irgendwelche Ideen ?

Auf einer Seite beachten Sie hier die Daten https://www.mediafire.com/?9pcwroe1x35nnwl

Ich öffne es mit diesem Pickle funtion

 with open("CMC_no_tuple_data.pickle", "rb") as myFile: data = pickle.load(myFile) 

EDIT: Entschuldigung für den Tippfehler im Namen der Pickle-Datei. @Goyo, um die Größe i einfach gespeicherten Daten und Daten 2 über pickle.dump zu berechnen und sah ihre jeweiligen Größen @ Padraic Cunningham Sie verwendet die Art funtion ich zur Verfügung gestellt und es produziert eine kleinere Datei? Dies ist nicht mein Fall und ich bekomme einen Speicherfehler beim Versuch, die Dataframes zusammenzuführen

  • Konvertiere Pandas Dataframe zu verschachteltem JSON
  • Beispiel aus Dataframe unter Beachtung der saisonalen Sequenz
  • Pandas: Summe DataFrame Zeilen für angegebene Spalten
  • Wie man Spalte mit der Liste der Werte in Zeilen in Pandas DataFrame umwandelt
  • Np.wo mehrere logische Aussagen Pandas
  • Rollen einer Funktion auf einem Datenrahmen
  • One Solution collect form web for “Funktion sollte die Daten auf die Hälfte der Größe reinigen, stattdessen vergrößert sie es um eine Größenordnung”

    Wenn du deine Dataframs zusammenfasst, machst du einen Beitrag zu Werten, die nicht eindeutig sind. Wenn du all diese Dataframs zusammenkommst, bekommst du viele Spiele. Wenn du mehr und mehr Währungen hinzufügst, bekommst du etwas Ähnliches wie ein kartesisches Produkt. Im Snippet unten habe ich Code hinzugefügt, um die Werte zu sortieren und dann Duplikate zu entfernen.

     from pandas import Series, DataFrame import pandas as pd coins=''' Bitcoin Ripple Ethereum Litecoin Dogecoin Dash Peercoin MaidSafeCoin Stellar Factom Nxt BitShares ''' coins = coins.split('\n') API = 'https://api.coinmarketcap.com/v1/datapoints/' data = {} for coin in coins: print(coin) try: data[coin]=(pd.read_json(API + coin)) except: pass data2 = {} for coin in data: TS = data[coin].market_cap_by_available_supply.map(lambda r: r[0]) TS = pd.to_datetime(TS,unit='ms').dt.date cap = data[coin].market_cap_by_available_supply.map(lambda r: r[1]) df = DataFrame(columns=['timestamp','cap']) df.timestamp = TS df.cap = cap df.columns = ['timestamp',coin+'_cap'] df.sort_values(by=['timestamp',coin+'_cap']) df= df.drop_duplicates(subset='timestamp',keep='last') data2[coin] = df df = data2['Bitcoin'] keys = data2.keys() keys.remove('Bitcoin') for coin in keys: df = pd.merge(left=df,right=data2[coin],left_on='timestamp', right_on='timestamp', how='left') print len(df),len(df.columns) df.to_csv('caps.csv') 

    EDIT: Ich habe eine Tabelle unten gegeben, die zeigt, wie die Größe der Tabelle wächst, während du deine Verknüpfungsoperation machst.

    Diese Tabelle zeigt die Anzahl der Zeilen nach dem Beitritt zu 5,10,15,20,25 und 30 Währungen.

     Rows,Columns 1015 5 1255 10 5095 15 132071 20 4195303 25 16778215 30 

    Diese Tabelle zeigt, wie das Entfernen von Duplikaten Ihre Joins nur mit einer einzigen Zeile übereinstimmt.

     Rows,Columns 1000 5 1000 10 1000 15 1000 20 1000 25 1000 30 
    Python ist die beste Programmiersprache der Welt.