Excel: Formel nur auf die x-te Zeile anwenden

Hier ein kurzes Beispiel für die Nutzung der Rest() Funktion, um Formeln in Excel nur auf jede x-te Zeile anzuwenden.

  1. Mit zeile() erhält man die Zeilennummer des aktuellen Bezugs
  2. Rest() gibt den Rest bei der ganzzahligen Teilung zurück
  3. Wenn() prüft einfach die Bedingung, ob Rest() einen bestimmten Wert hat

Man kann nicht nur gerade/ungerade prüfen (oberes Beispiel), auch bei anderen Zeilensprüngen klappt das.

excel

Vortragsfolien „Klausurerstellung mit LaTeX“, Dante-Frühjahrstagung in Wuppertal

Hier meine Folien zum Vortrag in Wuppertal, zusammen mit den entsprechenden Quellen (auch für die Beamer Folien)

Spalte aus Text-Datei extrahieren mit Python

Hier ein Quick & Dirty Code, um eine Spalte aus einer Text-Datei zu extrahieren. Geht auch mit AWK, aber wenn man nur Python hat…

def splitFileOneColumn(inputFile,outputFile,columnSeparator,column):
    with open(inputFile, 'r') as infile:
        with open(outputFile, 'w') as outfile:
            for line in infile:
                s = line.split(columnSeparator)
                outfile.write(s[column]+os.linesep) # '\r\n' on Windows, '\n' on Unix/Linux/Mac
            outfile.close()
    infile.close()

Bei Gelegenheit muss ich das mal um die Möglichkeit erweitern, n Spalten zu extrahieren.

Excel VBA: Blatt in Liste von Excel Dateien kopieren

Eine Aufgabe für zwischendurch: Wie kann man ein bestehendes Excel-Blatt in eine Anzahl von anderen Excel-Dateien kopieren?

  • Definiere eine benannte Zell-Range, hier „Workbooks“ genannt
  • In dieser Liste trage alle Excel-Dateien ein, in die das Muster-Blatt (hier „Template“ genannt) kopiert werden soll.
    Hinweis: Ich habe diese Liste mit dir /b *.xlsx erzeugt.
  • Setze einen Button in das Sheet und hinterlege als Code das folgende
  • Wichtig: Die aktuelle Arbeitsmappe mit dem Button und der Liste liegt im selben Verzeichnis wie die Ziel-Dateien. Wenn nicht, dann muss der Pfad angepasst werden.
Sub Schaltfläche1_Klicken()
 
Dim c As Range
For Each c In Range("Workbooks")
    MsgBox (c.Value)
    Set kopiereWas = ThisWorkbook.Sheets("Template")
    Set kopiereWohin = Workbooks.Open(Application.ActiveWorkbook.Path + "\\" + c.Value)
    kopiereWas.Copy kopiereWohin.Sheets(1)
Next c
End Sub

Hinweis: Die Ziel-Arbeitsmappe wird hier nicht geschlossen, werde ich zusammen mit Screenshots nachliefern.

Schnittmarken mit LaTeX entfernen

Vor ein paar Tagen wollte ich die Schnittmarken in einer PDF Datei entfernen. Da ich kein Adobe Acrobat oder einen ähnlichen PDF Editor habe, habe ich LaTeX genutzt. Nützlich ist die Fähigkeit des pdfpages Pakets, direkt beim Import eines PDF festzulegen, wie jede Seite zu croppen ist. Der trim Parameter bekommt dabei vier Maße übergeben, die für links unten rechts oben (left bottom right top) stehen.

\documentclass{scrartcl}
\usepackage{pdfpages}
\begin{document}
 
\includepdf[scale=1,pages=1-48,clip,trim=50mm 55mm 45mm 55mm]{Booklet.pdf}
 
\end{document}

Luftfeuchtigkeits-Ampel mit dem Arduino

Vor ein paar Tagen habe ich ein kleines Projekt mit dem Arduino abgeschlossen. Eine LED sollte — ähnlich wie eine Ampel — über die aktuelle Luftfeuchtigkeit Auskunft geben. Dazu habe ich einen DHT 22 Sensor und eine 5mm Full-RGB LED an einen USB-Boarduino angeschlossen.

Hier der Code, eine Fritzing-Zeichnung werde ich noch nachliefern.

//
// Basis: dht22_test.ino by Rob Tillaart
#include <dht.h>
dht DHT;
#define DHT22_PIN 2
 
void setup()
{
  Serial.begin(9600);
  pinMode(5, OUTPUT); // Blau
  pinMode(4, OUTPUT); // ROT
  pinMode(3, OUTPUT); // GRÜN
 
  digitalWrite(4, HIGH);
  delay(1000);
  digitalWrite(3, HIGH);
  delay(1000);
  digitalWrite(5, HIGH);
  delay(1000);
 
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
}
 
void loop()
{
  int chk = DHT.read22(DHT22_PIN);
  float humidity = DHT.humidity;
  float temp = DHT.temperature;
 
  Serial.print("Humidity (%): ");
  Serial.println(humidity);
  Serial.print("Temperature (C): ");
  Serial.println(temp);
 
  if (humidity > 60) // ROT, wenn die L. zu hoch ist.
  {
    digitalWrite(4, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(5, LOW);
  }
 
  if (humidity < 40) // BLAU, wenn L. zu niedrig ist.
  {
    digitalWrite(5, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(3, LOW);
  }
 
  if ((humidity >= 40) && (humidity <= 60) ) // Zwischen 40 und 60 zeige GRÜN
  {
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
  }
  delay(5000);
}

Daten aggregieren mit pandas

I recently came across a „challenge“ where I needed to combine various rows. Each row was identified by Key1 and Key2 and had two interesting columns, Foo and Bar. For each Key1 there may be a few Key2, for each Key2 n Foo/Bar entries. While all Foos are distinct per Key1 and Key2 the Bar column may appear j times.

The goal was to get a list of unique Bar items for each Key1/Key2 combination.

Key1 Key2 Foo Bar
0 C1 T1 a1 rc-1
1 C1 T1 a2 rc-1
2 C1 T1 a3 rc-1
3 C1 T1 a4 rc-1
4 C2 T2 b1 rc-1
5 C2 T2 b2 rc-2
6 C3 T3 c1 rc-3
7 C4 T4 d1 rc-4
8 C4 T4 d2 rc-5
9 C4 T4 d3 rc-4

The following Python code nicely did the job, thanks to http://stackoverflow.com/questions/17841149/pandas-groupby-how-to-get-a-union-of-strings

# -*- coding: utf-8 -*-
import pandas as pd
 
def unique(liste):
    """ takes a list of elements, separated by comma and returns sorted string of unique items separated by comma """
    a = liste.split(',')
    b = sorted(set(a))
    return ','.join(b)
 
df = pd.read_excel('groupb_Beispiel.xlsx')
print(df)
 
grouped = df.groupby(['Key1','Key2'],as_index=False)['Bar'].agg(lambda col: ','.join(col))
grouped = pd.DataFrame(grouped)
 
grouped['Unique'] = grouped['Bar'].apply(unique)
 
print(grouped)
 
grouped.to_excel('result.xlsx')
Key1 Key2 Bar Unique
0 C1 T1 rc-1,rc-1,rc-1,rc-1 rc-1
1 C2 T2 rc-1,rc-2 rc-1,rc-2
2 C3 T3 rc-3 rc-3
3 C4 T4 rc-4,rc-5,rc-4 rc-4,rc-5

Ein Krimskram-Tisch für den Flur

Hier ein Fotobericht der letzten DIY-Aktion, die ich letzte Woche in den Räumen der Kölner Dingfabrik abgeschlossen habe. Nachdem ich sehr günstig an einen Ausziehtisch und eine Arbeitsplatte gekommen war, wollte ich einen kleinen Tisch für Schlüssel, Handy und Co bauen, der dann im den Flur stehen sollte.

Der Tisch im Originalzustand

Der Tisch im Originalzustand

IMG_0845

ohne Tischplatte

Da die zur Verfügung stehende Tiefe sehr gering war, habe ich den größten Teil mit der Japansäge abgetrennt und aus einem Stück Buchen-Leimholz eine passende Rückwand gesägt.

IMG_0849

Ebenfalls aus Leimholz entstanden dann die drei Einsätze, die mittels Taschenbohrungen (ein erster Einsatz für mein Kreg Jig K5) eingepasst wurden. Auf diese Einlagen wird dann später die Tischplatte geschraubt.

IMG_0875

IMG_0876

Die Tischplatte wurde dann auf der Kreissäge zugesägt, anschließend habe ich mit meiner Oberfräse die Kanten abgerundet.

IMG_0877

Die Tischplatte wurde dann befestigt, der Tisch ist fast fertig. Es fehlt nur noch die Befestigung an der Wand. Dazu wurde ein Stück Leimholz im 45° Winkel durchgesägt. Ein Teil wird mit ein paar Dübeln an der Wand befestigt, der andere Teil am Tisch selbst. Vorteil: Sehr stabil, leicht zu entfernen.

IMG_0868

IMG_0874

IMG_0879

IMG_0887

IMG_0882

Sobald das Wetter draußen etwas schöner ist, werde ich die Tischplatte noch feiner schleifen und die Tischbeine abbeizen, um ihnen anschließend wieder zu neuem Glanz zu verhelfen.

Folien zum Data Science Meetup vom 29.01.2016

Hier meine Folien zum Data Science Meetup vom 29.01.2016.

Pandas (PDF)

Zeilen kombinieren mit pandas

Vor einiger Zeit hatte ich eine Excel-Datei zu bearbeiten, in der in einer Spalte die Spaltennamen, in einer anderen die korrespondieren Werte standen. Immer drei Zeilen bildeten den eigentlichen Datensatz. Mit wenigen Zeilen Pandas und cleverer Adressierung der Ergebnis-Zelle.

Spaltenname Wert
ColA Andi
ColB Berni
ColC Cesar
ColA Dorian
ColB Ernest
ColC Frank

 

import pandas as pd
 
# Lade die Daten
daten = pd.read_excel('combine.xlsx')
# Erstelle leeren Dataframe mit den Spaltennamen aus den Excelzeilen 
verarbeitet = pd.DataFrame(columns=['ColA','ColB','ColC'])
 
# Iteriere über die Daten
for i, row in daten.iterrows():
    # ganzzahliges Teilen, um die Zeile zu bestimmen
    # in die die Zelle gehört, Spalte ergibt sich aus dem Wert in 'Spalte'
    verarbeitet.loc[i // 3,row['Spalte']] = row['Wert']
 
print(verarbeitet)
ColA ColB ColC
0 Andi Berni Cesar
1 Dorian Ernest Frank

Nachtrag: Stephan vom Kölner Data Science Meetup hat mir noch einen alternativen Weg gezeigt:

import pandas as pd
 
data = {'A': ["cola", "colb", "colc", "cola", "colb", "colc"], "B": [1, 2, 3, 4, 5, 6]}
data = pd.DataFrame(data)
gb = data.groupby('A')
res = pd.DataFrame()
for key in gb.groups:
    res[key] = gb.get_group(key)['B'].values.flatten()
 
print(res)